signalk-container 1.15.2 → 1.16.1

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 CHANGED
@@ -656,7 +656,7 @@ See [doc/plugin-developer-guide.md](doc/plugin-developer-guide.md) for the full
656
656
  | `stop(name)` | Stop a running container |
657
657
  | `remove(name)` | Stop and remove a container |
658
658
  | `getState(name)` | Returns `running`, `stopped`, `missing`, or `no-runtime` |
659
- | `runJob(config)` | Execute a one-shot container job |
659
+ | `runJob(config)` | Execute a one-shot container job. Pass `config.signal` (an `AbortSignal`) to cancel a job mid-run — aborting force-removes the container and resolves with status `cancelled` (1.16.0+) |
660
660
  | `cleanupOrphanedJobs(filter)` | Reap `sk-job-*` containers leaked by a previous server lifecycle, filtered by the caller's `ownerPluginId`. Idempotent — returns `{ reaped: OrphanJobInfo[] }` so the plugin can roll back any per-job state it had written |
661
661
  | `getLogs(name, options?)` | One-shot fetch of the last N lines of a container's combined stdout+stderr log. `tail` defaults to 200, max 10000; `since` is unix-epoch seconds |
662
662
  | `prune()` | Remove dangling images |
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Copy `text` to the clipboard, returning whether it succeeded.
3
+ *
4
+ * Prefers the modern async Clipboard API. It only works in a secure
5
+ * context (HTTPS / localhost) — Signal K servers are commonly served over
6
+ * plain HTTP on a LAN, where `navigator.clipboard` is undefined. Falls back
7
+ * to the legacy `execCommand("copy")` trick (deprecated but still
8
+ * universally supported) so the button does something useful instead of
9
+ * silently failing on older browsers or non-SSL deployments.
10
+ */
11
+ export declare function copyTextToClipboard(text: string): Promise<boolean>;
12
+ //# sourceMappingURL=clipboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../src/clipboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA+BxE"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Copy `text` to the clipboard, returning whether it succeeded.
3
+ *
4
+ * Prefers the modern async Clipboard API. It only works in a secure
5
+ * context (HTTPS / localhost) — Signal K servers are commonly served over
6
+ * plain HTTP on a LAN, where `navigator.clipboard` is undefined. Falls back
7
+ * to the legacy `execCommand("copy")` trick (deprecated but still
8
+ * universally supported) so the button does something useful instead of
9
+ * silently failing on older browsers or non-SSL deployments.
10
+ */
11
+ export async function copyTextToClipboard(text) {
12
+ const tryAsync = async () => {
13
+ if (typeof navigator === "undefined" || !navigator.clipboard)
14
+ return false;
15
+ try {
16
+ await navigator.clipboard.writeText(text);
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ };
23
+ const tryLegacy = () => {
24
+ if (typeof document === "undefined")
25
+ return false;
26
+ const ta = document.createElement("textarea");
27
+ ta.value = text;
28
+ // Keep it off-screen + unfocused so the page doesn't visibly jump.
29
+ ta.style.position = "fixed";
30
+ ta.style.top = "-1000px";
31
+ ta.style.left = "-1000px";
32
+ ta.setAttribute("readonly", "");
33
+ document.body.appendChild(ta);
34
+ ta.select();
35
+ let ok;
36
+ try {
37
+ ok = document.execCommand("copy");
38
+ }
39
+ catch {
40
+ ok = false;
41
+ }
42
+ document.body.removeChild(ta);
43
+ return ok;
44
+ };
45
+ return (await tryAsync()) || tryLegacy();
46
+ }
47
+ //# sourceMappingURL=clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../src/clipboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACpD,MAAM,QAAQ,GAAG,KAAK,IAAsB,EAAE;QAC5C,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAC3E,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,GAAY,EAAE;QAC9B,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QAClD,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAC9C,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;QAChB,mEAAmE;QACnE,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;QAC5B,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC;QACzB,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;QAC1B,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC9B,EAAE,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,EAAW,CAAC;QAChB,IAAI,CAAC;YACH,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,EAAE,GAAG,KAAK,CAAC;QACb,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IACF,OAAO,CAAC,MAAM,QAAQ,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { SelfDeploymentResult, SelfDeploymentStatus } from "./types.js";
2
+ /**
3
+ * Boundary validator for the `/doctor/deployment` REST response. The
4
+ * config-panel fetch trusts the server, but a stale plugin version or a
5
+ * proxy returning an error page could deliver a different shape. Validate
6
+ * the nested fields `formatDoctorReport`/`DoctorModal` dereference without
7
+ * optional chaining (notably `env`'s entries and `cgroupControllers.missing`)
8
+ * so a malformed payload shows an error instead of crashing the render.
9
+ */
10
+ export declare function isSelfDeploymentResult(value: unknown): value is SelfDeploymentResult;
11
+ /**
12
+ * Short, single-line headline for a deployment-doctor status. Mirrors
13
+ * `headlineForDoctorStatus` in src/index.ts (server-side) — both must list
14
+ * all six statuses. Shared by the Doctor popup and the copy-able report.
15
+ */
16
+ export declare function headlineForStatus(status: SelfDeploymentStatus): string;
17
+ /**
18
+ * Render a `SelfDeploymentResult` as a plain-text report suitable for the
19
+ * clipboard or a support thread. One labelled fact per line, then the
20
+ * remediation block. No markup — copy-pasteable as-is.
21
+ */
22
+ export declare function formatDoctorReport(r: SelfDeploymentResult): string;
23
+ //# sourceMappingURL=doctorReport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctorReport.d.ts","sourceRoot":"","sources":["../src/doctorReport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAM7E;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,oBAAoB,CAe/B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAetE;AAWD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAyDlE"}
@@ -0,0 +1,125 @@
1
+ function isObj(value) {
2
+ return typeof value === "object" && value !== null;
3
+ }
4
+ /**
5
+ * Boundary validator for the `/doctor/deployment` REST response. The
6
+ * config-panel fetch trusts the server, but a stale plugin version or a
7
+ * proxy returning an error page could deliver a different shape. Validate
8
+ * the nested fields `formatDoctorReport`/`DoctorModal` dereference without
9
+ * optional chaining (notably `env`'s entries and `cgroupControllers.missing`)
10
+ * so a malformed payload shows an error instead of crashing the render.
11
+ */
12
+ export function isSelfDeploymentResult(value) {
13
+ if (!isObj(value))
14
+ return false;
15
+ if (typeof value.status !== "string")
16
+ return false;
17
+ if (typeof value.isContainerized !== "boolean")
18
+ return false;
19
+ if (!Array.isArray(value.remediation))
20
+ return false;
21
+ if (!isObj(value.binary))
22
+ return false;
23
+ if (!isObj(value.daemon) || typeof value.daemon.reachable !== "boolean")
24
+ return false;
25
+ if (!isObj(value.selfId))
26
+ return false;
27
+ if (!isObj(value.env))
28
+ return false;
29
+ if (!isObj(value.cgroupControllers))
30
+ return false;
31
+ const cg = value.cgroupControllers;
32
+ if (!Array.isArray(cg.missing))
33
+ return false;
34
+ if (cg.available !== null && !Array.isArray(cg.available))
35
+ return false;
36
+ return true;
37
+ }
38
+ /**
39
+ * Short, single-line headline for a deployment-doctor status. Mirrors
40
+ * `headlineForDoctorStatus` in src/index.ts (server-side) — both must list
41
+ * all six statuses. Shared by the Doctor popup and the copy-able report.
42
+ */
43
+ export function headlineForStatus(status) {
44
+ switch (status) {
45
+ case "ok":
46
+ return "Runtime ready";
47
+ case "no-runtime":
48
+ return "No container runtime found";
49
+ case "socket-unreachable":
50
+ return "Runtime socket unreachable";
51
+ case "permission-denied":
52
+ return "Runtime socket: permission denied";
53
+ case "self-id-unresolved":
54
+ return "Signal K container ID unresolved";
55
+ case "cgroup-controllers-incomplete":
56
+ return "Host cgroup controllers not fully delegated";
57
+ }
58
+ }
59
+ function or(value, dash = "—") {
60
+ return value == null || value === "" ? dash : value;
61
+ }
62
+ function yesNo(value) {
63
+ if (value == null)
64
+ return "unknown";
65
+ return value ? "yes" : "no";
66
+ }
67
+ /**
68
+ * Render a `SelfDeploymentResult` as a plain-text report suitable for the
69
+ * clipboard or a support thread. One labelled fact per line, then the
70
+ * remediation block. No markup — copy-pasteable as-is.
71
+ */
72
+ export function formatDoctorReport(r) {
73
+ const lines = [];
74
+ lines.push(`Deployment Doctor — ${headlineForStatus(r.status)}`);
75
+ lines.push(`status: ${r.status}`);
76
+ lines.push("");
77
+ lines.push(`containerized: ${yesNo(r.isContainerized)}`);
78
+ lines.push(`runtime: ${or(r.binary.name)} ${or(r.binary.version, "")}`.trimEnd());
79
+ lines.push(`daemon reachable: ${yesNo(r.daemon.reachable)}`);
80
+ lines.push(`rootless: ${yesNo(r.daemon.rootless)}`);
81
+ lines.push(`socket: ${or(r.daemon.socketPath)}`);
82
+ if (r.daemon.error)
83
+ lines.push(`daemon error: ${r.daemon.error}`);
84
+ if (r.isContainerized) {
85
+ const src = r.selfId.source ? ` (via ${r.selfId.source})` : "";
86
+ lines.push(`self container id: ${or(r.selfId.value)}${src}`);
87
+ }
88
+ const cg = r.cgroupControllers;
89
+ lines.push(`cgroup controllers: ${or(cg.available?.join(" ") ?? null)}`);
90
+ if (cg.missing.length > 0) {
91
+ lines.push(`cgroup controllers MISSING: ${cg.missing.join(" ")}`);
92
+ }
93
+ if (cg.kernelDisabledMemory) {
94
+ lines.push("kernel cmdline disables the memory controller");
95
+ }
96
+ if (r.containerStorage) {
97
+ const s = r.containerStorage;
98
+ const hazard = s.idmapHazard ? " (idmap hazard)" : "";
99
+ lines.push(`storage: ${or(s.fstype)} at ${or(s.storagePath)}${hazard}`);
100
+ }
101
+ const envEntries = Object.entries(r.env).filter(([, v]) => v != null);
102
+ if (envEntries.length > 0) {
103
+ lines.push("");
104
+ lines.push("env:");
105
+ for (const [k, v] of envEntries)
106
+ lines.push(` ${k}=${v}`);
107
+ }
108
+ lines.push("");
109
+ if (r.remediation.length > 0) {
110
+ lines.push("Remediation:");
111
+ for (const line of r.remediation)
112
+ lines.push(line);
113
+ }
114
+ else {
115
+ lines.push("No action needed (status ok).");
116
+ }
117
+ if (r.containerStorage && r.containerStorage.advice.length > 0) {
118
+ lines.push("");
119
+ lines.push("Storage advice:");
120
+ for (const line of r.containerStorage.advice)
121
+ lines.push(line);
122
+ }
123
+ return lines.join("\n");
124
+ }
125
+ //# sourceMappingURL=doctorReport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctorReport.js","sourceRoot":"","sources":["../src/doctorReport.ts"],"names":[],"mappings":"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"}
package/dist/errors.d.ts CHANGED
@@ -18,4 +18,13 @@ export interface CategorizedError {
18
18
  raw: string;
19
19
  }
20
20
  export declare function categorizeError(err: unknown): CategorizedError;
21
+ /**
22
+ * The most informative message for a caught error, for surfacing to a
23
+ * consumer/log. `safe()`/`safeInspect()` rethrow as `Error(userMessage, {
24
+ * cause: CategorizedError })` — so the message alone is the generic
25
+ * `userMessage` (e.g. "Unexpected error. See logs for details.") and the real
26
+ * runtime text lives in `cause.raw`. Prefer that raw text when present; fall
27
+ * back to the error's own message for errors thrown directly (not via `safe`).
28
+ */
29
+ export declare function describeError(err: unknown): string;
21
30
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,MAAM,GACN,MAAM,GACN,YAAY,GACZ,WAAW,GACX,oBAAoB,GACpB,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAkDD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAqD9D"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,MAAM,GACN,MAAM,GACN,YAAY,GACZ,WAAW,GACX,oBAAoB,GACpB,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAkDD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAqD9D;AAcD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAKlD"}
package/dist/errors.js CHANGED
@@ -90,4 +90,27 @@ export function categorizeError(err) {
90
90
  raw,
91
91
  };
92
92
  }
