opencode-metrics-plugin 0.1.5
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/LICENSE +21 -0
- package/README.md +390 -0
- package/dist/backfill-cli.d.ts +1 -0
- package/dist/backfill-cli.js +74 -0
- package/dist/backfill.d.ts +58 -0
- package/dist/backfill.js +550 -0
- package/dist/compile-analyzer.d.ts +40 -0
- package/dist/compile-analyzer.js +161 -0
- package/dist/dirs.d.ts +34 -0
- package/dist/dirs.js +44 -0
- package/dist/event-logger.d.ts +20 -0
- package/dist/event-logger.js +329 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.js +61 -0
- package/dist/logger.d.ts +10 -0
- package/dist/logger.js +76 -0
- package/dist/metrics-engine.d.ts +37 -0
- package/dist/metrics-engine.js +331 -0
- package/dist/metrics-handlers.d.ts +9 -0
- package/dist/metrics-handlers.js +648 -0
- package/dist/metrics-output.d.ts +11 -0
- package/dist/metrics-output.js +673 -0
- package/dist/metrics-steps.d.ts +19 -0
- package/dist/metrics-steps.js +90 -0
- package/dist/metrics-types.d.ts +381 -0
- package/dist/metrics-types.js +102 -0
- package/dist/summary-store.d.ts +150 -0
- package/dist/summary-store.js +560 -0
- package/package.json +43 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import type { MetricsDirs } from "./dirs.js";
|
|
3
|
+
import type { MetricsOutput, RoundSnapshot, StepData, SubAgentOutput, TokenUsage } from "./metrics-types.js";
|
|
4
|
+
/** 打开(或复用)摘要库连接:建目录 + WAL + busy_timeout + 幂等建表;不可用返回 null。 */
|
|
5
|
+
export declare function openSummaryDb(summaryFile: string): DatabaseSync | null;
|
|
6
|
+
/** 关闭全部缓存的连接(宿主 dispose 时可选调用)。 */
|
|
7
|
+
export declare function closeSummaryDbs(): void;
|
|
8
|
+
/** 归一化 created_at(number 时间戳 / ISO 字符串 / Date)为 ISO 字符串。 */
|
|
9
|
+
export declare function toIsoString(value: string | number | Date | null | undefined): string | null;
|
|
10
|
+
/** 从 rounds 提取首条用户消息(兼容 string 与 string[] 形态)。 */
|
|
11
|
+
export declare function firstUserMessageOf(rounds: RoundSnapshot[] | undefined): string | undefined;
|
|
12
|
+
export interface SummaryFields {
|
|
13
|
+
sessionId: string;
|
|
14
|
+
taskId: string | null;
|
|
15
|
+
agent: string;
|
|
16
|
+
model: string;
|
|
17
|
+
directory: string;
|
|
18
|
+
title: string | null;
|
|
19
|
+
firstUserMessage: string | null;
|
|
20
|
+
stepCount: number;
|
|
21
|
+
toolCalls: number;
|
|
22
|
+
totalTokensInput: number;
|
|
23
|
+
totalTokensOutput: number;
|
|
24
|
+
totalTokensCacheRead: number;
|
|
25
|
+
totalTokensCacheWrite: number;
|
|
26
|
+
totalTokensReasoning: number;
|
|
27
|
+
totalTokens: number;
|
|
28
|
+
duration: number;
|
|
29
|
+
createdAt: string | null;
|
|
30
|
+
sourceFile: string;
|
|
31
|
+
}
|
|
32
|
+
/** 摘要表一行所需的全部字段(文件→表共用的提取逻辑)。 */
|
|
33
|
+
export declare function extractSummaryFields(m: MetricsOutput, filePath: string): SummaryFields;
|
|
34
|
+
export type UpsertMode = "force" | "soft";
|
|
35
|
+
/** 快照双表入库(事务内 summary + detail;source_file 保留首见值)。返回是否成功。 */
|
|
36
|
+
export declare function upsertSessionSnapshot(summaryFile: string, snapshot: MetricsOutput, filePath: string, mode?: UpsertMode): boolean;
|
|
37
|
+
export interface SessionSummary {
|
|
38
|
+
id: string;
|
|
39
|
+
directory: string;
|
|
40
|
+
model: string;
|
|
41
|
+
agent: string;
|
|
42
|
+
title?: string;
|
|
43
|
+
stepCount: number;
|
|
44
|
+
totalTokens: TokenUsage;
|
|
45
|
+
mainTokens?: TokenUsage;
|
|
46
|
+
subagentTokens?: TokenUsage;
|
|
47
|
+
subagentCount?: number;
|
|
48
|
+
totalCost: number;
|
|
49
|
+
duration: number;
|
|
50
|
+
createdAt: string;
|
|
51
|
+
startTime?: number;
|
|
52
|
+
endTime?: number;
|
|
53
|
+
toolCalls: number;
|
|
54
|
+
successRate: number;
|
|
55
|
+
firstUserMessage?: string;
|
|
56
|
+
filePath?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface SubagentView {
|
|
59
|
+
sessionId: string;
|
|
60
|
+
agent: string;
|
|
61
|
+
title: string;
|
|
62
|
+
tokens: TokenUsage;
|
|
63
|
+
tools: SubAgentOutput["tools"];
|
|
64
|
+
userMessages?: string[];
|
|
65
|
+
/** 完整步骤(仅 full 模式下发;默认摘要化为 stepCount 懒加载) */
|
|
66
|
+
steps?: StepData[];
|
|
67
|
+
stepCount?: number;
|
|
68
|
+
}
|
|
69
|
+
export interface SessionDetail extends SessionSummary {
|
|
70
|
+
steps: StepData[];
|
|
71
|
+
tools: MetricsOutput["tools"];
|
|
72
|
+
codeStats?: MetricsOutput["codeStats"];
|
|
73
|
+
rounds: RoundSnapshot[];
|
|
74
|
+
subagents?: SubagentView[];
|
|
75
|
+
skills?: MetricsOutput["skills"];
|
|
76
|
+
planning?: MetricsOutput["planning"];
|
|
77
|
+
systemPrompts?: Record<string, string[]>;
|
|
78
|
+
}
|
|
79
|
+
/** 逐元素累加 token 用量。 */
|
|
80
|
+
export declare function sumTokens(items: TokenUsage[]): TokenUsage;
|
|
81
|
+
/** a 减去 b(用于剥离子代理 token 得 main tokens)。 */
|
|
82
|
+
export declare function subtractTokens(a: TokenUsage, b: TokenUsage): TokenUsage;
|
|
83
|
+
/** 快照 → 列表摘要(含 subagent 拆分出的 main/subagent tokens)。 */
|
|
84
|
+
export declare function snapshotToSummary(m: MetricsOutput, filePath?: string): SessionSummary;
|
|
85
|
+
/** 快照 → 详情;默认子代理摘要化(steps 抽为 stepCount,完整 steps 走 getSubagentSteps 懒加载)。 */
|
|
86
|
+
export declare function detailFromRaw(raw: MetricsOutput, opts?: {
|
|
87
|
+
keepSubagentSteps?: boolean;
|
|
88
|
+
}): SessionDetail;
|
|
89
|
+
/** 保留完整子代理 steps 的详情(供直接渲染子代理树的宿主使用)。 */
|
|
90
|
+
export declare function detailFullFromRaw(raw: MetricsOutput): SessionDetail;
|
|
91
|
+
export interface SummaryFilter {
|
|
92
|
+
/** 单个 agent(精确) */
|
|
93
|
+
agent?: string;
|
|
94
|
+
/** agent 名单(IN 精确) */
|
|
95
|
+
agents?: string[];
|
|
96
|
+
/** 任务分组(宿主经 setSessionTaskId 标记) */
|
|
97
|
+
taskId?: string;
|
|
98
|
+
/** 工作目录前缀(反斜杠归一 + 大小写不敏感) */
|
|
99
|
+
directoryPrefix?: string;
|
|
100
|
+
model?: string;
|
|
101
|
+
/** 会话 id 名单(IN 精确;宿主按 sessionId 集合聚合汇总用) */
|
|
102
|
+
sessionIds?: string[];
|
|
103
|
+
/** created_at 下界(ISO 或毫秒时间戳) */
|
|
104
|
+
since?: string | number;
|
|
105
|
+
/** created_at 上界(ISO 或毫秒时间戳) */
|
|
106
|
+
until?: string | number;
|
|
107
|
+
limit?: number;
|
|
108
|
+
offset?: number;
|
|
109
|
+
}
|
|
110
|
+
/** 摘要筛选查询(created_at 倒序;目录/筛选参数归一后走 SQL)。同步函数。 */
|
|
111
|
+
export declare function querySummaries(filter?: SummaryFilter, dirs?: Partial<MetricsDirs>): SessionSummary[];
|
|
112
|
+
/** 按同一筛选条件计数(分页用)。 */
|
|
113
|
+
export declare function countSummaries(filter?: SummaryFilter, dirs?: Partial<MetricsDirs>): number;
|
|
114
|
+
/** 单会话详情(DB full_data → 文件回退);默认子代理摘要化,fullSubagents=true 保留完整 steps。 */
|
|
115
|
+
export declare function getDetail(sessionId: string, dirs?: Partial<MetricsDirs>, opts?: {
|
|
116
|
+
fullSubagents?: boolean;
|
|
117
|
+
}): SessionDetail | null;
|
|
118
|
+
/** 子代理完整 steps 懒加载(DB full_data → 文件回退)。 */
|
|
119
|
+
export declare function getSubagentSteps(sessionId: string, index: number, dirs?: Partial<MetricsDirs>): StepData[] | null;
|
|
120
|
+
/** 原始快照 JSON 字符串(文件优先 → DB full_data 回退;等价"下载"能力)。 */
|
|
121
|
+
export declare function getSessionRaw(sessionId: string, dirs?: Partial<MetricsDirs>): string | null;
|
|
122
|
+
/** 给会话标记任务分组(宿主任务关联)。返回是否命中行。 */
|
|
123
|
+
export declare function setSessionTaskId(sessionId: string, taskId: string | null, dirs?: Partial<MetricsDirs>): boolean;
|
|
124
|
+
export interface ReindexResult {
|
|
125
|
+
scanned: number;
|
|
126
|
+
upserted: number;
|
|
127
|
+
pruned: number;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 扫描 metricsDir 现有快照 JSON 重建摘要行(soft:live 已有数据不覆盖)。
|
|
131
|
+
* 摘要库缺省为全局共享库(多宿主聚合);显式 summaryFile 可指向隔离库。
|
|
132
|
+
* prune=true 时清理 source_file 已不存在于磁盘的孤儿行(双表同删)——
|
|
133
|
+
* 共享库语义下会清理**全库**的孤儿行(含其他宿主目录已消失的快照),属预期行为。
|
|
134
|
+
*/
|
|
135
|
+
export declare function reindexDir(metricsDir: string, opts?: {
|
|
136
|
+
summaryFile?: string;
|
|
137
|
+
prune?: boolean;
|
|
138
|
+
}): ReindexResult;
|
|
139
|
+
export interface RemoveSessionResult {
|
|
140
|
+
deleted: boolean;
|
|
141
|
+
/** 被删摘要行的 source_file(供宿主清理快照文件/事件日志) */
|
|
142
|
+
sourceFile?: string;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 删除双表中的会话行(宿主删除链路用)。
|
|
146
|
+
* 返回是否删除及被删行的 source_file;库不存在/行不存在时 deleted=false。
|
|
147
|
+
*/
|
|
148
|
+
export declare function removeSession(sessionId: string, dirs?: Partial<MetricsDirs>): RemoveSessionResult;
|
|
149
|
+
/** 进程级默认摘要库路径(与 getMetricsDir/getEventsDir 对称的便捷取法)。 */
|
|
150
|
+
export declare function getDefaultSummaryFile(): string;
|