clawup 1.0.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 +245 -0
- package/dist/adapters/api-adapter.d.ts +76 -0
- package/dist/adapters/api-adapter.js +250 -0
- package/dist/adapters/api-adapter.js.map +1 -0
- package/dist/adapters/cli-adapter.d.ts +15 -0
- package/dist/adapters/cli-adapter.js +208 -0
- package/dist/adapters/cli-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +22 -0
- package/dist/adapters/index.js +32 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/types.d.ts +135 -0
- package/dist/adapters/types.js +14 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/bin.d.ts +8 -0
- package/dist/bin.js +221 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/config.d.ts +21 -0
- package/dist/commands/config.js +323 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +7 -0
- package/dist/commands/deploy.js +13 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/destroy.d.ts +7 -0
- package/dist/commands/destroy.js +13 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.js +698 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +8 -0
- package/dist/commands/list.js +42 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/push.d.ts +7 -0
- package/dist/commands/push.js +19 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/redeploy.d.ts +7 -0
- package/dist/commands/redeploy.js +13 -0
- package/dist/commands/redeploy.js.map +1 -0
- package/dist/commands/secrets.d.ts +16 -0
- package/dist/commands/secrets.js +169 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/ssh.d.ts +9 -0
- package/dist/commands/ssh.js +108 -0
- package/dist/commands/ssh.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.js +13 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +7 -0
- package/dist/commands/update.js +126 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +7 -0
- package/dist/commands/validate.js +13 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/webhooks.d.ts +7 -0
- package/dist/commands/webhooks.js +13 -0
- package/dist/commands/webhooks.js.map +1 -0
- package/dist/lib/__tests__/identity.test.d.ts +1 -0
- package/dist/lib/__tests__/identity.test.js +186 -0
- package/dist/lib/__tests__/identity.test.js.map +1 -0
- package/dist/lib/__tests__/validate-agent.test.d.ts +1 -0
- package/dist/lib/__tests__/validate-agent.test.js +38 -0
- package/dist/lib/__tests__/validate-agent.test.js.map +1 -0
- package/dist/lib/config.d.ts +69 -0
- package/dist/lib/config.js +218 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +5 -0
- package/dist/lib/constants.js +29 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/exec.d.ts +24 -0
- package/dist/lib/exec.js +63 -0
- package/dist/lib/exec.js.map +1 -0
- package/dist/lib/prerequisites.d.ts +8 -0
- package/dist/lib/prerequisites.js +146 -0
- package/dist/lib/prerequisites.js.map +1 -0
- package/dist/lib/process.d.ts +18 -0
- package/dist/lib/process.js +37 -0
- package/dist/lib/process.js.map +1 -0
- package/dist/lib/pulumi.d.ts +37 -0
- package/dist/lib/pulumi.js +87 -0
- package/dist/lib/pulumi.js.map +1 -0
- package/dist/lib/tailscale.d.ts +75 -0
- package/dist/lib/tailscale.js +251 -0
- package/dist/lib/tailscale.js.map +1 -0
- package/dist/lib/tool-helpers.d.ts +15 -0
- package/dist/lib/tool-helpers.js +35 -0
- package/dist/lib/tool-helpers.js.map +1 -0
- package/dist/lib/ui.d.ts +26 -0
- package/dist/lib/ui.js +86 -0
- package/dist/lib/ui.js.map +1 -0
- package/dist/lib/update-check.d.ts +8 -0
- package/dist/lib/update-check.js +151 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/vendor.d.ts +34 -0
- package/dist/lib/vendor.js +128 -0
- package/dist/lib/vendor.js.map +1 -0
- package/dist/lib/workspace.d.ts +21 -0
- package/dist/lib/workspace.js +170 -0
- package/dist/lib/workspace.js.map +1 -0
- package/dist/tools/deploy.d.ts +16 -0
- package/dist/tools/deploy.js +181 -0
- package/dist/tools/deploy.js.map +1 -0
- package/dist/tools/destroy.d.ts +16 -0
- package/dist/tools/destroy.js +119 -0
- package/dist/tools/destroy.js.map +1 -0
- package/dist/tools/index.d.ts +20 -0
- package/dist/tools/index.js +34 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/push.d.ts +29 -0
- package/dist/tools/push.js +341 -0
- package/dist/tools/push.js.map +1 -0
- package/dist/tools/redeploy.d.ts +17 -0
- package/dist/tools/redeploy.js +181 -0
- package/dist/tools/redeploy.js.map +1 -0
- package/dist/tools/status.d.ts +16 -0
- package/dist/tools/status.js +205 -0
- package/dist/tools/status.js.map +1 -0
- package/dist/tools/validate.d.ts +16 -0
- package/dist/tools/validate.js +219 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tools/webhooks.d.ts +17 -0
- package/dist/tools/webhooks.js +181 -0
- package/dist/tools/webhooks.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/infra/Pulumi.yaml +6 -0
- package/infra/dist/components/cloud-init.js +412 -0
- package/infra/dist/components/config-generator.js +254 -0
- package/infra/dist/components/hetzner-agent.js +162 -0
- package/infra/dist/components/index.js +18 -0
- package/infra/dist/components/openclaw-agent.js +287 -0
- package/infra/dist/components/shared.js +132 -0
- package/infra/dist/components/types.js +6 -0
- package/infra/dist/index.js +387 -0
- package/infra/dist/shared-vpc.js +167 -0
- package/infra/node_modules/@clawup/core/dist/__tests__/schemas.test.d.ts +2 -0
- package/infra/node_modules/@clawup/core/dist/__tests__/schemas.test.d.ts.map +1 -0
- package/infra/node_modules/@clawup/core/dist/__tests__/schemas.test.js +124 -0
- package/infra/node_modules/@clawup/core/dist/__tests__/schemas.test.js.map +1 -0
- package/infra/node_modules/@clawup/core/dist/coding-agent-registry.d.ts +32 -0
- package/infra/node_modules/@clawup/core/dist/coding-agent-registry.d.ts.map +1 -0
- package/infra/node_modules/@clawup/core/dist/coding-agent-registry.js +56 -0
- package/infra/node_modules/@clawup/core/dist/coding-agent-registry.js.map +1 -0
- package/infra/node_modules/@clawup/core/dist/constants.d.ts +137 -0
- package/infra/node_modules/@clawup/core/dist/constants.d.ts.map +1 -0
- package/infra/node_modules/@clawup/core/dist/constants.js +314 -0
- package/infra/node_modules/@clawup/core/dist/constants.js.map +1 -0
- package/infra/node_modules/@clawup/core/dist/dep-registry.d.ts +25 -0
- package/infra/node_modules/@clawup/core/dist/dep-registry.d.ts.map +1 -0
- package/infra/node_modules/@clawup/core/dist/dep-registry.js +46 -0
- package/infra/node_modules/@clawup/core/dist/dep-registry.js.map +1 -0
- package/infra/node_modules/@clawup/core/dist/deps.d.ts +18 -0
- package/infra/node_modules/@clawup/core/dist/deps.d.ts.map +1 -0
- package/infra/node_modules/@clawup/core/dist/deps.js +39 -0
- package/infra/node_modules/@clawup/core/dist/deps.js.map +1 -0
- package/infra/node_modules/@clawup/core/dist/identity.d.ts +20 -0
- package/infra/node_modules/@clawup/core/dist/identity.d.ts.map +1 -0
- package/infra/node_modules/@clawup/core/dist/identity.js +217 -0
- package/infra/node_modules/@clawup/core/dist/identity.js.map +1 -0
- package/infra/node_modules/@clawup/core/dist/index.d.ts +18 -0
- package/infra/node_modules/@clawup/core/dist/index.d.ts.map +1 -0
- package/infra/node_modules/@clawup/core/dist/index.js +52 -0
- package/infra/node_modules/@clawup/core/dist/index.js.map +1 -0
- package/infra/node_modules/@clawup/core/dist/plugin-registry.d.ts +13 -0
- package/infra/node_modules/@clawup/core/dist/plugin-registry.d.ts.map +1 -0
- package/infra/node_modules/@clawup/core/dist/plugin-registry.js +24 -0
- package/infra/node_modules/@clawup/core/dist/plugin-registry.js.map +1 -0
- package/infra/node_modules/@clawup/core/dist/schemas/identity.d.ts +74 -0
- package/infra/node_modules/@clawup/core/dist/schemas/identity.d.ts.map +1 -0
- package/infra/node_modules/@clawup/core/dist/schemas/identity.js +45 -0
- package/infra/node_modules/@clawup/core/dist/schemas/identity.js.map +1 -0
- package/infra/node_modules/@clawup/core/dist/schemas/index.d.ts +6 -0
- package/infra/node_modules/@clawup/core/dist/schemas/index.d.ts.map +1 -0
- package/infra/node_modules/@clawup/core/dist/schemas/index.js +13 -0
- package/infra/node_modules/@clawup/core/dist/schemas/index.js.map +1 -0
- package/infra/node_modules/@clawup/core/dist/schemas/manifest.d.ts +159 -0
- package/infra/node_modules/@clawup/core/dist/schemas/manifest.d.ts.map +1 -0
- package/infra/node_modules/@clawup/core/dist/schemas/manifest.js +54 -0
- package/infra/node_modules/@clawup/core/dist/schemas/manifest.js.map +1 -0
- package/infra/node_modules/@clawup/core/dist/skills.d.ts +30 -0
- package/infra/node_modules/@clawup/core/dist/skills.d.ts.map +1 -0
- package/infra/node_modules/@clawup/core/dist/skills.js +52 -0
- package/infra/node_modules/@clawup/core/dist/skills.js.map +1 -0
- package/infra/node_modules/@clawup/core/dist/types.d.ts +59 -0
- package/infra/node_modules/@clawup/core/dist/types.d.ts.map +1 -0
- package/infra/node_modules/@clawup/core/dist/types.js +30 -0
- package/infra/node_modules/@clawup/core/dist/types.js.map +1 -0
- package/infra/node_modules/@clawup/core/package.json +46 -0
- package/infra/package.json +12 -0
- package/package.json +43 -0
- package/scripts/postinstall.mjs +395 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Deploy Tool — Deploy agents with pulumi up
|
|
4
|
+
*
|
|
5
|
+
* Platform-agnostic implementation using RuntimeAdapter.
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.deployTool = void 0;
|
|
12
|
+
const config_1 = require("../lib/config");
|
|
13
|
+
const core_1 = require("@clawup/core");
|
|
14
|
+
const workspace_1 = require("../lib/workspace");
|
|
15
|
+
const tailscale_1 = require("../lib/tailscale");
|
|
16
|
+
const tool_helpers_1 = require("../lib/tool-helpers");
|
|
17
|
+
const ui_1 = require("../lib/ui");
|
|
18
|
+
const picocolors_1 = __importDefault(require("picocolors"));
|
|
19
|
+
/**
|
|
20
|
+
* Deploy tool implementation
|
|
21
|
+
*/
|
|
22
|
+
const deployTool = async (runtime, options) => {
|
|
23
|
+
const { ui, exec } = runtime;
|
|
24
|
+
ui.intro("Agent Army");
|
|
25
|
+
// Ensure workspace is set up (no-op in dev mode)
|
|
26
|
+
const wsResult = (0, workspace_1.ensureWorkspace)();
|
|
27
|
+
if (!wsResult.ok) {
|
|
28
|
+
ui.log.error(wsResult.error ?? "Failed to set up workspace.");
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const cwd = (0, workspace_1.getWorkspaceDir)();
|
|
32
|
+
// Resolve config name and load manifest
|
|
33
|
+
let configName;
|
|
34
|
+
try {
|
|
35
|
+
configName = (0, config_1.resolveConfigName)(options.config);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
ui.log.error(err.message);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
const manifest = (0, config_1.loadManifest)(configName);
|
|
42
|
+
if (!manifest) {
|
|
43
|
+
ui.log.error(`Config '${configName}' could not be loaded.`);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
// Select/create stack
|
|
47
|
+
const selectResult = exec.capture("pulumi", ["stack", "select", manifest.stackName], cwd);
|
|
48
|
+
if (selectResult.exitCode !== 0) {
|
|
49
|
+
const initResult = exec.capture("pulumi", ["stack", "init", manifest.stackName], cwd);
|
|
50
|
+
if (initResult.exitCode !== 0) {
|
|
51
|
+
ui.log.error(initResult.stderr || selectResult.stderr);
|
|
52
|
+
ui.log.error(`Could not select Pulumi stack "${manifest.stackName}".`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Calculate estimated cost
|
|
57
|
+
const totalCost = manifest.agents.reduce((sum, a) => {
|
|
58
|
+
const costs = manifest.provider === "hetzner" ? core_1.HETZNER_COST_ESTIMATES : core_1.COST_ESTIMATES;
|
|
59
|
+
return sum + (costs[a.instanceType ?? manifest.instanceType] ?? 30);
|
|
60
|
+
}, 0);
|
|
61
|
+
// Show deployment summary
|
|
62
|
+
ui.note([
|
|
63
|
+
`Stack: ${manifest.stackName}`,
|
|
64
|
+
`Region: ${manifest.region}`,
|
|
65
|
+
``,
|
|
66
|
+
`Agents (${manifest.agents.length}):`,
|
|
67
|
+
(0, ui_1.formatAgentList)(manifest.agents),
|
|
68
|
+
``,
|
|
69
|
+
`Estimated cost: ${(0, ui_1.formatCost)(totalCost)}`,
|
|
70
|
+
].join("\n"), "Deployment Summary");
|
|
71
|
+
// Confirm deployment
|
|
72
|
+
if (!options.yes) {
|
|
73
|
+
const confirmed = await ui.confirm({
|
|
74
|
+
message: "Proceed with deployment?",
|
|
75
|
+
});
|
|
76
|
+
if (!confirmed) {
|
|
77
|
+
ui.cancel("Deployment cancelled.");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Sync manifest to project root so the Pulumi program can read it
|
|
81
|
+
(0, config_1.syncManifestToProject)(configName, cwd);
|
|
82
|
+
// Sync instanceType from manifest to Pulumi config
|
|
83
|
+
exec.capture("pulumi", ["config", "set", "instanceType", manifest.instanceType], cwd);
|
|
84
|
+
// Clean up stale Tailscale devices before deploying
|
|
85
|
+
// This prevents duplicates when Pulumi replaces servers (create-before-delete)
|
|
86
|
+
const tailnetDnsName = (0, tool_helpers_1.getConfig)(exec, "tailnetDnsName", cwd);
|
|
87
|
+
const tailscaleApiKey = (0, tool_helpers_1.getConfig)(exec, "tailscaleApiKey", cwd);
|
|
88
|
+
if (tailnetDnsName && tailscaleApiKey) {
|
|
89
|
+
const spinner = ui.spinner("Cleaning up stale Tailscale devices...");
|
|
90
|
+
const { cleaned, failed } = (0, tailscale_1.cleanupTailscaleDevices)(tailscaleApiKey, tailnetDnsName, manifest.stackName, manifest.agents);
|
|
91
|
+
if (cleaned.length > 0) {
|
|
92
|
+
spinner.stop(`Removed ${cleaned.length} stale Tailscale device(s)`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
spinner.stop("No stale Tailscale devices found");
|
|
96
|
+
}
|
|
97
|
+
if (failed.length > 0) {
|
|
98
|
+
ui.log.warn(`Could not remove some devices: ${failed.join(", ")}. Check https://login.tailscale.com/admin/machines`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Ensure MagicDNS is enabled (required for Tailscale hostname resolution)
|
|
102
|
+
if (tailscaleApiKey) {
|
|
103
|
+
const spinner = ui.spinner("Ensuring Tailscale MagicDNS is enabled...");
|
|
104
|
+
const magicDnsChanged = (0, tailscale_1.ensureMagicDns)(tailscaleApiKey);
|
|
105
|
+
spinner.stop(magicDnsChanged ? "MagicDNS enabled" : "MagicDNS OK");
|
|
106
|
+
}
|
|
107
|
+
// Ensure Tailscale Funnel prerequisites (identity plugins may need webhooks)
|
|
108
|
+
if (tailscaleApiKey) {
|
|
109
|
+
const spinner = ui.spinner("Ensuring Tailscale Funnel prerequisites...");
|
|
110
|
+
const funnel = (0, tailscale_1.ensureTailscaleFunnel)(tailscaleApiKey);
|
|
111
|
+
const changes = [];
|
|
112
|
+
if (funnel.funnelAcl)
|
|
113
|
+
changes.push("Funnel ACL enabled");
|
|
114
|
+
spinner.stop(changes.length > 0 ? changes.join(", ") : "Funnel prerequisites OK");
|
|
115
|
+
}
|
|
116
|
+
// Deploy
|
|
117
|
+
ui.log.step("Running pulumi up...");
|
|
118
|
+
console.log();
|
|
119
|
+
const exitCode = await exec.stream("pulumi", ["up", "--yes"], { cwd });
|
|
120
|
+
console.log();
|
|
121
|
+
if (exitCode !== 0) {
|
|
122
|
+
ui.log.error("Deployment failed. Check the output above for details.");
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
ui.log.success("Deployment complete!");
|
|
126
|
+
// Show outputs
|
|
127
|
+
const outputsResult = exec.capture("pulumi", [
|
|
128
|
+
"stack",
|
|
129
|
+
"output",
|
|
130
|
+
"--json",
|
|
131
|
+
"--show-secrets",
|
|
132
|
+
], cwd);
|
|
133
|
+
if (outputsResult.exitCode === 0) {
|
|
134
|
+
try {
|
|
135
|
+
const outputs = JSON.parse(outputsResult.stdout);
|
|
136
|
+
const lines = [];
|
|
137
|
+
for (const agent of manifest.agents) {
|
|
138
|
+
const urlKey = `${agent.role}TailscaleUrl`;
|
|
139
|
+
const ipKey = `${agent.role}PublicIp`;
|
|
140
|
+
const idKey = `${agent.role}InstanceId`;
|
|
141
|
+
lines.push(`${agent.displayName} (${agent.role}):`);
|
|
142
|
+
if (outputs[urlKey])
|
|
143
|
+
lines.push(` Tailscale URL: ${outputs[urlKey]}`);
|
|
144
|
+
if (outputs[ipKey])
|
|
145
|
+
lines.push(` Public IP: ${outputs[ipKey]}`);
|
|
146
|
+
if (outputs[idKey])
|
|
147
|
+
lines.push(` Instance ID: ${outputs[idKey]}`);
|
|
148
|
+
lines.push("");
|
|
149
|
+
}
|
|
150
|
+
ui.note(lines.join("\n"), "Agent Details");
|
|
151
|
+
// Show webhook URLs if available
|
|
152
|
+
const webhookLines = [];
|
|
153
|
+
for (const agent of manifest.agents) {
|
|
154
|
+
const webhookUrl = outputs[`${agent.role}WebhookUrl`];
|
|
155
|
+
if (webhookUrl) {
|
|
156
|
+
webhookLines.push(` ${agent.displayName} (${agent.role}): ${webhookUrl}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (webhookLines.length > 0) {
|
|
160
|
+
ui.note(webhookLines.join("\n"), "Webhook URLs");
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
ui.log.warn(`Could not parse stack outputs: ${err instanceof Error ? err.message : String(err)}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Remind user about Tailscale if not connected
|
|
168
|
+
if (!(0, tailscale_1.isTailscaleInstalled)()) {
|
|
169
|
+
const hint = process.platform === "darwin"
|
|
170
|
+
? "Install from the Mac App Store or https://tailscale.com/download"
|
|
171
|
+
: "Install from https://tailscale.com/download";
|
|
172
|
+
ui.log.warn(`Tailscale is required to connect to agents.\n ${hint}\n Then run: ${picocolors_1.default.cyan("tailscale up")}`);
|
|
173
|
+
}
|
|
174
|
+
else if (!(0, tailscale_1.isTailscaleRunning)()) {
|
|
175
|
+
ui.log.warn(`Tailscale is not running. Start it before validating agents.\n Open the Tailscale app or run: ${picocolors_1.default.cyan("tailscale up")}`);
|
|
176
|
+
}
|
|
177
|
+
ui.log.info(`Run ${picocolors_1.default.cyan("clawup webhooks setup")} to configure Linear webhooks for your agents.`);
|
|
178
|
+
ui.outro("Agents will be ready in 3-5 minutes. Run `clawup validate` to check.");
|
|
179
|
+
};
|
|
180
|
+
exports.deployTool = deployTool;
|
|
181
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../tools/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Destroy Tool — Tear down resources with safety confirmations
|
|
3
|
+
*
|
|
4
|
+
* Platform-agnostic implementation using RuntimeAdapter.
|
|
5
|
+
*/
|
|
6
|
+
import type { ToolImplementation } from "../adapters";
|
|
7
|
+
export interface DestroyOptions {
|
|
8
|
+
/** Skip confirmation prompts (dangerous!) */
|
|
9
|
+
yes?: boolean;
|
|
10
|
+
/** Config name (auto-detected if only one) */
|
|
11
|
+
config?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Destroy tool implementation
|
|
15
|
+
*/
|
|
16
|
+
export declare const destroyTool: ToolImplementation<DestroyOptions>;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Destroy Tool — Tear down resources with safety confirmations
|
|
4
|
+
*
|
|
5
|
+
* Platform-agnostic implementation using RuntimeAdapter.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.destroyTool = void 0;
|
|
9
|
+
const config_1 = require("../lib/config");
|
|
10
|
+
const tailscale_1 = require("../lib/tailscale");
|
|
11
|
+
const workspace_1 = require("../lib/workspace");
|
|
12
|
+
const tool_helpers_1 = require("../lib/tool-helpers");
|
|
13
|
+
const ui_1 = require("../lib/ui");
|
|
14
|
+
/**
|
|
15
|
+
* Destroy tool implementation
|
|
16
|
+
*/
|
|
17
|
+
const destroyTool = async (runtime, options) => {
|
|
18
|
+
const { ui, exec } = runtime;
|
|
19
|
+
ui.intro("Agent Army");
|
|
20
|
+
// Ensure workspace is set up (no-op in dev mode)
|
|
21
|
+
const wsResult = (0, workspace_1.ensureWorkspace)();
|
|
22
|
+
if (!wsResult.ok) {
|
|
23
|
+
ui.log.error(wsResult.error ?? "Failed to set up workspace.");
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const cwd = (0, workspace_1.getWorkspaceDir)();
|
|
27
|
+
// Resolve config name and load manifest
|
|
28
|
+
let configName;
|
|
29
|
+
try {
|
|
30
|
+
configName = (0, config_1.resolveConfigName)(options.config);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
ui.log.error(err.message);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
const manifest = (0, config_1.loadManifest)(configName);
|
|
37
|
+
if (!manifest) {
|
|
38
|
+
ui.log.error(`Config '${configName}' could not be loaded.`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
// Select/create stack
|
|
42
|
+
const selectResult = exec.capture("pulumi", ["stack", "select", manifest.stackName], cwd);
|
|
43
|
+
if (selectResult.exitCode !== 0) {
|
|
44
|
+
const initResult = exec.capture("pulumi", ["stack", "init", manifest.stackName], cwd);
|
|
45
|
+
if (initResult.exitCode !== 0) {
|
|
46
|
+
ui.log.error(`Could not select Pulumi stack "${manifest.stackName}".`);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Show what will be destroyed (provider-aware)
|
|
51
|
+
const manifestProvider = manifest.provider ?? "aws";
|
|
52
|
+
const resourceLabel = manifestProvider === "hetzner" ? "Hetzner servers" : "EC2 instances";
|
|
53
|
+
const infraLabel = manifestProvider === "hetzner" ? "Firewall rules" : "VPC, subnet, and security group";
|
|
54
|
+
ui.note([
|
|
55
|
+
`Stack: ${manifest.stackName}`,
|
|
56
|
+
`Region: ${manifest.region}`,
|
|
57
|
+
``,
|
|
58
|
+
`Agents (${manifest.agents.length}):`,
|
|
59
|
+
(0, ui_1.formatAgentList)(manifest.agents),
|
|
60
|
+
``,
|
|
61
|
+
`This will PERMANENTLY DESTROY:`,
|
|
62
|
+
` - ${manifest.agents.length} ${resourceLabel}`,
|
|
63
|
+
` - All workspace data on those instances`,
|
|
64
|
+
` - ${infraLabel}`,
|
|
65
|
+
` - Tailscale device registrations`,
|
|
66
|
+
].join("\n"), "Destruction Plan");
|
|
67
|
+
// Confirm
|
|
68
|
+
if (!options.yes) {
|
|
69
|
+
const typedName = await ui.text({
|
|
70
|
+
message: `Type the stack name to confirm: "${manifest.stackName}"`,
|
|
71
|
+
validate: (val) => {
|
|
72
|
+
if (val !== manifest.stackName)
|
|
73
|
+
return `Must type "${manifest.stackName}" to confirm`;
|
|
74
|
+
return undefined;
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
const confirmed = await ui.confirm({
|
|
78
|
+
message: "Are you ABSOLUTELY sure?",
|
|
79
|
+
initialValue: false,
|
|
80
|
+
});
|
|
81
|
+
if (!confirmed) {
|
|
82
|
+
ui.cancel("Destruction cancelled.");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Sync manifest to project root so the Pulumi program can read it
|
|
86
|
+
(0, config_1.syncManifestToProject)(configName, cwd);
|
|
87
|
+
// Destroy infrastructure
|
|
88
|
+
ui.log.step("Running pulumi destroy...");
|
|
89
|
+
console.log();
|
|
90
|
+
const exitCode = await exec.stream("pulumi", ["destroy", "--yes"], { cwd });
|
|
91
|
+
console.log();
|
|
92
|
+
if (exitCode !== 0) {
|
|
93
|
+
ui.log.error("Destruction failed. Check the output above for details.");
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
// Clean up Tailscale devices after infrastructure is destroyed
|
|
97
|
+
const tailnetDnsName = (0, tool_helpers_1.getConfig)(exec, "tailnetDnsName", cwd);
|
|
98
|
+
const tailscaleApiKey = (0, tool_helpers_1.getConfig)(exec, "tailscaleApiKey", cwd);
|
|
99
|
+
if (tailnetDnsName && tailscaleApiKey) {
|
|
100
|
+
const spinner = ui.spinner("Removing agents from Tailscale...");
|
|
101
|
+
const { cleaned, failed } = (0, tailscale_1.cleanupTailscaleDevices)(tailscaleApiKey, tailnetDnsName, manifest.stackName, manifest.agents);
|
|
102
|
+
if (failed.length === 0) {
|
|
103
|
+
spinner.stop(cleaned.length > 0 ? "Tailscale devices cleaned up" : "No Tailscale devices found");
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
spinner.stop("Some Tailscale devices could not be removed");
|
|
107
|
+
ui.log.warn(`Could not remove: ${failed.join(", ")}. Remove manually from https://login.tailscale.com/admin/machines`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else if (tailnetDnsName && !tailscaleApiKey) {
|
|
111
|
+
ui.log.warn("No Tailscale API key configured - devices must be removed manually.");
|
|
112
|
+
console.log(" Remove devices at: https://login.tailscale.com/admin/machines");
|
|
113
|
+
console.log(" Tip: Set a Tailscale API key (`clawup init`) for automatic cleanup.");
|
|
114
|
+
}
|
|
115
|
+
ui.log.success(`Stack "${manifest.stackName}" has been destroyed.`);
|
|
116
|
+
ui.outro("Done!");
|
|
117
|
+
};
|
|
118
|
+
exports.destroyTool = destroyTool;
|
|
119
|
+
//# sourceMappingURL=destroy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../tools/destroy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tools Module
|
|
3
|
+
*
|
|
4
|
+
* Platform-agnostic tool implementations using the RuntimeAdapter pattern.
|
|
5
|
+
* Each tool is a ToolImplementation that can run with any adapter.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* import { deployTool, createCLIAdapter } from './tools';
|
|
9
|
+
*
|
|
10
|
+
* // Run with CLI adapter
|
|
11
|
+
* await deployTool(createCLIAdapter(), { yes: false });
|
|
12
|
+
*/
|
|
13
|
+
export { deployTool, type DeployOptions } from "./deploy";
|
|
14
|
+
export { statusTool, type StatusOptions } from "./status";
|
|
15
|
+
export { validateTool, type ValidateOptions } from "./validate";
|
|
16
|
+
export { destroyTool, type DestroyOptions } from "./destroy";
|
|
17
|
+
export { redeployTool, type RedeployOptions } from "./redeploy";
|
|
18
|
+
export { pushTool, type PushOptions } from "./push";
|
|
19
|
+
export { webhooksSetupTool, type WebhooksSetupOptions } from "./webhooks";
|
|
20
|
+
export { type RuntimeAdapter, type ToolImplementation, type ToolDefinition, createCLIAdapter, } from "../adapters";
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tools Module
|
|
4
|
+
*
|
|
5
|
+
* Platform-agnostic tool implementations using the RuntimeAdapter pattern.
|
|
6
|
+
* Each tool is a ToolImplementation that can run with any adapter.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* import { deployTool, createCLIAdapter } from './tools';
|
|
10
|
+
*
|
|
11
|
+
* // Run with CLI adapter
|
|
12
|
+
* await deployTool(createCLIAdapter(), { yes: false });
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.createCLIAdapter = exports.webhooksSetupTool = exports.pushTool = exports.redeployTool = exports.destroyTool = exports.validateTool = exports.statusTool = exports.deployTool = void 0;
|
|
16
|
+
// Export all tools
|
|
17
|
+
var deploy_1 = require("./deploy");
|
|
18
|
+
Object.defineProperty(exports, "deployTool", { enumerable: true, get: function () { return deploy_1.deployTool; } });
|
|
19
|
+
var status_1 = require("./status");
|
|
20
|
+
Object.defineProperty(exports, "statusTool", { enumerable: true, get: function () { return status_1.statusTool; } });
|
|
21
|
+
var validate_1 = require("./validate");
|
|
22
|
+
Object.defineProperty(exports, "validateTool", { enumerable: true, get: function () { return validate_1.validateTool; } });
|
|
23
|
+
var destroy_1 = require("./destroy");
|
|
24
|
+
Object.defineProperty(exports, "destroyTool", { enumerable: true, get: function () { return destroy_1.destroyTool; } });
|
|
25
|
+
var redeploy_1 = require("./redeploy");
|
|
26
|
+
Object.defineProperty(exports, "redeployTool", { enumerable: true, get: function () { return redeploy_1.redeployTool; } });
|
|
27
|
+
var push_1 = require("./push");
|
|
28
|
+
Object.defineProperty(exports, "pushTool", { enumerable: true, get: function () { return push_1.pushTool; } });
|
|
29
|
+
var webhooks_1 = require("./webhooks");
|
|
30
|
+
Object.defineProperty(exports, "webhooksSetupTool", { enumerable: true, get: function () { return webhooks_1.webhooksSetupTool; } });
|
|
31
|
+
// Re-export adapter types and factory for convenience
|
|
32
|
+
var adapters_1 = require("../adapters");
|
|
33
|
+
Object.defineProperty(exports, "createCLIAdapter", { enumerable: true, get: function () { return adapters_1.createCLIAdapter; } });
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../tools/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAEH,mBAAmB;AACnB,mCAA0D;AAAjD,oGAAA,UAAU,OAAA;AACnB,mCAA0D;AAAjD,oGAAA,UAAU,OAAA;AACnB,uCAAgE;AAAvD,wGAAA,YAAY,OAAA;AACrB,qCAA6D;AAApD,sGAAA,WAAW,OAAA;AACpB,uCAAgE;AAAvD,wGAAA,YAAY,OAAA;AACrB,+BAAoD;AAA3C,gGAAA,QAAQ,OAAA;AACjB,uCAA0E;AAAjE,6GAAA,iBAAiB,OAAA;AAE1B,sDAAsD;AACtD,wCAKqB;AADnB,4GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Push Tool — Live-update running agents via Tailscale SSH
|
|
3
|
+
*
|
|
4
|
+
* Syncs workspace files, skills, config, and OpenClaw updates to
|
|
5
|
+
* running agent instances without redeploying infrastructure.
|
|
6
|
+
*
|
|
7
|
+
* Platform-agnostic implementation using RuntimeAdapter.
|
|
8
|
+
*/
|
|
9
|
+
import type { ToolImplementation } from "../adapters";
|
|
10
|
+
export interface PushOptions {
|
|
11
|
+
/** Sync skills to remote workspace */
|
|
12
|
+
skills?: boolean;
|
|
13
|
+
/** Sync workspace files to remote agents */
|
|
14
|
+
workspace?: boolean;
|
|
15
|
+
/** Remove remote memory/ dir and MEMORY.md */
|
|
16
|
+
memoryReset?: boolean;
|
|
17
|
+
/** Run npm install -g openclaw@latest + gateway restart */
|
|
18
|
+
openclaw?: boolean;
|
|
19
|
+
/** Copy local openclaw.json to remote + gateway restart */
|
|
20
|
+
pushConfig?: boolean;
|
|
21
|
+
/** Filter to a single agent (name, role, or alias) */
|
|
22
|
+
agent?: string;
|
|
23
|
+
/** Config name (auto-detected if only one) */
|
|
24
|
+
config?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Push tool implementation
|
|
28
|
+
*/
|
|
29
|
+
export declare const pushTool: ToolImplementation<PushOptions>;
|