@cat-factory/integrations 0.167.0 → 0.168.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/modules/environments/EnvironmentProvisioningService.d.ts +36 -2
  2. package/dist/modules/environments/EnvironmentProvisioningService.d.ts.map +1 -1
  3. package/dist/modules/environments/EnvironmentProvisioningService.js +56 -1
  4. package/dist/modules/environments/EnvironmentProvisioningService.js.map +1 -1
  5. package/dist/modules/environments/environmentDiagnostics.d.ts +51 -0
  6. package/dist/modules/environments/environmentDiagnostics.d.ts.map +1 -0
  7. package/dist/modules/environments/environmentDiagnostics.js +352 -0
  8. package/dist/modules/environments/environmentDiagnostics.js.map +1 -0
  9. package/dist/modules/environments/environmentRemediation.d.ts +53 -0
  10. package/dist/modules/environments/environmentRemediation.d.ts.map +1 -0
  11. package/dist/modules/environments/environmentRemediation.js +72 -0
  12. package/dist/modules/environments/environmentRemediation.js.map +1 -0
  13. package/dist/modules/environments/environments.logic.d.ts +7 -0
  14. package/dist/modules/environments/environments.logic.d.ts.map +1 -1
  15. package/dist/modules/environments/environments.logic.js +28 -0
  16. package/dist/modules/environments/environments.logic.js.map +1 -1
  17. package/dist/modules/kubernetes/KubernetesEnvironmentProvider.d.ts +25 -2
  18. package/dist/modules/kubernetes/KubernetesEnvironmentProvider.d.ts.map +1 -1
  19. package/dist/modules/kubernetes/KubernetesEnvironmentProvider.js +106 -21
  20. package/dist/modules/kubernetes/KubernetesEnvironmentProvider.js.map +1 -1
  21. package/dist/modules/kubernetes/kubernetes-diagnostics.d.ts +31 -0
  22. package/dist/modules/kubernetes/kubernetes-diagnostics.d.ts.map +1 -0
  23. package/dist/modules/kubernetes/kubernetes-diagnostics.js +350 -0
  24. package/dist/modules/kubernetes/kubernetes-diagnostics.js.map +1 -0
  25. package/dist/modules/kubernetes/kubernetes-environment.logic.d.ts +8 -1
  26. package/dist/modules/kubernetes/kubernetes-environment.logic.d.ts.map +1 -1
  27. package/dist/modules/kubernetes/kubernetes-environment.logic.js +18 -4
  28. package/dist/modules/kubernetes/kubernetes-environment.logic.js.map +1 -1
  29. package/dist/modules/kubernetes/kubernetes.logic.d.ts +42 -2
  30. package/dist/modules/kubernetes/kubernetes.logic.d.ts.map +1 -1
  31. package/dist/modules/kubernetes/kubernetes.logic.js +106 -2
  32. package/dist/modules/kubernetes/kubernetes.logic.js.map +1 -1
  33. package/package.json +4 -4
