@the-librarian/cli 1.20.0 → 1.21.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 +21 -7
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +11 -10
- package/dist/runtime.js.map +1 -1
- package/dist/server/admin.js +2 -2
- package/dist/server/admin.js.map +1 -1
- package/dist/server/autoupdate.d.ts +4 -4
- package/dist/server/autoupdate.d.ts.map +1 -1
- package/dist/server/autoupdate.js +28 -22
- package/dist/server/autoupdate.js.map +1 -1
- package/dist/server/deploy-state.d.ts +24 -5
- package/dist/server/deploy-state.d.ts.map +1 -1
- package/dist/server/deploy-state.js +78 -10
- package/dist/server/deploy-state.js.map +1 -1
- package/dist/server/deployment-image.d.ts +65 -0
- package/dist/server/deployment-image.d.ts.map +1 -0
- package/dist/server/deployment-image.js +281 -0
- package/dist/server/deployment-image.js.map +1 -0
- package/dist/server/docker.d.ts.map +1 -1
- package/dist/server/docker.js +34 -14
- package/dist/server/docker.js.map +1 -1
- package/dist/server/down.js +2 -2
- package/dist/server/down.js.map +1 -1
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +28 -12
- package/dist/server/index.js.map +1 -1
- package/dist/server/logs.js +2 -2
- package/dist/server/logs.js.map +1 -1
- package/dist/server/preflight.d.ts +5 -3
- package/dist/server/preflight.d.ts.map +1 -1
- package/dist/server/preflight.js +11 -6
- package/dist/server/preflight.js.map +1 -1
- package/dist/server/source-repository.d.ts +6 -0
- package/dist/server/source-repository.d.ts.map +1 -0
- package/dist/server/source-repository.js +40 -0
- package/dist/server/source-repository.js.map +1 -0
- package/dist/server/status.d.ts.map +1 -1
- package/dist/server/status.js +26 -18
- package/dist/server/status.js.map +1 -1
- package/dist/server/up.d.ts +38 -14
- package/dist/server/up.d.ts.map +1 -1
- package/dist/server/up.js +584 -134
- package/dist/server/up.js.map +1 -1
- package/dist/server/update.d.ts +5 -17
- package/dist/server/update.d.ts.map +1 -1
- package/dist/server/update.js +737 -296
- package/dist/server/update.js.map +1 -1
- package/package.json +1 -1
package/dist/server/down.js
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// Everything goes through the injectable `docker.ts` runner, so tests assert the
|
|
16
16
|
// exact argv without a real daemon.
|
|
17
17
|
import { run } from "./docker.js";
|
|
18
|
-
import {
|
|
18
|
+
import { dockerPreflight } from "./preflight.js";
|
|
19
19
|
import { CONTAINER_NAME } from "./up.js";
|
|
20
20
|
/** A teaching error from `down`; the runtime renders `.message` as one stderr line. */
|
|
21
21
|
export class DownError extends Error {
|
|
@@ -34,7 +34,7 @@ function isNotRunning(stderr) {
|
|
|
34
34
|
* no-op; any other non-zero exit is a teaching `DownError`.
|
|
35
35
|
*/
|
|
36
36
|
export async function runDown(options = {}) {
|
|
37
|
-
await
|
|
37
|
+
await dockerPreflight(options.platform ? { platform: options.platform } : {});
|
|
38
38
|
// The single, data-safe command. No `rm`, no `-v`, no `volume`, no `-f`.
|
|
39
39
|
const result = await run("docker", ["stop", CONTAINER_NAME]);
|
|
40
40
|
if (result.code === 0) {
|
package/dist/server/down.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/server/down.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,EAAE;AACF,gFAAgF;AAChF,4EAA4E;AAC5E,iFAAiF;AACjF,8EAA8E;AAC9E,+CAA+C;AAC/C,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,2EAA2E;AAC3E,+EAA+E;AAC/E,gCAAgC;AAChC,EAAE;AACF,iFAAiF;AACjF,oCAAoC;AAEpC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/server/down.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,EAAE;AACF,gFAAgF;AAChF,4EAA4E;AAC5E,iFAAiF;AACjF,8EAA8E;AAC9E,+CAA+C;AAC/C,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,2EAA2E;AAC3E,+EAA+E;AAC/E,gCAAgC;AAChC,EAAE;AACF,iFAAiF;AACjF,oCAAoC;AAEpC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAOzC,uFAAuF;AACvF,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAOD,gFAAgF;AAChF,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,mCAAmC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAAuB,EAAE;IACrD,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE9E,yEAAyE;IACzE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAE7D,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,MAAM,EAAE;gBACN,WAAW,cAAc,GAAG;gBAC5B,qFAAqF;aACtF,CAAC,IAAI,CAAC,IAAI,CAAC;SACb,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,MAAM,EAAE;gBACN,GAAG,cAAc,oCAAoC;gBACrD,wCAAwC;aACzC,CAAC,IAAI,CAAC,IAAI,CAAC;SACb,CAAC;IACJ,CAAC;IAED,wEAAwE;IACxE,MAAM,IAAI,SAAS,CACjB,iBAAiB,cAAc,mBAAmB,MAAM,CAAC,IAAI,IAAI,QAAQ,GAAG;QAC1E,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/B,mEAAmE,CACtE,CAAC;AACJ,CAAC"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ export declare const SERVER_SUBCOMMANDS: readonly ["up", "update", "down", "stat
|
|
|
3
3
|
export type ServerSubcommand = (typeof SERVER_SUBCOMMANDS)[number];
|
|
4
4
|
/** The `librarian server` command surface (spec §4). */
|
|
5
5
|
export declare function serverUsage(): string;
|
|
6
|
+
/** Help for one server subcommand; evaluated before any lifecycle dispatch. */
|
|
7
|
+
export declare function serverSubcommandUsage(subcommand: ServerSubcommand): string;
|
|
6
8
|
/** True iff `name` is one of the known `server` subcommands. */
|
|
7
9
|
export declare function isServerSubcommand(name: string): name is ServerSubcommand;
|
|
8
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAKA,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,2GAUrB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,wDAAwD;AACxD,wBAAgB,WAAW,IAAI,MAAM,CAqBpC;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAoB1E;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,gBAAgB,CAEzE"}
|
package/dist/server/index.js
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
// The `librarian server` command group — self-host the Librarian from the CLI.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// individual subcommands (up / update / down / status / logs / enable-boot /
|
|
6
|
-
// disable-boot / admin) are implemented in their own slices; here they resolve
|
|
7
|
-
// to a clear "arrives in a later slice" notice so the surface is honest about
|
|
8
|
-
// what exists today.
|
|
9
|
-
//
|
|
10
|
-
// `server` with NO subcommand prints the surface; `librarian --help` reveals
|
|
11
|
-
// this group alongside the harness commands (wired in `runtime.ts`).
|
|
3
|
+
// `server` with no subcommand prints the lifecycle surface; `librarian --help`
|
|
4
|
+
// reveals this group alongside the harness commands (wired in `runtime.ts`).
|
|
12
5
|
/** The `server` subcommands, in the order they appear in the surface (§4). */
|
|
13
6
|
export const SERVER_SUBCOMMANDS = [
|
|
14
7
|
"up",
|
|
@@ -26,12 +19,13 @@ export function serverUsage() {
|
|
|
26
19
|
return [
|
|
27
20
|
"Usage: librarian server <subcommand> [flags]",
|
|
28
21
|
"",
|
|
29
|
-
"Self-host the Librarian server
|
|
22
|
+
"Self-host the Librarian server from an exact published release,",
|
|
23
|
+
"or use --ref <development-ref>; source refs build locally,",
|
|
30
24
|
"then hand its MCP URL + agent token to `librarian install` on clients.",
|
|
31
25
|
"",
|
|
32
26
|
"Subcommands:",
|
|
33
|
-
" up
|
|
34
|
-
" update
|
|
27
|
+
" up Pull an exact release (or build a source ref) and start it",
|
|
28
|
+
" update Prepare, verify and replace; recover the old image on failure",
|
|
35
29
|
" down Stop the container (the data volume is preserved)",
|
|
36
30
|
" status Running? healthy? deployed version vs latest release",
|
|
37
31
|
" logs Tail the container logs ([-f] [--service mcp|dashboard|all])",
|
|
@@ -43,6 +37,28 @@ export function serverUsage() {
|
|
|
43
37
|
"Run `librarian server <subcommand> --help` for flags (per subcommand).",
|
|
44
38
|
].join("\n");
|
|
45
39
|
}
|
|
40
|
+
/** Help for one server subcommand; evaluated before any lifecycle dispatch. */
|
|
41
|
+
export function serverSubcommandUsage(subcommand) {
|
|
42
|
+
const usage = {
|
|
43
|
+
up: [
|
|
44
|
+
"Usage: librarian server up [--ref <release|source-ref>] [--dir <path>]",
|
|
45
|
+
" [--host <address>] [--dashboard-port <port>]",
|
|
46
|
+
" [--data-volume <name> | --data-dir <path>] [--enable-boot] [--yes]",
|
|
47
|
+
],
|
|
48
|
+
update: ["Usage: librarian server update [--ref <release|source-ref>] [--dir <path>] [--yes]"],
|
|
49
|
+
down: ["Usage: librarian server down"],
|
|
50
|
+
status: ["Usage: librarian server status [--dir <path>]"],
|
|
51
|
+
logs: ["Usage: librarian server logs [-f|--follow] [--service mcp|dashboard|all]"],
|
|
52
|
+
"enable-boot": ["Usage: librarian server enable-boot"],
|
|
53
|
+
"disable-boot": ["Usage: librarian server disable-boot"],
|
|
54
|
+
autoupdate: [
|
|
55
|
+
"Usage: librarian server autoupdate <enable|disable|uninstall|status> [--dir <path>]",
|
|
56
|
+
" [--cadence daily|weekly]",
|
|
57
|
+
],
|
|
58
|
+
admin: ["Usage: librarian server admin <backup|restore|auth|rebuild> [args…]"],
|
|
59
|
+
};
|
|
60
|
+
return usage[subcommand].join("\n");
|
|
61
|
+
}
|
|
46
62
|
/** True iff `name` is one of the known `server` subcommands. */
|
|
47
63
|
export function isServerSubcommand(name) {
|
|
48
64
|
return SERVER_SUBCOMMANDS.includes(name);
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAE7E,8EAA8E;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,MAAM;IACN,aAAa;IACb,cAAc;IACd,YAAY;IACZ,OAAO;CACC,CAAC;AAIX,wDAAwD;AACxD,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,8CAA8C;QAC9C,EAAE;QACF,iEAAiE;QACjE,4DAA4D;QAC5D,wEAAwE;QACxE,EAAE;QACF,cAAc;QACd,4EAA4E;QAC5E,+EAA+E;QAC/E,mEAAmE;QACnE,sEAAsE;QACtE,8EAA8E;QAC9E,0EAA0E;QAC1E,qCAAqC;QACrC,qFAAqF;QACrF,qFAAqF;QACrF,EAAE;QACF,wEAAwE;KACzE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,qBAAqB,CAAC,UAA4B;IAChE,MAAM,KAAK,GAAgD;QACzD,EAAE,EAAE;YACF,wEAAwE;YACxE,qDAAqD;YACrD,2EAA2E;SAC5E;QACD,MAAM,EAAE,CAAC,oFAAoF,CAAC;QAC9F,IAAI,EAAE,CAAC,8BAA8B,CAAC;QACtC,MAAM,EAAE,CAAC,+CAA+C,CAAC;QACzD,IAAI,EAAE,CAAC,0EAA0E,CAAC;QAClF,aAAa,EAAE,CAAC,qCAAqC,CAAC;QACtD,cAAc,EAAE,CAAC,sCAAsC,CAAC;QACxD,UAAU,EAAE;YACV,qFAAqF;YACrF,iCAAiC;SAClC;QACD,KAAK,EAAE,CAAC,qEAAqE,CAAC;KAC/E,CAAC;IACF,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAQ,kBAAwC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC"}
|
package/dist/server/logs.js
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
// `--service` filter; only the delivery (buffered-then-returned vs.
|
|
30
30
|
// live-per-line) differs.
|
|
31
31
|
import { run, stream } from "./docker.js";
|
|
32
|
-
import {
|
|
32
|
+
import { dockerPreflight } from "./preflight.js";
|
|
33
33
|
import { CONTAINER_NAME } from "./up.js";
|
|
34
34
|
const SERVICES = ["mcp", "dashboard", "all"];
|
|
35
35
|
/** A teaching error from `logs`; the runtime renders `.message` as one stderr line. */
|
|
@@ -135,7 +135,7 @@ function makeLineFilter(service, write) {
|
|
|
135
135
|
*/
|
|
136
136
|
export async function runLogs(options = {}) {
|
|
137
137
|
const service = resolveService(options.service);
|
|
138
|
-
await
|
|
138
|
+
await dockerPreflight(options.platform ? { platform: options.platform } : {});
|
|
139
139
|
if (options.follow) {
|
|
140
140
|
// Live tail: stream line-by-line, never buffer to close.
|
|
141
141
|
const write = options.write ?? ((chunk) => process.stdout.write(chunk));
|
package/dist/server/logs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/server/logs.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,2EAA2E;AAC3E,oFAAoF;AACpF,iFAAiF;AACjF,0EAA0E;AAC1E,EAAE;AACF,0DAA0D;AAC1D,+EAA+E;AAC/E,qFAAqF;AACrF,sEAAsE;AACtE,+EAA+E;AAC/E,kFAAkF;AAClF,2EAA2E;AAC3E,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,+EAA+E;AAC/E,oCAAoC;AACpC,+EAA+E;AAC/E,+EAA+E;AAC/E,kEAAkE;AAClE,6EAA6E;AAC7E,8EAA8E;AAC9E,iFAAiF;AACjF,gFAAgF;AAChF,gFAAgF;AAChF,2EAA2E;AAC3E,wEAAwE;AACxE,8BAA8B;AAE9B,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/server/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,11 +14,13 @@ export interface PreflightOptions {
|
|
|
14
14
|
platform?: NodeJS.Platform;
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
* Confirm `docker`
|
|
18
|
-
* `PreflightError
|
|
17
|
+
* Confirm `docker` is installed with a reachable daemon, or throw a teaching
|
|
18
|
+
* `PreflightError`. Resolves to nothing on success.
|
|
19
19
|
*
|
|
20
20
|
* Order matters: report a missing binary before probing the daemon, so a host
|
|
21
21
|
* without Docker is told to install it (not told the daemon is down).
|
|
22
22
|
*/
|
|
23
|
-
export declare function
|
|
23
|
+
export declare function dockerPreflight(options?: PreflightOptions): Promise<void>;
|
|
24
|
+
/** Confirm Docker plus Git for a lifecycle path that operates on source. */
|
|
25
|
+
export declare function sourcePreflight(options?: PreflightOptions): Promise<void>;
|
|
24
26
|
//# sourceMappingURL=preflight.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/server/preflight.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/server/preflight.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC5B;AAoBD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAanF;AAED,4EAA4E;AAC5E,wBAAsB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnF"}
|
package/dist/server/preflight.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// Preflight for the `server` command group.
|
|
2
2
|
//
|
|
3
|
-
// Every `server` subcommand that drives a container (up / update /
|
|
4
|
-
//
|
|
5
|
-
// it needs: `docker` installed AND its daemon reachable
|
|
3
|
+
// Every `server` subcommand that directly drives a container (up / update /
|
|
4
|
+
// down / status / logs / admin) first confirms the host actually has the tools
|
|
5
|
+
// it needs: `docker` installed AND its daemon reachable. Source deployments
|
|
6
|
+
// additionally require `git`; registry-backed and Docker-only commands do not.
|
|
6
7
|
// A missing or unreachable tool is a TEACHING error (what to install, or "is
|
|
7
8
|
// the daemon running?") — never a stack trace, never a bare "error".
|
|
8
9
|
//
|
|
@@ -34,13 +35,13 @@ function dockerDaemonHint(platform) {
|
|
|
34
35
|
return `Docker is installed but its daemon is unreachable. ${start}`;
|
|
35
36
|
}
|
|
36
37
|
/**
|
|
37
|
-
* Confirm `docker`
|
|
38
|
-
* `PreflightError
|
|
38
|
+
* Confirm `docker` is installed with a reachable daemon, or throw a teaching
|
|
39
|
+
* `PreflightError`. Resolves to nothing on success.
|
|
39
40
|
*
|
|
40
41
|
* Order matters: report a missing binary before probing the daemon, so a host
|
|
41
42
|
* without Docker is told to install it (not told the daemon is down).
|
|
42
43
|
*/
|
|
43
|
-
export async function
|
|
44
|
+
export async function dockerPreflight(options = {}) {
|
|
44
45
|
const platform = options.platform ?? process.platform;
|
|
45
46
|
if ((await which("docker")) === null) {
|
|
46
47
|
throw new PreflightError(DOCKER_INSTALL);
|
|
@@ -51,6 +52,10 @@ export async function preflight(options = {}) {
|
|
|
51
52
|
if (info.code !== 0) {
|
|
52
53
|
throw new PreflightError(dockerDaemonHint(platform));
|
|
53
54
|
}
|
|
55
|
+
}
|
|
56
|
+
/** Confirm Docker plus Git for a lifecycle path that operates on source. */
|
|
57
|
+
export async function sourcePreflight(options = {}) {
|
|
58
|
+
await dockerPreflight(options);
|
|
54
59
|
if ((await which("git")) === null) {
|
|
55
60
|
throw new PreflightError(GIT_INSTALL);
|
|
56
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/server/preflight.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/server/preflight.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,4EAA4E;AAC5E,+EAA+E;AAC/E,6EAA6E;AAC7E,qEAAqE;AACrE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,iDAAiD;AAEjD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;GAIG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAUD,MAAM,cAAc,GAClB,qDAAqD;IACrD,4DAA4D;IAC5D,qEAAqE,CAAC;AAExE,MAAM,WAAW,GACf,kDAAkD;IAClD,8DAA8D;IAC9D,2DAA2D,CAAC;AAE9D,SAAS,gBAAgB,CAAC,QAAyB;IACjD,MAAM,KAAK,GACT,QAAQ,KAAK,QAAQ;QACnB,CAAC,CAAC,4GAA4G;QAC9G,CAAC,CAAC,2IAA2I,CAAC;IAClJ,OAAO,sDAAsD,KAAK,EAAE,CAAC;AACvE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAA4B,EAAE;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAEtD,IAAI,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,cAAc,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC;IAED,6EAA6E;IAC7E,iEAAiE;IACjE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAA4B,EAAE;IAClE,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const CANONICAL_SOURCE_REPOSITORY = "https://github.com/code-ministry-ltd/the-librarian";
|
|
2
|
+
/** Accept the canonical repository only over authenticated, encrypted transports. */
|
|
3
|
+
export declare function isCanonicalSourceRemote(remote: string): boolean;
|
|
4
|
+
/** Git may echo credential-bearing remote URLs; no Git diagnostic is trusted. */
|
|
5
|
+
export declare function redactGitDiagnostics(text: string): string;
|
|
6
|
+
//# sourceMappingURL=source-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-repository.d.ts","sourceRoot":"","sources":["../../src/server/source-repository.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,2BAA2B,uDAAuD,CAAC;AAIhG,qFAAqF;AACrF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAoB/D;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIzD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { redactSecrets } from "./redact.js";
|
|
2
|
+
export const CANONICAL_SOURCE_REPOSITORY = "https://github.com/code-ministry-ltd/the-librarian";
|
|
3
|
+
const CANONICAL_PATH = "/code-ministry-ltd/the-librarian";
|
|
4
|
+
/** Accept the canonical repository only over authenticated, encrypted transports. */
|
|
5
|
+
export function isCanonicalSourceRemote(remote) {
|
|
6
|
+
const value = remote.trim();
|
|
7
|
+
const scp = value.match(/^git@github\.com:(\/?[^?#]+)$/iu);
|
|
8
|
+
if (scp)
|
|
9
|
+
return normalizePath(scp[1] ?? "") === CANONICAL_PATH;
|
|
10
|
+
try {
|
|
11
|
+
const parsed = new URL(value);
|
|
12
|
+
if (parsed.hostname.toLowerCase() !== "github.com" || parsed.search || parsed.hash)
|
|
13
|
+
return false;
|
|
14
|
+
if (normalizePath(parsed.pathname) !== CANONICAL_PATH)
|
|
15
|
+
return false;
|
|
16
|
+
if (parsed.protocol === "https:")
|
|
17
|
+
return parsed.port === "" || parsed.port === "443";
|
|
18
|
+
return (parsed.protocol === "ssh:" &&
|
|
19
|
+
parsed.username === "git" &&
|
|
20
|
+
parsed.password === "" &&
|
|
21
|
+
(parsed.port === "" || parsed.port === "22"));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Git may echo credential-bearing remote URLs; no Git diagnostic is trusted. */
|
|
28
|
+
export function redactGitDiagnostics(text) {
|
|
29
|
+
return redactSecrets(text)
|
|
30
|
+
.replace(/\b[a-z][a-z0-9+.-]*:\/\/[^\s'"`]+/giu, "[redacted-remote]")
|
|
31
|
+
.replace(/\b[^\s/@:]+@[^\s/'":]+(?::|\/)[^\s'"`]+/gu, "[redacted-remote]");
|
|
32
|
+
}
|
|
33
|
+
function normalizePath(value) {
|
|
34
|
+
const withLeadingSlash = value.startsWith("/") ? value : `/${value}`;
|
|
35
|
+
return withLeadingSlash
|
|
36
|
+
.replace(/\/$/u, "")
|
|
37
|
+
.replace(/\.git$/iu, "")
|
|
38
|
+
.toLowerCase();
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=source-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-repository.js","sourceRoot":"","sources":["../../src/server/source-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,2BAA2B,GAAG,oDAAoD,CAAC;AAEhG,MAAM,cAAc,GAAG,kCAAkC,CAAC;AAE1D,qFAAqF;AACrF,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC3D,IAAI,GAAG;QAAE,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,cAAc,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,YAAY,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI;YAChF,OAAO,KAAK,CAAC;QACf,IAAI,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,cAAc;YAAE,OAAO,KAAK,CAAC;QACpE,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,IAAI,KAAK,EAAE,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC;QACrF,OAAO,CACL,MAAM,CAAC,QAAQ,KAAK,MAAM;YAC1B,MAAM,CAAC,QAAQ,KAAK,KAAK;YACzB,MAAM,CAAC,QAAQ,KAAK,EAAE;YACtB,CAAC,MAAM,CAAC,IAAI,KAAK,EAAE,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAC7C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,aAAa,CAAC,IAAI,CAAC;SACvB,OAAO,CAAC,sCAAsC,EAAE,mBAAmB,CAAC;SACpE,OAAO,CAAC,2CAA2C,EAAE,mBAAmB,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,gBAAgB,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;IACrE,OAAO,gBAAgB;SACpB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,WAAW,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/server/status.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/server/status.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB;AAwDD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAcjG"}
|
package/dist/server/status.js
CHANGED
|
@@ -4,9 +4,8 @@
|
|
|
4
4
|
// latest-release fetcher (so tests never touch a real daemon/network):
|
|
5
5
|
// - container running? (`docker inspect --format {{.State.Status}}`)
|
|
6
6
|
// - health (`docker inspect --format {{.State.Health.Status}}`)
|
|
7
|
-
// - the DEPLOYED
|
|
8
|
-
//
|
|
9
|
-
// made before deploy-state existed)
|
|
7
|
+
// - the DEPLOYED provenance — published tag + short digest, source ref, or a
|
|
8
|
+
// legacy ref from old state / `git describe`
|
|
10
9
|
// - the LATEST release (`fetchLatestVersion` — the same fetch `librarian
|
|
11
10
|
// status` uses for the harnesses)
|
|
12
11
|
// - an `up-to-date | update-available` badge via `isBehind(deployed, latest)`
|
|
@@ -20,10 +19,11 @@ import { librarianDir } from "../paths.js";
|
|
|
20
19
|
import { isBehind } from "../semver.js";
|
|
21
20
|
import { fetchLatestVersion } from "../status.js";
|
|
22
21
|
import { readDeployState } from "./deploy-state.js";
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
22
|
+
import { shortImageDigest } from "./deployment-image.js";
|
|
23
|
+
import { run, which } from "./docker.js";
|
|
24
|
+
import { dockerPreflight } from "./preflight.js";
|
|
25
25
|
import { CONTAINER_NAME } from "./up.js";
|
|
26
|
-
/** The deploy dir `status` reads its recorded
|
|
26
|
+
/** The deploy dir `status` reads its recorded provenance / git fallback from. */
|
|
27
27
|
function resolveDeployDir(options) {
|
|
28
28
|
return options.dir ?? path.join(librarianDir(options.home), "server");
|
|
29
29
|
}
|
|
@@ -37,20 +37,28 @@ async function inspectField(format) {
|
|
|
37
37
|
return null;
|
|
38
38
|
return result.stdout.trim();
|
|
39
39
|
}
|
|
40
|
-
/**
|
|
41
|
-
* Resolve the deployed version: the deploy-state ref first (authoritative — it's
|
|
42
|
-
* exactly what `up` checked out + built), else `git -C <dir> describe --tags`.
|
|
43
|
-
* Returns `null` (→ "unknown") when neither is available.
|
|
44
|
-
*/
|
|
45
40
|
async function resolveDeployed(deployDir) {
|
|
46
41
|
const state = readDeployState(deployDir);
|
|
47
|
-
if (state?.
|
|
48
|
-
return
|
|
42
|
+
if (state?.imageSource === "registry") {
|
|
43
|
+
return {
|
|
44
|
+
ref: state.ref,
|
|
45
|
+
label: `published ${state.ref} (${shortImageDigest(state.imageDigest)})`,
|
|
46
|
+
releaseComparable: true,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (state?.imageSource === "source") {
|
|
50
|
+
return { ref: state.ref, label: `source ${state.ref}`, releaseComparable: false };
|
|
51
|
+
}
|
|
52
|
+
if (state?.ref) {
|
|
53
|
+
return { ref: state.ref, label: `legacy ${state.ref}`, releaseComparable: false };
|
|
54
|
+
}
|
|
55
|
+
if ((await which("git")) === null)
|
|
56
|
+
return null;
|
|
49
57
|
const described = await run("git", ["-C", deployDir, "describe", "--tags"]);
|
|
50
58
|
if (described.code === 0) {
|
|
51
59
|
const tag = described.stdout.trim();
|
|
52
60
|
if (tag)
|
|
53
|
-
return tag;
|
|
61
|
+
return { ref: tag, label: `legacy ${tag}`, releaseComparable: false };
|
|
54
62
|
}
|
|
55
63
|
return null;
|
|
56
64
|
}
|
|
@@ -61,7 +69,7 @@ async function resolveDeployed(deployDir) {
|
|
|
61
69
|
* `unknown`/`?`.
|
|
62
70
|
*/
|
|
63
71
|
export async function serverStatus(options = {}) {
|
|
64
|
-
await
|
|
72
|
+
await dockerPreflight(options.platform ? { platform: options.platform } : {});
|
|
65
73
|
const deployDir = resolveDeployDir(options);
|
|
66
74
|
// Probe the container. A null status means `docker inspect` failed → absent.
|
|
67
75
|
const statusField = await inspectField("{{.State.Status}}");
|
|
@@ -78,9 +86,9 @@ export async function serverStatus(options = {}) {
|
|
|
78
86
|
* harness `status` table's `update?` column).
|
|
79
87
|
*/
|
|
80
88
|
function badge(deployed, latest) {
|
|
81
|
-
if (!deployed || !latest)
|
|
89
|
+
if (!deployed?.releaseComparable || !latest)
|
|
82
90
|
return "?";
|
|
83
|
-
return isBehind(deployed, latest) ? "update-available" : "up-to-date";
|
|
91
|
+
return isBehind(deployed.ref, latest) ? "update-available" : "up-to-date";
|
|
84
92
|
}
|
|
85
93
|
function render(input) {
|
|
86
94
|
const { statusField, running, health, deployed, latest } = input;
|
|
@@ -91,7 +99,7 @@ function render(input) {
|
|
|
91
99
|
"",
|
|
92
100
|
` Running: ${runningLabel}`,
|
|
93
101
|
` Health: ${runningLabel === "not running" ? "—" : healthLabel}`,
|
|
94
|
-
` Deployed: ${deployed ?? "unknown"}`,
|
|
102
|
+
` Deployed: ${deployed?.label ?? "unknown"}`,
|
|
95
103
|
` Latest: ${latest ?? "unknown"}`,
|
|
96
104
|
` Update: ${badge(deployed, latest)}`,
|
|
97
105
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/server/status.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,EAAE;AACF,uEAAuE;AACvE,uEAAuE;AACvE,uEAAuE;AACvE,kEAAkE;AAClE
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/server/status.ts"],"names":[],"mappings":"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"}
|
package/dist/server/up.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Prompter } from "../prompt.js";
|
|
2
|
+
import { writeDeployState } from "./deploy-state.js";
|
|
2
3
|
export { redactSecrets } from "./redact.js";
|
|
3
4
|
/** The repository the deploy dir clones (same repo the latest-tag fetch targets). */
|
|
4
5
|
export declare const REPO_URL = "https://github.com/code-ministry-ltd/the-librarian";
|
|
@@ -42,8 +43,24 @@ export declare const SAVE_KEY_WARNING = "SAVE THIS KEY \u2014 excluded from back
|
|
|
42
43
|
* the client `~/.librarian/env` (env.ts). 0600, by construction.
|
|
43
44
|
*/
|
|
44
45
|
export declare const DEPLOY_ENV_FILE = "deploy.env";
|
|
46
|
+
/** Prefix for invocation-private credentials used while a candidate starts. */
|
|
47
|
+
export declare const STAGED_DEPLOY_ENV_FILE = "deploy.env.next";
|
|
45
48
|
/** `<deployDir>/deploy.env` — the 0600 deploy env-file path within a deploy dir. */
|
|
46
49
|
export declare function deployEnvFilePath(deployDir: string): string;
|
|
50
|
+
/** An invocation-private staged env path, promoted only after health succeeds. */
|
|
51
|
+
export declare function stagedDeployEnvFilePath(deployDir: string, invocationId: string): string;
|
|
52
|
+
export type StagedEnvIdMinter = () => string;
|
|
53
|
+
/** Inject the non-secret staged-file suffix (tests only). */
|
|
54
|
+
export declare function setStagedEnvIdMinter(next: StagedEnvIdMinter): void;
|
|
55
|
+
export declare function resetStagedEnvIdMinter(): void;
|
|
56
|
+
export type FinalizationRenamer = (source: string, destination: string) => void;
|
|
57
|
+
/** Inject the two final promotion operations (tests force the second to fail). */
|
|
58
|
+
export declare function setFinalizationRenamer(next: FinalizationRenamer): void;
|
|
59
|
+
export declare function resetFinalizationRenamer(): void;
|
|
60
|
+
export type FinalizationRestorer = (file: string, snapshot: FileSnapshot) => void;
|
|
61
|
+
/** Inject prior-file restoration failures (tests only). */
|
|
62
|
+
export declare function setFinalizationRestorer(next: FinalizationRestorer): void;
|
|
63
|
+
export declare function resetFinalizationRestorer(): void;
|
|
47
64
|
/** A sleep used between health polls. Injectable so tests don't actually wait. */
|
|
48
65
|
export type Sleep = (ms: number) => Promise<void>;
|
|
49
66
|
/** Override the health-poll sleep (tests inject a no-op so polling is instant). */
|
|
@@ -153,6 +170,11 @@ export interface UpDeps {
|
|
|
153
170
|
export declare class UpError extends Error {
|
|
154
171
|
constructor(message: string);
|
|
155
172
|
}
|
|
173
|
+
/** Deployment-file promotion failed; tells update whether exact prior bytes were restored. */
|
|
174
|
+
export declare class DeploymentFinalizationError extends UpError {
|
|
175
|
+
readonly priorFilesRestored: boolean;
|
|
176
|
+
constructor(message: string, priorFilesRestored: boolean);
|
|
177
|
+
}
|
|
156
178
|
export interface RunArgsInput {
|
|
157
179
|
host: string;
|
|
158
180
|
dataVolume: string;
|
|
@@ -162,7 +184,10 @@ export interface RunArgsInput {
|
|
|
162
184
|
dataDir?: string | undefined;
|
|
163
185
|
/** `uid:gid` to run the container as — set for a bind-mount so files stay host-owned. */
|
|
164
186
|
runAsUser?: string | undefined;
|
|
165
|
-
|
|
187
|
+
/** Restart policy to preserve during update recovery. Fresh deployments default to unless-stopped. */
|
|
188
|
+
restartPolicy?: string | undefined;
|
|
189
|
+
/** Exact local tag or digest-pinned registry reference passed to `docker run`. */
|
|
190
|
+
imageRef: string;
|
|
166
191
|
/**
|
|
167
192
|
* Absolute path to the 0600 deploy env-file ({@link writeDeployEnvFile}). The
|
|
168
193
|
* secrets (`LIBRARIAN_AGENT_TOKEN`, `LIBRARIAN_SECRET_KEY`, and optional
|
|
@@ -190,6 +215,8 @@ export interface RunArgsInput {
|
|
|
190
215
|
* {@link writeDeployEnvFile}), not on this argv.
|
|
191
216
|
*/
|
|
192
217
|
export declare function buildRunArgs(input: RunArgsInput): string[];
|
|
218
|
+
/** Build the detached candidate configuration without starting it. */
|
|
219
|
+
export declare function buildCreateArgs(input: RunArgsInput): string[];
|
|
193
220
|
/**
|
|
194
221
|
* The `uid:gid` that owns a path — the user the container runs as for a
|
|
195
222
|
* bind-mounted data dir, so the vault stays host-owned and operator-writable.
|
|
@@ -220,20 +247,8 @@ export interface DeployEnvInput {
|
|
|
220
247
|
*/
|
|
221
248
|
host: string;
|
|
222
249
|
}
|
|
223
|
-
/**
|
|
224
|
-
* Write the 0600 deploy env-file `docker run --env-file` reads, returning its
|
|
225
|
-
* path. It carries `LIBRARIAN_AGENT_TOKEN`, `LIBRARIAN_SECRET_KEY` (when
|
|
226
|
-
* supplied), optional `LIBRARIAN_BOOTSTRAP_CLAIM_SECRET`, and (loopback only)
|
|
227
|
-
* `LIBRARIAN_ALLOW_NO_AUTH=true`. Mode 0600 on create AND an unconditional
|
|
228
|
-
* `chmodSync(0o600)` so a pre-existing looser file is tightened (same discipline
|
|
229
|
-
* as env.ts `writeEnvFile`). The directory is created if missing.
|
|
230
|
-
*
|
|
231
|
-
* Format is `KEY=VALUE` lines (docker's `--env-file` syntax — NOT shell, so no
|
|
232
|
-
* quoting/`export`). The minted secrets are 64-hex with no special chars, so a
|
|
233
|
-
* raw value is safe; we reject a value with a newline (it would corrupt the file
|
|
234
|
-
* / smuggle a second var) rather than emit a malformed file.
|
|
235
|
-
*/
|
|
236
250
|
export declare function writeDeployEnvFile(deployDir: string, input: DeployEnvInput): string;
|
|
251
|
+
export declare function writeStagedDeployEnvFile(deployDir: string, input: DeployEnvInput): string;
|
|
237
252
|
/**
|
|
238
253
|
* Parse an existing deploy env-file into a `KEY=VALUE` record, or `{}` when absent.
|
|
239
254
|
* `up` uses this to REUSE the master key and optional bootstrap-claim secret
|
|
@@ -253,6 +268,13 @@ export interface UpResult {
|
|
|
253
268
|
* interfaces); the bind choice drives the auth model (§6).
|
|
254
269
|
*/
|
|
255
270
|
export declare function runUp(options: UpOptions, deps: UpDeps): Promise<UpResult>;
|
|
271
|
+
export declare function removeStagedEnv(stagedEnvFile: string): void;
|
|
272
|
+
interface FileSnapshot {
|
|
273
|
+
contents: Buffer | null;
|
|
274
|
+
mode?: number | undefined;
|
|
275
|
+
}
|
|
276
|
+
/** Promote env + state as one guarded unit, restoring exact prior bytes on failure. */
|
|
277
|
+
export declare function finalizeDeploymentFiles(deployDir: string, stagedEnvFile: string, state: Parameters<typeof writeDeployState>[1]): void;
|
|
256
278
|
/**
|
|
257
279
|
* Health-wait tuning shared by `up` and `update` (the bounded poll + log-tail).
|
|
258
280
|
* A subset of `UpOptions` so `update` can reuse {@link waitForHealthy} without
|
|
@@ -265,6 +287,8 @@ export interface HealthWaitOptions {
|
|
|
265
287
|
healthIntervalMs?: number | undefined;
|
|
266
288
|
/** Lines of `docker logs` to surface on a failed health-wait. */
|
|
267
289
|
logTailLines?: number | undefined;
|
|
290
|
+
/** Immutable container ID for owned-candidate cleanup; update omits this for legacy name use. */
|
|
291
|
+
containerIdentity?: string | undefined;
|
|
268
292
|
}
|
|
269
293
|
/**
|
|
270
294
|
* Poll `docker inspect … Health.Status` until `healthy`, bounded. On timeout or
|
package/dist/server/up.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"up.d.ts","sourceRoot":"","sources":["../../src/server/up.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"up.d.ts","sourceRoot":"","sources":["../../src/server/up.ts"],"names":[],"mappings":"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"}
|