phaibel 4.0.35 → 4.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -31
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +39 -53
- package/dist/commands/chat.js.map +1 -1
- package/dist/context/context-tree-serializer.d.ts +8 -0
- package/dist/context/context-tree-serializer.d.ts.map +1 -0
- package/dist/context/context-tree-serializer.js +150 -0
- package/dist/context/context-tree-serializer.js.map +1 -0
- package/dist/context/context-tree.d.ts +67 -0
- package/dist/context/context-tree.d.ts.map +1 -0
- package/dist/context/context-tree.js +207 -0
- package/dist/context/context-tree.js.map +1 -0
- package/dist/context/scope-classifier.d.ts +9 -0
- package/dist/context/scope-classifier.d.ts.map +1 -0
- package/dist/context/scope-classifier.js +43 -0
- package/dist/context/scope-classifier.js.map +1 -0
- package/dist/feral/bootstrap.d.ts.map +1 -1
- package/dist/feral/bootstrap.js +9 -1
- package/dist/feral/bootstrap.js.map +1 -1
- package/dist/feral/catalog/usage-catalog-source.d.ts +7 -0
- package/dist/feral/catalog/usage-catalog-source.d.ts.map +1 -0
- package/dist/feral/catalog/usage-catalog-source.js +48 -0
- package/dist/feral/catalog/usage-catalog-source.js.map +1 -0
- package/dist/feral/node-code/data/chart-token-usage-node-code.d.ts +11 -0
- package/dist/feral/node-code/data/chart-token-usage-node-code.d.ts.map +1 -0
- package/dist/feral/node-code/data/chart-token-usage-node-code.js +130 -0
- package/dist/feral/node-code/data/chart-token-usage-node-code.js.map +1 -0
- package/dist/feral/node-code/data/query-token-usage-node-code.d.ts +10 -0
- package/dist/feral/node-code/data/query-token-usage-node-code.d.ts.map +1 -0
- package/dist/feral/node-code/data/query-token-usage-node-code.js +45 -0
- package/dist/feral/node-code/data/query-token-usage-node-code.js.map +1 -0
- package/dist/llm/providers/claude.d.ts.map +1 -1
- package/dist/llm/providers/claude.js +5 -0
- package/dist/llm/providers/claude.js.map +1 -1
- package/dist/llm/providers/openai.d.ts.map +1 -1
- package/dist/llm/providers/openai.js +9 -0
- package/dist/llm/providers/openai.js.map +1 -1
- package/dist/llm/token-usage.d.ts +39 -0
- package/dist/llm/token-usage.d.ts.map +1 -0
- package/dist/llm/token-usage.js +156 -0
- package/dist/llm/token-usage.js.map +1 -0
- package/dist/service/api-router.d.ts.map +1 -1
- package/dist/service/api-router.js +41 -0
- package/dist/service/api-router.js.map +1 -1
- package/dist/service/cron/scheduler.d.ts.map +1 -1
- package/dist/service/cron/scheduler.js +8 -0
- package/dist/service/cron/scheduler.js.map +1 -1
- package/dist/service/cron/world-model-synthesis.d.ts +22 -0
- package/dist/service/cron/world-model-synthesis.d.ts.map +1 -0
- package/dist/service/cron/world-model-synthesis.js +202 -0
- package/dist/service/cron/world-model-synthesis.js.map +1 -0
- package/dist/service/web-client.html +323 -1
- package/dist/service/web-server.d.ts.map +1 -1
- package/dist/service/web-server.js +1 -0
- package/dist/service/web-server.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
// Context Tree — Hierarchical vault context for LLM consumption
|
|
3
|
+
//
|
|
4
|
+
// Models the vault as: Trunk (root) → Branches (entity types) → Leaves (entities)
|
|
5
|
+
// with Edges connecting leaves across types. Scope controls which parts
|
|
6
|
+
// of the tree are materialized to stay within token budgets.
|
|
7
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
8
|
+
import { promises as fsP } from 'fs';
|
|
9
|
+
import { getVaultContext, getSubdirectoryContext } from './reader.js';
|
|
10
|
+
import { getEntityIndex } from '../entities/entity-index.js';
|
|
11
|
+
import { loadEntityTypes } from '../entities/entity-type-config.js';
|
|
12
|
+
import { parseEntity } from '../entities/entity.js';
|
|
13
|
+
import { debug } from '../utils/debug.js';
|
|
14
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
15
|
+
// CONSTANTS
|
|
16
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
17
|
+
const MAX_LEAVES_PER_BRANCH = 50;
|
|
18
|
+
const MAX_FULL_CONTENT_LEAVES = 50;
|
|
19
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
20
|
+
// BUILDER
|
|
21
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
22
|
+
function fieldToTreeField(f) {
|
|
23
|
+
const tf = { key: f.key, type: f.type };
|
|
24
|
+
if (f.type === 'enum' && f.values)
|
|
25
|
+
tf.values = f.values;
|
|
26
|
+
return tf;
|
|
27
|
+
}
|
|
28
|
+
function indexNodeToLeaf(node, includeContent) {
|
|
29
|
+
return {
|
|
30
|
+
key: `${node.type}:${node.id}`,
|
|
31
|
+
title: node.title,
|
|
32
|
+
tags: node.tags,
|
|
33
|
+
summary: node.summary,
|
|
34
|
+
meta: node.meta,
|
|
35
|
+
content: includeContent,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Build the context tree trunk — always included.
|
|
40
|
+
*/
|
|
41
|
+
async function buildTrunk(globals) {
|
|
42
|
+
const vaultContext = await getVaultContext().catch(() => '');
|
|
43
|
+
const index = getEntityIndex();
|
|
44
|
+
const stats = index.getStats();
|
|
45
|
+
return {
|
|
46
|
+
vaultContext,
|
|
47
|
+
globals,
|
|
48
|
+
stats: {
|
|
49
|
+
totalEntities: stats.nodeCount,
|
|
50
|
+
entityTypes: Object.keys(stats.byType),
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Build a branch (entity type) with optional leaf population.
|
|
56
|
+
*/
|
|
57
|
+
async function buildBranch(typeConfig, leafMode) {
|
|
58
|
+
const index = getEntityIndex();
|
|
59
|
+
const subdirContext = await getSubdirectoryContext(typeConfig.directory).catch(() => '');
|
|
60
|
+
const nodes = index.getNodes(typeConfig.name);
|
|
61
|
+
let leaves = [];
|
|
62
|
+
if (leafMode === 'summary') {
|
|
63
|
+
// Sort by recency (meta.created descending), cap at MAX_LEAVES_PER_BRANCH
|
|
64
|
+
const sorted = [...nodes].sort((a, b) => {
|
|
65
|
+
const aDate = a.meta.created || '';
|
|
66
|
+
const bDate = b.meta.created || '';
|
|
67
|
+
return bDate.localeCompare(aDate);
|
|
68
|
+
});
|
|
69
|
+
leaves = sorted.slice(0, MAX_LEAVES_PER_BRANCH).map(n => indexNodeToLeaf(n));
|
|
70
|
+
}
|
|
71
|
+
else if (leafMode === 'full') {
|
|
72
|
+
// Load full content from disk, capped
|
|
73
|
+
const sorted = [...nodes].sort((a, b) => {
|
|
74
|
+
const aDate = a.meta.created || '';
|
|
75
|
+
const bDate = b.meta.created || '';
|
|
76
|
+
return bDate.localeCompare(aDate);
|
|
77
|
+
});
|
|
78
|
+
const toLoad = sorted.slice(0, MAX_FULL_CONTENT_LEAVES);
|
|
79
|
+
leaves = await Promise.all(toLoad.map(async (n) => {
|
|
80
|
+
try {
|
|
81
|
+
const raw = await fsP.readFile(n.filepath, 'utf-8');
|
|
82
|
+
const { content } = parseEntity(n.filepath, raw);
|
|
83
|
+
return indexNodeToLeaf(n, content);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return indexNodeToLeaf(n);
|
|
87
|
+
}
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
entityType: typeConfig.name,
|
|
92
|
+
plural: typeConfig.plural,
|
|
93
|
+
description: typeConfig.description || '',
|
|
94
|
+
fields: typeConfig.fields.map(fieldToTreeField),
|
|
95
|
+
subdirectoryContext: subdirContext,
|
|
96
|
+
leafCount: nodes.length,
|
|
97
|
+
leaves,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Filter edges to only include those connecting included leaves.
|
|
102
|
+
*/
|
|
103
|
+
function filterEdges(allEdges, includedKeys) {
|
|
104
|
+
return allEdges
|
|
105
|
+
.filter(e => includedKeys.has(e.source) && includedKeys.has(e.target))
|
|
106
|
+
.map(e => ({
|
|
107
|
+
source: e.source,
|
|
108
|
+
target: e.target,
|
|
109
|
+
edgeType: e.edgeType,
|
|
110
|
+
label: e.label,
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Build the full context tree based on scope.
|
|
115
|
+
*/
|
|
116
|
+
export async function buildContextTree(scope, globals) {
|
|
117
|
+
const entityTypes = await loadEntityTypes();
|
|
118
|
+
const entityTypeMap = new Map(entityTypes.map(t => [t.name, t]));
|
|
119
|
+
const index = getEntityIndex();
|
|
120
|
+
// 1. Always build trunk
|
|
121
|
+
const trunk = await buildTrunk(globals);
|
|
122
|
+
// 2. Build branches based on scope
|
|
123
|
+
let branches = [];
|
|
124
|
+
const includedLeafKeys = new Set();
|
|
125
|
+
switch (scope.type) {
|
|
126
|
+
case 'trunk': {
|
|
127
|
+
// All branches with metadata only (no leaves)
|
|
128
|
+
branches = await Promise.all(entityTypes.map(t => buildBranch(t, 'none')));
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
case 'branch': {
|
|
132
|
+
// Requested branches get leaf summaries; others get none
|
|
133
|
+
branches = await Promise.all(entityTypes.map(t => buildBranch(t, scope.branches.includes(t.name) ? 'summary' : 'none')));
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
case 'branch-full': {
|
|
137
|
+
// Requested branches get full content; others get none
|
|
138
|
+
branches = await Promise.all(entityTypes.map(t => buildBranch(t, scope.branches.includes(t.name) ? 'full' : 'none')));
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
case 'leaves': {
|
|
142
|
+
// Specific leaves + their branches
|
|
143
|
+
const leafTypes = new Set();
|
|
144
|
+
for (const key of scope.keys) {
|
|
145
|
+
const node = index.getNode(key);
|
|
146
|
+
if (node)
|
|
147
|
+
leafTypes.add(node.type);
|
|
148
|
+
}
|
|
149
|
+
// Build branches: types with requested leaves get summary, others none
|
|
150
|
+
branches = await Promise.all(entityTypes.map(t => buildBranch(t, leafTypes.has(t.name) ? 'summary' : 'none')));
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
case 'cross': {
|
|
154
|
+
// Requested branches get summaries
|
|
155
|
+
branches = await Promise.all(entityTypes.map(t => buildBranch(t, scope.branches.includes(t.name) ? 'summary' : 'none')));
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Collect all included leaf keys for edge filtering
|
|
160
|
+
for (const branch of branches) {
|
|
161
|
+
for (const leaf of branch.leaves) {
|
|
162
|
+
includedLeafKeys.add(leaf.key);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// 3. Filter edges to only those connecting included leaves
|
|
166
|
+
const edges = filterEdges(index.getAllEdges(), includedLeafKeys);
|
|
167
|
+
debug('context-tree', `Built tree: scope=${scope.type}, branches=${branches.length}, leaves=${includedLeafKeys.size}, edges=${edges.length}`);
|
|
168
|
+
return { trunk, branches, edges };
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Expand an existing context tree with additional branches (adds leaf summaries).
|
|
172
|
+
* Mutates the tree in place and returns it.
|
|
173
|
+
*/
|
|
174
|
+
export async function expandContextTree(tree, additionalBranches) {
|
|
175
|
+
const entityTypes = await loadEntityTypes();
|
|
176
|
+
const existingTypes = new Set(tree.branches.map(b => b.entityType));
|
|
177
|
+
for (const typeName of additionalBranches) {
|
|
178
|
+
if (existingTypes.has(typeName)) {
|
|
179
|
+
// Already present — upgrade from 'none' to 'summary' if needed
|
|
180
|
+
const existing = tree.branches.find(b => b.entityType === typeName);
|
|
181
|
+
if (existing.leaves.length === 0 && existing.leafCount > 0) {
|
|
182
|
+
const typeConfig = entityTypes.find(t => t.name === typeName);
|
|
183
|
+
if (typeConfig) {
|
|
184
|
+
const upgraded = await buildBranch(typeConfig, 'summary');
|
|
185
|
+
Object.assign(existing, upgraded);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const typeConfig = entityTypes.find(t => t.name === typeName);
|
|
191
|
+
if (typeConfig) {
|
|
192
|
+
const branch = await buildBranch(typeConfig, 'summary');
|
|
193
|
+
tree.branches.push(branch);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Rebuild included leaf keys and re-filter edges
|
|
197
|
+
const includedLeafKeys = new Set();
|
|
198
|
+
for (const branch of tree.branches) {
|
|
199
|
+
for (const leaf of branch.leaves) {
|
|
200
|
+
includedLeafKeys.add(leaf.key);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const index = getEntityIndex();
|
|
204
|
+
tree.edges = filterEdges(index.getAllEdges(), includedLeafKeys);
|
|
205
|
+
return tree;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=context-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-tree.js","sourceRoot":"","sources":["../../src/context/context-tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ContextScope } from './context-tree.js';
|
|
2
|
+
import type { EntityTypeConfig } from '../entities/entity-type-config.js';
|
|
3
|
+
import type { IndexStats } from '../entities/entity-index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Classify the appropriate context scope for a user's input.
|
|
6
|
+
* Rules are ordered by specificity — first match wins.
|
|
7
|
+
*/
|
|
8
|
+
export declare function classifyScope(userInput: string, entityTypes: EntityTypeConfig[], _stats: IndexStats): ContextScope;
|
|
9
|
+
//# sourceMappingURL=scope-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-classifier.d.ts","sourceRoot":"","sources":["../../src/context/scope-classifier.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAQ9D;;;GAGG;AACH,wBAAgB,aAAa,CACzB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,gBAAgB,EAAE,EAC/B,MAAM,EAAE,UAAU,GACnB,YAAY,CAiCd"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
// Scope Classifier — Heuristic scope selection for context tree
|
|
3
|
+
//
|
|
4
|
+
// Determines which parts of the context tree to materialize based on the
|
|
5
|
+
// user's input. Fast (sub-millisecond), no LLM call.
|
|
6
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
7
|
+
// Keywords that suggest the user wants to see all items
|
|
8
|
+
const FULL_KEYWORDS = /\b(all|every|reflect|review|list|summarize|summary|overview|report|show me|audit|analyze|breakdown|digest)\b/i;
|
|
9
|
+
// Keywords that suggest cross-type relationships
|
|
10
|
+
const CROSS_KEYWORDS = /\b(relat|connect|across|between|link|depend|impact|affect|overlap)\b/i;
|
|
11
|
+
/**
|
|
12
|
+
* Classify the appropriate context scope for a user's input.
|
|
13
|
+
* Rules are ordered by specificity — first match wins.
|
|
14
|
+
*/
|
|
15
|
+
export function classifyScope(userInput, entityTypes, _stats) {
|
|
16
|
+
const input = userInput.toLowerCase();
|
|
17
|
+
// 1. Detect which entity types are mentioned
|
|
18
|
+
const mentionedTypes = [];
|
|
19
|
+
for (const et of entityTypes) {
|
|
20
|
+
if (input.includes(et.name) || input.includes(et.plural)) {
|
|
21
|
+
mentionedTypes.push(et.name);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// 2. Cross-type keywords with multiple types mentioned
|
|
25
|
+
if (CROSS_KEYWORDS.test(input) && mentionedTypes.length >= 2) {
|
|
26
|
+
return { type: 'cross', branches: mentionedTypes };
|
|
27
|
+
}
|
|
28
|
+
// 3. Cross-type keywords without specific types → all branches
|
|
29
|
+
if (CROSS_KEYWORDS.test(input) && mentionedTypes.length === 0) {
|
|
30
|
+
return { type: 'cross', branches: entityTypes.map(t => t.name) };
|
|
31
|
+
}
|
|
32
|
+
// 4. Full keywords + type mentioned → branch-full for that type
|
|
33
|
+
if (FULL_KEYWORDS.test(input) && mentionedTypes.length > 0) {
|
|
34
|
+
return { type: 'branch-full', branches: mentionedTypes };
|
|
35
|
+
}
|
|
36
|
+
// 5. Type mentioned but no full/cross keywords → branch with summaries
|
|
37
|
+
if (mentionedTypes.length > 0) {
|
|
38
|
+
return { type: 'branch', branches: mentionedTypes };
|
|
39
|
+
}
|
|
40
|
+
// 6. Default — trunk only (lightweight for general chat)
|
|
41
|
+
return { type: 'trunk' };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=scope-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-classifier.js","sourceRoot":"","sources":["../../src/context/scope-classifier.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gEAAgE;AAChE,EAAE;AACF,yEAAyE;AACzE,qDAAqD;AACrD,gFAAgF;AAMhF,wDAAwD;AACxD,MAAM,aAAa,GAAG,+GAA+G,CAAC;AAEtI,iDAAiD;AACjD,MAAM,cAAc,GAAG,uEAAuE,CAAC;AAE/F;;;GAGG;AACH,MAAM,UAAU,aAAa,CACzB,SAAiB,EACjB,WAA+B,EAC/B,MAAkB;IAElB,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IAEtC,6CAA6C;IAC7C,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;IAED,uDAAuD;IACvD,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IACvD,CAAC;IAED,+DAA+D;IAC/D,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IACrE,CAAC;IAED,gEAAgE;IAChE,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC7D,CAAC;IAED,uEAAuE;IACvE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IACxD,CAAC;IAED,yDAAyD;IACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/feral/bootstrap.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAI/C,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/feral/bootstrap.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAI/C,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAiLpD;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC;CACtC;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAChC,cAAc,GAAE,aAAa,EAAO,GACrC,OAAO,CAAC,YAAY,CAAC,CAgEvB"}
|
package/dist/feral/bootstrap.js
CHANGED
|
@@ -40,6 +40,8 @@ import { ReadFileNodeCode } from './node-code/data/read-file-node-code.js';
|
|
|
40
40
|
import { LlmChatNodeCode } from './node-code/data/llm-chat-node-code.js';
|
|
41
41
|
import { CleanLlmJsonNodeCode } from './node-code/data/clean-llm-json-node-code.js';
|
|
42
42
|
import { WeatherNodeCode } from './node-code/data/weather-node-code.js';
|
|
43
|
+
import { QueryTokenUsageNodeCode } from './node-code/data/query-token-usage-node-code.js';
|
|
44
|
+
import { ChartTokenUsageNodeCode } from './node-code/data/chart-token-usage-node-code.js';
|
|
43
45
|
// Slack node codes
|
|
44
46
|
import { SlackBlockBuilderNodeCode } from './node-code/slack/slack-block-builder-node-code.js';
|
|
45
47
|
import { SlackPostWebhookNodeCode } from './node-code/slack/slack-post-webhook-node-code.js';
|
|
@@ -87,6 +89,7 @@ import { OutputCatalogSource } from './catalog/output-catalog-source.js';
|
|
|
87
89
|
import { IntrospectCatalogSource } from './catalog/introspect-catalog-source.js';
|
|
88
90
|
import { PampCatalogSource } from './catalog/pamp-catalog-source.js';
|
|
89
91
|
import { McpCatalogSource } from './catalog/mcp-catalog-source.js';
|
|
92
|
+
import { UsageCatalogSource } from './catalog/usage-catalog-source.js';
|
|
90
93
|
// System & output node codes
|
|
91
94
|
import { CliCommandNodeCode } from './node-code/system/cli-command-node-code.js';
|
|
92
95
|
import { IntrospectNodeCode } from './node-code/system/introspect-node-code.js';
|
|
@@ -100,6 +103,7 @@ import { PromptSelectNodeCode } from './node-code/input/prompt-select-node-code.
|
|
|
100
103
|
import { JsonProcessSource } from './process/json-process-source.js';
|
|
101
104
|
// Entity type schema
|
|
102
105
|
import { loadEntityTypes } from '../entities/entity-type-config.js';
|
|
106
|
+
import { getTrackedModels } from '../llm/token-usage.js';
|
|
103
107
|
/**
|
|
104
108
|
* All built-in NodeCode instances.
|
|
105
109
|
*/
|
|
@@ -128,6 +132,8 @@ function getBuiltInNodeCodes() {
|
|
|
128
132
|
new LlmChatNodeCode(),
|
|
129
133
|
new CleanLlmJsonNodeCode(),
|
|
130
134
|
new WeatherNodeCode(),
|
|
135
|
+
new QueryTokenUsageNodeCode(),
|
|
136
|
+
new ChartTokenUsageNodeCode(),
|
|
131
137
|
// Slack
|
|
132
138
|
new SlackBlockBuilderNodeCode(),
|
|
133
139
|
new SlackPostWebhookNodeCode(),
|
|
@@ -190,10 +196,11 @@ export async function bootstrapFeral(processSources = []) {
|
|
|
190
196
|
]);
|
|
191
197
|
// 2. Load catalog config, entity types, and MCP tools (parallel — independent)
|
|
192
198
|
const { mcpManager } = await import('../skills/mcp-manager.js');
|
|
193
|
-
const [catalogConfig, entityTypes, mcpTools] = await Promise.all([
|
|
199
|
+
const [catalogConfig, entityTypes, mcpTools, trackedModels] = await Promise.all([
|
|
194
200
|
loadFeralCatalogConfig(),
|
|
195
201
|
loadEntityTypes(),
|
|
196
202
|
mcpManager.discoverAllTools(),
|
|
203
|
+
getTrackedModels(),
|
|
197
204
|
]);
|
|
198
205
|
// 3. Build catalog from all sources
|
|
199
206
|
const catalog = new Catalog([
|
|
@@ -207,6 +214,7 @@ export async function bootstrapFeral(processSources = []) {
|
|
|
207
214
|
new IntrospectCatalogSource(),
|
|
208
215
|
new PampCatalogSource(),
|
|
209
216
|
new McpCatalogSource(mcpTools),
|
|
217
|
+
new UsageCatalogSource(trackedModels),
|
|
210
218
|
]);
|
|
211
219
|
// 4. Load process definitions from {vault}/.phaibel/processes/
|
|
212
220
|
const processDir = await getProcessesDir();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/feral/bootstrap.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAChF,EAAE;AACF,mDAAmD;AACnD,qDAAqD;AACrD,gFAAgF;AAEhF,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAI7D,sBAAsB;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,oDAAoD,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAC1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/feral/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-catalog-source.d.ts","sourceRoot":"","sources":["../../../src/feral/catalog/usage-catalog-source.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,MAAM,CAAW;gBAEb,MAAM,EAAE,MAAM,EAAE;IAI5B,eAAe,IAAI,WAAW,EAAE;CAqCnC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
// Feral CCF — Usage Catalog Source
|
|
3
|
+
//
|
|
4
|
+
// Pre-configured CatalogNodes for querying and charting LLM token usage.
|
|
5
|
+
// Generates a "query all" node plus per-model query nodes dynamically.
|
|
6
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
7
|
+
export class UsageCatalogSource {
|
|
8
|
+
models;
|
|
9
|
+
constructor(models) {
|
|
10
|
+
this.models = models;
|
|
11
|
+
}
|
|
12
|
+
getCatalogNodes() {
|
|
13
|
+
const nodes = [
|
|
14
|
+
// Query all models (aggregate daily totals)
|
|
15
|
+
{
|
|
16
|
+
key: 'query_all_token_usage',
|
|
17
|
+
nodeCodeKey: 'query_token_usage',
|
|
18
|
+
name: 'Query All Token Usage',
|
|
19
|
+
group: 'data',
|
|
20
|
+
description: 'Queries total LLM token usage across all models for the last 30 days. Stores daily totals in context.',
|
|
21
|
+
configuration: { model: 'all', days: '30', context_path: 'token_usage' },
|
|
22
|
+
},
|
|
23
|
+
// Chart token usage (reads from context after a query node)
|
|
24
|
+
{
|
|
25
|
+
key: 'chart_all_token_usage',
|
|
26
|
+
nodeCodeKey: 'chart_token_usage',
|
|
27
|
+
name: 'Chart Token Usage',
|
|
28
|
+
group: 'data',
|
|
29
|
+
description: 'Renders an SVG bar chart of token usage data. Must run after a query_token_usage node. Outputs chart HTML to context.',
|
|
30
|
+
configuration: { context_path: 'token_usage', chart_output: 'chart_html', title: 'Token Usage (Last 30 Days)' },
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
// Per-model query nodes
|
|
34
|
+
for (const model of this.models) {
|
|
35
|
+
const safeKey = model.replace(/[^a-z0-9]/gi, '_').toLowerCase();
|
|
36
|
+
nodes.push({
|
|
37
|
+
key: `query_${safeKey}_usage`,
|
|
38
|
+
nodeCodeKey: 'query_token_usage',
|
|
39
|
+
name: `Query ${model} Usage`,
|
|
40
|
+
group: 'data',
|
|
41
|
+
description: `Queries token usage for model "${model}" over the last 30 days.`,
|
|
42
|
+
configuration: { model, days: '30', context_path: 'token_usage' },
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return nodes;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=usage-catalog-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-catalog-source.js","sourceRoot":"","sources":["../../../src/feral/catalog/usage-catalog-source.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,mCAAmC;AACnC,EAAE;AACF,yEAAyE;AACzE,uEAAuE;AACvE,gFAAgF;AAIhF,MAAM,OAAO,kBAAkB;IACnB,MAAM,CAAW;IAEzB,YAAY,MAAgB;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,eAAe;QACX,MAAM,KAAK,GAAkB;YACzB,4CAA4C;YAC5C;gBACI,GAAG,EAAE,uBAAuB;gBAC5B,WAAW,EAAE,mBAAmB;gBAChC,IAAI,EAAE,uBAAuB;gBAC7B,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,uGAAuG;gBACpH,aAAa,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE;aAC3E;YACD,4DAA4D;YAC5D;gBACI,GAAG,EAAE,uBAAuB;gBAC5B,WAAW,EAAE,mBAAmB;gBAChC,IAAI,EAAE,mBAAmB;gBACzB,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,uHAAuH;gBACpI,aAAa,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,4BAA4B,EAAE;aAClH;SACJ,CAAC;QAEF,wBAAwB;QACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC;gBACP,GAAG,EAAE,SAAS,OAAO,QAAQ;gBAC7B,WAAW,EAAE,mBAAmB;gBAChC,IAAI,EAAE,SAAS,KAAK,QAAQ;gBAC5B,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,kCAAkC,KAAK,0BAA0B;gBAC9E,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE;aACpE,CAAC,CAAC;QACP,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Context } from '../../context/context.js';
|
|
2
|
+
import type { Result } from '../../result/result.js';
|
|
3
|
+
import type { ConfigurationDescription } from '../../configuration/configuration-description.js';
|
|
4
|
+
import { AbstractNodeCode } from '../abstract-node-code.js';
|
|
5
|
+
export declare class ChartTokenUsageNodeCode extends AbstractNodeCode {
|
|
6
|
+
static readonly configDescriptions: ConfigurationDescription[];
|
|
7
|
+
constructor();
|
|
8
|
+
process(context: Context): Promise<Result>;
|
|
9
|
+
private renderChart;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=chart-token-usage-node-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-token-usage-node-code.d.ts","sourceRoot":"","sources":["../../../../src/feral/node-code/data/chart-token-usage-node-code.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kDAAkD,CAAC;AACjG,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAI5D,qBAAa,uBAAwB,SAAQ,gBAAgB;IACzD,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,wBAAwB,EAAE,CAI5D;;IAWI,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBhD,OAAO,CAAC,WAAW;CAwGtB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
// Feral CCF — Chart Token Usage NodeCode
|
|
3
|
+
//
|
|
4
|
+
// Reads token usage data from context and produces an SVG bar chart.
|
|
5
|
+
// The chart is stored in context as HTML that the web client renders inline.
|
|
6
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
7
|
+
import { ResultStatus } from '../../result/result.js';
|
|
8
|
+
import { AbstractNodeCode } from '../abstract-node-code.js';
|
|
9
|
+
import { NodeCodeCategory } from '../node-code.js';
|
|
10
|
+
export class ChartTokenUsageNodeCode extends AbstractNodeCode {
|
|
11
|
+
static configDescriptions = [
|
|
12
|
+
{ key: 'context_path', name: 'Context Path', description: 'Context key holding the UsageSummary[] data.', type: 'string', default: 'token_usage' },
|
|
13
|
+
{ key: 'chart_output', name: 'Chart Output', description: 'Context key to store the rendered chart HTML.', type: 'string', default: 'chart_html' },
|
|
14
|
+
{ key: 'title', name: 'Title', description: 'Chart title.', type: 'string', default: 'Token Usage' },
|
|
15
|
+
];
|
|
16
|
+
constructor() {
|
|
17
|
+
super('chart_token_usage', 'Chart Token Usage', 'Renders a bar chart of token usage data as inline SVG.', NodeCodeCategory.DATA);
|
|
18
|
+
}
|
|
19
|
+
async process(context) {
|
|
20
|
+
const contextPath = this.getRequiredConfigValue('context_path', 'token_usage');
|
|
21
|
+
const chartOutput = this.getRequiredConfigValue('chart_output', 'chart_html');
|
|
22
|
+
const title = this.getRequiredConfigValue('title', 'Token Usage');
|
|
23
|
+
const usage = context.get(contextPath);
|
|
24
|
+
if (!usage || usage.length === 0) {
|
|
25
|
+
const emptyMsg = `<p style="color:#888;font-style:italic;">No token usage data available yet.</p>`;
|
|
26
|
+
context.set(chartOutput, emptyMsg);
|
|
27
|
+
return this.result(ResultStatus.OK, 'No usage data to chart.');
|
|
28
|
+
}
|
|
29
|
+
// Also check for per-model breakdown
|
|
30
|
+
const allByModel = context.get('all_usage_by_model');
|
|
31
|
+
const chart = this.renderChart(usage, allByModel || [], title);
|
|
32
|
+
context.set(chartOutput, chart);
|
|
33
|
+
return this.result(ResultStatus.OK, `Chart rendered with ${usage.length} data points.`);
|
|
34
|
+
}
|
|
35
|
+
renderChart(dailyTotals, allByModel, title) {
|
|
36
|
+
// Build daily totals bar chart
|
|
37
|
+
const W = 600;
|
|
38
|
+
const H = 280;
|
|
39
|
+
const PAD_LEFT = 60;
|
|
40
|
+
const PAD_RIGHT = 20;
|
|
41
|
+
const PAD_TOP = 40;
|
|
42
|
+
const PAD_BOTTOM = 60;
|
|
43
|
+
const chartW = W - PAD_LEFT - PAD_RIGHT;
|
|
44
|
+
const chartH = H - PAD_TOP - PAD_BOTTOM;
|
|
45
|
+
const maxTokens = Math.max(...dailyTotals.map(d => d.totalTokens), 1);
|
|
46
|
+
const barCount = dailyTotals.length;
|
|
47
|
+
const barGap = 2;
|
|
48
|
+
const barW = Math.max(4, (chartW - barGap * barCount) / barCount);
|
|
49
|
+
// Color palette for models
|
|
50
|
+
const MODEL_COLORS = {};
|
|
51
|
+
const PALETTE = ['#6366f1', '#f59e0b', '#10b981', '#f43f5e', '#8b5cf6', '#06b6d4', '#ec4899', '#84cc16'];
|
|
52
|
+
const models = [...new Set(allByModel.map(u => u.model))].sort();
|
|
53
|
+
models.forEach((m, i) => { MODEL_COLORS[m] = PALETTE[i % PALETTE.length]; });
|
|
54
|
+
// Build per-day per-model stacks
|
|
55
|
+
const dayMap = new Map();
|
|
56
|
+
for (const entry of allByModel) {
|
|
57
|
+
if (!dayMap.has(entry.date))
|
|
58
|
+
dayMap.set(entry.date, new Map());
|
|
59
|
+
const existing = dayMap.get(entry.date).get(entry.model) || 0;
|
|
60
|
+
dayMap.get(entry.date).set(entry.model, existing + entry.totalTokens);
|
|
61
|
+
}
|
|
62
|
+
let bars = '';
|
|
63
|
+
for (let i = 0; i < barCount; i++) {
|
|
64
|
+
const d = dailyTotals[i];
|
|
65
|
+
const x = PAD_LEFT + i * (barW + barGap);
|
|
66
|
+
const modelBreakdown = dayMap.get(d.date);
|
|
67
|
+
if (modelBreakdown && models.length > 1) {
|
|
68
|
+
// Stacked bar
|
|
69
|
+
let yOffset = 0;
|
|
70
|
+
for (const model of models) {
|
|
71
|
+
const tokens = modelBreakdown.get(model) || 0;
|
|
72
|
+
const segH = (tokens / maxTokens) * chartH;
|
|
73
|
+
const y = PAD_TOP + chartH - yOffset - segH;
|
|
74
|
+
bars += `<rect x="${x}" y="${y}" width="${barW}" height="${segH}" fill="${MODEL_COLORS[model]}" rx="1">` +
|
|
75
|
+
`<title>${d.date}\n${model}: ${tokens.toLocaleString()} tokens</title></rect>`;
|
|
76
|
+
yOffset += segH;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Single bar
|
|
81
|
+
const barH = (d.totalTokens / maxTokens) * chartH;
|
|
82
|
+
const y = PAD_TOP + chartH - barH;
|
|
83
|
+
bars += `<rect x="${x}" y="${y}" width="${barW}" height="${barH}" fill="#6366f1" rx="1">` +
|
|
84
|
+
`<title>${d.date}: ${d.totalTokens.toLocaleString()} tokens (${d.calls} calls)</title></rect>`;
|
|
85
|
+
}
|
|
86
|
+
// X-axis labels (every few bars to avoid crowding)
|
|
87
|
+
const labelInterval = Math.max(1, Math.floor(barCount / 7));
|
|
88
|
+
if (i % labelInterval === 0 || i === barCount - 1) {
|
|
89
|
+
const label = d.date.slice(5); // MM-DD
|
|
90
|
+
bars += `<text x="${x + barW / 2}" y="${H - PAD_BOTTOM + 16}" text-anchor="middle" ` +
|
|
91
|
+
`fill="#888" font-size="10" font-family="sans-serif">${label}</text>`;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Y-axis labels
|
|
95
|
+
const ySteps = 4;
|
|
96
|
+
let yLabels = '';
|
|
97
|
+
for (let i = 0; i <= ySteps; i++) {
|
|
98
|
+
const val = Math.round((maxTokens / ySteps) * i);
|
|
99
|
+
const y = PAD_TOP + chartH - (i / ySteps) * chartH;
|
|
100
|
+
const label = val >= 1000000 ? (val / 1000000).toFixed(1) + 'M'
|
|
101
|
+
: val >= 1000 ? (val / 1000).toFixed(0) + 'k'
|
|
102
|
+
: String(val);
|
|
103
|
+
yLabels += `<text x="${PAD_LEFT - 8}" y="${y + 4}" text-anchor="end" fill="#888" font-size="10" font-family="sans-serif">${label}</text>`;
|
|
104
|
+
yLabels += `<line x1="${PAD_LEFT}" y1="${y}" x2="${W - PAD_RIGHT}" y2="${y}" stroke="#333" stroke-width="0.5"/>`;
|
|
105
|
+
}
|
|
106
|
+
// Legend (if multiple models)
|
|
107
|
+
let legend = '';
|
|
108
|
+
if (models.length > 1) {
|
|
109
|
+
const legendY = H - 10;
|
|
110
|
+
let legendX = PAD_LEFT;
|
|
111
|
+
for (const model of models) {
|
|
112
|
+
legend += `<rect x="${legendX}" y="${legendY - 8}" width="10" height="10" fill="${MODEL_COLORS[model]}" rx="2"/>`;
|
|
113
|
+
legend += `<text x="${legendX + 14}" y="${legendY}" fill="#ccc" font-size="10" font-family="sans-serif">${model}</text>`;
|
|
114
|
+
legendX += 14 + model.length * 6 + 16;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Summary stats
|
|
118
|
+
const totalTokens = dailyTotals.reduce((s, d) => s + d.totalTokens, 0);
|
|
119
|
+
const totalCalls = dailyTotals.reduce((s, d) => s + d.calls, 0);
|
|
120
|
+
const avgPerDay = Math.round(totalTokens / (barCount || 1));
|
|
121
|
+
const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${W} ${H + (models.length > 1 ? 20 : 0)}" ` +
|
|
122
|
+
`style="width:100%;max-width:${W}px;background:#111;border-radius:8px;padding:4px;">` +
|
|
123
|
+
`<text x="${W / 2}" y="24" text-anchor="middle" fill="#e8e8ef" font-size="14" font-weight="600" font-family="sans-serif">${title}</text>` +
|
|
124
|
+
yLabels + bars + legend +
|
|
125
|
+
`</svg>`;
|
|
126
|
+
const stats = `**${totalTokens.toLocaleString()}** total tokens | **${totalCalls.toLocaleString()}** API calls | **${avgPerDay.toLocaleString()}** avg/day`;
|
|
127
|
+
return svg + '\n\n' + stats;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=chart-token-usage-node-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-token-usage-node-code.js","sourceRoot":"","sources":["../../../../src/feral/node-code/data/chart-token-usage-node-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Context } from '../../context/context.js';
|
|
2
|
+
import type { Result } from '../../result/result.js';
|
|
3
|
+
import type { ConfigurationDescription } from '../../configuration/configuration-description.js';
|
|
4
|
+
import { AbstractNodeCode } from '../abstract-node-code.js';
|
|
5
|
+
export declare class QueryTokenUsageNodeCode extends AbstractNodeCode {
|
|
6
|
+
static readonly configDescriptions: ConfigurationDescription[];
|
|
7
|
+
constructor();
|
|
8
|
+
process(context: Context): Promise<Result>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=query-token-usage-node-code.d.ts.map
|