@cat-factory/integrations 0.8.3 → 0.10.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/index.d.ts +4 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +8 -5
  4. package/dist/index.js.map +1 -1
  5. package/dist/modules/datadog/DatadogObservabilityAdapter.d.ts +23 -0
  6. package/dist/modules/datadog/DatadogObservabilityAdapter.d.ts.map +1 -0
  7. package/dist/modules/datadog/DatadogObservabilityAdapter.js +47 -0
  8. package/dist/modules/datadog/DatadogObservabilityAdapter.js.map +1 -0
  9. package/dist/modules/datadog/datadog.logic.d.ts +2 -2
  10. package/dist/modules/datadog/datadog.logic.d.ts.map +1 -1
  11. package/dist/modules/datadog/datadog.logic.js +2 -2
  12. package/dist/modules/datadog/datadog.logic.js.map +1 -1
  13. package/dist/modules/observability/RegistryReleaseHealthProvider.d.ts +48 -0
  14. package/dist/modules/observability/RegistryReleaseHealthProvider.d.ts.map +1 -0
  15. package/dist/modules/observability/RegistryReleaseHealthProvider.js +71 -0
  16. package/dist/modules/observability/RegistryReleaseHealthProvider.js.map +1 -0
  17. package/dist/modules/observability/registry.d.ts +12 -0
  18. package/dist/modules/observability/registry.d.ts.map +1 -0
  19. package/dist/modules/observability/registry.js +15 -0
  20. package/dist/modules/observability/registry.js.map +1 -0
  21. package/dist/modules/tasks/TaskConnectionService.d.ts +26 -3
  22. package/dist/modules/tasks/TaskConnectionService.d.ts.map +1 -1
  23. package/dist/modules/tasks/TaskConnectionService.js +65 -3
  24. package/dist/modules/tasks/TaskConnectionService.js.map +1 -1
  25. package/dist/modules/tasks/TaskImportService.d.ts +8 -0
  26. package/dist/modules/tasks/TaskImportService.d.ts.map +1 -1
  27. package/dist/modules/tasks/TaskImportService.js +21 -5
  28. package/dist/modules/tasks/TaskImportService.js.map +1 -1
  29. package/package.json +3 -3
  30. package/dist/modules/datadog/DatadogReleaseHealthProvider.d.ts +0 -30
  31. package/dist/modules/datadog/DatadogReleaseHealthProvider.d.ts.map +0 -1
  32. package/dist/modules/datadog/DatadogReleaseHealthProvider.js +0 -101
  33. package/dist/modules/datadog/DatadogReleaseHealthProvider.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -61,9 +61,11 @@ export { localRunnerUrlError } from './modules/providers/localModelUrl.js';
61
61
  export { OpenRouterCatalogService, type OpenRouterCatalogServiceDependencies, OPENROUTER_BASE_URL, usdRateForSpendCurrency, } from './modules/providers/OpenRouterCatalogService.js';
62
62
  export * as providersLogic from './modules/providers/providers.logic.js';
63
63
  export { DEFAULT_USAGE_WINDOW_MS, chooseToken, windowUsage, type PoolRotationRecord, } from './modules/providers/providers.logic.js';
64
- export { DatadogReleaseHealthProvider, type DatadogReleaseHealthProviderDependencies, } from './modules/datadog/DatadogReleaseHealthProvider.js';
64
+ export { RegistryReleaseHealthProvider, type RegistryReleaseHealthProviderDependencies, type ObservabilityAdapter, type ObservabilityAdapterFactory, type ObservabilityProviderRegistry, } from './modules/observability/RegistryReleaseHealthProvider.js';
65
+ export { defaultObservabilityRegistry } from './modules/observability/registry.js';
66
+ export { DatadogObservabilityAdapter, type DatadogCredentialsShape, } from './modules/datadog/DatadogObservabilityAdapter.js';
65
67
  export { DatadogClient, type DatadogCredentials, type DatadogClientOptions, } from './modules/datadog/DatadogClient.js';
66
- export { DATADOG_CIPHER_INFO, DatadogApiError, normalizeDatadogSite, datadogApiBase, } from './modules/datadog/datadog.logic.js';
68
+ export { OBSERVABILITY_CIPHER_INFO, DatadogApiError, normalizeDatadogSite, datadogApiBase, } from './modules/datadog/datadog.logic.js';
67
69
  export { PagerDutyEnrichmentProvider, type PagerDutyEnrichmentProviderOptions, } from './modules/pagerduty/PagerDutyEnrichmentProvider.js';
68
70
  export { IncidentIoEnrichmentProvider, type IncidentIoEnrichmentProviderOptions, } from './modules/incidentio/IncidentIoEnrichmentProvider.js';
69
71
  export { SendGridEmailSender, ResendEmailSender, createEmailSender, EMAIL_CIPHER_INFO, type EmailProviderConfig, type SendGridConfig, type ResendConfig, } from './modules/email/adapters.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -74,12 +74,15 @@ export { localRunnerUrlError } from './modules/providers/localModelUrl.js';
74
74
  export { OpenRouterCatalogService, OPENROUTER_BASE_URL, usdRateForSpendCurrency, } from './modules/providers/OpenRouterCatalogService.js';
75
75
  export * as providersLogic from './modules/providers/providers.logic.js';
76
76
  export { DEFAULT_USAGE_WINDOW_MS, chooseToken, windowUsage, } from './modules/providers/providers.logic.js';
77
- // Datadog post-release-health: the release-health provider the gate reads + its thin
78
- // fetch client, plus the optional incident-enrichment providers (PagerDuty / incident.io)
79
- // that annotate never re-alert — an incident those systems already opened.
80
- export { DatadogReleaseHealthProvider, } from './modules/datadog/DatadogReleaseHealthProvider.js';
77
+ // Post-release-health: the pluggable observability provider the gate reads (a registry
78
+ // of vendor adapters Datadog today) + the Datadog adapter / thin fetch client, plus the
79
+ // optional incident-enrichment providers (PagerDuty / incident.io) that annotate never
80
+ // re-alert an incident those systems already opened.
81
+ export { RegistryReleaseHealthProvider, } from './modules/observability/RegistryReleaseHealthProvider.js';
82
+ export { defaultObservabilityRegistry } from './modules/observability/registry.js';
83
+ export { DatadogObservabilityAdapter, } from './modules/datadog/DatadogObservabilityAdapter.js';
81
84
  export { DatadogClient, } from './modules/datadog/DatadogClient.js';
82
- export { DATADOG_CIPHER_INFO, DatadogApiError, normalizeDatadogSite, datadogApiBase, } from './modules/datadog/datadog.logic.js';
85
+ export { OBSERVABILITY_CIPHER_INFO, DatadogApiError, normalizeDatadogSite, datadogApiBase, } from './modules/datadog/datadog.logic.js';
83
86
  export { PagerDutyEnrichmentProvider, } from './modules/pagerduty/PagerDutyEnrichmentProvider.js';
84
87
  export { IncidentIoEnrichmentProvider, } from './modules/incidentio/IncidentIoEnrichmentProvider.js';
