stitchkit 0.68.6 → 0.68.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"run-execution.d.ts","sourceRoot":"","sources":["../../src/agent-runtime/run-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,OAAO,EACb,MAAM,IAAI,CAAC;AAGZ,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,UAAU,CAAC;AAEvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAapD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAKL,KAAK,QAAQ,EAMd,MAAM,WAAW,CAAC;AAuCnB,8DAA8D;AAC9D,MAAM,WAAW,uBAAuB,CAAC,OAAO,EAAE,KAAK,SAAS,OAAO;IACrE,MAAM,EAAE,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3C,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,IAAI,MAAM,CAAC;IACrB,GAAG,IAAI,IAAI,CAAC;IACZ,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,KAAK,SAAS,OAAO,EAC9D,YAAY,EAAE,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,WAcb;IACtC,WAAW,EAAE,QAAQ,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,gFAAgF;IAChF,GAAG,EAAE,MAAM,CAAC;IACZ,gFAAgF;IAChF,UAAU,CAAC,IAAI,IAAI,CAAC;CACrB,KAAG,OAAO,CAAC,kBAAkB,CAAC,CA23BhC"}
1
+ {"version":3,"file":"run-execution.d.ts","sourceRoot":"","sources":["../../src/agent-runtime/run-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,OAAO,EACb,MAAM,IAAI,CAAC;AAGZ,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,UAAU,CAAC;AAEvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAapD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAKL,KAAK,QAAQ,EAMd,MAAM,WAAW,CAAC;AAuCnB,8DAA8D;AAC9D,MAAM,WAAW,uBAAuB,CAAC,OAAO,EAAE,KAAK,SAAS,OAAO;IACrE,MAAM,EAAE,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3C,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,IAAI,MAAM,CAAC;IACrB,GAAG,IAAI,IAAI,CAAC;IACZ,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,KAAK,SAAS,OAAO,EAC9D,YAAY,EAAE,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,WAcb;IACtC,WAAW,EAAE,QAAQ,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,gFAAgF;IAChF,GAAG,EAAE,MAAM,CAAC;IACZ,gFAAgF;IAChF,UAAU,CAAC,IAAI,IAAI,CAAC;CACrB,KAAG,OAAO,CAAC,kBAAkB,CAAC,CAq4BhC"}
@@ -34,7 +34,7 @@ export declare function abortTerminalReason(signal: AbortSignal): AgentTerminalR
34
34
  */
35
35
  export declare function addUsage(total: AgentUsage | undefined, step: AgentUsage): AgentUsage;
36
36
  /**
37
- * The provider's own run total where it has one, ours where it does not.
37
+ * The SDK's own model-step total where it has one, our per-step sum where it does not.
38
38
  *
39
39
  * `totalUsage` is the SDK's sum over the steps it saw, and it covers only the
40
40
  * five token fields it knows about — a `normalizeUsage` hook that reads
@@ -49,7 +49,7 @@ export declare function addUsage(total: AgentUsage | undefined, step: AgentUsage
49
49
  * for a billable figure cares about, and pretending otherwise made one run
50
50
  * report `provider-reported` on success and `computed` on abort.
51
51
  */
52
- export declare function mergeRunTotals(sdkTotal: AgentUsage, accumulated: AgentUsage | undefined): AgentUsage;
52
+ export declare function mergeModelTotals(sdkTotal: AgentUsage, accumulated: AgentUsage | undefined): AgentUsage;
53
53
  /**
54
54
  * Every field present, so a reader never has to tell an absent key from a
55
55
  * reported zero.
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-internals.d.ts","sourceRoot":"","sources":["../../src/agent-runtime/runtime-internals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAEL,KAAK,gBAAgB,EAErB,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AAGnB;;;;;GAKG;AAEH,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAI1E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAG5E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO;;;;cAI9C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAQxE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,CAK5E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAuDpF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,UAAU,EACpB,WAAW,EAAE,UAAU,GAAG,SAAS,GAClC,UAAU,CAiBZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,CAYrE;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,IAAI,UAAU,CAUzC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAG,UAAU,CAmBvE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS;;iBAEhE,IAAI;;EAiBxB"}
1
+ {"version":3,"file":"runtime-internals.d.ts","sourceRoot":"","sources":["../../src/agent-runtime/runtime-internals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAEL,KAAK,gBAAgB,EAErB,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AAGnB;;;;;GAKG;AAEH,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAI1E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAG5E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO;;;;cAI9C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAQxE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,CAK5E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAuDpF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,UAAU,EACpB,WAAW,EAAE,UAAU,GAAG,SAAS,GAClC,UAAU,CAiBZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,CAYrE;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,IAAI,UAAU,CAUzC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAG,UAAU,CAmBvE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS;;iBAEhE,IAAI;;EAiBxB"}
@@ -1393,7 +1393,7 @@ function addUsage(total, step) {
1393
1393
  ...cost && { cost }
1394
1394
  };
1395
1395
  }
1396
- function mergeRunTotals(sdkTotal, accumulated) {
1396
+ function mergeModelTotals(sdkTotal, accumulated) {
1397
1397
  const pick = (total, ours) => total?.value !== undefined ? { value: total.value, provenance: "computed" } : ours ?? { provenance: "unavailable" };
1398
1398
  return {
1399
1399
  inputTokens: pick(sdkTotal.inputTokens, accumulated?.inputTokens),
@@ -1576,7 +1576,9 @@ function createRunExecutor(dependencies) {
1576
1576
  let eventCount = 0;
1577
1577
  let sequence = 0;
1578
1578
  let terminalReason = "success";
1579
- let usage = input.acceptedRun.usage;
1579
+ let nonModelUsage = input.acceptedRun.usage;
1580
+ let modelUsage;
1581
+ let usage = nonModelUsage;
1580
1582
  let sawProviderFinish = false;
1581
1583
  let step = 0;
1582
1584
  let selectedModel;
@@ -1651,8 +1653,10 @@ function createRunExecutor(dependencies) {
1651
1653
  snapshot = compacted.snapshot;
1652
1654
  observedVersion = snapshot.version;
1653
1655
  run = findRun(snapshot.runs, run.id);
1654
- if (compacted.usage)
1655
- usage = addUsage(usage, compacted.usage);
1656
+ if (compacted.usage) {
1657
+ nonModelUsage = addUsage(nonModelUsage, compacted.usage);
1658
+ usage = modelUsage ? addUsage(nonModelUsage, modelUsage) : nonModelUsage;
1659
+ }
1656
1660
  }
1657
1661
  const assertCurrent = async () => {
1658
1662
  if (executionSignal.aborted)
@@ -2009,7 +2013,8 @@ function createRunExecutor(dependencies) {
2009
2013
  usage: part.usage,
2010
2014
  providerMetadata: part.providerMetadata
2011
2015
  }) ?? normalizeSdkUsage(part.usage);
2012
- usage = addUsage(usage, stepUsage);
2016
+ modelUsage = addUsage(modelUsage, stepUsage);
2017
+ usage = nonModelUsage ? addUsage(nonModelUsage, modelUsage) : modelUsage;
2013
2018
  config.observe?.emit({
2014
2019
  schemaVersion: 1,
2015
2020
  eventId: generateId(),
@@ -2034,7 +2039,8 @@ function createRunExecutor(dependencies) {
2034
2039
  }
2035
2040
  if (part.type === "finish") {
2036
2041
  sawProviderFinish = true;
2037
- usage = mergeRunTotals(normalizeSdkUsage(part.totalUsage), usage);
2042
+ modelUsage = mergeModelTotals(normalizeSdkUsage(part.totalUsage), modelUsage);
2043
+ usage = nonModelUsage ? addUsage(nonModelUsage, modelUsage) : modelUsage;
2038
2044
  }
2039
2045
  if (eventCount % checkpointEveryEvents === 0)
2040
2046
  await checkpoint();
package/dist/testing.js CHANGED
@@ -454,6 +454,14 @@ async function conformanceScenario(store, conversationIds) {
454
454
  if (interruptedRun.usage?.cost?.value !== 0.25) {
455
455
  throw new Error("An interrupt must not discard the figure the run had already spent");
456
456
  }
457
+ const terminalUsage = {
458
+ inputTokens: { value: 3000, provenance: "computed" },
459
+ outputTokens: { value: 300, provenance: "computed" },
460
+ reasoningTokens: { value: 30, provenance: "computed" },
461
+ cacheReadTokens: { value: 200, provenance: "computed" },
462
+ cacheWriteTokens: { value: 100, provenance: "computed" },
463
+ cost: { value: 1.5, currency: "USD", provenance: "computed" }
464
+ };
457
465
  const terminalResults = await Promise.all([
458
466
  store.commitRunTerminal({
459
467
  conversationId,
@@ -462,11 +470,7 @@ async function conformanceScenario(store, conversationIds) {
462
470
  ownerId: "conformance-owner",
463
471
  assistant: terminalAssistant,
464
472
  reason: "success",
465
- usage: {
466
- inputTokens: { value: 3000, provenance: "computed" },
467
- outputTokens: { value: 300, provenance: "computed" },
468
- cost: { value: 1.5, currency: "USD", provenance: "computed" }
469
- }
473
+ usage: terminalUsage
470
474
  }),
471
475
  store.commitRunTerminal({
472
476
  conversationId,
@@ -475,11 +479,7 @@ async function conformanceScenario(store, conversationIds) {
475
479
  ownerId: "conformance-owner",
476
480
  assistant: terminalAssistant,
477
481
  reason: "success",
478
- usage: {
479
- inputTokens: { value: 3000, provenance: "computed" },
480
- outputTokens: { value: 300, provenance: "computed" },
481
- cost: { value: 1.5, currency: "USD", provenance: "computed" }
482
- }
482
+ usage: terminalUsage
483
483
  })
484
484
  ]);
485
485
  const terminalOutcomes = terminalResults.map((result) => result.outcome).sort();
@@ -491,13 +491,16 @@ async function conformanceScenario(store, conversationIds) {
491
491
  throw new Error("Terminal race produced no applied result");
492
492
  }
493
493
  const settledRun = terminalApplied.snapshot.runs.find((run) => run.id === running.id);
494
- if (settledRun?.usage?.cost?.value !== 1.5) {
494
+ if (JSON.stringify(settledRun?.usage) !== JSON.stringify(terminalUsage)) {
495
495
  throw new Error("Terminal commit did not persist the run usage it was given");
496
496
  }
497
497
  const terminalView = await store.loadRun({ conversationId, runId: running.id });
498
498
  if (terminalView?.run.terminalReason !== "success") {
499
499
  throw new Error("loadRun must report the terminal reason a settled run ended with");
500
500
  }
501
+ if (JSON.stringify(terminalView.run.usage) !== JSON.stringify(terminalUsage)) {
502
+ throw new Error("loadRun must return every persisted terminal usage field");
503
+ }
501
504
  if (JSON.stringify(terminalView.assistant) !== JSON.stringify(terminalAssistant)) {
502
505
  throw new Error("loadRun must retain the answer a settled run produced");
503
506
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stitchkit",
3
- "version": "0.68.6",
3
+ "version": "0.68.7",
4
4
  "description": "Contract-first backend framework — one defineContract() into an HTTP API, MCP tools, AI-agent tools and a typed client. Bun and Node.",
5
5
  "keywords": [
6
6
  "bun",