sentinelayer-cli 0.8.0 → 0.8.2
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 +23 -2
- package/package.json +4 -4
- package/src/agents/ai-governance/index.js +12 -0
- package/src/agents/ai-governance/tools/base.js +171 -0
- package/src/agents/ai-governance/tools/eval-regression.js +47 -0
- package/src/agents/ai-governance/tools/hitl-audit.js +81 -0
- package/src/agents/ai-governance/tools/index.js +52 -0
- package/src/agents/ai-governance/tools/prompt-drift.js +42 -0
- package/src/agents/ai-governance/tools/provenance-check.js +69 -0
- package/src/agents/backend/index.js +12 -0
- package/src/agents/backend/tools/base.js +189 -0
- package/src/agents/backend/tools/circuit-breaker-check.js +123 -0
- package/src/agents/backend/tools/idempotency-audit.js +105 -0
- package/src/agents/backend/tools/index.js +87 -0
- package/src/agents/backend/tools/retry-audit.js +132 -0
- package/src/agents/backend/tools/timeout-audit.js +144 -0
- package/src/agents/code-quality/index.js +12 -0
- package/src/agents/code-quality/tools/base.js +159 -0
- package/src/agents/code-quality/tools/complexity-measure.js +197 -0
- package/src/agents/code-quality/tools/coupling-analysis.js +81 -0
- package/src/agents/code-quality/tools/cycle-detect.js +49 -0
- package/src/agents/code-quality/tools/dep-graph.js +196 -0
- package/src/agents/code-quality/tools/index.js +89 -0
- package/src/agents/data-layer/index.js +12 -0
- package/src/agents/data-layer/tools/base.js +181 -0
- package/src/agents/data-layer/tools/index-audit.js +165 -0
- package/src/agents/data-layer/tools/index.js +83 -0
- package/src/agents/data-layer/tools/migration-scan.js +135 -0
- package/src/agents/data-layer/tools/query-explain.js +120 -0
- package/src/agents/data-layer/tools/tenancy-scan.js +166 -0
- package/src/agents/documentation/index.js +12 -0
- package/src/agents/documentation/tools/api-diff.js +91 -0
- package/src/agents/documentation/tools/base.js +151 -0
- package/src/agents/documentation/tools/dead-link-check.js +58 -0
- package/src/agents/documentation/tools/docstring-coverage.js +78 -0
- package/src/agents/documentation/tools/index.js +52 -0
- package/src/agents/documentation/tools/readme-freshness.js +61 -0
- package/src/agents/envelope/fix-cycle.js +45 -0
- package/src/agents/envelope/index.js +31 -0
- package/src/agents/envelope/loop.js +150 -0
- package/src/agents/envelope/pulse.js +18 -0
- package/src/agents/envelope/stream.js +40 -0
- package/src/agents/infrastructure/index.js +12 -0
- package/src/agents/infrastructure/tools/base.js +171 -0
- package/src/agents/infrastructure/tools/checkov-run.js +32 -0
- package/src/agents/infrastructure/tools/drift-detect.js +59 -0
- package/src/agents/infrastructure/tools/iam-least-priv-check.js +78 -0
- package/src/agents/infrastructure/tools/index.js +52 -0
- package/src/agents/infrastructure/tools/tflint-run.js +31 -0
- package/src/agents/jules/loop.js +7 -4
- package/src/agents/jules/swarm/sub-agent.js +5 -1
- package/src/agents/jules/tools/auth-audit.js +10 -1
- package/src/agents/mode.js +113 -0
- package/src/agents/observability/index.js +12 -0
- package/src/agents/observability/tools/alert-audit.js +39 -0
- package/src/agents/observability/tools/base.js +181 -0
- package/src/agents/observability/tools/dashboard-gap.js +42 -0
- package/src/agents/observability/tools/index.js +54 -0
- package/src/agents/observability/tools/log-schema-check.js +74 -0
- package/src/agents/observability/tools/span-coverage.js +74 -0
- package/src/agents/persona-visuals.js +38 -0
- package/src/agents/release/index.js +12 -0
- package/src/agents/release/tools/base.js +181 -0
- package/src/agents/release/tools/changelog-diff.js +86 -0
- package/src/agents/release/tools/feature-flag-audit.js +126 -0
- package/src/agents/release/tools/index.js +61 -0
- package/src/agents/release/tools/rollback-verify.js +129 -0
- package/src/agents/release/tools/semver-check.js +109 -0
- package/src/agents/reliability/index.js +12 -0
- package/src/agents/reliability/tools/backpressure-check.js +129 -0
- package/src/agents/reliability/tools/base.js +181 -0
- package/src/agents/reliability/tools/chaos-probe.js +109 -0
- package/src/agents/reliability/tools/graceful-degradation-check.js +114 -0
- package/src/agents/reliability/tools/health-check-audit.js +111 -0
- package/src/agents/reliability/tools/index.js +87 -0
- package/src/agents/run-persona.js +109 -0
- package/src/agents/security/index.js +12 -0
- package/src/agents/security/tools/authz-audit.js +134 -0
- package/src/agents/security/tools/base.js +190 -0
- package/src/agents/security/tools/crypto-review.js +175 -0
- package/src/agents/security/tools/index.js +97 -0
- package/src/agents/security/tools/sast-scan.js +175 -0
- package/src/agents/security/tools/secrets-scan.js +216 -0
- package/src/agents/supply-chain/index.js +12 -0
- package/src/agents/supply-chain/tools/attestation-check.js +42 -0
- package/src/agents/supply-chain/tools/base.js +151 -0
- package/src/agents/supply-chain/tools/index.js +52 -0
- package/src/agents/supply-chain/tools/lockfile-integrity.js +73 -0
- package/src/agents/supply-chain/tools/package-verify.js +56 -0
- package/src/agents/supply-chain/tools/sbom-diff.js +34 -0
- package/src/agents/testing/index.js +12 -0
- package/src/agents/testing/tools/base.js +202 -0
- package/src/agents/testing/tools/coverage-gap.js +144 -0
- package/src/agents/testing/tools/flake-detect.js +125 -0
- package/src/agents/testing/tools/index.js +85 -0
- package/src/agents/testing/tools/mutation-test.js +143 -0
- package/src/agents/testing/tools/snapshot-diff.js +103 -0
- package/src/auth/gate.js +65 -37
- package/src/cli.js +1 -1
- package/src/commands/chat.js +3 -10
- package/src/commands/legacy-args.js +10 -0
- package/src/commands/omargate.js +36 -2
- package/src/commands/persona.js +46 -1
- package/src/commands/scan.js +3 -10
- package/src/commands/session.js +654 -6
- package/src/commands/spec.js +3 -10
- package/src/coord/events-log.js +141 -0
- package/src/coord/handshake.js +719 -0
- package/src/coord/index.js +35 -0
- package/src/coord/paths.js +84 -0
- package/src/coord/priority.js +62 -0
- package/src/coord/tarjan.js +157 -0
- package/src/cost/tokenizer.js +160 -0
- package/src/cost/tracker.js +61 -0
- package/src/daemon/artifact-lineage.js +362 -0
- package/src/daemon/assignment-ledger.js +117 -0
- package/src/daemon/ast-drift.js +496 -0
- package/src/daemon/ingest-refresh.js +69 -2
- package/src/ingest/engine.js +15 -0
- package/src/ingest/ownership.js +380 -0
- package/src/legacy-cli.js +68 -1
- package/src/orchestrator/kai-chen.js +126 -0
- package/src/review/ai-review.js +3 -10
- package/src/review/compliance-pack.js +389 -0
- package/src/review/investor-dd-config.js +54 -0
- package/src/review/investor-dd-file-loop.js +303 -0
- package/src/review/investor-dd-file-router.js +406 -0
- package/src/review/investor-dd-html-report.js +233 -0
- package/src/review/investor-dd-notification.js +120 -0
- package/src/review/investor-dd-orchestrator.js +405 -0
- package/src/review/investor-dd-persona-runner.js +275 -0
- package/src/review/live-validator.js +253 -0
- package/src/review/omargate-orchestrator.js +90 -2
- package/src/review/persona-prompts.js +244 -56
- package/src/review/reconciliation-rules.js +329 -0
- package/src/review/reproducibility-chain.js +136 -0
- package/src/review/scan-modes.js +102 -3
- package/src/session/agent-registry.js +7 -0
- package/src/session/analytics.js +479 -0
- package/src/session/daemon.js +609 -14
- package/src/session/file-locks.js +666 -0
- package/src/session/paths.js +4 -0
- package/src/session/recap.js +567 -0
- package/src/session/redact.js +82 -0
- package/src/session/runtime-bridge.js +24 -1
- package/src/session/scoring.js +406 -0
- package/src/session/setup-guides.js +304 -0
- package/src/session/store.js +318 -2
- package/src/session/stream.js +9 -1
- package/src/session/sync.js +753 -0
- package/src/session/tasks.js +1054 -0
- package/src/session/templates.js +188 -0
- package/src/swarm/runtime.js +1 -8
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
const SESSION_TEMPLATE_REGISTRY_VERSION = "1.0.0";
|
|
2
|
+
const DEFAULT_DASHBOARD_BASE_URL = "https://sentinelayer.com/dashboard/sessions";
|
|
3
|
+
|
|
4
|
+
const TEMPLATE_DEFINITIONS = Object.freeze({
|
|
5
|
+
"code-review": {
|
|
6
|
+
id: "code-review",
|
|
7
|
+
version: "1.0.0",
|
|
8
|
+
description: "One coder + one reviewer. Reviewer watches Omar Gate, fixes P2s.",
|
|
9
|
+
suggestedAgents: [
|
|
10
|
+
{ role: "coder", instructions: "Build features from the spec." },
|
|
11
|
+
{ role: "reviewer", instructions: "Review each PR via Omar Gate, fix P2s, merge when clean." },
|
|
12
|
+
],
|
|
13
|
+
daemonModel: "gpt-5.4-mini",
|
|
14
|
+
ttlHours: 8,
|
|
15
|
+
},
|
|
16
|
+
"security-audit": {
|
|
17
|
+
id: "security-audit",
|
|
18
|
+
version: "1.0.0",
|
|
19
|
+
description: "Full 13-persona Omar Gate audit with human oversight.",
|
|
20
|
+
suggestedAgents: [
|
|
21
|
+
{
|
|
22
|
+
role: "auditor",
|
|
23
|
+
instructions: "Run sl /omargate deep --scan-mode full-depth and report findings.",
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
daemonModel: "gpt-5.4-mini",
|
|
27
|
+
ttlHours: 4,
|
|
28
|
+
},
|
|
29
|
+
"e2e-test": {
|
|
30
|
+
id: "e2e-test",
|
|
31
|
+
version: "1.0.0",
|
|
32
|
+
description: "Coder + tester with AIdenID email provisioning.",
|
|
33
|
+
suggestedAgents: [
|
|
34
|
+
{ role: "coder", instructions: "Build the feature." },
|
|
35
|
+
{
|
|
36
|
+
role: "tester",
|
|
37
|
+
instructions: "Test auth flows with sl ai provision-email + sl ai identity wait-for-otp.",
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
daemonModel: "gpt-5.4-mini",
|
|
41
|
+
ttlHours: 8,
|
|
42
|
+
autoProvisionEmails: 10,
|
|
43
|
+
},
|
|
44
|
+
"incident-response": {
|
|
45
|
+
id: "incident-response",
|
|
46
|
+
version: "1.0.0",
|
|
47
|
+
description: "All-hands: multiple agents diagnosing and fixing a production issue.",
|
|
48
|
+
suggestedAgents: [
|
|
49
|
+
{ role: "investigator", instructions: "Read logs, trace the error, identify root cause." },
|
|
50
|
+
{
|
|
51
|
+
role: "fixer",
|
|
52
|
+
instructions: "Implement the fix based on investigator findings.",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
role: "verifier",
|
|
56
|
+
instructions: "Test the fix, run regression suite, verify deployment.",
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
daemonModel: "gpt-5.3-codex",
|
|
60
|
+
ttlHours: 4,
|
|
61
|
+
},
|
|
62
|
+
standup: {
|
|
63
|
+
id: "standup",
|
|
64
|
+
version: "1.0.0",
|
|
65
|
+
description: "Quick coordination session. Human directs agents via dashboard.",
|
|
66
|
+
suggestedAgents: [],
|
|
67
|
+
daemonModel: "gpt-5.4-nano",
|
|
68
|
+
ttlHours: 1,
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
function normalizeString(value) {
|
|
73
|
+
return String(value || "").trim();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function sanitizeTemplateAgent(agent = {}) {
|
|
77
|
+
return {
|
|
78
|
+
role: normalizeString(agent.role) || "agent",
|
|
79
|
+
instructions: normalizeString(agent.instructions) || "Follow session guidance.",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function sanitizeTemplate(template = {}) {
|
|
84
|
+
const suggestedAgents = Array.isArray(template.suggestedAgents)
|
|
85
|
+
? template.suggestedAgents.map((agent) => sanitizeTemplateAgent(agent))
|
|
86
|
+
: [];
|
|
87
|
+
return {
|
|
88
|
+
id: normalizeString(template.id),
|
|
89
|
+
version: normalizeString(template.version) || "1.0.0",
|
|
90
|
+
description: normalizeString(template.description),
|
|
91
|
+
daemonModel: normalizeString(template.daemonModel),
|
|
92
|
+
ttlHours: Number.isFinite(Number(template.ttlHours))
|
|
93
|
+
? Math.max(1, Math.floor(Number(template.ttlHours)))
|
|
94
|
+
: 1,
|
|
95
|
+
autoProvisionEmails:
|
|
96
|
+
template.autoProvisionEmails === undefined || template.autoProvisionEmails === null
|
|
97
|
+
? null
|
|
98
|
+
: Math.max(1, Math.floor(Number(template.autoProvisionEmails) || 1)),
|
|
99
|
+
suggestedAgents,
|
|
100
|
+
registryVersion: SESSION_TEMPLATE_REGISTRY_VERSION,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function deepClone(value) {
|
|
105
|
+
return JSON.parse(JSON.stringify(value));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function listTemplateIds() {
|
|
109
|
+
return Object.keys(TEMPLATE_DEFINITIONS).sort();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function resolveAgentNameSeed(role) {
|
|
113
|
+
const normalizedRole = normalizeString(role).toLowerCase() || "agent";
|
|
114
|
+
if (normalizedRole === "coder") {
|
|
115
|
+
return "codex";
|
|
116
|
+
}
|
|
117
|
+
if (normalizedRole === "reviewer") {
|
|
118
|
+
return "claude";
|
|
119
|
+
}
|
|
120
|
+
const alias = normalizedRole.replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
121
|
+
return alias || "agent";
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function buildDashboardUrl(sessionId, { baseUrl = DEFAULT_DASHBOARD_BASE_URL } = {}) {
|
|
125
|
+
const normalizedSessionId = normalizeString(sessionId);
|
|
126
|
+
const normalizedBaseUrl = normalizeString(baseUrl).replace(/\/+$/g, "");
|
|
127
|
+
if (!normalizedSessionId) {
|
|
128
|
+
return normalizedBaseUrl || DEFAULT_DASHBOARD_BASE_URL;
|
|
129
|
+
}
|
|
130
|
+
return `${normalizedBaseUrl || DEFAULT_DASHBOARD_BASE_URL}/${normalizedSessionId}`;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function buildTemplateLaunchPlan(sessionId, template = {}) {
|
|
134
|
+
const normalizedSessionId = normalizeString(sessionId);
|
|
135
|
+
const normalizedTemplate = sanitizeTemplate(template);
|
|
136
|
+
const suggestedAgents = Array.isArray(normalizedTemplate.suggestedAgents)
|
|
137
|
+
? normalizedTemplate.suggestedAgents
|
|
138
|
+
: [];
|
|
139
|
+
const roleCounters = new Map();
|
|
140
|
+
return suggestedAgents.map((agent, index) => {
|
|
141
|
+
const terminal = index + 1;
|
|
142
|
+
const role = normalizeString(agent.role) || "agent";
|
|
143
|
+
const normalizedRole = normalizeString(role).toLowerCase() || "agent";
|
|
144
|
+
const nextRoleCount = Number(roleCounters.get(normalizedRole) || 0) + 1;
|
|
145
|
+
roleCounters.set(normalizedRole, nextRoleCount);
|
|
146
|
+
const agentName = `${resolveAgentNameSeed(role)}-${nextRoleCount}`;
|
|
147
|
+
const command = `sl session join ${normalizedSessionId} --name ${agentName} --role ${role}`;
|
|
148
|
+
return {
|
|
149
|
+
terminal,
|
|
150
|
+
role,
|
|
151
|
+
agentName,
|
|
152
|
+
instructions: normalizeString(agent.instructions),
|
|
153
|
+
command,
|
|
154
|
+
};
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function getTemplateRegistry() {
|
|
159
|
+
const templates = listTemplateIds().map((id) => sanitizeTemplate(TEMPLATE_DEFINITIONS[id]));
|
|
160
|
+
return {
|
|
161
|
+
registryVersion: SESSION_TEMPLATE_REGISTRY_VERSION,
|
|
162
|
+
templates,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function resolveSessionTemplate(templateName) {
|
|
167
|
+
const normalizedTemplateName = normalizeString(templateName).toLowerCase();
|
|
168
|
+
if (!normalizedTemplateName) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
const template = TEMPLATE_DEFINITIONS[normalizedTemplateName];
|
|
172
|
+
if (!template) {
|
|
173
|
+
const available = listTemplateIds().join(", ");
|
|
174
|
+
throw new Error(
|
|
175
|
+
`Unknown session template '${templateName}'. Use --template one of: ${available}. Run 'sl session templates --json' for details.`
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
return sanitizeTemplate(deepClone(template));
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export {
|
|
182
|
+
DEFAULT_DASHBOARD_BASE_URL,
|
|
183
|
+
SESSION_TEMPLATE_REGISTRY_VERSION,
|
|
184
|
+
buildDashboardUrl,
|
|
185
|
+
buildTemplateLaunchPlan,
|
|
186
|
+
getTemplateRegistry,
|
|
187
|
+
resolveSessionTemplate,
|
|
188
|
+
};
|
package/src/swarm/runtime.js
CHANGED
|
@@ -4,6 +4,7 @@ import path from "node:path";
|
|
|
4
4
|
|
|
5
5
|
import { resolveOutputRoot } from "../config/service.js";
|
|
6
6
|
import { evaluateBudget } from "../cost/budget.js";
|
|
7
|
+
import { estimateTokens } from "../cost/tokenizer.js";
|
|
7
8
|
|
|
8
9
|
function normalizeString(value) {
|
|
9
10
|
return String(value || "").trim();
|
|
@@ -25,14 +26,6 @@ function toPosixPath(value) {
|
|
|
25
26
|
return String(value || "").replace(/\\/g, "/");
|
|
26
27
|
}
|
|
27
28
|
|
|
28
|
-
function estimateTokens(text) {
|
|
29
|
-
const normalized = normalizeString(text);
|
|
30
|
-
if (!normalized) {
|
|
31
|
-
return 0;
|
|
32
|
-
}
|
|
33
|
-
return Math.max(1, Math.ceil(normalized.length / 4));
|
|
34
|
-
}
|
|
35
|
-
|
|
36
29
|
function normalizeEngine(value) {
|
|
37
30
|
const normalized = normalizeString(value).toLowerCase();
|
|
38
31
|
if (normalized === "playwright") {
|