85
88
  export { SendGridEmailSender, ResendEmailSender, createEmailSender, EMAIL_CIPHER_INFO, } from './modules/email/adapters.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,OAAO,EACL,yBAAyB,GAE1B,MAAM,+CAA+C,CAAA;AACtD,OAAO,EAAE,aAAa,EAAkC,MAAM,mCAAmC,CAAA;AACjG,OAAO,EACL,iBAAiB,GAElB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAmC,MAAM,oCAAoC,CAAA;AACpG,OAAO,KAAK,gBAAgB,MAAM,sCAAsC,CAAA;AACxE,OAAO,EACL,uBAAuB,GAIxB,MAAM,6CAA6C,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAEtE,OAAO,EACL,yBAAyB,GAE1B,MAAM,kDAAkD,CAAA;AACzD,OAAO,EACL,qBAAqB,EAErB,gBAAgB,GACjB,MAAM,8CAA8C,CAAA;AACrD,OAAO,EACL,sBAAsB,GAEvB,MAAM,+CAA+C,CAAA;AACtD,OAAO,EACL,mBAAmB,GAGpB,MAAM,4CAA4C,CAAA;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAA;AAClF,OAAO,KAAK,cAAc,MAAM,wCAAwC,CAAA;AACxE,OAAO,KAAK,eAAe,MAAM,yCAAyC,CAAA;AAC1E,OAAO,KAAK,WAAW,MAAM,qCAAqC,CAAA;AAClE,OAAO,KAAK,eAAe,MAAM,0CAA0C,CAAA;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAA;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAA;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAA;AACjF,iFAAiF;AACjF,8EAA8E;AAC9E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAA;AAClG,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAA;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAA;AAE9E,OAAO,EACL,qBAAqB,GAEtB,MAAM,0CAA0C,CAAA;AACjD,OAAO,EACL,iBAAiB,EAEjB,YAAY,GACb,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EACL,eAAe,GAEhB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EACL,qBAAqB,EAErB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gCAAgC,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,gCAAgC,CAAA;AAC5D,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EACL,oBAAoB,GAIrB,MAAM,2CAA2C,CAAA;AAClD,OAAO,KAAK,eAAe,MAAM,wCAAwC,CAAA;AACzE,OAAO,KAAK,kBAAkB,MAAM,2CAA2C,CAAA;AAC/E,OAAO,EACL,qBAAqB,GAEtB,MAAM,8CAA8C,CAAA;AACrD,OAAO,EACL,yBAAyB,GAE1B,MAAM,0CAA0C,CAAA;AACjD,OAAO,KAAK,iBAAiB,MAAM,wCAAwC,CAAA;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,EACL,oBAAoB,GAErB,MAAM,yCAAyC,CAAA;AAChD,mFAAmF;AACnF,yFAAyF;AACzF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAE5E,OAAO,EACL,4BAA4B,EAG5B,oBAAoB,GACrB,MAAM,wDAAwD,CAAA;AAC/D,OAAO,EACL,8BAA8B,GAI/B,MAAM,0DAA0D,CAAA;AACjE,OAAO,EACL,0BAA0B,GAE3B,MAAM,sDAAsD,CAAA;AAC7D,OAAO,KAAK,iBAAiB,MAAM,8CAA8C,CAAA;AACjF,mFAAmF;AACnF,6EAA6E;AAC7E,OAAO,EACL,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,mDAAmD,CAAA;AAC1D,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,8CAA8C,CAAA;AAErD,OAAO,EACL,2BAA2B,GAG5B,MAAM,kDAAkD,CAAA;AACzD,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAA;AAClE,4EAA4E;AAC5E,mFAAmF;AACnF,+EAA+E;AAC/E,OAAO,EACL,sBAAsB,EACtB,kBAAkB,GAEnB,MAAM,6CAA6C,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AAE9E,kFAAkF;AAClF,mFAAmF;AACnF,qFAAqF;AACrF,OAAO,EACL,wBAAwB,GAEzB,MAAM,6CAA6C,CAAA;AACpD,OAAO,EACL,sBAAsB,GAEvB,MAAM,2CAA2C,CAAA;AAClD,OAAO,EACL,oBAAoB,GAErB,MAAM,yCAAyC,CAAA;AAChD,OAAO,EACL,yBAAyB,GAE1B,MAAM,8CAA8C,CAAA;AACrD,OAAO,EACL,cAAc,EACd,aAAa,GAId,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,UAAU,MAAM,gCAAgC,CAAA;AAC5D,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,YAAY,GACb,MAAM,gCAAgC,CAAA;AACvC,OAAO,EACL,2BAA2B,GAI5B,MAAM,oDAAoD,CAAA;AAC3D,OAAO,EACL,aAAa,GAKd,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EACL,2BAA2B,EAG3B,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,oDAAoD,CAAA;AAC3D,OAAO,EACL,yBAAyB,GAG1B,MAAM,kDAAkD,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA;AAC1E,OAAO,EACL,wBAAwB,EAExB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,iDAAiD,CAAA;AACxD,OAAO,KAAK,cAAc,MAAM,wCAAwC,CAAA;AACxE,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,WAAW,GAEZ,MAAM,wCAAwC,CAAA;AAE/C,qFAAqF;AACrF,0FAA0F;AAC1F,6EAA6E;AAC7E,OAAO,EACL,4BAA4B,GAE7B,MAAM,mDAAmD,CAAA;AAC1D,OAAO,EACL,aAAa,GAGd,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,cAAc,GACf,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EACL,2BAA2B,GAE5B,MAAM,oDAAoD,CAAA;AAC3D,OAAO,EACL,4BAA4B,GAE7B,MAAM,sDAAsD,CAAA;AAE7D,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAIlB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EACL,sBAAsB,GAGvB,MAAM,2CAA2C,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ReleaseEvidence, ReleaseHealthConfigRecord, ReleaseSignal } from '@cat-factory/kernel';
