sentinelayer-cli 0.1.1 → 0.3.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/README.md +996 -996
- package/bin/create-sentinelayer.js +5 -5
- package/bin/sentinelayer-cli.js +4 -4
- package/bin/sl.js +5 -5
- package/package.json +62 -54
- package/src/agents/jules/config/definition.js +209 -209
- package/src/agents/jules/config/system-prompt.js +175 -175
- package/src/agents/jules/error-intake.js +51 -51
- package/src/agents/jules/fix-cycle.js +377 -377
- package/src/agents/jules/loop.js +367 -367
- package/src/agents/jules/pulse.js +319 -319
- package/src/agents/jules/stream.js +186 -186
- package/src/agents/jules/swarm/file-scanner.js +74 -74
- package/src/agents/jules/swarm/index.js +11 -11
- package/src/agents/jules/swarm/orchestrator.js +362 -362
- package/src/agents/jules/swarm/pattern-hunter.js +123 -123
- package/src/agents/jules/swarm/sub-agent.js +308 -308
- package/src/agents/jules/tools/auth-audit.js +226 -222
- package/src/agents/jules/tools/dispatch.js +327 -327
- package/src/agents/jules/tools/file-edit.js +180 -180
- package/src/agents/jules/tools/file-read.js +100 -100
- package/src/agents/jules/tools/frontend-analyze.js +570 -570
- package/src/agents/jules/tools/glob.js +168 -168
- package/src/agents/jules/tools/grep.js +228 -228
- package/src/agents/jules/tools/index.js +29 -29
- package/src/agents/jules/tools/path-guards.js +161 -161
- package/src/agents/jules/tools/runtime-audit.js +493 -493
- package/src/agents/jules/tools/shell.js +383 -383
- package/src/ai/aidenid.js +972 -945
- package/src/ai/client.js +508 -508
- package/src/ai/domain-target-store.js +268 -268
- package/src/ai/identity-store.js +270 -270
- package/src/ai/site-store.js +145 -145
- package/src/audit/agents/architecture.js +180 -180
- package/src/audit/agents/compliance.js +179 -179
- package/src/audit/agents/documentation.js +165 -165
- package/src/audit/agents/performance.js +145 -145
- package/src/audit/agents/security.js +215 -215
- package/src/audit/agents/testing.js +172 -172
- package/src/audit/orchestrator.js +557 -557
- package/src/audit/package.js +204 -204
- package/src/audit/registry.js +284 -284
- package/src/audit/replay.js +103 -103
- package/src/auth/http.js +113 -113
- package/src/auth/service.js +891 -848
- package/src/auth/session-store.js +359 -345
- package/src/cli.js +252 -252
- package/src/commands/ai/identity-lifecycle.js +1338 -1337
- package/src/commands/ai/provision-governance.js +1272 -1246
- package/src/commands/ai/shared.js +147 -147
- package/src/commands/ai.js +11 -11
- package/src/commands/apply.js +12 -12
- package/src/commands/audit.js +1166 -1147
- package/src/commands/auth.js +375 -366
- package/src/commands/chat.js +191 -191
- package/src/commands/config.js +184 -184
- package/src/commands/cost.js +311 -311
- package/src/commands/daemon/core.js +850 -850
- package/src/commands/daemon/extended.js +1048 -1048
- package/src/commands/daemon/shared.js +213 -213
- package/src/commands/daemon.js +11 -11
- package/src/commands/guide.js +174 -174
- package/src/commands/ingest.js +58 -58
- package/src/commands/init.js +55 -55
- package/src/commands/legacy-args.js +10 -10
- package/src/commands/mcp.js +461 -404
- package/src/commands/omargate.js +15 -15
- package/src/commands/persona.js +20 -20
- package/src/commands/plugin.js +260 -260
- package/src/commands/policy.js +132 -132
- package/src/commands/prompt.js +238 -238
- package/src/commands/review.js +704 -704
- package/src/commands/scan.js +866 -788
- package/src/commands/spec.js +716 -716
- package/src/commands/swarm.js +651 -651
- package/src/commands/telemetry.js +202 -202
- package/src/commands/watch.js +510 -510
- package/src/config/agent-dictionary.js +182 -182
- package/src/config/io.js +56 -56
- package/src/config/paths.js +18 -18
- package/src/config/schema.js +55 -55
- package/src/config/service.js +184 -184
- package/src/cost/budget.js +235 -235
- package/src/cost/history.js +188 -188
- package/src/cost/tracker.js +171 -171
- package/src/daemon/artifact-lineage.js +534 -534
- package/src/daemon/assignment-ledger.js +770 -770
- package/src/daemon/ast-parser-layer.js +258 -258
- package/src/daemon/budget-governor.js +633 -633
- package/src/daemon/callgraph-overlay.js +646 -646
- package/src/daemon/error-worker.js +626 -626
- package/src/daemon/hybrid-mapper.js +929 -929
- package/src/daemon/ingest-refresh.js +195 -0
- package/src/daemon/jira-lifecycle.js +632 -632
- package/src/daemon/operator-control.js +657 -657
- package/src/daemon/reliability-lane.js +471 -471
- package/src/daemon/watchdog.js +971 -971
- package/src/guide/generator.js +316 -316
- package/src/ingest/engine.js +918 -918
- package/src/interactive/action-menu.js +132 -0
- package/src/interactive/auto-ingest.js +111 -0
- package/src/interactive/index.js +95 -0
- package/src/interactive/workspace.js +92 -0
- package/src/legacy-cli.js +2548 -2435
- package/src/mcp/registry.js +695 -695
- package/src/memory/blackboard.js +301 -301
- package/src/memory/retrieval.js +581 -581
- package/src/plugin/manifest.js +553 -553
- package/src/policy/packs.js +144 -144
- package/src/prompt/generator.js +118 -106
- package/src/review/ai-review.js +669 -669
- package/src/review/local-review.js +1284 -1284
- package/src/review/replay.js +235 -235
- package/src/review/report.js +664 -664
- package/src/review/spec-binding.js +487 -487
- package/src/scaffold/generator.js +67 -0
- package/src/scaffold/templates.js +150 -0
- package/src/scan/generator.js +418 -351
- package/src/scan/gh-secrets.js +107 -0
- package/src/spec/generator.js +519 -519
- package/src/spec/regenerate.js +237 -237
- package/src/spec/templates.js +91 -91
- package/src/swarm/dashboard.js +247 -247
- package/src/swarm/factory.js +363 -363
- package/src/swarm/pentest.js +934 -934
- package/src/swarm/registry.js +419 -419
- package/src/swarm/report.js +158 -158
- package/src/swarm/runtime.js +576 -576
- package/src/swarm/scenario-dsl.js +272 -272
- package/src/telemetry/ledger.js +302 -302
- package/src/telemetry/session-tracker.js +118 -0
- package/src/telemetry/sync.js +190 -0
- package/src/ui/markdown.js +220 -220
|
@@ -1,213 +1,213 @@
|
|
|
1
|
-
import pc from "picocolors";
|
|
2
|
-
|
|
3
|
-
import { getBudgetHealthColor } from "../../daemon/operator-control.js";
|
|
4
|
-
|
|
5
|
-
// Shared helper utilities for daemon command modules.
|
|
6
|
-
|
|
7
|
-
export function shouldEmitJson(options, command) {
|
|
8
|
-
const local = Boolean(options && options.json);
|
|
9
|
-
const globalFromCommand =
|
|
10
|
-
command && command.optsWithGlobals ? Boolean(command.optsWithGlobals().json) : false;
|
|
11
|
-
return local || globalFromCommand;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function parsePositiveInteger(rawValue, field, fallbackValue) {
|
|
15
|
-
if (rawValue === undefined || rawValue === null || String(rawValue).trim() === "") {
|
|
16
|
-
return fallbackValue;
|
|
17
|
-
}
|
|
18
|
-
const normalized = Number(rawValue);
|
|
19
|
-
if (!Number.isFinite(normalized) || normalized <= 0) {
|
|
20
|
-
throw new Error(`${field} must be a positive integer.`);
|
|
21
|
-
}
|
|
22
|
-
return Math.floor(normalized);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function parseCsv(rawValue) {
|
|
26
|
-
if (rawValue === undefined || rawValue === null || String(rawValue).trim() === "") {
|
|
27
|
-
return [];
|
|
28
|
-
}
|
|
29
|
-
return String(rawValue)
|
|
30
|
-
.split(",")
|
|
31
|
-
.map((item) => item.trim())
|
|
32
|
-
.filter(Boolean);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function parseMetadata(rawValue) {
|
|
36
|
-
if (!rawValue) {
|
|
37
|
-
return {};
|
|
38
|
-
}
|
|
39
|
-
const parsed = JSON.parse(String(rawValue));
|
|
40
|
-
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
41
|
-
throw new Error("metadataJson must parse to an object.");
|
|
42
|
-
}
|
|
43
|
-
return parsed;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export function parseBoolean(rawValue, fallbackValue) {
|
|
47
|
-
if (rawValue === undefined || rawValue === null || String(rawValue).trim() === "") {
|
|
48
|
-
return fallbackValue;
|
|
49
|
-
}
|
|
50
|
-
const normalized = String(rawValue).trim().toLowerCase();
|
|
51
|
-
if (normalized === "true" || normalized === "1" || normalized === "yes") {
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
if (normalized === "false" || normalized === "0" || normalized === "no") {
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
throw new Error("Value must be true/false.");
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function printQueueSummary(payload) {
|
|
61
|
-
console.log(pc.bold("OMAR error daemon queue"));
|
|
62
|
-
console.log(pc.gray(`Queue: ${payload.queuePath}`));
|
|
63
|
-
console.log(pc.gray(`State: ${payload.statePath}`));
|
|
64
|
-
console.log(
|
|
65
|
-
pc.gray(
|
|
66
|
-
`visible=${payload.visibleCount} total=${payload.totalCount} stream_offset=${payload.workerState?.streamOffset ?? 0}`
|
|
67
|
-
)
|
|
68
|
-
);
|
|
69
|
-
for (const item of payload.items) {
|
|
70
|
-
console.log(
|
|
71
|
-
`- ${item.workItemId} | ${item.severity} | ${item.status} | occurrences=${item.occurrenceCount} | ${item.service} ${item.endpoint}`
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export function printAssignmentSummary(payload) {
|
|
77
|
-
console.log(pc.bold("OMAR assignment ledger"));
|
|
78
|
-
console.log(pc.gray(`Ledger: ${payload.ledgerPath}`));
|
|
79
|
-
console.log(pc.gray(`Queue: ${payload.queuePath}`));
|
|
80
|
-
console.log(pc.gray(`Events: ${payload.eventsPath}`));
|
|
81
|
-
console.log(pc.gray(`visible=${payload.visibleCount} total=${payload.totalCount}`));
|
|
82
|
-
for (const assignment of payload.assignments) {
|
|
83
|
-
console.log(
|
|
84
|
-
`- ${assignment.workItemId} | ${assignment.status} | ${assignment.assignedAgentIdentity || "unassigned"} | stage=${assignment.stage} | lease_expires=${assignment.leaseExpiresAt || "n/a"}`
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export function printJiraSummary(payload) {
|
|
90
|
-
console.log(pc.bold("OMAR Jira lifecycle"));
|
|
91
|
-
console.log(pc.gray(`Lifecycle: ${payload.lifecyclePath}`));
|
|
92
|
-
console.log(pc.gray(`Events: ${payload.eventsPath}`));
|
|
93
|
-
console.log(pc.gray(`visible=${payload.visibleCount} total=${payload.totalCount}`));
|
|
94
|
-
for (const issue of payload.issues) {
|
|
95
|
-
console.log(
|
|
96
|
-
`- ${issue.issueKey} | ${issue.status} | work_item=${issue.workItemId} | assignee=${issue.assignee || "n/a"}`
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export function printBudgetSummary(payload) {
|
|
102
|
-
console.log(pc.bold("OMAR budget governor"));
|
|
103
|
-
console.log(pc.gray(`State: ${payload.budgetStatePath}`));
|
|
104
|
-
console.log(pc.gray(`Events: ${payload.budgetEventsPath}`));
|
|
105
|
-
console.log(pc.gray(`visible=${payload.visibleCount} total=${payload.totalCount}`));
|
|
106
|
-
for (const record of payload.records) {
|
|
107
|
-
const stopCodes = Array.isArray(record.stopReasons)
|
|
108
|
-
? record.stopReasons.map((item) => item.code).join(", ")
|
|
109
|
-
: "";
|
|
110
|
-
console.log(
|
|
111
|
-
`- ${record.workItemId} | ${record.lifecycleState} | action=${record.lastAction || "NONE"} | quarantine_until=${record.quarantineUntil || "n/a"}${stopCodes ? ` | stops=${stopCodes}` : ""}`
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export function formatDurationSeconds(seconds) {
|
|
117
|
-
const normalized = Number(seconds);
|
|
118
|
-
if (!Number.isFinite(normalized) || normalized < 0) {
|
|
119
|
-
return "n/a";
|
|
120
|
-
}
|
|
121
|
-
const total = Math.floor(normalized);
|
|
122
|
-
const hours = Math.floor(total / 3600);
|
|
123
|
-
const minutes = Math.floor((total % 3600) / 60);
|
|
124
|
-
const secs = total % 60;
|
|
125
|
-
if (hours > 0) {
|
|
126
|
-
return `${hours}h ${minutes}m ${secs}s`;
|
|
127
|
-
}
|
|
128
|
-
if (minutes > 0) {
|
|
129
|
-
return `${minutes}m ${secs}s`;
|
|
130
|
-
}
|
|
131
|
-
return `${secs}s`;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export function colorizeBudgetHealth(value) {
|
|
135
|
-
const normalized = getBudgetHealthColor(value);
|
|
136
|
-
if (normalized === "RED") {
|
|
137
|
-
return pc.red(normalized);
|
|
138
|
-
}
|
|
139
|
-
if (normalized === "YELLOW") {
|
|
140
|
-
return pc.yellow(normalized);
|
|
141
|
-
}
|
|
142
|
-
return pc.green(normalized);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
export function printControlPlaneSummary(payload) {
|
|
146
|
-
console.log(pc.bold("OMAR operator control plane"));
|
|
147
|
-
console.log(pc.gray(`State: ${payload.operatorStatePath}`));
|
|
148
|
-
console.log(pc.gray(`Events: ${payload.operatorEventsPath}`));
|
|
149
|
-
console.log(pc.gray(`Snapshot: ${payload.runPath}`));
|
|
150
|
-
console.log(
|
|
151
|
-
pc.gray(
|
|
152
|
-
`visible=${payload.visibleWorkItems} total_queue=${payload.totalQueueItems} active_agents=${payload.agentRoster.length}`
|
|
153
|
-
)
|
|
154
|
-
);
|
|
155
|
-
for (const row of payload.workItems) {
|
|
156
|
-
console.log(
|
|
157
|
-
`- ${row.workItemId} | ${row.severity} | ${row.workItemStatus} | agent=${row.assignedAgentIdentity || "unassigned"} | budget=${colorizeBudgetHealth(row.budgetHealthColor)} | elapsed=${formatDurationSeconds(row.sessionElapsedSeconds)} | idle=${formatDurationSeconds(row.sessionIdleSeconds)} | jira=${row.jiraIssueKey || "n/a"}`
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
if (payload.agentRoster.length > 0) {
|
|
161
|
-
console.log(pc.bold("Agent roster"));
|
|
162
|
-
for (const agent of payload.agentRoster) {
|
|
163
|
-
console.log(
|
|
164
|
-
`- ${agent.agentIdentity} | work_items=${agent.workItemCount} | active=${agent.activeWorkItemCount} | blocked=${agent.blockedCount} | squashed=${agent.squashedCount} | longest_session=${formatDurationSeconds(agent.maxSessionElapsedSeconds)}`
|
|
165
|
-
);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
export function printLineageSummary(payload) {
|
|
171
|
-
console.log(pc.bold("OMAR artifact lineage"));
|
|
172
|
-
console.log(pc.gray(`Index: ${payload.indexPath}`));
|
|
173
|
-
console.log(pc.gray(`Events: ${payload.eventPath}`));
|
|
174
|
-
console.log(
|
|
175
|
-
pc.gray(
|
|
176
|
-
`visible=${payload.visibleCount} total=${payload.totalCount} lineage_run=${payload.lineageRunId || "n/a"}`
|
|
177
|
-
)
|
|
178
|
-
);
|
|
179
|
-
for (const item of payload.workItems) {
|
|
180
|
-
console.log(
|
|
181
|
-
`- ${item.workItemId} | ${item.severity} | ${item.workItemStatus} | agent=${item.links?.agentIdentity || "unassigned"} | jira=${item.links?.jiraIssueKey || "n/a"} | budget=${item.links?.budgetLifecycleState || "WITHIN_BUDGET"} | operator_snapshot=${item.links?.latestOperatorSnapshotRunId || "n/a"}`
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
export function printHybridMapSummary(payload) {
|
|
187
|
-
console.log(pc.bold("OMAR hybrid mapping overlay"));
|
|
188
|
-
console.log(pc.gray(`Index: ${payload.mapIndexPath}`));
|
|
189
|
-
console.log(pc.gray(`Events: ${payload.mapEventsPath}`));
|
|
190
|
-
console.log(pc.gray(`visible=${payload.visibleCount} total=${payload.totalCount}`));
|
|
191
|
-
for (const map of payload.maps) {
|
|
192
|
-
console.log(
|
|
193
|
-
`- ${map.workItemId} | run=${map.runId} | status=${map.status || "n/a"} | seeds=${map.deterministicSeedCount || 0} | scoped=${map.scopedFileCount || 0}`
|
|
194
|
-
);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
export function printReliabilitySummary(payload) {
|
|
199
|
-
console.log(pc.bold("OMAR reliability lane"));
|
|
200
|
-
console.log(pc.gray(`Config: ${payload.configPath}`));
|
|
201
|
-
console.log(pc.gray(`Billboard: ${payload.billboardPath}`));
|
|
202
|
-
console.log(pc.gray(`Events: ${payload.eventsPath}`));
|
|
203
|
-
console.log(
|
|
204
|
-
pc.gray(
|
|
205
|
-
`maintenance=${payload.billboard?.enabled ? "ON" : "OFF"} checks=${payload.config?.checks?.length || 0} recent_runs=${payload.recentRuns?.length || 0}`
|
|
206
|
-
)
|
|
207
|
-
);
|
|
208
|
-
for (const run of payload.recentRuns || []) {
|
|
209
|
-
console.log(
|
|
210
|
-
`- ${run.runId} | ${run.overallStatus} | failures=${run.failureCount} | ${run.generatedAt}`
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
|
|
3
|
+
import { getBudgetHealthColor } from "../../daemon/operator-control.js";
|
|
4
|
+
|
|
5
|
+
// Shared helper utilities for daemon command modules.
|
|
6
|
+
|
|
7
|
+
export function shouldEmitJson(options, command) {
|
|
8
|
+
const local = Boolean(options && options.json);
|
|
9
|
+
const globalFromCommand =
|
|
10
|
+
command && command.optsWithGlobals ? Boolean(command.optsWithGlobals().json) : false;
|
|
11
|
+
return local || globalFromCommand;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function parsePositiveInteger(rawValue, field, fallbackValue) {
|
|
15
|
+
if (rawValue === undefined || rawValue === null || String(rawValue).trim() === "") {
|
|
16
|
+
return fallbackValue;
|
|
17
|
+
}
|
|
18
|
+
const normalized = Number(rawValue);
|
|
19
|
+
if (!Number.isFinite(normalized) || normalized <= 0) {
|
|
20
|
+
throw new Error(`${field} must be a positive integer.`);
|
|
21
|
+
}
|
|
22
|
+
return Math.floor(normalized);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function parseCsv(rawValue) {
|
|
26
|
+
if (rawValue === undefined || rawValue === null || String(rawValue).trim() === "") {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
return String(rawValue)
|
|
30
|
+
.split(",")
|
|
31
|
+
.map((item) => item.trim())
|
|
32
|
+
.filter(Boolean);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function parseMetadata(rawValue) {
|
|
36
|
+
if (!rawValue) {
|
|
37
|
+
return {};
|
|
38
|
+
}
|
|
39
|
+
const parsed = JSON.parse(String(rawValue));
|
|
40
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
41
|
+
throw new Error("metadataJson must parse to an object.");
|
|
42
|
+
}
|
|
43
|
+
return parsed;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function parseBoolean(rawValue, fallbackValue) {
|
|
47
|
+
if (rawValue === undefined || rawValue === null || String(rawValue).trim() === "") {
|
|
48
|
+
return fallbackValue;
|
|
49
|
+
}
|
|
50
|
+
const normalized = String(rawValue).trim().toLowerCase();
|
|
51
|
+
if (normalized === "true" || normalized === "1" || normalized === "yes") {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
if (normalized === "false" || normalized === "0" || normalized === "no") {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
throw new Error("Value must be true/false.");
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function printQueueSummary(payload) {
|
|
61
|
+
console.log(pc.bold("OMAR error daemon queue"));
|
|
62
|
+
console.log(pc.gray(`Queue: ${payload.queuePath}`));
|
|
63
|
+
console.log(pc.gray(`State: ${payload.statePath}`));
|
|
64
|
+
console.log(
|
|
65
|
+
pc.gray(
|
|
66
|
+
`visible=${payload.visibleCount} total=${payload.totalCount} stream_offset=${payload.workerState?.streamOffset ?? 0}`
|
|
67
|
+
)
|
|
68
|
+
);
|
|
69
|
+
for (const item of payload.items) {
|
|
70
|
+
console.log(
|
|
71
|
+
`- ${item.workItemId} | ${item.severity} | ${item.status} | occurrences=${item.occurrenceCount} | ${item.service} ${item.endpoint}`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function printAssignmentSummary(payload) {
|
|
77
|
+
console.log(pc.bold("OMAR assignment ledger"));
|
|
78
|
+
console.log(pc.gray(`Ledger: ${payload.ledgerPath}`));
|
|
79
|
+
console.log(pc.gray(`Queue: ${payload.queuePath}`));
|
|
80
|
+
console.log(pc.gray(`Events: ${payload.eventsPath}`));
|
|
81
|
+
console.log(pc.gray(`visible=${payload.visibleCount} total=${payload.totalCount}`));
|
|
82
|
+
for (const assignment of payload.assignments) {
|
|
83
|
+
console.log(
|
|
84
|
+
`- ${assignment.workItemId} | ${assignment.status} | ${assignment.assignedAgentIdentity || "unassigned"} | stage=${assignment.stage} | lease_expires=${assignment.leaseExpiresAt || "n/a"}`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function printJiraSummary(payload) {
|
|
90
|
+
console.log(pc.bold("OMAR Jira lifecycle"));
|
|
91
|
+
console.log(pc.gray(`Lifecycle: ${payload.lifecyclePath}`));
|
|
92
|
+
console.log(pc.gray(`Events: ${payload.eventsPath}`));
|
|
93
|
+
console.log(pc.gray(`visible=${payload.visibleCount} total=${payload.totalCount}`));
|
|
94
|
+
for (const issue of payload.issues) {
|
|
95
|
+
console.log(
|
|
96
|
+
`- ${issue.issueKey} | ${issue.status} | work_item=${issue.workItemId} | assignee=${issue.assignee || "n/a"}`
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function printBudgetSummary(payload) {
|
|
102
|
+
console.log(pc.bold("OMAR budget governor"));
|
|
103
|
+
console.log(pc.gray(`State: ${payload.budgetStatePath}`));
|
|
104
|
+
console.log(pc.gray(`Events: ${payload.budgetEventsPath}`));
|
|
105
|
+
console.log(pc.gray(`visible=${payload.visibleCount} total=${payload.totalCount}`));
|
|
106
|
+
for (const record of payload.records) {
|
|
107
|
+
const stopCodes = Array.isArray(record.stopReasons)
|
|
108
|
+
? record.stopReasons.map((item) => item.code).join(", ")
|
|
109
|
+
: "";
|
|
110
|
+
console.log(
|
|
111
|
+
`- ${record.workItemId} | ${record.lifecycleState} | action=${record.lastAction || "NONE"} | quarantine_until=${record.quarantineUntil || "n/a"}${stopCodes ? ` | stops=${stopCodes}` : ""}`
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function formatDurationSeconds(seconds) {
|
|
117
|
+
const normalized = Number(seconds);
|
|
118
|
+
if (!Number.isFinite(normalized) || normalized < 0) {
|
|
119
|
+
return "n/a";
|
|
120
|
+
}
|
|
121
|
+
const total = Math.floor(normalized);
|
|
122
|
+
const hours = Math.floor(total / 3600);
|
|
123
|
+
const minutes = Math.floor((total % 3600) / 60);
|
|
124
|
+
const secs = total % 60;
|
|
125
|
+
if (hours > 0) {
|
|
126
|
+
return `${hours}h ${minutes}m ${secs}s`;
|
|
127
|
+
}
|
|
128
|
+
if (minutes > 0) {
|
|
129
|
+
return `${minutes}m ${secs}s`;
|
|
130
|
+
}
|
|
131
|
+
return `${secs}s`;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function colorizeBudgetHealth(value) {
|
|
135
|
+
const normalized = getBudgetHealthColor(value);
|
|
136
|
+
if (normalized === "RED") {
|
|
137
|
+
return pc.red(normalized);
|
|
138
|
+
}
|
|
139
|
+
if (normalized === "YELLOW") {
|
|
140
|
+
return pc.yellow(normalized);
|
|
141
|
+
}
|
|
142
|
+
return pc.green(normalized);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function printControlPlaneSummary(payload) {
|
|
146
|
+
console.log(pc.bold("OMAR operator control plane"));
|
|
147
|
+
console.log(pc.gray(`State: ${payload.operatorStatePath}`));
|
|
148
|
+
console.log(pc.gray(`Events: ${payload.operatorEventsPath}`));
|
|
149
|
+
console.log(pc.gray(`Snapshot: ${payload.runPath}`));
|
|
150
|
+
console.log(
|
|
151
|
+
pc.gray(
|
|
152
|
+
`visible=${payload.visibleWorkItems} total_queue=${payload.totalQueueItems} active_agents=${payload.agentRoster.length}`
|
|
153
|
+
)
|
|
154
|
+
);
|
|
155
|
+
for (const row of payload.workItems) {
|
|
156
|
+
console.log(
|
|
157
|
+
`- ${row.workItemId} | ${row.severity} | ${row.workItemStatus} | agent=${row.assignedAgentIdentity || "unassigned"} | budget=${colorizeBudgetHealth(row.budgetHealthColor)} | elapsed=${formatDurationSeconds(row.sessionElapsedSeconds)} | idle=${formatDurationSeconds(row.sessionIdleSeconds)} | jira=${row.jiraIssueKey || "n/a"}`
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
if (payload.agentRoster.length > 0) {
|
|
161
|
+
console.log(pc.bold("Agent roster"));
|
|
162
|
+
for (const agent of payload.agentRoster) {
|
|
163
|
+
console.log(
|
|
164
|
+
`- ${agent.agentIdentity} | work_items=${agent.workItemCount} | active=${agent.activeWorkItemCount} | blocked=${agent.blockedCount} | squashed=${agent.squashedCount} | longest_session=${formatDurationSeconds(agent.maxSessionElapsedSeconds)}`
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function printLineageSummary(payload) {
|
|
171
|
+
console.log(pc.bold("OMAR artifact lineage"));
|
|
172
|
+
console.log(pc.gray(`Index: ${payload.indexPath}`));
|
|
173
|
+
console.log(pc.gray(`Events: ${payload.eventPath}`));
|
|
174
|
+
console.log(
|
|
175
|
+
pc.gray(
|
|
176
|
+
`visible=${payload.visibleCount} total=${payload.totalCount} lineage_run=${payload.lineageRunId || "n/a"}`
|
|
177
|
+
)
|
|
178
|
+
);
|
|
179
|
+
for (const item of payload.workItems) {
|
|
180
|
+
console.log(
|
|
181
|
+
`- ${item.workItemId} | ${item.severity} | ${item.workItemStatus} | agent=${item.links?.agentIdentity || "unassigned"} | jira=${item.links?.jiraIssueKey || "n/a"} | budget=${item.links?.budgetLifecycleState || "WITHIN_BUDGET"} | operator_snapshot=${item.links?.latestOperatorSnapshotRunId || "n/a"}`
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export function printHybridMapSummary(payload) {
|
|
187
|
+
console.log(pc.bold("OMAR hybrid mapping overlay"));
|
|
188
|
+
console.log(pc.gray(`Index: ${payload.mapIndexPath}`));
|
|
189
|
+
console.log(pc.gray(`Events: ${payload.mapEventsPath}`));
|
|
190
|
+
console.log(pc.gray(`visible=${payload.visibleCount} total=${payload.totalCount}`));
|
|
191
|
+
for (const map of payload.maps) {
|
|
192
|
+
console.log(
|
|
193
|
+
`- ${map.workItemId} | run=${map.runId} | status=${map.status || "n/a"} | seeds=${map.deterministicSeedCount || 0} | scoped=${map.scopedFileCount || 0}`
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export function printReliabilitySummary(payload) {
|
|
199
|
+
console.log(pc.bold("OMAR reliability lane"));
|
|
200
|
+
console.log(pc.gray(`Config: ${payload.configPath}`));
|
|
201
|
+
console.log(pc.gray(`Billboard: ${payload.billboardPath}`));
|
|
202
|
+
console.log(pc.gray(`Events: ${payload.eventsPath}`));
|
|
203
|
+
console.log(
|
|
204
|
+
pc.gray(
|
|
205
|
+
`maintenance=${payload.billboard?.enabled ? "ON" : "OFF"} checks=${payload.config?.checks?.length || 0} recent_runs=${payload.recentRuns?.length || 0}`
|
|
206
|
+
)
|
|
207
|
+
);
|
|
208
|
+
for (const run of payload.recentRuns || []) {
|
|
209
|
+
console.log(
|
|
210
|
+
`- ${run.runId} | ${run.overallStatus} | failures=${run.failureCount} | ${run.generatedAt}`
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
}
|
package/src/commands/daemon.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { registerDaemonCoreCommands } from "./daemon/core.js";
|
|
2
|
-
import { registerDaemonExtendedCommands } from "./daemon/extended.js";
|
|
3
|
-
|
|
4
|
-
export function registerDaemonCommand(program) {
|
|
5
|
-
const daemon = program
|
|
6
|
-
.command("daemon")
|
|
7
|
-
.description("OMAR daemon controls for error-event intake and routed queue management");
|
|
8
|
-
|
|
9
|
-
registerDaemonCoreCommands(daemon);
|
|
10
|
-
registerDaemonExtendedCommands(daemon);
|
|
11
|
-
}
|
|
1
|
+
import { registerDaemonCoreCommands } from "./daemon/core.js";
|
|
2
|
+
import { registerDaemonExtendedCommands } from "./daemon/extended.js";
|
|
3
|
+
|
|
4
|
+
export function registerDaemonCommand(program) {
|
|
5
|
+
const daemon = program
|
|
6
|
+
.command("daemon")
|
|
7
|
+
.description("OMAR daemon controls for error-event intake and routed queue management");
|
|
8
|
+
|
|
9
|
+
registerDaemonCoreCommands(daemon);
|
|
10
|
+
registerDaemonExtendedCommands(daemon);
|
|
11
|
+
}
|