@pleri/olam-cli 0.1.145 → 0.1.147
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/skills-doctor.d.ts +14 -0
- package/dist/commands/skills-doctor.d.ts.map +1 -0
- package/dist/commands/skills-doctor.js +126 -0
- package/dist/commands/skills-doctor.js.map +1 -0
- package/dist/commands/skills-hook.d.ts +19 -0
- package/dist/commands/skills-hook.d.ts.map +1 -0
- package/dist/commands/skills-hook.js +99 -0
- package/dist/commands/skills-hook.js.map +1 -0
- package/dist/commands/skills-migrate-back.d.ts +21 -0
- package/dist/commands/skills-migrate-back.d.ts.map +1 -0
- package/dist/commands/skills-migrate-back.js +222 -0
- package/dist/commands/skills-migrate-back.js.map +1 -0
- package/dist/commands/skills-migrate-hooks-back.d.ts +19 -0
- package/dist/commands/skills-migrate-hooks-back.d.ts.map +1 -0
- package/dist/commands/skills-migrate-hooks-back.js +83 -0
- package/dist/commands/skills-migrate-hooks-back.js.map +1 -0
- package/dist/commands/skills-migrate-hooks.d.ts +40 -0
- package/dist/commands/skills-migrate-hooks.d.ts.map +1 -0
- package/dist/commands/skills-migrate-hooks.js +178 -0
- package/dist/commands/skills-migrate-hooks.js.map +1 -0
- package/dist/commands/skills-migrate.d.ts +33 -0
- package/dist/commands/skills-migrate.d.ts.map +1 -0
- package/dist/commands/skills-migrate.js +216 -0
- package/dist/commands/skills-migrate.js.map +1 -0
- package/dist/commands/skills-onboard.d.ts +26 -0
- package/dist/commands/skills-onboard.d.ts.map +1 -0
- package/dist/commands/skills-onboard.js +227 -0
- package/dist/commands/skills-onboard.js.map +1 -0
- package/dist/commands/skills-shadow-backups.d.ts +15 -0
- package/dist/commands/skills-shadow-backups.d.ts.map +1 -0
- package/dist/commands/skills-shadow-backups.js +132 -0
- package/dist/commands/skills-shadow-backups.js.map +1 -0
- package/dist/commands/skills-source.d.ts +25 -0
- package/dist/commands/skills-source.d.ts.map +1 -1
- package/dist/commands/skills-source.js +305 -7
- package/dist/commands/skills-source.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +62 -7
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/substrate-audit-log.d.ts +49 -0
- package/dist/commands/substrate-audit-log.d.ts.map +1 -0
- package/dist/commands/substrate-audit-log.js +148 -0
- package/dist/commands/substrate-audit-log.js.map +1 -0
- package/dist/commands/substrate.d.ts +60 -0
- package/dist/commands/substrate.d.ts.map +1 -0
- package/dist/commands/substrate.js +175 -0
- package/dist/commands/substrate.js.map +1 -0
- package/dist/commands/upgrade.d.ts +10 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +30 -0
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/image-digests.json +7 -7
- package/dist/index.js +8687 -4713
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +69 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +146 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/instrumentation.d.ts +85 -0
- package/dist/lib/instrumentation.d.ts.map +1 -0
- package/dist/lib/instrumentation.js +104 -0
- package/dist/lib/instrumentation.js.map +1 -0
- package/dist/lib/kubectl-wrap.d.ts +59 -0
- package/dist/lib/kubectl-wrap.d.ts.map +1 -0
- package/dist/lib/kubectl-wrap.js +130 -0
- package/dist/lib/kubectl-wrap.js.map +1 -0
- package/dist/lib/manifest-refresh.d.ts +95 -0
- package/dist/lib/manifest-refresh.d.ts.map +1 -0
- package/dist/lib/manifest-refresh.js +222 -0
- package/dist/lib/manifest-refresh.js.map +1 -0
- package/dist/lib/port-forward.d.ts +101 -0
- package/dist/lib/port-forward.d.ts.map +1 -0
- package/dist/lib/port-forward.js +240 -0
- package/dist/lib/port-forward.js.map +1 -0
- package/dist/lib/upgrade-kubernetes.d.ts +77 -0
- package/dist/lib/upgrade-kubernetes.d.ts.map +1 -0
- package/dist/lib/upgrade-kubernetes.js +277 -0
- package/dist/lib/upgrade-kubernetes.js.map +1 -0
- package/dist/mcp-server.js +20262 -18211
- package/host-cp/k8s/manifests/00-namespace.yaml +7 -0
- package/host-cp/k8s/manifests/10-serviceaccount.yaml +8 -0
- package/host-cp/k8s/manifests/20-rbac.yaml +34 -0
- package/host-cp/k8s/manifests/30-configmap.yaml +30 -0
- package/host-cp/k8s/manifests/45-pvc.yaml +27 -0
- package/host-cp/k8s/manifests/50-deployment.yaml +148 -0
- package/host-cp/k8s/manifests/60-service.yaml +22 -0
- package/host-cp/k8s/templates/40-secret-template.yaml +32 -0
- package/host-cp/src/plan-chat-service.mjs +31 -7
- package/host-cp/src/server.mjs +32 -7
- package/package.json +3 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config.ts — `~/.olam/config.json` helper for olam-cli.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1b A1 of olam-host-suite-phase-1b-k3s-beta-flavour (plan
|
|
5
|
+
* ~/.claude/plans/olam-host-suite-phase-1b-k3s-beta-flavour.md).
|
|
6
|
+
*
|
|
7
|
+
* Schema v1 (Decision 1 — config is the substrate-state seam):
|
|
8
|
+
* {
|
|
9
|
+
* "config.schema": 1,
|
|
10
|
+
* "host": { "substrate": "compose" | "kubernetes" },
|
|
11
|
+
* "install_id": "<uuid-v4>"
|
|
12
|
+
* }
|
|
13
|
+
*
|
|
14
|
+
* - `install_id` is generated once on first config write; persists thereafter;
|
|
15
|
+
* never rotated. Used by instrumentation events (D21) to enable
|
|
16
|
+
* distinct-operator counting at month-6 retro.
|
|
17
|
+
* - Graceful fallback to `{config.schema: 1, host: {substrate: 'compose'}, install_id}`
|
|
18
|
+
* if file missing or invalid (T1 — never crash).
|
|
19
|
+
* - `~/.olam/state/` directory ensured to exist (recursive mkdir) before any
|
|
20
|
+
* state-file writes elsewhere in olam-cli (Phase A1 closes feasibility F3-03
|
|
21
|
+
* from pass-3 review).
|
|
22
|
+
*/
|
|
23
|
+
export declare const OLAM_HOME: string;
|
|
24
|
+
export declare const OLAM_STATE_DIR: string;
|
|
25
|
+
export declare const OLAM_CONFIG_PATH: string;
|
|
26
|
+
export type Substrate = 'compose' | 'kubernetes';
|
|
27
|
+
export type OlamConfig = {
|
|
28
|
+
'config.schema': 1;
|
|
29
|
+
host: {
|
|
30
|
+
substrate: Substrate;
|
|
31
|
+
};
|
|
32
|
+
install_id: string;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Read `~/.olam/config.json` (or `configPath` override). Returns a valid
|
|
36
|
+
* OlamConfig regardless of file state:
|
|
37
|
+
* - File missing → write default + return.
|
|
38
|
+
* - File present + valid → return parsed.
|
|
39
|
+
* - File present + malformed → emit WARN to stderr; write default + return.
|
|
40
|
+
*
|
|
41
|
+
* Always ensures `~/.olam/state/` exists as a side-effect.
|
|
42
|
+
*
|
|
43
|
+
* @param opts.configPath — override for tests (default: `~/.olam/config.json`)
|
|
44
|
+
* @param opts.stateDir — override for tests (default: `~/.olam/state`)
|
|
45
|
+
* @param opts.stderr — override for tests (default: `process.stderr`)
|
|
46
|
+
*/
|
|
47
|
+
export declare function readConfig(opts?: {
|
|
48
|
+
configPath?: string;
|
|
49
|
+
stateDir?: string;
|
|
50
|
+
stderr?: NodeJS.WritableStream;
|
|
51
|
+
}): OlamConfig;
|
|
52
|
+
/**
|
|
53
|
+
* Apply a partial update to the config and persist atomically.
|
|
54
|
+
*
|
|
55
|
+
* Preserves `install_id` (never rotated by writeConfig). Caller MUST NOT
|
|
56
|
+
* pass `install_id` in updates; if they do, the existing value wins.
|
|
57
|
+
*
|
|
58
|
+
* @param updates — partial config (only `host` is settable via this surface)
|
|
59
|
+
* @param opts — same as readConfig for test injection
|
|
60
|
+
* @returns the new OlamConfig that was persisted
|
|
61
|
+
*/
|
|
62
|
+
export declare function writeConfig(updates: {
|
|
63
|
+
host?: Partial<OlamConfig['host']>;
|
|
64
|
+
}, opts?: {
|
|
65
|
+
configPath?: string;
|
|
66
|
+
stateDir?: string;
|
|
67
|
+
stderr?: NodeJS.WritableStream;
|
|
68
|
+
}): OlamConfig;
|
|
69
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAcH,eAAO,MAAM,SAAS,QAA2B,CAAC;AAClD,eAAO,MAAM,cAAc,QAA2B,CAAC;AACvD,eAAO,MAAM,gBAAgB,QAAiC,CAAC;AAE/D,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG;IACvB,eAAe,EAAE,CAAC,CAAC;IACnB,IAAI,EAAE;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AA0DF;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CACxB,IAAI,GAAE;IACJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAC3B,GACL,UAAU,CAsCZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;CAAE,EAC/C,IAAI,GAAE;IACJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAC3B,GACL,UAAU,CAaZ"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config.ts — `~/.olam/config.json` helper for olam-cli.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1b A1 of olam-host-suite-phase-1b-k3s-beta-flavour (plan
|
|
5
|
+
* ~/.claude/plans/olam-host-suite-phase-1b-k3s-beta-flavour.md).
|
|
6
|
+
*
|
|
7
|
+
* Schema v1 (Decision 1 — config is the substrate-state seam):
|
|
8
|
+
* {
|
|
9
|
+
* "config.schema": 1,
|
|
10
|
+
* "host": { "substrate": "compose" | "kubernetes" },
|
|
11
|
+
* "install_id": "<uuid-v4>"
|
|
12
|
+
* }
|
|
13
|
+
*
|
|
14
|
+
* - `install_id` is generated once on first config write; persists thereafter;
|
|
15
|
+
* never rotated. Used by instrumentation events (D21) to enable
|
|
16
|
+
* distinct-operator counting at month-6 retro.
|
|
17
|
+
* - Graceful fallback to `{config.schema: 1, host: {substrate: 'compose'}, install_id}`
|
|
18
|
+
* if file missing or invalid (T1 — never crash).
|
|
19
|
+
* - `~/.olam/state/` directory ensured to exist (recursive mkdir) before any
|
|
20
|
+
* state-file writes elsewhere in olam-cli (Phase A1 closes feasibility F3-03
|
|
21
|
+
* from pass-3 review).
|
|
22
|
+
*/
|
|
23
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
24
|
+
import { homedir } from 'node:os';
|
|
25
|
+
import { join, dirname } from 'node:path';
|
|
26
|
+
import { randomUUID } from 'node:crypto';
|
|
27
|
+
export const OLAM_HOME = join(homedir(), '.olam');
|
|
28
|
+
export const OLAM_STATE_DIR = join(OLAM_HOME, 'state');
|
|
29
|
+
export const OLAM_CONFIG_PATH = join(OLAM_HOME, 'config.json');
|
|
30
|
+
const DEFAULT_SUBSTRATE = 'compose';
|
|
31
|
+
function makeDefaultConfig() {
|
|
32
|
+
return {
|
|
33
|
+
'config.schema': 1,
|
|
34
|
+
host: { substrate: DEFAULT_SUBSTRATE },
|
|
35
|
+
install_id: randomUUID(),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function ensureStateDir(stateDir = OLAM_STATE_DIR) {
|
|
39
|
+
if (!existsSync(stateDir)) {
|
|
40
|
+
mkdirSync(stateDir, { recursive: true });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function isValidConfig(value) {
|
|
44
|
+
if (typeof value !== 'object' || value === null)
|
|
45
|
+
return false;
|
|
46
|
+
const v = value;
|
|
47
|
+
if (v['config.schema'] !== 1)
|
|
48
|
+
return false;
|
|
49
|
+
if (typeof v.host !== 'object' || v.host === null)
|
|
50
|
+
return false;
|
|
51
|
+
const host = v.host;
|
|
52
|
+
if (host.substrate !== 'compose' && host.substrate !== 'kubernetes')
|
|
53
|
+
return false;
|
|
54
|
+
if (typeof v.install_id !== 'string' || v.install_id.length === 0)
|
|
55
|
+
return false;
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
function atomicWriteJSON(path, value, stderr = process.stderr) {
|
|
59
|
+
ensureStateDir();
|
|
60
|
+
const dir = dirname(path);
|
|
61
|
+
if (!existsSync(dir)) {
|
|
62
|
+
mkdirSync(dir, { recursive: true });
|
|
63
|
+
}
|
|
64
|
+
const tmp = `${path}.tmp.${process.pid}`;
|
|
65
|
+
try {
|
|
66
|
+
writeFileSync(tmp, JSON.stringify(value, null, 2) + '\n', { encoding: 'utf8' });
|
|
67
|
+
renameSync(tmp, path);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
if (existsSync(tmp)) {
|
|
71
|
+
try {
|
|
72
|
+
unlinkSync(tmp);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// best-effort cleanup; surface original error to caller
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
stderr.write(`[WARN] olam config write failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
79
|
+
throw err;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Read `~/.olam/config.json` (or `configPath` override). Returns a valid
|
|
84
|
+
* OlamConfig regardless of file state:
|
|
85
|
+
* - File missing → write default + return.
|
|
86
|
+
* - File present + valid → return parsed.
|
|
87
|
+
* - File present + malformed → emit WARN to stderr; write default + return.
|
|
88
|
+
*
|
|
89
|
+
* Always ensures `~/.olam/state/` exists as a side-effect.
|
|
90
|
+
*
|
|
91
|
+
* @param opts.configPath — override for tests (default: `~/.olam/config.json`)
|
|
92
|
+
* @param opts.stateDir — override for tests (default: `~/.olam/state`)
|
|
93
|
+
* @param opts.stderr — override for tests (default: `process.stderr`)
|
|
94
|
+
*/
|
|
95
|
+
export function readConfig(opts = {}) {
|
|
96
|
+
const configPath = opts.configPath ?? OLAM_CONFIG_PATH;
|
|
97
|
+
const stateDir = opts.stateDir ?? OLAM_STATE_DIR;
|
|
98
|
+
const stderr = opts.stderr ?? process.stderr;
|
|
99
|
+
ensureStateDir(stateDir);
|
|
100
|
+
if (!existsSync(configPath)) {
|
|
101
|
+
const fresh = makeDefaultConfig();
|
|
102
|
+
atomicWriteJSON(configPath, fresh, stderr);
|
|
103
|
+
return fresh;
|
|
104
|
+
}
|
|
105
|
+
let parsed;
|
|
106
|
+
try {
|
|
107
|
+
const raw = readFileSync(configPath, 'utf8');
|
|
108
|
+
parsed = JSON.parse(raw);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
stderr.write(`[WARN] olam config malformed at ${configPath}: ${err instanceof Error ? err.message : String(err)}; falling back to defaults\n`);
|
|
112
|
+
const fresh = makeDefaultConfig();
|
|
113
|
+
atomicWriteJSON(configPath, fresh, stderr);
|
|
114
|
+
return fresh;
|
|
115
|
+
}
|
|
116
|
+
if (!isValidConfig(parsed)) {
|
|
117
|
+
stderr.write(`[WARN] olam config schema invalid at ${configPath}; falling back to defaults\n`);
|
|
118
|
+
const fresh = makeDefaultConfig();
|
|
119
|
+
atomicWriteJSON(configPath, fresh, stderr);
|
|
120
|
+
return fresh;
|
|
121
|
+
}
|
|
122
|
+
return parsed;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Apply a partial update to the config and persist atomically.
|
|
126
|
+
*
|
|
127
|
+
* Preserves `install_id` (never rotated by writeConfig). Caller MUST NOT
|
|
128
|
+
* pass `install_id` in updates; if they do, the existing value wins.
|
|
129
|
+
*
|
|
130
|
+
* @param updates — partial config (only `host` is settable via this surface)
|
|
131
|
+
* @param opts — same as readConfig for test injection
|
|
132
|
+
* @returns the new OlamConfig that was persisted
|
|
133
|
+
*/
|
|
134
|
+
export function writeConfig(updates, opts = {}) {
|
|
135
|
+
const configPath = opts.configPath ?? OLAM_CONFIG_PATH;
|
|
136
|
+
const stderr = opts.stderr ?? process.stderr;
|
|
137
|
+
const current = readConfig(opts);
|
|
138
|
+
const next = {
|
|
139
|
+
'config.schema': 1,
|
|
140
|
+
host: { ...current.host, ...(updates.host ?? {}) },
|
|
141
|
+
install_id: current.install_id,
|
|
142
|
+
};
|
|
143
|
+
atomicWriteJSON(configPath, next, stderr);
|
|
144
|
+
return next;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* instrumentation.ts — stdout JSON event emitter for olam-cli.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1b A3 of olam-host-suite-phase-1b-k3s-beta-flavour (plan
|
|
5
|
+
* ~/.claude/plans/olam-host-suite-phase-1b-k3s-beta-flavour.md).
|
|
6
|
+
*
|
|
7
|
+
* Canonical event schema (Decision 21 — `olam.instr.v1`):
|
|
8
|
+
* {
|
|
9
|
+
* "schema": "olam.instr.v1",
|
|
10
|
+
* "event": "substrate.set" | "upgrade.complete",
|
|
11
|
+
* "install_id": "<uuid-v4-from-config>",
|
|
12
|
+
* "ts": "<ISO-8601-UTC>",
|
|
13
|
+
* <event-specific-fields>
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* Emission target: **stderr**, newline-delimited, each line prefixed with
|
|
17
|
+
* `OLAM_INSTR ` so consumers can grep-distinguish from other stderr output.
|
|
18
|
+
*
|
|
19
|
+
* Why stderr (and not stdout)? olam-cli's existing stdout-JSON contracts
|
|
20
|
+
* (e.g. `olam status --json`, `olam doctor --json`) reserve stdout for
|
|
21
|
+
* command output that consumers parse positionally. Mixing instrumentation
|
|
22
|
+
* into stdout breaks those contracts. stderr keeps the emitter
|
|
23
|
+
* grep-distinguishable AND segregated from the data-plane output.
|
|
24
|
+
*
|
|
25
|
+
* Consumers: month-6 aggregator script (`scripts/aggregate-substrate-events.mjs`,
|
|
26
|
+
* D20) groups events by `install_id` for Falsifiable signal thresholds 1+4.
|
|
27
|
+
*
|
|
28
|
+
* Defensive contract:
|
|
29
|
+
* - emit() MUST NOT throw if the config can't be read; falls back to a
|
|
30
|
+
* placeholder install_id ('unknown') + emits a one-line stderr WARN.
|
|
31
|
+
* - Schema is versioned (`olam.instr.v1`); v2 fields land additively.
|
|
32
|
+
* Consumers MUST tolerate unknown fields.
|
|
33
|
+
*/
|
|
34
|
+
export declare const INSTRUMENTATION_SCHEMA: "olam.instr.v1";
|
|
35
|
+
export declare const INSTRUMENTATION_PREFIX: "OLAM_INSTR ";
|
|
36
|
+
export type SubstrateSetEvent = {
|
|
37
|
+
schema: typeof INSTRUMENTATION_SCHEMA;
|
|
38
|
+
event: 'substrate.set';
|
|
39
|
+
install_id: string;
|
|
40
|
+
ts: string;
|
|
41
|
+
substrate: 'compose' | 'kubernetes';
|
|
42
|
+
flavor?: string;
|
|
43
|
+
};
|
|
44
|
+
export type UpgradeCompleteEvent = {
|
|
45
|
+
schema: typeof INSTRUMENTATION_SCHEMA;
|
|
46
|
+
event: 'upgrade.complete';
|
|
47
|
+
install_id: string;
|
|
48
|
+
ts: string;
|
|
49
|
+
substrate: 'compose' | 'kubernetes';
|
|
50
|
+
duration_ms: number;
|
|
51
|
+
flavor?: string;
|
|
52
|
+
};
|
|
53
|
+
export type InstrumentationEvent = SubstrateSetEvent | UpgradeCompleteEvent;
|
|
54
|
+
export type EmitOpts = {
|
|
55
|
+
/** Inject a stderr-like sink for tests; defaults to process.stderr. */
|
|
56
|
+
stderr?: NodeJS.WritableStream;
|
|
57
|
+
/** Inject a clock for tests; defaults to Date.now(). */
|
|
58
|
+
now?: () => Date;
|
|
59
|
+
/** Inject a config-reader for tests; defaults to readConfig(). */
|
|
60
|
+
installIdProvider?: () => string;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Emit a `substrate.set` event. Called by `olam substrate set` ONLY on success
|
|
64
|
+
* (failure paths emit nothing — by design; thresholds count successful switches).
|
|
65
|
+
*
|
|
66
|
+
* @param payload — substrate + optional flavor
|
|
67
|
+
* @param opts — test-only injection points (stderr / now / installIdProvider)
|
|
68
|
+
*/
|
|
69
|
+
export declare function emitSubstrateSet(payload: {
|
|
70
|
+
substrate: 'compose' | 'kubernetes';
|
|
71
|
+
flavor?: string;
|
|
72
|
+
}, opts?: EmitOpts): void;
|
|
73
|
+
/**
|
|
74
|
+
* Emit an `upgrade.complete` event. Called by Phase C C2's substrate-aware
|
|
75
|
+
* `olam upgrade` ONLY on success.
|
|
76
|
+
*
|
|
77
|
+
* @param payload — substrate + duration_ms (and optional flavor)
|
|
78
|
+
* @param opts — test-only injection points
|
|
79
|
+
*/
|
|
80
|
+
export declare function emitUpgradeComplete(payload: {
|
|
81
|
+
substrate: 'compose' | 'kubernetes';
|
|
82
|
+
duration_ms: number;
|
|
83
|
+
flavor?: string;
|
|
84
|
+
}, opts?: EmitOpts): void;
|
|
85
|
+
//# sourceMappingURL=instrumentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/lib/instrumentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAIH,eAAO,MAAM,sBAAsB,EAAG,eAAwB,CAAC;AAC/D,eAAO,MAAM,sBAAsB,EAAG,aAAsB,CAAC;AAE7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,OAAO,sBAAsB,CAAC;IACtC,KAAK,EAAE,eAAe,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,SAAS,GAAG,YAAY,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,OAAO,sBAAsB,CAAC;IACtC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,SAAS,GAAG,YAAY,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;AAE5E,MAAM,MAAM,QAAQ,GAAG;IACrB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,MAAM,CAAC;CAClC,CAAC;AAmCF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE;IAAE,SAAS,EAAE,SAAS,GAAG,YAAY,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EACjE,IAAI,GAAE,QAAa,GAClB,IAAI,CAUN;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE;IACP,SAAS,EAAE,SAAS,GAAG,YAAY,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,EACD,IAAI,GAAE,QAAa,GAClB,IAAI,CAWN"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* instrumentation.ts — stdout JSON event emitter for olam-cli.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1b A3 of olam-host-suite-phase-1b-k3s-beta-flavour (plan
|
|
5
|
+
* ~/.claude/plans/olam-host-suite-phase-1b-k3s-beta-flavour.md).
|
|
6
|
+
*
|
|
7
|
+
* Canonical event schema (Decision 21 — `olam.instr.v1`):
|
|
8
|
+
* {
|
|
9
|
+
* "schema": "olam.instr.v1",
|
|
10
|
+
* "event": "substrate.set" | "upgrade.complete",
|
|
11
|
+
* "install_id": "<uuid-v4-from-config>",
|
|
12
|
+
* "ts": "<ISO-8601-UTC>",
|
|
13
|
+
* <event-specific-fields>
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* Emission target: **stderr**, newline-delimited, each line prefixed with
|
|
17
|
+
* `OLAM_INSTR ` so consumers can grep-distinguish from other stderr output.
|
|
18
|
+
*
|
|
19
|
+
* Why stderr (and not stdout)? olam-cli's existing stdout-JSON contracts
|
|
20
|
+
* (e.g. `olam status --json`, `olam doctor --json`) reserve stdout for
|
|
21
|
+
* command output that consumers parse positionally. Mixing instrumentation
|
|
22
|
+
* into stdout breaks those contracts. stderr keeps the emitter
|
|
23
|
+
* grep-distinguishable AND segregated from the data-plane output.
|
|
24
|
+
*
|
|
25
|
+
* Consumers: month-6 aggregator script (`scripts/aggregate-substrate-events.mjs`,
|
|
26
|
+
* D20) groups events by `install_id` for Falsifiable signal thresholds 1+4.
|
|
27
|
+
*
|
|
28
|
+
* Defensive contract:
|
|
29
|
+
* - emit() MUST NOT throw if the config can't be read; falls back to a
|
|
30
|
+
* placeholder install_id ('unknown') + emits a one-line stderr WARN.
|
|
31
|
+
* - Schema is versioned (`olam.instr.v1`); v2 fields land additively.
|
|
32
|
+
* Consumers MUST tolerate unknown fields.
|
|
33
|
+
*/
|
|
34
|
+
import { readConfig } from './config.js';
|
|
35
|
+
export const INSTRUMENTATION_SCHEMA = 'olam.instr.v1';
|
|
36
|
+
export const INSTRUMENTATION_PREFIX = 'OLAM_INSTR ';
|
|
37
|
+
function nowIso(now) {
|
|
38
|
+
const d = now ? now() : new Date();
|
|
39
|
+
return d.toISOString();
|
|
40
|
+
}
|
|
41
|
+
function resolveInstallId(opts) {
|
|
42
|
+
try {
|
|
43
|
+
if (opts.installIdProvider)
|
|
44
|
+
return opts.installIdProvider();
|
|
45
|
+
const cfg = readConfig();
|
|
46
|
+
return cfg.install_id;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return 'unknown';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function writeLine(stderr, payload) {
|
|
53
|
+
try {
|
|
54
|
+
const line = `${INSTRUMENTATION_PREFIX}${JSON.stringify(payload)}\n`;
|
|
55
|
+
stderr.write(line);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
// emit must never throw; surface the failure tersely to stderr.
|
|
59
|
+
try {
|
|
60
|
+
stderr.write(`[WARN] olam instrumentation emit failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// give up; emitter contract is best-effort.
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Emit a `substrate.set` event. Called by `olam substrate set` ONLY on success
|
|
69
|
+
* (failure paths emit nothing — by design; thresholds count successful switches).
|
|
70
|
+
*
|
|
71
|
+
* @param payload — substrate + optional flavor
|
|
72
|
+
* @param opts — test-only injection points (stderr / now / installIdProvider)
|
|
73
|
+
*/
|
|
74
|
+
export function emitSubstrateSet(payload, opts = {}) {
|
|
75
|
+
const event = {
|
|
76
|
+
schema: INSTRUMENTATION_SCHEMA,
|
|
77
|
+
event: 'substrate.set',
|
|
78
|
+
install_id: resolveInstallId(opts),
|
|
79
|
+
ts: nowIso(opts.now),
|
|
80
|
+
substrate: payload.substrate,
|
|
81
|
+
...(payload.flavor !== undefined ? { flavor: payload.flavor } : {}),
|
|
82
|
+
};
|
|
83
|
+
writeLine(opts.stderr ?? process.stderr, event);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Emit an `upgrade.complete` event. Called by Phase C C2's substrate-aware
|
|
87
|
+
* `olam upgrade` ONLY on success.
|
|
88
|
+
*
|
|
89
|
+
* @param payload — substrate + duration_ms (and optional flavor)
|
|
90
|
+
* @param opts — test-only injection points
|
|
91
|
+
*/
|
|
92
|
+
export function emitUpgradeComplete(payload, opts = {}) {
|
|
93
|
+
const event = {
|
|
94
|
+
schema: INSTRUMENTATION_SCHEMA,
|
|
95
|
+
event: 'upgrade.complete',
|
|
96
|
+
install_id: resolveInstallId(opts),
|
|
97
|
+
ts: nowIso(opts.now),
|
|
98
|
+
substrate: payload.substrate,
|
|
99
|
+
duration_ms: payload.duration_ms,
|
|
100
|
+
...(payload.flavor !== undefined ? { flavor: payload.flavor } : {}),
|
|
101
|
+
};
|
|
102
|
+
writeLine(opts.stderr ?? process.stderr, event);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=instrumentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/lib/instrumentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,eAAwB,CAAC;AAC/D,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAsB,CAAC;AAgC7D,SAAS,MAAM,CAAC,GAAgB;IAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IACnC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc;IACtC,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,iBAAiB;YAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,UAAU,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,MAA6B,EAAE,OAA6B;IAC7E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,GAAG,sBAAsB,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gEAAgE;QAChE,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,CACV,4CACE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,IAAI,CACL,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAiE,EACjE,OAAiB,EAAE;IAEnB,MAAM,KAAK,GAAsB;QAC/B,MAAM,EAAE,sBAAsB;QAC9B,KAAK,EAAE,eAAe;QACtB,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC;QAClC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC;IACF,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAIC,EACD,OAAiB,EAAE;IAEnB,MAAM,KAAK,GAAyB;QAClC,MAAM,EAAE,sBAAsB;QAC9B,KAAK,EAAE,kBAAkB;QACzB,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC;QAClC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC;IACF,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kubectl-wrap.ts — subprocess timeout wrapper for kubectl invocations.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1b C1 of olam-host-suite-phase-1b-k3s-beta-flavour (plan
|
|
5
|
+
* ~/.claude/plans/olam-host-suite-phase-1b-k3s-beta-flavour.md).
|
|
6
|
+
*
|
|
7
|
+
* ALL kubectl invocations in olam-cli MUST go through `kubectlWrap`.
|
|
8
|
+
* Direct `child_process.spawn('kubectl', ...)` calls outside this module
|
|
9
|
+
* break the timeout guarantee and fail `audit:kubectl-callers` (Seam C1).
|
|
10
|
+
*
|
|
11
|
+
* Timeout lifecycle:
|
|
12
|
+
* 1. Spawn kubectl with the provided args.
|
|
13
|
+
* 2. Start wall-clock timer (default 120 000 ms; per-call configurable).
|
|
14
|
+
* 3. On timer fire: SIGTERM the process; wait 5 000 ms; SIGKILL if still alive.
|
|
15
|
+
* 4. Returns { ok: false, reason: 'timeout', … } immediately after the kill
|
|
16
|
+
* sequence completes (does not wait further for exit after SIGKILL).
|
|
17
|
+
*
|
|
18
|
+
* Returns:
|
|
19
|
+
* { ok: true, stdout, stderr, exitCode } — clean exit 0
|
|
20
|
+
* { ok: false, stdout, stderr, exitCode, reason } — non-zero exit or timeout
|
|
21
|
+
*
|
|
22
|
+
* reason values:
|
|
23
|
+
* 'timeout' — wall-clock limit exceeded; process SIGKILLed
|
|
24
|
+
* 'spawn' — spawn itself failed (e.g. kubectl not on PATH)
|
|
25
|
+
* 'nonzero' — kubectl exited with non-zero status
|
|
26
|
+
*/
|
|
27
|
+
import { spawn } from 'node:child_process';
|
|
28
|
+
export declare const DEFAULT_TIMEOUT_MS = 120000;
|
|
29
|
+
export type KubectlResult = {
|
|
30
|
+
ok: true;
|
|
31
|
+
stdout: string;
|
|
32
|
+
stderr: string;
|
|
33
|
+
exitCode: number;
|
|
34
|
+
} | {
|
|
35
|
+
ok: false;
|
|
36
|
+
stdout: string;
|
|
37
|
+
stderr: string;
|
|
38
|
+
exitCode: number;
|
|
39
|
+
reason: 'timeout' | 'spawn' | 'nonzero';
|
|
40
|
+
};
|
|
41
|
+
export interface KubectlWrapOpts {
|
|
42
|
+
/** Per-call timeout override (ms). Defaults to DEFAULT_TIMEOUT_MS (120 s). */
|
|
43
|
+
readonly timeout?: number;
|
|
44
|
+
/** Additional environment variables to merge into the subprocess env. */
|
|
45
|
+
readonly env?: Record<string, string>;
|
|
46
|
+
/**
|
|
47
|
+
* spawn factory — injectable for tests so unit tests never fork a real kubectl.
|
|
48
|
+
* Signature matches `child_process.spawn` return type.
|
|
49
|
+
*/
|
|
50
|
+
readonly spawnImpl?: typeof spawn;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Invoke kubectl with a timeout.
|
|
54
|
+
*
|
|
55
|
+
* @param args - kubectl arguments (e.g. ['get', 'pods', '-n', 'olam'])
|
|
56
|
+
* @param opts - timeout, env overrides, and spawn factory for injection
|
|
57
|
+
*/
|
|
58
|
+
export declare function kubectlWrap(args: readonly string[], opts?: KubectlWrapOpts): Promise<KubectlResult>;
|
|
59
|
+
//# sourceMappingURL=kubectl-wrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kubectl-wrap.d.ts","sourceRoot":"","sources":["../../src/lib/kubectl-wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,eAAO,MAAM,kBAAkB,SAAU,CAAC;AAG1C,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;CAAE,CAAC;AAE7G,MAAM,WAAW,eAAe;IAC9B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACnC;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,aAAa,CAAC,CAuFxB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kubectl-wrap.ts — subprocess timeout wrapper for kubectl invocations.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1b C1 of olam-host-suite-phase-1b-k3s-beta-flavour (plan
|
|
5
|
+
* ~/.claude/plans/olam-host-suite-phase-1b-k3s-beta-flavour.md).
|
|
6
|
+
*
|
|
7
|
+
* ALL kubectl invocations in olam-cli MUST go through `kubectlWrap`.
|
|
8
|
+
* Direct `child_process.spawn('kubectl', ...)` calls outside this module
|
|
9
|
+
* break the timeout guarantee and fail `audit:kubectl-callers` (Seam C1).
|
|
10
|
+
*
|
|
11
|
+
* Timeout lifecycle:
|
|
12
|
+
* 1. Spawn kubectl with the provided args.
|
|
13
|
+
* 2. Start wall-clock timer (default 120 000 ms; per-call configurable).
|
|
14
|
+
* 3. On timer fire: SIGTERM the process; wait 5 000 ms; SIGKILL if still alive.
|
|
15
|
+
* 4. Returns { ok: false, reason: 'timeout', … } immediately after the kill
|
|
16
|
+
* sequence completes (does not wait further for exit after SIGKILL).
|
|
17
|
+
*
|
|
18
|
+
* Returns:
|
|
19
|
+
* { ok: true, stdout, stderr, exitCode } — clean exit 0
|
|
20
|
+
* { ok: false, stdout, stderr, exitCode, reason } — non-zero exit or timeout
|
|
21
|
+
*
|
|
22
|
+
* reason values:
|
|
23
|
+
* 'timeout' — wall-clock limit exceeded; process SIGKILLed
|
|
24
|
+
* 'spawn' — spawn itself failed (e.g. kubectl not on PATH)
|
|
25
|
+
* 'nonzero' — kubectl exited with non-zero status
|
|
26
|
+
*/
|
|
27
|
+
import { spawn } from 'node:child_process';
|
|
28
|
+
export const DEFAULT_TIMEOUT_MS = 120_000;
|
|
29
|
+
const SIGKILL_GRACE_MS = 5_000;
|
|
30
|
+
/**
|
|
31
|
+
* Invoke kubectl with a timeout.
|
|
32
|
+
*
|
|
33
|
+
* @param args - kubectl arguments (e.g. ['get', 'pods', '-n', 'olam'])
|
|
34
|
+
* @param opts - timeout, env overrides, and spawn factory for injection
|
|
35
|
+
*/
|
|
36
|
+
export async function kubectlWrap(args, opts = {}) {
|
|
37
|
+
const timeoutMs = opts.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
38
|
+
const spawnImpl = opts.spawnImpl ?? spawn;
|
|
39
|
+
const stdout = [];
|
|
40
|
+
const stderr = [];
|
|
41
|
+
return new Promise((resolve) => {
|
|
42
|
+
let resolved = false;
|
|
43
|
+
let killTimer = null;
|
|
44
|
+
let sigkillTimer = null;
|
|
45
|
+
function safeResolve(r) {
|
|
46
|
+
if (resolved)
|
|
47
|
+
return;
|
|
48
|
+
resolved = true;
|
|
49
|
+
if (killTimer !== null) {
|
|
50
|
+
clearTimeout(killTimer);
|
|
51
|
+
killTimer = null;
|
|
52
|
+
}
|
|
53
|
+
if (sigkillTimer !== null) {
|
|
54
|
+
clearTimeout(sigkillTimer);
|
|
55
|
+
sigkillTimer = null;
|
|
56
|
+
}
|
|
57
|
+
resolve(r);
|
|
58
|
+
}
|
|
59
|
+
let child;
|
|
60
|
+
try {
|
|
61
|
+
child = spawnImpl('kubectl', [...args], {
|
|
62
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
63
|
+
env: { ...process.env, ...(opts.env ?? {}) },
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
resolve({
|
|
68
|
+
ok: false,
|
|
69
|
+
stdout: '',
|
|
70
|
+
stderr: err instanceof Error ? err.message : String(err),
|
|
71
|
+
exitCode: -1,
|
|
72
|
+
reason: 'spawn',
|
|
73
|
+
});
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (child.stdout) {
|
|
77
|
+
child.stdout.on('data', (chunk) => { stdout.push(chunk.toString('utf8')); });
|
|
78
|
+
}
|
|
79
|
+
if (child.stderr) {
|
|
80
|
+
child.stderr.on('data', (chunk) => { stderr.push(chunk.toString('utf8')); });
|
|
81
|
+
}
|
|
82
|
+
child.on('error', (err) => {
|
|
83
|
+
safeResolve({
|
|
84
|
+
ok: false,
|
|
85
|
+
stdout: stdout.join(''),
|
|
86
|
+
stderr: err.message,
|
|
87
|
+
exitCode: -1,
|
|
88
|
+
reason: 'spawn',
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
child.on('exit', (code) => {
|
|
92
|
+
const exitCode = code ?? -1;
|
|
93
|
+
const stdoutStr = stdout.join('');
|
|
94
|
+
const stderrStr = stderr.join('');
|
|
95
|
+
if (exitCode === 0) {
|
|
96
|
+
safeResolve({ ok: true, stdout: stdoutStr, stderr: stderrStr, exitCode });
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
safeResolve({ ok: false, stdout: stdoutStr, stderr: stderrStr, exitCode, reason: 'nonzero' });
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
// Wall-clock timeout: SIGTERM then SIGKILL after grace period.
|
|
103
|
+
killTimer = setTimeout(() => {
|
|
104
|
+
killTimer = null;
|
|
105
|
+
// SIGTERM — polite shutdown request.
|
|
106
|
+
try {
|
|
107
|
+
child.kill('SIGTERM');
|
|
108
|
+
}
|
|
109
|
+
catch { /* already exited */ }
|
|
110
|
+
// SIGKILL after 5 s grace — hard kill if SIGTERM wasn't enough.
|
|
111
|
+
sigkillTimer = setTimeout(() => {
|
|
112
|
+
sigkillTimer = null;
|
|
113
|
+
try {
|
|
114
|
+
child.kill('SIGKILL');
|
|
115
|
+
}
|
|
116
|
+
catch { /* already exited */ }
|
|
117
|
+
// Resolve immediately after SIGKILL without waiting for the 'exit' event.
|
|
118
|
+
// The 'exit' event may fire after this resolve; safeResolve is idempotent.
|
|
119
|
+
safeResolve({
|
|
120
|
+
ok: false,
|
|
121
|
+
stdout: stdout.join(''),
|
|
122
|
+
stderr: stderr.join(''),
|
|
123
|
+
exitCode: -1,
|
|
124
|
+
reason: 'timeout',
|
|
125
|
+
});
|
|
126
|
+
}, SIGKILL_GRACE_MS);
|
|
127
|
+
}, timeoutMs);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=kubectl-wrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kubectl-wrap.js","sourceRoot":"","sources":["../../src/lib/kubectl-wrap.ts"],"names":[],"mappings":"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"}
|