@xandout/libra-harness 0.1.119 → 0.1.121

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.
Files changed (201) hide show
  1. package/dist/agent.d.ts.map +1 -1
  2. package/dist/agent.js +4 -2
  3. package/dist/agent.js.map +1 -1
  4. package/dist/extensions/code-tools/extension.d.ts +4 -0
  5. package/dist/extensions/code-tools/extension.d.ts.map +1 -1
  6. package/dist/extensions/code-tools/extension.js +3 -13
  7. package/dist/extensions/code-tools/extension.js.map +1 -1
  8. package/dist/extensions/code-tools/tools/shell.d.ts +7 -0
  9. package/dist/extensions/code-tools/tools/shell.d.ts.map +1 -1
  10. package/dist/extensions/code-tools/tools/shell.js +9 -2
  11. package/dist/extensions/code-tools/tools/shell.js.map +1 -1
  12. package/dist/extensions/loader.d.ts +10 -10
  13. package/dist/extensions/loader.js +10 -10
  14. package/dist/types.d.ts +6 -0
  15. package/dist/types.d.ts.map +1 -1
  16. package/dist/types.js +13 -0
  17. package/dist/types.js.map +1 -1
  18. package/package.json +2 -65
  19. package/dist/extensions/auto-steer/extension.d.ts +0 -46
  20. package/dist/extensions/auto-steer/extension.d.ts.map +0 -1
  21. package/dist/extensions/auto-steer/extension.js +0 -52
  22. package/dist/extensions/auto-steer/extension.js.map +0 -1
  23. package/dist/extensions/auto-steer/extension.json +0 -7
  24. package/dist/extensions/auto-steer/index.d.ts +0 -3
  25. package/dist/extensions/auto-steer/index.d.ts.map +0 -1
  26. package/dist/extensions/auto-steer/index.js +0 -2
  27. package/dist/extensions/auto-steer/index.js.map +0 -1
  28. package/dist/extensions/emoji/extension.d.ts +0 -20
  29. package/dist/extensions/emoji/extension.d.ts.map +0 -1
  30. package/dist/extensions/emoji/extension.js +0 -22
  31. package/dist/extensions/emoji/extension.js.map +0 -1
  32. package/dist/extensions/emoji/extension.json +0 -7
  33. package/dist/extensions/emoji/index.d.ts +0 -3
  34. package/dist/extensions/emoji/index.d.ts.map +0 -1
  35. package/dist/extensions/emoji/index.js +0 -2
  36. package/dist/extensions/emoji/index.js.map +0 -1
  37. package/dist/extensions/filesystem/extension.d.ts +0 -53
  38. package/dist/extensions/filesystem/extension.d.ts.map +0 -1
  39. package/dist/extensions/filesystem/extension.js +0 -350
  40. package/dist/extensions/filesystem/extension.js.map +0 -1
  41. package/dist/extensions/filesystem/extension.json +0 -6
  42. package/dist/extensions/filesystem/extension.test.d.ts +0 -2
  43. package/dist/extensions/filesystem/extension.test.d.ts.map +0 -1
  44. package/dist/extensions/filesystem/extension.test.js +0 -387
  45. package/dist/extensions/filesystem/extension.test.js.map +0 -1
  46. package/dist/extensions/filesystem/index.d.ts +0 -2
  47. package/dist/extensions/filesystem/index.d.ts.map +0 -1
  48. package/dist/extensions/filesystem/index.js +0 -2
  49. package/dist/extensions/filesystem/index.js.map +0 -1
  50. package/dist/extensions/keyword-extractor/extension.d.ts +0 -53
  51. package/dist/extensions/keyword-extractor/extension.d.ts.map +0 -1
  52. package/dist/extensions/keyword-extractor/extension.js +0 -61
  53. package/dist/extensions/keyword-extractor/extension.js.map +0 -1
  54. package/dist/extensions/keyword-extractor/extension.json +0 -6
  55. package/dist/extensions/keyword-extractor/extension.test.d.ts +0 -2
  56. package/dist/extensions/keyword-extractor/extension.test.d.ts.map +0 -1
  57. package/dist/extensions/keyword-extractor/extension.test.js +0 -105
  58. package/dist/extensions/keyword-extractor/extension.test.js.map +0 -1
  59. package/dist/extensions/keyword-extractor/index.d.ts +0 -5
  60. package/dist/extensions/keyword-extractor/index.d.ts.map +0 -1
  61. package/dist/extensions/keyword-extractor/index.js +0 -3
  62. package/dist/extensions/keyword-extractor/index.js.map +0 -1
  63. package/dist/extensions/keyword-extractor/nlp.d.ts +0 -68
  64. package/dist/extensions/keyword-extractor/nlp.d.ts.map +0 -1
  65. package/dist/extensions/keyword-extractor/nlp.js +0 -156
  66. package/dist/extensions/keyword-extractor/nlp.js.map +0 -1
  67. package/dist/extensions/keyword-extractor/nlp.test.d.ts +0 -2
  68. package/dist/extensions/keyword-extractor/nlp.test.d.ts.map +0 -1
  69. package/dist/extensions/keyword-extractor/nlp.test.js +0 -176
  70. package/dist/extensions/keyword-extractor/nlp.test.js.map +0 -1
  71. package/dist/extensions/logger/extension.d.ts +0 -52
  72. package/dist/extensions/logger/extension.d.ts.map +0 -1
  73. package/dist/extensions/logger/extension.js +0 -68
  74. package/dist/extensions/logger/extension.js.map +0 -1
  75. package/dist/extensions/logger/extension.json +0 -7
  76. package/dist/extensions/logger/index.d.ts +0 -3
  77. package/dist/extensions/logger/index.d.ts.map +0 -1
  78. package/dist/extensions/logger/index.js +0 -2
  79. package/dist/extensions/logger/index.js.map +0 -1
  80. package/dist/extensions/mcp/extension.d.ts +0 -63
  81. package/dist/extensions/mcp/extension.d.ts.map +0 -1
  82. package/dist/extensions/mcp/extension.js +0 -437
  83. package/dist/extensions/mcp/extension.js.map +0 -1
  84. package/dist/extensions/mcp/extension.json +0 -7
  85. package/dist/extensions/mcp/extension.test.d.ts +0 -2
  86. package/dist/extensions/mcp/extension.test.d.ts.map +0 -1
  87. package/dist/extensions/mcp/extension.test.js +0 -286
  88. package/dist/extensions/mcp/extension.test.js.map +0 -1
  89. package/dist/extensions/mcp/index.d.ts +0 -3
  90. package/dist/extensions/mcp/index.d.ts.map +0 -1
  91. package/dist/extensions/mcp/index.js +0 -2
  92. package/dist/extensions/mcp/index.js.map +0 -1
  93. package/dist/extensions/mem-session/extension.d.ts +0 -24
  94. package/dist/extensions/mem-session/extension.d.ts.map +0 -1
  95. package/dist/extensions/mem-session/extension.js +0 -49
  96. package/dist/extensions/mem-session/extension.js.map +0 -1
  97. package/dist/extensions/mem-session/extension.json +0 -6
  98. package/dist/extensions/mem-session/index.d.ts +0 -2
  99. package/dist/extensions/mem-session/index.d.ts.map +0 -1
  100. package/dist/extensions/mem-session/index.js +0 -2
  101. package/dist/extensions/mem-session/index.js.map +0 -1
  102. package/dist/extensions/memory/extension.d.ts +0 -54
  103. package/dist/extensions/memory/extension.d.ts.map +0 -1
  104. package/dist/extensions/memory/extension.js +0 -143
  105. package/dist/extensions/memory/extension.js.map +0 -1
  106. package/dist/extensions/memory/extension.json +0 -7
  107. package/dist/extensions/memory/index.d.ts +0 -4
  108. package/dist/extensions/memory/index.d.ts.map +0 -1
  109. package/dist/extensions/memory/index.js +0 -3
  110. package/dist/extensions/memory/index.js.map +0 -1
  111. package/dist/extensions/memory/llm-extractor.d.ts +0 -42
  112. package/dist/extensions/memory/llm-extractor.d.ts.map +0 -1
  113. package/dist/extensions/memory/llm-extractor.js +0 -86
  114. package/dist/extensions/memory/llm-extractor.js.map +0 -1
  115. package/dist/extensions/memory/types.d.ts +0 -142
  116. package/dist/extensions/memory/types.d.ts.map +0 -1
  117. package/dist/extensions/memory/types.js +0 -2
  118. package/dist/extensions/memory/types.js.map +0 -1
  119. package/dist/extensions/otel/extension.d.ts +0 -57
  120. package/dist/extensions/otel/extension.d.ts.map +0 -1
  121. package/dist/extensions/otel/extension.js +0 -253
  122. package/dist/extensions/otel/extension.js.map +0 -1
  123. package/dist/extensions/otel/extension.json +0 -7
  124. package/dist/extensions/otel/extension.test.d.ts +0 -2
  125. package/dist/extensions/otel/extension.test.d.ts.map +0 -1
  126. package/dist/extensions/otel/extension.test.js +0 -399
  127. package/dist/extensions/otel/extension.test.js.map +0 -1
  128. package/dist/extensions/otel/index.d.ts +0 -4
  129. package/dist/extensions/otel/index.d.ts.map +0 -1
  130. package/dist/extensions/otel/index.js +0 -3
  131. package/dist/extensions/otel/index.js.map +0 -1
  132. package/dist/extensions/otel/jsonl-span-exporter.d.ts +0 -60
  133. package/dist/extensions/otel/jsonl-span-exporter.d.ts.map +0 -1
  134. package/dist/extensions/otel/jsonl-span-exporter.js +0 -134
  135. package/dist/extensions/otel/jsonl-span-exporter.js.map +0 -1
  136. package/dist/extensions/scripts/extension.d.ts +0 -180
  137. package/dist/extensions/scripts/extension.d.ts.map +0 -1
  138. package/dist/extensions/scripts/extension.js +0 -618
  139. package/dist/extensions/scripts/extension.js.map +0 -1
  140. package/dist/extensions/scripts/extension.json +0 -7
  141. package/dist/extensions/scripts/extension.test.d.ts +0 -2
  142. package/dist/extensions/scripts/extension.test.d.ts.map +0 -1
  143. package/dist/extensions/scripts/extension.test.js +0 -552
  144. package/dist/extensions/scripts/extension.test.js.map +0 -1
  145. package/dist/extensions/scripts/index.d.ts +0 -3
  146. package/dist/extensions/scripts/index.d.ts.map +0 -1
  147. package/dist/extensions/scripts/index.js +0 -2
  148. package/dist/extensions/scripts/index.js.map +0 -1
  149. package/dist/extensions/structured-output/extension.d.ts +0 -9
  150. package/dist/extensions/structured-output/extension.d.ts.map +0 -1
  151. package/dist/extensions/structured-output/extension.js +0 -93
  152. package/dist/extensions/structured-output/extension.js.map +0 -1
  153. package/dist/extensions/structured-output/extension.json +0 -7
  154. package/dist/extensions/structured-output/index.d.ts +0 -3
  155. package/dist/extensions/structured-output/index.d.ts.map +0 -1
  156. package/dist/extensions/structured-output/index.js +0 -2
  157. package/dist/extensions/structured-output/index.js.map +0 -1
  158. package/dist/extensions/timestamp/extension.d.ts +0 -11
  159. package/dist/extensions/timestamp/extension.d.ts.map +0 -1
  160. package/dist/extensions/timestamp/extension.js +0 -21
  161. package/dist/extensions/timestamp/extension.js.map +0 -1
  162. package/dist/extensions/timestamp/extension.json +0 -6
  163. package/dist/extensions/timestamp/index.d.ts +0 -2
  164. package/dist/extensions/timestamp/index.d.ts.map +0 -1
  165. package/dist/extensions/timestamp/index.js +0 -2
  166. package/dist/extensions/timestamp/index.js.map +0 -1
  167. package/dist/extensions/token-stats/extension.d.ts +0 -50
  168. package/dist/extensions/token-stats/extension.d.ts.map +0 -1
  169. package/dist/extensions/token-stats/extension.js +0 -99
  170. package/dist/extensions/token-stats/extension.js.map +0 -1
  171. package/dist/extensions/token-stats/extension.json +0 -7
  172. package/dist/extensions/token-stats/extension.test.d.ts +0 -2
  173. package/dist/extensions/token-stats/extension.test.d.ts.map +0 -1
  174. package/dist/extensions/token-stats/extension.test.js +0 -197
  175. package/dist/extensions/token-stats/extension.test.js.map +0 -1
  176. package/dist/extensions/token-stats/index.d.ts +0 -3
  177. package/dist/extensions/token-stats/index.d.ts.map +0 -1
  178. package/dist/extensions/token-stats/index.js +0 -2
  179. package/dist/extensions/token-stats/index.js.map +0 -1
  180. package/dist/extensions/tool-buffer/extension.d.ts +0 -89
  181. package/dist/extensions/tool-buffer/extension.d.ts.map +0 -1
  182. package/dist/extensions/tool-buffer/extension.js +0 -182
  183. package/dist/extensions/tool-buffer/extension.js.map +0 -1
  184. package/dist/extensions/tool-buffer/extension.json +0 -7
  185. package/dist/extensions/tool-buffer/extension.test.d.ts +0 -2
  186. package/dist/extensions/tool-buffer/extension.test.d.ts.map +0 -1
  187. package/dist/extensions/tool-buffer/extension.test.js +0 -549
  188. package/dist/extensions/tool-buffer/extension.test.js.map +0 -1
  189. package/dist/extensions/tool-buffer/index.d.ts +0 -3
  190. package/dist/extensions/tool-buffer/index.d.ts.map +0 -1
  191. package/dist/extensions/tool-buffer/index.js +0 -2
  192. package/dist/extensions/tool-buffer/index.js.map +0 -1
  193. package/dist/extensions/weather-tool/extension.d.ts +0 -22
  194. package/dist/extensions/weather-tool/extension.d.ts.map +0 -1
  195. package/dist/extensions/weather-tool/extension.js +0 -33
  196. package/dist/extensions/weather-tool/extension.js.map +0 -1
  197. package/dist/extensions/weather-tool/extension.json +0 -7
  198. package/dist/extensions/weather-tool/index.d.ts +0 -3
  199. package/dist/extensions/weather-tool/index.d.ts.map +0 -1
  200. package/dist/extensions/weather-tool/index.js +0 -2
  201. package/dist/extensions/weather-tool/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../src/extensions/structured-output/extension.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,sBAAsB;IACrC,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,UAAU,+BAA+B,CACrD,MAAM,EAAE,sBAAsB,GAC7B,SAAS,GAAG,SAAS,CAoGvB"}
