@lumenflow/cli 5.7.18 → 5.7.21
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 +63 -61
- package/dist/agent-runtime-enrollment-events.js +1 -1
- package/dist/agent-runtime-enrollment-events.js.map +1 -1
- package/dist/cost-summary.js +160 -3
- package/dist/cost-summary.js.map +1 -1
- package/dist/events-validate-core.js +169 -0
- package/dist/events-validate-core.js.map +1 -0
- package/dist/events-validate.js +48 -0
- package/dist/events-validate.js.map +1 -0
- package/dist/orchestrate-pre-phase-audit.js +83 -0
- package/dist/orchestrate-pre-phase-audit.js.map +1 -0
- package/dist/public-manifest.js +18 -2
- package/dist/public-manifest.js.map +1 -1
- package/dist/wu-claim-branch.js +2 -2
- package/dist/wu-claim-branch.js.map +1 -1
- package/dist/wu-claim-worktree.js +1 -1
- package/dist/wu-claim-worktree.js.map +1 -1
- package/dist/wu-claim.js +1 -1
- package/dist/wu-claim.js.map +1 -1
- package/dist/wu-create-orchestration-advisory.js +32 -0
- package/dist/wu-create-orchestration-advisory.js.map +1 -0
- package/dist/wu-create.js +24 -3
- package/dist/wu-create.js.map +1 -1
- package/dist/wu-proto.js +72 -6
- package/dist/wu-proto.js.map +1 -1
- package/dist/wu-spawn-strategy-resolver.js +74 -3
- package/dist/wu-spawn-strategy-resolver.js.map +1 -1
- package/package.json +13 -11
- package/packs/agent-runtime/package.json +1 -1
- package/packs/sidekick/package.json +1 -1
- package/packs/software-delivery/package.json +1 -1
- package/templates/core/AGENTS.md.template +4 -4
- package/templates/core/LUMENFLOW.md.template +5 -5
- package/templates/core/ai/onboarding/agent-invocation-guide.md.template +10 -4
- package/templates/core/ai/onboarding/quick-ref-commands.md.template +6 -2
package/README.md
CHANGED
|
@@ -51,38 +51,38 @@ This package provides CLI commands for the LumenFlow workflow framework, includi
|
|
|
51
51
|
|
|
52
52
|
### Work Unit Management
|
|
53
53
|
|
|
54
|
-
| Command | Description
|
|
55
|
-
| ------------------ |
|
|
56
|
-
| `approval-list` | List control-plane approvals with optional filters
|
|
57
|
-
| `approval-request` | Request control-plane approval for a workflow action
|
|
58
|
-
| `approval-review` | Resolve a control-plane approval decision
|
|
59
|
-
| `wu-block` | Block WU with reason
|
|
60
|
-
| `wu-brief` | Generate the canonical full WU handoff prompt and
|
|
61
|
-
| `wu-claim` | Claim WU and create worktree
|
|
62
|
-
| `wu-cleanup` | Cleanup after PR merge
|
|
63
|
-
| `wu-create` | Create new WU spec
|
|
64
|
-
| `wu-delegate` | Generate the canonical delegation handoff prompt and record explicit lineage intent
|
|
65
|
-
| `wu-delete` | Delete WU spec and cleanup
|
|
66
|
-
| `wu-deps` | Show WU dependencies
|
|
67
|
-
| `wu-done` | Complete WU (merge, stamp, cleanup) from main
|
|
68
|
-
| `wu-edit` | Edit WU spec fields
|
|
69
|
-
| `wu-escalate` | Show or resolve WU escalation status
|
|
70
|
-
| `wu-infer-lane` | Infer lane from code paths/description using workspace definitions
|
|
71
|
-
| `wu-preflight` | Pre-flight checks before wu:done
|
|
72
|
-
| `wu-prep` | Run gates in worktree, prep for wu:done
|
|
73
|
-
| `wu-proto` | Create WU prototype
|
|
74
|
-
| `wu-prune` | Clean stale worktrees
|
|
75
|
-
| `wu-recover` | Analyze and fix WU state inconsistencies
|
|
76
|
-
| `wu-release` | Release orphaned WU (in_progress to ready)
|
|
77
|
-
| `wu-rename` | Rename a WU (canonical WU IDs, --replay-only supported)
|
|
78
|
-
| `wu-repair` | Repair WU state issues
|
|
79
|
-
| `wu-review` | Review a WU worktree against the configured integration target
|
|
80
|
-
| `wu-sandbox` | Run command through hardened WU sandbox backend
|
|
81
|
-
| `wu-status` | Show WU status, location, valid commands
|
|
82
|
-
| `wu-unblock` | Unblock WU
|
|
83
|
-
| `wu-unlock-lane` | Unlock stuck lane
|
|
84
|
-
| `wu-validate` | Validate WU spec
|
|
85
|
-
| `wu-verify` | Verify WU completion (stamp, commit, clean tree)
|
|
54
|
+
| Command | Description |
|
|
55
|
+
| ------------------ | --------------------------------------------------------------------------------------------------- |
|
|
56
|
+
| `approval-list` | List control-plane approvals with optional filters |
|
|
57
|
+
| `approval-request` | Request control-plane approval for a workflow action |
|
|
58
|
+
| `approval-review` | Resolve a control-plane approval decision |
|
|
59
|
+
| `wu-block` | Block WU with reason |
|
|
60
|
+
| `wu-brief` | Generate the canonical full WU handoff prompt, record evidence, and optionally report prompt tokens |
|
|
61
|
+
| `wu-claim` | Claim WU and create worktree |
|
|
62
|
+
| `wu-cleanup` | Cleanup after PR merge |
|
|
63
|
+
| `wu-create` | Create new WU spec |
|
|
64
|
+
| `wu-delegate` | Generate the canonical delegation handoff prompt and record explicit lineage intent |
|
|
65
|
+
| `wu-delete` | Delete WU spec and cleanup |
|
|
66
|
+
| `wu-deps` | Show WU dependencies |
|
|
67
|
+
| `wu-done` | Complete WU (merge, stamp, cleanup) from main |
|
|
68
|
+
| `wu-edit` | Edit WU spec fields |
|
|
69
|
+
| `wu-escalate` | Show or resolve WU escalation status |
|
|
70
|
+
| `wu-infer-lane` | Infer lane from code paths/description using workspace definitions |
|
|
71
|
+
| `wu-preflight` | Pre-flight checks before wu:done |
|
|
72
|
+
| `wu-prep` | Run gates in worktree, prep for wu:done |
|
|
73
|
+
| `wu-proto` | Create WU prototype |
|
|
74
|
+
| `wu-prune` | Clean stale worktrees |
|
|
75
|
+
| `wu-recover` | Analyze and fix WU state inconsistencies |
|
|
76
|
+
| `wu-release` | Release orphaned WU (in_progress to ready) |
|
|
77
|
+
| `wu-rename` | Rename a WU (canonical WU IDs, --replay-only supported) |
|
|
78
|
+
| `wu-repair` | Repair WU state issues |
|
|
79
|
+
| `wu-review` | Review a WU worktree against the configured integration target |
|
|
80
|
+
| `wu-sandbox` | Run command through hardened WU sandbox backend |
|
|
81
|
+
| `wu-status` | Show WU status, location, valid commands |
|
|
82
|
+
| `wu-unblock` | Unblock WU |
|
|
83
|
+
| `wu-unlock-lane` | Unlock stuck lane |
|
|
84
|
+
| `wu-validate` | Validate WU spec |
|
|
85
|
+
| `wu-verify` | Verify WU completion (stamp, commit, clean tree) |
|
|
86
86
|
|
|
87
87
|
### Memory & Session
|
|
88
88
|
|
|
@@ -109,38 +109,39 @@ This package provides CLI commands for the LumenFlow workflow framework, includi
|
|
|
109
109
|
|
|
110
110
|
### Initiative Orchestration
|
|
111
111
|
|
|
112
|
-
| Command
|
|
113
|
-
|
|
|
114
|
-
| `agent-issues-query`
|
|
115
|
-
| `agent-log-issue`
|
|
116
|
-
| `agent-session`
|
|
117
|
-
| `agent-session-end`
|
|
118
|
-
| `delegation-list`
|
|
119
|
-
| `initiative-add-wu`
|
|
120
|
-
| `initiative-bulk-assign-wus`
|
|
121
|
-
| `initiative-create`
|
|
122
|
-
| `initiative-delete`
|
|
123
|
-
| `initiative-edit`
|
|
124
|
-
| `initiative-list`
|
|
125
|
-
| `initiative-plan`
|
|
126
|
-
| `initiative-remove-wu`
|
|
127
|
-
| `initiative-rename`
|
|
128
|
-
| `initiative-status`
|
|
129
|
-
| `orchestrate-init-status`
|
|
130
|
-
| `orchestrate-initiative`
|
|
131
|
-
| `orchestrate-monitor`
|
|
132
|
-
| `
|
|
112
|
+
| Command | Description |
|
|
113
|
+
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
114
|
+
| `agent-issues-query` | Query GitHub issues for agent work |
|
|
115
|
+
| `agent-log-issue` | Log issue during agent session |
|
|
116
|
+
| `agent-session` | Start agent session |
|
|
117
|
+
| `agent-session-end` | End agent session |
|
|
118
|
+
| `delegation-list` | List delegation and launch records with planned-versus-launched state |
|
|
119
|
+
| `initiative-add-wu` | Add WU to initiative |
|
|
120
|
+
| `initiative-bulk-assign-wus` | Bulk assign WUs to initiative |
|
|
121
|
+
| `initiative-create` | Create new initiative |
|
|
122
|
+
| `initiative-delete` | Delete an initiative with explicit linked-WU safeguards |
|
|
123
|
+
| `initiative-edit` | Edit initiative fields and phase metadata |
|
|
124
|
+
| `initiative-list` | List all initiatives |
|
|
125
|
+
| `initiative-plan` | Link plan to initiative |
|
|
126
|
+
| `initiative-remove-wu` | Remove WU from initiative |
|
|
127
|
+
| `initiative-rename` | Rename an initiative and rewrite linked references |
|
|
128
|
+
| `initiative-status` | Show initiative status |
|
|
129
|
+
| `orchestrate-init-status` | Compact initiative status with evidence-based orchestration state |
|
|
130
|
+
| `orchestrate-initiative` | Plan, launch, and reconcile initiative execution with structured orchestration artifacts; launch modes print lean summaries by default and can replay stored handoffs inline |
|
|
131
|
+
| `orchestrate-monitor` | Monitor orchestration progress, stalls, returned workers, and recovery signals |
|
|
132
|
+
| `orchestrate-pre-phase-audit` | Print a read-only pre-phase audit checklist before creating phase WUs |
|
|
133
|
+
| `task-claim` | Claim a task directly through KernelRuntime |
|
|
133
134
|
|
|
134
135
|
### Metrics & Analytics
|
|
135
136
|
|
|
136
|
-
| Command | Description
|
|
137
|
-
| ------------------- |
|
|
138
|
-
| `cost-summary` | Summarize local cost telemetry |
|
|
139
|
-
| `flow-bottlenecks` | Identify flow bottlenecks
|
|
140
|
-
| `flow-report` | Generate flow metrics report
|
|
141
|
-
| `lumenflow-metrics` | View workflow metrics (alias)
|
|
142
|
-
| `metrics` | View workflow metrics
|
|
143
|
-
| `metrics-snapshot` | Capture metrics snapshot
|
|
137
|
+
| Command | Description |
|
|
138
|
+
| ------------------- | ------------------------------------------------------------ |
|
|
139
|
+
| `cost-summary` | Summarize local cost telemetry or brief metrics with --brief |
|
|
140
|
+
| `flow-bottlenecks` | Identify flow bottlenecks |
|
|
141
|
+
| `flow-report` | Generate flow metrics report |
|
|
142
|
+
| `lumenflow-metrics` | View workflow metrics (alias) |
|
|
143
|
+
| `metrics` | View workflow metrics |
|
|
144
|
+
| `metrics-snapshot` | Capture metrics snapshot |
|
|
144
145
|
|
|
145
146
|
### Lane Tooling
|
|
146
147
|
|
|
@@ -161,6 +162,7 @@ This package provides CLI commands for the LumenFlow workflow framework, includi
|
|
|
161
162
|
|
|
162
163
|
| Command | Description |
|
|
163
164
|
| ---------------------------- | ------------------------------------------------------------------ |
|
|
165
|
+
| `events-validate` | Validate event payloads against the published schema catalog |
|
|
164
166
|
| `gate-co-change` | Manage co-change gate rules (add, remove, edit, list) |
|
|
165
167
|
| `gate-conditional` | Manage conditional_commands gate entries (add, remove, edit, list) |
|
|
166
168
|
| `gates` | Run all quality gates |
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// SPDX-License-Identifier: LicenseRef-LumenFlow-Proprietary
|
|
3
3
|
import { buildKernelEventV2 } from './kernel-event-sync/emitters.js';
|
|
4
4
|
export const AGENT_RUNTIME_CHANNEL_ID = 'agent-runtime';
|
|
5
|
-
const AGENT_RUNTIME_ENROLLMENT_EVENT_KINDS = {
|
|
5
|
+
export const AGENT_RUNTIME_ENROLLMENT_EVENT_KINDS = {
|
|
6
6
|
AGENT_SESSION_ENROLLED: 'agent-runtime:agent_session_enrolled',
|
|
7
7
|
AGENT_SESSION_ENDED: 'agent-runtime:agent_session_ended',
|
|
8
8
|
AGENT_SESSION_STALLED: 'agent-runtime:agent_session_stalled',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runtime-enrollment-events.js","sourceRoot":"","sources":["../src/agent-runtime-enrollment-events.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,4DAA4D;AAE5D,OAAO,EAAE,kBAAkB,EAAgC,MAAM,iCAAiC,CAAC;AAEnG,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAwB,CAAC;AAEjE,MAAM,oCAAoC,GAAG;
|
|
1
|
+
{"version":3,"file":"agent-runtime-enrollment-events.js","sourceRoot":"","sources":["../src/agent-runtime-enrollment-events.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,4DAA4D;AAE5D,OAAO,EAAE,kBAAkB,EAAgC,MAAM,iCAAiC,CAAC;AAEnG,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAwB,CAAC;AAEjE,MAAM,CAAC,MAAM,oCAAoC,GAAG;IAClD,sBAAsB,EAAE,sCAAsC;IAC9D,mBAAmB,EAAE,mCAAmC;IACxD,qBAAqB,EAAE,qCAAqC;CACpD,CAAC;AAoCX,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAErD,MAAM,UAAU,8BAA8B,CAC5C,KAAqF,EACrF,OAAiC;IAEjC,OAAO,oBAAoB,CACzB;QACE,IAAI,EAAE,oCAAoC,CAAC,sBAAsB;QACjE,GAAG,KAAK;KACT,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,KAAkF,EAClF,OAAiC;IAEjC,OAAO,oBAAoB,CACzB;QACE,IAAI,EAAE,oCAAoC,CAAC,mBAAmB;QAC9D,GAAG,KAAK;KACT,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,KAAoF,EACpF,OAAiC;IAEjC,OAAO,oBAAoB,CACzB;QACE,IAAI,EAAE,oCAAoC,CAAC,qBAAqB;QAChE,GAAG,KAAK;KACT,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAAU,EACV,OAAiC;IAEjC,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAgB,EAAE,OAAO,CAI7D,CAAC;IAEF,OAAO;QACL,GAAG,SAAS;QACZ,GAAG,OAAO;QACV,UAAU,EAAE,wBAAwB;QACpC,GAAG,EAAE,OAAO,CAAC,wBAAwB,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,SAAiB;IAChC,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;IACzB,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/cost-summary.js
CHANGED
|
@@ -5,9 +5,11 @@ import { existsSync, readFileSync } from 'node:fs';
|
|
|
5
5
|
import { Command } from 'commander';
|
|
6
6
|
import { runCLI } from './cli-entry-point.js';
|
|
7
7
|
const DEFAULT_COSTS_PATH = '.lumenflow/telemetry/costs.ndjson';
|
|
8
|
+
export const DEFAULT_BRIEF_METRICS_PATH = '.lumenflow/telemetry/brief-metrics.ndjson';
|
|
8
9
|
const DEFAULT_GROUP_KEY = 'unknown';
|
|
9
10
|
const LOG_PREFIX = '[cost:summary]';
|
|
10
11
|
const SOURCE_TYPE_COST = 'cost';
|
|
12
|
+
const BRIEF_METRIC_KIND = 'brief:token_reported';
|
|
11
13
|
function asNonEmptyString(value) {
|
|
12
14
|
if (typeof value !== 'string')
|
|
13
15
|
return undefined;
|
|
@@ -72,6 +74,87 @@ export function readCostEvents(costsPath = DEFAULT_COSTS_PATH) {
|
|
|
72
74
|
.map((line) => parseCostEventLine(line))
|
|
73
75
|
.filter((event) => event !== null);
|
|
74
76
|
}
|
|
77
|
+
function asNonNegativeInteger(value) {
|
|
78
|
+
return typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : undefined;
|
|
79
|
+
}
|
|
80
|
+
function parseBriefMetricSections(value) {
|
|
81
|
+
if (!Array.isArray(value)) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
const sections = [];
|
|
85
|
+
for (const item of value) {
|
|
86
|
+
if (typeof item !== 'object' || item === null) {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
const record = item;
|
|
90
|
+
const name = asNonEmptyString(record.name);
|
|
91
|
+
const tokens = asNonNegativeInteger(record.tokens);
|
|
92
|
+
if (!name || tokens === undefined) {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
sections.push({
|
|
96
|
+
name,
|
|
97
|
+
tokens,
|
|
98
|
+
...(typeof record.stable === 'boolean' ? { stable: record.stable } : {}),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return sections;
|
|
102
|
+
}
|
|
103
|
+
export function parseBriefMetricLine(line) {
|
|
104
|
+
const trimmed = line.trim();
|
|
105
|
+
if (trimmed.length === 0) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
let parsed;
|
|
109
|
+
try {
|
|
110
|
+
parsed = JSON.parse(trimmed);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
const record = parsed;
|
|
119
|
+
if (record.schema_version !== 2 || record.kind !== BRIEF_METRIC_KIND) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
const timestamp = asNonEmptyString(record.timestamp);
|
|
123
|
+
const generatedAt = asNonEmptyString(record.generated_at) ?? timestamp;
|
|
124
|
+
const wuId = asNonEmptyString(record.wu_id);
|
|
125
|
+
const clientName = asNonEmptyString(record.client_name) ?? asNonEmptyString(record.client);
|
|
126
|
+
const promptHash = asNonEmptyString(record.prompt_hash);
|
|
127
|
+
const totalTokens = asNonNegativeInteger(record.total_tokens);
|
|
128
|
+
const sections = parseBriefMetricSections(record.sections);
|
|
129
|
+
if (!timestamp || !generatedAt || !wuId || !clientName || !promptHash) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
if (totalTokens === undefined || sections === undefined) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
timestamp,
|
|
137
|
+
generatedAt,
|
|
138
|
+
wuId,
|
|
139
|
+
clientName,
|
|
140
|
+
promptHash,
|
|
141
|
+
totalTokens,
|
|
142
|
+
sections,
|
|
143
|
+
stablePrefixHash: asNonEmptyString(record.stable_prefix_hash),
|
|
144
|
+
stablePrefixTokens: asNonNegativeInteger(record.stable_prefix_tokens),
|
|
145
|
+
volatileTailTokens: asNonNegativeInteger(record.volatile_tail_tokens),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export function readBriefMetricEvents(metricsPath = DEFAULT_BRIEF_METRICS_PATH) {
|
|
149
|
+
if (!existsSync(metricsPath)) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
const content = readFileSync(metricsPath, 'utf-8');
|
|
153
|
+
return content
|
|
154
|
+
.split('\n')
|
|
155
|
+
.map((line) => parseBriefMetricLine(line))
|
|
156
|
+
.filter((event) => event !== null);
|
|
157
|
+
}
|
|
75
158
|
function sortRowsDescending(rows) {
|
|
76
159
|
return [...rows].sort((a, b) => b.costUsd - a.costUsd || b.eventCount - a.eventCount);
|
|
77
160
|
}
|
|
@@ -112,6 +195,38 @@ export function summarizeCostEvents(events) {
|
|
|
112
195
|
}
|
|
113
196
|
return summary;
|
|
114
197
|
}
|
|
198
|
+
function sortBriefRowsDescending(rows) {
|
|
199
|
+
return [...rows].sort((a, b) => b.totalTokens - a.totalTokens || b.eventCount - a.eventCount || a.key.localeCompare(b.key));
|
|
200
|
+
}
|
|
201
|
+
function buildBriefGroupedRows(events, keySelector) {
|
|
202
|
+
const byKey = new Map();
|
|
203
|
+
for (const event of events) {
|
|
204
|
+
const key = keySelector(event) ?? DEFAULT_GROUP_KEY;
|
|
205
|
+
const current = byKey.get(key) ?? {
|
|
206
|
+
key,
|
|
207
|
+
totalTokens: 0,
|
|
208
|
+
eventCount: 0,
|
|
209
|
+
averageTokens: 0,
|
|
210
|
+
};
|
|
211
|
+
current.totalTokens += event.totalTokens;
|
|
212
|
+
current.eventCount += 1;
|
|
213
|
+
current.averageTokens = current.totalTokens / current.eventCount;
|
|
214
|
+
byKey.set(key, current);
|
|
215
|
+
}
|
|
216
|
+
return sortBriefRowsDescending(Array.from(byKey.values()));
|
|
217
|
+
}
|
|
218
|
+
export function summarizeBriefMetricEvents(events) {
|
|
219
|
+
const totalTokens = events.reduce((sum, event) => sum + event.totalTokens, 0);
|
|
220
|
+
const eventCount = events.length;
|
|
221
|
+
return {
|
|
222
|
+
totalTokens,
|
|
223
|
+
eventCount,
|
|
224
|
+
averageTokens: eventCount > 0 ? totalTokens / eventCount : 0,
|
|
225
|
+
byWu: buildBriefGroupedRows(events, (event) => event.wuId),
|
|
226
|
+
byClient: buildBriefGroupedRows(events, (event) => event.clientName),
|
|
227
|
+
byDate: buildBriefGroupedRows(events, (event) => event.generatedAt.slice(0, 10)),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
115
230
|
function formatRows(title, rows) {
|
|
116
231
|
const lines = [];
|
|
117
232
|
lines.push(title);
|
|
@@ -139,12 +254,39 @@ export function formatCostSummary(summary) {
|
|
|
139
254
|
lines.push(...formatRows('By WU:', summary.byWu));
|
|
140
255
|
return lines.join('\n');
|
|
141
256
|
}
|
|
257
|
+
function formatBriefRows(title, rows) {
|
|
258
|
+
const lines = [];
|
|
259
|
+
lines.push(title);
|
|
260
|
+
if (rows.length === 0) {
|
|
261
|
+
lines.push(' (none)');
|
|
262
|
+
return lines;
|
|
263
|
+
}
|
|
264
|
+
for (const row of rows) {
|
|
265
|
+
lines.push(` - ${row.key}: ${row.totalTokens} tokens (${row.eventCount} briefs, avg=${Math.round(row.averageTokens)})`);
|
|
266
|
+
}
|
|
267
|
+
return lines;
|
|
268
|
+
}
|
|
269
|
+
export function formatBriefMetricsSummary(summary) {
|
|
270
|
+
const lines = [];
|
|
271
|
+
lines.push('Brief Metrics Summary');
|
|
272
|
+
lines.push(` Briefs: ${summary.eventCount}`);
|
|
273
|
+
lines.push(` Total Tokens: ${summary.totalTokens}`);
|
|
274
|
+
lines.push(` Average Tokens: ${Math.round(summary.averageTokens)}`);
|
|
275
|
+
lines.push('');
|
|
276
|
+
lines.push(...formatBriefRows('By WU:', summary.byWu));
|
|
277
|
+
lines.push('');
|
|
278
|
+
lines.push(...formatBriefRows('By Client:', summary.byClient));
|
|
279
|
+
lines.push('');
|
|
280
|
+
lines.push(...formatBriefRows('By Date:', summary.byDate));
|
|
281
|
+
return lines.join('\n');
|
|
282
|
+
}
|
|
142
283
|
function parseArgs() {
|
|
143
284
|
const program = new Command()
|
|
144
285
|
.name('cost-summary')
|
|
145
|
-
.description('Summarize local cost
|
|
286
|
+
.description('Summarize local cost or brief metrics telemetry')
|
|
146
287
|
.option('--json', 'Output JSON instead of human-readable text', false)
|
|
147
|
-
.option('--
|
|
288
|
+
.option('--brief', `Summarize brief metrics from ${DEFAULT_BRIEF_METRICS_PATH}`, false)
|
|
289
|
+
.option('--path <path>', 'Path to telemetry NDJSON file')
|
|
148
290
|
.exitOverride();
|
|
149
291
|
try {
|
|
150
292
|
program.parse(process.argv);
|
|
@@ -157,13 +299,28 @@ function parseArgs() {
|
|
|
157
299
|
throw err;
|
|
158
300
|
}
|
|
159
301
|
const options = program.opts();
|
|
302
|
+
const brief = options.brief ?? false;
|
|
160
303
|
return {
|
|
161
304
|
json: options.json ?? false,
|
|
162
|
-
path: options.path ?? DEFAULT_COSTS_PATH,
|
|
305
|
+
path: options.path ?? (brief ? DEFAULT_BRIEF_METRICS_PATH : DEFAULT_COSTS_PATH),
|
|
306
|
+
brief,
|
|
163
307
|
};
|
|
164
308
|
}
|
|
165
309
|
export async function main() {
|
|
166
310
|
const options = parseArgs();
|
|
311
|
+
if (options.brief) {
|
|
312
|
+
const events = readBriefMetricEvents(options.path);
|
|
313
|
+
const summary = summarizeBriefMetricEvents(events);
|
|
314
|
+
if (events.length === 0) {
|
|
315
|
+
console.log(`${LOG_PREFIX} No brief metrics telemetry found at ${options.path}`);
|
|
316
|
+
}
|
|
317
|
+
if (options.json) {
|
|
318
|
+
console.log(JSON.stringify(summary, null, 2));
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
console.log(formatBriefMetricsSummary(summary));
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
167
324
|
const events = readCostEvents(options.path);
|
|
168
325
|
const summary = summarizeCostEvents(events);
|
|
169
326
|
if (events.length === 0) {
|
package/dist/cost-summary.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost-summary.js","sourceRoot":"","sources":["../src/cost-summary.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cost-summary.js","sourceRoot":"","sources":["../src/cost-summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// Copyright (c) 2026 Hellmai Ltd
|
|
2
|
+
// SPDX-License-Identifier: LicenseRef-LumenFlow-Proprietary
|
|
3
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { createError, ErrorCodes } from '@lumenflow/core/error-handler';
|
|
7
|
+
import { buildEventSchemaIndex, EVENT_SCHEMA_FAMILIES, validateEventWithSchemaIndex, } from '@lumenflow/control-plane-sdk';
|
|
8
|
+
import { AGENT_RUNTIME_CHANNEL_ID, AGENT_RUNTIME_ENROLLMENT_EVENT_KINDS, } from './agent-runtime-enrollment-events.js';
|
|
9
|
+
import { SOFTWARE_DELIVERY_CHANNEL_ID, SOFTWARE_DELIVERY_EVENT_KIND_VALUES, } from './kernel-event-sync/software-delivery-emitters.js';
|
|
10
|
+
const DEFAULT_VALID_FIXTURE_DIR = '.lumenflow/schemas/events/fixtures/valid';
|
|
11
|
+
const NON_EMPTY_STRING = z.string().min(1);
|
|
12
|
+
const NON_NEGATIVE_INT = z.number().int().nonnegative();
|
|
13
|
+
export const DEFAULT_EVENTS_VALIDATE_PATHS = [DEFAULT_VALID_FIXTURE_DIR];
|
|
14
|
+
const softwareDeliveryEventSchema = z
|
|
15
|
+
.object({
|
|
16
|
+
schema_version: z.literal(2),
|
|
17
|
+
kind: z.enum(SOFTWARE_DELIVERY_EVENT_KIND_VALUES),
|
|
18
|
+
timestamp: NON_EMPTY_STRING,
|
|
19
|
+
event_id: NON_EMPTY_STRING,
|
|
20
|
+
channel_id: z.literal(SOFTWARE_DELIVERY_CHANNEL_ID),
|
|
21
|
+
seq: NON_NEGATIVE_INT,
|
|
22
|
+
})
|
|
23
|
+
.passthrough();
|
|
24
|
+
const agentRuntimeEventSchema = z
|
|
25
|
+
.object({
|
|
26
|
+
schema_version: z.literal(2),
|
|
27
|
+
kind: z.enum([
|
|
28
|
+
AGENT_RUNTIME_ENROLLMENT_EVENT_KINDS.AGENT_SESSION_ENROLLED,
|
|
29
|
+
AGENT_RUNTIME_ENROLLMENT_EVENT_KINDS.AGENT_SESSION_ENDED,
|
|
30
|
+
AGENT_RUNTIME_ENROLLMENT_EVENT_KINDS.AGENT_SESSION_STALLED,
|
|
31
|
+
]),
|
|
32
|
+
timestamp: NON_EMPTY_STRING,
|
|
33
|
+
event_id: NON_EMPTY_STRING,
|
|
34
|
+
channel_id: z.literal(AGENT_RUNTIME_CHANNEL_ID),
|
|
35
|
+
seq: NON_NEGATIVE_INT,
|
|
36
|
+
session_id: NON_EMPTY_STRING,
|
|
37
|
+
wu_id: NON_EMPTY_STRING,
|
|
38
|
+
lane: NON_EMPTY_STRING,
|
|
39
|
+
})
|
|
40
|
+
.passthrough();
|
|
41
|
+
export const CLI_EVENT_SCHEMA_FAMILIES = [
|
|
42
|
+
...EVENT_SCHEMA_FAMILIES,
|
|
43
|
+
{
|
|
44
|
+
id: 'software-delivery-events',
|
|
45
|
+
title: 'LumenFlow Software Delivery Event Envelope',
|
|
46
|
+
schema_id: 'https://schemas.lumenflow.dev/events/software-delivery-events.v1.schema.json',
|
|
47
|
+
file_name: 'software-delivery-events.v1.schema.json',
|
|
48
|
+
notes: [
|
|
49
|
+
'Audits the schema_version=2 software-delivery pack event family emitted from the CLI.',
|
|
50
|
+
'The validator checks the shared envelope, channel, sequence, and known kind set; kind-specific payload tests remain with the emitters.',
|
|
51
|
+
],
|
|
52
|
+
schemas: [
|
|
53
|
+
...SOFTWARE_DELIVERY_EVENT_KIND_VALUES.map((kind) => ({
|
|
54
|
+
kind,
|
|
55
|
+
schema: softwareDeliveryEventSchema.extend({ kind: z.literal(kind) }),
|
|
56
|
+
})),
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: 'agent-runtime-events',
|
|
61
|
+
title: 'LumenFlow Agent Runtime Event Envelope',
|
|
62
|
+
schema_id: 'https://schemas.lumenflow.dev/events/agent-runtime-events.v1.schema.json',
|
|
63
|
+
file_name: 'agent-runtime-events.v1.schema.json',
|
|
64
|
+
notes: [
|
|
65
|
+
'Audits the schema_version=2 agent-runtime enrollment/stall event family.',
|
|
66
|
+
'This is the agent-runtime counterpart to the INIT-072 measurement/routing event plane.',
|
|
67
|
+
],
|
|
68
|
+
schemas: [
|
|
69
|
+
...Object.values(AGENT_RUNTIME_ENROLLMENT_EVENT_KINDS).map((kind) => ({
|
|
70
|
+
kind,
|
|
71
|
+
schema: agentRuntimeEventSchema.extend({ kind: z.literal(kind) }),
|
|
72
|
+
})),
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
const CLI_EVENT_SCHEMA_INDEX = buildEventSchemaIndex(CLI_EVENT_SCHEMA_FAMILIES);
|
|
77
|
+
export function validateEventRecords(records) {
|
|
78
|
+
const issues = [];
|
|
79
|
+
for (const [index, record] of records.entries()) {
|
|
80
|
+
const result = validateEventWithSchemaIndex(record, CLI_EVENT_SCHEMA_INDEX);
|
|
81
|
+
for (const issue of result.issues) {
|
|
82
|
+
issues.push({
|
|
83
|
+
...issue,
|
|
84
|
+
path: `$[${index}]${issue.path === '$' ? '' : issue.path.slice(1)}`,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
valid: issues.length === 0,
|
|
90
|
+
total: records.length,
|
|
91
|
+
invalid: issues.length === 0 ? 0 : countInvalidRecords(issues),
|
|
92
|
+
issues,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export function validateEventsText(text) {
|
|
96
|
+
return validateEventRecords(parseEventRecords(text));
|
|
97
|
+
}
|
|
98
|
+
export function loadEventRecordsFromPath(inputPath) {
|
|
99
|
+
if (!existsSync(inputPath)) {
|
|
100
|
+
throw createError(ErrorCodes.FILE_NOT_FOUND, `Event validation input does not exist: ${inputPath}`, { inputPath });
|
|
101
|
+
}
|
|
102
|
+
const stats = statSync(inputPath);
|
|
103
|
+
if (stats.isDirectory()) {
|
|
104
|
+
return listEventFiles(inputPath).flatMap((filePath) => loadEventRecordsFromPath(filePath));
|
|
105
|
+
}
|
|
106
|
+
return parseEventRecords(readFileSync(inputPath, 'utf-8'));
|
|
107
|
+
}
|
|
108
|
+
export function formatValidationSummary(summary) {
|
|
109
|
+
const lines = [
|
|
110
|
+
`events:validate ${summary.valid ? 'passed' : 'failed'}`,
|
|
111
|
+
` Events: ${summary.total}`,
|
|
112
|
+
` Invalid: ${summary.invalid}`,
|
|
113
|
+
];
|
|
114
|
+
for (const issue of summary.issues) {
|
|
115
|
+
lines.push(` - ${issue.code} ${issue.path}: ${issue.message}`);
|
|
116
|
+
}
|
|
117
|
+
return lines.join('\n');
|
|
118
|
+
}
|
|
119
|
+
function parseEventRecords(text) {
|
|
120
|
+
const trimmed = text.trim();
|
|
121
|
+
if (!trimmed) {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
const parsed = JSON.parse(trimmed);
|
|
126
|
+
return normalizeParsedEventInput(parsed);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return trimmed.split('\n').map((line, index) => parseNdjsonLine(line, index + 1));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function normalizeParsedEventInput(parsed) {
|
|
133
|
+
if (Array.isArray(parsed)) {
|
|
134
|
+
return parsed;
|
|
135
|
+
}
|
|
136
|
+
if (parsed &&
|
|
137
|
+
typeof parsed === 'object' &&
|
|
138
|
+
Array.isArray(parsed.events)) {
|
|
139
|
+
return parsed.events;
|
|
140
|
+
}
|
|
141
|
+
return [parsed];
|
|
142
|
+
}
|
|
143
|
+
function parseNdjsonLine(line, lineNumber) {
|
|
144
|
+
try {
|
|
145
|
+
return JSON.parse(line);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
149
|
+
throw createError(ErrorCodes.PARSE_ERROR, `Failed to parse event NDJSON line ${lineNumber}: ${message}`, { lineNumber, cause: message });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function listEventFiles(dir) {
|
|
153
|
+
const files = [];
|
|
154
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
155
|
+
const entryPath = join(dir, entry.name);
|
|
156
|
+
if (entry.isDirectory()) {
|
|
157
|
+
files.push(...listEventFiles(entryPath));
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (entry.isFile()) {
|
|
161
|
+
files.push(entryPath);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return files.sort();
|
|
165
|
+
}
|
|
166
|
+
function countInvalidRecords(issues) {
|
|
167
|
+
return new Set(issues.map((issue) => issue.path.match(/^\$\[(\d+)\]/)?.[1] ?? issue.path)).size;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=events-validate-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events-validate-core.js","sourceRoot":"","sources":["../src/events-validate-core.ts"],"names":[],"mappings":"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"}
|