swallowkit 2.0.0-alpha.5 → 2.0.0-alpha.7
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/cli/commands/provision.d.ts +4 -1
- package/dist/cli/commands/provision.d.ts.map +1 -1
- package/dist/cli/commands/provision.js +233 -69
- package/dist/cli/commands/provision.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +14 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/operations/provision-deployment.d.ts +45 -0
- package/dist/core/operations/provision-deployment.d.ts.map +1 -0
- package/dist/core/operations/provision-deployment.js +151 -0
- package/dist/core/operations/provision-deployment.js.map +1 -0
- package/dist/core/operations/provision-operations.d.ts +39 -5
- package/dist/core/operations/provision-operations.d.ts.map +1 -1
- package/dist/core/operations/provision-operations.js +609 -103
- package/dist/core/operations/provision-operations.js.map +1 -1
- package/dist/core/project/capabilities.d.ts +8 -0
- package/dist/core/project/capabilities.d.ts.map +1 -1
- package/dist/core/project/capabilities.js +11 -3
- package/dist/core/project/capabilities.js.map +1 -1
- package/dist/core/project/state.d.ts +7 -0
- package/dist/core/project/state.d.ts.map +1 -1
- package/dist/core/project/state.js +86 -0
- package/dist/core/project/state.js.map +1 -1
- package/dist/core/project/workflows.d.ts.map +1 -1
- package/dist/core/project/workflows.js +30 -2
- package/dist/core/project/workflows.js.map +1 -1
- package/dist/machine/index.d.ts.map +1 -1
- package/dist/machine/index.js +17 -11
- package/dist/machine/index.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -2
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +58 -12
- package/dist/mcp/index.js.map +1 -1
- package/dist/utils/azure-cli.d.ts +16 -4
- package/dist/utils/azure-cli.d.ts.map +1 -1
- package/dist/utils/azure-cli.js +166 -4
- package/dist/utils/azure-cli.js.map +1 -1
- package/dist/utils/azure-diagnostics.d.ts +16 -0
- package/dist/utils/azure-diagnostics.d.ts.map +1 -0
- package/dist/utils/azure-diagnostics.js +68 -0
- package/dist/utils/azure-diagnostics.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/agent-instructions.test.ts +5 -0
- package/src/__tests__/agent-loop-phase34.test.ts +19 -8
- package/src/__tests__/azure-cli.test.ts +5 -2
- package/src/__tests__/fixtures/az wrapper.cmd +2 -0
- package/src/__tests__/fixtures/azure-cli.cjs +138 -0
- package/src/__tests__/fixtures/provision-runner.cjs +28 -0
- package/src/__tests__/mcp.test.ts +56 -0
- package/src/__tests__/provision-runtime.test.ts +636 -0
- package/src/cli/commands/provision.ts +243 -70
- package/src/cli/index.ts +12 -2
- package/src/core/operations/provision-deployment.ts +167 -0
- package/src/core/operations/provision-operations.ts +597 -145
- package/src/core/project/agent-templates/AGENTS.md +22 -0
- package/src/core/project/agent-templates/CLAUDE.md +7 -0
- package/src/core/project/agent-templates/copilot-instructions.md +8 -0
- package/src/core/project/capabilities.ts +19 -3
- package/src/core/project/state.ts +70 -0
- package/src/core/project/workflows.ts +30 -2
- package/src/machine/index.ts +20 -14
- package/src/mcp/index.ts +50 -15
- package/src/utils/azure-cli.ts +167 -6
- package/src/utils/azure-diagnostics.ts +75 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"azure-cli.js","sourceRoot":"","sources":["../../src/utils/azure-cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"azure-cli.js","sourceRoot":"","sources":["../../src/utils/azure-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AzCliResult } from "./azure-cli";
|
|
2
|
+
export declare function redactAzureText(text: string, secretValues?: readonly string[]): string;
|
|
3
|
+
export interface AzureCliDiagnostic {
|
|
4
|
+
phase: string;
|
|
5
|
+
exitCode: number | null;
|
|
6
|
+
signal: NodeJS.Signals | null;
|
|
7
|
+
elapsedMs: number;
|
|
8
|
+
failureKind?: AzCliResult["failureKind"];
|
|
9
|
+
errorCode?: string;
|
|
10
|
+
stdout: string;
|
|
11
|
+
stderr: string;
|
|
12
|
+
outputTruncated: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function azureCliDiagnostic(result: AzCliResult, phase: string, secretValues?: readonly string[]): AzureCliDiagnostic;
|
|
15
|
+
export declare function formatAzureDiagnostic(diagnostic: AzureCliDiagnostic): string;
|
|
16
|
+
//# sourceMappingURL=azure-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-diagnostics.d.ts","sourceRoot":"","sources":["../../src/utils/azure-diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,CAyB1F;AAWD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,GAAE,SAAS,MAAM,EAAO,GAAG,kBAAkB,CAc/H;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,kBAAkB,GAAG,MAAM,CAM5E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.redactAzureText = redactAzureText;
|
|
4
|
+
exports.azureCliDiagnostic = azureCliDiagnostic;
|
|
5
|
+
exports.formatAzureDiagnostic = formatAzureDiagnostic;
|
|
6
|
+
const SENSITIVE_KEY = /outputs|parameters|password|secret|token|authorization|connection.?string|accountkey|api.?key|functions?.?key|client.?secret|access.?key|primary.?key|secondary.?key/i;
|
|
7
|
+
function redactAzureText(text, secretValues = []) {
|
|
8
|
+
const redactValues = (value) => {
|
|
9
|
+
for (const secret of secretValues) {
|
|
10
|
+
if (secret)
|
|
11
|
+
value = value.split(secret).join("[REDACTED]").split(JSON.stringify(secret).slice(1, -1)).join("[REDACTED]");
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
};
|
|
15
|
+
text = redactValues(text);
|
|
16
|
+
let value = text;
|
|
17
|
+
try {
|
|
18
|
+
const redact = (entry) => {
|
|
19
|
+
if (typeof entry === "string")
|
|
20
|
+
return redactPlainText(redactValues(entry));
|
|
21
|
+
if (Array.isArray(entry))
|
|
22
|
+
return entry.map(redact);
|
|
23
|
+
if (entry && typeof entry === "object") {
|
|
24
|
+
return Object.fromEntries(Object.entries(entry).map(([key, item]) => [key, SENSITIVE_KEY.test(key) ? "[REDACTED]" : redact(item)]));
|
|
25
|
+
}
|
|
26
|
+
return entry;
|
|
27
|
+
};
|
|
28
|
+
value = JSON.stringify(redact(JSON.parse(text)));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// An incomplete deployment payload cannot be safely projected/redacted.
|
|
32
|
+
if (/"(?:outputs|parameters)"\s*:/i.test(text))
|
|
33
|
+
return "[Azure payload omitted: may contain secrets]";
|
|
34
|
+
value = redactPlainText(text);
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
function redactPlainText(text) {
|
|
39
|
+
return text
|
|
40
|
+
.replace(/\bBearer\s+[^\s"',;]+/gi, "Bearer [REDACTED]")
|
|
41
|
+
.replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g, "[REDACTED]")
|
|
42
|
+
.replace(/(?:AccountEndpoint|DefaultEndpointsProtocol)=[^\r\n"']+/gi, "[connection string REDACTED]")
|
|
43
|
+
.replace(/((?:api[-_ ]?key|functions?[-_ ]?key|accountkey|password|client[-_ ]?secret|secret|token|access[-_ ]?key|primary[-_ ]?key|secondary[-_ ]?key|authorization)\s*["']?\s*[:=]\s*)(?:"[^"]*"|'[^']*'|[^\s,;}\]]+)/gi, "$1[REDACTED]")
|
|
44
|
+
.replace(/([?&](?:code|sig|token|key|secret|password)=)[^&\s"'<>]+/gi, "$1[REDACTED]");
|
|
45
|
+
}
|
|
46
|
+
function azureCliDiagnostic(result, phase, secretValues = []) {
|
|
47
|
+
const stdout = result.stdoutTruncated ? "[stdout omitted: capture limit reached]" : redactAzureText(result.stdout, secretValues);
|
|
48
|
+
const stderr = result.stderrTruncated ? "[stderr omitted: capture limit reached]" : redactAzureText(result.stderr, secretValues);
|
|
49
|
+
return {
|
|
50
|
+
phase,
|
|
51
|
+
exitCode: result.status,
|
|
52
|
+
signal: result.signal ?? null,
|
|
53
|
+
elapsedMs: result.elapsedMs,
|
|
54
|
+
...(result.failureKind ? { failureKind: result.failureKind } : {}),
|
|
55
|
+
...(result.errorCode ? { errorCode: result.errorCode } : {}),
|
|
56
|
+
stdout: stdout.slice(0, 4000),
|
|
57
|
+
stderr: stderr.slice(0, 4000),
|
|
58
|
+
outputTruncated: result.stdoutTruncated || result.stderrTruncated || stdout.length > 4000 || stderr.length > 4000,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function formatAzureDiagnostic(diagnostic) {
|
|
62
|
+
return [
|
|
63
|
+
`az ${diagnostic.phase}: exit=${diagnostic.exitCode ?? "unknown"}, signal=${diagnostic.signal ?? "none"}, kind=${diagnostic.failureKind ?? "none"}, elapsed=${diagnostic.elapsedMs}ms${diagnostic.errorCode ? `, error=${diagnostic.errorCode}` : ""}${diagnostic.outputTruncated ? ", output omitted/truncated" : ""}`,
|
|
64
|
+
...(diagnostic.stdout ? [`stdout: ${diagnostic.stdout}`] : []),
|
|
65
|
+
...(diagnostic.stderr ? [`stderr: ${diagnostic.stderr}`] : []),
|
|
66
|
+
].join("\n");
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=azure-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-diagnostics.js","sourceRoot":"","sources":["../../src/utils/azure-diagnostics.ts"],"names":[],"mappings":";;AAIA,0CAyBC;AAuBD,gDAcC;AAED,sDAMC;AAxED,MAAM,aAAa,GAAG,uKAAuK,CAAC;AAE9L,SAAgB,eAAe,CAAC,IAAY,EAAE,eAAkC,EAAE;IAChF,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE;QACrC,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;YAClC,IAAI,MAAM;gBAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3H,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,KAAc,EAAW,EAAE;YACzC,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvC,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACtI,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QACF,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,IAAI,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,8CAA8C,CAAC;QACtG,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI;SACR,OAAO,CAAC,yBAAyB,EAAE,mBAAmB,CAAC;SACvD,OAAO,CAAC,wDAAwD,EAAE,YAAY,CAAC;SAC/E,OAAO,CAAC,2DAA2D,EAAE,8BAA8B,CAAC;SACpG,OAAO,CAAC,iNAAiN,EAAE,cAAc,CAAC;SAC1O,OAAO,CAAC,4DAA4D,EAAE,cAAc,CAAC,CAAC;AAC3F,CAAC;AAcD,SAAgB,kBAAkB,CAAC,MAAmB,EAAE,KAAa,EAAE,eAAkC,EAAE;IACzG,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjI,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjI,OAAO;QACL,KAAK;QACL,QAAQ,EAAE,MAAM,CAAC,MAAM;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAK,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAK,CAAC;QAC9B,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,MAAM,GAAG,IAAK,IAAI,MAAM,CAAC,MAAM,GAAG,IAAK;KACpH,CAAC;AACJ,CAAC;AAED,SAAgB,qBAAqB,CAAC,UAA8B;IAClE,OAAO;QACL,MAAM,UAAU,CAAC,KAAK,UAAU,UAAU,CAAC,QAAQ,IAAI,SAAS,YAAY,UAAU,CAAC,MAAM,IAAI,MAAM,UAAU,UAAU,CAAC,WAAW,IAAI,MAAM,aAAa,UAAU,CAAC,SAAS,KAAK,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,EAAE;QACvT,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -57,6 +57,10 @@ describe("coding-agent instruction contract", () => {
|
|
|
57
57
|
expect(agentsMd).toContain("Verification Is a Completion Gate");
|
|
58
58
|
expect(agentsMd).toContain("semantic code review answers different questions");
|
|
59
59
|
expect(agentsMd).toContain("When the status is `requires-human`, stop");
|
|
60
|
+
expect(agentsMd).toContain("machine inspect provision --plan <runId> --wait-seconds 300");
|
|
61
|
+
expect(agentsMd).toContain("outcome: \"succeeded\"");
|
|
62
|
+
expect(agentsMd).toContain("Never re-submit Bicep");
|
|
63
|
+
expect(agentsMd).toContain("must not switch to normal CLI to bypass it");
|
|
60
64
|
expect(agentsMd).toContain("never bypass its\napproval gate");
|
|
61
65
|
});
|
|
62
66
|
|
|
@@ -88,6 +92,7 @@ describe("coding-agent instruction contract", () => {
|
|
|
88
92
|
expect(adapter).toContain("planning");
|
|
89
93
|
expect(adapter).toContain("Never hand-edit deterministic SwallowKit-managed artifacts");
|
|
90
94
|
expect(adapter).toContain("SwallowKit verification");
|
|
95
|
+
expect(adapter).toContain("approval");
|
|
91
96
|
}
|
|
92
97
|
});
|
|
93
98
|
|
|
@@ -18,6 +18,7 @@ import { loadCustomVerifyChecks, compactVerifyResult, runVerify, VerifyResult }
|
|
|
18
18
|
import { buildAgentSkills, buildWorkflowDocs, writeAgentSkills, writeWorkflowDocs } from "../core/project/workflows";
|
|
19
19
|
import { applyProvisionOperation, planProvisionOperation } from "../core/operations/provision-operations";
|
|
20
20
|
import { resetAzCliInvocationCache, setAzCliInvocationForTesting } from "../utils/azure-cli";
|
|
21
|
+
import * as azureCli from "../utils/azure-cli";
|
|
21
22
|
import { createCustomMigration, initializeLegacyMigrations } from "../core/operations/migration-generator";
|
|
22
23
|
import { createMigrationManifest, encodeMigrationState, getMigrationTagKey, saveMigrationManifest } from "../core/project/migrations";
|
|
23
24
|
|
|
@@ -129,6 +130,7 @@ describe("agent loop phase 3/4", () => {
|
|
|
129
130
|
(childProcess.spawnSync as unknown as any).mockReturnValue({ status: 1, stdout: "", stderr: "" });
|
|
130
131
|
// Platform-independent az invocation; the Windows wrapper resolution is covered in azure-cli.test.ts.
|
|
131
132
|
setAzCliInvocationForTesting({ command: "az", prefixArgs: [], source: "az" });
|
|
133
|
+
jest.spyOn(azureCli, "runAzCliAsync").mockImplementation(async (args) => azureCli.runAzCli(args));
|
|
132
134
|
});
|
|
133
135
|
|
|
134
136
|
afterEach(() => {
|
|
@@ -136,6 +138,7 @@ describe("agent loop phase 3/4", () => {
|
|
|
136
138
|
process.chdir(originalCwd);
|
|
137
139
|
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
138
140
|
jest.clearAllMocks();
|
|
141
|
+
jest.restoreAllMocks();
|
|
139
142
|
});
|
|
140
143
|
|
|
141
144
|
it("returns the responsibility boundary contract via inspect boundaries", async () => {
|
|
@@ -317,11 +320,11 @@ describe("agent loop phase 3/4", () => {
|
|
|
317
320
|
(childProcess.spawnSync as unknown as any).mockImplementation((_file: string, args: string[]) => {
|
|
318
321
|
if (args[0] === "--version") return { status: 0, stdout: "azure-cli", stderr: "" };
|
|
319
322
|
if (args[0] === "group" && args[1] === "exists") return { status: 0, stdout: "true\n", stderr: "" };
|
|
320
|
-
if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/
|
|
323
|
+
if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-sample", tags: {} }), stderr: "" };
|
|
321
324
|
return { status: 1, stdout: "", stderr: "unexpected" };
|
|
322
325
|
});
|
|
323
326
|
|
|
324
|
-
const plan = await planProvisionOperation({ resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia" });
|
|
327
|
+
const plan = await planProvisionOperation({ resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia", subscription: "11111111-1111-1111-1111-111111111111" });
|
|
325
328
|
|
|
326
329
|
expect(plan.mode).toBe("adoption-required");
|
|
327
330
|
expect(plan.commands).toEqual([]);
|
|
@@ -336,7 +339,7 @@ describe("agent loop phase 3/4", () => {
|
|
|
336
339
|
(childProcess.spawnSync as unknown as any).mockImplementation((_file: string, args: string[]) => {
|
|
337
340
|
if (args[0] === "--version") return { status: 0, stdout: "azure-cli", stderr: "" };
|
|
338
341
|
if (args[0] === "group" && args[1] === "exists") return { status: 0, stdout: "true\n", stderr: "" };
|
|
339
|
-
if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/
|
|
342
|
+
if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-sample", tags: {} }), stderr: "" };
|
|
340
343
|
if (args[0] === "deployment" && args[2] === "what-if") {
|
|
341
344
|
return { status: 0, stdout: JSON.stringify({ changes: [{ changeType: "Modify", resourceId: "/functions/sample" }] }), stderr: "" };
|
|
342
345
|
}
|
|
@@ -350,6 +353,7 @@ describe("agent loop phase 3/4", () => {
|
|
|
350
353
|
adoptExisting: true,
|
|
351
354
|
baseline: 0,
|
|
352
355
|
whatIf: true,
|
|
356
|
+
subscription: "11111111-1111-1111-1111-111111111111",
|
|
353
357
|
});
|
|
354
358
|
|
|
355
359
|
expect(plan.mode).toBe("adopt");
|
|
@@ -367,7 +371,7 @@ describe("agent loop phase 3/4", () => {
|
|
|
367
371
|
(childProcess.spawnSync as unknown as any).mockImplementation((_file: string, args: string[]) => {
|
|
368
372
|
if (args[0] === "--version") return { status: 0, stdout: "azure-cli", stderr: "" };
|
|
369
373
|
if (args[0] === "group" && args[1] === "exists") return { status: 0, stdout: "true\n", stderr: "" };
|
|
370
|
-
if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/
|
|
374
|
+
if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-sample", tags: {} }), stderr: "" };
|
|
371
375
|
if (args[0] === "deployment" && args[2] === "what-if") return { status: 0, stdout: JSON.stringify({ changes: [] }), stderr: "" };
|
|
372
376
|
return { status: 1, stdout: "", stderr: "unexpected" };
|
|
373
377
|
});
|
|
@@ -377,6 +381,7 @@ describe("agent loop phase 3/4", () => {
|
|
|
377
381
|
location: "japaneast",
|
|
378
382
|
swaLocation: "eastasia",
|
|
379
383
|
reconcile: true,
|
|
384
|
+
subscription: "11111111-1111-1111-1111-111111111111",
|
|
380
385
|
});
|
|
381
386
|
|
|
382
387
|
expect(plan.mode).toBe("reconcile");
|
|
@@ -398,12 +403,12 @@ describe("agent loop phase 3/4", () => {
|
|
|
398
403
|
if (args[0] === "group" && args[1] === "exists") return { status: 0, stdout: "true\n", stderr: "" };
|
|
399
404
|
if (args[0] === "group" && args[1] === "show") {
|
|
400
405
|
const tagKey = getMigrationTagKey(manifest.projectId);
|
|
401
|
-
return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/
|
|
406
|
+
return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-sample", tags: { [tagKey]: tagValue } }), stderr: "" };
|
|
402
407
|
}
|
|
403
408
|
return { status: 1, stdout: "", stderr: "unexpected" };
|
|
404
409
|
});
|
|
405
410
|
|
|
406
|
-
const plan = await planProvisionOperation({ resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia" });
|
|
411
|
+
const plan = await planProvisionOperation({ resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia", subscription: "11111111-1111-1111-1111-111111111111" });
|
|
407
412
|
|
|
408
413
|
expect(plan.mode).toBe("migrate");
|
|
409
414
|
expect(plan.pendingMigrations.map((migration) => migration.version)).toEqual([1]);
|
|
@@ -424,7 +429,13 @@ describe("agent loop phase 3/4", () => {
|
|
|
424
429
|
(childProcess.spawnSync as unknown as any).mockImplementation((_file: string, args: string[]) => {
|
|
425
430
|
if (args[0] === "--version") return { status: 0, stdout: "azure-cli", stderr: "" };
|
|
426
431
|
if (args[0] === "group" && args[1] === "exists") return { status: 0, stdout: "true\n", stderr: "" };
|
|
427
|
-
if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/
|
|
432
|
+
if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-sample", tags: { [tagKey]: tagValue } }), stderr: "" };
|
|
433
|
+
if (args[0] === "deployment" && args[2] === "show") {
|
|
434
|
+
const name = args[args.indexOf("--name") + 1];
|
|
435
|
+
return deployedTemplates.length === 0
|
|
436
|
+
? { status: 1, stdout: "", stderr: "DeploymentNotFound" }
|
|
437
|
+
: { status: 0, stdout: JSON.stringify({ id: `/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-sample/providers/Microsoft.Resources/deployments/${name}`, state: "Succeeded", correlationId: "fixture-correlation" }), stderr: "" };
|
|
438
|
+
}
|
|
428
439
|
if (args[0] === "deployment" && args[2] === "create") {
|
|
429
440
|
deployedTemplates.push(args[args.indexOf("--template-file") + 1]);
|
|
430
441
|
return { status: 0, stdout: JSON.stringify({ properties: { outputs: {} } }), stderr: "" };
|
|
@@ -436,7 +447,7 @@ describe("agent loop phase 3/4", () => {
|
|
|
436
447
|
return { status: 1, stdout: "", stderr: `unexpected: ${args.join(" ")}` };
|
|
437
448
|
});
|
|
438
449
|
|
|
439
|
-
const plan = await planProvisionOperation({ resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia" });
|
|
450
|
+
const plan = await planProvisionOperation({ resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia", subscription: "11111111-1111-1111-1111-111111111111" });
|
|
440
451
|
const result = await applyProvisionOperation({ planId: plan.planId, approve: true });
|
|
441
452
|
|
|
442
453
|
expect(result.executedCommands).toHaveLength(2);
|
|
@@ -2,6 +2,7 @@ import * as childProcess from "child_process";
|
|
|
2
2
|
import * as fs from "fs";
|
|
3
3
|
import * as os from "os";
|
|
4
4
|
import * as path from "path";
|
|
5
|
+
import * as azureCli from "../utils/azure-cli";
|
|
5
6
|
import {
|
|
6
7
|
buildBatchCommandLine,
|
|
7
8
|
checkAzCliAvailability,
|
|
@@ -118,6 +119,7 @@ describe("provision planning with Azure CLI state", () => {
|
|
|
118
119
|
saveMigrationManifest(createMigrationManifest(project, { projectId: "project" }), project);
|
|
119
120
|
process.chdir(project);
|
|
120
121
|
setAzCliInvocationForTesting({ command: "az", prefixArgs: [], source: "az" });
|
|
122
|
+
jest.spyOn(azureCli, "runAzCliAsync").mockImplementation(async (args) => runAzCli(args));
|
|
121
123
|
});
|
|
122
124
|
afterEach(() => {
|
|
123
125
|
process.chdir(originalCwd);
|
|
@@ -125,9 +127,10 @@ describe("provision planning with Azure CLI state", () => {
|
|
|
125
127
|
spawnSyncMock.mockReset();
|
|
126
128
|
spawnSyncMock.mockImplementation(jest.requireActual<typeof import("child_process")>("child_process").spawnSync);
|
|
127
129
|
fs.rmSync(project, { recursive: true, force: true });
|
|
130
|
+
jest.restoreAllMocks();
|
|
128
131
|
});
|
|
129
132
|
|
|
130
|
-
const options = { resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia" };
|
|
133
|
+
const options = { resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia", subscription: "11111111-1111-1111-1111-111111111111" };
|
|
131
134
|
|
|
132
135
|
it("reads Azure state through the resolved CLI and plans a bootstrap", async () => {
|
|
133
136
|
spawnSyncMock.mockImplementation((_command: string, args: string[]) => {
|
|
@@ -150,7 +153,7 @@ describe("provision planning with Azure CLI state", () => {
|
|
|
150
153
|
spawnSyncMock.mockImplementation((_command: string, args: string[]) => {
|
|
151
154
|
if (args[0] === "--version") return { status: 0, stdout: "azure-cli", stderr: "" };
|
|
152
155
|
if (args[0] === "group" && args[1] === "exists") return { status: 0, stdout: `${groupExists}\n`, stderr: "" };
|
|
153
|
-
if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id:
|
|
156
|
+
if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: `/subscriptions/${options.subscription}/resourceGroups/rg-sample`, tags: {} }), stderr: "" };
|
|
154
157
|
return { status: 1, stdout: "", stderr: `unexpected ${args.join(" ")}` };
|
|
155
158
|
});
|
|
156
159
|
const preview = await planProvisionOperation(options, { persist: false });
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
const fs = require("node:fs");
|
|
2
|
+
const args = process.argv.slice(2);
|
|
3
|
+
const emit = (value) => process.stdout.write(JSON.stringify(value));
|
|
4
|
+
|
|
5
|
+
if (args[0] === "process") {
|
|
6
|
+
const mode = args[1];
|
|
7
|
+
if (mode === "warning" || mode === "slow") {
|
|
8
|
+
console.error("WARNING: fixture Bicep warning");
|
|
9
|
+
if (mode === "slow") setTimeout(() => emit({ done: true }), Number(args[2] ?? 600));
|
|
10
|
+
} else if (mode === "flood") {
|
|
11
|
+
process.stdout.write("x".repeat(2 * 1024 * 1024));
|
|
12
|
+
process.stderr.write("y".repeat(2 * 1024 * 1024));
|
|
13
|
+
} else if (mode === "communication") {
|
|
14
|
+
console.error("ConnectionResetError: fixture communication interrupted");
|
|
15
|
+
process.exitCode = 1;
|
|
16
|
+
} else if (mode === "nonzero") {
|
|
17
|
+
console.error("ERROR: fixture az failure");
|
|
18
|
+
process.exitCode = 7;
|
|
19
|
+
} else if (mode === "echo") {
|
|
20
|
+
emit(args.slice(2));
|
|
21
|
+
} else if (mode === "terminate") {
|
|
22
|
+
process.kill(process.pid, "SIGTERM");
|
|
23
|
+
}
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const file = process.env.SWALLOWKIT_AZ_FIXTURE_STATE;
|
|
28
|
+
if (!file) throw new Error("This fixture requires its isolated state file; it never invokes Azure.");
|
|
29
|
+
const state = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
30
|
+
state.calls.push(args);
|
|
31
|
+
const save = () => {
|
|
32
|
+
const temporary = `${file}.tmp-${process.pid}`;
|
|
33
|
+
fs.writeFileSync(temporary, JSON.stringify(state));
|
|
34
|
+
fs.renameSync(temporary, file);
|
|
35
|
+
};
|
|
36
|
+
const value = (flag) => args[args.indexOf(flag) + 1];
|
|
37
|
+
const subscription = state.subscription;
|
|
38
|
+
const resourceGroup = state.resourceGroup;
|
|
39
|
+
const groupId = `/subscriptions/${subscription}/resourceGroups/${resourceGroup}`;
|
|
40
|
+
save();
|
|
41
|
+
|
|
42
|
+
if (args[0] === "--version") {
|
|
43
|
+
process.stdout.write("azure-cli fixture");
|
|
44
|
+
} else if (args[0] === "account" && args[1] === "show") {
|
|
45
|
+
process.stdout.write(subscription);
|
|
46
|
+
} else if (args[0] === "bicep" && args[1] === "build") {
|
|
47
|
+
emit(state.template);
|
|
48
|
+
} else if (args[0] === "group" && args[1] === "exists") {
|
|
49
|
+
process.stdout.write(String(state.groupExists));
|
|
50
|
+
} else if (args[0] === "group" && args[1] === "show") {
|
|
51
|
+
emit({ id: groupId, tags: state.tags });
|
|
52
|
+
} else if (args[0] === "group" && args[1] === "create") {
|
|
53
|
+
state.groupExists = true;
|
|
54
|
+
state.groupCreates++;
|
|
55
|
+
save();
|
|
56
|
+
emit(groupId);
|
|
57
|
+
} else if ((args[0] === "tag" && args[1] === "update") || (args[0] === "group" && args[1] === "update")) {
|
|
58
|
+
state.tagAttempts++;
|
|
59
|
+
const assignment = value(args[0] === "tag" ? "--tags" : "--set").replace(/^tags\./, "");
|
|
60
|
+
const index = assignment.indexOf("=");
|
|
61
|
+
const apply = () => { state.tags[assignment.slice(0, index)] = assignment.slice(index + 1); };
|
|
62
|
+
if (state.failTags > 0) {
|
|
63
|
+
state.failTags--;
|
|
64
|
+
if (state.applyTagBeforeFailure) apply();
|
|
65
|
+
save();
|
|
66
|
+
console.error("ERROR: fixture tag update failed");
|
|
67
|
+
process.exitCode = 9;
|
|
68
|
+
} else {
|
|
69
|
+
apply();
|
|
70
|
+
save();
|
|
71
|
+
}
|
|
72
|
+
} else if (args[0] === "deployment" && args[1] === "operation") {
|
|
73
|
+
emit(state.operations ?? []);
|
|
74
|
+
} else if (args[0] === "deployment" && args[2] === "export") {
|
|
75
|
+
emit(state.remoteTemplate ?? state.template);
|
|
76
|
+
} else if (args[0] === "deployment" && args[2] === "what-if") {
|
|
77
|
+
emit({ changes: [] });
|
|
78
|
+
} else if (args[0] === "deployment" && args[2] === "create") {
|
|
79
|
+
const name = value("--name");
|
|
80
|
+
state.deploymentCreates++;
|
|
81
|
+
state.deployments[name] = {
|
|
82
|
+
correlationId: `fixture-correlation-${state.deploymentCreates}`,
|
|
83
|
+
templateHash: "fixture-template-hash",
|
|
84
|
+
};
|
|
85
|
+
save();
|
|
86
|
+
if (state.warning) console.error("WARNING: The configuration value of bicep.use_binary_from_path has been set to 'false'.");
|
|
87
|
+
if (state.submitStderr) console.error(state.submitStderr);
|
|
88
|
+
if (state.submitMode === "communication") {
|
|
89
|
+
console.error("ConnectionResetError: fixture connection closed after acceptance");
|
|
90
|
+
process.exitCode = 1;
|
|
91
|
+
} else if (state.submitMode === "nonzero") {
|
|
92
|
+
console.error("ERROR: fixture submit exited nonzero");
|
|
93
|
+
process.exitCode = 7;
|
|
94
|
+
} else if (state.submitMode === "flood") {
|
|
95
|
+
process.stdout.write(JSON.stringify({ properties: { outputs: { apiKey: { value: "fixture-secret-do-not-print" } } } }));
|
|
96
|
+
process.stdout.write("x".repeat(2 * 1024 * 1024));
|
|
97
|
+
process.stderr.write("y".repeat(2 * 1024 * 1024));
|
|
98
|
+
} else if (state.submitMode === "slow") {
|
|
99
|
+
setTimeout(() => emit({ accepted: true }), state.submitDelay ?? 2000);
|
|
100
|
+
} else {
|
|
101
|
+
emit({ accepted: true });
|
|
102
|
+
}
|
|
103
|
+
} else if (args[0] === "deployment" && args[2] === "show") {
|
|
104
|
+
const name = value("--name");
|
|
105
|
+
const deployment = state.deployments[name];
|
|
106
|
+
if (!deployment || state.queryMode === "not-found") {
|
|
107
|
+
console.error("ERROR: (DeploymentNotFound) fixture deployment is not visible");
|
|
108
|
+
process.exitCode = 3;
|
|
109
|
+
} else if (state.queryMode === "communication") {
|
|
110
|
+
console.error("ConnectionResetError: fixture status query interrupted");
|
|
111
|
+
process.exitCode = 1;
|
|
112
|
+
} else if (state.queryMode === "invalid") {
|
|
113
|
+
process.stdout.write("{invalid JSON");
|
|
114
|
+
} else if (value("--query") === "properties.parameters") {
|
|
115
|
+
emit(state.parameters);
|
|
116
|
+
} else if (value("--query").includes("properties.outputs.")) {
|
|
117
|
+
if (state.outputQueryFails) {
|
|
118
|
+
console.error("ERROR: resource output query failed");
|
|
119
|
+
process.exitCode = 1;
|
|
120
|
+
} else {
|
|
121
|
+
const outputs = state.outputs ?? {};
|
|
122
|
+
emit(Object.fromEntries(["staticWebAppName", "staticWebAppUrl", "functionsAppName", "functionsAppUrl", "cosmosDbAccountName", "cosmosDatabaseName"].map(key => [key, outputs[key] ?? null])));
|
|
123
|
+
}
|
|
124
|
+
} else {
|
|
125
|
+
const states = state.states ?? ["Succeeded"];
|
|
126
|
+
const provisioningState = states.length > 1 ? states.shift() : states[0];
|
|
127
|
+
save();
|
|
128
|
+
emit({
|
|
129
|
+
id: `${groupId}/providers/Microsoft.Resources/deployments/${name}`,
|
|
130
|
+
name, state: provisioningState,
|
|
131
|
+
correlationId: deployment.correlationId, templateHash: deployment.templateHash,
|
|
132
|
+
error: state.error ?? null,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
} else {
|
|
136
|
+
console.error("ERROR: fixture does not support this command");
|
|
137
|
+
process.exitCode = 4;
|
|
138
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const fs = require("node:fs");
|
|
2
|
+
const path = require("node:path");
|
|
3
|
+
const ts = require("typescript");
|
|
4
|
+
const root = path.resolve(__dirname, "..", "..", "..");
|
|
5
|
+
require.extensions[".ts"] = (module, file) => {
|
|
6
|
+
module._compile(ts.transpileModule(fs.readFileSync(file, "utf8"), {
|
|
7
|
+
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020, esModuleInterop: true },
|
|
8
|
+
fileName: file,
|
|
9
|
+
}).outputText, file);
|
|
10
|
+
};
|
|
11
|
+
const azure = require(path.join(root, "src", "utils", "azure-cli.ts"));
|
|
12
|
+
azure.setAzCliInvocationForTesting({
|
|
13
|
+
command: process.execPath,
|
|
14
|
+
prefixArgs: [path.join(__dirname, "azure-cli.cjs")],
|
|
15
|
+
source: "isolated fixture",
|
|
16
|
+
});
|
|
17
|
+
const provision = require(path.join(root, "src", "core", "operations", "provision-operations.ts"));
|
|
18
|
+
const state = JSON.parse(fs.readFileSync(process.env.SWALLOWKIT_AZ_FIXTURE_STATE, "utf8"));
|
|
19
|
+
void (async () => {
|
|
20
|
+
const plan = await provision.planProvisionOperation({
|
|
21
|
+
resourceGroup: state.resourceGroup, location: "japaneast", swaLocation: "eastasia",
|
|
22
|
+
});
|
|
23
|
+
const result = await provision.executeProvisionPlan(plan, { approve: true });
|
|
24
|
+
console.log(JSON.stringify(result));
|
|
25
|
+
})().catch((error) => {
|
|
26
|
+
console.error(error.message);
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
});
|
|
@@ -8,6 +8,62 @@ const builtMcpEntrypoint = path.resolve(__dirname, "..", "..", "dist", "mcp", "i
|
|
|
8
8
|
const itWhenBuiltEntrypointExists = fs.existsSync(builtMcpEntrypoint) ? it : it.skip;
|
|
9
9
|
|
|
10
10
|
describe("SwallowKit MCP tool definitions", () => {
|
|
11
|
+
it.each([
|
|
12
|
+
{ status: "in-progress", outcome: "in-progress", state: "Running" },
|
|
13
|
+
{ status: "blocked", outcome: "partial", state: "Succeeded" },
|
|
14
|
+
])("does not promote $outcome provisioning to complete", async ({ status, outcome, state }) => {
|
|
15
|
+
const nextActions = [{ command: "swallowkit machine inspect provision --plan 123456789abc", description: "Read original state." }];
|
|
16
|
+
const runner = jest.fn(async () => ({
|
|
17
|
+
stdout: JSON.stringify({ ok: true, command: "apply-provision", status, nextActions, data: { outcome, deployment: { state } } }),
|
|
18
|
+
stderr: "", exitCode: 0,
|
|
19
|
+
}));
|
|
20
|
+
const tool = buildSwallowKitToolDefinitions(runner).find(candidate => candidate.name === "swallowkit_apply_provision")!;
|
|
21
|
+
const result = await tool.handler({ planId: "123456789abc", approve: true, waitSeconds: 0 });
|
|
22
|
+
expect(runner).toHaveBeenCalledWith(["apply", "provision", "--plan", "123456789abc", "--approve", "--wait-seconds", "0"]);
|
|
23
|
+
expect(JSON.parse(result.content[0].text)).toMatchObject({ status, outcome, deployment: { state }, nextActions });
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it.each([
|
|
27
|
+
{ status: "requires-human", code: "approval-required" },
|
|
28
|
+
{ status: "failed", code: "azure-deployment-failed" },
|
|
29
|
+
])("preserves $code and recovery actions", async ({ status, code }) => {
|
|
30
|
+
const nextActions = [{ command: "swallowkit machine apply provision --plan 123456789abc --approve", description: "Obtain human approval." }];
|
|
31
|
+
const runner = jest.fn(async () => ({
|
|
32
|
+
stdout: JSON.stringify({ ok: false, command: "apply-provision", status, error: { code, message: "Fixture error." }, nextActions }),
|
|
33
|
+
stderr: "", exitCode: 1,
|
|
34
|
+
}));
|
|
35
|
+
const tool = buildSwallowKitToolDefinitions(runner).find(candidate => candidate.name === "swallowkit_apply_provision")!;
|
|
36
|
+
const result = await tool.handler({ planId: "123456789abc" });
|
|
37
|
+
expect(runner).toHaveBeenCalledWith(["apply", "provision", "--plan", "123456789abc"]);
|
|
38
|
+
expect(result.isError).toBe(true);
|
|
39
|
+
expect(JSON.parse(result.content[0].text)).toMatchObject({ status, error: { code }, nextActions });
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it.each(["swallowkit_apply_provision", "swallowkit_inspect_provision"])("forwards cancellation and preserves an unknown outcome for %s", async name => {
|
|
43
|
+
const controller = new AbortController();
|
|
44
|
+
const runner = jest.fn(async (_args: string[], signal?: AbortSignal) => {
|
|
45
|
+
expect(signal).toBe(controller.signal);
|
|
46
|
+
controller.abort();
|
|
47
|
+
return { stdout: "", stderr: "", exitCode: 143 };
|
|
48
|
+
});
|
|
49
|
+
const tool = buildSwallowKitToolDefinitions(runner).find(candidate => candidate.name === name)!;
|
|
50
|
+
const result = await tool.handler({ planId: "123456789abc", approve: true }, controller.signal);
|
|
51
|
+
expect(result.isError).toBe(true);
|
|
52
|
+
expect(JSON.parse(result.content[0].text)).toMatchObject({
|
|
53
|
+
status: "blocked", error: { code: "provision-interrupted", details: { outcome: "unknown", localFailure: "cancelled" } },
|
|
54
|
+
nextActions: expect.arrayContaining([expect.objectContaining({ command: "swallowkit machine inspect provision --plan 123456789abc" })]),
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("does not launch provision after the MCP request was already cancelled", async () => {
|
|
59
|
+
const controller = new AbortController();
|
|
60
|
+
controller.abort();
|
|
61
|
+
const runner = jest.fn(async () => ({ stdout: "", stderr: "", exitCode: 1 }));
|
|
62
|
+
const tool = buildSwallowKitToolDefinitions(runner).find(candidate => candidate.name === "swallowkit_apply_provision")!;
|
|
63
|
+
expect((await tool.handler({ planId: "123456789abc", approve: true }, controller.signal)).isError).toBe(true);
|
|
64
|
+
expect(runner).not.toHaveBeenCalled();
|
|
65
|
+
});
|
|
66
|
+
|
|
11
67
|
it("preserves blocked auth prerequisites and nextActions as structured MCP errors", async () => {
|
|
12
68
|
const nextActions = [{ command: "swallowkit machine plan auth --provider swa", description: "Configure auth first." }];
|
|
13
69
|
const runner = jest.fn(async () => ({
|