@nanonets/graft 0.16.0 → 0.19.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 +10 -3
- package/dist/app/brain-build-process.d.ts +22 -0
- package/dist/app/brain-build-process.d.ts.map +1 -0
- package/dist/app/brain-build-process.js +129 -0
- package/dist/app/brain-build-process.js.map +1 -0
- package/dist/app/brain-build-worker.d.ts +35 -0
- package/dist/app/brain-build-worker.d.ts.map +1 -0
- package/dist/app/brain-build-worker.js +56 -0
- package/dist/app/brain-build-worker.js.map +1 -0
- package/dist/app/brain-build.d.ts +160 -0
- package/dist/app/brain-build.d.ts.map +1 -0
- package/dist/app/brain-build.js +278 -0
- package/dist/app/brain-build.js.map +1 -0
- package/dist/app/checkout.d.ts +53 -3
- package/dist/app/checkout.d.ts.map +1 -1
- package/dist/app/checkout.js +195 -27
- package/dist/app/checkout.js.map +1 -1
- package/dist/app/events.d.ts +7 -0
- package/dist/app/events.d.ts.map +1 -1
- package/dist/app/events.js +7 -2
- package/dist/app/events.js.map +1 -1
- package/dist/app/history.d.ts +128 -0
- package/dist/app/history.d.ts.map +1 -0
- package/dist/app/history.js +266 -0
- package/dist/app/history.js.map +1 -0
- package/dist/app/identity.d.ts +56 -0
- package/dist/app/identity.d.ts.map +1 -1
- package/dist/app/identity.js +119 -0
- package/dist/app/identity.js.map +1 -1
- package/dist/app/main.js +14 -0
- package/dist/app/main.js.map +1 -1
- package/dist/app/pages.d.ts +17 -0
- package/dist/app/pages.d.ts.map +1 -1
- package/dist/app/pages.js +112 -5
- package/dist/app/pages.js.map +1 -1
- package/dist/app/review-process.d.ts +66 -0
- package/dist/app/review-process.d.ts.map +1 -0
- package/dist/app/review-process.js +199 -0
- package/dist/app/review-process.js.map +1 -0
- package/dist/app/review-worker.d.ts +2 -0
- package/dist/app/review-worker.d.ts.map +1 -0
- package/dist/app/review-worker.js +108 -0
- package/dist/app/review-worker.js.map +1 -0
- package/dist/app/review.d.ts.map +1 -1
- package/dist/app/review.js +4 -1
- package/dist/app/review.js.map +1 -1
- package/dist/app/server.d.ts +31 -2
- package/dist/app/server.d.ts.map +1 -1
- package/dist/app/server.js +130 -3
- package/dist/app/server.js.map +1 -1
- package/dist/app/sources.d.ts +68 -0
- package/dist/app/sources.d.ts.map +1 -0
- package/dist/app/sources.js +342 -0
- package/dist/app/sources.js.map +1 -0
- package/dist/ask/ask.d.ts +6 -0
- package/dist/ask/ask.d.ts.map +1 -1
- package/dist/ask/ask.js +30 -2
- package/dist/ask/ask.js.map +1 -1
- package/dist/brain/attach.d.ts +44 -0
- package/dist/brain/attach.d.ts.map +1 -0
- package/dist/brain/attach.js +63 -0
- package/dist/brain/attach.js.map +1 -0
- package/dist/brain/connect.d.ts +59 -0
- package/dist/brain/connect.d.ts.map +1 -0
- package/dist/brain/connect.js +80 -0
- package/dist/brain/connect.js.map +1 -0
- package/dist/brain/link.d.ts +89 -0
- package/dist/brain/link.d.ts.map +1 -0
- package/dist/brain/link.js +146 -0
- package/dist/brain/link.js.map +1 -0
- package/dist/brain/push.d.ts +72 -0
- package/dist/brain/push.d.ts.map +1 -0
- package/dist/brain/push.js +191 -0
- package/dist/brain/push.js.map +1 -0
- package/dist/brain/signup.d.ts +73 -0
- package/dist/brain/signup.d.ts.map +1 -0
- package/dist/brain/signup.js +186 -0
- package/dist/brain/signup.js.map +1 -0
- package/dist/brain/watch.d.ts +136 -0
- package/dist/brain/watch.d.ts.map +1 -0
- package/dist/brain/watch.js +172 -0
- package/dist/brain/watch.js.map +1 -0
- package/dist/brain/wire.d.ts +38 -0
- package/dist/brain/wire.d.ts.map +1 -0
- package/dist/brain/wire.js +133 -0
- package/dist/brain/wire.js.map +1 -0
- package/dist/claude/format.d.ts.map +1 -1
- package/dist/claude/format.js +10 -3
- package/dist/claude/format.js.map +1 -1
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +32 -1
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/init.d.ts +5 -0
- package/dist/claude/init.d.ts.map +1 -1
- package/dist/claude/init.js +9 -1
- package/dist/claude/init.js.map +1 -1
- package/dist/claude/session-metrics.d.ts +10 -0
- package/dist/claude/session-metrics.d.ts.map +1 -1
- package/dist/claude/session-metrics.js +25 -0
- package/dist/claude/session-metrics.js.map +1 -1
- package/dist/claude/settings-merge.d.ts +18 -0
- package/dist/claude/settings-merge.d.ts.map +1 -1
- package/dist/claude/settings-merge.js +42 -8
- package/dist/claude/settings-merge.js.map +1 -1
- package/dist/claude/skill-template.d.ts.map +1 -1
- package/dist/claude/skill-template.js +6 -0
- package/dist/claude/skill-template.js.map +1 -1
- package/dist/claude/state.d.ts +14 -0
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js.map +1 -1
- package/dist/claude/tally.d.ts +27 -0
- package/dist/claude/tally.d.ts.map +1 -1
- package/dist/claude/tally.js +74 -1
- package/dist/claude/tally.js.map +1 -1
- package/dist/cli.js +310 -3
- package/dist/cli.js.map +1 -1
- package/dist/context/node-file.d.ts +4 -10
- package/dist/context/node-file.d.ts.map +1 -1
- package/dist/context/node-file.js +6 -2
- package/dist/context/node-file.js.map +1 -1
- package/dist/context/price.d.ts +49 -0
- package/dist/context/price.d.ts.map +1 -0
- package/dist/context/price.js +83 -0
- package/dist/context/price.js.map +1 -0
- package/dist/context/savings.d.ts +13 -3
- package/dist/context/savings.d.ts.map +1 -1
- package/dist/context/savings.js +44 -5
- package/dist/context/savings.js.map +1 -1
- package/dist/hosts/claude-global.d.ts +33 -0
- package/dist/hosts/claude-global.d.ts.map +1 -0
- package/dist/hosts/claude-global.js +118 -0
- package/dist/hosts/claude-global.js.map +1 -0
- package/dist/hosts/plan.d.ts.map +1 -1
- package/dist/hosts/plan.js +5 -1
- package/dist/hosts/plan.js.map +1 -1
- package/dist/hosts/retract.d.ts.map +1 -1
- package/dist/hosts/retract.js +33 -13
- package/dist/hosts/retract.js.map +1 -1
- package/dist/hosts/sections.d.ts +23 -2
- package/dist/hosts/sections.d.ts.map +1 -1
- package/dist/hosts/sections.js +25 -9
- package/dist/hosts/sections.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +33 -4
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +5 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/telemetry/contract.d.ts +12 -0
- package/dist/telemetry/contract.d.ts.map +1 -1
- package/dist/telemetry/contract.js +19 -0
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/telemetry/gate.d.ts +14 -0
- package/dist/telemetry/gate.d.ts.map +1 -1
- package/dist/telemetry/gate.js +18 -2
- package/dist/telemetry/gate.js.map +1 -1
- package/dist/upkeep-run.d.ts.map +1 -1
- package/dist/upkeep-run.js +12 -2
- package/dist/upkeep-run.js.map +1 -1
- package/dist/upkeep.d.ts +18 -0
- package/dist/upkeep.d.ts.map +1 -1
- package/dist/upkeep.js +38 -0
- package/dist/upkeep.js.map +1 -1
- package/dist/util/state.d.ts +9 -0
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js.map +1 -1
- package/package.json +1 -1
|
@@ -14,13 +14,22 @@ const ALLOW_ENTRIES = [
|
|
|
14
14
|
'Bash(graft-dev:*)',
|
|
15
15
|
'Bash(node dist/cli.js:*)',
|
|
16
16
|
];
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
/** Where the repo-level install's shims sit, relative to whatever project is open. */
|
|
18
|
+
const REPO_HELPERS = '${CLAUDE_PROJECT_DIR:-.}/.claude/helpers';
|
|
19
|
+
/**
|
|
20
|
+
* `helpers` is the directory holding `graft-hooks.cjs`, and it is a parameter for
|
|
21
|
+
* one reason: the user-level install (see hosts/claude-global.ts) has to name an
|
|
22
|
+
* absolute path. A `${CLAUDE_PROJECT_DIR}` command works only where a previous
|
|
23
|
+
* `graft init` wrote a shim into that project — which is exactly the case the
|
|
24
|
+
* global copy exists to cover, so it cannot reuse the repo form.
|
|
25
|
+
*/
|
|
26
|
+
function hookCmd(arg, helpers = REPO_HELPERS) {
|
|
27
|
+
return `node "${helpers}/graft-hooks.cjs" ${arg}`;
|
|
19
28
|
}
|
|
20
|
-
function graftBlocks() {
|
|
29
|
+
function graftBlocks(helpers) {
|
|
21
30
|
return {
|
|
22
31
|
PostToolUse: [
|
|
23
|
-
{ matcher: 'Write|Edit|MultiEdit', hooks: [{ type: 'command', command: hookCmd('post-edit'), timeout: 10000 }] },
|
|
32
|
+
{ matcher: 'Write|Edit|MultiEdit', hooks: [{ type: 'command', command: hookCmd('post-edit', helpers), timeout: 10000 }] },
|
|
24
33
|
// Score the usage mix and sum token savings. A graft retrieval (CLI `graft …`
|
|
25
34
|
// via Bash, or the `graft_*` MCP tools) prints a `[graft] tokens saved ≈ N`
|
|
26
35
|
// footer this hook sums into the session total; the same hook classifies
|
|
@@ -28,7 +37,7 @@ function graftBlocks() {
|
|
|
28
37
|
// `graft stats` and the `session_summary` graft-vs-grep ratio. Broad matcher,
|
|
29
38
|
// but the handler no-ops instantly unless there is something to record, so an
|
|
30
39
|
// unrelated Bash or a plain Read costs only a stdin read.
|
|
31
|
-
{ matcher: 'Bash|mcp__graft__|Read|Grep|Glob', hooks: [{ type: 'command', command: hookCmd('tool-savings'), timeout: 8000 }] },
|
|
40
|
+
{ matcher: 'Bash|mcp__graft__|Read|Grep|Glob', hooks: [{ type: 'command', command: hookCmd('tool-savings', helpers), timeout: 8000 }] },
|
|
32
41
|
],
|
|
33
42
|
// Longer budget than the other hooks: its `graft ask` is a real query, and a
|
|
34
43
|
// query now brings the graph up to date first (graph/refresh.ts) — usually
|
|
@@ -38,9 +47,9 @@ function graftBlocks() {
|
|
|
38
47
|
// this bump (8s) keeps a child that fits inside 8s. Changing the number here is
|
|
39
48
|
// therefore safe on its own — but it only reaches an existing repo when someone
|
|
40
49
|
// re-runs `graft init`, since that is the only caller of this function.
|
|
41
|
-
UserPromptSubmit: [{ hooks: [{ type: 'command', command: hookCmd('prompt'), timeout: 15000 }] }],
|
|
42
|
-
SessionStart: [{ hooks: [{ type: 'command', command: hookCmd('session-start'), timeout: 8000 }] }],
|
|
43
|
-
Stop: [{ hooks: [{ type: 'command', command: hookCmd('stop'), timeout: 8000 }] }],
|
|
50
|
+
UserPromptSubmit: [{ hooks: [{ type: 'command', command: hookCmd('prompt', helpers), timeout: 15000 }] }],
|
|
51
|
+
SessionStart: [{ hooks: [{ type: 'command', command: hookCmd('session-start', helpers), timeout: 8000 }] }],
|
|
52
|
+
Stop: [{ hooks: [{ type: 'command', command: hookCmd('stop', helpers), timeout: 8000 }] }],
|
|
44
53
|
};
|
|
45
54
|
}
|
|
46
55
|
/**
|
|
@@ -114,4 +123,29 @@ export function mergeGraftSettings(existing, opts = {}) {
|
|
|
114
123
|
merged.permissions.allow = [...priorAllow.filter((e) => !isGraftAllowEntry(e)), ...ALLOW_ENTRIES];
|
|
115
124
|
return { merged, warnings };
|
|
116
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* The hook blocks alone, merged into a settings file, with the shims addressed by
|
|
128
|
+
* absolute path — `~/.claude/settings.json`, where a write reaches every project on
|
|
129
|
+
* the machine (see hosts/claude-global.ts for why that copy has to exist).
|
|
130
|
+
*
|
|
131
|
+
* Hooks only, deliberately. `mergeGraftSettings` also claims the statusline, the
|
|
132
|
+
* footer regex and a Bash allowlist, and each of those is a reasonable thing to
|
|
133
|
+
* accept for a repo you ran `graft init` in and an unreasonable thing to impose on
|
|
134
|
+
* every repo you ever open — a statusline especially, since a session allows exactly
|
|
135
|
+
* one and taking it globally would silently outrank the user's own. The hooks are the
|
|
136
|
+
* piece that has to be global, because they are what a worktree loses.
|
|
137
|
+
*
|
|
138
|
+
* Same idempotent shape as the repo merge: graft's prior entries are dropped before
|
|
139
|
+
* the current set is added, so re-running converges instead of stacking.
|
|
140
|
+
*/
|
|
141
|
+
export function mergeGraftHooks(existing, helpers) {
|
|
142
|
+
const merged = { ...(existing ?? {}) };
|
|
143
|
+
merged.hooks = { ...(merged.hooks ?? {}) };
|
|
144
|
+
for (const [event, blocks] of Object.entries(graftBlocks(helpers))) {
|
|
145
|
+
const prior = Array.isArray(merged.hooks[event]) ? merged.hooks[event] : [];
|
|
146
|
+
const foreign = prior.filter((e) => !isGraftEntry(e));
|
|
147
|
+
merged.hooks[event] = [...foreign, ...blocks];
|
|
148
|
+
}
|
|
149
|
+
return { merged };
|
|
150
|
+
}
|
|
117
151
|
//# sourceMappingURL=settings-merge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-merge.js","sourceRoot":"","sources":["../../src/claude/settings-merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIxD,MAAM,MAAM,GAAG,sEAAsE,CAAC;AACtF;sEACsE;AACtE,MAAM,uBAAuB,GAAG,sBAAsB,CAAC;AACvD,MAAM,MAAM,GAAG,sBAAsB,CAAC;AACtC,8EAA8E;AAC9E,iFAAiF;AACjF,iFAAiF;AACjF,wEAAwE;AACxE,MAAM,aAAa,GAAG;IACpB,eAAe;IACf,mBAAmB;IACnB,mBAAmB;IACnB,0BAA0B;CAC3B,CAAC;AAEF,SAAS,OAAO,CAAC,GAAW;
|
|
1
|
+
{"version":3,"file":"settings-merge.js","sourceRoot":"","sources":["../../src/claude/settings-merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-template.d.ts","sourceRoot":"","sources":["../../src/claude/skill-template.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"skill-template.d.ts","sourceRoot":"","sources":["../../src/claude/skill-template.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,IAAI,MAAM,CA8JtC"}
|
|
@@ -137,6 +137,12 @@ tally summing those numbers across every graft call you made, e.g.
|
|
|
137
137
|
skip it. This is the per-turn figure; the statusline carries the running
|
|
138
138
|
session total.
|
|
139
139
|
|
|
140
|
+
Once a turn has been billed, each line also states what that call was worth in
|
|
141
|
+
dollars, at the rate this session is actually paying for input tokens — include
|
|
142
|
+
that total alongside the tokens, e.g. \`🌱 graft saved ~12,400 tokens (~$0.04)
|
|
143
|
+
this turn\`. When a line carries no dollar figure, report tokens alone rather
|
|
144
|
+
than pricing them yourself.
|
|
145
|
+
|
|
140
146
|
**Never pipe a graft command through \`head\`, \`tail\`, or \`sed -n\`.** Every tool
|
|
141
147
|
is already capped and states what it dropped; clipping it costs you hits you
|
|
142
148
|
asked for, and it silently drops the savings line the statusline's running
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-template.js","sourceRoot":"","sources":["../../src/claude/skill-template.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,yFAAyF;AACzF,uFAAuF;AACvF,uFAAuF;AACvF,oCAAoC;AACpC,MAAM,UAAU,aAAa;IAC3B,OAAO
|
|
1
|
+
{"version":3,"file":"skill-template.js","sourceRoot":"","sources":["../../src/claude/skill-template.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,yFAAyF;AACzF,uFAAuF;AACvF,uFAAuF;AACvF,oCAAoC;AACpC,MAAM,UAAU,aAAa;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4JR,CAAC;AACF,CAAC"}
|
package/dist/claude/state.d.ts
CHANGED
|
@@ -28,6 +28,20 @@ export interface SessionState {
|
|
|
28
28
|
/** `uuid` of the last assistant reply already examined, so a Stop that fires
|
|
29
29
|
* without new prose (or fires twice) can't count one reply as two turns. */
|
|
30
30
|
lastTallyUuid?: string;
|
|
31
|
+
/** Running micro-dollar cost of the input tokens this session has been billed
|
|
32
|
+
* for, and the tokens that bought. Their ratio is the blended price of one
|
|
33
|
+
* input token here — model and cache-hit ratio already folded in — which is
|
|
34
|
+
* what turns `savedTokens` into a dollar figure. Stored as the pair rather
|
|
35
|
+
* than the ratio so the rate re-blends as the session's cache warms rather
|
|
36
|
+
* than freezing at whatever turn one happened to pay. Optional: absent on a
|
|
37
|
+
* host that exposes no transcript, and on turn one of every session. */
|
|
38
|
+
inputCostMicros?: number;
|
|
39
|
+
inputTokensBilled?: number;
|
|
40
|
+
/** `uuid` of the last assistant entry already billed, so a duplicate Stop
|
|
41
|
+
* can't charge one turn twice. Separate from `lastTallyUuid` because the two
|
|
42
|
+
* are sampled on different turns: the tally only on graft turns, the cost on
|
|
43
|
+
* every one. */
|
|
44
|
+
lastBillingUuid?: string;
|
|
31
45
|
/** Set once this session has been rolled up into a `session_summary`
|
|
32
46
|
* telemetry event, so a resumed or long-lived session is counted once.
|
|
33
47
|
* A flag rather than deleting the file: the file still holds `lastQuery` and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/claude/state.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IACxC,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;IACpB;;8DAE0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;wEACoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;sFAEkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;iFAC6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;yEACqE;IACrE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;gFAC4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;4DAGwD;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;wBAIoB;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAMD,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAyC;AAItF;iFACiF;AACjF,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAIlD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,CAE/D;AACD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAEzE"}
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/claude/state.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IACxC,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;IACpB;;8DAE0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;wEACoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;sFAEkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;iFAC6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;yEACqE;IACrE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;gFAC4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;4EAMwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;oBAGgB;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;4DAGwD;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;wBAIoB;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAMD,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAyC;AAItF;iFACiF;AACjF,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAIlD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,CAE/D;AACD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAEzE"}
|
package/dist/claude/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/claude/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGvE,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,UAAU,GACX,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/claude/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGvE,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,UAAU,GACX,MAAM,kBAAkB,CAAC;AAwD1B,SAAS,YAAY;IACnB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAChI,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,UAAU,CAAC,CAAS,IAAY,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AAEtF,SAAS,WAAW,CAAC,CAAS,EAAE,EAAU,IAAY,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAEjG;iFACiF;AACjF,MAAM,UAAU,cAAc,CAAC,CAAS;IACtC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/G,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,EAAU;IAC/C,OAAO,QAAQ,CAAe,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,YAAY,EAAE,CAAC;AACtE,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,EAAU,EAAE,CAAe;IACjE,eAAe,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
package/dist/claude/tally.d.ts
CHANGED
|
@@ -7,6 +7,16 @@ export interface AssistantTurn {
|
|
|
7
7
|
/** Every text block the agent emitted since the last user prompt, joined. */
|
|
8
8
|
text: string;
|
|
9
9
|
}
|
|
10
|
+
/** What the last turn's input tokens cost, alongside how many there were. The
|
|
11
|
+
* pair is what a blended rate is made of; neither half means much alone. */
|
|
12
|
+
export interface TurnBilling {
|
|
13
|
+
/** `uuid` of the last assistant entry, so a repeated Stop can't bill a turn twice. */
|
|
14
|
+
uuid: string;
|
|
15
|
+
/** Micro-dollars this turn's input tokens cost, cache multipliers applied. */
|
|
16
|
+
costMicros: number;
|
|
17
|
+
/** Input tokens billed this turn, cached and fresh alike. */
|
|
18
|
+
tokens: number;
|
|
19
|
+
}
|
|
10
20
|
/**
|
|
11
21
|
* The assistant prose of the turn the transcript ends on, or null when it can't
|
|
12
22
|
* be read (no path — a host whose Stop hook doesn't name one — unreadable file,
|
|
@@ -20,4 +30,21 @@ export interface AssistantTurn {
|
|
|
20
30
|
* is never what the user read.
|
|
21
31
|
*/
|
|
22
32
|
export declare function lastAssistantTurn(transcriptPath: unknown): AssistantTurn | null;
|
|
33
|
+
/**
|
|
34
|
+
* What the turn the transcript ends on cost in input tokens — the measured
|
|
35
|
+
* half of the dollar figure the statusline and the turn nudge report.
|
|
36
|
+
*
|
|
37
|
+
* Costed per API response, not per turn, so a turn that switched models is
|
|
38
|
+
* priced correctly rather than labelled with whichever model happened to go
|
|
39
|
+
* last. Responses are deduped by `message.id`: one response is written to the
|
|
40
|
+
* transcript as several entries (a `thinking` block and a `tool_use` block land
|
|
41
|
+
* on their own lines) and every one of them repeats the same `usage`, so
|
|
42
|
+
* summing the lines would bill the turn two or three times over.
|
|
43
|
+
*
|
|
44
|
+
* Null when there is nothing to bill — no transcript path (a host whose Stop
|
|
45
|
+
* hook names none), an unreadable file, a turn whose entries carry no `usage`,
|
|
46
|
+
* or a model with no price in {@link inputUsdPerMtok}. As everywhere in this
|
|
47
|
+
* file, null means "not observed", never "zero".
|
|
48
|
+
*/
|
|
49
|
+
export declare function lastTurnBilling(transcriptPath: unknown): TurnBilling | null;
|
|
23
50
|
//# sourceMappingURL=tally.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tally.d.ts","sourceRoot":"","sources":["../../src/claude/tally.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tally.d.ts","sourceRoot":"","sources":["../../src/claude/tally.ts"],"names":[],"mappings":"AA2CA,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,iFAAiF;AACjF,MAAM,WAAW,aAAa;IAC5B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;CACd;AAED;4EAC4E;AAC5E,MAAM,WAAW,WAAW;IAC1B,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;CAChB;AAuCD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CA0B/E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CA2C3E"}
|
package/dist/claude/tally.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* `[graft] tokens saved ≈ N` footer the PostToolUse accumulator swept up. That
|
|
6
6
|
* number is real whether or not anyone sees it. This module measures the other
|
|
7
7
|
* half: whether the reply the user read closed with the one-line tally that
|
|
8
|
-
* SKILL.md and `
|
|
8
|
+
* SKILL.md and `savingsTurnNudge` (context/savings.ts) both ask for. A turn
|
|
9
9
|
* that saved 20k tokens in silence is a turn where the product did its job and
|
|
10
10
|
* got no credit for it, and the two are indistinguishable in the numbers we
|
|
11
11
|
* ship today.
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
* hook that read the whole file would get slower every turn for no extra signal.
|
|
22
22
|
*/
|
|
23
23
|
import { closeSync, fstatSync, openSync, readSync } from 'node:fs';
|
|
24
|
+
import { turnInputCostMicros, turnInputTokens } from '../context/price.js';
|
|
24
25
|
/**
|
|
25
26
|
* How much of the transcript's end to read. Comfortably larger than any single
|
|
26
27
|
* turn's worth of entries, small enough that the read cost is flat as the
|
|
@@ -135,4 +136,76 @@ export function lastAssistantTurn(transcriptPath) {
|
|
|
135
136
|
return null;
|
|
136
137
|
return { uuid, text: parts.join('\n') };
|
|
137
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* What the turn the transcript ends on cost in input tokens — the measured
|
|
141
|
+
* half of the dollar figure the statusline and the turn nudge report.
|
|
142
|
+
*
|
|
143
|
+
* Costed per API response, not per turn, so a turn that switched models is
|
|
144
|
+
* priced correctly rather than labelled with whichever model happened to go
|
|
145
|
+
* last. Responses are deduped by `message.id`: one response is written to the
|
|
146
|
+
* transcript as several entries (a `thinking` block and a `tool_use` block land
|
|
147
|
+
* on their own lines) and every one of them repeats the same `usage`, so
|
|
148
|
+
* summing the lines would bill the turn two or three times over.
|
|
149
|
+
*
|
|
150
|
+
* Null when there is nothing to bill — no transcript path (a host whose Stop
|
|
151
|
+
* hook names none), an unreadable file, a turn whose entries carry no `usage`,
|
|
152
|
+
* or a model with no price in {@link inputUsdPerMtok}. As everywhere in this
|
|
153
|
+
* file, null means "not observed", never "zero".
|
|
154
|
+
*/
|
|
155
|
+
export function lastTurnBilling(transcriptPath) {
|
|
156
|
+
if (typeof transcriptPath !== 'string' || !transcriptPath)
|
|
157
|
+
return null;
|
|
158
|
+
const tail = readTail(transcriptPath);
|
|
159
|
+
if (!tail)
|
|
160
|
+
return null;
|
|
161
|
+
const entries = [];
|
|
162
|
+
for (const line of tail.split('\n')) {
|
|
163
|
+
if (!line.trim())
|
|
164
|
+
continue;
|
|
165
|
+
try {
|
|
166
|
+
entries.push(JSON.parse(line));
|
|
167
|
+
}
|
|
168
|
+
catch { /* clipped or partial line */ }
|
|
169
|
+
}
|
|
170
|
+
const seen = new Set();
|
|
171
|
+
let uuid = null;
|
|
172
|
+
let costMicros = 0;
|
|
173
|
+
let tokens = 0;
|
|
174
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
175
|
+
const e = entries[i];
|
|
176
|
+
if (e?.isSidechain)
|
|
177
|
+
continue;
|
|
178
|
+
if (isUserPrompt(e))
|
|
179
|
+
break;
|
|
180
|
+
if (e?.type !== 'assistant')
|
|
181
|
+
continue;
|
|
182
|
+
if (uuid === null && typeof e?.uuid === 'string')
|
|
183
|
+
uuid = e.uuid;
|
|
184
|
+
const msg = e?.message;
|
|
185
|
+
const id = msg?.id;
|
|
186
|
+
if (typeof id !== 'string' || seen.has(id))
|
|
187
|
+
continue;
|
|
188
|
+
const usage = msg?.usage;
|
|
189
|
+
if (!usage)
|
|
190
|
+
continue;
|
|
191
|
+
seen.add(id);
|
|
192
|
+
const turn = {
|
|
193
|
+
model: String(msg?.model ?? ''),
|
|
194
|
+
input: Number(usage.input_tokens) || 0,
|
|
195
|
+
cacheCreate: Number(usage.cache_creation_input_tokens) || 0,
|
|
196
|
+
cacheRead: Number(usage.cache_read_input_tokens) || 0,
|
|
197
|
+
};
|
|
198
|
+
const micros = turnInputCostMicros(turn);
|
|
199
|
+
// An unpriced model contributes neither cost nor tokens: leaving its tokens
|
|
200
|
+
// in the denominator alone would drag the blended rate toward zero and
|
|
201
|
+
// quietly under-report every saving after it.
|
|
202
|
+
if (micros === null)
|
|
203
|
+
continue;
|
|
204
|
+
costMicros += micros;
|
|
205
|
+
tokens += turnInputTokens(turn);
|
|
206
|
+
}
|
|
207
|
+
if (uuid === null || tokens === 0)
|
|
208
|
+
return null;
|
|
209
|
+
return { uuid, costMicros, tokens };
|
|
210
|
+
}
|
|
138
211
|
//# sourceMappingURL=tally.js.map
|
package/dist/claude/tally.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tally.js","sourceRoot":"","sources":["../../src/claude/tally.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"tally.js","sourceRoot":"","sources":["../../src/claude/tally.ts"],"names":[],"mappings":"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"}
|