@@ -0,0 +1,352 @@
1
+ import { describeError, getErrorMessage, noopLogger, redactSecretFields, redactSecrets, } from '@cat-factory/kernel';
2
+ import { createEnvironmentRemediator, } from './environmentRemediation.js';
3
+ /**
4
+ * How many provisioning-log rows enter the timeline. A run brings several containers up at once
5
+ * and the log is appended to in bursts, so the whole run's history would swamp the evidence the
6
+ * investigation is actually about; forty covers a fan-out of frames with their retries.
7
+ */
8
+ const TIMELINE_ROW_CAP = 40;
9
+ /** Per-log-entry detail cap. The tail of a 40 KB apply error repeats one cause many times over. */
10
+ const TIMELINE_DETAIL_CAP = 600;
11
+ /**
12
+ * Cap on ONE diagnostic log excerpt, applied ON TOP of whatever the provider already did. The
13
+ * provider caps for its own transport; this caps for the prompt, and the two are different
14
+ * budgets. Stated on the excerpt when it bites, so a reader cannot mistake a cut log for one that
15
+ * genuinely ended there.
16
+ */
17
+ const DIAGNOSTIC_LOG_CAP = 4000;
18
+ /**
19
+ * The rest of the bundle's budget. Everything a provider or a field bag can hand over is
20
+ * unbounded at the port: a namespace with thirty crash-looping pods and twenty warning events
21
+ * yields facts whose values embed whole Kubernetes condition messages, and a provider is free to
22
+ * have captured a rendered manifest into its field bag. The prompt is ONE string, so an uncapped
23
+ * section does not degrade the diagnosis, it costs the whole round: `generateText` rejects on
24
+ * context length, the investigation throws, and the budget is spent with nothing to show. That is
25
+ * the input-side twin of the truncated-verdict failure `MAX_OUTPUT_TOKENS` is sized against.
26
+ *
27
+ * Each cap is per SECTION rather than one running total, so a fat fact set cannot starve the
28
+ * provision fields of their share. Together with the log and timeline caps above the assembled
29
+ * bundle is bounded at roughly 147k characters (~37k tokens): 120x460 facts + 60x460 fields +
30
+ * 5x4000 logs + 40x440 gaps + 40x660 timeline. Every cut is STATED, in the values themselves
31
+ * where it is one value, and in the bundle's `evidenceCaps` where it is a whole entry.
32
+ */
33
+ const DIAGNOSIS_FACT_CAP = 120;
34
+ const DIAGNOSIS_FACT_VALUE_CAP = 400;
35
+ const DIAGNOSIS_LOG_COUNT_CAP = 5;
36
+ const DIAGNOSIS_GAP_CAP = 40;
37
+ const DIAGNOSIS_GAP_REASON_CAP = 400;
38
+ const PROVISION_FIELD_CAP = 60;
39
+ const PROVISION_FIELD_VALUE_CAP = 400;
40
+ /**
41
+ * Why there is no environment record, in the three ways there can fail to be one.
42
+ *
43
+ * The read FAILING and the row being gone are kept apart for the reason every other degradation
44
+ * in here is: a transport error against the environment store and an environment that is genuinely
45
+ * no longer registered want opposite reactions, and an investigator shown the second concludes the
46
+ * environment was already reclaimed.
47
+ */
48
+ function describeUnreadableEnvironment(environmentId, error) {
49
+ if (!environmentId) {
50
+ return 'The provision failed before an environment was recorded, so there is nothing to read.';
51
+ }
52
+ if (error) {
53
+ return (`Environment '${environmentId}' could not be READ from the registry (${error}), so nothing ` +
54
+ 'about it could be gathered. This is a platform read failure, NOT evidence that the ' +
55
+ 'environment is absent; treat it as UNKNOWN.');
56
+ }
57
+ return `Environment '${environmentId}' is no longer in the registry, so nothing could be read about it.`;
58
+ }
59
+ /**
60
+ * What the bundle says when the provider itself could not be resolved (a connection deleted under
61
+ * the run, a manifest that no longer parses). Named as its own gap rather than folded into "the
62
+ * provider offers no diagnostics": one means nothing was asked because there was nobody to ask,
63
+ * the other that the question was asked and declined.
64
+ */
65
+ const PROVIDER_UNRESOLVED = 'The provider for this environment could not be resolved, so nothing beyond the environment ' +
66
+ 'record and its captured provision fields could be read. Treat the absence of provider facts ' +
67
+ 'as UNKNOWN, never as healthy.';
68
+ export function createEnvironmentDiagnostics(deps) {
69
+ const log = (deps.logger ?? noopLogger).child({ scope: 'environmentDiagnostics' });
70
+ /**
71
+ * Gather everything the platform can say about a failed environment.
72
+ *
73
+ * Nothing in here may throw, full stop: this runs on the failure path of a run that has already
74
+ * gone wrong, and an investigation that cannot be assembled has to degrade to a thinner bundle
75
+ * rather than replace the run's real problem with its own. That includes the registry read the
76
+ * whole gather starts from, which is the one read that used to propagate: a transient store
77
+ * error there surfaced on the caller's poll path as an unreadable poll, and the run fast-failed
78
+ * as a timeout instead of ending on the provider error it actually had. Each read that fails is
79
+ * NAMED in the bundle it could not fill.
80
+ *
81
+ * The provider's declared remediations come back BESIDE the bundle rather than from a second
82
+ * call, because resolving a provider opens the connection's sealed secrets (a
83
+ * `/internal/persistence` round trip under mothership mode), and asking twice per round for two
84
+ * halves of the same resolve is two.
85
+ */
86
+ async function collect(args) {
87
+ const { workspaceId, environmentId, executionId, failure } = args;
88
+ const read = await readRecordSafely(workspaceId, environmentId);
89
+ const record = read.record;
90
+ const timeline = await readTimeline(workspaceId, executionId, record);
91
+ if (!record) {
92
+ return {
93
+ providerActions: [],
94
+ bundle: {
95
+ environment: {
96
+ id: environmentId,
97
+ // Not `failed`: nothing was read, and a status invented here would be the one fact the
98
+ // investigation trusts most. The failure below is all that is actually known.
99
+ status: 'unknown',
100
+ url: null,
101
+ expiresAt: null,
102
+ lastError: null,
103
+ provisionType: null,
104
+ engine: null,
105
+ },
106
+ provisionFields: {},
107
+ timeline,
108
+ diagnosisUnavailable: describeUnreadableEnvironment(environmentId, read.error),
109
+ failure,
110
+ },
111
+ };
112
+ }
113
+ const fields = await readFields(record);
114
+ // STATED rather than left as an empty bag: a provision-field set that could not be decrypted
115
+ // and one the provider never captured look identical, and the first is a platform fault the
116
+ // investigation should be reasoning about rather than reasoning from.
117
+ if (fields.error) {
118
+ timeline.push({
119
+ at: null,
120
+ label: 'captured provision fields could not be decrypted',
121
+ detail: fields.error,
122
+ });
123
+ }
124
+ const provider = await resolveProviderSafely(record);
125
+ const diagnosis = provider ? await describeSafely(record, provider, fields.values) : null;
126
+ const caps = [];
127
+ const prepared = diagnosis?.diagnosis ? prepareDiagnosis(diagnosis.diagnosis, caps) : undefined;
128
+ return {
129
+ providerActions: declaredRemediations(provider),
130
+ bundle: {
131
+ environment: {
132
+ id: record.id,
133
+ status: record.status,
134
+ url: record.url,
135
+ expiresAt: record.expiresAt,
136
+ lastError: record.lastError ?? null,
137
+ provisionType: record.provisionType ?? null,
138
+ engine: record.engine ?? null,
139
+ },
140
+ provisionFields: prepareFields(fields.values, caps),
141
+ timeline,
142
+ ...(prepared ? { diagnosis: prepared } : {}),
143
+ ...(diagnosis?.unavailable ? { diagnosisUnavailable: diagnosis.unavailable } : {}),
144
+ ...(provider ? {} : { diagnosisUnavailable: PROVIDER_UNRESOLVED }),
145
+ ...(caps.length > 0 ? { evidenceCaps: caps } : {}),
146
+ failure,
147
+ },
148
+ };
149
+ }
150
+ /**
151
+ * The registry row, or the reason there is none. Guarded like every other read in here rather
152
+ * than trusted: it is the FIRST read, so a throw here loses the whole bundle AND, before this
153
+ * was wrapped, the caller's own failure path with it.
154
+ */
155
+ async function readRecordSafely(workspaceId, environmentId) {
156
+ if (!environmentId)
157
+ return { record: null };
158
+ try {
159
+ return { record: await deps.readRecord(workspaceId, environmentId) };
160
+ }
161
+ catch (error) {
162
+ log.warn('could not read the environment record for an investigation', {
163
+ workspaceId,
164
+ environmentId,
165
+ ...describeError(error),
166
+ });
167
+ return { record: null, error: getErrorMessage(error) };
168
+ }
169
+ }
170
+ async function readFields(record) {
171
+ try {
172
+ return { values: await deps.decryptFields(record) };
173
+ }
174
+ catch (error) {
175
+ log.warn('could not decrypt provision fields for an environment investigation', {
176
+ workspaceId: record.workspaceId,
177
+ environmentId: record.id,
178
+ ...describeError(error),
179
+ });
180
+ return { values: {}, error: getErrorMessage(error) };
181
+ }
182
+ }
183
+ async function resolveProviderSafely(record) {
184
+ try {
185
+ return await deps.resolveProvider(record);
186
+ }
187
+ catch (error) {
188
+ log.warn('could not resolve the provider for an environment investigation', {
189
+ workspaceId: record.workspaceId,
190
+ environmentId: record.id,
191
+ ...describeError(error),
192
+ });
193
+ return null;
194
+ }
195
+ }
196
+ async function describeSafely(record, resolved, provisionFields) {
197
+ const diagnostics = resolved.provider.diagnostics;
198
+ if (!diagnostics) {
199
+ return {
200
+ unavailable: `The '${resolved.manifest.providerId}' provider implements no diagnostics, so nothing ` +
201
+ 'beyond the environment record and its captured provision fields could be read. Treat ' +
202
+ 'the absence of provider facts as UNKNOWN, never as healthy.',
203
+ };
204
+ }
205
+ try {
206
+ return {
207
+ diagnosis: await diagnostics.describe({
208
+ manifest: resolved.manifest,
209
+ externalId: record.externalId,
210
+ provisionFields,
211
+ resolveSecret: resolved.resolveSecret,
212
+ }),
213
+ };
214
+ }
215
+ catch (error) {
216
+ return {
217
+ unavailable: `The provider's own diagnosis could not be read: ${getErrorMessage(error)}`,
218
+ };
219
+ }
220
+ }
221
+ async function readTimeline(workspaceId, executionId, record) {
222
+ const entries = [];
223
+ if (record) {
224
+ entries.push({ at: record.createdAt, label: 'environment record created' });
225
+ if (record.deletedAt) {
226
+ entries.push({ at: record.deletedAt, label: 'environment record tombstoned' });
227
+ }
228
+ }
229
+ const rows = await readLogRows(workspaceId, executionId ?? record?.executionId ?? undefined);
230
+ if (rows.failure) {
231
+ entries.push({ at: null, label: 'provisioning log could not be read', detail: rows.failure });
232
+ }
233
+ if (rows.dropped > 0) {
234
+ entries.push({
235
+ at: null,
236
+ label: `${rows.dropped} older provisioning-log rows for this run were not included`,
237
+ detail: `The timeline keeps the ${TIMELINE_ROW_CAP} most recent rows; the ones dropped are the OLDEST.`,
238
+ });
239
+ }
240
+ for (const row of rows.records) {
241
+ entries.push({
242
+ at: row.createdAt,
243
+ label: `${row.subsystem}.${row.operation} ${row.outcome}${row.targetId ? ` (${row.targetId})` : ''}`,
244
+ ...(row.error || row.detail
245
+ ? { detail: capText(row.error ?? row.detail ?? '', TIMELINE_DETAIL_CAP) }
246
+ : {}),
247
+ });
248
+ }
249
+ return entries.sort((a, b) => (a.at ?? 0) - (b.at ?? 0));
250
+ }
251
+ async function readLogRows(workspaceId, executionId) {
252
+ if (!deps.listProvisioningLog || !executionId)
253
+ return { records: [], dropped: 0 };
254
+ try {
255
+ const rows = await deps.listProvisioningLog(workspaceId, executionId);
256
+ // Newest first from the repository; the timeline reads oldest first, and the cap has to drop
257
+ // the OLDEST rows rather than the newest, which are the ones about this failure.
258
+ return {
259
+ records: rows.slice(0, TIMELINE_ROW_CAP),
260
+ dropped: Math.max(0, rows.length - TIMELINE_ROW_CAP),
261
+ };
262
+ }
263
+ catch (error) {
264
+ return { records: [], dropped: 0, failure: getErrorMessage(error) };
265
+ }
266
+ }
267
+ return { collect, remediate: createEnvironmentRemediator(deps) };
268
+ }
269
+ /**
270
+ * The remediations a resolved provider will actually perform. Empty for a provider that implements
271
+ * no diagnostics, or declares none, or declares some without the `remediate` that runs them. The
272
+ * three degrade identically ON PURPOSE, because the engine's question is "will something happen
273
+ * if I ask", and a half-declared capability answers no.
274
+ */
275
+ function declaredRemediations(resolved) {
276
+ const diagnostics = resolved?.provider.diagnostics;
277
+ if (!diagnostics?.remediate)
278
+ return [];
279
+ return diagnostics.supportedActions ?? [];
280
+ }
281
+ /**
282
+ * Make the provider's own account safe and BOUNDED for the prompt, recording every cut in `caps`.
283
+ *
284
+ * SCRUBBED here rather than trusted to the provider. The port's own docblock used to declare the
285
+ * excerpt "already capped and redacted BY THE PROVIDER", and that is the right thing to ASK of a
286
+ * provider (only it knows which of its fields carry credentials), but it cannot be the only line
287
+ * of defence: a diagnosis is mostly control-plane text the provider never authored (a pod log
288
+ * tail, a warning-event message, a Deployment condition), which is exactly where a bad DSN or a
289
+ * failed `Authorization` echo shows up. This is the boundary onto a model prompt and the telemetry
290
+ * store, so it applies the shape-based net over whatever the provider already did.
291
+ *
292
+ * Scrub BEFORE the cap, per CLAUDE.md's compose-time rule: capping first can leave the tail of a
293
+ * credential behind as the head of the kept slice.
294
+ */
295
+ function prepareDiagnosis(diagnosis, caps) {
296
+ const factsDropped = Math.max(0, diagnosis.facts.length - DIAGNOSIS_FACT_CAP);
297
+ if (factsDropped > 0) {
298
+ caps.push(`The provider reported ${diagnosis.facts.length} facts; only the first ${DIAGNOSIS_FACT_CAP} ` +
299
+ `are below. ${factsDropped} were not included and are UNKNOWN, not absent.`);
300
+ }
301
+ const logs = (diagnosis.logs ?? []).slice(0, DIAGNOSIS_LOG_COUNT_CAP).map((entry) => {
302
+ const text = scrub(entry.text);
303
+ if (text.length <= DIAGNOSTIC_LOG_CAP)
304
+ return { ...entry, text };
305
+ // Capped from the TAIL: the end of a failing container's output is where the cause is, and a
306
+ // head cap would reliably keep the banner and drop the crash.
307
+ return { ...entry, text: text.slice(text.length - DIAGNOSTIC_LOG_CAP), truncated: true };
308
+ });
309
+ const logsDropped = (diagnosis.logs?.length ?? 0) - logs.length;
310
+ if (logsDropped > 0) {
311
+ caps.push(`${logsDropped} further provider log excerpts were not included.`);
312
+ }
313
+ const gaps = (diagnosis.gaps ?? [])
314
+ .slice(0, DIAGNOSIS_GAP_CAP)
315
+ .map((gap) => ({ ...gap, reason: capText(scrub(gap.reason), DIAGNOSIS_GAP_REASON_CAP) }));
316
+ const gapsDropped = (diagnosis.gaps?.length ?? 0) - gaps.length;
317
+ if (gapsDropped > 0) {
318
+ caps.push(`${gapsDropped} further reads the provider could not make were not listed.`);
319
+ }
320
+ return {
321
+ facts: diagnosis.facts
322
+ .slice(0, DIAGNOSIS_FACT_CAP)
323
+ .map((fact) => ({ ...fact, value: capText(scrub(fact.value), DIAGNOSIS_FACT_VALUE_CAP) })),
324
+ ...(logs.length > 0 ? { logs } : {}),
325
+ ...(gaps.length > 0 ? { gaps } : {}),
326
+ };
327
+ }
328
+ /**
329
+ * The captured field bag, scrubbed and bounded. The scrub is {@link redactSecretFields} rather
330
+ * than a plain one because the bag's KEY is the only context a value like `9f2c…` carries.
331
+ */
332
+ function prepareFields(values, caps) {
333
+ const entries = Object.entries(redactSecretFields(values));
334
+ const kept = entries.slice(0, PROVISION_FIELD_CAP);
335
+ if (entries.length > kept.length) {
336
+ caps.push(`The provider captured ${entries.length} provision fields; only ${kept.length} are below ` +
337
+ '(the first by insertion order). The rest are UNKNOWN, not absent.');
338
+ }
339
+ return Object.fromEntries(kept.map(([key, value]) => [key, capText(value, PROVISION_FIELD_VALUE_CAP)]));
340
+ }
341
+ /** {@link redactSecrets} narrowed to the non-null case; it only returns null for a null input. */
342
+ function scrub(value) {
343
+ return redactSecrets(value) ?? '';
344
+ }
345
+ /** Head-capped text with the drop STATED, for a field whose beginning carries the meaning. */
346
+ function capText(value, cap) {
347
+ if (value.length <= cap)
348
+ return value;
349
+ const dropped = value.length - cap;
350
+ return `${value.slice(0, cap)} […${dropped} more characters were not included]`;
351
+ }
352
+ //# sourceMappingURL=environmentDiagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environmentDiagnostics.js","sourceRoot":"","sources":["../../../src/modules/environments/environmentDiagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { EnvironmentManifest, EnvironmentProvider, EnvironmentRecord, Logger, ProviderRemediationAction, ProvisionFields, SecretResolver } from '@cat-factory/kernel';
2
+ /** The resolved provider trio a forensic call needs, exactly as the lifecycle paths resolve it. */
3
+ export interface ResolvedEnvironmentProvider {
4
+ manifest: EnvironmentManifest;
5
+ provider: EnvironmentProvider;
6
+ resolveSecret: SecretResolver;
7
+ }
8
+ /** One appended `remediate` row, as the owning service maps it onto the provisioning log. */
9
+ export interface EnvironmentRemediationLogRow {
10
+ workspaceId: string;
11
+ environmentId: string;
12
+ providerId: string;
13
+ blockId: string | null;
14
+ executionId: string | null;
15
+ outcome: 'success' | 'failure';
16
+ error: string | null;
17
+ detail: string;
18
+ }
19
+ /**
20
+ * What either forensic half needs to reach one environment's provider. Declared here and EXTENDED
21
+ * by the gatherer's deps, so the two cannot drift into addressing the same row through different
22
+ * seams.
23
+ */
24
+ export interface EnvironmentRemediatorDeps {
25
+ readRecord: (workspaceId: string, id: string) => Promise<EnvironmentRecord | null>;
26
+ resolveProvider: (record: EnvironmentRecord) => Promise<ResolvedEnvironmentProvider>;
27
+ decryptFields: (record: EnvironmentRecord) => Promise<ProvisionFields>;
28
+ /**
29
+ * Append the `remediate` row for a mutation this collaborator performed. Bound by the owning
30
+ * service, which is where the provisioning log's write seam lives; absent ⇒ this deployment
31
+ * keeps no provisioning log, exactly as for every other verb. Best-effort at the call site.
32
+ */
33
+ recordRemediation?: (row: EnvironmentRemediationLogRow) => Promise<void>;
34
+ logger?: Logger;
35
+ }
36
+ /**
37
+ * Ask the provider to remediate in place.
38
+ *
39
+ * Every outcome is APPENDED to the provisioning log before it is returned. This is the one call in
40
+ * the module that MUTATES a live cluster, and a mutation with no row of its own is invisible to the
41
+ * two readers that most need it: the investigation's own next round rebuilds its timeline from that
42
+ * log, so an unlogged restart leaves the second round reasoning about an environment it believes
43
+ * nothing has touched, and the operator's provisioning drawer never shows it either.
44
+ */
45
+ export declare function createEnvironmentRemediator(deps: EnvironmentRemediatorDeps): (args: {
46
+ workspaceId: string;
47
+ environmentId: string;
48
+ action: ProviderRemediationAction;
49
+ }) => Promise<{
50
+ applied: boolean;
51
+ detail: string;
52
+ }>;
53
+ //# sourceMappingURL=environmentRemediation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environmentRemediation.d.ts","sourceRoot":"","sources":["../../../src/modules/environments/environmentRemediation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,MAAM,EACN,yBAAyB,EACzB,eAAe,EACf,cAAc,EACf,MAAM,qBAAqB,CAAA;AAe5B,mGAAmG;AACnG,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,mBAAmB,CAAA;IAC7B,QAAQ,EAAE,mBAAmB,CAAA;IAC7B,aAAa,EAAE,cAAc,CAAA;CAC9B;AAED,6FAA6F;AAC7F,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,OAAO,EAAE,SAAS,GAAG,SAAS,CAAA;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;IAClF,eAAe,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,2BAA2B,CAAC,CAAA;IACpF,aAAa,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAA;IACtE;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,4BAA4B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACxE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,yBAAyB,UAuCnC;IACpC,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,yBAAyB,CAAA;CAClC,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAsClD"}
@@ -0,0 +1,72 @@
1
+ import { getErrorMessage, noopLogger, runBestEffort } from '@cat-factory/kernel';
2
+ /**
3
+ * Ask the provider to remediate in place.
4
+ *
5
+ * Every outcome is APPENDED to the provisioning log before it is returned. This is the one call in
6
+ * the module that MUTATES a live cluster, and a mutation with no row of its own is invisible to the
7
+ * two readers that most need it: the investigation's own next round rebuilds its timeline from that
8
+ * log, so an unlogged restart leaves the second round reasoning about an environment it believes
9
+ * nothing has touched, and the operator's provisioning drawer never shows it either.
10
+ */
11
+ export function createEnvironmentRemediator(deps) {
12
+ const log = (deps.logger ?? noopLogger).child({ scope: 'environmentRemediation' });
13
+ /** Append one remediation row; best-effort, so a log outage never costs the remediation. */
14
+ async function record(environment, providerId, action, result) {
15
+ const append = deps.recordRemediation;
16
+ if (!append)
17
+ return;
18
+ await runBestEffort(log, 'record an environment remediation', () => append({
19
+ workspaceId: environment.workspaceId,
20
+ environmentId: environment.id,
21
+ providerId,
22
+ blockId: environment.blockId ?? null,
23
+ executionId: environment.executionId ?? null,
24
+ outcome: result.outcome,
25
+ error: result.error,
26
+ detail: JSON.stringify({
27
+ action,
28
+ applied: result.applied,
29
+ ...(result.detail === undefined ? {} : { detail: result.detail }),
30
+ }),
31
+ }), { workspaceId: environment.workspaceId, environmentId: environment.id, action });
32
+ }
33
+ return async function remediate(args) {
34
+ const { workspaceId, environmentId, action } = args;
35
+ const environment = await deps.readRecord(workspaceId, environmentId);
36
+ if (!environment)
37
+ throw new Error(`Environment '${environmentId}' is no longer in the registry`);
38
+ const { manifest, provider, resolveSecret } = await deps.resolveProvider(environment);
39
+ const remediateFn = provider.diagnostics?.remediate;
40
+ if (!remediateFn) {
41
+ throw new Error(`Provider '${manifest.providerId}' offers no in-place remediation for this environment`);
42
+ }
43
+ const provisionFields = await deps.decryptFields(environment);
44
+ try {
45
+ const outcome = await remediateFn.call(provider.diagnostics, {
46
+ manifest,
47
+ externalId: environment.externalId,
48
+ provisionFields,
49
+ resolveSecret,
50
+ action,
51
+ });
52
+ // `applied: false` is a FAILURE row, not a quiet success: the requested remediation did not
53
+ // happen, and the timeline's job is to say whether anything touched this environment.
54
+ await record(environment, manifest.providerId, action, {
55
+ outcome: outcome.applied ? 'success' : 'failure',
56
+ error: outcome.applied ? null : outcome.detail,
57
+ applied: outcome.applied,
58
+ detail: outcome.detail,
59
+ });
60
+ return outcome;
61
+ }
62
+ catch (error) {
63
+ await record(environment, manifest.providerId, action, {
64
+ outcome: 'failure',
65
+ error: getErrorMessage(error),
66
+ applied: false,
67
+ });
68
+ throw error;
69
+ }
70
+ };
71
+ }
72
+ //# sourceMappingURL=environmentRemediation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environmentRemediation.js","sourceRoot":"","sources":["../../../src/modules/environments/environmentRemediation.ts"],"names":[],"mappings":"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"}
@@ -177,6 +177,13 @@ export declare function mapStatus(raw: string | undefined, statusMap: {
177
177
  }[] | undefined, fallback: EnvironmentStatus): EnvironmentStatus;
