@auxiora/runtime 1.3.0 → 1.10.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/dist/enrichment/__tests__/architect-stage.test.d.ts +2 -0
- package/dist/enrichment/__tests__/architect-stage.test.d.ts.map +1 -0
- package/dist/enrichment/__tests__/architect-stage.test.js +189 -0
- package/dist/enrichment/__tests__/architect-stage.test.js.map +1 -0
- package/dist/enrichment/__tests__/integration.test.d.ts +2 -0
- package/dist/enrichment/__tests__/integration.test.d.ts.map +1 -0
- package/dist/enrichment/__tests__/integration.test.js +79 -0
- package/dist/enrichment/__tests__/integration.test.js.map +1 -0
- package/dist/enrichment/__tests__/memory-stage.test.d.ts +2 -0
- package/dist/enrichment/__tests__/memory-stage.test.d.ts.map +1 -0
- package/dist/enrichment/__tests__/memory-stage.test.js +43 -0
- package/dist/enrichment/__tests__/memory-stage.test.js.map +1 -0
- package/dist/enrichment/__tests__/mode-stage.test.d.ts +2 -0
- package/dist/enrichment/__tests__/mode-stage.test.d.ts.map +1 -0
- package/dist/enrichment/__tests__/mode-stage.test.js +139 -0
- package/dist/enrichment/__tests__/mode-stage.test.js.map +1 -0
- package/dist/enrichment/__tests__/model-identity-stage.test.d.ts +2 -0
- package/dist/enrichment/__tests__/model-identity-stage.test.d.ts.map +1 -0
- package/dist/enrichment/__tests__/model-identity-stage.test.js +74 -0
- package/dist/enrichment/__tests__/model-identity-stage.test.js.map +1 -0
- package/dist/enrichment/__tests__/pipeline.test.d.ts +2 -0
- package/dist/enrichment/__tests__/pipeline.test.d.ts.map +1 -0
- package/dist/enrichment/__tests__/pipeline.test.js +78 -0
- package/dist/enrichment/__tests__/pipeline.test.js.map +1 -0
- package/dist/enrichment/__tests__/self-awareness-stage.test.d.ts +2 -0
- package/dist/enrichment/__tests__/self-awareness-stage.test.d.ts.map +1 -0
- package/dist/enrichment/__tests__/self-awareness-stage.test.js +71 -0
- package/dist/enrichment/__tests__/self-awareness-stage.test.js.map +1 -0
- package/dist/enrichment/__tests__/types.test.d.ts +2 -0
- package/dist/enrichment/__tests__/types.test.d.ts.map +1 -0
- package/dist/enrichment/__tests__/types.test.js +31 -0
- package/dist/enrichment/__tests__/types.test.js.map +1 -0
- package/dist/enrichment/index.d.ts +8 -0
- package/dist/enrichment/index.d.ts.map +1 -0
- package/dist/enrichment/index.js +7 -0
- package/dist/enrichment/index.js.map +1 -0
- package/dist/enrichment/pipeline.d.ts +7 -0
- package/dist/enrichment/pipeline.d.ts.map +1 -0
- package/dist/enrichment/pipeline.js +29 -0
- package/dist/enrichment/pipeline.js.map +1 -0
- package/dist/enrichment/stages/architect-stage.d.ts +57 -0
- package/dist/enrichment/stages/architect-stage.d.ts.map +1 -0
- package/dist/enrichment/stages/architect-stage.js +112 -0
- package/dist/enrichment/stages/architect-stage.js.map +1 -0
- package/dist/enrichment/stages/memory-stage.d.ts +15 -0
- package/dist/enrichment/stages/memory-stage.d.ts.map +1 -0
- package/dist/enrichment/stages/memory-stage.js +19 -0
- package/dist/enrichment/stages/memory-stage.js.map +1 -0
- package/dist/enrichment/stages/mode-stage.d.ts +49 -0
- package/dist/enrichment/stages/mode-stage.d.ts.map +1 -0
- package/dist/enrichment/stages/mode-stage.js +60 -0
- package/dist/enrichment/stages/mode-stage.js.map +1 -0
- package/dist/enrichment/stages/model-identity-stage.d.ts +24 -0
- package/dist/enrichment/stages/model-identity-stage.d.ts.map +1 -0
- package/dist/enrichment/stages/model-identity-stage.js +23 -0
- package/dist/enrichment/stages/model-identity-stage.js.map +1 -0
- package/dist/enrichment/stages/self-awareness-stage.d.ts +23 -0
- package/dist/enrichment/stages/self-awareness-stage.d.ts.map +1 -0
- package/dist/enrichment/stages/self-awareness-stage.js +24 -0
- package/dist/enrichment/stages/self-awareness-stage.js.map +1 -0
- package/dist/enrichment/types.d.ts +45 -0
- package/dist/enrichment/types.d.ts.map +1 -0
- package/dist/enrichment/types.js +2 -0
- package/dist/enrichment/types.js.map +1 -0
- package/dist/index.d.ts +77 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3233 -230
- package/dist/index.js.map +1 -1
- package/dist/transparency/__tests__/collector.test.d.ts +2 -0
- package/dist/transparency/__tests__/collector.test.d.ts.map +1 -0
- package/dist/transparency/__tests__/collector.test.js +133 -0
- package/dist/transparency/__tests__/collector.test.js.map +1 -0
- package/dist/transparency/__tests__/confidence-scorer.test.d.ts +2 -0
- package/dist/transparency/__tests__/confidence-scorer.test.d.ts.map +1 -0
- package/dist/transparency/__tests__/confidence-scorer.test.js +118 -0
- package/dist/transparency/__tests__/confidence-scorer.test.js.map +1 -0
- package/dist/transparency/__tests__/source-attributor.test.d.ts +2 -0
- package/dist/transparency/__tests__/source-attributor.test.d.ts.map +1 -0
- package/dist/transparency/__tests__/source-attributor.test.js +47 -0
- package/dist/transparency/__tests__/source-attributor.test.js.map +1 -0
- package/dist/transparency/__tests__/types.test.d.ts +2 -0
- package/dist/transparency/__tests__/types.test.d.ts.map +1 -0
- package/dist/transparency/__tests__/types.test.js +62 -0
- package/dist/transparency/__tests__/types.test.js.map +1 -0
- package/dist/transparency/collector.d.ts +30 -0
- package/dist/transparency/collector.d.ts.map +1 -0
- package/dist/transparency/collector.js +79 -0
- package/dist/transparency/collector.js.map +1 -0
- package/dist/transparency/confidence-scorer.d.ts +17 -0
- package/dist/transparency/confidence-scorer.d.ts.map +1 -0
- package/dist/transparency/confidence-scorer.js +66 -0
- package/dist/transparency/confidence-scorer.js.map +1 -0
- package/dist/transparency/index.d.ts +8 -0
- package/dist/transparency/index.d.ts.map +1 -0
- package/dist/transparency/index.js +4 -0
- package/dist/transparency/index.js.map +1 -0
- package/dist/transparency/source-attributor.d.ts +10 -0
- package/dist/transparency/source-attributor.d.ts.map +1 -0
- package/dist/transparency/source-attributor.js +42 -0
- package/dist/transparency/source-attributor.js.map +1 -0
- package/dist/transparency/types.d.ts +53 -0
- package/dist/transparency/types.d.ts.map +1 -0
- package/dist/transparency/types.js +2 -0
- package/dist/transparency/types.js.map +1 -0
- package/package.json +74 -50
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.test.d.ts","sourceRoot":"","sources":["../../../src/transparency/__tests__/collector.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { collectTransparencyMeta } from '../collector.js';
|
|
3
|
+
function makeArchitectMeta(overrides) {
|
|
4
|
+
return {
|
|
5
|
+
detectedContext: { domain: 'code_engineering', confidence: 0.85 },
|
|
6
|
+
activeTraits: [{ name: 'precise', weight: 0.82 }, { name: 'thorough', weight: 0.74 }],
|
|
7
|
+
traitWeights: { precise: 0.82, thorough: 0.74 },
|
|
8
|
+
escalationAlert: false,
|
|
9
|
+
channelType: 'webchat',
|
|
10
|
+
...overrides,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function makeEnrichment(meta) {
|
|
14
|
+
return {
|
|
15
|
+
prompt: 'enriched prompt',
|
|
16
|
+
metadata: {
|
|
17
|
+
architect: makeArchitectMeta(meta),
|
|
18
|
+
stages: ['memory', 'mode', 'architect', 'self-awareness', 'model-identity'],
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
describe('collectTransparencyMeta', () => {
|
|
23
|
+
it('assembles full metadata from all sources', () => {
|
|
24
|
+
const result = collectTransparencyMeta({
|
|
25
|
+
enrichment: makeEnrichment(),
|
|
26
|
+
completion: {
|
|
27
|
+
content: 'The answer is 42.',
|
|
28
|
+
usage: { inputTokens: 156, outputTokens: 278 },
|
|
29
|
+
model: 'claude-3.5-sonnet',
|
|
30
|
+
finishReason: 'stop',
|
|
31
|
+
toolUse: [{ name: 'web_search' }],
|
|
32
|
+
},
|
|
33
|
+
capabilities: { costPer1kInput: 0.008, costPer1kOutput: 0.024 },
|
|
34
|
+
providerName: 'anthropic',
|
|
35
|
+
awarenessSignals: [],
|
|
36
|
+
responseText: 'The answer is 42.',
|
|
37
|
+
processingStartTime: Date.now() - 1500,
|
|
38
|
+
});
|
|
39
|
+
expect(result.confidence.level).toBe('high');
|
|
40
|
+
expect(result.confidence.score).toBeGreaterThanOrEqual(0.75);
|
|
41
|
+
expect(result.sources.find(s => s.type === 'tool_result')).toBeDefined();
|
|
42
|
+
expect(result.model.provider).toBe('anthropic');
|
|
43
|
+
expect(result.model.model).toBe('claude-3.5-sonnet');
|
|
44
|
+
expect(result.model.tokens.input).toBe(156);
|
|
45
|
+
expect(result.model.tokens.output).toBe(278);
|
|
46
|
+
expect(result.model.cost.total).toBeGreaterThan(0);
|
|
47
|
+
expect(result.model.finishReason).toBe('stop');
|
|
48
|
+
expect(result.personality.domain).toBe('code_engineering');
|
|
49
|
+
expect(result.personality.activeTraits).toHaveLength(2);
|
|
50
|
+
expect(result.trace.enrichmentStages).toHaveLength(5);
|
|
51
|
+
expect(result.trace.toolsUsed).toEqual(['web_search']);
|
|
52
|
+
});
|
|
53
|
+
it('extracts knowledge boundary from awareness signals', () => {
|
|
54
|
+
const result = collectTransparencyMeta({
|
|
55
|
+
enrichment: makeEnrichment(),
|
|
56
|
+
completion: {
|
|
57
|
+
content: 'Response text',
|
|
58
|
+
usage: { inputTokens: 100, outputTokens: 200 },
|
|
59
|
+
model: 'claude-3.5-sonnet',
|
|
60
|
+
finishReason: 'stop',
|
|
61
|
+
},
|
|
62
|
+
capabilities: { costPer1kInput: 0.008, costPer1kOutput: 0.024 },
|
|
63
|
+
providerName: 'anthropic',
|
|
64
|
+
awarenessSignals: [{
|
|
65
|
+
dimension: 'knowledge-boundary',
|
|
66
|
+
data: { topic: 'kubernetes networking', corrections: 2, hedges: 1 },
|
|
67
|
+
}],
|
|
68
|
+
responseText: 'Response text',
|
|
69
|
+
processingStartTime: Date.now() - 800,
|
|
70
|
+
});
|
|
71
|
+
expect(result.personality.knowledgeBoundary).toEqual({
|
|
72
|
+
topic: 'kubernetes networking',
|
|
73
|
+
corrections: 2,
|
|
74
|
+
});
|
|
75
|
+
expect(result.confidence.factors.find(f => f.signal === 'knowledge_boundary')).toBeDefined();
|
|
76
|
+
});
|
|
77
|
+
it('calculates cost from capabilities', () => {
|
|
78
|
+
const result = collectTransparencyMeta({
|
|
79
|
+
enrichment: makeEnrichment(),
|
|
80
|
+
completion: {
|
|
81
|
+
content: 'Test',
|
|
82
|
+
usage: { inputTokens: 1000, outputTokens: 500 },
|
|
83
|
+
model: 'claude-3.5-sonnet',
|
|
84
|
+
finishReason: 'stop',
|
|
85
|
+
},
|
|
86
|
+
capabilities: { costPer1kInput: 0.003, costPer1kOutput: 0.015 },
|
|
87
|
+
providerName: 'openai',
|
|
88
|
+
awarenessSignals: [],
|
|
89
|
+
responseText: 'Test',
|
|
90
|
+
processingStartTime: Date.now() - 500,
|
|
91
|
+
});
|
|
92
|
+
expect(result.model.cost.input).toBeCloseTo(0.003, 4);
|
|
93
|
+
expect(result.model.cost.output).toBeCloseTo(0.0075, 4);
|
|
94
|
+
expect(result.model.cost.total).toBeCloseTo(0.0105, 4);
|
|
95
|
+
});
|
|
96
|
+
it('handles missing enrichment gracefully', () => {
|
|
97
|
+
const result = collectTransparencyMeta({
|
|
98
|
+
enrichment: { prompt: 'base', metadata: { stages: [] } },
|
|
99
|
+
completion: {
|
|
100
|
+
content: 'Simple response.',
|
|
101
|
+
usage: { inputTokens: 50, outputTokens: 100 },
|
|
102
|
+
model: 'gpt-4o',
|
|
103
|
+
finishReason: 'stop',
|
|
104
|
+
},
|
|
105
|
+
capabilities: { costPer1kInput: 0.005, costPer1kOutput: 0.015 },
|
|
106
|
+
providerName: 'openai',
|
|
107
|
+
awarenessSignals: [],
|
|
108
|
+
responseText: 'Simple response.',
|
|
109
|
+
processingStartTime: Date.now() - 300,
|
|
110
|
+
});
|
|
111
|
+
expect(result.personality.domain).toBe('general');
|
|
112
|
+
expect(result.personality.activeTraits).toEqual([]);
|
|
113
|
+
expect(result.trace.enrichmentStages).toEqual([]);
|
|
114
|
+
});
|
|
115
|
+
it('detects escalation alert', () => {
|
|
116
|
+
const result = collectTransparencyMeta({
|
|
117
|
+
enrichment: makeEnrichment({ escalationAlert: true }),
|
|
118
|
+
completion: {
|
|
119
|
+
content: 'I think this could be wrong.',
|
|
120
|
+
usage: { inputTokens: 100, outputTokens: 200 },
|
|
121
|
+
model: 'claude-3.5-sonnet',
|
|
122
|
+
finishReason: 'stop',
|
|
123
|
+
},
|
|
124
|
+
capabilities: { costPer1kInput: 0.008, costPer1kOutput: 0.024 },
|
|
125
|
+
providerName: 'anthropic',
|
|
126
|
+
awarenessSignals: [],
|
|
127
|
+
responseText: 'I think this could be wrong.',
|
|
128
|
+
processingStartTime: Date.now() - 600,
|
|
129
|
+
});
|
|
130
|
+
expect(result.confidence.factors.find(f => f.signal === 'escalation_flagged')).toBeDefined();
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=collector.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.test.js","sourceRoot":"","sources":["../../../src/transparency/__tests__/collector.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence-scorer.test.d.ts","sourceRoot":"","sources":["../../../src/transparency/__tests__/confidence-scorer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { scoreConfidence } from '../confidence-scorer.js';
|
|
3
|
+
describe('scoreConfidence', () => {
|
|
4
|
+
it('returns base score 0.7 with no signals', () => {
|
|
5
|
+
const result = scoreConfidence({
|
|
6
|
+
toolsUsed: [],
|
|
7
|
+
hasMemoryRecall: false,
|
|
8
|
+
hasUserData: false,
|
|
9
|
+
finishReason: 'stop',
|
|
10
|
+
knowledgeBoundaryCorrections: 0,
|
|
11
|
+
hedgePhraseCount: 0,
|
|
12
|
+
escalationAlert: false,
|
|
13
|
+
});
|
|
14
|
+
// Base 0.7 + clean_finish +0.05 + no_corrections +0.05 - ungrounded -0.10 = 0.70
|
|
15
|
+
expect(result.score).toBeCloseTo(0.70, 2);
|
|
16
|
+
expect(result.level).toBe('medium');
|
|
17
|
+
});
|
|
18
|
+
it('boosts for tool grounding', () => {
|
|
19
|
+
const result = scoreConfidence({
|
|
20
|
+
toolsUsed: ['web_search'],
|
|
21
|
+
hasMemoryRecall: false,
|
|
22
|
+
hasUserData: false,
|
|
23
|
+
finishReason: 'stop',
|
|
24
|
+
knowledgeBoundaryCorrections: 0,
|
|
25
|
+
hedgePhraseCount: 0,
|
|
26
|
+
escalationAlert: false,
|
|
27
|
+
});
|
|
28
|
+
// Base 0.7 + tool_grounded +0.15 + clean_finish +0.05 + no_corrections +0.05 = 0.95
|
|
29
|
+
expect(result.score).toBeCloseTo(0.95, 2);
|
|
30
|
+
expect(result.level).toBe('high');
|
|
31
|
+
expect(result.factors.find(f => f.signal === 'tool_grounded')).toBeDefined();
|
|
32
|
+
});
|
|
33
|
+
it('penalizes for knowledge boundary corrections', () => {
|
|
34
|
+
const result = scoreConfidence({
|
|
35
|
+
toolsUsed: [],
|
|
36
|
+
hasMemoryRecall: false,
|
|
37
|
+
hasUserData: false,
|
|
38
|
+
finishReason: 'stop',
|
|
39
|
+
knowledgeBoundaryCorrections: 2,
|
|
40
|
+
hedgePhraseCount: 0,
|
|
41
|
+
escalationAlert: false,
|
|
42
|
+
});
|
|
43
|
+
// Base 0.7 + clean_finish +0.05 - knowledge_boundary -0.30 - ungrounded -0.10 = 0.35
|
|
44
|
+
expect(result.score).toBeCloseTo(0.35, 2);
|
|
45
|
+
expect(result.level).toBe('low');
|
|
46
|
+
});
|
|
47
|
+
it('penalizes for max_tokens truncation', () => {
|
|
48
|
+
const result = scoreConfidence({
|
|
49
|
+
toolsUsed: ['web_search'],
|
|
50
|
+
hasMemoryRecall: false,
|
|
51
|
+
hasUserData: false,
|
|
52
|
+
finishReason: 'max_tokens',
|
|
53
|
+
knowledgeBoundaryCorrections: 0,
|
|
54
|
+
hedgePhraseCount: 0,
|
|
55
|
+
escalationAlert: false,
|
|
56
|
+
});
|
|
57
|
+
// Base 0.7 + tool_grounded +0.15 + no_corrections +0.05 - truncated -0.20 = 0.70
|
|
58
|
+
expect(result.score).toBeCloseTo(0.70, 2);
|
|
59
|
+
});
|
|
60
|
+
it('penalizes for hedge density above threshold', () => {
|
|
61
|
+
const result = scoreConfidence({
|
|
62
|
+
toolsUsed: [],
|
|
63
|
+
hasMemoryRecall: false,
|
|
64
|
+
hasUserData: false,
|
|
65
|
+
finishReason: 'stop',
|
|
66
|
+
knowledgeBoundaryCorrections: 0,
|
|
67
|
+
hedgePhraseCount: 4,
|
|
68
|
+
escalationAlert: false,
|
|
69
|
+
});
|
|
70
|
+
// Base 0.7 + clean_finish +0.05 + no_corrections +0.05 - hedge_density -0.10 - ungrounded -0.10 = 0.60
|
|
71
|
+
expect(result.score).toBeCloseTo(0.60, 2);
|
|
72
|
+
expect(result.level).toBe('medium');
|
|
73
|
+
});
|
|
74
|
+
it('boosts for memory and user data', () => {
|
|
75
|
+
const result = scoreConfidence({
|
|
76
|
+
toolsUsed: [],
|
|
77
|
+
hasMemoryRecall: true,
|
|
78
|
+
hasUserData: true,
|
|
79
|
+
finishReason: 'stop',
|
|
80
|
+
knowledgeBoundaryCorrections: 0,
|
|
81
|
+
hedgePhraseCount: 0,
|
|
82
|
+
escalationAlert: false,
|
|
83
|
+
});
|
|
84
|
+
// Base 0.7 + memory_backed +0.10 + user_data +0.05 + clean_finish +0.05 + no_corrections +0.05 = 0.95
|
|
85
|
+
expect(result.score).toBeCloseTo(0.95, 2);
|
|
86
|
+
expect(result.level).toBe('high');
|
|
87
|
+
});
|
|
88
|
+
it('clamps score to minimum 0.1', () => {
|
|
89
|
+
const result = scoreConfidence({
|
|
90
|
+
toolsUsed: [],
|
|
91
|
+
hasMemoryRecall: false,
|
|
92
|
+
hasUserData: false,
|
|
93
|
+
finishReason: 'max_tokens',
|
|
94
|
+
knowledgeBoundaryCorrections: 2,
|
|
95
|
+
hedgePhraseCount: 5,
|
|
96
|
+
escalationAlert: true,
|
|
97
|
+
});
|
|
98
|
+
// Many penalties: 0.7 -0.30 -0.20 -0.10 -0.10 -0.10 = -0.10 -> clamped to 0.1
|
|
99
|
+
expect(result.score).toBe(0.1);
|
|
100
|
+
expect(result.level).toBe('low');
|
|
101
|
+
});
|
|
102
|
+
it('caps knowledge boundary penalty at -0.30', () => {
|
|
103
|
+
const result = scoreConfidence({
|
|
104
|
+
toolsUsed: ['web_search'],
|
|
105
|
+
hasMemoryRecall: true,
|
|
106
|
+
hasUserData: true,
|
|
107
|
+
finishReason: 'stop',
|
|
108
|
+
knowledgeBoundaryCorrections: 5,
|
|
109
|
+
hedgePhraseCount: 0,
|
|
110
|
+
escalationAlert: false,
|
|
111
|
+
});
|
|
112
|
+
// Even with 5 corrections, penalty is capped at -0.30 not -0.75
|
|
113
|
+
expect(result.factors.find(f => f.signal === 'knowledge_boundary')?.detail).toContain('5');
|
|
114
|
+
// Base 0.7 + 0.15 + 0.10 + 0.05 + 0.05 - 0.30 = 0.75
|
|
115
|
+
expect(result.score).toBeCloseTo(0.75, 2);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=confidence-scorer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence-scorer.test.js","sourceRoot":"","sources":["../../../src/transparency/__tests__/confidence-scorer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-attributor.test.d.ts","sourceRoot":"","sources":["../../../src/transparency/__tests__/source-attributor.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { attributeSources, countHedgePhrases } from '../source-attributor.js';
|
|
3
|
+
describe('attributeSources', () => {
|
|
4
|
+
it('returns model_generation when no tools or memory', () => {
|
|
5
|
+
const sources = attributeSources({ toolsUsed: [], hasMemoryRecall: false, hasKnowledgeGraph: false, hasUserData: false });
|
|
6
|
+
expect(sources).toHaveLength(1);
|
|
7
|
+
expect(sources[0].type).toBe('model_generation');
|
|
8
|
+
expect(sources[0].confidence).toBe(0.7);
|
|
9
|
+
});
|
|
10
|
+
it('includes tool_result source for each tool', () => {
|
|
11
|
+
const sources = attributeSources({ toolsUsed: ['web_search', 'calculator'], hasMemoryRecall: false, hasKnowledgeGraph: false, hasUserData: false });
|
|
12
|
+
const toolSources = sources.filter(s => s.type === 'tool_result');
|
|
13
|
+
expect(toolSources).toHaveLength(2);
|
|
14
|
+
expect(toolSources[0].label).toContain('web_search');
|
|
15
|
+
expect(toolSources[0].confidence).toBe(0.95);
|
|
16
|
+
});
|
|
17
|
+
it('includes memory_recall source', () => {
|
|
18
|
+
const sources = attributeSources({ toolsUsed: [], hasMemoryRecall: true, hasKnowledgeGraph: false, hasUserData: false });
|
|
19
|
+
expect(sources.find(s => s.type === 'memory_recall')).toBeDefined();
|
|
20
|
+
});
|
|
21
|
+
it('includes knowledge_graph source', () => {
|
|
22
|
+
const sources = attributeSources({ toolsUsed: [], hasMemoryRecall: false, hasKnowledgeGraph: true, hasUserData: false });
|
|
23
|
+
expect(sources.find(s => s.type === 'knowledge_graph')).toBeDefined();
|
|
24
|
+
});
|
|
25
|
+
it('includes user_data source', () => {
|
|
26
|
+
const sources = attributeSources({ toolsUsed: [], hasMemoryRecall: false, hasKnowledgeGraph: false, hasUserData: true });
|
|
27
|
+
expect(sources.find(s => s.type === 'user_data')).toBeDefined();
|
|
28
|
+
});
|
|
29
|
+
it('always includes model_generation as final source', () => {
|
|
30
|
+
const sources = attributeSources({ toolsUsed: ['web_search'], hasMemoryRecall: true, hasKnowledgeGraph: true, hasUserData: true });
|
|
31
|
+
const last = sources[sources.length - 1];
|
|
32
|
+
expect(last.type).toBe('model_generation');
|
|
33
|
+
expect(last.label).toBe('Synthesized from above sources');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('countHedgePhrases', () => {
|
|
37
|
+
it('returns 0 for text with no hedges', () => {
|
|
38
|
+
expect(countHedgePhrases('The answer is 42.')).toBe(0);
|
|
39
|
+
});
|
|
40
|
+
it('counts hedge phrases case-insensitively', () => {
|
|
41
|
+
expect(countHedgePhrases('I think the answer is probably 42. I believe so.')).toBe(3);
|
|
42
|
+
});
|
|
43
|
+
it('handles empty string', () => {
|
|
44
|
+
expect(countHedgePhrases('')).toBe(0);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=source-attributor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-attributor.test.js","sourceRoot":"","sources":["../../../src/transparency/__tests__/source-attributor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.test.d.ts","sourceRoot":"","sources":["../../../src/transparency/__tests__/types.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
describe('TransparencyMeta types', () => {
|
|
3
|
+
it('accepts a valid TransparencyMeta object', () => {
|
|
4
|
+
const meta = {
|
|
5
|
+
confidence: {
|
|
6
|
+
level: 'high',
|
|
7
|
+
score: 0.87,
|
|
8
|
+
factors: [
|
|
9
|
+
{ signal: 'tool_grounded', impact: 'positive', detail: 'Response used tool output' },
|
|
10
|
+
],
|
|
11
|
+
},
|
|
12
|
+
sources: [
|
|
13
|
+
{ type: 'tool_result', label: 'Web search', confidence: 0.95 },
|
|
14
|
+
{ type: 'model_generation', label: 'Generated by model', confidence: 0.7 },
|
|
15
|
+
],
|
|
16
|
+
model: {
|
|
17
|
+
provider: 'anthropic',
|
|
18
|
+
model: 'claude-3.5-sonnet',
|
|
19
|
+
tokens: { input: 156, output: 278 },
|
|
20
|
+
cost: { input: 0.0012, output: 0.0028, total: 0.004 },
|
|
21
|
+
finishReason: 'stop',
|
|
22
|
+
latencyMs: 1247,
|
|
23
|
+
},
|
|
24
|
+
personality: {
|
|
25
|
+
domain: 'code_engineering',
|
|
26
|
+
emotionalRegister: 'neutral',
|
|
27
|
+
activeTraits: [{ name: 'precise', weight: 0.82 }],
|
|
28
|
+
},
|
|
29
|
+
trace: {
|
|
30
|
+
enrichmentStages: ['memory', 'mode', 'architect', 'self-awareness', 'model-identity'],
|
|
31
|
+
toolsUsed: ['web_search'],
|
|
32
|
+
processingMs: 1500,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
expect(meta.confidence.level).toBe('high');
|
|
36
|
+
expect(meta.sources).toHaveLength(2);
|
|
37
|
+
expect(meta.model.cost.total).toBe(0.004);
|
|
38
|
+
});
|
|
39
|
+
it('allows optional knowledgeBoundary in personality', () => {
|
|
40
|
+
const meta = {
|
|
41
|
+
confidence: { level: 'low', score: 0.35, factors: [] },
|
|
42
|
+
sources: [],
|
|
43
|
+
model: {
|
|
44
|
+
provider: 'anthropic',
|
|
45
|
+
model: 'claude-3.5-sonnet',
|
|
46
|
+
tokens: { input: 100, output: 200 },
|
|
47
|
+
cost: { input: 0.001, output: 0.002, total: 0.003 },
|
|
48
|
+
finishReason: 'stop',
|
|
49
|
+
latencyMs: 800,
|
|
50
|
+
},
|
|
51
|
+
personality: {
|
|
52
|
+
domain: 'general',
|
|
53
|
+
emotionalRegister: 'uncertain',
|
|
54
|
+
activeTraits: [],
|
|
55
|
+
knowledgeBoundary: { topic: 'kubernetes networking', corrections: 2 },
|
|
56
|
+
},
|
|
57
|
+
trace: { enrichmentStages: [], toolsUsed: [], processingMs: 500 },
|
|
58
|
+
};
|
|
59
|
+
expect(meta.personality.knowledgeBoundary?.corrections).toBe(2);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../../src/transparency/__tests__/types.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { EnrichmentResult } from '../enrichment/types.js';
|
|
2
|
+
import type { TransparencyMeta } from './types.js';
|
|
3
|
+
export interface CollectorInput {
|
|
4
|
+
readonly enrichment: EnrichmentResult;
|
|
5
|
+
readonly completion: {
|
|
6
|
+
readonly content: string;
|
|
7
|
+
readonly toolUse?: ReadonlyArray<{
|
|
8
|
+
readonly name: string;
|
|
9
|
+
}>;
|
|
10
|
+
readonly usage: {
|
|
11
|
+
readonly inputTokens: number;
|
|
12
|
+
readonly outputTokens: number;
|
|
13
|
+
};
|
|
14
|
+
readonly model: string;
|
|
15
|
+
readonly finishReason: string;
|
|
16
|
+
};
|
|
17
|
+
readonly capabilities: {
|
|
18
|
+
readonly costPer1kInput: number;
|
|
19
|
+
readonly costPer1kOutput: number;
|
|
20
|
+
};
|
|
21
|
+
readonly providerName: string;
|
|
22
|
+
readonly awarenessSignals: ReadonlyArray<{
|
|
23
|
+
readonly dimension: string;
|
|
24
|
+
readonly data: Record<string, unknown>;
|
|
25
|
+
}>;
|
|
26
|
+
readonly responseText: string;
|
|
27
|
+
readonly processingStartTime: number;
|
|
28
|
+
}
|
|
29
|
+
export declare function collectTransparencyMeta(input: CollectorInput): TransparencyMeta;
|
|
30
|
+
//# sourceMappingURL=collector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/transparency/collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC5D,QAAQ,CAAC,KAAK,EAAE;YAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC;QAChF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE;QACrB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;KAClC,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,aAAa,CAAC;QACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACxC,CAAC,CAAC;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,GAAG,gBAAgB,CAmF/E"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { scoreConfidence } from './confidence-scorer.js';
|
|
2
|
+
import { attributeSources, countHedgePhrases } from './source-attributor.js';
|
|
3
|
+
export function collectTransparencyMeta(input) {
|
|
4
|
+
const { enrichment, completion, capabilities, providerName, awarenessSignals, responseText, processingStartTime } = input;
|
|
5
|
+
const architectMeta = enrichment.metadata.architect;
|
|
6
|
+
// Extract knowledge boundary from awareness signals
|
|
7
|
+
const kbSignal = awarenessSignals.find(s => s.dimension === 'knowledge-boundary');
|
|
8
|
+
const knowledgeBoundaryCorrections = typeof kbSignal?.data?.corrections === 'number'
|
|
9
|
+
? kbSignal.data.corrections
|
|
10
|
+
: 0;
|
|
11
|
+
const knowledgeBoundaryTopic = typeof kbSignal?.data?.topic === 'string'
|
|
12
|
+
? kbSignal.data.topic
|
|
13
|
+
: undefined;
|
|
14
|
+
// Determine source signals
|
|
15
|
+
const toolsUsed = completion.toolUse?.map(t => t.name) ?? [];
|
|
16
|
+
const hasMemoryRecall = enrichment.metadata.stages.includes('memory');
|
|
17
|
+
const hasKnowledgeGraph = toolsUsed.some(t => t.includes('knowledge') || t.includes('graph'));
|
|
18
|
+
const hasUserData = enrichment.metadata.stages.includes('self-awareness');
|
|
19
|
+
const hedgePhraseCount = countHedgePhrases(responseText);
|
|
20
|
+
// Score confidence
|
|
21
|
+
const confidence = scoreConfidence({
|
|
22
|
+
toolsUsed,
|
|
23
|
+
hasMemoryRecall,
|
|
24
|
+
hasUserData,
|
|
25
|
+
finishReason: completion.finishReason,
|
|
26
|
+
knowledgeBoundaryCorrections,
|
|
27
|
+
hedgePhraseCount,
|
|
28
|
+
escalationAlert: architectMeta?.escalationAlert ?? false,
|
|
29
|
+
});
|
|
30
|
+
// Attribute sources
|
|
31
|
+
const sources = attributeSources({ toolsUsed, hasMemoryRecall, hasKnowledgeGraph, hasUserData });
|
|
32
|
+
// Calculate cost
|
|
33
|
+
const costInput = (completion.usage.inputTokens / 1000) * capabilities.costPer1kInput;
|
|
34
|
+
const costOutput = (completion.usage.outputTokens / 1000) * capabilities.costPer1kOutput;
|
|
35
|
+
// Extract active traits
|
|
36
|
+
const activeTraits = [];
|
|
37
|
+
if (architectMeta?.traitWeights) {
|
|
38
|
+
for (const [name, weight] of Object.entries(architectMeta.traitWeights)) {
|
|
39
|
+
activeTraits.push({ name, weight: weight });
|
|
40
|
+
}
|
|
41
|
+
activeTraits.sort((a, b) => b.weight - a.weight);
|
|
42
|
+
}
|
|
43
|
+
// Extract emotional register from architect context
|
|
44
|
+
const emotionalRegister = typeof architectMeta?.detectedContext?.emotionalRegister === 'string'
|
|
45
|
+
? architectMeta.detectedContext.emotionalRegister
|
|
46
|
+
: 'neutral';
|
|
47
|
+
return {
|
|
48
|
+
confidence,
|
|
49
|
+
sources,
|
|
50
|
+
model: {
|
|
51
|
+
provider: providerName,
|
|
52
|
+
model: completion.model,
|
|
53
|
+
tokens: { input: completion.usage.inputTokens, output: completion.usage.outputTokens },
|
|
54
|
+
cost: {
|
|
55
|
+
input: Math.round(costInput * 10000) / 10000,
|
|
56
|
+
output: Math.round(costOutput * 10000) / 10000,
|
|
57
|
+
total: Math.round((costInput + costOutput) * 10000) / 10000,
|
|
58
|
+
},
|
|
59
|
+
finishReason: completion.finishReason,
|
|
60
|
+
latencyMs: Date.now() - processingStartTime,
|
|
61
|
+
},
|
|
62
|
+
personality: {
|
|
63
|
+
domain: typeof architectMeta?.detectedContext?.domain === 'string'
|
|
64
|
+
? architectMeta.detectedContext.domain
|
|
65
|
+
: 'general',
|
|
66
|
+
emotionalRegister,
|
|
67
|
+
activeTraits,
|
|
68
|
+
...(knowledgeBoundaryTopic ? {
|
|
69
|
+
knowledgeBoundary: { topic: knowledgeBoundaryTopic, corrections: knowledgeBoundaryCorrections },
|
|
70
|
+
} : {}),
|
|
71
|
+
},
|
|
72
|
+
trace: {
|
|
73
|
+
enrichmentStages: [...enrichment.metadata.stages],
|
|
74
|
+
toolsUsed,
|
|
75
|
+
processingMs: Date.now() - processingStartTime,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/transparency/collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ConfidenceFactor, ConfidenceLevel } from './types.js';
|
|
2
|
+
export interface ConfidenceInput {
|
|
3
|
+
readonly toolsUsed: readonly string[];
|
|
4
|
+
readonly hasMemoryRecall: boolean;
|
|
5
|
+
readonly hasUserData: boolean;
|
|
6
|
+
readonly finishReason: string;
|
|
7
|
+
readonly knowledgeBoundaryCorrections: number;
|
|
8
|
+
readonly hedgePhraseCount: number;
|
|
9
|
+
readonly escalationAlert: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ConfidenceResult {
|
|
12
|
+
readonly level: ConfidenceLevel;
|
|
13
|
+
readonly score: number;
|
|
14
|
+
readonly factors: readonly ConfidenceFactor[];
|
|
15
|
+
}
|
|
16
|
+
export declare function scoreConfidence(input: ConfidenceInput): ConfidenceResult;
|
|
17
|
+
//# sourceMappingURL=confidence-scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence-scorer.d.ts","sourceRoot":"","sources":["../../src/transparency/confidence-scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC/C;AAKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CA0ExE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const BASE_SCORE = 0.7;
|
|
2
|
+
const HEDGE_THRESHOLD = 3;
|
|
3
|
+
export function scoreConfidence(input) {
|
|
4
|
+
let score = BASE_SCORE;
|
|
5
|
+
const factors = [];
|
|
6
|
+
// Positive: tool grounding
|
|
7
|
+
if (input.toolsUsed.length > 0) {
|
|
8
|
+
score += 0.15;
|
|
9
|
+
factors.push({ signal: 'tool_grounded', impact: 'positive', detail: `Response grounded in ${input.toolsUsed.length} tool result(s)` });
|
|
10
|
+
}
|
|
11
|
+
// Positive: memory recall
|
|
12
|
+
if (input.hasMemoryRecall) {
|
|
13
|
+
score += 0.10;
|
|
14
|
+
factors.push({ signal: 'memory_backed', impact: 'positive', detail: 'Response informed by memory/knowledge graph' });
|
|
15
|
+
}
|
|
16
|
+
// Positive: user data
|
|
17
|
+
if (input.hasUserData) {
|
|
18
|
+
score += 0.05;
|
|
19
|
+
factors.push({ signal: 'user_data_informed', impact: 'positive', detail: 'Response references user preferences or decisions' });
|
|
20
|
+
}
|
|
21
|
+
// Positive: clean finish
|
|
22
|
+
if (input.finishReason === 'stop') {
|
|
23
|
+
score += 0.05;
|
|
24
|
+
factors.push({ signal: 'clean_finish', impact: 'positive', detail: 'Model completed response normally' });
|
|
25
|
+
}
|
|
26
|
+
// Positive: no corrections
|
|
27
|
+
if (input.knowledgeBoundaryCorrections === 0) {
|
|
28
|
+
score += 0.05;
|
|
29
|
+
factors.push({ signal: 'no_corrections', impact: 'positive', detail: 'No prior user corrections on this topic' });
|
|
30
|
+
}
|
|
31
|
+
// Negative: knowledge boundary
|
|
32
|
+
if (input.knowledgeBoundaryCorrections > 0) {
|
|
33
|
+
const penalty = Math.min(input.knowledgeBoundaryCorrections * 0.15, 0.30);
|
|
34
|
+
score -= penalty;
|
|
35
|
+
factors.push({
|
|
36
|
+
signal: 'knowledge_boundary',
|
|
37
|
+
impact: 'negative',
|
|
38
|
+
detail: `Topic previously corrected ${input.knowledgeBoundaryCorrections} time(s) by user`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
// Negative: truncated
|
|
42
|
+
if (input.finishReason === 'max_tokens') {
|
|
43
|
+
score -= 0.20;
|
|
44
|
+
factors.push({ signal: 'truncated_response', impact: 'negative', detail: 'Response was truncated (hit token limit)' });
|
|
45
|
+
}
|
|
46
|
+
// Negative: hedge density
|
|
47
|
+
if (input.hedgePhraseCount > HEDGE_THRESHOLD) {
|
|
48
|
+
score -= 0.10;
|
|
49
|
+
factors.push({ signal: 'hedge_density', impact: 'negative', detail: `${input.hedgePhraseCount} hedge phrases detected in response` });
|
|
50
|
+
}
|
|
51
|
+
// Negative: ungrounded (no tools, no memory, no user data)
|
|
52
|
+
if (input.toolsUsed.length === 0 && !input.hasMemoryRecall && !input.hasUserData) {
|
|
53
|
+
score -= 0.10;
|
|
54
|
+
factors.push({ signal: 'ungrounded', impact: 'negative', detail: 'Response is pure model generation without external grounding' });
|
|
55
|
+
}
|
|
56
|
+
// Negative: escalation
|
|
57
|
+
if (input.escalationAlert) {
|
|
58
|
+
score -= 0.10;
|
|
59
|
+
factors.push({ signal: 'escalation_flagged', impact: 'negative', detail: 'Personality engine flagged potential escalation' });
|
|
60
|
+
}
|
|
61
|
+
// Clamp and level
|
|
62
|
+
score = Math.max(0.1, Math.min(1.0, score));
|
|
63
|
+
const level = score >= 0.75 ? 'high' : score >= 0.45 ? 'medium' : 'low';
|
|
64
|
+
return { level, score: Math.round(score * 100) / 100, factors };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=confidence-scorer.js.map
|