usertrust-openclaw 1.3.0 → 1.5.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.md +37 -236
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/stream-governor.d.ts.map +1 -1
- package/dist/stream-governor.js +4 -0
- package/dist/stream-governor.js.map +1 -1
- package/dist/token-extractor.d.ts +25 -0
- package/dist/token-extractor.d.ts.map +1 -1
- package/dist/token-extractor.js +86 -2
- package/dist/token-extractor.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -15
package/README.md
CHANGED
|
@@ -1,264 +1,65 @@
|
|
|
1
|
-
# usertrust
|
|
1
|
+
# usertrust-openclaw
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
import { trust } from "usertrust";
|
|
7
|
-
import Anthropic from "@anthropic-ai/sdk";
|
|
8
|
-
|
|
9
|
-
// dryRun: true — skips TigerBeetle so you can try instantly.
|
|
10
|
-
// Audit chain and policy engine still run.
|
|
11
|
-
const client = await trust(new Anthropic(), { dryRun: true, budget: 50_000 });
|
|
12
|
-
|
|
13
|
-
const { response, governance } = await client.messages.create({
|
|
14
|
-
model: "claude-sonnet-4.6",
|
|
15
|
-
max_tokens: 1024,
|
|
16
|
-
messages: [{ role: "user", content: "Analyze this contract" }],
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
console.log(governance);
|
|
20
|
-
|
|
21
|
-
// REQUIRED — process hangs without this
|
|
22
|
-
await client.destroy();
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
That's it. One function wraps any supported LLM client. Every call is metered, audited, and policy-checked.
|
|
26
|
-
|
|
27
|
-
### Expected Output
|
|
28
|
-
|
|
29
|
-
The `governance` receipt returned from every call:
|
|
30
|
-
|
|
31
|
-
```
|
|
32
|
-
{
|
|
33
|
-
cost: 42,
|
|
34
|
-
budgetRemaining: 49958,
|
|
35
|
-
transferId: "tx_m4k7p2_a1b2c3",
|
|
36
|
-
auditHash: "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
|
37
|
-
settled: true,
|
|
38
|
-
model: "claude-sonnet-4.6",
|
|
39
|
-
provider: "anthropic",
|
|
40
|
-
inputTokens: 12,
|
|
41
|
-
outputTokens: 28
|
|
42
|
-
}
|
|
43
|
-
```
|
|
3
|
+
[`usertrust`](https://usertrust.ai) governance plugin for **OpenClaw**. Adds budget enforcement, policy gates, PII/injection scanning, and a hash-chained audit trail to every LLM call — with zero changes to your agent code. Install the plugin and every streamed call is governed.
|
|
44
4
|
|
|
45
5
|
## Install
|
|
46
6
|
|
|
47
7
|
```bash
|
|
48
|
-
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
This creates a `.usertrust/` vault in your project root with default config, policies, and an empty audit chain.
|
|
52
|
-
|
|
53
|
-
## Integration
|
|
54
|
-
|
|
55
|
-
Works with Anthropic, OpenAI, and Google AI SDKs:
|
|
56
|
-
|
|
57
|
-
```typescript
|
|
58
|
-
import { trust } from "usertrust";
|
|
59
|
-
import Anthropic from "@anthropic-ai/sdk";
|
|
60
|
-
import OpenAI from "openai";
|
|
61
|
-
|
|
62
|
-
// Anthropic
|
|
63
|
-
const anthropic = await trust(new Anthropic());
|
|
64
|
-
const { response, governance } = await anthropic.messages.create({ ... });
|
|
65
|
-
|
|
66
|
-
// OpenAI
|
|
67
|
-
const openai = await trust(new OpenAI());
|
|
68
|
-
const { response, governance } = await openai.chat.completions.create({ ... });
|
|
69
|
-
|
|
70
|
-
// With options (full mode — requires TigerBeetle)
|
|
71
|
-
const client = await trust(new Anthropic(), {
|
|
72
|
-
budget: 100_000,
|
|
73
|
-
});
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
Every call returns `{ response, governance }` where `governance` is a receipt:
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
{
|
|
80
|
-
transferId: "tx_m4k7r2_a1b2c3",
|
|
81
|
-
cost: 142,
|
|
82
|
-
budgetRemaining: 49_858,
|
|
83
|
-
auditHash: "a3f8...",
|
|
84
|
-
settled: true,
|
|
85
|
-
model: "claude-sonnet-4.6",
|
|
86
|
-
provider: "anthropic",
|
|
87
|
-
timestamp: "2026-03-16T12:00:00.000Z"
|
|
88
|
-
}
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Inspect
|
|
92
|
-
|
|
93
|
-
```bash
|
|
94
|
-
npx usertrust inspect
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
=== Vault Report ===
|
|
99
|
-
Chain: 847 events · 12 segments
|
|
100
|
-
Budget: 38,420 / 50,000 UT remaining
|
|
101
|
-
Models: claude-sonnet-4-6 (412) · gpt-4o (289) · gemini-2.0-flash (146)
|
|
102
|
-
Policy: 3 rules active · 0 violations
|
|
103
|
-
PII: 2 warnings · 0 blocks
|
|
104
|
-
Merkle: a3f8c1...d92b (root)
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## CLI
|
|
108
|
-
|
|
109
|
-
All commands support `--json` for machine-readable output.
|
|
110
|
-
|
|
111
|
-
```bash
|
|
112
|
-
usertrust init # Create .usertrust/ vault
|
|
113
|
-
usertrust inspect # Vault bank statement
|
|
114
|
-
usertrust health # Entropy diagnostics (6 signals, 0-100 score)
|
|
115
|
-
usertrust verify # Verify audit chain integrity
|
|
116
|
-
usertrust snapshot # Checkpoint/restore vault state
|
|
117
|
-
usertrust tb # TigerBeetle process management
|
|
118
|
-
usertrust completions # Shell completions (bash, zsh, fish)
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### JSON output
|
|
122
|
-
|
|
123
|
-
Every command supports `--json` for scripting and CI:
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
usertrust inspect --json | jq '.data.remaining'
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### Shell completions
|
|
130
|
-
|
|
131
|
-
```bash
|
|
132
|
-
# Bash
|
|
133
|
-
usertrust completions bash > ~/.local/share/bash-completion/completions/usertrust
|
|
134
|
-
|
|
135
|
-
# Zsh
|
|
136
|
-
usertrust completions zsh > "${fpath[1]}/_usertrust"
|
|
137
|
-
|
|
138
|
-
# Fish
|
|
139
|
-
usertrust completions fish > ~/.config/fish/completions/usertrust.fish
|
|
8
|
+
openclaw plugins install usertrust-openclaw
|
|
140
9
|
```
|
|
141
10
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
All errors include fix suggestions and documentation links:
|
|
145
|
-
|
|
146
|
-
```
|
|
147
|
-
Ledger unavailable: connection refused
|
|
148
|
-
|
|
149
|
-
Hint: Start TigerBeetle with "npx usertrust tb start" or use { dryRun: true } to skip the ledger.
|
|
150
|
-
Docs: https://usertrust.ai/docs/errors/ledger-unavailable
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
## Config
|
|
154
|
-
|
|
155
|
-
Create `.usertrust/usertrust.config.json`:
|
|
11
|
+
Or configure it manually in `openclaw.json`:
|
|
156
12
|
|
|
157
13
|
```json
|
|
158
14
|
{
|
|
159
|
-
"
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
15
|
+
"plugins": {
|
|
16
|
+
"entries": {
|
|
17
|
+
"usertrust": {
|
|
18
|
+
"enabled": true,
|
|
19
|
+
"config": { "budget": 100000, "dryRun": true }
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
165
23
|
}
|
|
166
24
|
```
|
|
167
25
|
|
|
168
|
-
|
|
26
|
+
## Programmatic use
|
|
169
27
|
|
|
170
28
|
```typescript
|
|
171
|
-
import {
|
|
29
|
+
import { createUsertrustPlugin } from "usertrust-openclaw";
|
|
172
30
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
tier: "pro",
|
|
177
|
-
pii: "block",
|
|
178
|
-
circuitBreaker: { failureThreshold: 5, resetTimeout: 60_000 },
|
|
179
|
-
patterns: { enabled: true },
|
|
180
|
-
audit: { rotation: "daily", indexLimit: 10_000 },
|
|
31
|
+
const plugin = createUsertrustPlugin({
|
|
32
|
+
budget: 100_000, // usertokens for this session
|
|
33
|
+
dryRun: true, // try instantly — skips TigerBeetle, keeps policy + audit
|
|
181
34
|
});
|
|
182
35
|
```
|
|
183
36
|
|
|
184
|
-
##
|
|
185
|
-
|
|
186
|
-
**Double-entry ledger** — TigerBeetle-backed financial transactions with two-phase lifecycle (PENDING, POST, VOID). Not a counter.
|
|
187
|
-
|
|
188
|
-
**SHA-256 hash-chained audit** — Every event links to the previous event's hash. Tamper-evident by construction. Append-only JSONL.
|
|
189
|
-
|
|
190
|
-
**Merkle proofs (RFC 6962)** — Inclusion and consistency proofs for public verifiability. Any third party can verify a specific event existed in the chain.
|
|
191
|
-
|
|
192
|
-
**Policy engine** — 12 field operators (`eq`, `gt`, `in`, `regex`, etc.) with soft/hard enforcement. Block specific models, cap costs, require approvals.
|
|
193
|
-
|
|
194
|
-
**PII detection** — Luhn-validated credit card numbers, SSN patterns, email addresses, phone numbers, IPv4 addresses. Block or warn before data leaves your network.
|
|
37
|
+
## How it works
|
|
195
38
|
|
|
196
|
-
|
|
39
|
+
The plugin hooks OpenClaw's `wrapStreamFn`, so it sits directly on the stream:
|
|
197
40
|
|
|
198
|
-
**Pattern memory** — Learns optimal model routing from historical prompt-cost-success data. Feeds routing decisions when connected to proxy.
|
|
199
|
-
|
|
200
|
-
## Why this exists
|
|
201
|
-
|
|
202
|
-
AI agents operate with financial authority. Every LLM call costs money. Without governance:
|
|
203
|
-
|
|
204
|
-
- There is no audit trail when an agent spends $500 on a hallucinated loop
|
|
205
|
-
- There is no budget enforcement across multiple concurrent agents
|
|
206
|
-
- There is no way to prove what happened after the fact
|
|
207
|
-
- A race condition between two agents can double-spend the same budget
|
|
208
|
-
|
|
209
|
-
A counter in a database is not a financial ledger. `usertrust` uses the same double-entry, two-phase commit pattern that banks use. PENDING holds reserve the budget atomically. POST settles. VOID releases. The audit chain is hash-linked and Merkle-provable.
|
|
210
|
-
|
|
211
|
-
## Comparison
|
|
212
|
-
|
|
213
|
-
| Feature | usertrust | LiteLLM | Portkey | Langfuse |
|
|
214
|
-
|---------|-----------|---------|---------|----------|
|
|
215
|
-
| Financial ledger | TigerBeetle | Counter | Counter | Observation |
|
|
216
|
-
| Two-phase spend | PENDING/POST/VOID | No | No | No |
|
|
217
|
-
| Hash-chained audit | SHA-256 | No | No | No |
|
|
218
|
-
| Merkle proofs | RFC 6962 | No | No | No |
|
|
219
|
-
| Policy engine | 12 operators | Basic rules | Basic rules | No |
|
|
220
|
-
| PII detection | Luhn + regex | No | No | No |
|
|
221
|
-
| Circuit breakers | Per-provider | Global | Per-provider | No |
|
|
222
|
-
| Offline-first | Local vault | Proxy required | Proxy required | Proxy required |
|
|
223
|
-
| Open source | Apache 2.0 | Apache 2.0 | Proprietary | Apache 2.0 |
|
|
224
|
-
|
|
225
|
-
## Upgrade path
|
|
226
|
-
|
|
227
|
-
When you outgrow local mode, point at the proxy. One line:
|
|
228
|
-
|
|
229
|
-
```typescript
|
|
230
|
-
const client = await trust(new Anthropic(), {
|
|
231
|
-
proxy: "https://proxy.usertools.ai",
|
|
232
|
-
key: process.env.USERTOOLS_KEY,
|
|
233
|
-
});
|
|
234
41
|
```
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
npx usertrust-verify .usertrust
|
|
42
|
+
agent call → OpenClaw → usertrust wrapStreamFn
|
|
43
|
+
1. Pre-flight budget check — a call whose estimated cost would exceed the
|
|
44
|
+
remaining budget is DENIED before it starts (no single-call overshoot).
|
|
45
|
+
2. PENDING hold reserves the estimate.
|
|
46
|
+
3. Forward to the real stream, accumulating token usage from each chunk.
|
|
47
|
+
4. POST settles the actual cost (or VOID on error); an early consumer
|
|
48
|
+
`break` still settles and releases the hold — no leaked reservation.
|
|
49
|
+
5. Every call is written to the tamper-evident audit chain.
|
|
244
50
|
```
|
|
245
51
|
|
|
246
|
-
|
|
247
|
-
Vault integrity: VERIFIED
|
|
248
|
-
Chain length: 847 events
|
|
249
|
-
Merkle root: a3f8c1...d92b
|
|
250
|
-
Hash algorithm: SHA-256
|
|
251
|
-
First event: 2026-03-01T08:12:44.000Z
|
|
252
|
-
Last event: 2026-03-16T14:33:21.000Z
|
|
253
|
-
All hashes: valid (847/847)
|
|
254
|
-
```
|
|
52
|
+
## Config
|
|
255
53
|
|
|
256
|
-
|
|
54
|
+
| Field | Type | Description |
|
|
55
|
+
|-------|------|-------------|
|
|
56
|
+
| `budget` | `number` | Session budget in usertokens (required). |
|
|
57
|
+
| `dryRun` | `boolean` | Skip TigerBeetle; policy gate + audit still run. |
|
|
58
|
+
| `vaultBase` | `string` | Vault location (defaults to the project root). |
|
|
59
|
+
| `proxy` / `proxyKey` | `string` | Point at the hosted proxy for cross-agent budget enforcement. |
|
|
257
60
|
|
|
258
|
-
|
|
61
|
+
Budget enforcement is **pre-spend**: because a stream's cost isn't known until it finishes, the estimate assumes the model's full output budget, so calls are denied conservatively rather than allowed to overshoot. Size `budget` accordingly.
|
|
259
62
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
---
|
|
63
|
+
## License
|
|
263
64
|
|
|
264
|
-
UserTrust™ is a trademark of Usertools, Inc.
|
|
65
|
+
Apache 2.0 · UserTrust™ is a trademark of Usertools, Inc.
|
package/dist/index.js
CHANGED
|
@@ -155,6 +155,22 @@ function initGovernor(config) {
|
|
|
155
155
|
...(config.proxy != null ? { proxy: config.proxy } : {}),
|
|
156
156
|
...(config.proxyKey != null ? { key: config.proxyKey } : {}),
|
|
157
157
|
...(config.vaultBase != null ? { vaultBase: config.vaultBase } : {}),
|
|
158
|
+
// M2: forward the operator's endpoint declaration into the headless
|
|
159
|
+
// governor (GovernorOpts.endpoint). Without this, every OpenClaw call
|
|
160
|
+
// defaults to cloud scope — local models would meter at frontier
|
|
161
|
+
// fallback and inherit strict cloud anomaly thresholds. runtime defaults
|
|
162
|
+
// to "unknown"; baseURL is omitted (never undefined) when absent.
|
|
163
|
+
...(config.endpoint != null
|
|
164
|
+
? {
|
|
165
|
+
endpoint: {
|
|
166
|
+
class: config.endpoint.class,
|
|
167
|
+
runtime: config.endpoint.runtime ?? "unknown",
|
|
168
|
+
...(config.endpoint.baseURL !== undefined
|
|
169
|
+
? { baseURL: config.endpoint.baseURL }
|
|
170
|
+
: {}),
|
|
171
|
+
},
|
|
172
|
+
}
|
|
173
|
+
: {}),
|
|
158
174
|
}).then((gov) => {
|
|
159
175
|
governor = gov;
|
|
160
176
|
return gov;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-governor.d.ts","sourceRoot":"","sources":["../src/stream-governor.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAe,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvE;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAQzF;
|
|
1
|
+
{"version":3,"file":"stream-governor.d.ts","sourceRoot":"","sources":["../src/stream-governor.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAe,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvE;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAQzF;AA6DD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACzC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EAEnE,UAAU,EAAE,CACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,EACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC,CAAC,CAAC,EACf,QAAQ,EAAE,QAAQ,GAChB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CA6C1F"}
|
package/dist/stream-governor.js
CHANGED
|
@@ -51,6 +51,10 @@ async function* governedStream(streamFn, governor, model, context, options) {
|
|
|
51
51
|
: {}),
|
|
52
52
|
chunksDelivered: usage.chunksDelivered,
|
|
53
53
|
usageSource: usage.usageReported ? "provider" : "estimated",
|
|
54
|
+
// Ollama-native eval_duration (when the stream carried it) flows to
|
|
55
|
+
// receipt.meter.computeMs. Spread keeps the key OMITTED when absent —
|
|
56
|
+
// never `computeMs: undefined` (plan A6).
|
|
57
|
+
...(usage.computeMs != null ? { computeMs: usage.computeMs } : {}),
|
|
54
58
|
});
|
|
55
59
|
}
|
|
56
60
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-governor.js","sourceRoot":"","sources":["../src/stream-governor.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAgBjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAkB,EAAE,QAAkB;IAC9E,OAAO,CACN,KAAa,EACb,OAAsB,EACtB,OAAiC,EACJ,EAAE;QAC/B,OAAO,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC,CAAC;AACH,CAAC;AAED,KAAK,SAAS,CAAC,CAAC,cAAc,CAC7B,QAAkB,EAClB,QAAkB,EAClB,KAAa,EACb,OAAsB,EACtB,OAAiC;IAEjC,+BAA+B;IAC/B,sEAAsE;IACtE,wEAAwE;IACxE,4EAA4E;IAC5E,IAAI,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACd,gCAAgC,QAAQ,CAAC,eAAe,EAAE,0BAA0B,CACpF,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,MAAM,IAAI,GAAkB,MAAM,QAAQ,CAAC,SAAS,CAAC;QACpD,KAAK;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,EAAE;YACP,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E;KACD,CAAC,CAAC;IAEH,oCAAoC;IACpC,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;IAExC,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAEjD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAClC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,KAAK,CAAC;QACb,CAAC;QAED,+BAA+B;QAC/B,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;QAEnC,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;YAC3B,GAAG,CAAC,KAAK,CAAC,aAAa;gBACtB,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE;gBACtE,CAAC,CAAC,EAAE,CAAC;YACN,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;
|
|
1
|
+
{"version":3,"file":"stream-governor.js","sourceRoot":"","sources":["../src/stream-governor.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,12 @@ export interface AccumulatedUsage {
|
|
|
14
14
|
outputTokens: number;
|
|
15
15
|
chunksDelivered: number;
|
|
16
16
|
usageReported: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Generation wall time in ms, from an Ollama-native final chunk's
|
|
19
|
+
* eval_duration. Omitted (never `undefined`-valued) when the stream
|
|
20
|
+
* carried no native duration.
|
|
21
|
+
*/
|
|
22
|
+
computeMs?: number | undefined;
|
|
17
23
|
}
|
|
18
24
|
/**
|
|
19
25
|
* Duck-type chunks from raw provider streams. We support:
|
|
@@ -29,9 +35,27 @@ export interface AccumulatedUsage {
|
|
|
29
35
|
* Gemini:
|
|
30
36
|
* { candidates: [{ content: { parts: [...] } }], usageMetadata: { promptTokenCount, candidatesTokenCount } }
|
|
31
37
|
*
|
|
38
|
+
* Ollama native (/api/chat, /api/generate final chunk):
|
|
39
|
+
* { done: true, prompt_eval_count, eval_count, eval_duration }
|
|
40
|
+
*
|
|
32
41
|
* Returns null if the chunk is not a recognized usage-bearing shape.
|
|
33
42
|
*/
|
|
34
43
|
export declare function extractUsageFromProviderChunk(chunk: unknown): StreamUsage | null;
|
|
44
|
+
/**
|
|
45
|
+
* Extract generation compute time (ms) from an Ollama-native final chunk.
|
|
46
|
+
*
|
|
47
|
+
* Ollama reports `eval_duration` in NANOSECONDS on the `done: true` chunk.
|
|
48
|
+
* Converted to whole milliseconds and clamped to [0, 86_400_000] (24h) to
|
|
49
|
+
* guard absurd or hostile values (plan A8).
|
|
50
|
+
*
|
|
51
|
+
* `prompt_eval_duration` is explicitly IGNORED in M2 (plan A8): computeMs
|
|
52
|
+
* meters generation (eval) wall time only; prompt-processing time is a
|
|
53
|
+
* future enrichment once its KV-cache interaction semantics are pinned.
|
|
54
|
+
*
|
|
55
|
+
* Returns undefined for non-final chunks, non-Ollama shapes, or
|
|
56
|
+
* missing/non-finite durations.
|
|
57
|
+
*/
|
|
58
|
+
export declare function extractComputeMs(chunk: unknown): number | undefined;
|
|
35
59
|
/**
|
|
36
60
|
* Estimate output tokens from a streaming chunk's text delta.
|
|
37
61
|
* Used as a fallback when usage isn't reported. ~4 chars per token.
|
|
@@ -40,6 +64,7 @@ export declare function extractUsageFromProviderChunk(chunk: unknown): StreamUsa
|
|
|
40
64
|
* Anthropic: chunk.delta.text (content_block_delta)
|
|
41
65
|
* OpenAI: chunk.choices[0].delta.content
|
|
42
66
|
* Gemini: chunk.candidates[0].content.parts[0].text
|
|
67
|
+
* Ollama: chunk.message.content (native /api/chat, non-final only)
|
|
43
68
|
* pi-ai: chunk.text (text_delta event)
|
|
44
69
|
*/
|
|
45
70
|
export declare function extractTextDeltaLength(chunk: unknown): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-extractor.d.ts","sourceRoot":"","sources":["../src/token-extractor.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"token-extractor.d.ts","sourceRoot":"","sources":["../src/token-extractor.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAaD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAyEhF;AAqBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAgD7D;AAMD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAgB5E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI;IACpC,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,MAAM,IAAI,gBAAgB,CAAC;CAC3B,CAwCA"}
|
package/dist/token-extractor.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// Copyright 2026 Usertools, Inc.
|
|
3
3
|
/** Max tokens to accept from a provider (prevents Infinity/overflow in cost math). */
|
|
4
4
|
const MAX_TOKENS = 2_000_000;
|
|
5
|
+
/** Max computeMs to accept — 24h; guards absurd/hostile eval_duration values (plan A8). */
|
|
6
|
+
const MAX_COMPUTE_MS = 86_400_000;
|
|
5
7
|
function clampTokens(n) {
|
|
6
8
|
if (!Number.isFinite(n))
|
|
7
9
|
return 0;
|
|
@@ -21,6 +23,9 @@ function clampTokens(n) {
|
|
|
21
23
|
* Gemini:
|
|
22
24
|
* { candidates: [{ content: { parts: [...] } }], usageMetadata: { promptTokenCount, candidatesTokenCount } }
|
|
23
25
|
*
|
|
26
|
+
* Ollama native (/api/chat, /api/generate final chunk):
|
|
27
|
+
* { done: true, prompt_eval_count, eval_count, eval_duration }
|
|
28
|
+
*
|
|
24
29
|
* Returns null if the chunk is not a recognized usage-bearing shape.
|
|
25
30
|
*/
|
|
26
31
|
export function extractUsageFromProviderChunk(chunk) {
|
|
@@ -87,8 +92,59 @@ export function extractUsageFromProviderChunk(chunk) {
|
|
|
87
92
|
};
|
|
88
93
|
}
|
|
89
94
|
}
|
|
95
|
+
// ── Ollama native final chunk (done: true + eval counts) ──
|
|
96
|
+
const ollama = extractOllamaUsage(c);
|
|
97
|
+
if (ollama != null)
|
|
98
|
+
return ollama;
|
|
90
99
|
return null;
|
|
91
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Ollama-native final chunk (/api/chat, /api/generate): `done === true` with
|
|
103
|
+
* numeric prompt_eval_count / eval_count token counts. OpenAI chunks carry
|
|
104
|
+
* neither field (they report prompt_tokens/completion_tokens under `usage`),
|
|
105
|
+
* so OpenAI-compat streams cannot misfire into this family.
|
|
106
|
+
*/
|
|
107
|
+
function extractOllamaUsage(chunk) {
|
|
108
|
+
if (chunk == null || typeof chunk !== "object")
|
|
109
|
+
return null;
|
|
110
|
+
const c = chunk;
|
|
111
|
+
if (c.done !== true)
|
|
112
|
+
return null;
|
|
113
|
+
const input = readNum(c.prompt_eval_count);
|
|
114
|
+
const output = readNum(c.eval_count);
|
|
115
|
+
if (input == null && output == null)
|
|
116
|
+
return null;
|
|
117
|
+
return {
|
|
118
|
+
inputTokens: clampTokens(input ?? 0),
|
|
119
|
+
outputTokens: clampTokens(output ?? 0),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Extract generation compute time (ms) from an Ollama-native final chunk.
|
|
124
|
+
*
|
|
125
|
+
* Ollama reports `eval_duration` in NANOSECONDS on the `done: true` chunk.
|
|
126
|
+
* Converted to whole milliseconds and clamped to [0, 86_400_000] (24h) to
|
|
127
|
+
* guard absurd or hostile values (plan A8).
|
|
128
|
+
*
|
|
129
|
+
* `prompt_eval_duration` is explicitly IGNORED in M2 (plan A8): computeMs
|
|
130
|
+
* meters generation (eval) wall time only; prompt-processing time is a
|
|
131
|
+
* future enrichment once its KV-cache interaction semantics are pinned.
|
|
132
|
+
*
|
|
133
|
+
* Returns undefined for non-final chunks, non-Ollama shapes, or
|
|
134
|
+
* missing/non-finite durations.
|
|
135
|
+
*/
|
|
136
|
+
export function extractComputeMs(chunk) {
|
|
137
|
+
if (chunk == null || typeof chunk !== "object")
|
|
138
|
+
return undefined;
|
|
139
|
+
const c = chunk;
|
|
140
|
+
if (c.done !== true)
|
|
141
|
+
return undefined;
|
|
142
|
+
const ns = Number(c.eval_duration);
|
|
143
|
+
if (!Number.isFinite(ns))
|
|
144
|
+
return undefined;
|
|
145
|
+
const ms = Math.round(ns / 1e6);
|
|
146
|
+
return Math.min(Math.max(0, ms), MAX_COMPUTE_MS);
|
|
147
|
+
}
|
|
92
148
|
/**
|
|
93
149
|
* Estimate output tokens from a streaming chunk's text delta.
|
|
94
150
|
* Used as a fallback when usage isn't reported. ~4 chars per token.
|
|
@@ -97,6 +153,7 @@ export function extractUsageFromProviderChunk(chunk) {
|
|
|
97
153
|
* Anthropic: chunk.delta.text (content_block_delta)
|
|
98
154
|
* OpenAI: chunk.choices[0].delta.content
|
|
99
155
|
* Gemini: chunk.candidates[0].content.parts[0].text
|
|
156
|
+
* Ollama: chunk.message.content (native /api/chat, non-final only)
|
|
100
157
|
* pi-ai: chunk.text (text_delta event)
|
|
101
158
|
*/
|
|
102
159
|
export function extractTextDeltaLength(chunk) {
|
|
@@ -135,6 +192,16 @@ export function extractTextDeltaLength(chunk) {
|
|
|
135
192
|
return len;
|
|
136
193
|
}
|
|
137
194
|
}
|
|
195
|
+
// Ollama native /api/chat delta: { message: { content }, done: false }.
|
|
196
|
+
// Only NON-final chunks are deltas — the done chunk repeats an empty
|
|
197
|
+
// content alongside the usage totals, so it must not count as text.
|
|
198
|
+
// (Anthropic message_start also carries `message`, but its content is an
|
|
199
|
+
// array, so the string check keeps it at 0 as before.)
|
|
200
|
+
if (c.done !== true && typeof c.message === "object" && c.message != null) {
|
|
201
|
+
const msg = c.message;
|
|
202
|
+
if (typeof msg.content === "string")
|
|
203
|
+
return msg.content.length;
|
|
204
|
+
}
|
|
138
205
|
return 0;
|
|
139
206
|
}
|
|
140
207
|
function readNum(v) {
|
|
@@ -170,18 +237,35 @@ export function createAccumulator() {
|
|
|
170
237
|
let outputTokens = 0;
|
|
171
238
|
let chunksDelivered = 0;
|
|
172
239
|
let usageReported = false;
|
|
240
|
+
let computeMs;
|
|
173
241
|
return {
|
|
174
242
|
update(event) {
|
|
175
243
|
chunksDelivered++;
|
|
176
|
-
|
|
244
|
+
// pi-ai events are the primary shape. Ollama-native chunks are the one
|
|
245
|
+
// raw-provider family the accumulator also understands (OpenClaw can hand
|
|
246
|
+
// /api/chat NDJSON through un-normalized); other raw provider shapes stay
|
|
247
|
+
// with extractUsageFromProviderChunk consumers, so e.g. raw Anthropic
|
|
248
|
+
// message_start/message_delta pairs can't half-replace each other here.
|
|
249
|
+
const usage = extractUsageFromEvent(event) ?? extractOllamaUsage(event);
|
|
177
250
|
if (usage != null) {
|
|
178
251
|
inputTokens = usage.inputTokens;
|
|
179
252
|
outputTokens = usage.outputTokens;
|
|
180
253
|
usageReported = true;
|
|
181
254
|
}
|
|
255
|
+
const ms = extractComputeMs(event);
|
|
256
|
+
if (ms != null) {
|
|
257
|
+
computeMs = ms;
|
|
258
|
+
}
|
|
182
259
|
},
|
|
183
260
|
result() {
|
|
184
|
-
return {
|
|
261
|
+
return {
|
|
262
|
+
inputTokens,
|
|
263
|
+
outputTokens,
|
|
264
|
+
chunksDelivered,
|
|
265
|
+
usageReported,
|
|
266
|
+
// Omitted entirely when absent — never `computeMs: undefined` (plan A6).
|
|
267
|
+
...(computeMs != null ? { computeMs } : {}),
|
|
268
|
+
};
|
|
185
269
|
},
|
|
186
270
|
};
|
|
187
271
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-extractor.js","sourceRoot":"","sources":["../src/token-extractor.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;
|
|
1
|
+
{"version":3,"file":"token-extractor.js","sourceRoot":"","sources":["../src/token-extractor.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* events. These mirror the OpenClaw/pi-ai interfaces without requiring
|
|
6
6
|
* the packages at compile time.
|
|
7
7
|
*/
|
|
8
|
+
import type { EndpointClass, LocalRuntime } from "usertrust";
|
|
8
9
|
export interface StreamUsage {
|
|
9
10
|
inputTokens: number;
|
|
10
11
|
outputTokens: number;
|
|
@@ -73,6 +74,18 @@ export interface UsertrustPluginConfig {
|
|
|
73
74
|
proxyKey?: string;
|
|
74
75
|
/** Vault directory (audit chain, spend ledger). Defaults to cwd. */
|
|
75
76
|
vaultBase?: string;
|
|
77
|
+
/**
|
|
78
|
+
* Explicit endpoint scope for this OpenClaw runtime (M2). TRUSTED-OPERATOR
|
|
79
|
+
* declaration: the headless/OpenClaw path has no client baseURL to sniff, so
|
|
80
|
+
* core's config.endpoints[] URL matchers do NOT apply here (design decision 6)
|
|
81
|
+
* — declare `{ class: "local" }` yourself or every call meters as cloud
|
|
82
|
+
* (frontier fallback pricing for local models + strict cloud anomaly thresholds).
|
|
83
|
+
*/
|
|
84
|
+
endpoint?: {
|
|
85
|
+
class: EndpointClass;
|
|
86
|
+
runtime?: LocalRuntime;
|
|
87
|
+
baseURL?: string;
|
|
88
|
+
};
|
|
76
89
|
}
|
|
77
90
|
export interface StreamContext {
|
|
78
91
|
messages: unknown[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "usertrust-openclaw",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "usertrust governance plugin for OpenClaw. Budget enforcement, audit trails, and policy gates for every LLM call — zero code changes.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Usertools, Inc. <hello@usertools.ai> (https://usertrust.ai)",
|
|
@@ -11,16 +11,7 @@
|
|
|
11
11
|
"directory": "packages/openclaw"
|
|
12
12
|
},
|
|
13
13
|
"bugs": "https://github.com/usertools-ai/usertrust/issues",
|
|
14
|
-
"keywords": [
|
|
15
|
-
"openclaw",
|
|
16
|
-
"usertrust",
|
|
17
|
-
"ai",
|
|
18
|
-
"governance",
|
|
19
|
-
"budget",
|
|
20
|
-
"audit",
|
|
21
|
-
"llm",
|
|
22
|
-
"plugin"
|
|
23
|
-
],
|
|
14
|
+
"keywords": ["openclaw", "usertrust", "ai", "governance", "budget", "audit", "llm", "plugin"],
|
|
24
15
|
"type": "module",
|
|
25
16
|
"main": "dist/index.js",
|
|
26
17
|
"types": "dist/index.d.ts",
|
|
@@ -35,10 +26,7 @@
|
|
|
35
26
|
"prepublishOnly": "tsc",
|
|
36
27
|
"demo": "tsx demo/runaway-agent.ts"
|
|
37
28
|
},
|
|
38
|
-
"files": [
|
|
39
|
-
"dist",
|
|
40
|
-
"openclaw.plugin.json"
|
|
41
|
-
],
|
|
29
|
+
"files": ["dist", "openclaw.plugin.json"],
|
|
42
30
|
"dependencies": {
|
|
43
31
|
"usertrust": "*"
|
|
44
32
|
},
|