93
+ // Narrow to just the field describeError reads. safe()/safeInspect() attach a
94
+ // full CategorizedError as the cause, but guarding only `raw` keeps the check
95
+ // honest about what it actually asserts (and consumes).
96
+ function hasRawErrorText(value) {
97
+ return (typeof value === "object" &&
98
+ value !== null &&
99
+ "raw" in value &&
100
+ typeof value.raw === "string");
101
+ }
102
+ /**
103
+ * The most informative message for a caught error, for surfacing to a
104
+ * consumer/log. `safe()`/`safeInspect()` rethrow as `Error(userMessage, {
105
+ * cause: CategorizedError })` — so the message alone is the generic
106
+ * `userMessage` (e.g. "Unexpected error. See logs for details.") and the real
107
+ * runtime text lives in `cause.raw`. Prefer that raw text when present; fall
108
+ * back to the error's own message for errors thrown directly (not via `safe`).
109
+ */
110
+ export function describeError(err) {
111
+ if (err instanceof Error && hasRawErrorText(err.cause)) {
112
+ return err.cause.raw;
113
+ }
114
+ return err instanceof Error ? err.message : String(err);
115
+ }
93
116
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACd,MAAM,YAAY,CAAC;AAIpB,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAM9E;;;;;GAKG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,oBAAoB,EAC7B,MAAM,EAAE,kBAAkB,EAC1B,MAAM,GAAE,eAA6B,GACpC,OAAO,CAAC,kBAAkB,CAAC,CA8K7B;AAuDD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EACxE,aAAa,EAAE,MAAM,GACpB,aAAa,GAAG,IAAI,CAqBtB;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,oBAAoB,EAC7B,aAAa,EAAE,MAAM,EACrB,MAAM,GAAE,eAA6B,GACpC,OAAO,CAAC,oBAAoB,CAAC,CA0C/B"}
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACd,MAAM,YAAY,CAAC;AAIpB,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAOrB,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAM9E;;;;;GAKG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,oBAAoB,EAC7B,MAAM,EAAE,kBAAkB,EAC1B,MAAM,GAAE,eAA6B,GACpC,OAAO,CAAC,kBAAkB,CAAC,CAkO7B;AAuDD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EACxE,aAAa,EAAE,MAAM,GACpB,aAAa,GAAG,IAAI,CAqBtB;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,oBAAoB,EAC7B,aAAa,EAAE,MAAM,EACrB,MAAM,GAAE,eAA6B,GACpC,OAAO,CAAC,oBAAoB,CAAC,CA0C/B"}
package/dist/jobs.js CHANGED
@@ -4,6 +4,7 @@ import { userMappingFlags } from "./runtime.js";
4
4
  import { volumeArg, qualifyImage } from "./containers.js";
5
5
  import { resourcePayloadForRun } from "./resources.js";
6
6
  import { getClient, safe, safeInspect, } from "./client.js";
7
+ import { describeError } from "./errors.js";
7
8
  // `userMappingFlags` and the host-id test setter (`_setCurrentHostIdsForTesting`)
8
9
  // live in `runtime.ts` so both `jobs.ts` (one-shot helpers) and
9
10
  // `containers.ts` (long-running managed containers via `buildCreateOptions`)
@@ -33,6 +34,17 @@ export async function runJob(runtime, config, client = getClient()) {
33
34
  createdAt,
34
35
  runtime: runtime.runtime,
35
36
  };