2
+ import type { ObservabilityAdapter } from '../observability/RegistryReleaseHealthProvider.js';
3
+ /** Decrypted Datadog credentials (the sealed `credentials` blob, parsed). */
4
+ export interface DatadogCredentialsShape {
5
+ site: string;
6
+ apiKey: string;
7
+ appKey: string;
8
+ }
9
+ /**
10
+ * The Datadog observability adapter: reads a block's configured monitors/SLOs and recent
11
+ * error logs through the Datadog API. Built from already-decrypted credentials by the
12
+ * provider registry (`RegistryReleaseHealthProvider` owns connection loading + decryption,
13
+ * config resolution and the verdict reduction — this adapter is purely the Datadog reads).
14
+ */
15
+ export declare class DatadogObservabilityAdapter implements ObservabilityAdapter {
16
+ private readonly client;
17
+ constructor(credentials: DatadogCredentialsShape, opts?: {
18
+ fetchImpl?: typeof fetch;
19
+ });
20
+ readSignals(config: ReleaseHealthConfigRecord, since: number): Promise<ReleaseSignal[]>;
21
+ recentErrors(config: ReleaseHealthConfigRecord, since: number): Promise<ReleaseEvidence['errors']>;
22
+ }
23
+ //# sourceMappingURL=DatadogObservabilityAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatadogObservabilityAdapter.d.ts","sourceRoot":"","sources":["../../../src/modules/datadog/DatadogObservabilityAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGpG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAA;AAE7F,6EAA6E;AAC7E,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,qBAAa,2BAA4B,YAAW,oBAAoB;IACtE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IAEtC,YAAY,WAAW,EAAE,uBAAuB,EAAE,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;KAAO,EAKxF;IAEK,WAAW,CAAC,MAAM,EAAE,yBAAyB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA0B5F;IAEK,YAAY,CAChB,MAAM,EAAE,yBAAyB,EACjC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAUpC;CACF"}
@@ -0,0 +1,47 @@
1
+ import { DatadogClient } from './DatadogClient.js';
2
+ import { mapMonitorState, mapSloState } from './datadog.logic.js';
3
+ /**
4
+ * The Datadog observability adapter: reads a block's configured monitors/SLOs and recent
5
+ * error logs through the Datadog API. Built from already-decrypted credentials by the
6
+ * provider registry (`RegistryReleaseHealthProvider` owns connection loading + decryption,
7
+ * config resolution and the verdict reduction — this adapter is purely the Datadog reads).
8
+ */
9
+ export class DatadogObservabilityAdapter {
10
+ client;
11
+ constructor(credentials, opts = {}) {
12
+ this.client = new DatadogClient({ site: credentials.site, apiKey: credentials.apiKey, appKey: credentials.appKey }, { fetchImpl: opts.fetchImpl });
13
+ }
14
+ async readSignals(config, since) {
15
+ const now = Date.now();
16
+ const fromTs = Math.floor(since / 1000);
17
+ const toTs = Math.floor(now / 1000);
18
+ const monitors = await Promise.all(config.monitorIds.map(async (id) => {
19
+ const m = await this.client.getMonitor(id);
20
+ // Attribute the alert to THIS release: a monitor already alerting before the
21
+ // release marker (`since`) is a pre-existing incident, not this PR's regression.
22
+ const state = mapMonitorState(m.overallState, { stateModifiedMs: m.stateModifiedMs, since });
23
+ return { kind: 'monitor', id, name: m.name, state };
24
+ }));
25
+ const slos = await Promise.all(config.sloIds.map(async (id) => {
26
+ const s = await this.client.getSloState(id, fromTs, toTs);
27
+ const state = mapSloState(s.sliValue, s.target);
28
+ const detail = s.sliValue !== null && s.target !== null
29
+ ? `SLI ${s.sliValue.toFixed(2)} vs target ${s.target}`
30
+ : undefined;
31
+ return { kind: 'slo', id, name: s.name, state, detail };
32
+ }));
33
+ return [...monitors, ...slos];
34
+ }
35
+ async recentErrors(config, since) {
36
+ // Pull recent error logs scoped to the env (when configured), best-effort, over the
37
+ // window [since, now].
38
+ const query = config.envTag ? `status:error env:${config.envTag}` : 'status:error';
39
+ const ddErrors = await this.client.recentErrorLogs(query, since, Date.now());
40
+ return ddErrors.map((e) => ({
41
+ title: e.title,
42
+ count: e.count,
43
+ sampleMessage: e.sampleMessage,
44
+ }));
45
+ }
46
+ }
47
+ //# sourceMappingURL=DatadogObservabilityAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatadogObservabilityAdapter.js","sourceRoot":"","sources":["../../../src/modules/datadog/DatadogObservabilityAdapter.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { ReleaseSignalState } from '@cat-factory/kernel';
2
- /** The domain tag used to seal Datadog credentials at rest (HKDF info). */
3
- export declare const DATADOG_CIPHER_INFO = "cat-factory:datadog";
2
+ /** The domain tag used to seal observability credentials at rest (HKDF info). */
3
+ export declare const OBSERVABILITY_CIPHER_INFO = "cat-factory:observability";
4
4
  /**
5
5
  * Validate a configured Datadog `site` host and return the normalized host (no
6
6
  * scheme/path). Throws when it isn't a recognised Datadog host so a misconfiguration
@@ -1 +1 @@
1
- {"version":3,"file":"datadog.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/datadog/datadog.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAM7D,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,wBAAwB,CAAA;AAYxD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYzD;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,WAAW,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACxD,kBAAkB,CAuBpB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,kBAAkB,CAG9F;AAED,qBAAa,eAAgB,SAAQ,KAAK;IAEtC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAFzB,YACW,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAIxB;CACF"}
1
+ {"version":3,"file":"datadog.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/datadog/datadog.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAM7D,iFAAiF;AACjF,eAAO,MAAM,yBAAyB,8BAA8B,CAAA;AAYpE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYzD;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,WAAW,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACxD,kBAAkB,CAuBpB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,kBAAkB,CAG9F;AAED,qBAAa,eAAgB,SAAQ,KAAK;IAEtC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAFzB,YACW,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAIxB;CACF"}
@@ -1,8 +1,8 @@
1
1
  // Pure helpers for the Datadog post-release-health integration: site validation
2
2
  // (anti-SSRF — only real Datadog hosts), base-URL construction, and mapping Datadog's
3
3
  // monitor/SLO shapes onto the runtime-neutral `ReleaseSignalState`.
4
- /** The domain tag used to seal Datadog credentials at rest (HKDF info). */
5
- export const DATADOG_CIPHER_INFO = 'cat-factory:datadog';
4
+ /** The domain tag used to seal observability credentials at rest (HKDF info). */
5
+ export const OBSERVABILITY_CIPHER_INFO = 'cat-factory:observability';
6
6
  /** Datadog site host suffixes we allow a connection to point at (anti-SSRF). */