178
178
  /** Project a stored record onto the wire handle, optionally with decrypted access. */
179
179
  export declare function recordToHandle(record: EnvironmentRecord, access?: EnvironmentAccessHandle | null): EnvironmentHandle;
180
+ /**
181
+ * A provider's status note as it is stored: trimmed, blank-as-null, and bounded.
182
+ *
183
+ * A capped note SAYS it was capped rather than trailing off, so a reader never takes the prefix
184
+ * for the whole account (the same rule every other cap in the environment path follows).
185
+ */
186
+ export declare function boundStatusNote(note: string | null | undefined): string | null;
180
187
  /** Coerce an extracted expiry (epoch-ms number, numeric string, or ISO) to ms. */
181
188
  export declare function coerceExpiresAt(value: unknown): number | null;
182
189
  //# sourceMappingURL=environments.logic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"environments.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/environments/environments.logic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"environments.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/environments/environments.logic.ts"],"names":[],"mappings":"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"}
@@ -350,10 +350,38 @@ export function recordToHandle(record, access) {
350
350
  createdAt: record.createdAt,
351
351
  expiresAt: record.expiresAt,
352
352
  lastError: record.lastError,
353
+ statusNote: record.statusNote,
353
354
  provisionType: record.provisionType,
354
355
  engine: record.engine,
355
356
  };