@@ -1,93 +0,0 @@
1
- import { parsePartialJson } from 'ai';
2
- export default function createStructuredOutputExtension(config) {
3
- if (!config?.schema) {
4
- console.log('[structured-output] no schema in config — skipping');
5
- return undefined;
6
- }
7
- const { schema } = config;
8
- const metadataKey = config.metadataKey ?? 'structured';
9
- return {
10
- name: 'structured-output',
11
- priority: 50,
12
- install(agent) {
13
- agent.hook('beforeResponse', 'structured-output', async (ctx) => {
14
- if (!ctx.turn.response)
15
- return;
16
- // parsePartialJson handles code-fence stripping, partial JSON repair,
17
- // and malformed input — replacing both the fence regex and JSON.parse try/catch.
18
- const result = await parsePartialJson(ctx.turn.response.message);
19
- if (result.state !== 'successful-parse' && result.state !== 'repaired-parse') {
20
- ctx.turn.response = {
21
- ...ctx.turn.response,
22
- message: JSON.stringify({
23
- error: 'Response is not valid JSON',
24
- expectedSchema: schema,
25
- rawResponse: ctx.turn.response.message.slice(0, 500),
26
- }),
27
- };
28
- return;
29
- }
30
- let parsed = result.value;
31
- // Validate against the schema's required fields.
32
- const required = schema.required ?? [];
33
- const missing = required.filter((field) => {
34
- const value = parsed[field];
35
- return value === undefined || value === null;
36
- });
37
- if (missing.length > 0) {
38
- ctx.turn.response = {
39
- ...ctx.turn.response,
40
- message: JSON.stringify({
41
- error: `Missing required fields: ${missing.join(', ')}`,
42
- expectedSchema: schema,
43
- received: Object.keys(parsed),
44
- }),
45
- };
46
- return;
47
- }
48
- // Type-check each field against the schema.
49
- const properties = schema.properties ?? {};
50
- const typeErrors = [];
51
- for (const [field, spec] of Object.entries(properties)) {
52
- const value = parsed[field];
53
- if (value === undefined)
54
- continue;
55
- const expectedType = spec.type;
56
- let actualType;
57
- if (Array.isArray(value)) {
58
- actualType = 'array';
59
- }
60
- else if (typeof value === 'number' && Number.isInteger(value)) {
61
- actualType = 'number';
62
- }
63
- else {
64
- actualType = typeof value;
65
- }
66
- if (actualType !== expectedType) {
67
- typeErrors.push(`Field "${field}" expected ${expectedType}, got ${actualType}`);
68
- }
69
- }
70
- if (typeErrors.length > 0) {
71
- ctx.turn.response = {
72
- ...ctx.turn.response,
73
- message: JSON.stringify({
74
- error: 'Type validation failed',
75
- errors: typeErrors,
76
- expectedSchema: schema,
77
- }),
78
- };
79
- return;
80
- }
81
- // Valid — store the parsed object in metadata and clean up the response.
82
- ctx.turn.metadata[metadataKey] = parsed;
83
- // Keep the response as the raw JSON string so callers can parse it.
84
- // Or optionally replace with a formatted version.
85
- ctx.turn.response = {
86
- ...ctx.turn.response,
87
- message: JSON.stringify(parsed, null, 2),
88
- };
89
- });
90
- },
91
- };
92
- }
93
- //# sourceMappingURL=extension.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/extensions/structured-output/extension.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- {
2
- "name": "structured-output",
3
- "description": "Validates LLM output against a JSON schema via beforeResponse hook. Accepts a schema, optional metadataKey, and stripCodeFences via config.",
4
- "enabled": true,
5
- "priority": 50,
6
- "configKeys": ["schema", "metadataKey", "stripCodeFences"]
7
- }
@@ -1,3 +0,0 @@
1
- export { default as createStructuredOutputExtension } from './extension.js';
2
- export type { StructuredOutputConfig } from './extension.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/structured-output/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,+BAA+B,EAAE,MAAM,gBAAgB,CAAC;AAC5E,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,2 +0,0 @@
1
- export { default as createStructuredOutputExtension } from './extension.js';
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/structured-output/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,+BAA+B,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,11 +0,0 @@
1
- import type { Extension } from '../../extension.js';
2
- /**
3
- * timestamp extension — records start/finish ISO timestamps in turn
4
- * metadata for observability.
5
- *
6
- * Sets `metadata.startedAt` in `beforeTurn` and `metadata.finishedAt`
7
- * in `afterTurn`. No config needed — self-contained.
8
- */
9
- declare const timestampExtension: Extension;
10
- export default timestampExtension;
11
- //# sourceMappingURL=extension.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../src/extensions/timestamp/extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;;;GAMG;AACH,QAAA,MAAM,kBAAkB,EAAE,SAWzB,CAAC;eAEa,kBAAkB"}
@@ -1,21 +0,0 @@
1
- /**
2
- * timestamp extension — records start/finish ISO timestamps in turn
3
- * metadata for observability.
4
- *
5
- * Sets `metadata.startedAt` in `beforeTurn` and `metadata.finishedAt`
6
- * in `afterTurn`. No config needed — self-contained.
7
- */
8
- const timestampExtension = {
9
- name: 'timestamp',
10
- priority: 0,
11
- install(agent) {
12
- agent.hook('beforeTurn', 'timestamp', async (ctx) => {
13
- ctx.turn.metadata.startedAt = new Date().toISOString();
14
- });
15
- agent.hook('afterTurn', 'timestamp', async (ctx) => {
16
- ctx.turn.metadata.finishedAt = new Date().toISOString();
17
- });
18
- },
19
- };
20
- export default timestampExtension;
21
- //# sourceMappingURL=extension.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/extensions/timestamp/extension.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAc;IACpC,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,CAAC;IACX,OAAO,CAAC,KAAK;QACX,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAClD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACzD,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACjD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -1,6 +0,0 @@
1
- {
2
- "name": "timestamp",
3
- "description": "Records start/finish ISO timestamps in turn metadata for observability.",
4
- "enabled": true,
5
- "priority": 0
6
- }
@@ -1,2 +0,0 @@
1
- export { default as timestampExtension } from './extension.js';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/timestamp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,2 +0,0 @@
1
- export { default as timestampExtension } from './extension.js';
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/timestamp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,50 +0,0 @@
1
- import type { Extension } from '../../extension.js';
2
- /**
3
- * Config for the token-stats extension.
4
- */
5
- export interface TokenStatsConfig {
6
- /**
7
- * The model's maximum context window in tokens. Used to compute the
8
- * context window usage percentage. If omitted, the percentage is
9
- * not shown. Default: not set.
10
- *
11
- * For DeepSeek v4: 131072 (128K). Check your provider's docs.
12
- */
13
- contextWindow?: number;
14
- /**
15
- * Whether to use Slack italic formatting (`_text_`) for the stats
16
- * line. Default: `true`.
17
- */
18
- slackItalics?: boolean;
19
- /**
20
- * Label for the stats line. Default: `📊`.
21
- */
22
- label?: string;
23
- }
24
- /**
25
- * Token-stats extension — appends a stats line to the agent's final
26
- * response message.
27
- *
28
- * Accumulates token usage across all LLM calls in a turn (via
29
- * `afterLLM`), then appends a summary to `turn.response.message` in
30
- * `beforeResponse`. The stats include:
31
- *
32
- * - Total prompt + completion tokens
33
- * - Cached and reasoning tokens (if reported)
34
- * - Number of LLM calls / iterations
35
- * - Context window usage percentage (if `contextWindow` is configured)
36
- *
37
- * ## Example output (Slack italics)
38
- *
39
- * ```
40
- * _📊 105,445 prompt + 2,324 completion · 1,503 reasoning · 3 LLM calls · 82% of 128K context_
41
- * ```
42
- *
43
- * ## Priority
44
- *
45
- * Uses priority -100 (runs late, after most extensions) so it sees
46
- * the final response after other extensions have potentially modified
47
- * it. The `afterLLM` accumulator runs at the same priority.
48
- */
49
- export default function createTokenStatsExtension(config?: TokenStatsConfig): Extension;
50
- //# sourceMappingURL=extension.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../src/extensions/token-stats/extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAcD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAC/C,MAAM,CAAC,EAAE,gBAAgB,GACxB,SAAS,CAsEX"}
@@ -1,99 +0,0 @@
1
- // Metadata key for accumulated usage across LLM calls in a turn.
2
- const USAGE_KEY = '_tokenStats_usage';
3
- /**
4
- * Token-stats extension — appends a stats line to the agent's final
5
- * response message.
6
- *
7
- * Accumulates token usage across all LLM calls in a turn (via
8
- * `afterLLM`), then appends a summary to `turn.response.message` in
9
- * `beforeResponse`. The stats include:
10
- *
11
- * - Total prompt + completion tokens
12
- * - Cached and reasoning tokens (if reported)
13
- * - Number of LLM calls / iterations
14
- * - Context window usage percentage (if `contextWindow` is configured)
15
- *
16
- * ## Example output (Slack italics)
17
- *
18
- * ```
19
- * _📊 105,445 prompt + 2,324 completion · 1,503 reasoning · 3 LLM calls · 82% of 128K context_
20
- * ```
21
- *
22
- * ## Priority
23
- *
24
- * Uses priority -100 (runs late, after most extensions) so it sees
25
- * the final response after other extensions have potentially modified
26
- * it. The `afterLLM` accumulator runs at the same priority.
27
- */
28
- export default function createTokenStatsExtension(config) {
29
- const contextWindow = config?.contextWindow;
30
- const slackItalics = config?.slackItalics ?? true;
31
- const label = config?.label ?? '📊';
32
- return {
33
- name: 'token-stats',
34
- priority: -100,
35
- install(agent) {
36
- // ── afterLLM: accumulate usage ────────────────────────────────
37
- agent.hook('afterLLM', 'token-stats', async (ctx) => {
38
- const usage = ctx.modelResponse?.usage;
39
- if (!usage)
40
- return;
41
- const meta = ctx.turn.metadata;
42
- const acc = meta[USAGE_KEY] ?? {
43
- promptTokens: 0,
44
- completionTokens: 0,
45
- cachedPromptTokens: 0,
46
- cacheWriteTokens: 0,
47
- reasoningTokens: 0,
48
- calls: 0,
49
- };
50
- acc.promptTokens += usage.promptTokens ?? 0;
51
- acc.completionTokens += usage.completionTokens ?? 0;
52
- acc.cachedPromptTokens += usage.cachedPromptTokens ?? 0;
53
- acc.cacheWriteTokens += usage.cacheWriteTokens ?? 0;
54
- acc.reasoningTokens += usage.reasoningTokens ?? 0;
55
- acc.calls += 1;
56
- meta[USAGE_KEY] = acc;
57
- });
58
- // ── beforeResponse: append stats to the final message ─────────
59
- agent.hook('beforeResponse', 'token-stats', async (ctx) => {
60
- const response = ctx.turn.response;
61
- if (!response)
62
- return;
63
- const acc = ctx.turn.metadata[USAGE_KEY];
64
- if (!acc || acc.calls === 0)
65
- return;
66
- const parts = [
67
- `${fmt(acc.promptTokens)} prompt + ${fmt(acc.completionTokens)} completion`,
68
- ];
69
- if (acc.cachedPromptTokens > 0 || acc.cacheWriteTokens > 0) {
70
- const cacheParts = [];
71
- if (acc.cachedPromptTokens > 0)
72
- cacheParts.push(`${fmt(acc.cachedPromptTokens)} read`);
73
- if (acc.cacheWriteTokens > 0)
74
- cacheParts.push(`${fmt(acc.cacheWriteTokens)} written`);
75
- parts.push(`cache: ${cacheParts.join(', ')}`);
76
- }
77
- if (acc.reasoningTokens > 0) {
78
- parts.push(`${fmt(acc.reasoningTokens)} reasoning`);
79
- }
80
- parts.push(`${acc.calls} LLM call${acc.calls > 1 ? 's' : ''}`);
81
- if (contextWindow) {
82
- const pct = ((acc.promptTokens / contextWindow) * 100).toFixed(0);
83
- parts.push(`${pct}% of ${fmt(contextWindow)} context`);
84
- }
85
- const line = parts.join(' · ');
86
- const formatted = slackItalics ? `_${label} ${line}_` : `${label} ${line}`;
87
- response.message = `${response.message}\n\n${formatted}`;
88
- });
89
- },
90
- };
91
- }
92
- function fmt(n) {
93
- if (n >= 1_000_000)
94
- return `${(n / 1_000_000).toFixed(1)}M`;
95
- if (n >= 1_000)
96
- return `${(n / 1_000).toFixed(1)}K`;
97
- return String(n);
98
- }
99
- //# sourceMappingURL=extension.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/extensions/token-stats/extension.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- {
2
- "name": "token-stats",
3
- "description": "Appends token usage and context window stats to the agent's final response message. Accumulates usage across all LLM calls in a turn.",
4
- "enabled": true,
5
- "priority": -100,
6
- "configKeys": ["contextWindow", "slackItalics", "label"]
7
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=extension.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extension.test.d.ts","sourceRoot":"","sources":["../../../src/extensions/token-stats/extension.test.ts"],"names":[],"mappings":""}
@@ -1,197 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { Agent } from '../../agent.js';
3
- import { createTokenStatsExtension } from './index.js';
4
- // ── Mock model ─────────────────────────────────────────────────────
5
- function mockModel(responses) {
6
- let callCount = 0;
7
- return {
8
- async generate(req) {
9
- const resp = responses[Math.min(callCount, responses.length - 1)];
10
- callCount++;
11
- if (typeof resp.message === 'function') {
12
- return { ...resp, message: resp.message(req) };
13
- }
14
- return resp;
15
- },
16
- };
17
- }
18
- // ── Tests ──────────────────────────────────────────────────────────
19
- describe('token-stats extension', () => {
20
- it('appends stats to the final response', async () => {
21
- const model = mockModel([{
22
- message: { role: 'assistant', content: 'Hello!' },
23
- finishReason: 'stop',
24
- usage: { promptTokens: 1000, completionTokens: 50 },
25
- }]);
26
- const ext = createTokenStatsExtension({ contextWindow: 128000 });
27
- const agent = new Agent({ model: model });
28
- agent.use(ext);
29
- const result = await agent.run({ message: 'hi' });
30
- expect(result.message).toContain('Hello!');
31
- expect(result.message).toContain('📊');
32
- expect(result.message).toContain('1.0K prompt + 50 completion');
33
- expect(result.message).toContain('1 LLM call');
34
- expect(result.message).toContain('1% of 128.0K context');
35
- });
36
- it('uses Slack italics by default', async () => {
37
- const model = mockModel([{
38
- message: { role: 'assistant', content: 'Hi' },
39
- finishReason: 'stop',
40
- usage: { promptTokens: 100, completionTokens: 10 },
41
- }]);
42
- const ext = createTokenStatsExtension({ contextWindow: 128000 });
43
- const agent = new Agent({ model: model });
44
- agent.use(ext);
45
- const result = await agent.run({ message: 'hi' });
46
- // Should be wrapped in _..._ for Slack italics.
47
- expect(result.message).toMatch(/_📊.*_/);
48
- });
49
- it('disables italics when configured', async () => {
50
- const model = mockModel([{
51
- message: { role: 'assistant', content: 'Hi' },
52
- finishReason: 'stop',
53
- usage: { promptTokens: 100, completionTokens: 10 },
54
- }]);
55
- const ext = createTokenStatsExtension({ contextWindow: 128000, slackItalics: false });
56
- const agent = new Agent({ model: model });
57
- agent.use(ext);
58
- const result = await agent.run({ message: 'hi' });
59
- expect(result.message).not.toMatch(/_📊.*_/);
60
- expect(result.message).toContain('📊');
61
- });
62
- it('omits context percentage when contextWindow not set', async () => {
63
- const model = mockModel([{
64
- message: { role: 'assistant', content: 'Hi' },
65
- finishReason: 'stop',
66
- usage: { promptTokens: 100, completionTokens: 10 },
67
- }]);
68
- const ext = createTokenStatsExtension();
69
- const agent = new Agent({ model: model });
70
- agent.use(ext);
71
- const result = await agent.run({ message: 'hi' });
72
- expect(result.message).toContain('100 prompt + 10 completion');
73
- expect(result.message).not.toContain('context');
74
- });
75
- it('accumulates usage across multiple LLM calls', async () => {
76
- const tool = {
77
- name: 'echo',
78
- description: 'Echo',
79
- parameters: { type: 'object', properties: {} },
80
- async execute() {
81
- return { toolCallId: '', content: 'echoed' };
82
- },
83
- };
84
- const model = mockModel([
85
- {
86
- message: {
87
- role: 'assistant',
88
- content: '',
89
- toolCalls: [{ id: 'tc1', name: 'echo', arguments: '{}' }],
90
- },
91
- finishReason: 'tool_calls',
92
- usage: { promptTokens: 500, completionTokens: 20 },
93
- },
94
- {
95
- message: { role: 'assistant', content: 'Done' },
96
- finishReason: 'stop',
97
- usage: { promptTokens: 800, completionTokens: 30 },
98
- },
99
- ]);
100
- const ext = createTokenStatsExtension({ contextWindow: 128000 });
101
- const agent = new Agent({ model: model, tools: [tool] });
102
- agent.use(ext);
103
- const result = await agent.run({ message: 'call echo' });
104
- // Should show accumulated totals: 500+800=1300 prompt, 20+30=50 completion.
105
- expect(result.message).toContain('1.3K prompt + 50 completion');
106
- expect(result.message).toContain('2 LLM calls');
107
- });
108
- it('shows cache read, cache write, and reasoning tokens when present', async () => {
109
- const model = mockModel([{
110
- message: { role: 'assistant', content: 'Hi' },
111
- finishReason: 'stop',
112
- usage: {
113
- promptTokens: 10000,
114
- completionTokens: 100,
115
- cachedPromptTokens: 5000,
116
- cacheWriteTokens: 3000,
117
- reasoningTokens: 200,
118
- },
119
- }]);
120
- const ext = createTokenStatsExtension({ contextWindow: 128000 });
121
- const agent = new Agent({ model: model });
122
- agent.use(ext);
123
- const result = await agent.run({ message: 'hi' });
124
- expect(result.message).toContain('cache:');
125
- expect(result.message).toContain('5.0K read');
126
- expect(result.message).toContain('3.0K written');
127
- expect(result.message).toContain('200 reasoning');
128
- });
129
- it('shows only cache read when no cache write', async () => {
130
- const model = mockModel([{
131
- message: { role: 'assistant', content: 'Hi' },
132
- finishReason: 'stop',
133
- usage: {
134
- promptTokens: 10000,
135
- completionTokens: 100,
136
- cachedPromptTokens: 5000,
137
- },
138
- }]);
139
- const ext = createTokenStatsExtension({ contextWindow: 128000 });
140
- const agent = new Agent({ model: model });
141
- agent.use(ext);
142
- const result = await agent.run({ message: 'hi' });
143
- expect(result.message).toContain('cache:');
144
- expect(result.message).toContain('5.0K read');
145
- expect(result.message).not.toContain('written');
146
- });
147
- it('omits cache/reasoning when not reported', async () => {
148
- const model = mockModel([{
149
- message: { role: 'assistant', content: 'Hi' },
150
- finishReason: 'stop',
151
- usage: { promptTokens: 100, completionTokens: 10 },
152
- }]);
153
- const ext = createTokenStatsExtension({ contextWindow: 128000 });
154
- const agent = new Agent({ model: model });
155
- agent.use(ext);
156
- const result = await agent.run({ message: 'hi' });
157
- expect(result.message).not.toContain('cached');
158
- expect(result.message).not.toContain('reasoning');
159
- });
160
- it('does not append stats when no usage is reported', async () => {
161
- const model = mockModel([{
162
- message: { role: 'assistant', content: 'Hi' },
163
- finishReason: 'stop',
164
- }]);
165
- const ext = createTokenStatsExtension({ contextWindow: 128000 });
166
- const agent = new Agent({ model: model });
167
- agent.use(ext);
168
- const result = await agent.run({ message: 'hi' });
169
- expect(result.message).toBe('Hi');
170
- });
171
- it('supports custom label', async () => {
172
- const model = mockModel([{
173
- message: { role: 'assistant', content: 'Hi' },
174
- finishReason: 'stop',
175
- usage: { promptTokens: 100, completionTokens: 10 },
176
- }]);
177
- const ext = createTokenStatsExtension({ contextWindow: 128000, label: 'Tokens:' });
178
- const agent = new Agent({ model: model });
179
- agent.use(ext);
180
- const result = await agent.run({ message: 'hi' });
181
- expect(result.message).toContain('Tokens:');
182
- expect(result.message).not.toContain('📊');
183
- });
184
- it('computes context percentage correctly', async () => {
185
- const model = mockModel([{
186
- message: { role: 'assistant', content: 'Hi' },
187
- finishReason: 'stop',
188
- usage: { promptTokens: 64000, completionTokens: 100 },
189
- }]);
190
- const ext = createTokenStatsExtension({ contextWindow: 128000 });
191
- const agent = new Agent({ model: model });
192
- agent.use(ext);
193
- const result = await agent.run({ message: 'hi' });
194
- expect(result.message).toContain('50% of 128.0K context');
195
- });
196
- });
197
- //# sourceMappingURL=extension.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extension.test.js","sourceRoot":"","sources":["../../../src/extensions/token-stats/extension.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export { default as createTokenStatsExtension } from './extension.js';
2
- export type { TokenStatsConfig } from './extension.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/token-stats/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACtE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,2 +0,0 @@
1
- export { default as createTokenStatsExtension } from './extension.js';
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/token-stats/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,gBAAgB,CAAC"}