7
7
  const ALLOWED_SITE_SUFFIXES = [
8
8
  'datadoghq.com',
@@ -1 +1 @@
1
- {"version":3,"file":"datadog.logic.js","sourceRoot":"","sources":["../../../src/modules/datadog/datadog.logic.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,sFAAsF;AACtF,oEAAoE;AAEpE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAA;AAExD,gFAAgF;AAChF,MAAM,qBAAqB,GAAG;IAC5B,eAAe;IACf,cAAc;IACd,mBAAmB;IACnB,mBAAmB;IACnB,mBAAmB;IACnB,cAAc;CACf,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,OAAO,GAAG,IAAI;SACjB,IAAI,EAAE;SACN,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,WAAW,EAAE,CAAA;IAChB,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAA;IAC1E,MAAM,EAAE,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;IACxF,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,mCAAmC,OAAO,EAAE,CAAC,CAAA;IACnF,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,eAAe,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAA;AACpD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC7B,YAAgC,EAChC,WAAyD;IAEzD,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3C,KAAK,OAAO,CAAC;QACb,KAAK,gBAAgB;YACnB,kFAAkF;YAClF,+CAA+C;YAC/C,IACE,WAAW;gBACX,WAAW,CAAC,eAAe,KAAK,SAAS;gBACzC,WAAW,CAAC,eAAe,GAAG,WAAW,CAAC,KAAK,EAC/C,CAAC;gBACD,OAAO,MAAM,CAAA;YACf,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,KAAK,MAAM,CAAC;QACZ,KAAK,eAAe;YAClB,OAAO,MAAM,CAAA;QACf,KAAK,IAAI;YACP,OAAO,IAAI,CAAA;QACb;YACE,4DAA4D;YAC5D,OAAO,SAAS,CAAA;IACpB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAuB,EAAE,MAAqB;IACxE,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IAC1D,OAAO,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;AAC3C,CAAC;AAED,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAE7B,QAAQ;IACR,MAAM;IAFjB,YACW,QAAgB,EAChB,MAAc;QAEvB,KAAK,CAAC,WAAW,QAAQ,YAAY,MAAM,EAAE,CAAC,CAAA;wBAHrC,QAAQ;sBACR,MAAM;QAGf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF"}
1
+ {"version":3,"file":"datadog.logic.js","sourceRoot":"","sources":["../../../src/modules/datadog/datadog.logic.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,sFAAsF;AACtF,oEAAoE;AAEpE,iFAAiF;AACjF,MAAM,CAAC,MAAM,yBAAyB,GAAG,2BAA2B,CAAA;AAEpE,gFAAgF;AAChF,MAAM,qBAAqB,GAAG;IAC5B,eAAe;IACf,cAAc;IACd,mBAAmB;IACnB,mBAAmB;IACnB,mBAAmB;IACnB,cAAc;CACf,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,OAAO,GAAG,IAAI;SACjB,IAAI,EAAE;SACN,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,WAAW,EAAE,CAAA;IAChB,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAA;IAC1E,MAAM,EAAE,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;IACxF,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,mCAAmC,OAAO,EAAE,CAAC,CAAA;IACnF,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,eAAe,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAA;AACpD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC7B,YAAgC,EAChC,WAAyD;IAEzD,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3C,KAAK,OAAO,CAAC;QACb,KAAK,gBAAgB;YACnB,kFAAkF;YAClF,+CAA+C;YAC/C,IACE,WAAW;gBACX,WAAW,CAAC,eAAe,KAAK,SAAS;gBACzC,WAAW,CAAC,eAAe,GAAG,WAAW,CAAC,KAAK,EAC/C,CAAC;gBACD,OAAO,MAAM,CAAA;YACf,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,KAAK,MAAM,CAAC;QACZ,KAAK,eAAe;YAClB,OAAO,MAAM,CAAA;QACf,KAAK,IAAI;YACP,OAAO,IAAI,CAAA;QACb;YACE,4DAA4D;YAC5D,OAAO,SAAS,CAAA;IACpB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAuB,EAAE,MAAqB;IACxE,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IAC1D,OAAO,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;AAC3C,CAAC;AAED,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAE7B,QAAQ;IACR,MAAM;IAFjB,YACW,QAAgB,EAChB,MAAc;QAEvB,KAAK,CAAC,WAAW,QAAQ,YAAY,MAAM,EAAE,CAAC,CAAA;wBAHrC,QAAQ;sBACR,MAAM;QAGf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ import type { BlockRepository, ObservabilityConnectionRepository, ObservabilityProviderKind, ReleaseEvidence, ReleaseHealthConfigRecord, ReleaseHealthConfigRepository, ReleaseHealthProvider, ReleaseHealthReport, ReleaseSignal, SecretCipher } from '@cat-factory/kernel';
2
+ /**
3
+ * A single observability vendor's reads, built from its already-decrypted credentials.
4
+ * The composite owns everything vendor-neutral (connection loading + decryption, config
5
+ * resolution up the frame chain, the verdict reduction); an adapter just turns a config
6
+ * into signals + recent errors for its vendor.
7
+ */
8
+ export interface ObservabilityAdapter {
9
+ readSignals(config: ReleaseHealthConfigRecord, since: number): Promise<ReleaseSignal[]>;
10
+ recentErrors(config: ReleaseHealthConfigRecord, since: number): Promise<ReleaseEvidence['errors']>;
11
+ }
12
+ /** Builds an adapter from decrypted credentials. Registered per provider kind. */
13
+ export type ObservabilityAdapterFactory = (credentials: unknown, opts: {
14
+ fetchImpl?: typeof fetch;
15
+ }) => ObservabilityAdapter;
16
+ /** The set of observability providers a facade can serve. */
17
+ export type ObservabilityProviderRegistry = Partial<Record<ObservabilityProviderKind, ObservabilityAdapterFactory>>;
18
+ export interface RegistryReleaseHealthProviderDependencies {
19
+ observabilityConnectionRepository: ObservabilityConnectionRepository;
20
+ releaseHealthConfigRepository: ReleaseHealthConfigRepository;
21
+ /** Resolves the service-frame config when a task block has none of its own. */
22
+ blockRepository: BlockRepository;
23
+ /** Decrypts the workspace's sealed credentials blob at call time. */
24
+ secretCipher: SecretCipher;
25
+ /** The provider adapters this facade can build. */
26
+ registry: ObservabilityProviderRegistry;
27
+ /** Override fetch (tests). */
28
+ fetchImpl?: typeof fetch;
29
+ }
30
+ /**
31
+ * The pluggable `ReleaseHealthProvider` the post-release-health gate reads: resolve the
32
+ * block's monitor/SLO config (its own, else its service frame's) → load the workspace's
33
+ * observability connection → build the matching provider adapter from its decrypted
34
+ * credentials → read each signal → reduce to a single verdict. On a regression,
35
+ * `gatherEvidence` adds the adapter's recent error groups for the on-call agent. Returns
36
+ * a `healthy`/empty report when nothing is configured (the gate passes through).
37
+ */
38
+ export declare class RegistryReleaseHealthProvider implements ReleaseHealthProvider {
39
+ private readonly deps;
40
+ constructor(deps: RegistryReleaseHealthProviderDependencies);
41
+ probe(workspaceId: string, blockId: string, since: number): Promise<ReleaseHealthReport>;
42
+ gatherEvidence(workspaceId: string, blockId: string, since: number): Promise<ReleaseEvidence>;
43
+ /** Resolve config + connection + adapter for a block. Null when unconfigured. */
44
+ private resolve;
45
+ /** A block's release-health config: its own, else its nearest ancestor frame's. */
46
+ private resolveConfig;
47
+ }
48
+ //# sourceMappingURL=RegistryReleaseHealthProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegistryReleaseHealthProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/observability/RegistryReleaseHealthProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iCAAiC,EACjC,yBAAyB,EACzB,eAAe,EACf,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,YAAY,EACb,MAAM,qBAAqB,CAAA;AAE5B;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,MAAM,EAAE,yBAAyB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;IACvF,YAAY,CAAC,MAAM,EAAE,yBAAyB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAA;CACnG;AAED,kFAAkF;AAClF,MAAM,MAAM,2BAA2B,GAAG,CACxC,WAAW,EAAE,OAAO,EACpB,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAE,KAC/B,oBAAoB,CAAA;AAEzB,6DAA6D;AAC7D,MAAM,MAAM,6BAA6B,GAAG,OAAO,CACjD,MAAM,CAAC,yBAAyB,EAAE,2BAA2B,CAAC,CAC/D,CAAA;AAED,MAAM,WAAW,yCAAyC;IACxD,iCAAiC,EAAE,iCAAiC,CAAA;IACpE,6BAA6B,EAAE,6BAA6B,CAAA;IAC5D,+EAA+E;IAC/E,eAAe,EAAE,eAAe,CAAA;IAChC,qEAAqE;IACrE,YAAY,EAAE,YAAY,CAAA;IAC1B,mDAAmD;IACnD,QAAQ,EAAE,6BAA6B,CAAA;IACvC,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED;;;;;;;GAOG;AACH,qBAAa,6BAA8B,YAAW,qBAAqB;IAC7D,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,yCAAyC,EAAI;IAE1E,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAU7F;IAEK,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CAc1B;IAED,iFAAiF;YACnE,OAAO;IAmBrB,mFAAmF;YACrE,aAAa;CAiB5B"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * The pluggable `ReleaseHealthProvider` the post-release-health gate reads: resolve the
3
+ * block's monitor/SLO config (its own, else its service frame's) → load the workspace's
4
+ * observability connection → build the matching provider adapter from its decrypted
5
+ * credentials → read each signal → reduce to a single verdict. On a regression,
6
+ * `gatherEvidence` adds the adapter's recent error groups for the on-call agent. Returns
7
+ * a `healthy`/empty report when nothing is configured (the gate passes through).
8
+ */
9
+ export class RegistryReleaseHealthProvider {
10
+ deps;
11
+ constructor(deps) {
12
+ this.deps = deps;
13
+ }
14
+ async probe(workspaceId, blockId, since) {
15
+ const resolved = await this.resolve(workspaceId, blockId);
16
+ if (!resolved)
17
+ return { status: 'healthy', signals: [] };
18
+ const { adapter, config } = resolved;
19
+ const signals = await adapter.readSignals(config, since);
20
+ if (signals.length === 0)
21
+ return { status: 'pending', signals };
22
+ if (signals.some((s) => s.state === 'alert'))
23
+ return { status: 'regressed', signals };
24
+ if (signals.every((s) => s.state === 'no_data'))
25
+ return { status: 'pending', signals };
26
+ return { status: 'healthy', signals };
27
+ }
28
+ async gatherEvidence(workspaceId, blockId, since) {
29
+ const resolved = await this.resolve(workspaceId, blockId);
30
+ if (!resolved)
31
+ return { regressedSignals: [], errors: [] };
32
+ const { adapter, config } = resolved;
33
+ const signals = await adapter.readSignals(config, since);
34
+ const regressedSignals = signals.filter((s) => s.state === 'alert');
35
+ const errors = await adapter.recentErrors(config, since);
36
+ return {
37
+ regressedSignals,
38
+ errors,
39
+ notes: `Monitored ${config.monitorIds.length} monitor(s) and ${config.sloIds.length} SLO(s)${config.envTag ? ` for env ${config.envTag}` : ''}.`,
40
+ };
41
+ }
42
+ /** Resolve config + connection + adapter for a block. Null when unconfigured. */
43
+ async resolve(workspaceId, blockId) {
44
+ const config = await this.resolveConfig(workspaceId, blockId);
45
+ if (!config || (config.monitorIds.length === 0 && config.sloIds.length === 0))
46
+ return null;
47
+ const connection = await this.deps.observabilityConnectionRepository.get(workspaceId);
48
+ if (!connection)
49
+ return null;
50
+ const factory = this.deps.registry[connection.provider];
51
+ if (!factory)
52
+ return null;
53
+ const credentials = JSON.parse(await this.deps.secretCipher.decrypt(connection.credentials));
54
+ const adapter = factory(credentials, { fetchImpl: this.deps.fetchImpl });
55
+ return { adapter, config };
56
+ }
57
+ /** A block's release-health config: its own, else its nearest ancestor frame's. */
58
+ async resolveConfig(workspaceId, blockId) {
59
+ let currentId = blockId;
60
+ // Walk up the parent chain (task → module → frame), bounded against cycles.
61
+ for (let hops = 0; currentId && hops < 5; hops++) {
62
+ const config = await this.deps.releaseHealthConfigRepository.getByBlock(workspaceId, currentId);
63
+ if (config)
64
+ return config;
65
+ const block = await this.deps.blockRepository.get(workspaceId, currentId);
66
+ currentId = block?.parentId ?? null;
67
+ }
68
+ return null;
69
+ }
70
+ }
71
+ //# sourceMappingURL=RegistryReleaseHealthProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegistryReleaseHealthProvider.js","sourceRoot":"","sources":["../../../src/modules/observability/RegistryReleaseHealthProvider.ts"],"names":[],"mappings":"AAgDA;;;;;;;GAOG;AACH,MAAM,OAAO,6BAA6B;IACX,IAAI;IAAjC,YAA6B,IAA+C;oBAA/C,IAAI;IAA8C,CAAC;IAEhF,KAAK,CAAC,KAAK,CAAC,WAAmB,EAAE,OAAe,EAAE,KAAa;QAC7D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QACzD,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;QACxD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAA;QAEpC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;QAC/D,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAA;QACrF,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;QACtF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,WAAmB,EACnB,OAAe,EACf,KAAa;QAEb,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QACzD,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;QAC1D,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAA;QAEpC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACxD,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAA;QACnE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAExD,OAAO;YACL,gBAAgB;YAChB,MAAM;YACN,KAAK,EAAE,aAAa,MAAM,CAAC,UAAU,CAAC,MAAM,mBAAmB,MAAM,CAAC,MAAM,CAAC,MAAM,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;SACjJ,CAAA;IACH,CAAC;IAED,iFAAiF;IACzE,KAAK,CAAC,OAAO,CACnB,WAAmB,EACnB,OAAe;QAEf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QAC7D,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QAE1F,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,iCAAiC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACrF,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAA;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QACvD,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QAEzB,MAAM,WAAW,GAAY,IAAI,CAAC,KAAK,CACrC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAC7D,CAAA;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QACxE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;IAC5B,CAAC;IAED,mFAAmF;IAC3E,KAAK,CAAC,aAAa,CACzB,WAAmB,EACnB,OAAe;QAEf,IAAI,SAAS,GAAkB,OAAO,CAAA;QACtC,4EAA4E;QAC5E,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,SAAS,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,UAAU,CACrE,WAAW,EACX,SAAS,CACV,CAAA;YACD,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAA;YACzB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;YACzE,SAAS,GAAG,KAAK,EAAE,QAAQ,IAAI,IAAI,CAAA;QACrC,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { ObservabilityProviderRegistry } from './RegistryReleaseHealthProvider.js';
2
+ /**
3
+ * The observability providers a facade can serve. Datadog is the only adapter today;
4
+ * adding a vendor is a new entry here (+ its adapter + credential shape) — the gate, the
5
+ * service, the routes and the persistence are all vendor-neutral around it.
6
+ *
7
+ * Each factory validates its decrypted credentials blob at this boundary (rather than
8
+ * blind-casting), so a drifted/corrupted row fails with a clear error here instead of
9
+ * deep inside the vendor client during a live probe.
10
+ */
11
+ export declare const defaultObservabilityRegistry: ObservabilityProviderRegistry;
12
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/modules/observability/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAA;AAEvF;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,EAAE,6BAG1C,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { parseDatadogCredentials } from '@cat-factory/contracts';
2
+ import { DatadogObservabilityAdapter } from '../datadog/DatadogObservabilityAdapter.js';
3
+ /**
4
+ * The observability providers a facade can serve. Datadog is the only adapter today;
5
+ * adding a vendor is a new entry here (+ its adapter + credential shape) — the gate, the
6
+ * service, the routes and the persistence are all vendor-neutral around it.
7
+ *
8
+ * Each factory validates its decrypted credentials blob at this boundary (rather than
9
+ * blind-casting), so a drifted/corrupted row fails with a clear error here instead of
10
+ * deep inside the vendor client during a live probe.
11
+ */
12
+ export const defaultObservabilityRegistry = {
13
+ datadog: (credentials, opts) => new DatadogObservabilityAdapter(parseDatadogCredentials(credentials), opts),
14
+ };
15
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/modules/observability/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAA;AAGvF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAkC;IACzE,OAAO,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAC7B,IAAI,2BAA2B,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;CAC9E,CAAA"}
@@ -1,19 +1,42 @@
1
1
  import type { Clock } from '@cat-factory/kernel';
2
2
  import type { TaskConnectionRecord, TaskConnectionRepository } from '@cat-factory/kernel';
3
+ import type { TaskSourceSettingsRepository } from '@cat-factory/kernel';
4
+ import type { GitHubInstallationRepository } from '@cat-factory/kernel';
3
5
  import type { TaskSourceRegistry } from '@cat-factory/kernel';
4
- import type { TaskConnection, TaskSourceDescriptor, TaskSourceKind } from '@cat-factory/kernel';
6
+ import type { TaskConnection, TaskSourceKind, TaskSourceState } from '@cat-factory/kernel';
5
7
  import type { WorkspaceRepository } from '@cat-factory/kernel';
6
8
  export interface TaskConnectionServiceDependencies {
7
9
  taskConnectionRepository: TaskConnectionRepository;
10
+ /** Per-workspace on/off toggle for each source (absent row ⇒ enabled). */
11
+ taskSourceSettingsRepository: TaskSourceSettingsRepository;
8
12
  registry: TaskSourceRegistry;
9
13
  workspaceRepository: WorkspaceRepository;
10
14
  clock: Clock;
15
+ /**
16
+ * Resolves the workspace's installed GitHub App, used to decide whether the
17
+ * credentialless GitHub Issues source is available (it rides that App). Absent
18
+ * when the GitHub integration isn't wired, in which case GitHub Issues — if its
19
+ * provider is even registered — is reported unavailable.
20
+ */
21
+ installations?: GitHubInstallationRepository;
11
22
  }
12
23
  export declare class TaskConnectionService {
13
24
  private readonly deps;
14
25
  constructor(deps: TaskConnectionServiceDependencies);
15
- /** The descriptors of every configured source (drives the connect UI). */
16
- listSources(): TaskSourceDescriptor[];
26
+ /**
27
+ * Every configured source with the workspace's live state for it (drives the
28
+ * settings + import UI): each source's descriptor plus whether it is available
29
+ * now and whether the workspace has it enabled. Availability is connection
30
+ * presence for credentialed sources, and the installed GitHub App for the
31
+ * credentialless GitHub Issues source.
32
+ */
33
+ listSourceStates(workspaceId: string): Promise<TaskSourceState[]>;
34
+ /** Whether a source can be used right now (drives the import gate + the UI toggle's enablement). */
35
+ private isAvailable;
36
+ /** The workspace's toggle for a source (defaults to enabled when no row exists). */
37
+ isEnabled(workspaceId: string, source: TaskSourceKind): Promise<boolean>;
38
+ /** Enable or disable a source for the workspace (the per-workspace toggle). */
39
+ setEnabled(workspaceId: string, source: TaskSourceKind, enabled: boolean): Promise<void>;
17
40
  /** Resolve a provider for a source or throw if that source isn't configured. */
18
41
  private requireProvider;
19
42
  /** Connect (or re-connect) a workspace to a task source. */
@@ -1 +1 @@
1
- {"version":3,"file":"TaskConnectionService.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/TaskConnectionService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAG/F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAQ9D,MAAM,WAAW,iCAAiC;IAChD,wBAAwB,EAAE,wBAAwB,CAAA;IAClD,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,mBAAmB,EAAE,mBAAmB,CAAA;IACxC,KAAK,EAAE,KAAK,CAAA;CACb;AAUD,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,iCAAiC,EAAI;IAExE,0EAA0E;IAC1E,WAAW,IAAI,oBAAoB,EAAE,CAEpC;IAED,gFAAgF;IAChF,OAAO,CAAC,eAAe;IAMvB,4DAA4D;IACtD,OAAO,CACX,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,cAAc,CAAC,CAezB;IAED,iFAAiF;IAC3E,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAG/F;IAED,iEAAiE;IAC3D,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAGpE;IAED,gFAAgF;IAC1E,iBAAiB,CACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAM/B;IAED,qEAAqE;IAC/D,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3E;CACF"}
1
+ {"version":3,"file":"TaskConnectionService.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/TaskConnectionService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AACzF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,KAAK,EAAsB,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAG1F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAQ9D,MAAM,WAAW,iCAAiC;IAChD,wBAAwB,EAAE,wBAAwB,CAAA;IAClD,0EAA0E;IAC1E,4BAA4B,EAAE,4BAA4B,CAAA;IAC1D,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,mBAAmB,EAAE,mBAAmB,CAAA;IACxC,KAAK,EAAE,KAAK,CAAA;IACZ;;;;;OAKG;IACH,aAAa,CAAC,EAAE,4BAA4B,CAAA;CAC7C;AA+BD,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,iCAAiC,EAAI;IAExE;;;;;;OAMG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAatE;IAED,oGAAoG;YACtF,WAAW;IAWzB,oFAAoF;IAC9E,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAG7E;IAED,+EAA+E;IACzE,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7F;IAED,gFAAgF;IAChF,OAAO,CAAC,eAAe;IAMvB,4DAA4D;IACtD,OAAO,CACX,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,cAAc,CAAC,CAsBzB;IAED,iFAAiF;IAC3E,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAG/F;IAED,iEAAiE;IAC3D,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAGpE;IAED,gFAAgF;IAC1E,iBAAiB,CACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAM/B;IAED,qEAAqE;IAC/D,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3E;CACF"}
@@ -1,5 +1,24 @@
1
1
  import { ConflictError, ValidationError } from '@cat-factory/kernel';
2
2
  import { requireWorkspace } from '@cat-factory/kernel';
3
+ /**
4
+ * A credentialless provider carries no connection to make: there are no credential
5
+ * fields to fill in. Today the only such provider is GitHub Issues, which rides the
6
+ * workspace's installed GitHub App. `connect()` and the import credential resolver
7
+ * use this to skip the connection lookup; it does NOT by itself decide availability
8
+ * (see `isAvailable`, where the App-presence check is keyed on the GitHub source).
9
+ */
10
+ function isCredentialless(provider) {
11
+ return provider.descriptor.credentialFields.length === 0;
12
+ }
13
+ /**
14
+ * The credentialless source whose availability is the installed GitHub App's
15
+ * presence. Keyed on the source kind (not just "is credentialless") so a future
16
+ * credentialless source with a different out-of-band auth path is forced to add its
17
+ * own availability branch rather than silently inheriting the App check.
18
+ */
19
+ function ridesGitHubApp(provider) {
20
+ return provider.kind === 'github' && isCredentialless(provider);
21
+ }
3
22
  function toConnection(record) {
4
23
  return {
5
24
  source: record.source,
@@ -12,9 +31,47 @@ export class TaskConnectionService {
12
31
  constructor(deps) {
13
32
  this.deps = deps;
14
33
  }
15
- /** The descriptors of every configured source (drives the connect UI). */
16
- listSources() {
17
- return this.deps.registry.list().map((p) => p.descriptor);
34
+ /**
35
+ * Every configured source with the workspace's live state for it (drives the
36
+ * settings + import UI): each source's descriptor plus whether it is available
37
+ * now and whether the workspace has it enabled. Availability is connection
38
+ * presence for credentialed sources, and the installed GitHub App for the
39
+ * credentialless GitHub Issues source.
40
+ */
41
+ async listSourceStates(workspaceId) {
42
+ const settings = await this.deps.taskSourceSettingsRepository.getByWorkspace(workspaceId);
43
+ const enabledBySource = new Map(settings.map((s) => [s.source, s.enabled]));
44
+ const states = [];
45
+ for (const provider of this.deps.registry.list()) {
46
+ states.push({
47
+ ...provider.descriptor,
48
+ available: await this.isAvailable(workspaceId, provider),
49
+ // No row ⇒ default enabled, so a source is offered as soon as it's available.
50
+ enabled: enabledBySource.get(provider.kind) ?? true,
51
+ });
52
+ }
53
+ return states;
54
+ }
55
+ /** Whether a source can be used right now (drives the import gate + the UI toggle's enablement). */
56
+ async isAvailable(workspaceId, provider) {
57
+ if (ridesGitHubApp(provider)) {
58
+ // GitHub Issues rides the workspace's installed GitHub App: available once installed.
59
+ if (!this.deps.installations)
60
+ return false;
61
+ return (await this.deps.installations.getByWorkspace(workspaceId)) !== null;
62
+ }
63
+ return ((await this.deps.taskConnectionRepository.getByWorkspace(workspaceId, provider.kind)) !== null);
64
+ }
65
+ /** The workspace's toggle for a source (defaults to enabled when no row exists). */
66
+ async isEnabled(workspaceId, source) {
67
+ const row = await this.deps.taskSourceSettingsRepository.get(workspaceId, source);
68
+ return row?.enabled ?? true;
69
+ }
70
+ /** Enable or disable a source for the workspace (the per-workspace toggle). */
71
+ async setEnabled(workspaceId, source, enabled) {
72
+ await requireWorkspace(this.deps.workspaceRepository, workspaceId);
73
+ this.requireProvider(source);
74
+ await this.deps.taskSourceSettingsRepository.upsert({ workspaceId, source, enabled });
18
75
  }
19
76
  /** Resolve a provider for a source or throw if that source isn't configured. */
20
77
  requireProvider(source) {
@@ -27,6 +84,11 @@ export class TaskConnectionService {
27
84
  async connect(workspaceId, source, credentials) {
28
85
  await requireWorkspace(this.deps.workspaceRepository, workspaceId);
29
86
  const provider = this.requireProvider(source);
87
+ if (isCredentialless(provider)) {
88
+ // A credentialless source has no connection to make: it rides the workspace's
89
+ // installed GitHub App and is toggled via setEnabled, not connected.
90
+ throw new ValidationError(`The ${source} source has no connection to configure; it uses the workspace's installed GitHub App. Enable or disable it instead.`);
91
+ }
30
92
  const normalized = provider.normalizeConnection(credentials);
31
93
  const existing = await this.deps.taskConnectionRepository.getByWorkspace(workspaceId, source);
32
94
  const record = {
@@ -1 +1 @@
1
- {"version":3,"file":"TaskConnectionService.js","sourceRoot":"","sources":["../../../src/modules/tasks/TaskConnectionService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TaskConnectionService.js","sourceRoot":"","sources":["../../../src/modules/tasks/TaskConnectionService.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,14 @@ export declare class TaskImportService {
17
17
  private readonly deps;
18
18
  constructor(deps: TaskImportServiceDependencies);
19
19
  private requireProvider;
20
+ /**
21
+ * Enforce the workspace's toggle and resolve the credentials to authenticate
22
+ * with. A disabled source is refused (it isn't offered, so neither import nor
23
+ * search may run against it). A credentialless source (GitHub Issues) needs no
24
+ * stored connection — it rides the workspace's installed GitHub App — so it
25
+ * authenticates with an empty bag; a credentialed source requires a connection.
26
+ */
27
+ private resolveCredentials;
20
28
  /** Fetch an issue (by key or URL) and upsert its projection; returns the issue. */
21
29
  import(workspaceId: string, source: TaskSourceKind, ref: string): Promise<SourceTask>;
22
30
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"TaskImportService.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/TaskImportService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAGvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AASvE,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,cAAc,EAAE,cAAc,CAAA;IAC9B,iBAAiB,EAAE,qBAAqB,CAAA;IACxC,mBAAmB,EAAE,mBAAmB,CAAA;IACxC,KAAK,EAAE,KAAK,CAAA;CACb;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAiB3D;AAED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,6BAA6B,EAAI;IAEpE,OAAO,CAAC,eAAe;IAMvB,mFAAmF;IAC7E,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAgC1F;IAED;;;;;OAKG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAQ7B;IAED,+EAA+E;IACzE,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAG1D;IAED,6DAA6D;IACvD,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC,CAMrB;CACF"}
1
+ {"version":3,"file":"TaskImportService.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/TaskImportService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,KAAK,EAAuC,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAClG,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAGvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AASvE,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,cAAc,EAAE,cAAc,CAAA;IAC9B,iBAAiB,EAAE,qBAAqB,CAAA;IACxC,mBAAmB,EAAE,mBAAmB,CAAA;IACxC,KAAK,EAAE,KAAK,CAAA;CACb;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAiB3D;AAED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,6BAA6B,EAAI;IAEpE,OAAO,CAAC,eAAe;IAMvB;;;;;;OAMG;YACW,kBAAkB;IAahC,mFAAmF;IAC7E,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAgC1F;IAED;;;;;OAKG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAQ7B;IAED,+EAA+E;IACzE,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAG1D;IAED,6DAA6D;IACvD,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC,CAMrB;CACF"}
@@ -1,4 +1,4 @@
1
- import { ValidationError } from '@cat-factory/kernel';
1
+ import { ConflictError, ValidationError } from '@cat-factory/kernel';
2
2
  import { requireWorkspace } from '@cat-factory/kernel';
3
3
  import { buildTaskExcerpt } from './tasks.logic.js';
4
4
  /** Project a stored task record onto the wire shape (drops the tombstone). */
@@ -31,6 +31,22 @@ export class TaskImportService {
31
31
  throw new ValidationError(`Unknown or unconfigured task source '${source}'`);
32
32
  return provider;
33
33
  }
34
+ /**
35
+ * Enforce the workspace's toggle and resolve the credentials to authenticate
36
+ * with. A disabled source is refused (it isn't offered, so neither import nor
37
+ * search may run against it). A credentialless source (GitHub Issues) needs no
38
+ * stored connection — it rides the workspace's installed GitHub App — so it
39
+ * authenticates with an empty bag; a credentialed source requires a connection.
40
+ */
41
+ async resolveCredentials(workspaceId, source, provider) {
42
+ if (!(await this.deps.connectionService.isEnabled(workspaceId, source))) {
43
+ throw new ConflictError(`The ${source} task source is disabled for this workspace`);
44
+ }
45
+ if (provider.descriptor.credentialFields.length === 0)
46
+ return {};
47
+ const connection = await this.deps.connectionService.requireConnection(workspaceId, source);
48
+ return connection.credentials;
49
+ }
34
50
  /** Fetch an issue (by key or URL) and upsert its projection; returns the issue. */
35
51
  async import(workspaceId, source, ref) {
36
52
  await requireWorkspace(this.deps.workspaceRepository, workspaceId);
@@ -39,8 +55,8 @@ export class TaskImportService {
39
55
  if (!externalId) {
40
56
  throw new ValidationError(`Could not resolve a ${source} issue key from '${ref}'`);
41
57
  }
42
- const connection = await this.deps.connectionService.requireConnection(workspaceId, source);
43
- const content = await provider.fetchTask(connection.credentials, externalId);
58
+ const credentials = await this.resolveCredentials(workspaceId, source, provider);
59
+ const content = await provider.fetchTask(credentials, externalId);
44
60
  // Preserve any existing block link across a re-import.
45
61
  const existing = await this.deps.taskRepository.get(workspaceId, source, content.externalId);
46
62
  const record = {
@@ -76,8 +92,8 @@ export class TaskImportService {
76
92
  if (!provider.search) {
77
93
  throw new ValidationError(`The ${source} source does not support search`);
78
94
  }
79
- const connection = await this.deps.connectionService.requireConnection(workspaceId, source);
80
- return provider.search(connection.credentials, query, workspaceId);
95
+ const credentials = await this.resolveCredentials(workspaceId, source, provider);
96
+ return provider.search(credentials, query, workspaceId);
81
97
  }
82
98
  /** Every issue imported into the workspace, across sources, as wire shapes. */
83
99
  async listTasks(workspaceId) {
@@ -1 +1 @@
1
- {"version":3,"file":"TaskImportService.js","sourceRoot":"","sources":["../../../src/modules/tasks/TaskImportService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TaskImportService.js","sourceRoot":"","sources":["../../../src/modules/tasks/TaskImportService.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/integrations",
3
- "version": "0.8.3",
3
+ "version": "0.10.0",
4
4
  "description": "External-system integration domain logic for the Agent Architecture Board (GitHub, documents, tasks, environments, runners).",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,8 +25,8 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "ai": "^6.0.209",
28
- "@cat-factory/contracts": "0.11.0",
29
- "@cat-factory/kernel": "0.11.1"
28
+ "@cat-factory/contracts": "0.13.0",
29
+ "@cat-factory/kernel": "0.13.0"
30
30
  },
31
31
  "devDependencies": {
32
32
  "typescript": "7.0.1-rc",
@@ -1,30 +0,0 @@
1
- import type { BlockRepository, DatadogConnectionRepository, ReleaseEvidence, ReleaseHealthConfigRepository, ReleaseHealthProvider, ReleaseHealthReport, SecretCipher } from '@cat-factory/kernel';
2
- export interface DatadogReleaseHealthProviderDependencies {
3
- datadogConnectionRepository: DatadogConnectionRepository;
4
- releaseHealthConfigRepository: ReleaseHealthConfigRepository;
5
- /** Resolves the service-frame config when a task block has none of its own. */
6
- blockRepository: BlockRepository;
7
- /** Decrypts the workspace's Datadog API/app keys at call time. */
8
- secretCipher: SecretCipher;
9
- /** Override fetch (tests). */
10
- fetchImpl?: typeof fetch;
11
- }
12
- /**
13
- * Reads a block's release health from Datadog for the post-release-health gate:
14
- * resolve the block's monitor/SLO config (its own, else its service frame's) → read
15
- * each monitor's state + each SLO's SLI-vs-target → reduce to a single verdict. On a
16
- * regression, `gatherEvidence` adds recent error-log groups for the on-call agent.
17
- * Returns a `healthy`/empty report when nothing is configured (the gate passes through).
18
- */
19
- export declare class DatadogReleaseHealthProvider implements ReleaseHealthProvider {
20
- private readonly deps;
21
- constructor(deps: DatadogReleaseHealthProviderDependencies);
22
- probe(workspaceId: string, blockId: string, since: number): Promise<ReleaseHealthReport>;
23
- gatherEvidence(workspaceId: string, blockId: string, since: number): Promise<ReleaseEvidence>;
24
- /** Resolve the connection + config for a block, building a client. Null when unconfigured. */
25
- private resolve;
26
- /** A block's release-health config: its own, else its nearest ancestor frame's. */
27
- private resolveConfig;
28
- private readSignals;
29
- }
30
- //# sourceMappingURL=DatadogReleaseHealthProvider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DatadogReleaseHealthProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/datadog/DatadogReleaseHealthProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,2BAA2B,EAC3B,eAAe,EAEf,6BAA6B,EAC7B,qBAAqB,EACrB,mBAAmB,EAEnB,YAAY,EACb,MAAM,qBAAqB,CAAA;AAI5B,MAAM,WAAW,wCAAwC;IACvD,2BAA2B,EAAE,2BAA2B,CAAA;IACxD,6BAA6B,EAAE,6BAA6B,CAAA;IAC5D,+EAA+E;IAC/E,eAAe,EAAE,eAAe,CAAA;IAChC,kEAAkE;IAClE,YAAY,EAAE,YAAY,CAAA;IAC1B,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED;;;;;;GAMG;AACH,qBAAa,4BAA6B,YAAW,qBAAqB;IAC5D,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,wCAAwC,EAAI;IAEzE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAU7F;IAEK,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CAuB1B;IAED,8FAA8F;YAChF,OAAO;IAoBrB,mFAAmF;YACrE,aAAa;YAkBb,WAAW;CA+B1B"}
@@ -1,101 +0,0 @@
1
- import { DatadogClient } from './DatadogClient.js';
2
- import { mapMonitorState, mapSloState } from './datadog.logic.js';
3
- /**
4
- * Reads a block's release health from Datadog for the post-release-health gate:
5
- * resolve the block's monitor/SLO config (its own, else its service frame's) → read
6
- * each monitor's state + each SLO's SLI-vs-target → reduce to a single verdict. On a
7
- * regression, `gatherEvidence` adds recent error-log groups for the on-call agent.
8
- * Returns a `healthy`/empty report when nothing is configured (the gate passes through).
9
- */
10
- export class DatadogReleaseHealthProvider {
11
- deps;
12
- constructor(deps) {
13
- this.deps = deps;
14
- }
15
- async probe(workspaceId, blockId, since) {
16
- const resolved = await this.resolve(workspaceId, blockId);
17
- if (!resolved)
18
- return { status: 'healthy', signals: [] };
19
- const { client, config } = resolved;
20
- const signals = await this.readSignals(client, config, since);
21
- if (signals.length === 0)
22
- return { status: 'pending', signals };
23
- if (signals.some((s) => s.state === 'alert'))
24
- return { status: 'regressed', signals };
25
- if (signals.every((s) => s.state === 'no_data'))
26
- return { status: 'pending', signals };
27
- return { status: 'healthy', signals };
28
- }
29
- async gatherEvidence(workspaceId, blockId, since) {
30
- const resolved = await this.resolve(workspaceId, blockId);
31
- if (!resolved)
32
- return { regressedSignals: [], errors: [] };
33
- const { client, config } = resolved;
34
- const signals = await this.readSignals(client, config, since);
35
- const regressedSignals = signals.filter((s) => s.state === 'alert');
36
- // Pull recent error logs scoped to the env (when configured), best-effort, over the
37
- // window [since, now].
38
- const query = config.envTag ? `status:error env:${config.envTag}` : 'status:error';
39
- const ddErrors = await client.recentErrorLogs(query, since, Date.now());
40
- const errors = ddErrors.map((e) => ({
41
- title: e.title,
42
- count: e.count,
43
- sampleMessage: e.sampleMessage,
44
- }));
45
- return {
46
- regressedSignals,
47
- errors,
48
- notes: `Monitored ${config.monitorIds.length} monitor(s) and ${config.sloIds.length} SLO(s)${config.envTag ? ` for env ${config.envTag}` : ''}.`,
49
- };
50
- }
51
- /** Resolve the connection + config for a block, building a client. Null when unconfigured. */
52
- async resolve(workspaceId, blockId) {
53
- const config = await this.resolveConfig(workspaceId, blockId);
54
- if (!config || (config.monitorIds.length === 0 && config.sloIds.length === 0))
55
- return null;
56
- const connection = await this.deps.datadogConnectionRepository.get(workspaceId);
57
- if (!connection)
58
- return null;
59
- const [apiKey, appKey] = await Promise.all([
60
- this.deps.secretCipher.decrypt(connection.apiKey),
61
- this.deps.secretCipher.decrypt(connection.appKey),
62
- ]);
63
- const client = new DatadogClient({ site: connection.site, apiKey, appKey }, { fetchImpl: this.deps.fetchImpl });
64
- return { client, config };
65
- }
66
- /** A block's release-health config: its own, else its nearest ancestor frame's. */
67
- async resolveConfig(workspaceId, blockId) {
68
- let currentId = blockId;
69
- // Walk up the parent chain (task → module → frame), bounded against cycles.
70
- for (let hops = 0; currentId && hops < 5; hops++) {
71
- const config = await this.deps.releaseHealthConfigRepository.getByBlock(workspaceId, currentId);
72
- if (config)
73
- return config;
74
- const block = await this.deps.blockRepository.get(workspaceId, currentId);
75
- currentId = block?.parentId ?? null;
76
- }
77
- return null;
78
- }
79
- async readSignals(client, config, since) {
80
- const now = Date.now();
81
- const fromTs = Math.floor(since / 1000);
82
- const toTs = Math.floor(now / 1000);
83
- const monitors = await Promise.all(config.monitorIds.map(async (id) => {
84
- const m = await client.getMonitor(id);
85
- // Attribute the alert to THIS release: a monitor already alerting before the
86
- // release marker (`since`) is a pre-existing incident, not this PR's regression.
87
- const state = mapMonitorState(m.overallState, { stateModifiedMs: m.stateModifiedMs, since });
88
- return { kind: 'monitor', id, name: m.name, state };
89
- }));
90
- const slos = await Promise.all(config.sloIds.map(async (id) => {
91
- const s = await client.getSloState(id, fromTs, toTs);
92
- const state = mapSloState(s.sliValue, s.target);
93
- const detail = s.sliValue !== null && s.target !== null
94
- ? `SLI ${s.sliValue.toFixed(2)} vs target ${s.target}`
95
- : undefined;
96
- return { kind: 'slo', id, name: s.name, state, detail };
97
- }));
98
- return [...monitors, ...slos];
99
- }
100
- }
101
- //# sourceMappingURL=DatadogReleaseHealthProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DatadogReleaseHealthProvider.js","sourceRoot":"","sources":["../../../src/modules/datadog/DatadogReleaseHealthProvider.ts"],"names":[],"mappings":"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"}