@indigoai-us/hq-cloud 6.15.4 → 6.15.6
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/push-scan-exclusions.test.d.ts +2 -0
- package/dist/cli/push-scan-exclusions.test.d.ts.map +1 -0
- package/dist/cli/push-scan-exclusions.test.js +87 -0
- package/dist/cli/push-scan-exclusions.test.js.map +1 -0
- package/dist/cli/rescue-exec-bit-preserve.test.js +8 -0
- package/dist/cli/rescue-exec-bit-preserve.test.js.map +1 -1
- package/dist/cli/share.d.ts.map +1 -1
- package/dist/cli/share.js +21 -1
- package/dist/cli/share.js.map +1 -1
- package/dist/cli/share.test.js +82 -0
- package/dist/cli/share.test.js.map +1 -1
- package/dist/cli/sync.d.ts +23 -0
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +9 -0
- package/dist/cli/sync.js.map +1 -1
- package/dist/lib/net-errors.d.ts.map +1 -1
- package/dist/lib/net-errors.js +4 -0
- package/dist/lib/net-errors.js.map +1 -1
- package/dist/machine-auth.test.js +7 -1
- package/dist/machine-auth.test.js.map +1 -1
- package/dist/object-io.d.ts +21 -0
- package/dist/object-io.d.ts.map +1 -1
- package/dist/object-io.js +229 -77
- package/dist/object-io.js.map +1 -1
- package/dist/object-io.test.js +211 -1
- package/dist/object-io.test.js.map +1 -1
- package/dist/outposts/billing.d.ts +41 -0
- package/dist/outposts/billing.d.ts.map +1 -0
- package/dist/outposts/billing.js +53 -0
- package/dist/outposts/billing.js.map +1 -0
- package/dist/outposts/cli-billing.d.ts +59 -0
- package/dist/outposts/cli-billing.d.ts.map +1 -0
- package/dist/outposts/cli-billing.js +93 -0
- package/dist/outposts/cli-billing.js.map +1 -0
- package/dist/outposts/cli.d.ts +13 -0
- package/dist/outposts/cli.d.ts.map +1 -0
- package/dist/outposts/cli.js +13 -0
- package/dist/outposts/cli.js.map +1 -0
- package/dist/outposts/client.d.ts +140 -0
- package/dist/outposts/client.d.ts.map +1 -0
- package/dist/outposts/client.js +271 -0
- package/dist/outposts/client.js.map +1 -0
- package/dist/outposts/client.test.d.ts +9 -0
- package/dist/outposts/client.test.d.ts.map +1 -0
- package/dist/outposts/client.test.js +226 -0
- package/dist/outposts/client.test.js.map +1 -0
- package/dist/outposts/command.d.ts +74 -0
- package/dist/outposts/command.d.ts.map +1 -0
- package/dist/outposts/command.js +661 -0
- package/dist/outposts/command.js.map +1 -0
- package/dist/outposts/command.test.d.ts +18 -0
- package/dist/outposts/command.test.d.ts.map +1 -0
- package/dist/outposts/command.test.js +933 -0
- package/dist/outposts/command.test.js.map +1 -0
- package/dist/outposts/errors.d.ts +32 -0
- package/dist/outposts/errors.d.ts.map +1 -0
- package/dist/outposts/errors.js +72 -0
- package/dist/outposts/errors.js.map +1 -0
- package/dist/outposts/heartbeat-command.d.ts +106 -0
- package/dist/outposts/heartbeat-command.d.ts.map +1 -0
- package/dist/outposts/heartbeat-command.js +186 -0
- package/dist/outposts/heartbeat-command.js.map +1 -0
- package/dist/outposts/host-deps.d.ts +49 -0
- package/dist/outposts/host-deps.d.ts.map +1 -0
- package/dist/outposts/host-deps.js +93 -0
- package/dist/outposts/host-deps.js.map +1 -0
- package/dist/outposts/index.d.ts +36 -0
- package/dist/outposts/index.d.ts.map +1 -0
- package/dist/outposts/index.js +32 -0
- package/dist/outposts/index.js.map +1 -0
- package/dist/outposts/node.d.ts +23 -0
- package/dist/outposts/node.d.ts.map +1 -0
- package/dist/outposts/node.js +22 -0
- package/dist/outposts/node.js.map +1 -0
- package/dist/outposts/remote-command.d.ts +30 -0
- package/dist/outposts/remote-command.d.ts.map +1 -0
- package/dist/outposts/remote-command.js +39 -0
- package/dist/outposts/remote-command.js.map +1 -0
- package/dist/outposts/replica-sync.d.ts +40 -0
- package/dist/outposts/replica-sync.d.ts.map +1 -0
- package/dist/outposts/replica-sync.js +188 -0
- package/dist/outposts/replica-sync.js.map +1 -0
- package/dist/outposts/replica-sync.test.d.ts +2 -0
- package/dist/outposts/replica-sync.test.d.ts.map +1 -0
- package/dist/outposts/replica-sync.test.js +224 -0
- package/dist/outposts/replica-sync.test.js.map +1 -0
- package/dist/outposts/self-deploy.d.ts +47 -0
- package/dist/outposts/self-deploy.d.ts.map +1 -0
- package/dist/outposts/self-deploy.js +188 -0
- package/dist/outposts/self-deploy.js.map +1 -0
- package/dist/outposts/self-deploy.test.d.ts +2 -0
- package/dist/outposts/self-deploy.test.d.ts.map +1 -0
- package/dist/outposts/self-deploy.test.js +186 -0
- package/dist/outposts/self-deploy.test.js.map +1 -0
- package/dist/outposts/session-heartbeat-bounds.test.d.ts +25 -0
- package/dist/outposts/session-heartbeat-bounds.test.d.ts.map +1 -0
- package/dist/outposts/session-heartbeat-bounds.test.js +156 -0
- package/dist/outposts/session-heartbeat-bounds.test.js.map +1 -0
- package/dist/outposts/session-heartbeat-guard.test.d.ts +16 -0
- package/dist/outposts/session-heartbeat-guard.test.d.ts.map +1 -0
- package/dist/outposts/session-heartbeat-guard.test.js +88 -0
- package/dist/outposts/session-heartbeat-guard.test.js.map +1 -0
- package/dist/outposts/session-heartbeat-publisher.d.ts +76 -0
- package/dist/outposts/session-heartbeat-publisher.d.ts.map +1 -0
- package/dist/outposts/session-heartbeat-publisher.js +117 -0
- package/dist/outposts/session-heartbeat-publisher.js.map +1 -0
- package/dist/outposts/session-heartbeat-publisher.test.d.ts +10 -0
- package/dist/outposts/session-heartbeat-publisher.test.d.ts.map +1 -0
- package/dist/outposts/session-heartbeat-publisher.test.js +153 -0
- package/dist/outposts/session-heartbeat-publisher.test.js.map +1 -0
- package/dist/outposts/session-heartbeat-retain-guard.test.d.ts +18 -0
- package/dist/outposts/session-heartbeat-retain-guard.test.d.ts.map +1 -0
- package/dist/outposts/session-heartbeat-retain-guard.test.js +106 -0
- package/dist/outposts/session-heartbeat-retain-guard.test.js.map +1 -0
- package/dist/outposts/session-heartbeat.d.ts +210 -0
- package/dist/outposts/session-heartbeat.d.ts.map +1 -0
- package/dist/outposts/session-heartbeat.js +657 -0
- package/dist/outposts/session-heartbeat.js.map +1 -0
- package/dist/outposts/session-heartbeat.test.d.ts +11 -0
- package/dist/outposts/session-heartbeat.test.d.ts.map +1 -0
- package/dist/outposts/session-heartbeat.test.js +370 -0
- package/dist/outposts/session-heartbeat.test.js.map +1 -0
- package/dist/outposts/ssh.d.ts +29 -0
- package/dist/outposts/ssh.d.ts.map +1 -0
- package/dist/outposts/ssh.js +66 -0
- package/dist/outposts/ssh.js.map +1 -0
- package/dist/outposts/transport.d.ts +76 -0
- package/dist/outposts/transport.d.ts.map +1 -0
- package/dist/outposts/transport.js +91 -0
- package/dist/outposts/transport.js.map +1 -0
- package/dist/outposts/transport.test.d.ts +10 -0
- package/dist/outposts/transport.test.d.ts.map +1 -0
- package/dist/outposts/transport.test.js +116 -0
- package/dist/outposts/transport.test.js.map +1 -0
- package/dist/outposts/types.d.ts +125 -0
- package/dist/outposts/types.d.ts.map +1 -0
- package/dist/outposts/types.js +13 -0
- package/dist/outposts/types.js.map +1 -0
- package/dist/personal-vault.d.ts +69 -0
- package/dist/personal-vault.d.ts.map +1 -1
- package/dist/personal-vault.js +100 -0
- package/dist/personal-vault.js.map +1 -1
- package/dist/personal-vault.test.js +140 -1
- package/dist/personal-vault.test.js.map +1 -1
- package/dist/s3.d.ts.map +1 -1
- package/dist/s3.js +62 -0
- package/dist/s3.js.map +1 -1
- package/dist/s3.test.js +126 -0
- package/dist/s3.test.js.map +1 -1
- package/package.json +39 -3
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
|
|
3
|
+
import { registerOutpostsCommand } from "./command.js";
|
|
4
|
+
import { parseReposManifest } from "./replica-sync.js";
|
|
5
|
+
// The command tree now needs full host deps; replica-sync is the only surface
|
|
6
|
+
// these tests drive, and it makes no control-plane call, so stub the transport
|
|
7
|
+
// and token minimally and route the test host deps through `.host`.
|
|
8
|
+
function outpostsDepsWithHost(host) {
|
|
9
|
+
return {
|
|
10
|
+
transport: async () => new Response("{}", { status: 200 }),
|
|
11
|
+
getToken: async () => "test-token",
|
|
12
|
+
loadCachedTokens: () => ({ refreshToken: "rt_test" }),
|
|
13
|
+
resolveCallerPersonUid: async () => "prs_test",
|
|
14
|
+
defaultApiBaseUrl: "https://hqapi.test.invalid",
|
|
15
|
+
host,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const HQ_ROOT = "/home/ec2-user/hq";
|
|
19
|
+
const SECRET = "refresh-token-that-must-never-be-printed";
|
|
20
|
+
const REPOS_YAML = `repos:
|
|
21
|
+
- url: https://github.com/indigoai-us/hq-pro.git
|
|
22
|
+
visibility: private
|
|
23
|
+
name: hq-pro
|
|
24
|
+
- url: https://github.com/indigoai-us/public-widget.git
|
|
25
|
+
visibility: public
|
|
26
|
+
- url: https://github.com/indigoai-us/hq-cli.git
|
|
27
|
+
visibility: private
|
|
28
|
+
name: hq-cli
|
|
29
|
+
`;
|
|
30
|
+
function ok(stdout = "") {
|
|
31
|
+
return {
|
|
32
|
+
status: 0,
|
|
33
|
+
stdout,
|
|
34
|
+
stderr: "",
|
|
35
|
+
error: undefined,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function replicaDependencies(input = {}) {
|
|
39
|
+
const calls = [];
|
|
40
|
+
const existing = input.existing ?? new Set();
|
|
41
|
+
const mkdirp = vi.fn();
|
|
42
|
+
const deps = {
|
|
43
|
+
defaultHqRoot: () => HQ_ROOT,
|
|
44
|
+
loadCachedTokens: () => "session" in input ? input.session : { refreshToken: SECRET },
|
|
45
|
+
readTextFile: (file) => {
|
|
46
|
+
if (file.endsWith("repos.yaml")) {
|
|
47
|
+
if (input.reposYaml === null)
|
|
48
|
+
throw new Error("ENOENT");
|
|
49
|
+
return input.reposYaml ?? REPOS_YAML;
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`unexpected readTextFile(${file})`);
|
|
52
|
+
},
|
|
53
|
+
pathExists: (p) => existing.has(p),
|
|
54
|
+
mkdirp: mkdirp,
|
|
55
|
+
spawnSync: ((command, args, options) => {
|
|
56
|
+
calls.push({ command, args, options });
|
|
57
|
+
if (input.failRescue && command === "hq" && args[0] === "rescue") {
|
|
58
|
+
return { ...ok(), status: 1 };
|
|
59
|
+
}
|
|
60
|
+
if (input.failAuthRefresh &&
|
|
61
|
+
command === "hq" &&
|
|
62
|
+
args[0] === "auth" &&
|
|
63
|
+
args[1] === "refresh") {
|
|
64
|
+
return { ...ok(), status: 1 };
|
|
65
|
+
}
|
|
66
|
+
return ok();
|
|
67
|
+
}),
|
|
68
|
+
};
|
|
69
|
+
return { deps, calls, mkdirp };
|
|
70
|
+
}
|
|
71
|
+
function buildProgram(deps) {
|
|
72
|
+
const program = new Command();
|
|
73
|
+
program.name("hq").exitOverride();
|
|
74
|
+
registerOutpostsCommand(program, outpostsDepsWithHost(deps));
|
|
75
|
+
return program;
|
|
76
|
+
}
|
|
77
|
+
async function run(deps, args) {
|
|
78
|
+
await buildProgram(deps).parseAsync(["node", "hq", ...args]);
|
|
79
|
+
}
|
|
80
|
+
let logSpy;
|
|
81
|
+
let warnSpy;
|
|
82
|
+
let fetchSpy;
|
|
83
|
+
beforeEach(() => {
|
|
84
|
+
logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
85
|
+
warnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
86
|
+
fetchSpy = vi.spyOn(globalThis, "fetch");
|
|
87
|
+
});
|
|
88
|
+
afterEach(() => {
|
|
89
|
+
vi.restoreAllMocks();
|
|
90
|
+
});
|
|
91
|
+
function printed() {
|
|
92
|
+
return [
|
|
93
|
+
...logSpy.mock.calls.map((c) => c.map(String).join(" ")),
|
|
94
|
+
...warnSpy.mock.calls.map((c) => c.map(String).join(" ")),
|
|
95
|
+
].join("\n");
|
|
96
|
+
}
|
|
97
|
+
function hqArgs(calls) {
|
|
98
|
+
return calls.filter((c) => c.command === "hq").map((c) => c.args);
|
|
99
|
+
}
|
|
100
|
+
describe("parseReposManifest", () => {
|
|
101
|
+
it("resolves visibility + name, defaulting to public + URL basename", () => {
|
|
102
|
+
expect(parseReposManifest(REPOS_YAML)).toEqual([
|
|
103
|
+
{ url: "https://github.com/indigoai-us/hq-pro.git", visibility: "private", name: "hq-pro" },
|
|
104
|
+
{ url: "https://github.com/indigoai-us/public-widget.git", visibility: "public", name: "public-widget" },
|
|
105
|
+
{ url: "https://github.com/indigoai-us/hq-cli.git", visibility: "private", name: "hq-cli" },
|
|
106
|
+
]);
|
|
107
|
+
});
|
|
108
|
+
it("returns [] for junk, empty, or repo-less YAML", () => {
|
|
109
|
+
expect(parseReposManifest("not: valid: [")).toEqual([]);
|
|
110
|
+
expect(parseReposManifest("")).toEqual([]);
|
|
111
|
+
expect(parseReposManifest("other: 1")).toEqual([]);
|
|
112
|
+
});
|
|
113
|
+
it("skips entries with no url", () => {
|
|
114
|
+
expect(parseReposManifest("repos:\n - visibility: public\n - url: https://x/y.git")).toEqual([
|
|
115
|
+
{ url: "https://x/y.git", visibility: "public", name: "y" },
|
|
116
|
+
]);
|
|
117
|
+
});
|
|
118
|
+
it("rejects names that would escape repos/<visibility>/ (path traversal)", () => {
|
|
119
|
+
const yaml = "repos:\n" +
|
|
120
|
+
" - url: https://x/evil.git\n name: ../../etc\n" +
|
|
121
|
+
" - url: https://x/evil2.git\n name: sub/dir\n" +
|
|
122
|
+
" - url: https://x/ok.git\n name: ok\n";
|
|
123
|
+
expect(parseReposManifest(yaml)).toEqual([
|
|
124
|
+
{ url: "https://x/ok.git", visibility: "public", name: "ok" },
|
|
125
|
+
]);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe("hq outposts replica-sync", () => {
|
|
129
|
+
it("is hidden from outposts help but remains invokable", async () => {
|
|
130
|
+
const { deps } = replicaDependencies();
|
|
131
|
+
const program = buildProgram(deps);
|
|
132
|
+
const outposts = program.commands.find((c) => c.name() === "outposts");
|
|
133
|
+
expect(outposts?.helpInformation()).not.toContain("replica-sync");
|
|
134
|
+
await run(deps, ["outposts", "replica-sync"]);
|
|
135
|
+
});
|
|
136
|
+
it("no HQ session → replicates nothing and runs no commands", async () => {
|
|
137
|
+
const { deps, calls } = replicaDependencies({ session: undefined });
|
|
138
|
+
await run(deps, ["outposts", "replica-sync"]);
|
|
139
|
+
expect(calls).toEqual([]);
|
|
140
|
+
expect(printed()).toContain("nothing to replicate");
|
|
141
|
+
});
|
|
142
|
+
it("runs the full replica chain in order on a signed-in box", async () => {
|
|
143
|
+
const { deps, calls, mkdirp } = replicaDependencies();
|
|
144
|
+
await run(deps, ["outposts", "replica-sync"]);
|
|
145
|
+
const args = hqArgs(calls);
|
|
146
|
+
expect(args).toContainEqual(["auth", "refresh"]);
|
|
147
|
+
// The pull is pinned to the SAME --hq-root the command was invoked with,
|
|
148
|
+
// not the default root.
|
|
149
|
+
expect(args).toContainEqual([
|
|
150
|
+
"sync",
|
|
151
|
+
"pull",
|
|
152
|
+
"--personal",
|
|
153
|
+
"--hq-root",
|
|
154
|
+
HQ_ROOT,
|
|
155
|
+
"--on-conflict",
|
|
156
|
+
"keep",
|
|
157
|
+
]);
|
|
158
|
+
expect(args).toContainEqual(["rescue", "--hq-root", HQ_ROOT, "--yes"]);
|
|
159
|
+
// rescue needs companies/ to pre-exist.
|
|
160
|
+
expect(mkdirp).toHaveBeenCalledWith(`${HQ_ROOT}/companies`);
|
|
161
|
+
});
|
|
162
|
+
it("clones only the missing repos, gh-authing via the vault for privates", async () => {
|
|
163
|
+
const { deps, calls } = replicaDependencies({
|
|
164
|
+
// hq-cli already present → should be skipped.
|
|
165
|
+
existing: new Set([`${HQ_ROOT}/repos/private/hq-cli/.git`]),
|
|
166
|
+
});
|
|
167
|
+
await run(deps, ["outposts", "replica-sync"]);
|
|
168
|
+
const clones = calls
|
|
169
|
+
.filter((c) => c.command === "git" && c.args[0] === "clone")
|
|
170
|
+
.map((c) => c.args[c.args.length - 1]);
|
|
171
|
+
expect(clones).toContain(`${HQ_ROOT}/repos/private/hq-pro`);
|
|
172
|
+
expect(clones).toContain(`${HQ_ROOT}/repos/public/public-widget`);
|
|
173
|
+
expect(clones).not.toContain(`${HQ_ROOT}/repos/private/hq-cli`);
|
|
174
|
+
// A private repo is missing → gh auth flows through the vault (token in ENV,
|
|
175
|
+
// never argv).
|
|
176
|
+
const vaultAuth = calls.find((c) => c.command === "hq" && c.args[0] === "secrets" && c.args.includes("GITHUB_TOKEN"));
|
|
177
|
+
expect(vaultAuth).toBeTruthy();
|
|
178
|
+
expect(vaultAuth?.args).toContain("--personal");
|
|
179
|
+
expect(vaultAuth?.args).toContain("--only");
|
|
180
|
+
});
|
|
181
|
+
it("skips the vault gh auth when every missing repo is public", async () => {
|
|
182
|
+
const { deps, calls } = replicaDependencies({
|
|
183
|
+
reposYaml: "repos:\n - url: https://github.com/x/pub.git\n visibility: public\n",
|
|
184
|
+
});
|
|
185
|
+
await run(deps, ["outposts", "replica-sync"]);
|
|
186
|
+
const vaultAuth = calls.find((c) => c.command === "hq" && c.args[0] === "secrets");
|
|
187
|
+
expect(vaultAuth).toBeUndefined();
|
|
188
|
+
});
|
|
189
|
+
it("no repos.yaml → skips the clone step without error", async () => {
|
|
190
|
+
const { deps, calls } = replicaDependencies({ reposYaml: null });
|
|
191
|
+
await run(deps, ["outposts", "replica-sync"]);
|
|
192
|
+
expect(calls.some((c) => c.command === "git")).toBe(false);
|
|
193
|
+
expect(printed()).toContain("skipping repo clone");
|
|
194
|
+
});
|
|
195
|
+
it("aborts the cycle when auth refresh fails — no pull, rescue, or clone", async () => {
|
|
196
|
+
const { deps, calls } = replicaDependencies({ failAuthRefresh: true });
|
|
197
|
+
await run(deps, ["outposts", "replica-sync"]);
|
|
198
|
+
const args = hqArgs(calls);
|
|
199
|
+
expect(args).toContainEqual(["auth", "refresh"]);
|
|
200
|
+
expect(args.some((a) => a[0] === "sync")).toBe(false);
|
|
201
|
+
expect(args.some((a) => a[0] === "rescue")).toBe(false);
|
|
202
|
+
expect(calls.some((c) => c.command === "git")).toBe(false);
|
|
203
|
+
expect(printed()).toContain("auth refresh failed");
|
|
204
|
+
});
|
|
205
|
+
it("a failed step never throws or hard-fails the unit", async () => {
|
|
206
|
+
const { deps } = replicaDependencies({ failRescue: true });
|
|
207
|
+
await expect(run(deps, ["outposts", "replica-sync"])).resolves.toBeUndefined();
|
|
208
|
+
expect(printed()).toContain("HQ kernel rescue did not complete cleanly");
|
|
209
|
+
});
|
|
210
|
+
it("never leaks the session token or makes hq-pro requests", async () => {
|
|
211
|
+
const { deps, calls } = replicaDependencies();
|
|
212
|
+
await run(deps, ["outposts", "replica-sync"]);
|
|
213
|
+
expect(JSON.stringify(calls)).not.toContain(SECRET);
|
|
214
|
+
expect(printed()).not.toContain(SECRET);
|
|
215
|
+
expect(fetchSpy).not.toHaveBeenCalled();
|
|
216
|
+
// The GITHUB_TOKEN never appears as a bare argv value — only the var name
|
|
217
|
+
// inside the bash script and the --only selector.
|
|
218
|
+
const bashScripts = calls
|
|
219
|
+
.filter((c) => c.command === "hq" && c.args.includes("bash"))
|
|
220
|
+
.flatMap((c) => c.args);
|
|
221
|
+
expect(bashScripts.some((a) => a.includes("gh auth login --with-token"))).toBe(true);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
//# sourceMappingURL=replica-sync.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replica-sync.test.js","sourceRoot":"","sources":["../../src/outposts/replica-sync.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `outposts self-deploy` — turn the CURRENT machine into a locally self-hosted
|
|
3
|
+
* HQ outpost.
|
|
4
|
+
*
|
|
5
|
+
* This is the unmanaged path. Unlike a box provisioned through
|
|
6
|
+
* `outposts provision`, a self-deployed host is not registered with hq-pro: no
|
|
7
|
+
* console entry, no remote management, no metering. It runs a systemd service
|
|
8
|
+
* that watches and syncs ALL of the operator's company vaults under the
|
|
9
|
+
* operator's own identity.
|
|
10
|
+
*
|
|
11
|
+
* Node-only: reads `/etc/os-release`, shells out to `systemctl`/`sudo`/`tee`, and
|
|
12
|
+
* writes into `/usr/local/bin` and `/etc/systemd/system`.
|
|
13
|
+
*/
|
|
14
|
+
import { type SelfDeployDependencies } from "./host-deps.js";
|
|
15
|
+
/**
|
|
16
|
+
* Describe the cached session in the confirmation banner.
|
|
17
|
+
*
|
|
18
|
+
* Informational only, so a token that cannot be parsed degrades to a generic
|
|
19
|
+
* phrase rather than surfacing a parse failure — a cache holding a refresh token
|
|
20
|
+
* is still valid for this setup regardless of whether the id token decodes.
|
|
21
|
+
*/
|
|
22
|
+
export declare function hqIdentityFromSession(session: {
|
|
23
|
+
refreshToken?: string;
|
|
24
|
+
idToken?: string;
|
|
25
|
+
}): string;
|
|
26
|
+
export declare function renderSelfDeploySyncScript(hqRoot: string): string;
|
|
27
|
+
export declare function renderSelfDeployService(hqRoot: string, user: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Refuse to proceed unless the host is one this installer actually supports, and
|
|
30
|
+
* a usable HQ session exists. Returns the cached session on success.
|
|
31
|
+
*/
|
|
32
|
+
export declare function selfDeployPreflight(deps: SelfDeployDependencies): {
|
|
33
|
+
refreshToken?: string;
|
|
34
|
+
idToken?: string;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Configure this host as a self-hosted outpost.
|
|
38
|
+
*
|
|
39
|
+
* Prompts before doing anything, because the consequence is severe and easy to
|
|
40
|
+
* understate: anyone with root on the machine can subsequently act as the
|
|
41
|
+
* operator. `--yes` skips the prompt for non-interactive installs.
|
|
42
|
+
*/
|
|
43
|
+
export declare function selfDeployOutpost(opts: {
|
|
44
|
+
yes?: boolean;
|
|
45
|
+
hqRoot?: string;
|
|
46
|
+
}, deps: SelfDeployDependencies): Promise<void>;
|
|
47
|
+
//# sourceMappingURL=self-deploy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-deploy.d.ts","sourceRoot":"","sources":["../../src/outposts/self-deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAKL,KAAK,sBAAsB,EAC5B,MAAM,gBAAgB,CAAC;AA0BxB;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAsBT;AAUD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAqBjE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAe5E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,sBAAsB,GAAG;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CA6CA;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EACxC,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAiFf"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `outposts self-deploy` — turn the CURRENT machine into a locally self-hosted
|
|
3
|
+
* HQ outpost.
|
|
4
|
+
*
|
|
5
|
+
* This is the unmanaged path. Unlike a box provisioned through
|
|
6
|
+
* `outposts provision`, a self-deployed host is not registered with hq-pro: no
|
|
7
|
+
* console entry, no remote management, no metering. It runs a systemd service
|
|
8
|
+
* that watches and syncs ALL of the operator's company vaults under the
|
|
9
|
+
* operator's own identity.
|
|
10
|
+
*
|
|
11
|
+
* Node-only: reads `/etc/os-release`, shells out to `systemctl`/`sudo`/`tee`, and
|
|
12
|
+
* writes into `/usr/local/bin` and `/etc/systemd/system`.
|
|
13
|
+
*/
|
|
14
|
+
import chalk from "chalk";
|
|
15
|
+
import { commandOutput, commandSucceeded, runChecked, runPrivileged, } from "./host-deps.js";
|
|
16
|
+
/**
|
|
17
|
+
* The hq-cloud artifact the box-side sync launcher pins to.
|
|
18
|
+
*
|
|
19
|
+
* Outpost launchers must stay reproducible: `@latest` could silently opt a
|
|
20
|
+
* long-lived box into a different sync protocol before its server-side
|
|
21
|
+
* eligibility has been evaluated.
|
|
22
|
+
*/
|
|
23
|
+
const OUTPOST_HQ_CLOUD_VERSION = "6.15.1";
|
|
24
|
+
function selfDeployError(message) {
|
|
25
|
+
return new Error(`Self-deploy preflight failed: ${message}`);
|
|
26
|
+
}
|
|
27
|
+
function parseOsRelease(source) {
|
|
28
|
+
const values = new Map();
|
|
29
|
+
for (const line of source.split("\n")) {
|
|
30
|
+
const match = /^([A-Z_]+)=(.*)$/.exec(line);
|
|
31
|
+
if (!match)
|
|
32
|
+
continue;
|
|
33
|
+
const [, key, rawValue] = match;
|
|
34
|
+
values.set(key, rawValue.replace(/^['"]|['"]$/g, ""));
|
|
35
|
+
}
|
|
36
|
+
return values;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Describe the cached session in the confirmation banner.
|
|
40
|
+
*
|
|
41
|
+
* Informational only, so a token that cannot be parsed degrades to a generic
|
|
42
|
+
* phrase rather than surfacing a parse failure — a cache holding a refresh token
|
|
43
|
+
* is still valid for this setup regardless of whether the id token decodes.
|
|
44
|
+
*/
|
|
45
|
+
export function hqIdentityFromSession(session) {
|
|
46
|
+
if (!session.idToken)
|
|
47
|
+
return "your cached HQ session";
|
|
48
|
+
try {
|
|
49
|
+
const payload = session.idToken.split(".")[1];
|
|
50
|
+
if (!payload)
|
|
51
|
+
return "your cached HQ session";
|
|
52
|
+
const claims = JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
|
|
53
|
+
for (const key of [
|
|
54
|
+
"email",
|
|
55
|
+
"preferred_username",
|
|
56
|
+
"cognito:username",
|
|
57
|
+
"username",
|
|
58
|
+
"sub",
|
|
59
|
+
]) {
|
|
60
|
+
const value = claims[key];
|
|
61
|
+
if (typeof value === "string" && value)
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Never expose a token parse failure — see the doc comment above.
|
|
67
|
+
}
|
|
68
|
+
return "your cached HQ session";
|
|
69
|
+
}
|
|
70
|
+
function bashSingleQuote(value) {
|
|
71
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
72
|
+
}
|
|
73
|
+
function systemdQuoted(value) {
|
|
74
|
+
return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
75
|
+
}
|
|
76
|
+
export function renderSelfDeploySyncScript(hqRoot) {
|
|
77
|
+
return `#!/usr/bin/env bash
|
|
78
|
+
set -u
|
|
79
|
+
# Persistent all-membership sync for a locally self-hosted HQ outpost. The
|
|
80
|
+
# watch runner event-pushes local changes and polls remote changes every minute.
|
|
81
|
+
HQ_ROOT=${bashSingleQuote(hqRoot)}
|
|
82
|
+
cd "$HQ_ROOT"
|
|
83
|
+
while true; do
|
|
84
|
+
hq auth refresh || echo "[outpost-sync] auth refresh failed, continuing"
|
|
85
|
+
npx -y --package=@indigoai-us/hq-cloud@${OUTPOST_HQ_CLOUD_VERSION} hq-sync-runner \\
|
|
86
|
+
--companies \\
|
|
87
|
+
--direction both \\
|
|
88
|
+
--on-conflict keep \\
|
|
89
|
+
--hq-root "$HQ_ROOT" \\
|
|
90
|
+
--watch \\
|
|
91
|
+
--event-push \\
|
|
92
|
+
--poll-remote-ms 60000
|
|
93
|
+
echo "[outpost-sync] watch runner exited; restarting in 10 seconds"
|
|
94
|
+
sleep 10
|
|
95
|
+
done
|
|
96
|
+
`;
|
|
97
|
+
}
|
|
98
|
+
export function renderSelfDeployService(hqRoot, user) {
|
|
99
|
+
return `[Unit]
|
|
100
|
+
After=network-online.target
|
|
101
|
+
Wants=network-online.target
|
|
102
|
+
|
|
103
|
+
[Service]
|
|
104
|
+
User=${user}
|
|
105
|
+
WorkingDirectory=${systemdQuoted(hqRoot)}
|
|
106
|
+
ExecStart=/usr/local/bin/outpost-sync.sh
|
|
107
|
+
Restart=always
|
|
108
|
+
RestartSec=10s
|
|
109
|
+
|
|
110
|
+
[Install]
|
|
111
|
+
WantedBy=multi-user.target
|
|
112
|
+
`;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Refuse to proceed unless the host is one this installer actually supports, and
|
|
116
|
+
* a usable HQ session exists. Returns the cached session on success.
|
|
117
|
+
*/
|
|
118
|
+
export function selfDeployPreflight(deps) {
|
|
119
|
+
let osRelease;
|
|
120
|
+
try {
|
|
121
|
+
osRelease = deps.readTextFile("/etc/os-release");
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
throw selfDeployError("could not read /etc/os-release. This command only supports Amazon Linux 2023 x86_64.");
|
|
125
|
+
}
|
|
126
|
+
const release = parseOsRelease(osRelease);
|
|
127
|
+
if (release.get("ID") !== "amzn" ||
|
|
128
|
+
!release.get("VERSION_ID")?.startsWith("2023")) {
|
|
129
|
+
throw selfDeployError("this command only supports Amazon Linux 2023 x86_64. Use an Amazon Linux 2023 EC2 instance.");
|
|
130
|
+
}
|
|
131
|
+
const architecture = commandOutput(deps, "uname", ["-m"]);
|
|
132
|
+
if (architecture !== "x86_64") {
|
|
133
|
+
throw selfDeployError("this command only supports x86_64 EC2 instances. Use an Amazon Linux 2023 x86_64 instance.");
|
|
134
|
+
}
|
|
135
|
+
if (!commandSucceeded(deps, "systemctl", ["--version"])) {
|
|
136
|
+
throw selfDeployError("systemd is required but `systemctl --version` failed. Run this on an Amazon Linux 2023 EC2 host with systemd.");
|
|
137
|
+
}
|
|
138
|
+
if (deps.getUid() !== 0 && !commandSucceeded(deps, "sudo", ["-n", "true"])) {
|
|
139
|
+
throw selfDeployError("root or passwordless sudo is required. Configure passwordless sudo or run this command as root.");
|
|
140
|
+
}
|
|
141
|
+
const session = deps.loadCachedTokens();
|
|
142
|
+
if (!session?.refreshToken) {
|
|
143
|
+
throw selfDeployError("no HQ login session was found. Run `hq login`, then re-run this command.");
|
|
144
|
+
}
|
|
145
|
+
return session;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Configure this host as a self-hosted outpost.
|
|
149
|
+
*
|
|
150
|
+
* Prompts before doing anything, because the consequence is severe and easy to
|
|
151
|
+
* understate: anyone with root on the machine can subsequently act as the
|
|
152
|
+
* operator. `--yes` skips the prompt for non-interactive installs.
|
|
153
|
+
*/
|
|
154
|
+
export async function selfDeployOutpost(opts, deps) {
|
|
155
|
+
const session = selfDeployPreflight(deps);
|
|
156
|
+
const hqRoot = opts.hqRoot ?? deps.defaultHqRoot();
|
|
157
|
+
const user = deps.invokingUser();
|
|
158
|
+
if (!opts.yes) {
|
|
159
|
+
console.log(`HQ identity: ${hqIdentityFromSession(session)}`);
|
|
160
|
+
console.log(chalk.yellow("This machine will run as a SELF-HOSTED HQ outpost under YOUR identity, continuously syncing ALL your company vaults. " +
|
|
161
|
+
"It is NOT registered with or managed by hq-pro (no console entry, no remote management, no metering). " +
|
|
162
|
+
"Anyone with root on this box can act as you. Continue? [y/N]"));
|
|
163
|
+
if (!deps.isStdinTty()) {
|
|
164
|
+
throw new Error("Confirmation requires a TTY. Pass --yes to continue non-interactively.");
|
|
165
|
+
}
|
|
166
|
+
if (!(await deps.confirm())) {
|
|
167
|
+
throw new Error("Self-deploy cancelled.");
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
runChecked(deps, "hq", ["rescue", "--hq-root", hqRoot, "--yes"], "HQ kernel rescue", { stdio: "inherit" });
|
|
171
|
+
runPrivileged(deps, "tee", ["/usr/local/bin/outpost-sync.sh"], "Writing /usr/local/bin/outpost-sync.sh", {
|
|
172
|
+
encoding: "utf8",
|
|
173
|
+
input: renderSelfDeploySyncScript(hqRoot),
|
|
174
|
+
stdio: ["pipe", "ignore", "pipe"],
|
|
175
|
+
});
|
|
176
|
+
runPrivileged(deps, "chmod", ["+x", "/usr/local/bin/outpost-sync.sh"], "Making /usr/local/bin/outpost-sync.sh executable");
|
|
177
|
+
runPrivileged(deps, "tee", ["/etc/systemd/system/outpost-sync.service"], "Writing /etc/systemd/system/outpost-sync.service", {
|
|
178
|
+
encoding: "utf8",
|
|
179
|
+
input: renderSelfDeployService(hqRoot, user),
|
|
180
|
+
stdio: ["pipe", "ignore", "pipe"],
|
|
181
|
+
});
|
|
182
|
+
runPrivileged(deps, "systemctl", ["daemon-reload"], "Reloading systemd");
|
|
183
|
+
runPrivileged(deps, "systemctl", ["enable", "--now", "outpost-sync.service"], "Enabling outpost-sync.service");
|
|
184
|
+
console.log(chalk.green("This box is now a self-hosted HQ outpost and will sync all your company vaults continuously."));
|
|
185
|
+
console.log(chalk.dim("Check it with: systemctl status outpost-sync.service"));
|
|
186
|
+
console.log(chalk.dim("It is unregistered and unmanaged by hq-pro (no console entry or remote management)."));
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=self-deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-deploy.js","sourceRoot":"","sources":["../../src/outposts/self-deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-deploy.test.d.ts","sourceRoot":"","sources":["../../src/outposts/self-deploy.test.ts"],"names":[],"mappings":""}
|