356
357
  }
358
+ /**
359
+ * How much of a provider's status note is persisted. The note is provider-authored prose that
360
+ * lands in three places a sentence has to stay readable in: the step's Environment panel, the
361
+ * readiness ceiling's run-failure message, and the outcome card's environment row.
362
+ *
363
+ * `lastError` is deliberately uncapped beside it, and the asymmetry is the point: a fault is
364
+ * something a person opens and scrolls (the panel gives it its own scrollable block), while the
365
+ * note is one muted line beside an environment that is doing fine. A code adapter answering with
366
+ * a controller dump or an event list would otherwise push everything under it off the surface.
367
+ */
368
+ const STATUS_NOTE_CAP = 400;
369
+ /**
370
+ * A provider's status note as it is stored: trimmed, blank-as-null, and bounded.
371
+ *
372
+ * A capped note SAYS it was capped rather than trailing off, so a reader never takes the prefix
373
+ * for the whole account (the same rule every other cap in the environment path follows).
374
+ */
375
+ export function boundStatusNote(note) {
376
+ const trimmed = note?.trim();
377
+ if (!trimmed)
378
+ return null;
379
+ if (trimmed.length <= STATUS_NOTE_CAP)
380
+ return trimmed;
381
+ const dropped = trimmed.length - STATUS_NOTE_CAP;
382
+ return (`${trimmed.slice(0, STATUS_NOTE_CAP)} ` +
383
+ `[note truncated: ${dropped} of ${trimmed.length} characters dropped]`);
384
+ }
357
385
  /** Coerce an extracted expiry (epoch-ms number, numeric string, or ISO) to ms. */
358
386
  export function coerceExpiresAt(value) {
359
387
  if (value === null || value === undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"environments.logic.js","sourceRoot":"","sources":["../../../src/modules/environments/environments.logic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"environments.logic.js","sourceRoot":"","sources":["../../../src/modules/environments/environments.logic.ts"],"names":[],"mappings":"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"}