@synth-deploy/server 0.1.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/dist/agent/debrief-retention.d.ts +12 -0
- package/dist/agent/debrief-retention.d.ts.map +1 -0
- package/dist/agent/debrief-retention.js +27 -0
- package/dist/agent/debrief-retention.js.map +1 -0
- package/dist/agent/envoy-client.d.ts +216 -0
- package/dist/agent/envoy-client.d.ts.map +1 -0
- package/dist/agent/envoy-client.js +266 -0
- package/dist/agent/envoy-client.js.map +1 -0
- package/dist/agent/envoy-registry.d.ts +102 -0
- package/dist/agent/envoy-registry.d.ts.map +1 -0
- package/dist/agent/envoy-registry.js +319 -0
- package/dist/agent/envoy-registry.js.map +1 -0
- package/dist/agent/health-checker.d.ts +39 -0
- package/dist/agent/health-checker.d.ts.map +1 -0
- package/dist/agent/health-checker.js +49 -0
- package/dist/agent/health-checker.js.map +1 -0
- package/dist/agent/mcp-client-manager.d.ts +36 -0
- package/dist/agent/mcp-client-manager.d.ts.map +1 -0
- package/dist/agent/mcp-client-manager.js +106 -0
- package/dist/agent/mcp-client-manager.js.map +1 -0
- package/dist/agent/stale-deployment-detector.d.ts +15 -0
- package/dist/agent/stale-deployment-detector.d.ts.map +1 -0
- package/dist/agent/stale-deployment-detector.js +50 -0
- package/dist/agent/stale-deployment-detector.js.map +1 -0
- package/dist/agent/step-runner.d.ts +31 -0
- package/dist/agent/step-runner.d.ts.map +1 -0
- package/dist/agent/step-runner.js +80 -0
- package/dist/agent/step-runner.js.map +1 -0
- package/dist/agent/synth-agent.d.ts +168 -0
- package/dist/agent/synth-agent.d.ts.map +1 -0
- package/dist/agent/synth-agent.js +1195 -0
- package/dist/agent/synth-agent.js.map +1 -0
- package/dist/api/agent.d.ts +36 -0
- package/dist/api/agent.d.ts.map +1 -0
- package/dist/api/agent.js +867 -0
- package/dist/api/agent.js.map +1 -0
- package/dist/api/api-keys.d.ts +4 -0
- package/dist/api/api-keys.d.ts.map +1 -0
- package/dist/api/api-keys.js +118 -0
- package/dist/api/api-keys.js.map +1 -0
- package/dist/api/artifacts.d.ts +5 -0
- package/dist/api/artifacts.d.ts.map +1 -0
- package/dist/api/artifacts.js +142 -0
- package/dist/api/artifacts.js.map +1 -0
- package/dist/api/auth.d.ts +4 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +280 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/deployments.d.ts +11 -0
- package/dist/api/deployments.d.ts.map +1 -0
- package/dist/api/deployments.js +1098 -0
- package/dist/api/deployments.js.map +1 -0
- package/dist/api/environments.d.ts +5 -0
- package/dist/api/environments.d.ts.map +1 -0
- package/dist/api/environments.js +69 -0
- package/dist/api/environments.js.map +1 -0
- package/dist/api/envoy-reports.d.ts +17 -0
- package/dist/api/envoy-reports.d.ts.map +1 -0
- package/dist/api/envoy-reports.js +138 -0
- package/dist/api/envoy-reports.js.map +1 -0
- package/dist/api/envoys.d.ts +5 -0
- package/dist/api/envoys.d.ts.map +1 -0
- package/dist/api/envoys.js +192 -0
- package/dist/api/envoys.js.map +1 -0
- package/dist/api/fleet.d.ts +11 -0
- package/dist/api/fleet.d.ts.map +1 -0
- package/dist/api/fleet.js +394 -0
- package/dist/api/fleet.js.map +1 -0
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.d.ts.map +1 -0
- package/dist/api/graph.js +355 -0
- package/dist/api/graph.js.map +1 -0
- package/dist/api/health.d.ts +20 -0
- package/dist/api/health.d.ts.map +1 -0
- package/dist/api/health.js +248 -0
- package/dist/api/health.js.map +1 -0
- package/dist/api/idp-schemas.d.ts +41 -0
- package/dist/api/idp-schemas.d.ts.map +1 -0
- package/dist/api/idp-schemas.js +17 -0
- package/dist/api/idp-schemas.js.map +1 -0
- package/dist/api/idp.d.ts +6 -0
- package/dist/api/idp.d.ts.map +1 -0
- package/dist/api/idp.js +620 -0
- package/dist/api/idp.js.map +1 -0
- package/dist/api/intake.d.ts +10 -0
- package/dist/api/intake.d.ts.map +1 -0
- package/dist/api/intake.js +418 -0
- package/dist/api/intake.js.map +1 -0
- package/dist/api/partitions.d.ts +5 -0
- package/dist/api/partitions.d.ts.map +1 -0
- package/dist/api/partitions.js +113 -0
- package/dist/api/partitions.js.map +1 -0
- package/dist/api/progress-event-store.d.ts +62 -0
- package/dist/api/progress-event-store.d.ts.map +1 -0
- package/dist/api/progress-event-store.js +118 -0
- package/dist/api/progress-event-store.js.map +1 -0
- package/dist/api/schemas.d.ts +1000 -0
- package/dist/api/schemas.d.ts.map +1 -0
- package/dist/api/schemas.js +328 -0
- package/dist/api/schemas.js.map +1 -0
- package/dist/api/security-boundaries.d.ts +4 -0
- package/dist/api/security-boundaries.d.ts.map +1 -0
- package/dist/api/security-boundaries.js +32 -0
- package/dist/api/security-boundaries.js.map +1 -0
- package/dist/api/settings.d.ts +4 -0
- package/dist/api/settings.d.ts.map +1 -0
- package/dist/api/settings.js +99 -0
- package/dist/api/settings.js.map +1 -0
- package/dist/api/system.d.ts +75 -0
- package/dist/api/system.d.ts.map +1 -0
- package/dist/api/system.js +558 -0
- package/dist/api/system.js.map +1 -0
- package/dist/api/telemetry.d.ts +4 -0
- package/dist/api/telemetry.d.ts.map +1 -0
- package/dist/api/telemetry.js +24 -0
- package/dist/api/telemetry.js.map +1 -0
- package/dist/api/users.d.ts +4 -0
- package/dist/api/users.d.ts.map +1 -0
- package/dist/api/users.js +173 -0
- package/dist/api/users.js.map +1 -0
- package/dist/archive-unpacker.d.ts +24 -0
- package/dist/archive-unpacker.d.ts.map +1 -0
- package/dist/archive-unpacker.js +239 -0
- package/dist/archive-unpacker.js.map +1 -0
- package/dist/artifact-analyzer.d.ts +59 -0
- package/dist/artifact-analyzer.d.ts.map +1 -0
- package/dist/artifact-analyzer.js +334 -0
- package/dist/artifact-analyzer.js.map +1 -0
- package/dist/auth/idp/index.d.ts +9 -0
- package/dist/auth/idp/index.d.ts.map +1 -0
- package/dist/auth/idp/index.js +5 -0
- package/dist/auth/idp/index.js.map +1 -0
- package/dist/auth/idp/ldap.d.ts +56 -0
- package/dist/auth/idp/ldap.d.ts.map +1 -0
- package/dist/auth/idp/ldap.js +276 -0
- package/dist/auth/idp/ldap.js.map +1 -0
- package/dist/auth/idp/oidc.d.ts +27 -0
- package/dist/auth/idp/oidc.d.ts.map +1 -0
- package/dist/auth/idp/oidc.js +97 -0
- package/dist/auth/idp/oidc.js.map +1 -0
- package/dist/auth/idp/role-mapping.d.ts +9 -0
- package/dist/auth/idp/role-mapping.d.ts.map +1 -0
- package/dist/auth/idp/role-mapping.js +16 -0
- package/dist/auth/idp/role-mapping.js.map +1 -0
- package/dist/auth/idp/saml.d.ts +40 -0
- package/dist/auth/idp/saml.d.ts.map +1 -0
- package/dist/auth/idp/saml.js +117 -0
- package/dist/auth/idp/saml.js.map +1 -0
- package/dist/auth/idp/types.d.ts +23 -0
- package/dist/auth/idp/types.d.ts.map +1 -0
- package/dist/auth/idp/types.js +2 -0
- package/dist/auth/idp/types.js.map +1 -0
- package/dist/fleet/fleet-executor.d.ts +35 -0
- package/dist/fleet/fleet-executor.d.ts.map +1 -0
- package/dist/fleet/fleet-executor.js +228 -0
- package/dist/fleet/fleet-executor.js.map +1 -0
- package/dist/fleet/fleet-store.d.ts +13 -0
- package/dist/fleet/fleet-store.d.ts.map +1 -0
- package/dist/fleet/fleet-store.js +13 -0
- package/dist/fleet/fleet-store.js.map +1 -0
- package/dist/fleet/index.d.ts +5 -0
- package/dist/fleet/index.d.ts.map +1 -0
- package/dist/fleet/index.js +4 -0
- package/dist/fleet/index.js.map +1 -0
- package/dist/fleet/representative-selector.d.ts +15 -0
- package/dist/fleet/representative-selector.d.ts.map +1 -0
- package/dist/fleet/representative-selector.js +71 -0
- package/dist/fleet/representative-selector.js.map +1 -0
- package/dist/graph/graph-executor.d.ts +36 -0
- package/dist/graph/graph-executor.d.ts.map +1 -0
- package/dist/graph/graph-executor.js +348 -0
- package/dist/graph/graph-executor.js.map +1 -0
- package/dist/graph/graph-inference.d.ts +22 -0
- package/dist/graph/graph-inference.d.ts.map +1 -0
- package/dist/graph/graph-inference.js +149 -0
- package/dist/graph/graph-inference.js.map +1 -0
- package/dist/graph/graph-store.d.ts +12 -0
- package/dist/graph/graph-store.d.ts.map +1 -0
- package/dist/graph/graph-store.js +61 -0
- package/dist/graph/graph-store.js.map +1 -0
- package/dist/graph/index.d.ts +5 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +4 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +837 -0
- package/dist/index.js.map +1 -0
- package/dist/intake/index.d.ts +6 -0
- package/dist/intake/index.d.ts.map +1 -0
- package/dist/intake/index.js +5 -0
- package/dist/intake/index.js.map +1 -0
- package/dist/intake/intake-processor.d.ts +17 -0
- package/dist/intake/intake-processor.d.ts.map +1 -0
- package/dist/intake/intake-processor.js +99 -0
- package/dist/intake/intake-processor.js.map +1 -0
- package/dist/intake/intake-store.d.ts +7 -0
- package/dist/intake/intake-store.d.ts.map +1 -0
- package/dist/intake/intake-store.js +7 -0
- package/dist/intake/intake-store.js.map +1 -0
- package/dist/intake/registry-poller.d.ts +41 -0
- package/dist/intake/registry-poller.d.ts.map +1 -0
- package/dist/intake/registry-poller.js +202 -0
- package/dist/intake/registry-poller.js.map +1 -0
- package/dist/intake/webhook-handlers.d.ts +37 -0
- package/dist/intake/webhook-handlers.d.ts.map +1 -0
- package/dist/intake/webhook-handlers.js +268 -0
- package/dist/intake/webhook-handlers.js.map +1 -0
- package/dist/logger.d.ts +5 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +15 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/resources.d.ts +9 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +72 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +15 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +20 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +9 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +88 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/middleware/auth.d.ts +29 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +76 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/permissions.d.ts +13 -0
- package/dist/middleware/permissions.d.ts.map +1 -0
- package/dist/middleware/permissions.js +32 -0
- package/dist/middleware/permissions.js.map +1 -0
- package/dist/pattern-store.d.ts +104 -0
- package/dist/pattern-store.d.ts.map +1 -0
- package/dist/pattern-store.js +299 -0
- package/dist/pattern-store.js.map +1 -0
- package/package.json +54 -0
- package/src/agent/debrief-retention.ts +44 -0
- package/src/agent/envoy-client.ts +474 -0
- package/src/agent/envoy-registry.ts +384 -0
- package/src/agent/health-checker.ts +70 -0
- package/src/agent/mcp-client-manager.ts +131 -0
- package/src/agent/stale-deployment-detector.ts +79 -0
- package/src/agent/step-runner.ts +124 -0
- package/src/agent/synth-agent.ts +1567 -0
- package/src/api/agent.ts +1075 -0
- package/src/api/api-keys.ts +129 -0
- package/src/api/artifacts.ts +194 -0
- package/src/api/auth.ts +320 -0
- package/src/api/deployments.ts +1347 -0
- package/src/api/environments.ts +97 -0
- package/src/api/envoy-reports.ts +159 -0
- package/src/api/envoys.ts +237 -0
- package/src/api/fleet.ts +510 -0
- package/src/api/graph.ts +516 -0
- package/src/api/health.ts +311 -0
- package/src/api/idp-schemas.ts +19 -0
- package/src/api/idp.ts +735 -0
- package/src/api/intake.ts +537 -0
- package/src/api/partitions.ts +147 -0
- package/src/api/progress-event-store.ts +153 -0
- package/src/api/schemas.ts +376 -0
- package/src/api/security-boundaries.ts +54 -0
- package/src/api/settings.ts +118 -0
- package/src/api/system.ts +704 -0
- package/src/api/telemetry.ts +32 -0
- package/src/api/users.ts +210 -0
- package/src/archive-unpacker.ts +271 -0
- package/src/artifact-analyzer.ts +438 -0
- package/src/auth/idp/index.ts +8 -0
- package/src/auth/idp/ldap.ts +340 -0
- package/src/auth/idp/oidc.ts +117 -0
- package/src/auth/idp/role-mapping.ts +22 -0
- package/src/auth/idp/saml.ts +148 -0
- package/src/auth/idp/types.ts +22 -0
- package/src/fleet/fleet-executor.ts +309 -0
- package/src/fleet/fleet-store.ts +13 -0
- package/src/fleet/index.ts +4 -0
- package/src/fleet/representative-selector.ts +83 -0
- package/src/graph/graph-executor.ts +446 -0
- package/src/graph/graph-inference.ts +184 -0
- package/src/graph/graph-store.ts +75 -0
- package/src/graph/index.ts +4 -0
- package/src/index.ts +916 -0
- package/src/intake/index.ts +5 -0
- package/src/intake/intake-processor.ts +111 -0
- package/src/intake/intake-store.ts +7 -0
- package/src/intake/registry-poller.ts +230 -0
- package/src/intake/webhook-handlers.ts +328 -0
- package/src/logger.ts +19 -0
- package/src/mcp/resources.ts +98 -0
- package/src/mcp/server.ts +34 -0
- package/src/mcp/tools.ts +117 -0
- package/src/middleware/auth.ts +103 -0
- package/src/middleware/permissions.ts +35 -0
- package/src/pattern-store.ts +409 -0
- package/tests/agent-mode.test.ts +536 -0
- package/tests/api-handlers.test.ts +1245 -0
- package/tests/archive-unpacker.test.ts +179 -0
- package/tests/artifact-analyzer.test.ts +240 -0
- package/tests/auth-middleware.test.ts +189 -0
- package/tests/decision-diary.test.ts +957 -0
- package/tests/diary-reader.test.ts +782 -0
- package/tests/envoy-client.test.ts +342 -0
- package/tests/envoy-reports.test.ts +156 -0
- package/tests/mcp-tools.test.ts +213 -0
- package/tests/orchestration.test.ts +536 -0
- package/tests/partition-deletion.test.ts +143 -0
- package/tests/partition-isolation.test.ts +830 -0
- package/tests/pattern-store.test.ts +371 -0
- package/tests/rbac-enforcement.test.ts +409 -0
- package/tests/ssrf-validation.test.ts +56 -0
- package/tests/stale-deployment.test.ts +85 -0
- package/tests/step-runner.test.ts +308 -0
- package/tests/ui-journey.test.ts +330 -0
- package/tsconfig.json +11 -0
- package/vitest.config.ts +27 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Legacy deployment step type — kept for backward compatibility with step-runner. */
|
|
2
|
+
interface DeploymentStep {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
type: string;
|
|
6
|
+
command: string;
|
|
7
|
+
order: number;
|
|
8
|
+
}
|
|
9
|
+
export interface StepResult {
|
|
10
|
+
success: boolean;
|
|
11
|
+
exitCode: number | null;
|
|
12
|
+
stdout: string;
|
|
13
|
+
stderr: string;
|
|
14
|
+
durationMs: number;
|
|
15
|
+
timedOut: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface StepValidationWarning {
|
|
18
|
+
pattern: string;
|
|
19
|
+
description: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function validateCommand(command: string): StepValidationWarning[];
|
|
22
|
+
/**
|
|
23
|
+
* Executes a deployment step's shell command with variable injection and timeout.
|
|
24
|
+
*
|
|
25
|
+
* Variables are injected as environment variables merged with the current
|
|
26
|
+
* process environment. stdout/stderr are truncated to the last 2000 chars
|
|
27
|
+
* to prevent memory issues in debrief entries.
|
|
28
|
+
*/
|
|
29
|
+
export declare function runStep(step: DeploymentStep, variables: Record<string, string>, timeoutMs: number): Promise<StepResult>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=step-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-runner.d.ts","sourceRoot":"","sources":["../../src/agent/step-runner.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAMD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAYD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,EAAE,CAQxE;AAuBD;;;;;;GAMG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,CAAC,CA0CrB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
const DANGEROUS_PATTERNS = [
|
|
3
|
+
{ regex: /\benv\b.*\|/, description: "Pipes environment to another command" },
|
|
4
|
+
{ regex: /\bcurl\b.*-d\s/, description: "Sends data via curl" },
|
|
5
|
+
{ regex: /\bwget\b/, description: "Downloads content via wget" },
|
|
6
|
+
{ regex: /\beval\b/, description: "Uses eval for dynamic execution" },
|
|
7
|
+
{ regex: /`[^`]+`/, description: "Contains backtick command substitution" },
|
|
8
|
+
{ regex: /\/etc\/shadow/, description: "References sensitive system files" },
|
|
9
|
+
{ regex: /\brm\s+-rf\s+\//, description: "Recursive deletion from root" },
|
|
10
|
+
];
|
|
11
|
+
export function validateCommand(command) {
|
|
12
|
+
const warnings = [];
|
|
13
|
+
for (const { regex, description } of DANGEROUS_PATTERNS) {
|
|
14
|
+
if (regex.test(command)) {
|
|
15
|
+
warnings.push({ pattern: regex.source, description });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return warnings;
|
|
19
|
+
}
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Environment isolation — only expose safe host vars + declared variables
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
const SAFE_HOST_VARS = ['PATH', 'HOME', 'SHELL', 'TERM', 'USER', 'LANG'];
|
|
24
|
+
function buildStepEnv(variables) {
|
|
25
|
+
const env = {};
|
|
26
|
+
for (const key of SAFE_HOST_VARS) {
|
|
27
|
+
if (process.env[key])
|
|
28
|
+
env[key] = process.env[key];
|
|
29
|
+
}
|
|
30
|
+
return { ...env, ...variables };
|
|
31
|
+
}
|
|
32
|
+
const MAX_OUTPUT_CHARS = 2000;
|
|
33
|
+
function truncate(output) {
|
|
34
|
+
if (output.length <= MAX_OUTPUT_CHARS)
|
|
35
|
+
return output;
|
|
36
|
+
return "…" + output.slice(-MAX_OUTPUT_CHARS);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Executes a deployment step's shell command with variable injection and timeout.
|
|
40
|
+
*
|
|
41
|
+
* Variables are injected as environment variables merged with the current
|
|
42
|
+
* process environment. stdout/stderr are truncated to the last 2000 chars
|
|
43
|
+
* to prevent memory issues in debrief entries.
|
|
44
|
+
*/
|
|
45
|
+
export function runStep(step, variables, timeoutMs) {
|
|
46
|
+
const start = Date.now();
|
|
47
|
+
const controller = new AbortController();
|
|
48
|
+
return new Promise((resolve) => {
|
|
49
|
+
const child = exec(step.command, {
|
|
50
|
+
env: buildStepEnv(variables),
|
|
51
|
+
signal: controller.signal,
|
|
52
|
+
timeout: timeoutMs,
|
|
53
|
+
}, (error, stdout, stderr) => {
|
|
54
|
+
const durationMs = Date.now() - start;
|
|
55
|
+
if (error && error.killed) {
|
|
56
|
+
resolve({
|
|
57
|
+
success: false,
|
|
58
|
+
exitCode: null,
|
|
59
|
+
stdout: truncate(stdout),
|
|
60
|
+
stderr: truncate(stderr),
|
|
61
|
+
durationMs,
|
|
62
|
+
timedOut: true,
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const exitCode = error ? (error.code ?? 1) : 0;
|
|
67
|
+
resolve({
|
|
68
|
+
success: exitCode === 0,
|
|
69
|
+
exitCode,
|
|
70
|
+
stdout: truncate(stdout),
|
|
71
|
+
stderr: truncate(stderr),
|
|
72
|
+
durationMs,
|
|
73
|
+
timedOut: false,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
// Ensure the child process reference is used to suppress lint warnings
|
|
77
|
+
void child;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=step-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-runner.js","sourceRoot":"","sources":["../../src/agent/step-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import type { Deployment, DeploymentId, DeploymentTrigger, DebriefWriter, AppSettings } from "@synth-deploy/core";
|
|
2
|
+
import type { IArtifactStore, IEnvironmentStore, IPartitionStore } from "@synth-deploy/core";
|
|
3
|
+
import type { ServiceHealthChecker } from "./health-checker.js";
|
|
4
|
+
import type { McpClientManager, McpToolResult } from "./mcp-client-manager.js";
|
|
5
|
+
export interface DeploymentStore {
|
|
6
|
+
save(deployment: Deployment): void;
|
|
7
|
+
get(id: DeploymentId): Deployment | undefined;
|
|
8
|
+
getByPartition(partitionId: string): Deployment[];
|
|
9
|
+
getByArtifact(artifactId: string): Deployment[];
|
|
10
|
+
list(): Deployment[];
|
|
11
|
+
countByEnvironment(envId: string, since: Date): number;
|
|
12
|
+
findByArtifactVersion(artifactId: string, version: string, status?: string): Deployment[];
|
|
13
|
+
findRecentByArtifact(artifactId: string, since: Date, status?: string): Deployment[];
|
|
14
|
+
findLatestByEnvironment(envId: string): Deployment | undefined;
|
|
15
|
+
}
|
|
16
|
+
export interface AgentOptions {
|
|
17
|
+
/** Number of health check retries after initial failure. Default: 1 */
|
|
18
|
+
healthCheckRetries: number;
|
|
19
|
+
/** Base delay between health check retries in ms. Default: 500 */
|
|
20
|
+
healthCheckBackoffMs: number;
|
|
21
|
+
/** Simulated execution delay in ms. Default: 10 */
|
|
22
|
+
executionDelayMs: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Thrown when a pipeline step fails after the agent has reasoned through it
|
|
26
|
+
* and determined the deployment cannot proceed.
|
|
27
|
+
*
|
|
28
|
+
* Carries structured reasoning so the final debrief entry can explain
|
|
29
|
+
* exactly why the deployment was aborted.
|
|
30
|
+
*/
|
|
31
|
+
export declare class OrchestrationError extends Error {
|
|
32
|
+
readonly step: string;
|
|
33
|
+
readonly reasoning: string;
|
|
34
|
+
constructor(step: string, message: string, reasoning: string);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Command Agent — the reasoning engine that orchestrates deployments.
|
|
38
|
+
*
|
|
39
|
+
* Processes deployment requests through a structured pipeline. When a step
|
|
40
|
+
* encounters an unexpected situation, the agent evaluates the specifics —
|
|
41
|
+
* error type, environment context, conflict severity — and makes a
|
|
42
|
+
* context-dependent decision about how to proceed.
|
|
43
|
+
*
|
|
44
|
+
* Key reasoning behaviors:
|
|
45
|
+
*
|
|
46
|
+
* Health check failures:
|
|
47
|
+
* - DNS errors abort immediately (retrying won't resolve infrastructure config)
|
|
48
|
+
* - Timeouts on production get extended backoff (service may be under load)
|
|
49
|
+
* - Connection refused gets standard retry (process may be restarting)
|
|
50
|
+
*
|
|
51
|
+
* Variable conflicts:
|
|
52
|
+
* - Multiple connectivity vars pointing cross-environment → block deployment
|
|
53
|
+
* - Single cross-env connectivity var → proceed with operator warning
|
|
54
|
+
* - Sensitive variable overrides → proceed, log for audit without exposing values
|
|
55
|
+
* - Standard overrides → proceed with precedence rules
|
|
56
|
+
*
|
|
57
|
+
* Every decision is recorded to the Debrief. No silent actions.
|
|
58
|
+
*/
|
|
59
|
+
export declare class SynthAgent {
|
|
60
|
+
private debrief;
|
|
61
|
+
private deployments;
|
|
62
|
+
private artifactStore;
|
|
63
|
+
private environmentStore;
|
|
64
|
+
private partitionStore;
|
|
65
|
+
private healthChecker;
|
|
66
|
+
private settingsReader?;
|
|
67
|
+
private options;
|
|
68
|
+
private explicitOptions;
|
|
69
|
+
mcpClientManager?: McpClientManager;
|
|
70
|
+
constructor(debrief: DebriefWriter, deployments: DeploymentStore, artifactStore: IArtifactStore, environmentStore: IEnvironmentStore, partitionStore: IPartitionStore, healthChecker?: ServiceHealthChecker, options?: Partial<AgentOptions>, settingsReader?: {
|
|
71
|
+
get(): AppSettings;
|
|
72
|
+
} | undefined);
|
|
73
|
+
/**
|
|
74
|
+
* Returns effective agent options. Precedence (highest wins):
|
|
75
|
+
* 1. Explicit constructor options
|
|
76
|
+
* 2. Global settings from SettingsStore
|
|
77
|
+
* 3. DEFAULT_OPTIONS
|
|
78
|
+
*/
|
|
79
|
+
private getEffectiveOptions;
|
|
80
|
+
/**
|
|
81
|
+
* Check whether the caller has the required permission.
|
|
82
|
+
* RBAC enforcement is not yet implemented — always returns true.
|
|
83
|
+
*/
|
|
84
|
+
private checkCallerPermission;
|
|
85
|
+
triggerDeployment(trigger: DeploymentTrigger): Promise<Deployment>;
|
|
86
|
+
/**
|
|
87
|
+
* Survey connected MCP servers and record available external intelligence
|
|
88
|
+
* to the Debrief. This runs before deployment to surface any relevant
|
|
89
|
+
* monitoring data, incident context, or diagnostic tools.
|
|
90
|
+
*
|
|
91
|
+
* Returns the list of tool call results (empty if no servers are connected).
|
|
92
|
+
* Never throws — external server failures must not block deployments.
|
|
93
|
+
*/
|
|
94
|
+
runExternalChecks(partitionId: string, environmentId: string): Promise<McpToolResult[]>;
|
|
95
|
+
private resolveConfiguration;
|
|
96
|
+
/**
|
|
97
|
+
* Analyze all variable conflicts together and produce a risk assessment.
|
|
98
|
+
*
|
|
99
|
+
* This is where genuine reasoning happens — the decision depends on
|
|
100
|
+
* the combination of factors across all conflicts, not just individual
|
|
101
|
+
* pattern matches:
|
|
102
|
+
*
|
|
103
|
+
* - A single cross-env connectivity var might be intentional partition config
|
|
104
|
+
* - Multiple cross-env connectivity vars are almost certainly misconfiguration
|
|
105
|
+
* - Sensitive vars get audit logging regardless of other factors
|
|
106
|
+
* - The assessed risk level determines whether to proceed or block
|
|
107
|
+
*/
|
|
108
|
+
private assessConflictRisk;
|
|
109
|
+
/**
|
|
110
|
+
* Record debrief entries for each conflict category found in the assessment.
|
|
111
|
+
*/
|
|
112
|
+
private recordConflictReasoning;
|
|
113
|
+
/**
|
|
114
|
+
* Detect if a variable's winning value might reference the wrong environment.
|
|
115
|
+
*/
|
|
116
|
+
private detectCrossEnvironmentPattern;
|
|
117
|
+
/**
|
|
118
|
+
* Pre-flight health check with context-dependent retry logic.
|
|
119
|
+
*
|
|
120
|
+
* The retry strategy depends on the error type:
|
|
121
|
+
* - DNS failure → abort immediately (retrying won't fix infrastructure config)
|
|
122
|
+
* - Timeout in production → retry with extended backoff (service under load)
|
|
123
|
+
* - Connection refused → retry with standard backoff (process restarting)
|
|
124
|
+
* - After retries exhausted → fail with environment-appropriate reasoning
|
|
125
|
+
*/
|
|
126
|
+
private preflightHealthCheck;
|
|
127
|
+
/**
|
|
128
|
+
* Analyze a health check failure and decide what to do.
|
|
129
|
+
*
|
|
130
|
+
* The decision depends on three factors:
|
|
131
|
+
* 1. Error type (DNS vs timeout vs connection refused vs server error)
|
|
132
|
+
* 2. Environment context (production gets more patience)
|
|
133
|
+
* 3. Whether retries remain
|
|
134
|
+
*
|
|
135
|
+
* Different factor combinations produce different actions:
|
|
136
|
+
* - DNS failure → abort immediately regardless of retries remaining
|
|
137
|
+
* - Timeout + production + retries remaining → retry with extended backoff
|
|
138
|
+
* - Connection refused + retries remaining → retry with standard backoff
|
|
139
|
+
* - Any error + no retries remaining → abort with environment-specific message
|
|
140
|
+
*/
|
|
141
|
+
private reasonAboutHealthFailure;
|
|
142
|
+
/**
|
|
143
|
+
* Categorize a health check error string into a semantic type.
|
|
144
|
+
* This drives the retry/abort decision tree.
|
|
145
|
+
*/
|
|
146
|
+
private categorizeError;
|
|
147
|
+
private executeDeployment;
|
|
148
|
+
/**
|
|
149
|
+
* Delegate deployment execution to the configured Envoy.
|
|
150
|
+
* Throws OrchestrationError if the Envoy is unreachable or reports failure.
|
|
151
|
+
*/
|
|
152
|
+
private delegateToEnvoy;
|
|
153
|
+
private postDeployVerify;
|
|
154
|
+
private delay;
|
|
155
|
+
}
|
|
156
|
+
export declare class InMemoryDeploymentStore implements DeploymentStore {
|
|
157
|
+
private deployments;
|
|
158
|
+
save(deployment: Deployment): void;
|
|
159
|
+
get(id: DeploymentId): Deployment | undefined;
|
|
160
|
+
getByPartition(partitionId: string): Deployment[];
|
|
161
|
+
getByArtifact(artifactId: string): Deployment[];
|
|
162
|
+
list(): Deployment[];
|
|
163
|
+
countByEnvironment(envId: string, since: Date): number;
|
|
164
|
+
findByArtifactVersion(artifactId: string, version: string, status?: string): Deployment[];
|
|
165
|
+
findRecentByArtifact(artifactId: string, since: Date, status?: string): Deployment[];
|
|
166
|
+
findLatestByEnvironment(envId: string): Deployment | undefined;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=synth-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synth-agent.d.ts","sourceRoot":"","sources":["../../src/agent/synth-agent.ts"],"names":[],"mappings":"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"}
|