37
+ // Caller cancelled before we even started — don't pull or create anything.
38
+ if (config.signal?.aborted) {
39
+ result.status = "cancelled";
40
+ result.error = "Job cancelled";
41
+ result.completedAt = new Date().toISOString();
42
+ return result;
43
+ }
44
+ // Set by the abort listener so the post-wait branch reports "cancelled"
45
+ // rather than the synthetic exit-1 "failed" that force-removing produces.
46
+ let aborted = false;
47
+ let onAbort;
36
48
  try {
37
49
  const exists = await safeInspect(() => client.getImage(image).inspect());
38
50
  if (exists === null) {
@@ -59,6 +71,14 @@ export async function runJob(runtime, config, client = getClient()) {
59
71
  return result;
60
72
  }
61
73
  }
74
+ // A cancel that landed during a long image pull: stop before we create
75
+ // and start a container. After start, the abort listener below handles it.
76
+ if (config.signal?.aborted) {
77
+ result.status = "cancelled";
78
+ result.error = "Job cancelled";
79
+ result.completedAt = new Date().toISOString();
80
+ return result;
81
+ }
62
82
  result.status = "running";
63
83
  result.startedAt = new Date().toISOString();
64
84
  // Label every job container so cleanupOrphanedJobs can find ours after
@@ -126,6 +146,17 @@ export async function runJob(runtime, config, client = getClient()) {
126
146
  };
127
147
  const container = await client.createContainer(createOpts);
128
148
  await container.start();
149
+ // Cancellation: force-removing the running container makes the pending
150
+ // wait() below reject — the same path a daemon-side disappearance takes —
151
+ // so an aborted job unwinds through the existing wait-failure handling.
152
+ // The `aborted` flag distinguishes that from a genuine wait() failure.
153
+ if (config.signal) {
154
+ onAbort = () => {
155
+ aborted = true;
156
+ void safe(() => client.getContainer(jobName).remove({ force: true }));
157
+ };
158
+ config.signal.addEventListener("abort", onAbort, { once: true });
159
+ }
129
160
  // Attach the follow-logs stream AFTER start. A follow stream opened on a
130
161
  // not-yet-started container comes back empty/immediately-closed on podman
131
162
  // (verified live), losing all output; opening it post-start replays the
@@ -143,26 +174,47 @@ export async function runJob(runtime, config, client = getClient()) {
143
174
  // Let the log stream finish flushing before we report — the follow
144
175
  // stream's `end` can lag the container's exit by a tick.
145
176
  await drained;
146
- result.exitCode = exitCode;
147
177
  result.log = log;
148
178
  result.completedAt = new Date().toISOString();
149
- result.status = exitCode === 0 ? "completed" : "failed";
150
- if (!waitResult.ok) {
151
- // wait() itself failed (socket dropped, daemon restarted, container
152
- // already reaped) — the exit code is a synthetic 1, so carry the real
153
- // reason instead of an invented "exited with code 1".
154
- result.error = `Could not read container exit status: ${waitResult.error.raw}`;
179
+ if (aborted) {
180
+ // We force-removed the container on abort, so wait() rejected (or
181
+ // returned a non-zero code). That's cancellation, not a failure — the
182
+ // synthetic exit code is meaningless here, so don't surface it.
183
+ result.status = "cancelled";
184
+ result.error = "Job cancelled";
155
185
  }
156
- else if (exitCode !== 0) {
157
- result.error = `Container exited with code ${exitCode}`;
186
+ else {
187
+ result.exitCode = exitCode;
188
+ result.status = exitCode === 0 ? "completed" : "failed";
189
+ if (!waitResult.ok) {
190
+ // wait() itself failed (socket dropped, daemon restarted, container
191
+ // already reaped) — the exit code is a synthetic 1, so carry the real
192
+ // reason instead of an invented "exited with code 1".
193
+ result.error = `Could not read container exit status: ${waitResult.error.raw}`;
194
+ }
195
+ else if (exitCode !== 0) {
196
+ result.error = `Container exited with code ${exitCode}`;
197
+ }
158
198
  }
159
199
  }
160
200
  catch (err) {
161
- result.status = "failed";
162
- result.error = err instanceof Error ? err.message : String(err);
163
201
  result.completedAt = new Date().toISOString();
202
+ if (aborted) {
203
+ result.status = "cancelled";
204
+ result.error = "Job cancelled";
205
+ }
206
+ else {
207
+ result.status = "failed";
208
+ // `safe()`/`safeInspect()` flatten the error to a generic userMessage and
209
+ // tuck the real runtime text into `cause.raw`; surface that so the
210
+ // consumer sees the actual reason, not "See logs for details."
211
+ result.error = describeError(err);
212
+ }
164
213
  }
165
214
  finally {
215
+ if (config.signal && onAbort) {
216
+ config.signal.removeEventListener("abort", onAbort);
217
+ }
166
218
  // Remove the container ourselves (we don't use AutoRemove). Covers both
167
219
  // the happy path and a create-but-never-started failure; `force: true`
168
220
  // stops it first if still running, and a 404 (already gone) is benign.
package/dist/jobs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -515,8 +515,21 @@ export interface ContainerJobConfig {
515
515
  inImageUid?: number;
516
516
  inImageGid?: number;
517
517
  } | false;
518
+ /**
519
+ * Cancel a job that is already running. When the signal aborts, runJob
520
+ * force-removes the job container, which unblocks the in-flight wait;
521
+ * the job then resolves with `status: "cancelled"`. A signal that is
522
+ * already aborted when runJob is called returns `cancelled` without
523
+ * creating a container. A job that finishes on its own is unaffected —
524
+ * a later abort is a harmless no-op.
525
+ *
526
+ * The boundary-level alternative (the caller stops dispatching new jobs)
527
+ * cannot interrupt a long single step such as a tile-join; this is the
528
+ * mechanism that can.
529
+ */
530
+ signal?: AbortSignal;
518
531
  }
519
- export type ContainerJobStatus = "pending" | "pulling" | "running" | "completed" | "failed";
532
+ export type ContainerJobStatus = "pending" | "pulling" | "running" | "completed" | "failed" | "cancelled";
520
533
  export interface ContainerJobResult {
521
534
  id: string;
522
535
  status: ContainerJobStatus;
@@ -851,6 +864,17 @@ export interface ContainerManagerApi {
851
864
  stop(name: string): Promise<void>;
852
865
  remove(name: string): Promise<void>;
853
866
  getState(name: string): Promise<ContainerState>;
867
+ /**
868
+ * Run a one-shot helper container to completion, streaming its output
869
+ * via the `onProgress`/`onStdoutLine`/`onStderrLine` callbacks and
870
+ * resolving with the exit status.
871
+ *
872
+ * Pass `config.signal` (an `AbortSignal`) to cancel a job mid-flight:
873
+ * aborting force-removes the running container and resolves with
874
+ * `status: "cancelled"`. This is the only way to interrupt a long
875
+ * single step (e.g. a tile-join); boundary-level cancellation in the
876
+ * caller cannot. Available in signalk-container >= 1.16.0.
877
+ */
854
878
  runJob(config: ContainerJobConfig): Promise<ContainerJobResult>;
855
879
  /**
856
880
  * One-shot capture of the last `tail` lines of a managed
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -497,14 +497,38 @@ const result = await containers.runJob({
497
497
  // it after a Signal K crash. Use your plugin's `id` from package.json.
498
498
  // Available in signalk-container >= 1.3.0.
499
499
  ownerPluginId: "signalk-charts-provider-simple",
500
+ // Optional AbortSignal to cancel the job mid-run. Aborting force-removes
501
+ // the running container and resolves with status "cancelled". This is the
502
+ // only way to interrupt a single long step (e.g. a tile-join) — stopping
503
+ // your own dispatch loop only cancels between jobs, not during one.
504
+ // Available in signalk-container >= 1.16.0.
505
+ signal: abortController.signal,
500
506
  });
501
507
 
502
508
  if (result.status === "completed") {
503
509
  console.log("Exit code:", result.exitCode);
504
510
  console.log("Output:", result.log);
511
+ } else if (result.status === "cancelled") {
512
+ console.log("Job was cancelled via its AbortSignal");
505
513
  }
506
514
  ```
507
515
 
516
+ To cancel, hold the `AbortController` and call `abort()` — e.g. from a REST handler wired to a UI Cancel button:
517
+
518
+ ```typescript
519
+ const abortController = new AbortController();
520
+ const jobPromise = containers.runJob({
521
+ ...config,
522
+ signal: abortController.signal,
523
+ });
524
+ // later, on user request:
525
+ abortController.abort(); // jobPromise resolves with status "cancelled"
526
+ ```
527
+
528
+ A signal already aborted when `runJob` is called (or aborted during the
529
+ image pull) returns `cancelled` without leaving a container running. A job
530
+ that finishes on its own is unaffected — a later `abort()` is a no-op.
531
+
508
532
  ### `getLogs(name, options?): Promise<string[]>`
509
533
 
510
534
  One-shot capture of a managed container's combined stdout/stderr log. Mirrors `podman logs --tail <N> [--since <ts>] sk-<name>`. Useful for attaching log context to a health-check failure, or for backfill scenarios that bypass the streaming broker.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "signalk-container",
3
- "version": "1.15.2",
3
+ "version": "1.16.1",
4
4
  "description": "Shared container runtime management (Podman/Docker) for Signal K plugins",
5
5
  "keywords": [
6
6
  "signalk-node-server-plugin",
@@ -1,6 +1,9 @@
1
- var e=globalThis.__SK_REACT__;if(!e)throw Error(`signalk-container: window.__SK_REACT__ is not set. The host signalk-server admin UI must expose React on window for plugin federation. Requires signalk-server 2.27.0 or newer.`);var t=e,{Activity:n,Children:r,Component:i,Fragment:a,Profiler:o,PureComponent:s,StrictMode:c,Suspense:l,cache:u,cacheSignal:d,cloneElement:f,createContext:p,createElement:m,createRef:h,forwardRef:g,isValidElement:_,lazy:v,memo:y,startTransition:b,use:x,useActionState:S,useCallback:C,useContext:w,useDebugValue:T,useDeferredValue:E,useEffect:D,useEffectEvent:O,useId:k,useImperativeHandle:A,useInsertionEffect:ee,useLayoutEffect:j,useMemo:M,useOptimistic:N,useReducer:P,useRef:F,useState:I,useSyncExternalStore:L,useTransition:R,version:te}=t,z=globalThis.__SK_REACT_JSX_RUNTIME__;if(!z)throw Error(`signalk-container: window.__SK_REACT_JSX_RUNTIME__ is not set by the host.`);var B=z,{Fragment:V,jsx:H,jsxs:U}=B;B.jsxDEV;var W=1e4,G=200,K={overlay:{position:`fixed`,inset:0,background:`rgba(0,0,0,0.5)`,display:`flex`,alignItems:`center`,justifyContent:`center`,zIndex:99999},modal:{background:`#fff`,borderRadius:8,boxShadow:`0 10px 25px rgba(0,0,0,0.2)`,width:`min(90vw, 1100px)`,maxHeight:`85vh`,display:`flex`,flexDirection:`column`,overflow:`hidden`},header:{padding:`12px 16px`,borderBottom:`1px solid #e5e7eb`,display:`flex`,alignItems:`center`,gap:12},title:{fontSize:16,fontWeight:600,color:`#111`,flex:1},statusDot:{width:10,height:10,borderRadius:`50%`,flexShrink:0},statusGreen:{background:`#10b981`},statusAmber:{background:`#f59e0b`},statusRed:{background:`#ef4444`},toolbarBtn:{padding:`5px 10px`,fontSize:12,background:`#fff`,color:`#374151`,border:`1px solid #d1d5db`,borderRadius:4,cursor:`pointer`},toolbarBtnActive:{background:`#3b82f6`,color:`#fff`,borderColor:`#3b82f6`},closeBtn:{padding:`5px 12px`,fontSize:12,background:`#fff`,color:`#374151`,border:`1px solid #d1d5db`,borderRadius:4,cursor:`pointer`},body:{flex:1,overflow:`auto`,background:`#1f2937`,color:`#e5e7eb`,fontFamily:`"SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace`,fontSize:12,lineHeight:1.5,padding:`12px 16px`,margin:0,whiteSpace:`pre-wrap`,wordBreak:`break-word`},endBanner:{padding:`8px 16px`,background:`#fef3c7`,color:`#92400e`,fontSize:12,borderTop:`1px solid #fde68a`},metaLine:{fontSize:11,color:`#6b7280`}};function ne({name:e,onClose:t}){let[n,r]=I([]),[i,a]=I(`connecting`),[o,s]=I(null),[c,l]=I(!0),[u,d]=I(!1),f=F(null),p=F(null),m=F(null),h=F(!1),g=F(!1),_=F(null),v=F(null),y=F(null),b=C(e=>{r(t=>{let n=t.concat(e);return n.length>W?n.slice(n.length-W):n})},[]);D(()=>{let t=!1;return(async()=>{let n=!1;try{let r=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/logs?tail=${G}`);if(t)return;if(r.ok){let e=await r.json();b(Array.isArray(e.lines)?e.lines:[]),a(`backfill`)}else r.status===404?(b([`[error] container not found (HTTP 404)`]),s(`container not found`),a(`disconnected`),n=!0):(b([`[error] backfill failed: HTTP ${r.status}`]),a(`backfill`))}catch(e){if(t)return;b([`[error] backfill failed: ${e instanceof Error?e.message:String(e)}`])}if(t||n)return;let r=new EventSource(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/logs/stream`);m.current=r,r.addEventListener(`hello`,()=>{t||a(`streaming`)}),r.onmessage=e=>{t||e.data!=null&&b([e.data])},r.addEventListener(`end`,e=>{if(t)return;let n=e.data;s(n||`stream ended`),a(`disconnected`),r.close()}),r.onerror=()=>{t||a(e=>e===`disconnected`?e:`connecting`)}})(),()=>{t=!0,m.current&&=(m.current.close(),null)}},[e,b]),j(()=>{if(!c||h.current)return;let e=p.current;e&&(g.current=!0,e.scrollIntoView({block:`end`,inline:`nearest`}),requestAnimationFrame(()=>{g.current=!1}))},[n,c]);let x=C(e=>{if(g.current){g.current=!1;return}let t=f.current;t&&(h.current=!(t.scrollHeight-t.scrollTop-t.clientHeight<8))},[]),S=C(()=>{l(e=>{let t=!e;if(t){h.current=!1;let e=p.current;e&&(g.current=!0,e.scrollIntoView({block:`end`,inline:`nearest`}),requestAnimationFrame(()=>{g.current=!1}))}return t})},[]),w=C(async()=>{let e=n.join(`
2
- `);(await(async()=>{if(typeof navigator>`u`||!navigator.clipboard)return!1;try{return await navigator.clipboard.writeText(e),!0}catch{return!1}})()||(()=>{if(typeof document>`u`)return!1;let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.top=`-1000px`,t.style.left=`-1000px`,t.setAttribute(`readonly`,``),document.body.appendChild(t),t.select();let n=!1;try{n=document.execCommand(`copy`)}catch{n=!1}return document.body.removeChild(t),n})())&&(d(!0),setTimeout(()=>d(!1),1500))},[n]),T=C(()=>{let t=new Blob([n.join(`
1
+ var e=globalThis.__SK_REACT__;if(!e)throw Error(`signalk-container: window.__SK_REACT__ is not set. The host signalk-server admin UI must expose React on window for plugin federation. Requires signalk-server 2.27.0 or newer.`);var t=e,{Activity:n,Children:r,Component:i,Fragment:a,Profiler:o,PureComponent:s,StrictMode:c,Suspense:l,cache:u,cacheSignal:d,cloneElement:f,createContext:p,createElement:m,createRef:h,forwardRef:g,isValidElement:_,lazy:v,memo:y,startTransition:b,use:x,useActionState:S,useCallback:C,useContext:w,useDebugValue:T,useDeferredValue:E,useEffect:D,useEffectEvent:O,useId:ee,useImperativeHandle:k,useInsertionEffect:te,useLayoutEffect:ne,useMemo:re,useOptimistic:A,useReducer:ie,useRef:j,useState:M,useSyncExternalStore:ae,useTransition:oe,version:N}=t;async function P(e){return await(async()=>{if(typeof navigator>`u`||!navigator.clipboard)return!1;try{return await navigator.clipboard.writeText(e),!0}catch{return!1}})()||(()=>{if(typeof document>`u`)return!1;let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.top=`-1000px`,t.style.left=`-1000px`,t.setAttribute(`readonly`,``),document.body.appendChild(t),t.select();let n;try{n=document.execCommand(`copy`)}catch{n=!1}return document.body.removeChild(t),n})()}var F=globalThis.__SK_REACT_JSX_RUNTIME__;if(!F)throw Error(`signalk-container: window.__SK_REACT_JSX_RUNTIME__ is not set by the host.`);var I=F,{Fragment:L,jsx:R,jsxs:z}=I;I.jsxDEV;var B=1e4,V=200,H={overlay:{position:`fixed`,inset:0,background:`rgba(0,0,0,0.5)`,display:`flex`,alignItems:`center`,justifyContent:`center`,zIndex:99999},modal:{background:`#fff`,borderRadius:8,boxShadow:`0 10px 25px rgba(0,0,0,0.2)`,width:`min(90vw, 1100px)`,maxHeight:`85vh`,display:`flex`,flexDirection:`column`,overflow:`hidden`},header:{padding:`12px 16px`,borderBottom:`1px solid #e5e7eb`,display:`flex`,alignItems:`center`,gap:12},title:{fontSize:16,fontWeight:600,color:`#111`,flex:1},statusDot:{width:10,height:10,borderRadius:`50%`,flexShrink:0},statusGreen:{background:`#10b981`},statusAmber:{background:`#f59e0b`},statusRed:{background:`#ef4444`},toolbarBtn:{padding:`5px 10px`,fontSize:12,background:`#fff`,color:`#374151`,border:`1px solid #d1d5db`,borderRadius:4,cursor:`pointer`},toolbarBtnActive:{background:`#3b82f6`,color:`#fff`,borderColor:`#3b82f6`},closeBtn:{padding:`5px 12px`,fontSize:12,background:`#fff`,color:`#374151`,border:`1px solid #d1d5db`,borderRadius:4,cursor:`pointer`},body:{flex:1,overflow:`auto`,background:`#1f2937`,color:`#e5e7eb`,fontFamily:`"SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace`,fontSize:12,lineHeight:1.5,padding:`12px 16px`,margin:0,whiteSpace:`pre-wrap`,wordBreak:`break-word`},endBanner:{padding:`8px 16px`,background:`#fef3c7`,color:`#92400e`,fontSize:12,borderTop:`1px solid #fde68a`},metaLine:{fontSize:11,color:`#6b7280`}};function se({name:e,onClose:t}){let[n,r]=M([]),[i,a]=M(`connecting`),[o,s]=M(null),[c,l]=M(!0),[u,d]=M(!1),f=j(null),p=j(null),m=j(null),h=j(!1),g=j(!1),_=j(null),v=j(null),y=j(null),b=C(e=>{r(t=>{let n=t.concat(e);return n.length>B?n.slice(n.length-B):n})},[]);D(()=>{let t=!1;return(async()=>{let n=!1;try{let r=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/logs?tail=${V}`);if(t)return;if(r.ok){let e=await r.json();b(Array.isArray(e.lines)?e.lines:[]),a(`backfill`)}else r.status===404?(b([`[error] container not found (HTTP 404)`]),s(`container not found`),a(`disconnected`),n=!0):(b([`[error] backfill failed: HTTP ${r.status}`]),a(`backfill`))}catch(e){if(t)return;b([`[error] backfill failed: ${e instanceof Error?e.message:String(e)}`])}if(t||n)return;let r=new EventSource(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/logs/stream`);m.current=r,r.addEventListener(`hello`,()=>{t||a(`streaming`)}),r.onmessage=e=>{t||e.data!=null&&b([e.data])},r.addEventListener(`end`,e=>{if(t)return;let n=e.data;s(n||`stream ended`),a(`disconnected`),r.close()}),r.onerror=()=>{t||a(e=>e===`disconnected`?e:`connecting`)}})(),()=>{t=!0,m.current&&=(m.current.close(),null)}},[e,b]),ne(()=>{if(!c||h.current)return;let e=p.current;e&&(g.current=!0,e.scrollIntoView({block:`end`,inline:`nearest`}),requestAnimationFrame(()=>{g.current=!1}))},[n,c]);let x=C(e=>{if(g.current){g.current=!1;return}let t=f.current;t&&(h.current=!(t.scrollHeight-t.scrollTop-t.clientHeight<8))},[]),S=C(()=>{l(e=>{let t=!e;if(t){h.current=!1;let e=p.current;e&&(g.current=!0,e.scrollIntoView({block:`end`,inline:`nearest`}),requestAnimationFrame(()=>{g.current=!1}))}return t})},[]),w=C(async()=>{await P(n.join(`
2
+ `))&&(d(!0),setTimeout(()=>d(!1),1500))},[n]),T=C(()=>{let t=new Blob([n.join(`
3
3
  `)+`
4
- `],{type:`text/plain;charset=utf-8`}),r=URL.createObjectURL(t),i=document.createElement(`a`);i.href=r,i.download=`${e}-${new Date().toISOString().replace(/[:.]/g,`-`)}.log`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)},[n,e]);D(()=>{let e=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]),D(()=>{y.current=typeof document<`u`?document.activeElement:null;let e=setTimeout(()=>{v.current?.focus()},0);return()=>{clearTimeout(e);let t=y.current;if(t instanceof HTMLElement)try{t.focus()}catch{}}},[]);let E=C(e=>{if(e.key!==`Tab`)return;let t=_.current;if(!t)return;let n=Array.from(t.querySelectorAll(`button:not([disabled]), [tabindex]:not([tabindex="-1"])`)).filter(e=>e.offsetParent!==null);if(n.length===0)return;let r=n[0],i=n[n.length-1],a=document.activeElement;e.shiftKey?(a===r||!t.contains(a))&&(e.preventDefault(),i.focus()):a===i&&(e.preventDefault(),r.focus())},[]),O=C(e=>{e.target===e.currentTarget&&t()},[t]),k=i===`streaming`?K.statusGreen:i===`disconnected`?K.statusRed:K.statusAmber,A=i===`connecting`?`Connecting…`:i===`backfill`?`Backfilled — opening live stream…`:i===`streaming`?`Live`:`Disconnected`;return H(`div`,{style:K.overlay,onClick:O,role:`dialog`,"aria-modal":`true`,"aria-label":`Logs for ${e}`,children:U(`div`,{style:K.modal,ref:_,onKeyDown:E,children:[U(`div`,{style:K.header,children:[H(`span`,{style:{...K.statusDot,...k},title:A}),H(`span`,{style:K.title,children:e}),H(`span`,{style:K.metaLine,children:A}),U(`span`,{style:K.metaLine,children:[`· `,n.length,` lines`]}),H(`button`,{type:`button`,style:{...K.toolbarBtn,...c?K.toolbarBtnActive:{}},onClick:S,title:`Auto-scroll to bottom on new lines`,children:`Auto-scroll`}),H(`button`,{type:`button`,style:K.toolbarBtn,onClick:w,title:`Copy visible log to clipboard`,children:u?`Copied!`:`Copy`}),H(`button`,{type:`button`,style:K.toolbarBtn,onClick:T,title:`Download log as text file`,children:`Download`}),H(`button`,{type:`button`,style:K.closeBtn,onClick:t,ref:v,children:`Close`})]}),U(`pre`,{ref:f,style:K.body,onScroll:x,"aria-label":`Container log output`,tabIndex:0,children:[n.length===0?`(no log lines yet)`:n.join(`
5
- `),H(`div`,{ref:p,"aria-hidden":`true`})]}),o&&U(`div`,{style:K.endBanner,children:[`Stream ended: `,o]})]})})}var q={root:{fontFamily:`-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`,color:`#333`,padding:`16px 0`},sectionTitle:{fontSize:13,fontWeight:600,color:`#888`,textTransform:`uppercase`,letterSpacing:`0.05em`,marginBottom:10,marginTop:24},btn:{display:`inline-flex`,alignItems:`center`,gap:8,padding:`8px 16px`,border:`none`,borderRadius:6,fontSize:13,fontWeight:600,cursor:`pointer`},btnPrimary:{background:`#3b82f6`,color:`#fff`},btnDanger:{background:`#ef4444`,color:`#fff`,padding:`6px 12px`,fontSize:12},btnWarning:{background:`#f59e0b`,color:`#fff`,padding:`6px 12px`,fontSize:12},btnSave:{background:`#3b82f6`,color:`#fff`},btnSuccess:{background:`#10b981`,color:`#fff`},btnDisabled:{opacity:.5,cursor:`not-allowed`},status:{marginTop:8,fontSize:12,minHeight:18},runtimeCard:{display:`flex`,alignItems:`center`,gap:14,padding:`14px 18px`,background:`#f8f9fa`,border:`1px solid #e0e0e0`,borderRadius:10,marginBottom:12},runtimeIcon:{width:44,height:44,borderRadius:10,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:22,flexShrink:0},runtimeInfo:{flex:1},runtimeName:{fontSize:15,fontWeight:600,color:`#333`},runtimeVersion:{fontSize:12,color:`#888`},runtimeRemediation:{fontSize:12,color:`#666`,fontFamily:`ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace`,whiteSpace:`pre-wrap`,marginTop:6,lineHeight:1.45},containerItem:{display:`flex`,alignItems:`center`,gap:12,padding:`10px 14px`,background:`#f8f9fa`,border:`1px solid #e0e0e0`,borderRadius:10,marginBottom:8},stateIndicator:{width:10,height:10,borderRadius:`50%`,flexShrink:0},containerInfo:{flex:1,minWidth:0},containerName:{fontSize:14,fontWeight:600,color:`#333`},containerMeta:{fontSize:11,color:`#888`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},containerActions:{display:`flex`,gap:6,flexShrink:0},containerCard:{background:`#f8f9fa`,border:`1px solid #e0e0e0`,borderRadius:10,marginBottom:8,overflow:`hidden`},containerItemFlat:{display:`flex`,alignItems:`center`,gap:12,padding:`10px 14px`},limitsRow:{display:`flex`,alignItems:`center`,gap:10,padding:`6px 14px 10px 34px`,fontSize:11,color:`#666`,flexWrap:`wrap`},updatesRow:{display:`flex`,alignItems:`center`,gap:10,padding:`0 14px 10px 34px`,fontSize:11,color:`#666`,flexWrap:`wrap`},limitBadge:{display:`inline-flex`,alignItems:`center`,padding:`2px 8px`,borderRadius:12,background:`#e5e7eb`,color:`#374151`,fontSize:11,fontWeight:500},overrideBadge:{display:`inline-flex`,alignItems:`center`,padding:`2px 8px`,borderRadius:12,background:`#fef3c7`,color:`#92400e`,fontSize:10,fontWeight:600},editLimitsBtn:{marginLeft:`auto`,padding:`3px 10px`,fontSize:11,background:`#fff`,color:`#3b82f6`,border:`1px solid #3b82f6`,borderRadius:6,cursor:`pointer`,fontWeight:500},limitsEditor:{borderTop:`1px solid #e0e0e0`,padding:`14px 14px 14px 34px`,background:`#fff`},limitsEditorGrid:{display:`grid`,gridTemplateColumns:`160px 1fr auto`,gap:`8px 12px`,alignItems:`center`,marginBottom:10},limitsEditorLabel:{fontSize:12,fontWeight:500,color:`#555`},limitsEditorInput:{padding:`5px 8px`,borderRadius:5,border:`1px solid #ccc`,fontSize:12,background:`#fff`,color:`#333`,fontFamily:`inherit`,width:`100%`,boxSizing:`border-box`},limitsEditorInputDisabled:{background:`#f3f4f6`,color:`#9ca3af`,fontStyle:`italic`},limitsEditorUnsetBtn:{width:24,height:24,borderRadius:4,border:`1px solid #d1d5db`,background:`#fff`,color:`#6b7280`,fontSize:14,lineHeight:1,cursor:`pointer`,display:`inline-flex`,alignItems:`center`,justifyContent:`center`},limitsEditorUnsetBtnActive:{background:`#fee2e2`,color:`#991b1b`,border:`1px solid #fca5a5`},limitsEditorAdvancedToggle:{fontSize:11,color:`#3b82f6`,cursor:`pointer`,userSelect:`none`,marginTop:6,marginBottom:10,display:`inline-block`},limitsEditorActions:{display:`flex`,gap:8,justifyContent:`flex-end`,marginTop:10},limitsEditorResult:{marginTop:10,padding:`8px 10px`,borderRadius:6,fontSize:11,lineHeight:1.5},limitsEditorResultLive:{background:`#d1fae5`,color:`#065f46`},limitsEditorResultRecreated:{background:`#fef3c7`,color:`#92400e`},limitsEditorResultError:{background:`#fee2e2`,color:`#991b1b`},limitsEditorWarning:{marginTop:4,fontSize:10,opacity:.85,fontStyle:`italic`},empty:{textAlign:`center`,padding:`30px 16px`,color:`#999`,fontSize:13},fieldRow:{display:`flex`,alignItems:`center`,gap:12,marginBottom:10},label:{fontSize:13,fontWeight:500,color:`#555`,width:160,flexShrink:0},select:{padding:`6px 10px`,borderRadius:6,border:`1px solid #ccc`,fontSize:13,background:`#fff`,color:`#333`},hint:{fontSize:11,color:`#aaa`,marginLeft:8},pruneResult:{fontSize:12,color:`#10b981`,marginTop:6}},re={running:`#10b981`,stopped:`#f59e0b`,missing:`#94a3b8`,"no-runtime":`#ef4444`},J={running:`Running`,stopped:`Stopped`,missing:`Not created`,"no-runtime":`No runtime`};function Y({label:e,value:t,options:n,onChange:r,hint:i}){return U(`div`,{style:q.fieldRow,children:[H(`span`,{style:q.label,children:e}),H(`select`,{style:q.select,value:t,onChange:e=>r(e.target.value),children:n.map(e=>H(`option`,{value:e.value,children:e.label},e.value))}),i&&H(`span`,{style:q.hint,children:i})]})}function ie({label:e,value:t,onChange:n,hint:r}){return U(`div`,{style:q.fieldRow,children:[H(`span`,{style:q.label,children:e}),U(`label`,{style:{display:`inline-flex`,alignItems:`center`,cursor:`pointer`,gap:8},children:[H(`input`,{type:`checkbox`,checked:t,onChange:e=>n(e.target.checked),style:{width:16,height:16,cursor:`pointer`}}),H(`span`,{style:{fontSize:13,color:`#555`},children:t?`Enabled`:`Disabled`})]}),r&&H(`span`,{style:q.hint,children:r})]})}function X(e){return e&&e.startsWith(`sk-`)?e.slice(3):e}var Z=[{key:`cpus`,label:`CPU (cores)`,type:`number`,step:`0.1`,min:`0.1`,placeholder:`e.g. 1.5`,primary:!0},{key:`memory`,label:`Memory`,type:`text`,placeholder:`e.g. 512m, 2g`,primary:!0},{key:`memorySwap`,label:`Memory + swap`,type:`text`,placeholder:`= memory to disable swap`,primary:!0},{key:`pidsLimit`,label:`Max processes`,type:`number`,step:`1`,min:`1`,placeholder:`e.g. 200`,primary:!0},{key:`cpuShares`,label:`CPU shares (weight)`,type:`number`,step:`1`,min:`2`,placeholder:`default 1024`,primary:!1},{key:`cpusetCpus`,label:`Pin to CPUs`,type:`text`,placeholder:`e.g. "0,1" or "1-3"`,primary:!1},{key:`memoryReservation`,label:`Memory reservation`,type:`text`,placeholder:`soft floor, e.g. 256m`,primary:!1},{key:`oomScoreAdj`,label:`OOM score adjust`,type:`number`,step:`1`,min:`-1000`,max:`1000`,placeholder:`-1000 to 1000`,primary:!1}];function ae(e){try{let t=new Date(e).getTime();if(!Number.isFinite(t))return e;let n=Math.max(0,Math.floor((Date.now()-t)/1e3));if(n<5)return`just now`;if(n<60)return`${n}s ago`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let i=Math.floor(r/60);return i<24?`${i}h ago`:`${Math.floor(i/24)}d ago`}catch{return e}}function oe(e){if(!e)return`No update data`;let{runningTag:t,currentVersion:n,latestVersion:r,updateAvailable:i,reason:a,fromCache:o}=e;return a===`offline`?o?`\u{1F4E1} Offline — last cached result shows ${i?`update available`:`up to date`}`:`📡 Offline — no cached result yet`:a===`newer-version`?`\u2191 Update available: ${n} \u2192 ${r}`:a===`digest-drift`?`\u21BB Rebuild available for :${t}${r?` (latest stable: ${r})`:``}`:a===`up-to-date`?`\u2705 Up to date${n?` (`+n+`)`:``}`:a===`older-than-pinned`?`\u2139 Pinned to ${n}, latest stable is ${r}`:a===`error`?`\u26A0 Check error: ${e.error||`unknown`}`:`State: ${a||`unknown`}`}function se(e){if(!e||!e.reason)return null;let{reason:t,runningTag:n,currentVersion:r,latestVersion:i,fromCache:a}=e;return t===`newer-version`?{label:`\u2191 ${i||`update`} available`,bg:`#fef3c7`,fg:`#92400e`,title:`Update available: ${r} \u2192 ${i}`}:t===`digest-drift`?{label:`↻ rebuild available`,bg:`#fef3c7`,fg:`#92400e`,title:`Image rebuild available for :${n}${i?` (latest stable ${i})`:``}`}:t===`offline`?{label:a?`📡 offline (cached)`:`📡 offline`,bg:`#e5e7eb`,fg:`#4b5563`,title:a?`Network unreachable; showing last cached check result`:`Network unreachable; no cached result yet`}:t===`error`?{label:`⚠ check error`,bg:`#fee2e2`,fg:`#991b1b`,title:e.error||`Update check error`}:t===`up-to-date`?{label:`✅ up to date`,bg:`#dcfce7`,fg:`#166534`,title:`Up to date${r?` (`+r+`)`:``}`}:null}function Q(e){let t={};for(let n of Z){let r=n.key,i=e[n.key];if(i===null){t[r]=null;continue}if(!(i===void 0||i===``))if(n.type===`number`){let e=Number(i);if(!Number.isFinite(e))continue;t[r]=e}else t[r]=i}return t}function ce(e,t){if(t==null||t===``)return null;switch(e){case`cpus`:return`${t} CPU`;case`memory`:return`${t}`;case`memorySwap`:return`swap: ${t}`;case`memoryReservation`:return`reserve: ${t}`;case`pidsLimit`:return`${t} PIDs`;case`cpuShares`:return`shares: ${t}`;case`cpusetCpus`:return`cpus: ${t}`;case`oomScoreAdj`:return`oom: ${t}`;default:return`${e}: ${t}`}}function le({containerName:e,effective:n,initialOverride:r,onApply:i,onResetToDefault:a,onClose:o}){let s=e=>{let t=e??n,r={};for(let e of Z){let n=e.key,i=t?t[n]:void 0;i==null?r[e.key]=``:r[e.key]=String(i)}return r},[c,l]=I(()=>s(n)),[u,d]=I(()=>r?Z.some(e=>!e.primary&&r[e.key]!==void 0):!1),[f,p]=I(!1),[m,h]=I(!1),[g,_]=I(null),v=(e,t)=>{l(n=>({...n,[e]:t}))},y=e=>{l(t=>({...t,[e]:t[e]===null?``:null}))},b=()=>{l(s(n)),_(null)},x=async()=>{p(!0),_(null);try{let e=await i(Q(c));_(e),e&&e.effective&&l(s(e.effective))}catch(e){_({error:e instanceof Error?e.message:String(e)})}p(!1)},S=async()=>{if(window.confirm(`Reset ${e} to the plugin's default resource limits? This will remove your override and may cause a brief container recreate (~5s of downtime) if memory limits need to be unset.`)){h(!0),_(null);try{let e=await a();_(e),e&&e.effective&&l(s(e.effective))}catch(e){_({error:e instanceof Error?e.message:String(e)})}h(!1)}},C=n=>{let r=c[n.key],i=r===null;return U(t.Fragment,{children:[H(`label`,{style:q.limitsEditorLabel,htmlFor:`lim-${e}-${n.key}`,children:n.label}),H(`input`,{id:`lim-${e}-${n.key}`,type:i?`text`:n.type,value:i?``:r,step:n.step,min:n.min,max:n.max,placeholder:i?`(unset — remove limit)`:n.placeholder,disabled:i,onChange:e=>v(n.key,e.target.value),style:{...q.limitsEditorInput,...i?q.limitsEditorInputDisabled:{}}}),H(`button`,{type:`button`,onClick:()=>y(n.key),title:i?`Click to set a value again`:`Click to explicitly unset (remove this limit)`,style:{...q.limitsEditorUnsetBtn,...i?q.limitsEditorUnsetBtnActive:{}},children:i?`↺`:`×`})]},n.key)},w=Z.filter(e=>e.primary),T=Z.filter(e=>!e.primary);return U(`div`,{style:q.limitsEditor,children:[H(`div`,{style:q.limitsEditorGrid,children:w.map(C)}),U(`span`,{onClick:()=>d(!u),style:q.limitsEditorAdvancedToggle,children:[u?`▾`:`▸`,` Advanced (`,T.length,` more fields)`]}),u&&H(`div`,{style:q.limitsEditorGrid,children:T.map(C)}),U(`div`,{style:q.limitsEditorActions,children:[H(`button`,{type:`button`,onClick:o,disabled:f||m,style:{...q.btn,padding:`6px 12px`,fontSize:12,background:`#fff`,color:`#6b7280`,border:`1px solid #d1d5db`,...f||m?q.btnDisabled:{}},children:`Close`}),H(`button`,{type:`button`,onClick:S,disabled:f||m,title:`Clear override and restore plugin-default limits`,style:{...q.btn,padding:`6px 12px`,fontSize:12,background:`#fff`,color:`#d97706`,border:`1px solid #f59e0b`,...f||m?q.btnDisabled:{}},children:m?`Resetting...`:`Reset to default`}),H(`button`,{type:`button`,onClick:b,disabled:f||m,title:`Discard unsaved changes in this form (does not touch the server)`,style:{...q.btn,padding:`6px 12px`,fontSize:12,background:`#fff`,color:`#6b7280`,border:`1px solid #d1d5db`,...f||m?q.btnDisabled:{}},children:`Revert`}),H(`button`,{type:`button`,onClick:x,disabled:f||m,style:{...q.btn,...q.btnPrimary,padding:`6px 14px`,fontSize:12,...f||m?q.btnDisabled:{}},children:f?`Applying...`:`Apply`})]}),g&&H(`div`,{style:{...q.limitsEditorResult,...g.error?q.limitsEditorResultError:g.method===`recreated`?q.limitsEditorResultRecreated:q.limitsEditorResultLive},children:g.error?U(V,{children:[H(`strong`,{children:`Error:`}),` `,g.error]}):U(V,{children:[H(`strong`,{children:g.method===`live`?`Applied live (no restart)`:`Container recreated`}),g.warnings&&g.warnings.length>0&&H(`div`,{style:q.limitsEditorWarning,children:g.warnings.map((e,t)=>U(`div`,{children:[`⚠ `,e]},t))})]})})]})}function ue(e){if(!e)return`No container runtime found`;switch(e.status){case`no-runtime`:return`No container runtime found`;case`socket-unreachable`:return`Runtime socket unreachable`;case`permission-denied`:return`Runtime socket: permission denied`;case`self-id-unresolved`:return`Signal K container ID unresolved`;case`ok`:return`Container runtime ready`}}function $({configuration:e,save:t}){let n=e||{},[r,i]=I(n.runtime||`auto`),[a,o]=I(n.pruneSchedule||`weekly`),[s,c]=I(n.updateCheckInterval||`24h`),[l,u]=I(n.backgroundUpdateChecks!==!1),[d,f]=I(n.containerOverrides||{}),[p,m]=I(null),[h,g]=I(null),[_,v]=I([]),[y,b]=I({}),[x,S]=I({}),[w,T]=I({}),[E,O]=I({}),[k,A]=I(new Set),[ee,j]=I(new Set),[M,N]=I(null),[P,F]=I(!0),[L,R]=I(``),[te,z]=I(!1),[B,V]=I(null),W=C(async()=>{try{let[e,t]=await Promise.all([fetch(`/plugins/signalk-container/api/runtime`),fetch(`/plugins/signalk-container/api/containers`)]),n=!1;if(e.ok){let t=await e.json();m(t),n=t!==null}else m(null);if(n)g(null);else try{let e=await fetch(`/plugins/signalk-container/api/doctor/deployment`);e.ok?g(await e.json()):g(null)}catch{g(null)}let r=[];if(t.ok?(r=await t.json(),v(r)):v([]),r.length>0){let e={},t={};await Promise.all(r.map(async n=>{let r=X(n.name);try{let n=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(r)}/resources`);if(n.ok){let i=await n.json();e[r]=i.effective||{},t[r]=i.override??null}}catch{}})),b(e),S(t)}try{let e=await fetch(`/plugins/signalk-container/api/updates`);if(e.ok){let t=await e.json();if(Array.isArray(t)){let e={},n={};for(let r of t)r&&r.containerName&&(n[r.containerName]=r,r.pluginId&&(e[r.containerName]=r.pluginId));T(e=>{let t={...n};for(let r of Object.keys(n)){let i=n[r],a=e[r];i.reason===`unknown`&&a&&a.reason&&a.reason!==`unknown`&&(t[r]=a)}return t}),O(e)}}}catch{}}catch{m(null),v([])}F(!1)},[]);D(()=>{W();let e=setInterval(W,5e3);return()=>clearInterval(e)},[W]);let G=e=>{let t=X(e);j(e=>{let n=new Set(e);return n.has(t)?n.delete(t):n.add(t),n})},K=async(e,t)=>{let n=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/resources`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}),r=await n.json().catch(()=>({}));return n.ok?(r.effective&&b(t=>({...t,[e]:r.effective})),S(t=>({...t,[e]:r.override??null})),f(t=>{let n={...t};return r.override&&Object.keys(r.override).length>0?n[e]=r.override:delete n[e],n}),{method:r.method,warnings:r.warnings,effective:r.effective}):{error:r.error||`${n.status} ${n.statusText}`}},Q=async e=>{let t=E[e];if(!t){R(`${e}: no update service registered. The consumer plugin hasn't migrated to signalk-container's update detection yet.`),z(!0);return}A(t=>{let n=new Set(t);return n.add(e),n}),R(`Checking ${e} for updates...`),z(!1);try{let n=await fetch(`/plugins/signalk-container/api/updates/${encodeURIComponent(t)}/check`,{method:`POST`});if(n.ok){let t=await n.json();T(n=>({...n,[e]:t})),R(oe(t)),z(!1)}else R(`Check failed: ${(await n.json().catch(()=>({error:n.statusText}))).error}`),z(!0)}catch(e){R(`Check error: ${e instanceof Error?e.message:String(e)}`),z(!0)}A(t=>{let n=new Set(t);return n.delete(e),n})},$=async e=>{let t=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/resources`,{method:`DELETE`}),n=await t.json().catch(()=>({}));return t.ok?(n.effective&&b(t=>({...t,[e]:n.effective})),S(t=>({...t,[e]:null})),f(t=>{let n={...t};return delete n[e],n}),{method:n.method,warnings:n.warnings,effective:n.effective}):{error:n.error||`${t.status} ${t.statusText}`}},de=()=>{let e={};for(let[t,n]of Object.entries(x))n&&Object.keys(n).length>0&&(e[t]=n);t({...n,runtime:r,pruneSchedule:a,maxConcurrentJobs:n.maxConcurrentJobs||2,updateCheckInterval:s,backgroundUpdateChecks:l,containerOverrides:e}),R(`Saved! Plugin will restart.`),z(!1)},fe=async e=>{R(`Starting ${e}...`),z(!1);try{let t=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/start`,{method:`POST`});t.ok?(R(`${e} started.`),W()):(R(`Failed: ${(await t.json().catch(()=>({error:t.statusText}))).error}`),z(!0))}catch(e){R(`Error: ${e instanceof Error?e.message:String(e)}`),z(!0)}},pe=async e=>{R(`Stopping ${e}...`),z(!1);try{let t=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/stop`,{method:`POST`});t.ok?(R(`${e} stopped.`),W()):(R(`Failed: ${(await t.json().catch(()=>({error:t.statusText}))).error}`),z(!0))}catch(e){R(`Error: ${e instanceof Error?e.message:String(e)}`),z(!0)}},me=async(e,t)=>{if(!(t===`running`&&!window.confirm(`${e} is running. Stop and remove it?`))){R(`Removing ${e}...`),z(!1);try{let t=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/remove`,{method:`POST`});t.ok?(R(`${e} removed.`),W()):(R(`Failed: ${(await t.json().catch(()=>({error:t.statusText}))).error}`),z(!0))}catch(e){R(`Error: ${e instanceof Error?e.message:String(e)}`),z(!0)}}},he=async()=>{R(`Pruning dangling images...`),z(!1),V(null);try{let e=await fetch(`/plugins/signalk-container/api/prune`,{method:`POST`});if(e.ok){let t=await e.json().catch(()=>({error:e.statusText}));V(t),R(`Pruned ${t.imagesRemoved} image(s), reclaimed ${t.spaceReclaimed}.`)}else R(`Prune failed: ${(await e.json().catch(()=>({error:e.statusText}))).error}`),z(!0)}catch(e){R(`Error: ${e instanceof Error?e.message:String(e)}`),z(!0)}};return U(`div`,{style:q.root,children:[H(`div`,{style:q.sectionTitle,children:`Runtime`}),P?H(`div`,{style:q.empty,children:`Detecting container runtime...`}):p?U(`div`,{style:q.runtimeCard,children:[H(`div`,{style:{...q.runtimeIcon,background:p.runtime===`podman`?`#892ca0`:`#2496ed`,color:`#fff`},children:p.runtime===`podman`?`P`:`D`}),U(`div`,{style:q.runtimeInfo,children:[U(`div`,{style:q.runtimeName,children:[p.runtime.charAt(0).toUpperCase()+p.runtime.slice(1),p.isPodmanDockerShim?` (via docker shim)`:``]}),U(`div`,{style:q.runtimeVersion,children:[`Version `,p.version]})]}),H(`div`,{style:{...q.stateIndicator,background:`#10b981`},title:`Runtime available`})]}):U(`div`,{style:q.runtimeCard,children:[H(`div`,{style:{...q.runtimeIcon,background:`#fef2f2`,color:`#ef4444`},children:`!`}),U(`div`,{style:q.runtimeInfo,children:[H(`div`,{style:q.runtimeName,children:ue(h)}),h&&h.remediation.length>0?H(`div`,{style:q.runtimeRemediation,children:h.remediation.join(`
6
- `)}):H(`div`,{style:q.runtimeVersion,children:`See GET /plugins/signalk-container/api/doctor/deployment for details.`})]})]}),H(`div`,{style:q.sectionTitle,children:`Settings`}),H(Y,{label:`Preferred runtime`,value:r,onChange:i,options:[{value:`auto`,label:`Auto-detect (Podman preferred)`},{value:`podman`,label:`Podman`},{value:`docker`,label:`Docker`}]}),H(Y,{label:`Auto-prune images`,value:a,onChange:o,options:[{value:`off`,label:`Off`},{value:`weekly`,label:`Weekly`},{value:`monthly`,label:`Monthly`}]}),H(Y,{label:`Update check interval`,value:s,onChange:c,options:[{value:`1h`,label:`Every hour`},{value:`6h`,label:`Every 6 hours`},{value:`12h`,label:`Every 12 hours`},{value:`24h`,label:`Daily (recommended)`},{value:`48h`,label:`Every 2 days`},{value:`168h`,label:`Weekly`}],hint:`How often to check for new container images`}),H(ie,{label:`Background update checks`,value:l,onChange:u,hint:`Disable on metered connections; manual check still works`}),H(`div`,{style:q.sectionTitle,children:`Managed Containers`}),_.length===0?H(`div`,{style:q.empty,children:P?`Loading...`:`No managed containers. Other plugins will create them.`}):_.map(e=>{let t=X(e.name),n=y[t]||{},r=x[t],i=r&&Object.keys(r).length>0,a=ee.has(t),o=t.startsWith(`job-`),s=Z.map(e=>ce(e.key,n[e.key])).filter(Boolean),c=w[t],l=se(c),u=!!E[t],d=k.has(t);return U(`div`,{style:q.containerCard,children:[U(`div`,{style:q.containerItemFlat,children:[H(`div`,{style:{...q.stateIndicator,background:re[e.state]||`#94a3b8`},title:J[e.state]||e.state}),U(`div`,{style:q.containerInfo,children:[H(`div`,{style:q.containerName,children:e.name}),U(`div`,{style:q.containerMeta,children:[e.image,` · `,J[e.state]||e.state,e.ports&&e.ports.length>0&&e.ports[0]?` · ${e.ports.join(`, `)}`:``]})]}),U(`div`,{style:q.containerActions,children:[e.state===`stopped`&&H(`button`,{style:{...q.btn,...q.btnPrimary,padding:`6px 12px`,fontSize:12},onClick:()=>fe(e.name),children:`Start`}),e.state===`running`&&H(`button`,{style:{...q.btn,...q.btnWarning},onClick:()=>pe(e.name),children:`Stop`}),H(`button`,{style:{...q.btn,background:`#fff`,color:`#374151`,border:`1px solid #d1d5db`},onClick:()=>N(e.name),title:`Stream the container's stdout+stderr log`,children:`Logs`}),H(`button`,{style:{...q.btn,...q.btnDanger},onClick:()=>me(e.name,e.state),children:`Remove`})]})]}),U(`div`,{style:q.limitsRow,children:[s.length===0?H(`span`,{style:{color:`#9ca3af`,fontStyle:`italic`},children:`No resource limits set`}):s.map((e,t)=>H(`span`,{style:q.limitBadge,children:e},t)),i&&H(`span`,{style:q.overrideBadge,title:`You have a user override configured for this container`,children:`Override active`}),e.state===`running`&&!o&&H(`button`,{type:`button`,style:q.editLimitsBtn,onClick:()=>G(e.name),children:a?`Collapse ▾`:`Edit Limits ▸`})]}),u&&e.state===`running`&&U(`div`,{style:q.updatesRow,children:[l?H(`span`,{style:{...q.limitBadge,background:l.bg,color:l.fg},title:l.title,children:l.label}):H(`span`,{style:{color:`#9ca3af`,fontStyle:`italic`},children:`No update check yet`}),c?.lastSuccessfulCheckAt&&U(`span`,{style:{fontSize:10,color:`#9ca3af`},title:`Last successful check: ${c.lastSuccessfulCheckAt}`,children:[`checked`,` `,ae(c.lastSuccessfulCheckAt)]}),H(`button`,{type:`button`,onClick:()=>Q(t),disabled:d,title:`Force a fresh update check now`,style:{...q.editLimitsBtn,marginLeft:`auto`,...d?q.btnDisabled:{}},children:d?`Checking...`:`Check now ↻`})]}),a&&H(le,{containerName:t,effective:n,initialOverride:r,onApply:e=>K(t,e),onResetToDefault:()=>$(t),onClose:()=>G(e.name)})]},e.name)}),H(`div`,{style:q.sectionTitle,children:`Maintenance`}),H(`button`,{style:{...q.btn,...q.btnSuccess},onClick:he,children:`Prune Dangling Images`}),L&&H(`div`,{style:{...q.status,color:te?`#ef4444`:`#10b981`},children:L}),H(`div`,{style:{...q.sectionTitle,marginTop:28},children:`\xA0`}),H(`button`,{style:{...q.btn,...q.btnSave},onClick:de,children:`Save Configuration`}),M&&H(ne,{name:M,onClose:()=>N(null)})]})}export{$ as default};
4
+ `],{type:`text/plain;charset=utf-8`}),r=URL.createObjectURL(t),i=document.createElement(`a`);i.href=r,i.download=`${e}-${new Date().toISOString().replace(/[:.]/g,`-`)}.log`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)},[n,e]);D(()=>{let e=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]),D(()=>{y.current=typeof document<`u`?document.activeElement:null;let e=setTimeout(()=>{v.current?.focus()},0);return()=>{clearTimeout(e);let t=y.current;if(t instanceof HTMLElement)try{t.focus()}catch{}}},[]);let E=C(e=>{if(e.key!==`Tab`)return;let t=_.current;if(!t)return;let n=Array.from(t.querySelectorAll(`button:not([disabled]), [tabindex]:not([tabindex="-1"])`)).filter(e=>e.offsetParent!==null);if(n.length===0)return;let r=n[0],i=n[n.length-1],a=document.activeElement;e.shiftKey?(a===r||!t.contains(a))&&(e.preventDefault(),i.focus()):a===i&&(e.preventDefault(),r.focus())},[]),O=C(e=>{e.target===e.currentTarget&&t()},[t]),ee=i===`streaming`?H.statusGreen:i===`disconnected`?H.statusRed:H.statusAmber,k=i===`connecting`?`Connecting…`:i===`backfill`?`Backfilled — opening live stream…`:i===`streaming`?`Live`:`Disconnected`;return R(`div`,{style:H.overlay,onClick:O,role:`dialog`,"aria-modal":`true`,"aria-label":`Logs for ${e}`,children:z(`div`,{style:H.modal,ref:_,onKeyDown:E,children:[z(`div`,{style:H.header,children:[R(`span`,{style:{...H.statusDot,...ee},title:k}),R(`span`,{style:H.title,children:e}),R(`span`,{style:H.metaLine,children:k}),z(`span`,{style:H.metaLine,children:[`· `,n.length,` lines`]}),R(`button`,{type:`button`,style:{...H.toolbarBtn,...c?H.toolbarBtnActive:{}},onClick:S,title:`Auto-scroll to bottom on new lines`,children:`Auto-scroll`}),R(`button`,{type:`button`,style:H.toolbarBtn,onClick:w,title:`Copy visible log to clipboard`,children:u?`Copied!`:`Copy`}),R(`button`,{type:`button`,style:H.toolbarBtn,onClick:T,title:`Download log as text file`,children:`Download`}),R(`button`,{type:`button`,style:H.closeBtn,onClick:t,ref:v,children:`Close`})]}),z(`pre`,{ref:f,style:H.body,onScroll:x,"aria-label":`Container log output`,tabIndex:0,children:[n.length===0?`(no log lines yet)`:n.join(`
5
+ `),R(`div`,{ref:p,"aria-hidden":`true`})]}),o&&z(`div`,{style:H.endBanner,children:[`Stream ended: `,o]})]})})}function U(e){return typeof e==`object`&&!!e}function ce(e){if(!U(e)||typeof e.status!=`string`||typeof e.isContainerized!=`boolean`||!Array.isArray(e.remediation)||!U(e.binary)||!U(e.daemon)||typeof e.daemon.reachable!=`boolean`||!U(e.selfId)||!U(e.env)||!U(e.cgroupControllers))return!1;let t=e.cgroupControllers;return!(!Array.isArray(t.missing)||t.available!==null&&!Array.isArray(t.available))}function W(e){switch(e){case`ok`:return`Runtime ready`;case`no-runtime`:return`No container runtime found`;case`socket-unreachable`:return`Runtime socket unreachable`;case`permission-denied`:return`Runtime socket: permission denied`;case`self-id-unresolved`:return`Signal K container ID unresolved`;case`cgroup-controllers-incomplete`:return`Host cgroup controllers not fully delegated`}}function G(e,t=`—`){return e==null||e===``?t:e}function K(e){return e==null?`unknown`:e?`yes`:`no`}function le(e){let t=[];if(t.push(`Deployment Doctor — ${W(e.status)}`),t.push(`status: ${e.status}`),t.push(``),t.push(`containerized: ${K(e.isContainerized)}`),t.push(`runtime: ${G(e.binary.name)} ${G(e.binary.version,``)}`.trimEnd()),t.push(`daemon reachable: ${K(e.daemon.reachable)}`),t.push(`rootless: ${K(e.daemon.rootless)}`),t.push(`socket: ${G(e.daemon.socketPath)}`),e.daemon.error&&t.push(`daemon error: ${e.daemon.error}`),e.isContainerized){let n=e.selfId.source?` (via ${e.selfId.source})`:``;t.push(`self container id: ${G(e.selfId.value)}${n}`)}let n=e.cgroupControllers;if(t.push(`cgroup controllers: ${G(n.available?.join(` `)??null)}`),n.missing.length>0&&t.push(`cgroup controllers MISSING: ${n.missing.join(` `)}`),n.kernelDisabledMemory&&t.push(`kernel cmdline disables the memory controller`),e.containerStorage){let n=e.containerStorage,r=n.idmapHazard?` (idmap hazard)`:``;t.push(`storage: ${G(n.fstype)} at ${G(n.storagePath)}${r}`)}let r=Object.entries(e.env).filter(([,e])=>e!=null);if(r.length>0){t.push(``),t.push(`env:`);for(let[e,n]of r)t.push(` ${e}=${n}`)}if(t.push(``),e.remediation.length>0){t.push(`Remediation:`);for(let n of e.remediation)t.push(n)}else t.push(`No action needed (status ok).`);if(e.containerStorage&&e.containerStorage.advice.length>0){t.push(``),t.push(`Storage advice:`);for(let n of e.containerStorage.advice)t.push(n)}return t.join(`
6
+ `)}var ue=`/plugins/signalk-container/api/doctor/deployment`,q={overlay:{position:`fixed`,inset:0,background:`rgba(0,0,0,0.5)`,display:`flex`,alignItems:`center`,justifyContent:`center`,zIndex:99999},modal:{background:`#fff`,borderRadius:8,boxShadow:`0 10px 25px rgba(0,0,0,0.2)`,width:`min(90vw, 760px)`,maxHeight:`85vh`,display:`flex`,flexDirection:`column`,overflow:`hidden`},header:{padding:`12px 16px`,borderBottom:`1px solid #e5e7eb`,display:`flex`,alignItems:`center`,gap:12},title:{fontSize:16,fontWeight:600,color:`#111`,flex:1},statusDot:{width:10,height:10,borderRadius:`50%`,flexShrink:0},statusGreen:{background:`#10b981`},statusAmber:{background:`#f59e0b`},statusRed:{background:`#ef4444`},toolbarBtn:{padding:`5px 10px`,fontSize:12,background:`#fff`,color:`#374151`,border:`1px solid #d1d5db`,borderRadius:4,cursor:`pointer`},body:{flex:1,overflow:`auto`,padding:`16px`,color:`#111`,fontSize:13},headline:{fontSize:15,fontWeight:600,marginBottom:12},row:{display:`flex`,gap:12,padding:`4px 0`,borderBottom:`1px solid #f3f4f6`},rowLabel:{width:150,flexShrink:0,color:`#6b7280`},rowValue:{color:`#111`,wordBreak:`break-word`},rowValueMissing:{color:`#b45309`,fontWeight:600},dim:{color:`#9ca3af`},sectionLabel:{fontSize:12,fontWeight:600,color:`#374151`,marginTop:16,marginBottom:6},pre:{background:`#1f2937`,color:`#e5e7eb`,fontFamily:`"SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace`,fontSize:12,lineHeight:1.5,padding:`12px`,margin:0,borderRadius:6,whiteSpace:`pre-wrap`,wordBreak:`break-word`},toggle:{marginTop:16,fontSize:12,background:`none`,border:`none`,color:`#3b82f6`,cursor:`pointer`,padding:0},message:{color:`#6b7280`,padding:`8px 0`},error:{color:`#ef4444`,padding:`8px 0`}};function de(e){return e===`ok`?q.statusGreen:e===`self-id-unresolved`||e===`cgroup-controllers-incomplete`?q.statusAmber:q.statusRed}function J({label:e,value:t,missing:n}){return z(`div`,{style:q.row,children:[R(`span`,{style:q.rowLabel,children:e}),R(`span`,{style:{...q.rowValue,...n?q.rowValueMissing:{}},children:t})]})}function Y(e){return e==null||e===``?R(`span`,{style:q.dim,children:`—`}):e}function fe({onClose:e}){let[t,n]=M(null),[r,i]=M(!0),[a,o]=M(null),[s,c]=M(!1),[l,u]=M(!1),d=j(null),f=j(null),p=j(null);D(()=>{let e=!1;return(async()=>{try{let t=await fetch(ue);if(e)return;if(!t.ok){o(t.status===401||t.status===403?`HTTP ${t.status} — not authorized. Are you logged in to the admin UI?`:`HTTP ${t.status} fetching the deployment doctor.`),i(!1);return}let r=await t.json();if(e)return;if(!ce(r)){o(`Unexpected response shape from the deployment doctor.`),i(!1);return}n(r),i(!1)}catch(t){if(e)return;o(t instanceof Error?t.message:`Failed to reach the server.`),i(!1)}})(),()=>{e=!0}},[]),D(()=>{let t=t=>{t.key===`Escape`&&e()};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[e]),D(()=>{p.current=typeof document<`u`?document.activeElement:null;let e=setTimeout(()=>f.current?.focus(),0);return()=>{clearTimeout(e);let t=p.current;if(t instanceof HTMLElement)try{t.focus()}catch{}}},[]);let m=C(e=>{if(e.key!==`Tab`)return;let t=d.current;if(!t)return;let n=Array.from(t.querySelectorAll(`button:not([disabled]), [tabindex]:not([tabindex="-1"])`)).filter(e=>e.offsetParent!==null);if(n.length===0)return;let r=n[0],i=n[n.length-1],a=document.activeElement;e.shiftKey?(a===r||!t.contains(a))&&(e.preventDefault(),i.focus()):a===i&&(e.preventDefault(),r.focus())},[]),h=C(t=>{t.target===t.currentTarget&&e()},[e]),g=C(async()=>{t&&await P(le(t))&&u(!0)},[t]);D(()=>{if(!l)return;let e=setTimeout(()=>u(!1),1500);return()=>clearTimeout(e)},[l]);let _=t?.cgroupControllers;return R(`div`,{style:q.overlay,onClick:h,role:`dialog`,"aria-modal":`true`,"aria-label":`Deployment Doctor`,children:z(`div`,{style:q.modal,ref:d,onKeyDown:m,children:[z(`div`,{style:q.header,children:[t&&R(`span`,{style:{...q.statusDot,...de(t.status)}}),R(`span`,{style:q.title,children:`Deployment Doctor`}),t&&R(`button`,{type:`button`,style:q.toolbarBtn,onClick:g,title:`Copy the full report to the clipboard`,children:l?`Copied!`:`Copy`}),R(`button`,{type:`button`,ref:f,style:q.toolbarBtn,onClick:e,children:`Close`})]}),z(`div`,{style:q.body,children:[r&&R(`div`,{style:q.message,children:`Running diagnostics…`}),a&&R(`div`,{style:q.error,children:a}),t&&z(L,{children:[R(`div`,{style:q.headline,children:W(t.status)}),R(J,{label:`Containerized`,value:t.isContainerized?`yes`:`no`}),R(J,{label:`Runtime`,value:t.binary.name?`${t.binary.name} ${t.binary.version??``}`.trim():Y(null)}),R(J,{label:`Daemon reachable`,value:t.daemon.reachable?`yes`:`no`}),R(J,{label:`Rootless`,value:t.daemon.rootless==null?`unknown`:t.daemon.rootless?`yes`:`no`}),R(J,{label:`Socket`,value:Y(t.daemon.socketPath)}),t.daemon.error&&R(J,{label:`Daemon error`,value:t.daemon.error,missing:!0}),t.isContainerized&&R(J,{label:`Self container ID`,value:t.selfId.value?`${t.selfId.value}${t.selfId.source?` (via ${t.selfId.source})`:``}`:Y(null),missing:!t.selfId.value}),R(J,{label:`cgroup controllers`,value:Y(_?.available?.join(` `)??null)}),_&&_.missing.length>0&&R(J,{label:`cgroup MISSING`,value:_.missing.join(` `),missing:!0}),_?.kernelDisabledMemory&&R(J,{label:`Kernel cmdline`,value:`disables the memory controller`,missing:!0}),t.containerStorage&&R(J,{label:`Storage`,value:`${t.containerStorage.fstype??`?`} at ${t.containerStorage.storagePath??`?`}${t.containerStorage.idmapHazard?` (idmap hazard)`:``}`,missing:t.containerStorage.idmapHazard}),R(`div`,{style:q.sectionLabel,children:`Remediation`}),t.remediation.length>0?R(`pre`,{style:q.pre,children:t.remediation.join(`
7
+ `)}):R(`div`,{style:q.message,children:`No action needed (status ok).`}),t.containerStorage&&t.containerStorage.advice.length>0&&z(L,{children:[R(`div`,{style:q.sectionLabel,children:`Storage advice`}),R(`pre`,{style:q.pre,children:t.containerStorage.advice.join(`
8
+ `)})]}),R(`button`,{type:`button`,style:q.toggle,onClick:()=>c(e=>!e),children:s?`▾ Hide raw JSON`:`▸ Show raw JSON`}),s&&R(`pre`,{style:{...q.pre,marginTop:8},children:JSON.stringify(t,null,2)})]})]})]})})}var X={root:{fontFamily:`-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`,color:`#333`,padding:`16px 0`},sectionTitle:{fontSize:13,fontWeight:600,color:`#888`,textTransform:`uppercase`,letterSpacing:`0.05em`,marginBottom:10,marginTop:24},btn:{display:`inline-flex`,alignItems:`center`,gap:8,padding:`8px 16px`,border:`none`,borderRadius:6,fontSize:13,fontWeight:600,cursor:`pointer`},btnPrimary:{background:`#3b82f6`,color:`#fff`},btnDanger:{background:`#ef4444`,color:`#fff`,padding:`6px 12px`,fontSize:12},btnWarning:{background:`#f59e0b`,color:`#fff`,padding:`6px 12px`,fontSize:12},btnSave:{background:`#3b82f6`,color:`#fff`},btnSuccess:{background:`#10b981`,color:`#fff`},btnSecondary:{background:`#fff`,color:`#374151`,border:`1px solid #d1d5db`},btnDisabled:{opacity:.5,cursor:`not-allowed`},status:{marginTop:8,fontSize:12,minHeight:18},runtimeCard:{display:`flex`,alignItems:`center`,gap:14,padding:`14px 18px`,background:`#f8f9fa`,border:`1px solid #e0e0e0`,borderRadius:10,marginBottom:12},runtimeIcon:{width:44,height:44,borderRadius:10,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:22,flexShrink:0},runtimeInfo:{flex:1},runtimeName:{fontSize:15,fontWeight:600,color:`#333`},runtimeVersion:{fontSize:12,color:`#888`},runtimeRemediation:{fontSize:12,color:`#666`,fontFamily:`ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace`,whiteSpace:`pre-wrap`,marginTop:6,lineHeight:1.45},containerItem:{display:`flex`,alignItems:`center`,gap:12,padding:`10px 14px`,background:`#f8f9fa`,border:`1px solid #e0e0e0`,borderRadius:10,marginBottom:8},stateIndicator:{width:10,height:10,borderRadius:`50%`,flexShrink:0},containerInfo:{flex:1,minWidth:0},containerName:{fontSize:14,fontWeight:600,color:`#333`},containerMeta:{fontSize:11,color:`#888`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},containerActions:{display:`flex`,gap:6,flexShrink:0},containerCard:{background:`#f8f9fa`,border:`1px solid #e0e0e0`,borderRadius:10,marginBottom:8,overflow:`hidden`},containerItemFlat:{display:`flex`,alignItems:`center`,gap:12,padding:`10px 14px`},limitsRow:{display:`flex`,alignItems:`center`,gap:10,padding:`6px 14px 10px 34px`,fontSize:11,color:`#666`,flexWrap:`wrap`},updatesRow:{display:`flex`,alignItems:`center`,gap:10,padding:`0 14px 10px 34px`,fontSize:11,color:`#666`,flexWrap:`wrap`},limitBadge:{display:`inline-flex`,alignItems:`center`,padding:`2px 8px`,borderRadius:12,background:`#e5e7eb`,color:`#374151`,fontSize:11,fontWeight:500},overrideBadge:{display:`inline-flex`,alignItems:`center`,padding:`2px 8px`,borderRadius:12,background:`#fef3c7`,color:`#92400e`,fontSize:10,fontWeight:600},editLimitsBtn:{marginLeft:`auto`,padding:`3px 10px`,fontSize:11,background:`#fff`,color:`#3b82f6`,border:`1px solid #3b82f6`,borderRadius:6,cursor:`pointer`,fontWeight:500},limitsEditor:{borderTop:`1px solid #e0e0e0`,padding:`14px 14px 14px 34px`,background:`#fff`},limitsEditorGrid:{display:`grid`,gridTemplateColumns:`160px 1fr auto`,gap:`8px 12px`,alignItems:`center`,marginBottom:10},limitsEditorLabel:{fontSize:12,fontWeight:500,color:`#555`},limitsEditorInput:{padding:`5px 8px`,borderRadius:5,border:`1px solid #ccc`,fontSize:12,background:`#fff`,color:`#333`,fontFamily:`inherit`,width:`100%`,boxSizing:`border-box`},limitsEditorInputDisabled:{background:`#f3f4f6`,color:`#9ca3af`,fontStyle:`italic`},limitsEditorUnsetBtn:{width:24,height:24,borderRadius:4,border:`1px solid #d1d5db`,background:`#fff`,color:`#6b7280`,fontSize:14,lineHeight:1,cursor:`pointer`,display:`inline-flex`,alignItems:`center`,justifyContent:`center`},limitsEditorUnsetBtnActive:{background:`#fee2e2`,color:`#991b1b`,border:`1px solid #fca5a5`},limitsEditorAdvancedToggle:{fontSize:11,color:`#3b82f6`,cursor:`pointer`,userSelect:`none`,marginTop:6,marginBottom:10,display:`inline-block`},limitsEditorActions:{display:`flex`,gap:8,justifyContent:`flex-end`,marginTop:10},limitsEditorResult:{marginTop:10,padding:`8px 10px`,borderRadius:6,fontSize:11,lineHeight:1.5},limitsEditorResultLive:{background:`#d1fae5`,color:`#065f46`},limitsEditorResultRecreated:{background:`#fef3c7`,color:`#92400e`},limitsEditorResultError:{background:`#fee2e2`,color:`#991b1b`},limitsEditorWarning:{marginTop:4,fontSize:10,opacity:.85,fontStyle:`italic`},empty:{textAlign:`center`,padding:`30px 16px`,color:`#999`,fontSize:13},fieldRow:{display:`flex`,alignItems:`center`,gap:12,marginBottom:10},label:{fontSize:13,fontWeight:500,color:`#555`,width:160,flexShrink:0},select:{padding:`6px 10px`,borderRadius:6,border:`1px solid #ccc`,fontSize:13,background:`#fff`,color:`#333`},hint:{fontSize:11,color:`#aaa`,marginLeft:8},pruneResult:{fontSize:12,color:`#10b981`,marginTop:6}},pe={running:`#10b981`,stopped:`#f59e0b`,missing:`#94a3b8`,"no-runtime":`#ef4444`},me={running:`Running`,stopped:`Stopped`,missing:`Not created`,"no-runtime":`No runtime`};function Z({label:e,value:t,options:n,onChange:r,hint:i}){return z(`div`,{style:X.fieldRow,children:[R(`span`,{style:X.label,children:e}),R(`select`,{style:X.select,value:t,onChange:e=>r(e.target.value),children:n.map(e=>R(`option`,{value:e.value,children:e.label},e.value))}),i&&R(`span`,{style:X.hint,children:i})]})}function he({label:e,value:t,onChange:n,hint:r}){return z(`div`,{style:X.fieldRow,children:[R(`span`,{style:X.label,children:e}),z(`label`,{style:{display:`inline-flex`,alignItems:`center`,cursor:`pointer`,gap:8},children:[R(`input`,{type:`checkbox`,checked:t,onChange:e=>n(e.target.checked),style:{width:16,height:16,cursor:`pointer`}}),R(`span`,{style:{fontSize:13,color:`#555`},children:t?`Enabled`:`Disabled`})]}),r&&R(`span`,{style:X.hint,children:r})]})}function Q(e){return e&&e.startsWith(`sk-`)?e.slice(3):e}var $=[{key:`cpus`,label:`CPU (cores)`,type:`number`,step:`0.1`,min:`0.1`,placeholder:`e.g. 1.5`,primary:!0},{key:`memory`,label:`Memory`,type:`text`,placeholder:`e.g. 512m, 2g`,primary:!0},{key:`memorySwap`,label:`Memory + swap`,type:`text`,placeholder:`= memory to disable swap`,primary:!0},{key:`pidsLimit`,label:`Max processes`,type:`number`,step:`1`,min:`1`,placeholder:`e.g. 200`,primary:!0},{key:`cpuShares`,label:`CPU shares (weight)`,type:`number`,step:`1`,min:`2`,placeholder:`default 1024`,primary:!1},{key:`cpusetCpus`,label:`Pin to CPUs`,type:`text`,placeholder:`e.g. "0,1" or "1-3"`,primary:!1},{key:`memoryReservation`,label:`Memory reservation`,type:`text`,placeholder:`soft floor, e.g. 256m`,primary:!1},{key:`oomScoreAdj`,label:`OOM score adjust`,type:`number`,step:`1`,min:`-1000`,max:`1000`,placeholder:`-1000 to 1000`,primary:!1}];function ge(e){try{let t=new Date(e).getTime();if(!Number.isFinite(t))return e;let n=Math.max(0,Math.floor((Date.now()-t)/1e3));if(n<5)return`just now`;if(n<60)return`${n}s ago`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let i=Math.floor(r/60);return i<24?`${i}h ago`:`${Math.floor(i/24)}d ago`}catch{return e}}function _e(e){if(!e)return`No update data`;let{runningTag:t,currentVersion:n,latestVersion:r,updateAvailable:i,reason:a,fromCache:o}=e;return a===`offline`?o?`\u{1F4E1} Offline — last cached result shows ${i?`update available`:`up to date`}`:`📡 Offline — no cached result yet`:a===`newer-version`?`\u2191 Update available: ${n} \u2192 ${r}`:a===`digest-drift`?`\u21BB Rebuild available for :${t}${r?` (latest stable: ${r})`:``}`:a===`up-to-date`?`\u2705 Up to date${n?` (`+n+`)`:``}`:a===`older-than-pinned`?`\u2139 Pinned to ${n}, latest stable is ${r}`:a===`error`?`\u26A0 Check error: ${e.error||`unknown`}`:`State: ${a||`unknown`}`}function ve(e){if(!e||!e.reason)return null;let{reason:t,runningTag:n,currentVersion:r,latestVersion:i,fromCache:a}=e;return t===`newer-version`?{label:`\u2191 ${i||`update`} available`,bg:`#fef3c7`,fg:`#92400e`,title:`Update available: ${r} \u2192 ${i}`}:t===`digest-drift`?{label:`↻ rebuild available`,bg:`#fef3c7`,fg:`#92400e`,title:`Image rebuild available for :${n}${i?` (latest stable ${i})`:``}`}:t===`offline`?{label:a?`📡 offline (cached)`:`📡 offline`,bg:`#e5e7eb`,fg:`#4b5563`,title:a?`Network unreachable; showing last cached check result`:`Network unreachable; no cached result yet`}:t===`error`?{label:`⚠ check error`,bg:`#fee2e2`,fg:`#991b1b`,title:e.error||`Update check error`}:t===`up-to-date`?{label:`✅ up to date`,bg:`#dcfce7`,fg:`#166534`,title:`Up to date${r?` (`+r+`)`:``}`}:null}function ye(e){let t={};for(let n of $){let r=n.key,i=e[n.key];if(i===null){t[r]=null;continue}if(!(i===void 0||i===``))if(n.type===`number`){let e=Number(i);if(!Number.isFinite(e))continue;t[r]=e}else t[r]=i}return t}function be(e,t){if(t==null||t===``)return null;switch(e){case`cpus`:return`${t} CPU`;case`memory`:return`${t}`;case`memorySwap`:return`swap: ${t}`;case`memoryReservation`:return`reserve: ${t}`;case`pidsLimit`:return`${t} PIDs`;case`cpuShares`:return`shares: ${t}`;case`cpusetCpus`:return`cpus: ${t}`;case`oomScoreAdj`:return`oom: ${t}`;default:return`${e}: ${t}`}}function xe({containerName:e,effective:n,initialOverride:r,onApply:i,onResetToDefault:a,onClose:o}){let s=e=>{let t=e??n,r={};for(let e of $){let n=e.key,i=t?t[n]:void 0;i==null?r[e.key]=``:r[e.key]=String(i)}return r},[c,l]=M(()=>s(n)),[u,d]=M(()=>r?$.some(e=>!e.primary&&r[e.key]!==void 0):!1),[f,p]=M(!1),[m,h]=M(!1),[g,_]=M(null),v=(e,t)=>{l(n=>({...n,[e]:t}))},y=e=>{l(t=>({...t,[e]:t[e]===null?``:null}))},b=()=>{l(s(n)),_(null)},x=async()=>{p(!0),_(null);try{let e=await i(ye(c));_(e),e&&e.effective&&l(s(e.effective))}catch(e){_({error:e instanceof Error?e.message:String(e)})}p(!1)},S=async()=>{if(window.confirm(`Reset ${e} to the plugin's default resource limits? This will remove your override and may cause a brief container recreate (~5s of downtime) if memory limits need to be unset.`)){h(!0),_(null);try{let e=await a();_(e),e&&e.effective&&l(s(e.effective))}catch(e){_({error:e instanceof Error?e.message:String(e)})}h(!1)}},C=n=>{let r=c[n.key],i=r===null;return z(t.Fragment,{children:[R(`label`,{style:X.limitsEditorLabel,htmlFor:`lim-${e}-${n.key}`,children:n.label}),R(`input`,{id:`lim-${e}-${n.key}`,type:i?`text`:n.type,value:i?``:r,step:n.step,min:n.min,max:n.max,placeholder:i?`(unset — remove limit)`:n.placeholder,disabled:i,onChange:e=>v(n.key,e.target.value),style:{...X.limitsEditorInput,...i?X.limitsEditorInputDisabled:{}}}),R(`button`,{type:`button`,onClick:()=>y(n.key),title:i?`Click to set a value again`:`Click to explicitly unset (remove this limit)`,style:{...X.limitsEditorUnsetBtn,...i?X.limitsEditorUnsetBtnActive:{}},children:i?`↺`:`×`})]},n.key)},w=$.filter(e=>e.primary),T=$.filter(e=>!e.primary);return z(`div`,{style:X.limitsEditor,children:[R(`div`,{style:X.limitsEditorGrid,children:w.map(C)}),z(`span`,{onClick:()=>d(!u),style:X.limitsEditorAdvancedToggle,children:[u?`▾`:`▸`,` Advanced (`,T.length,` more fields)`]}),u&&R(`div`,{style:X.limitsEditorGrid,children:T.map(C)}),z(`div`,{style:X.limitsEditorActions,children:[R(`button`,{type:`button`,onClick:o,disabled:f||m,style:{...X.btn,padding:`6px 12px`,fontSize:12,background:`#fff`,color:`#6b7280`,border:`1px solid #d1d5db`,...f||m?X.btnDisabled:{}},children:`Close`}),R(`button`,{type:`button`,onClick:S,disabled:f||m,title:`Clear override and restore plugin-default limits`,style:{...X.btn,padding:`6px 12px`,fontSize:12,background:`#fff`,color:`#d97706`,border:`1px solid #f59e0b`,...f||m?X.btnDisabled:{}},children:m?`Resetting...`:`Reset to default`}),R(`button`,{type:`button`,onClick:b,disabled:f||m,title:`Discard unsaved changes in this form (does not touch the server)`,style:{...X.btn,padding:`6px 12px`,fontSize:12,background:`#fff`,color:`#6b7280`,border:`1px solid #d1d5db`,...f||m?X.btnDisabled:{}},children:`Revert`}),R(`button`,{type:`button`,onClick:x,disabled:f||m,style:{...X.btn,...X.btnPrimary,padding:`6px 14px`,fontSize:12,...f||m?X.btnDisabled:{}},children:f?`Applying...`:`Apply`})]}),g&&R(`div`,{style:{...X.limitsEditorResult,...g.error?X.limitsEditorResultError:g.method===`recreated`?X.limitsEditorResultRecreated:X.limitsEditorResultLive},children:g.error?z(L,{children:[R(`strong`,{children:`Error:`}),` `,g.error]}):z(L,{children:[R(`strong`,{children:g.method===`live`?`Applied live (no restart)`:`Container recreated`}),g.warnings&&g.warnings.length>0&&R(`div`,{style:X.limitsEditorWarning,children:g.warnings.map((e,t)=>z(`div`,{children:[`⚠ `,e]},t))})]})})]})}function Se(e){return e?W(e.status):`No container runtime found`}function Ce({configuration:e,save:t}){let n=e||{},[r,i]=M(n.runtime||`auto`),[a,o]=M(n.pruneSchedule||`weekly`),[s,c]=M(n.updateCheckInterval||`24h`),[l,u]=M(n.backgroundUpdateChecks!==!1),[d,f]=M(n.containerOverrides||{}),[p,m]=M(null),[h,g]=M(null),[_,v]=M([]),[y,b]=M({}),[x,S]=M({}),[w,T]=M({}),[E,O]=M({}),[ee,k]=M(new Set),[te,ne]=M(new Set),[re,A]=M(null),[ie,j]=M(!1),[ae,oe]=M(!0),[N,P]=M(``),[F,I]=M(!1),[L,B]=M(null),V=C(async()=>{try{let[e,t]=await Promise.all([fetch(`/plugins/signalk-container/api/runtime`),fetch(`/plugins/signalk-container/api/containers`)]),n=!1;if(e.ok){let t=await e.json();m(t),n=t!==null}else m(null);if(n)g(null);else try{let e=await fetch(`/plugins/signalk-container/api/doctor/deployment`);e.ok?g(await e.json()):g(null)}catch{g(null)}let r=[];if(t.ok?(r=await t.json(),v(r)):v([]),r.length>0){let e={},t={};await Promise.all(r.map(async n=>{let r=Q(n.name);try{let n=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(r)}/resources`);if(n.ok){let i=await n.json();e[r]=i.effective||{},t[r]=i.override??null}}catch{}})),b(e),S(t)}try{let e=await fetch(`/plugins/signalk-container/api/updates`);if(e.ok){let t=await e.json();if(Array.isArray(t)){let e={},n={};for(let r of t)r&&r.containerName&&(n[r.containerName]=r,r.pluginId&&(e[r.containerName]=r.pluginId));T(e=>{let t={...n};for(let r of Object.keys(n)){let i=n[r],a=e[r];i.reason===`unknown`&&a&&a.reason&&a.reason!==`unknown`&&(t[r]=a)}return t}),O(e)}}}catch{}}catch{m(null),v([])}oe(!1)},[]);D(()=>{V();let e=setInterval(V,5e3);return()=>clearInterval(e)},[V]);let H=e=>{let t=Q(e);ne(e=>{let n=new Set(e);return n.has(t)?n.delete(t):n.add(t),n})},U=async(e,t)=>{let n=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/resources`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}),r=await n.json().catch(()=>({}));return n.ok?(r.effective&&b(t=>({...t,[e]:r.effective})),S(t=>({...t,[e]:r.override??null})),f(t=>{let n={...t};return r.override&&Object.keys(r.override).length>0?n[e]=r.override:delete n[e],n}),{method:r.method,warnings:r.warnings,effective:r.effective}):{error:r.error||`${n.status} ${n.statusText}`}},ce=async e=>{let t=E[e];if(!t){P(`${e}: no update service registered. The consumer plugin hasn't migrated to signalk-container's update detection yet.`),I(!0);return}k(t=>{let n=new Set(t);return n.add(e),n}),P(`Checking ${e} for updates...`),I(!1);try{let n=await fetch(`/plugins/signalk-container/api/updates/${encodeURIComponent(t)}/check`,{method:`POST`});if(n.ok){let t=await n.json();T(n=>({...n,[e]:t})),P(_e(t)),I(!1)}else P(`Check failed: ${(await n.json().catch(()=>({error:n.statusText}))).error}`),I(!0)}catch(e){P(`Check error: ${e instanceof Error?e.message:String(e)}`),I(!0)}k(t=>{let n=new Set(t);return n.delete(e),n})},W=async e=>{let t=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/resources`,{method:`DELETE`}),n=await t.json().catch(()=>({}));return t.ok?(n.effective&&b(t=>({...t,[e]:n.effective})),S(t=>({...t,[e]:null})),f(t=>{let n={...t};return delete n[e],n}),{method:n.method,warnings:n.warnings,effective:n.effective}):{error:n.error||`${t.status} ${t.statusText}`}},G=()=>{let e={};for(let[t,n]of Object.entries(x))n&&Object.keys(n).length>0&&(e[t]=n);t({...n,runtime:r,pruneSchedule:a,maxConcurrentJobs:n.maxConcurrentJobs||2,updateCheckInterval:s,backgroundUpdateChecks:l,containerOverrides:e}),P(`Saved! Plugin will restart.`),I(!1)},K=async e=>{P(`Starting ${e}...`),I(!1);try{let t=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/start`,{method:`POST`});t.ok?(P(`${e} started.`),V()):(P(`Failed: ${(await t.json().catch(()=>({error:t.statusText}))).error}`),I(!0))}catch(e){P(`Error: ${e instanceof Error?e.message:String(e)}`),I(!0)}},le=async e=>{P(`Stopping ${e}...`),I(!1);try{let t=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/stop`,{method:`POST`});t.ok?(P(`${e} stopped.`),V()):(P(`Failed: ${(await t.json().catch(()=>({error:t.statusText}))).error}`),I(!0))}catch(e){P(`Error: ${e instanceof Error?e.message:String(e)}`),I(!0)}},ue=async(e,t)=>{if(!(t===`running`&&!window.confirm(`${e} is running. Stop and remove it?`))){P(`Removing ${e}...`),I(!1);try{let t=await fetch(`/plugins/signalk-container/api/containers/${encodeURIComponent(e)}/remove`,{method:`POST`});t.ok?(P(`${e} removed.`),V()):(P(`Failed: ${(await t.json().catch(()=>({error:t.statusText}))).error}`),I(!0))}catch(e){P(`Error: ${e instanceof Error?e.message:String(e)}`),I(!0)}}},q=async()=>{P(`Pruning dangling images...`),I(!1),B(null);try{let e=await fetch(`/plugins/signalk-container/api/prune`,{method:`POST`});if(e.ok){let t=await e.json().catch(()=>({error:e.statusText}));B(t),P(`Pruned ${t.imagesRemoved} image(s), reclaimed ${t.spaceReclaimed}.`)}else P(`Prune failed: ${(await e.json().catch(()=>({error:e.statusText}))).error}`),I(!0)}catch(e){P(`Error: ${e instanceof Error?e.message:String(e)}`),I(!0)}};return z(`div`,{style:X.root,children:[R(`div`,{style:X.sectionTitle,children:`Runtime`}),ae?R(`div`,{style:X.empty,children:`Detecting container runtime...`}):p?z(`div`,{style:X.runtimeCard,children:[R(`div`,{style:{...X.runtimeIcon,background:p.runtime===`podman`?`#892ca0`:`#2496ed`,color:`#fff`},children:p.runtime===`podman`?`P`:`D`}),z(`div`,{style:X.runtimeInfo,children:[z(`div`,{style:X.runtimeName,children:[p.runtime.charAt(0).toUpperCase()+p.runtime.slice(1),p.isPodmanDockerShim?` (via docker shim)`:``]}),z(`div`,{style:X.runtimeVersion,children:[`Version `,p.version]})]}),R(`div`,{style:{...X.stateIndicator,background:`#10b981`},title:`Runtime available`})]}):z(`div`,{style:X.runtimeCard,children:[R(`div`,{style:{...X.runtimeIcon,background:`#fef2f2`,color:`#ef4444`},children:`!`}),z(`div`,{style:X.runtimeInfo,children:[R(`div`,{style:X.runtimeName,children:Se(h)}),h&&h.remediation.length>0&&R(`div`,{style:X.runtimeRemediation,children:h.remediation.join(`
9
+ `)}),R(`button`,{style:{...X.btn,...X.btnSecondary,marginTop:8},onClick:()=>j(!0),children:`Run Doctor`})]})]}),R(`div`,{style:X.sectionTitle,children:`Settings`}),R(Z,{label:`Preferred runtime`,value:r,onChange:i,options:[{value:`auto`,label:`Auto-detect (Podman preferred)`},{value:`podman`,label:`Podman`},{value:`docker`,label:`Docker`}]}),R(Z,{label:`Auto-prune images`,value:a,onChange:o,options:[{value:`off`,label:`Off`},{value:`weekly`,label:`Weekly`},{value:`monthly`,label:`Monthly`}]}),R(Z,{label:`Update check interval`,value:s,onChange:c,options:[{value:`1h`,label:`Every hour`},{value:`6h`,label:`Every 6 hours`},{value:`12h`,label:`Every 12 hours`},{value:`24h`,label:`Daily (recommended)`},{value:`48h`,label:`Every 2 days`},{value:`168h`,label:`Weekly`}],hint:`How often to check for new container images`}),R(he,{label:`Background update checks`,value:l,onChange:u,hint:`Disable on metered connections; manual check still works`}),R(`div`,{style:X.sectionTitle,children:`Managed Containers`}),_.length===0?R(`div`,{style:X.empty,children:ae?`Loading...`:`No managed containers. Other plugins will create them.`}):_.map(e=>{let t=Q(e.name),n=y[t]||{},r=x[t],i=r&&Object.keys(r).length>0,a=te.has(t),o=t.startsWith(`job-`),s=$.map(e=>be(e.key,n[e.key])).filter(Boolean),c=w[t],l=ve(c),u=!!E[t],d=ee.has(t);return z(`div`,{style:X.containerCard,children:[z(`div`,{style:X.containerItemFlat,children:[R(`div`,{style:{...X.stateIndicator,background:pe[e.state]||`#94a3b8`},title:me[e.state]||e.state}),z(`div`,{style:X.containerInfo,children:[R(`div`,{style:X.containerName,children:e.name}),z(`div`,{style:X.containerMeta,children:[e.image,` · `,me[e.state]||e.state,e.ports&&e.ports.length>0&&e.ports[0]?` · ${e.ports.join(`, `)}`:``]})]}),z(`div`,{style:X.containerActions,children:[e.state===`stopped`&&R(`button`,{style:{...X.btn,...X.btnPrimary,padding:`6px 12px`,fontSize:12},onClick:()=>K(e.name),children:`Start`}),e.state===`running`&&R(`button`,{style:{...X.btn,...X.btnWarning},onClick:()=>le(e.name),children:`Stop`}),R(`button`,{style:{...X.btn,background:`#fff`,color:`#374151`,border:`1px solid #d1d5db`},onClick:()=>A(e.name),title:`Stream the container's stdout+stderr log`,children:`Logs`}),R(`button`,{style:{...X.btn,...X.btnDanger},onClick:()=>ue(e.name,e.state),children:`Remove`})]})]}),z(`div`,{style:X.limitsRow,children:[s.length===0?R(`span`,{style:{color:`#9ca3af`,fontStyle:`italic`},children:`No resource limits set`}):s.map((e,t)=>R(`span`,{style:X.limitBadge,children:e},t)),i&&R(`span`,{style:X.overrideBadge,title:`You have a user override configured for this container`,children:`Override active`}),e.state===`running`&&!o&&R(`button`,{type:`button`,style:X.editLimitsBtn,onClick:()=>H(e.name),children:a?`Collapse ▾`:`Edit Limits ▸`})]}),u&&e.state===`running`&&z(`div`,{style:X.updatesRow,children:[l?R(`span`,{style:{...X.limitBadge,background:l.bg,color:l.fg},title:l.title,children:l.label}):R(`span`,{style:{color:`#9ca3af`,fontStyle:`italic`},children:`No update check yet`}),c?.lastSuccessfulCheckAt&&z(`span`,{style:{fontSize:10,color:`#9ca3af`},title:`Last successful check: ${c.lastSuccessfulCheckAt}`,children:[`checked`,` `,ge(c.lastSuccessfulCheckAt)]}),R(`button`,{type:`button`,onClick:()=>ce(t),disabled:d,title:`Force a fresh update check now`,style:{...X.editLimitsBtn,marginLeft:`auto`,...d?X.btnDisabled:{}},children:d?`Checking...`:`Check now ↻`})]}),a&&R(xe,{containerName:t,effective:n,initialOverride:r,onApply:e=>U(t,e),onResetToDefault:()=>W(t),onClose:()=>H(e.name)})]},e.name)}),R(`div`,{style:X.sectionTitle,children:`Maintenance`}),z(`div`,{style:{display:`flex`,gap:8,flexWrap:`wrap`},children:[R(`button`,{style:{...X.btn,...X.btnSuccess},onClick:q,children:`Prune Dangling Images`}),R(`button`,{style:{...X.btn,...X.btnSecondary},onClick:()=>j(!0),children:`Doctor`})]}),N&&R(`div`,{style:{...X.status,color:F?`#ef4444`:`#10b981`},children:N}),R(`div`,{style:{...X.sectionTitle,marginTop:28},children:`\xA0`}),R(`button`,{style:{...X.btn,...X.btnSave},onClick:G,children:`Save Configuration`}),re&&R(se,{name:re,onClose:()=>A(null)}),ie&&R(fe,{onClose:()=>j(!1)})]})}export{Ce as default};