audrey 0.17.0 → 0.20.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.
Files changed (191) hide show
  1. package/README.md +129 -374
  2. package/dist/mcp-server/config.d.ts +20 -0
  3. package/dist/mcp-server/config.d.ts.map +1 -0
  4. package/dist/mcp-server/config.js +125 -0
  5. package/dist/mcp-server/config.js.map +1 -0
  6. package/dist/mcp-server/index.d.ts +100 -0
  7. package/dist/mcp-server/index.d.ts.map +1 -0
  8. package/dist/mcp-server/index.js +1113 -0
  9. package/dist/mcp-server/index.js.map +1 -0
  10. package/dist/src/adaptive.d.ts +7 -0
  11. package/dist/src/adaptive.d.ts.map +1 -0
  12. package/dist/src/adaptive.js +49 -0
  13. package/dist/src/adaptive.js.map +1 -0
  14. package/dist/src/affect.d.ts +19 -0
  15. package/dist/src/affect.d.ts.map +1 -0
  16. package/dist/src/affect.js +72 -0
  17. package/dist/src/affect.js.map +1 -0
  18. package/dist/src/audrey.d.ts +140 -0
  19. package/dist/src/audrey.d.ts.map +1 -0
  20. package/dist/src/audrey.js +564 -0
  21. package/dist/src/audrey.js.map +1 -0
  22. package/dist/src/capsule.d.ts +68 -0
  23. package/dist/src/capsule.d.ts.map +1 -0
  24. package/dist/src/capsule.js +311 -0
  25. package/dist/src/capsule.js.map +1 -0
  26. package/dist/src/causal.d.ts +28 -0
  27. package/dist/src/causal.d.ts.map +1 -0
  28. package/dist/src/causal.js +65 -0
  29. package/dist/src/causal.js.map +1 -0
  30. package/dist/src/confidence.d.ts +12 -0
  31. package/dist/src/confidence.d.ts.map +1 -0
  32. package/dist/src/confidence.js +63 -0
  33. package/dist/src/confidence.js.map +1 -0
  34. package/dist/src/consolidate.d.ts +8 -0
  35. package/dist/src/consolidate.d.ts.map +1 -0
  36. package/dist/src/consolidate.js +218 -0
  37. package/dist/src/consolidate.js.map +1 -0
  38. package/dist/src/context.d.ts +3 -0
  39. package/dist/src/context.d.ts.map +1 -0
  40. package/dist/src/context.js +19 -0
  41. package/dist/src/context.js.map +1 -0
  42. package/dist/src/db.d.ts +12 -0
  43. package/dist/src/db.d.ts.map +1 -0
  44. package/dist/src/db.js +380 -0
  45. package/dist/src/db.js.map +1 -0
  46. package/dist/src/decay.d.ts +7 -0
  47. package/dist/src/decay.d.ts.map +1 -0
  48. package/dist/src/decay.js +68 -0
  49. package/dist/src/decay.js.map +1 -0
  50. package/dist/src/embedding.d.ts +57 -0
  51. package/dist/src/embedding.d.ts.map +1 -0
  52. package/dist/src/embedding.js +254 -0
  53. package/dist/src/embedding.js.map +1 -0
  54. package/dist/src/encode.d.ts +15 -0
  55. package/dist/src/encode.d.ts.map +1 -0
  56. package/dist/src/encode.js +36 -0
  57. package/dist/src/encode.js.map +1 -0
  58. package/dist/src/events.d.ts +69 -0
  59. package/dist/src/events.d.ts.map +1 -0
  60. package/dist/src/events.js +149 -0
  61. package/dist/src/events.js.map +1 -0
  62. package/dist/src/export.d.ts +3 -0
  63. package/dist/src/export.d.ts.map +1 -0
  64. package/dist/src/export.js +46 -0
  65. package/dist/src/export.js.map +1 -0
  66. package/dist/src/forget.d.ts +11 -0
  67. package/dist/src/forget.d.ts.map +1 -0
  68. package/dist/src/forget.js +105 -0
  69. package/dist/src/forget.js.map +1 -0
  70. package/dist/src/fts.d.ts +34 -0
  71. package/dist/src/fts.d.ts.map +1 -0
  72. package/dist/src/fts.js +117 -0
  73. package/dist/src/fts.js.map +1 -0
  74. package/dist/src/hybrid-recall.d.ts +37 -0
  75. package/dist/src/hybrid-recall.d.ts.map +1 -0
  76. package/dist/src/hybrid-recall.js +213 -0
  77. package/dist/src/hybrid-recall.js.map +1 -0
  78. package/dist/src/import.d.ts +4 -0
  79. package/dist/src/import.d.ts.map +1 -0
  80. package/dist/src/import.js +127 -0
  81. package/dist/src/import.js.map +1 -0
  82. package/dist/src/index.d.ts +22 -0
  83. package/dist/src/index.d.ts.map +1 -0
  84. package/{src → dist/src}/index.js +5 -13
  85. package/dist/src/index.js.map +1 -0
  86. package/dist/src/interference.d.ts +13 -0
  87. package/dist/src/interference.d.ts.map +1 -0
  88. package/dist/src/interference.js +45 -0
  89. package/dist/src/interference.js.map +1 -0
  90. package/dist/src/introspect.d.ts +4 -0
  91. package/dist/src/introspect.d.ts.map +1 -0
  92. package/dist/src/introspect.js +40 -0
  93. package/dist/src/introspect.js.map +1 -0
  94. package/dist/src/llm.d.ts +38 -0
  95. package/dist/src/llm.d.ts.map +1 -0
  96. package/dist/src/llm.js +167 -0
  97. package/dist/src/llm.js.map +1 -0
  98. package/dist/src/migrate.d.ts +6 -0
  99. package/dist/src/migrate.d.ts.map +1 -0
  100. package/dist/src/migrate.js +51 -0
  101. package/dist/src/migrate.js.map +1 -0
  102. package/dist/src/promote.d.ts +40 -0
  103. package/dist/src/promote.d.ts.map +1 -0
  104. package/dist/src/promote.js +200 -0
  105. package/dist/src/promote.js.map +1 -0
  106. package/dist/src/prompts.d.ts +16 -0
  107. package/dist/src/prompts.d.ts.map +1 -0
  108. package/{src → dist/src}/prompts.js +172 -203
  109. package/dist/src/prompts.js.map +1 -0
  110. package/dist/src/recall.d.ts +9 -0
  111. package/dist/src/recall.d.ts.map +1 -0
  112. package/dist/src/recall.js +432 -0
  113. package/dist/src/recall.js.map +1 -0
  114. package/dist/src/redact.d.ts +27 -0
  115. package/dist/src/redact.d.ts.map +1 -0
  116. package/dist/src/redact.js +228 -0
  117. package/dist/src/redact.js.map +1 -0
  118. package/dist/src/rollback.d.ts +8 -0
  119. package/dist/src/rollback.d.ts.map +1 -0
  120. package/dist/src/rollback.js +33 -0
  121. package/dist/src/rollback.js.map +1 -0
  122. package/dist/src/routes.d.ts +7 -0
  123. package/dist/src/routes.d.ts.map +1 -0
  124. package/dist/src/routes.js +226 -0
  125. package/dist/src/routes.js.map +1 -0
  126. package/dist/src/rules-compiler.d.ts +20 -0
  127. package/dist/src/rules-compiler.d.ts.map +1 -0
  128. package/dist/src/rules-compiler.js +143 -0
  129. package/dist/src/rules-compiler.js.map +1 -0
  130. package/dist/src/server.d.ts +12 -0
  131. package/dist/src/server.d.ts.map +1 -0
  132. package/dist/src/server.js +22 -0
  133. package/dist/src/server.js.map +1 -0
  134. package/dist/src/tool-trace.d.ts +37 -0
  135. package/dist/src/tool-trace.d.ts.map +1 -0
  136. package/dist/src/tool-trace.js +142 -0
  137. package/dist/src/tool-trace.js.map +1 -0
  138. package/dist/src/types.d.ts +446 -0
  139. package/dist/src/types.d.ts.map +1 -0
  140. package/dist/src/types.js +6 -0
  141. package/dist/src/types.js.map +1 -0
  142. package/dist/src/ulid.d.ts +3 -0
  143. package/dist/src/ulid.d.ts.map +1 -0
  144. package/dist/src/ulid.js +11 -0
  145. package/dist/src/ulid.js.map +1 -0
  146. package/dist/src/utils.d.ts +10 -0
  147. package/dist/src/utils.d.ts.map +1 -0
  148. package/dist/src/utils.js +41 -0
  149. package/dist/src/utils.js.map +1 -0
  150. package/dist/src/validate.d.ts +22 -0
  151. package/dist/src/validate.d.ts.map +1 -0
  152. package/dist/src/validate.js +109 -0
  153. package/dist/src/validate.js.map +1 -0
  154. package/docs/production-readiness.md +28 -0
  155. package/examples/fintech-ops-demo.js +1 -1
  156. package/examples/healthcare-ops-demo.js +1 -1
  157. package/examples/stripe-demo.js +1 -1
  158. package/package.json +34 -13
  159. package/benchmarks/baselines.js +0 -169
  160. package/benchmarks/cases.js +0 -421
  161. package/benchmarks/reference-results.js +0 -70
  162. package/benchmarks/report.js +0 -255
  163. package/benchmarks/run.js +0 -514
  164. package/mcp-server/config.js +0 -133
  165. package/mcp-server/index.js +0 -1265
  166. package/mcp-server/serve.js +0 -482
  167. package/src/adaptive.js +0 -53
  168. package/src/affect.js +0 -64
  169. package/src/audrey.js +0 -642
  170. package/src/causal.js +0 -95
  171. package/src/confidence.js +0 -120
  172. package/src/consolidate.js +0 -281
  173. package/src/context.js +0 -15
  174. package/src/db.js +0 -391
  175. package/src/decay.js +0 -84
  176. package/src/embedding.js +0 -260
  177. package/src/encode.js +0 -69
  178. package/src/export.js +0 -67
  179. package/src/forget.js +0 -111
  180. package/src/fts.js +0 -134
  181. package/src/import.js +0 -273
  182. package/src/interference.js +0 -51
  183. package/src/introspect.js +0 -48
  184. package/src/llm.js +0 -249
  185. package/src/migrate.js +0 -58
  186. package/src/recall.js +0 -573
  187. package/src/rollback.js +0 -42
  188. package/src/ulid.js +0 -18
  189. package/src/utils.js +0 -63
  190. package/src/validate.js +0 -172
  191. package/types/index.d.ts +0 -434
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Rules compiler — turn PromotionCandidates into reviewable Markdown files.
3
+ *
4
+ * Each rule gets its own file under `.claude/rules/<slug>.md` with YAML
5
+ * front matter that records the source memory ids, confidence, evidence
6
+ * count, and promotion timestamp. That front matter is what makes the rule
7
+ * traceable: a later audit or revert can map the file back to the exact
8
+ * memories that produced it.
9
+ */
10
+ const STOP_WORDS = new Set(['the', 'a', 'an', 'is', 'of', 'and', 'or', 'to', 'for', 'with', 'on', 'at', 'by', 'in', 'as']);
11
+ function titleFor(candidate) {
12
+ const words = candidate.content.replace(/\s+/g, ' ').trim().split(' ');
13
+ const leading = words.slice(0, 12).join(' ');
14
+ const trimmed = leading.replace(/[.!?,;:]+$/, '');
15
+ return trimmed.length > 0 ? trimmed : `Rule ${candidate.candidate_id}`;
16
+ }
17
+ function slugifyTitle(title) {
18
+ const lowered = title.toLowerCase();
19
+ const words = lowered.split(/[^a-z0-9]+/).filter(w => w && !STOP_WORDS.has(w));
20
+ const slug = words.slice(0, 6).join('-');
21
+ return slug.length > 0 ? slug : 'rule';
22
+ }
23
+ function renderFrontmatter(meta) {
24
+ const lines = ['---'];
25
+ for (const [key, value] of Object.entries(meta)) {
26
+ lines.push(renderFrontmatterLine(key, value, 0));
27
+ }
28
+ lines.push('---');
29
+ return lines.join('\n');
30
+ }
31
+ function renderFrontmatterLine(key, value, indent) {
32
+ const pad = ' '.repeat(indent);
33
+ if (value == null) {
34
+ return `${pad}${key}: null`;
35
+ }
36
+ if (typeof value === 'string') {
37
+ return `${pad}${key}: ${quoteString(value)}`;
38
+ }
39
+ if (typeof value === 'number' || typeof value === 'boolean') {
40
+ return `${pad}${key}: ${value}`;
41
+ }
42
+ if (Array.isArray(value)) {
43
+ if (value.length === 0)
44
+ return `${pad}${key}: []`;
45
+ const items = value.map(v => `${pad} - ${quoteString(String(v))}`).join('\n');
46
+ return `${pad}${key}:\n${items}`;
47
+ }
48
+ if (typeof value === 'object') {
49
+ const nested = Object.entries(value)
50
+ .map(([k, v]) => renderFrontmatterLine(k, v, indent + 1))
51
+ .join('\n');
52
+ return `${pad}${key}:\n${nested}`;
53
+ }
54
+ return `${pad}${key}: ${String(value)}`;
55
+ }
56
+ function quoteString(value) {
57
+ const needsQuoting = /[:#\n"'`\\]/.test(value) || value.startsWith(' ') || value.endsWith(' ');
58
+ if (!needsQuoting)
59
+ return value;
60
+ return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
61
+ }
62
+ export function renderClaudeRule(candidate, promotedAt) {
63
+ const title = titleFor(candidate);
64
+ const slug = slugifyTitle(title);
65
+ const relativePath = `.claude/rules/${slug}.md`;
66
+ const frontmatter = {
67
+ title,
68
+ audrey: {
69
+ memory_ids: [candidate.memory_id],
70
+ memory_type: candidate.memory_type,
71
+ candidate_id: candidate.candidate_id,
72
+ confidence: Number(candidate.confidence.toFixed(3)),
73
+ evidence_count: candidate.evidence_count,
74
+ usage_count: candidate.usage_count,
75
+ failure_prevented: candidate.failure_prevented,
76
+ score: Number(candidate.score.toFixed(2)),
77
+ promoted_at: promotedAt,
78
+ },
79
+ };
80
+ if (candidate.scope) {
81
+ frontmatter.audrey.scope = candidate.scope;
82
+ }
83
+ if (candidate.tags.length > 0) {
84
+ frontmatter.audrey.tags = candidate.tags;
85
+ }
86
+ const evidenceLine = candidate.failure_prevented > 0
87
+ ? `This rule would have prevented ${candidate.failure_prevented} recent tool failure${candidate.failure_prevented === 1 ? '' : 's'}.`
88
+ : `Supported by ${candidate.evidence_count} observation${candidate.evidence_count === 1 ? '' : 's'}.`;
89
+ const bodyLines = [
90
+ renderFrontmatter(frontmatter),
91
+ '',
92
+ `# ${title}`,
93
+ '',
94
+ candidate.content,
95
+ '',
96
+ '## Why this rule',
97
+ '',
98
+ `- ${candidate.reason}`,
99
+ `- ${evidenceLine}`,
100
+ `- Confidence: ${(candidate.confidence * 100).toFixed(1)}%`,
101
+ '',
102
+ '## Provenance',
103
+ '',
104
+ `- Source memory: \`${candidate.memory_type}:${candidate.memory_id}\``,
105
+ `- Promoted at: ${promotedAt}`,
106
+ `- Revocation: delete this file, or run \`audrey forget ${candidate.memory_id}\` to retract the underlying memory.`,
107
+ '',
108
+ ];
109
+ return {
110
+ title,
111
+ slug,
112
+ relativePath,
113
+ body: bodyLines.join('\n'),
114
+ frontmatter,
115
+ };
116
+ }
117
+ export function renderAllRules(candidates, promotedAt) {
118
+ const seen = new Set();
119
+ const docs = [];
120
+ for (const candidate of candidates) {
121
+ const doc = renderClaudeRule(candidate, promotedAt);
122
+ // Ensure slug uniqueness — if two candidates produce the same slug,
123
+ // disambiguate with a short suffix of the candidate id.
124
+ let finalSlug = doc.slug;
125
+ let n = 1;
126
+ while (seen.has(finalSlug)) {
127
+ finalSlug = `${doc.slug}-${n++}`;
128
+ }
129
+ seen.add(finalSlug);
130
+ if (finalSlug !== doc.slug) {
131
+ docs.push({
132
+ ...doc,
133
+ slug: finalSlug,
134
+ relativePath: `.claude/rules/${finalSlug}.md`,
135
+ });
136
+ }
137
+ else {
138
+ docs.push(doc);
139
+ }
140
+ }
141
+ return docs;
142
+ }
143
+ //# sourceMappingURL=rules-compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-compiler.js","sourceRoot":"","sources":["../../src/rules-compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { AudreyConfig } from './types.js';
2
+ export interface ServerOptions {
3
+ port?: number;
4
+ hostname?: string;
5
+ config: AudreyConfig;
6
+ apiKey?: string;
7
+ }
8
+ export declare function startServer(options: ServerOptions): Promise<{
9
+ port: number;
10
+ close: () => void;
11
+ }>;
12
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa;;;GAqBvD"}
@@ -0,0 +1,22 @@
1
+ import { serve } from '@hono/node-server';
2
+ import { createApp } from './routes.js';
3
+ import { Audrey } from './audrey.js';
4
+ export async function startServer(options) {
5
+ const { port = 7437, hostname = '0.0.0.0', config, apiKey } = options;
6
+ const audrey = new Audrey(config);
7
+ if (audrey.embeddingProvider && typeof audrey.embeddingProvider.ready === 'function') {
8
+ await audrey.embeddingProvider.ready();
9
+ }
10
+ const app = createApp(audrey, { apiKey });
11
+ const server = serve({ fetch: app.fetch, port, hostname }, (info) => {
12
+ console.error(`[audrey-http] listening on ${hostname}:${info.port}`);
13
+ });
14
+ return {
15
+ port,
16
+ close: () => {
17
+ server.close();
18
+ audrey.close();
19
+ },
20
+ };
21
+ }
22
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAUrC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAsB;IACtD,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAElC,IAAI,MAAM,CAAC,iBAAiB,IAAI,OAAO,MAAM,CAAC,iBAAiB,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACrF,MAAM,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;QAClE,OAAO,CAAC,KAAK,CAAC,8BAA8B,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,GAAG,EAAE;YACV,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * High-level API for capturing agent tool traces.
3
+ *
4
+ * Contract: raw tool input / output / error text NEVER leaves this module
5
+ * without going through redact(). The default behavior is to keep only
6
+ * metadata (content hash, redacted error summary, file fingerprints) —
7
+ * opting into retainDetails pulls in the actual payload, still redacted.
8
+ */
9
+ import Database from 'better-sqlite3';
10
+ import { type EventOutcome, type EventType, type MemoryEvent } from './events.js';
11
+ import { type RedactionHit } from './redact.js';
12
+ export interface ObserveToolInput {
13
+ event: EventType | string;
14
+ tool: string;
15
+ source?: string;
16
+ sessionId?: string;
17
+ actorAgent?: string;
18
+ input?: unknown;
19
+ output?: unknown;
20
+ outcome?: EventOutcome;
21
+ errorSummary?: string;
22
+ cwd?: string;
23
+ files?: string[];
24
+ metadata?: Record<string, unknown>;
25
+ retainDetails?: boolean;
26
+ }
27
+ export interface ObserveToolResult {
28
+ event: MemoryEvent;
29
+ redactions: RedactionHit[];
30
+ }
31
+ /**
32
+ * Extract a one-line text summary from a tool result. Used when caller
33
+ * provides raw output text; we never store the raw content, only the summary.
34
+ */
35
+ export declare function summarizeOutput(output: unknown, maxChars?: number): string | null;
36
+ export declare function observeTool(db: Database.Database, input: ObserveToolInput): ObserveToolResult;
37
+ //# sourceMappingURL=tool-trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-trace.d.ts","sourceRoot":"","sources":["../../src/tool-trace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,WAAW,EAEjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAIzF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,YAAY,EAAE,CAAC;CAC5B;AAwCD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAE,MAAY,GAAG,MAAM,GAAG,IAAI,CAQtF;AAoBD,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAqD7F"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * High-level API for capturing agent tool traces.
3
+ *
4
+ * Contract: raw tool input / output / error text NEVER leaves this module
5
+ * without going through redact(). The default behavior is to keep only
6
+ * metadata (content hash, redacted error summary, file fingerprints) —
7
+ * opting into retainDetails pulls in the actual payload, still redacted.
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+ import { statSync, readFileSync, existsSync } from 'node:fs';
11
+ import { insertEvent, } from './events.js';
12
+ import { redact, redactJson, summarizeRedactions } from './redact.js';
13
+ const MAX_ERROR_SUMMARY_CHARS = 2000;
14
+ function sha256(value) {
15
+ return createHash('sha256').update(value).digest('hex');
16
+ }
17
+ function hashOf(value) {
18
+ if (value == null)
19
+ return null;
20
+ const text = typeof value === 'string' ? value : JSON.stringify(value);
21
+ if (!text)
22
+ return null;
23
+ return sha256(text);
24
+ }
25
+ function fingerprintFile(path) {
26
+ try {
27
+ if (!existsSync(path))
28
+ return null;
29
+ const stat = statSync(path);
30
+ if (!stat.isFile())
31
+ return null;
32
+ if (stat.size === 0)
33
+ return `${path}|0|${stat.mtimeMs.toFixed(0)}|empty`;
34
+ if (stat.size > 16 * 1024 * 1024) {
35
+ // Files over 16 MB get a size/mtime-only fingerprint. Avoids blowing
36
+ // out memory on huge binaries while still giving us a change signal.
37
+ return `${path}|${stat.size}|${stat.mtimeMs.toFixed(0)}|skip`;
38
+ }
39
+ const contentHash = sha256(readFileSync(path).toString('hex'));
40
+ return `${path}|${stat.size}|${stat.mtimeMs.toFixed(0)}|${contentHash.slice(0, 16)}`;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ function safeErrorSummary(input) {
47
+ if (!input)
48
+ return { text: null, hits: [] };
49
+ const trimmed = input.length > MAX_ERROR_SUMMARY_CHARS
50
+ ? input.slice(0, MAX_ERROR_SUMMARY_CHARS) + '…[truncated]'
51
+ : input;
52
+ const result = redact(trimmed);
53
+ return { text: result.text, hits: result.redactions };
54
+ }
55
+ /**
56
+ * Extract a one-line text summary from a tool result. Used when caller
57
+ * provides raw output text; we never store the raw content, only the summary.
58
+ */
59
+ export function summarizeOutput(output, maxChars = 240) {
60
+ if (output == null)
61
+ return null;
62
+ const text = typeof output === 'string' ? output : safeStringify(output);
63
+ if (!text)
64
+ return null;
65
+ const firstLine = text.split(/\r?\n/).find(line => line.trim().length > 0) ?? text;
66
+ const trimmed = firstLine.trim();
67
+ if (trimmed.length <= maxChars)
68
+ return trimmed;
69
+ return trimmed.slice(0, maxChars - 1) + '…';
70
+ }
71
+ function safeStringify(value) {
72
+ try {
73
+ return JSON.stringify(value);
74
+ }
75
+ catch {
76
+ return String(value);
77
+ }
78
+ }
79
+ function mergeHits(...sets) {
80
+ const counts = new Map();
81
+ for (const set of sets) {
82
+ for (const hit of set) {
83
+ counts.set(hit.class, (counts.get(hit.class) ?? 0) + hit.count);
84
+ }
85
+ }
86
+ return [...counts.entries()].map(([cls, count]) => ({ class: cls, count }));
87
+ }
88
+ export function observeTool(db, input) {
89
+ const errorSummary = safeErrorSummary(input.errorSummary);
90
+ const metadataRaw = {
91
+ ...(input.metadata ?? {}),
92
+ };
93
+ if (input.retainDetails) {
94
+ if (input.input !== undefined)
95
+ metadataRaw.redacted_input = input.input;
96
+ if (input.output !== undefined)
97
+ metadataRaw.redacted_output = input.output;
98
+ }
99
+ else {
100
+ const summary = summarizeOutput(input.output);
101
+ if (summary)
102
+ metadataRaw.output_summary = summary;
103
+ }
104
+ const { value: redactedMetadata, redactions: metadataHits } = redactJson(metadataRaw);
105
+ const fileFingerprints = (input.files ?? [])
106
+ .map(fingerprintFile)
107
+ .filter((fp) => fp != null);
108
+ const allHits = mergeHits(errorSummary.hits, metadataHits);
109
+ let redactionState;
110
+ if (allHits.length > 0) {
111
+ redactionState = 'redacted';
112
+ }
113
+ else if (input.retainDetails) {
114
+ redactionState = 'clean';
115
+ }
116
+ else {
117
+ redactionState = 'unreviewed';
118
+ }
119
+ const finalMetadata = redactedMetadata && Object.keys(redactedMetadata).length > 0
120
+ ? {
121
+ ...redactedMetadata,
122
+ ...(allHits.length > 0 ? { redactions: summarizeRedactions(allHits) } : {}),
123
+ }
124
+ : (allHits.length > 0 ? { redactions: summarizeRedactions(allHits) } : null);
125
+ const event = insertEvent(db, {
126
+ sessionId: input.sessionId ?? null,
127
+ eventType: input.event,
128
+ source: input.source ?? 'tool-trace',
129
+ actorAgent: input.actorAgent ?? null,
130
+ toolName: input.tool,
131
+ inputHash: hashOf(input.input),
132
+ outputHash: hashOf(input.output),
133
+ outcome: input.outcome ?? (input.event === 'PostToolUseFailure' ? 'failed' : null),
134
+ errorSummary: errorSummary.text,
135
+ cwd: input.cwd ?? null,
136
+ fileFingerprints,
137
+ redactionState,
138
+ metadata: finalMetadata,
139
+ });
140
+ return { event, redactions: allHits };
141
+ }
142
+ //# sourceMappingURL=tool-trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-trace.js","sourceRoot":"","sources":["../../src/tool-trace.ts"],"names":[],"mappings":"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"}