@claudexor/gateway 1.0.1 → 2.1.2

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.
@@ -0,0 +1,44 @@
1
+ import { type ControlAuthReadinessRefreshResponse as AuthReadinessRefreshResponse } from "@claudexor/schema";
2
+ import type { HarnessGateway } from "./gateway.js";
3
+ export type AuthReadinessServiceErrorCode = "unknown_harness" | "auth_source_evidence_missing" | "auth_readiness_probe_failed";
4
+ /**
5
+ * Typed service failure designed to project directly to the control plane's
6
+ * application/problem+json boundary. No transport-specific response logic
7
+ * belongs in this domain service.
8
+ */
9
+ export declare class AuthReadinessServiceError extends Error {
10
+ readonly code: AuthReadinessServiceErrorCode;
11
+ readonly status: 404 | 502 | 503;
12
+ readonly retryable: boolean;
13
+ readonly requiredActions: string[];
14
+ readonly evidenceRefs: string[];
15
+ readonly fieldErrors: Record<string, string[]>;
16
+ constructor(code: AuthReadinessServiceErrorCode, status: 404 | 502 | 503, message: string, retryable: boolean, requiredActions?: string[], evidenceRefs?: string[]);
17
+ }
18
+ export interface AuthReadinessServiceOptions {
19
+ /** Stable daemon-owned no-project root used by every no-project doctor probe. */
20
+ cwd: string;
21
+ now?: () => Date;
22
+ }
23
+ /**
24
+ * Exact auth-readiness application service.
25
+ *
26
+ * It deliberately does not call discovery or aggregate status: one request
27
+ * probes exactly one adapter/source. The surrounding invalidations remove all
28
+ * cached variants for that adapter, including stale project-scoped aggregate
29
+ * reports, because a native login changes global harness state rather than one
30
+ * repository's state. Unrelated harness evidence remains cached. Fresh probes
31
+ * themselves never seed the shared cache.
32
+ */
33
+ export declare class AuthReadinessService {
34
+ private readonly gateway;
35
+ private readonly cwd;
36
+ private readonly now;
37
+ constructor(gateway: HarnessGateway, options: AuthReadinessServiceOptions);
38
+ /** Invalidate every cwd/source projection for one adapter only. */
39
+ invalidate(harnessIdInput: string): void;
40
+ refresh(harnessIdInput: string, input: unknown, runtime?: {
41
+ abortSignal?: AbortSignal;
42
+ }): Promise<AuthReadinessRefreshResponse>;
43
+ }
44
+ //# sourceMappingURL=auth-readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-readiness.d.ts","sourceRoot":"","sources":["../src/auth-readiness.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,mCAAmC,IAAI,4BAA4B,EACzE,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,MAAM,6BAA6B,GACvC,iBAAiB,GAAG,8BAA8B,GAAG,6BAA6B,CAAC;AAErF;;;;GAIG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IAIhD,QAAQ,CAAC,IAAI,EAAE,6BAA6B;IAC5C,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG;IAEhC,QAAQ,CAAC,SAAS,EAAE,OAAO;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE;IARjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAM;gBAGzC,IAAI,EAAE,6BAA6B,EACnC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAChC,OAAO,EAAE,MAAM,EACN,SAAS,EAAE,OAAO,EAClB,eAAe,GAAE,MAAM,EAAO,EAC9B,YAAY,GAAE,MAAM,EAAO;CAKvC;AAED,MAAM,WAAW,2BAA2B;IAC1C,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,qBAAa,oBAAoB;IAK7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;gBAGd,OAAO,EAAE,cAAc,EACxC,OAAO,EAAE,2BAA2B;IAStC,mEAAmE;IACnE,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAKlC,OAAO,CACX,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,OAAO,EACd,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,WAAW,CAAA;KAAO,GAC1C,OAAO,CAAC,4BAA4B,CAAC;CAuDzC"}
@@ -0,0 +1,90 @@
1
+ import { isAbsolute } from "node:path";
2
+ import { invalidateDoctorCache } from "@claudexor/core";
3
+ import { ControlAuthReadinessRefreshRequest, ControlAuthReadinessRefreshResponse, Id, } from "@claudexor/schema";
4
+ /**
5
+ * Typed service failure designed to project directly to the control plane's
6
+ * application/problem+json boundary. No transport-specific response logic
7
+ * belongs in this domain service.
8
+ */
9
+ export class AuthReadinessServiceError extends Error {
10
+ code;
11
+ status;
12
+ retryable;
13
+ requiredActions;
14
+ evidenceRefs;
15
+ fieldErrors = {};
16
+ constructor(code, status, message, retryable, requiredActions = [], evidenceRefs = []) {
17
+ super(message);
18
+ this.code = code;
19
+ this.status = status;
20
+ this.retryable = retryable;
21
+ this.requiredActions = requiredActions;
22
+ this.evidenceRefs = evidenceRefs;
23
+ this.name = "AuthReadinessServiceError";
24
+ }
25
+ }
26
+ /**
27
+ * Exact auth-readiness application service.
28
+ *
29
+ * It deliberately does not call discovery or aggregate status: one request
30
+ * probes exactly one adapter/source. The surrounding invalidations remove all
31
+ * cached variants for that adapter, including stale project-scoped aggregate
32
+ * reports, because a native login changes global harness state rather than one
33
+ * repository's state. Unrelated harness evidence remains cached. Fresh probes
34
+ * themselves never seed the shared cache.
35
+ */
36
+ export class AuthReadinessService {
37
+ gateway;
38
+ cwd;
39
+ now;
40
+ constructor(gateway, options) {
41
+ this.gateway = gateway;
42
+ if (!isAbsolute(options.cwd)) {
43
+ throw new TypeError("auth readiness service cwd must be absolute");
44
+ }
45
+ this.cwd = options.cwd;
46
+ this.now = options.now ?? (() => new Date());
47
+ }
48
+ /** Invalidate every cwd/source projection for one adapter only. */
49
+ invalidate(harnessIdInput) {
50
+ const harnessId = Id.parse(harnessIdInput);
51
+ invalidateDoctorCache({ adapterId: harnessId });
52
+ }
53
+ async refresh(harnessIdInput, input, runtime = {}) {
54
+ const harnessId = Id.parse(harnessIdInput);
55
+ const request = ControlAuthReadinessRefreshRequest.parse(input);
56
+ if (!this.gateway.get(harnessId)) {
57
+ throw new AuthReadinessServiceError("unknown_harness", 404, `unknown harness '${harnessId}'`, false, ["refresh_harness_catalog"]);
58
+ }
59
+ // Invalidate both sides of the fresh probe. The second invalidation closes
60
+ // the race where an aggregate status request began before this refresh and
61
+ // populated a stale target entry while the exact probe was in flight.
62
+ this.invalidate(harnessId);
63
+ let readiness;
64
+ try {
65
+ readiness = await this.gateway.probeAuthSource(harnessId, request.source, {
66
+ cwd: this.cwd,
67
+ fresh: true,
68
+ authPreference: request.authRequest,
69
+ ...(runtime.abortSignal ? { abortSignal: runtime.abortSignal } : {}),
70
+ });
71
+ }
72
+ catch (error) {
73
+ throw new AuthReadinessServiceError("auth_readiness_probe_failed", 503, `auth readiness probe failed for harness '${harnessId}': ${error instanceof Error ? error.message : String(error)}`, true, ["retry_auth_readiness_refresh"]);
74
+ }
75
+ finally {
76
+ this.invalidate(harnessId);
77
+ }
78
+ if (!readiness) {
79
+ throw new AuthReadinessServiceError("auth_source_evidence_missing", 502, `harness '${harnessId}' returned no evidence for requested auth source '${request.source}'`, false, ["inspect_harness_doctor"]);
80
+ }
81
+ return ControlAuthReadinessRefreshResponse.parse({
82
+ harnessId,
83
+ authRequest: request.authRequest,
84
+ requestedSource: request.source,
85
+ observedAt: this.now().toISOString(),
86
+ readiness,
87
+ });
88
+ }
89
+ }
90
+ //# sourceMappingURL=auth-readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-readiness.js","sourceRoot":"","sources":["../src/auth-readiness.ts"],"names":[],"mappings":"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"}
package/dist/gateway.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { ConformanceCheck, HarnessManifest, Intent } from "@claudexor/schema";
1
+ import type { AuthSourceKind, AuthSourceReadiness, ConformanceCheck, HarnessManifest, Intent } from "@claudexor/schema";
2
2
  import type { AdapterRegistry, DoctorSpec, HarnessAdapter } from "@claudexor/core";
3
3
  export interface HarnessStatus {
4
4
  id: string;
@@ -6,9 +6,15 @@ export interface HarnessStatus {
6
6
  status: "ok" | "degraded" | "unavailable";
7
7
  manifest: HarnessManifest | null;
8
8
  enabledIntents: Intent[];
9
+ /** Intents this harness is ACTUALLY routable for right now: enabledIntents
10
+ * gated by doctor readiness (BIBLE §2 — doctor decides; a degraded or
11
+ * unauth'd harness routes NOTHING). The server-side availability truth: UI
12
+ * surfaces read this field instead of re-deriving business logic (R8). */
13
+ routableIntents: Intent[];
9
14
  disabledIntents: Intent[];
10
15
  checks: ConformanceCheck[];
11
16
  reasons: string[];
17
+ authSources: AuthSourceReadiness[];
12
18
  }
13
19
  /**
14
20
  * Wraps an adapter registry with discovery and conformance role-gating.
@@ -20,6 +26,21 @@ export declare class HarnessGateway {
20
26
  constructor(registry: AdapterRegistry);
21
27
  list(): string[];
22
28
  get(id: string): HarnessAdapter | undefined;
29
+ /**
30
+ * Probe one concrete auth source on one concrete harness. This deliberately
31
+ * bypasses discover() and every other adapter: post-login verification must
32
+ * not spend or accidentally accept an unrelated credential route.
33
+ */
34
+ probeAuthSource(harnessId: string, source: AuthSourceKind, spec: DoctorSpec): Promise<AuthSourceReadiness | null>;
35
+ /**
36
+ * Source-targeted readiness point-probe for ROUTE gating (W3.3 / TZ-1 §B):
37
+ * re-derives ONE harness's readiness in the exact resolved env/cwd its run
38
+ * will spawn with, so routing never admits a route on host-env auth truth
39
+ * the run's scoped env cannot reproduce. Discovery stays host-level
40
+ * (statusAll); this never probes unrelated adapters and never resurrects a
41
+ * harness that host discovery dropped.
42
+ */
43
+ routeStatus(harnessId: string, spec: DoctorSpec): Promise<HarnessStatus | null>;
23
44
  /**
24
45
  * Discover + conformance-probe harnesses. When `only` is given, ONLY those
25
46
  * adapters are probed (so `doctor --harness X` / `auth status X` pay one
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAInF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,aAAa,CAAC;IAC1C,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEtD,IAAI,IAAI,MAAM,EAAE;IAIhB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI3C;;;;;OAKG;IACG,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAM9D,oBAAoB;IA6BlC;;;;OAIG;IACG,YAAY,CAAC,IAAI,GAAE,UAAmC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAYlG"}
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,MAAM,EACP,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAInF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,aAAa,CAAC;IAC1C,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB;;;8EAG0E;IAC1E,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEtD,IAAI,IAAI,MAAM,EAAE;IAIhB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI3C;;;;OAIG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAStC;;;;;;;OAOG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAMrF;;;;;OAKG;IACG,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAM9D,oBAAoB;IAmClC;;;;OAIG;IACG,YAAY,CAChB,IAAI,GAAE,UAAmC,EACzC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC;CAYrB"}
package/dist/gateway.js CHANGED
@@ -16,6 +16,32 @@ export class HarnessGateway {
16
16
  get(id) {
17
17
  return this.registry.get(id);
18
18
  }
19
+ /**
20
+ * Probe one concrete auth source on one concrete harness. This deliberately
21
+ * bypasses discover() and every other adapter: post-login verification must
22
+ * not spend or accidentally accept an unrelated credential route.
23
+ */
24
+ async probeAuthSource(harnessId, source, spec) {
25
+ const adapter = this.registry.get(harnessId);
26
+ if (!adapter)
27
+ return null;
28
+ const report = (await runDoctor(new Map([[adapter.id, adapter]]), { ...spec, authSource: source }))[0];
29
+ return report?.auth_sources.find((candidate) => candidate.source === source) ?? null;
30
+ }
31
+ /**
32
+ * Source-targeted readiness point-probe for ROUTE gating (W3.3 / TZ-1 §B):
33
+ * re-derives ONE harness's readiness in the exact resolved env/cwd its run
34
+ * will spawn with, so routing never admits a route on host-env auth truth
35
+ * the run's scoped env cannot reproduce. Discovery stays host-level
36
+ * (statusAll); this never probes unrelated adapters and never resurrects a
37
+ * harness that host discovery dropped.
38
+ */
39
+ async routeStatus(harnessId, spec) {
40
+ const adapter = this.registry.get(harnessId);
41
+ if (!adapter)
42
+ return null;
43
+ return (await this.statusAllForAdapters([adapter], spec))[0] ?? null;
44
+ }
19
45
  /**
20
46
  * Discover + conformance-probe harnesses. When `only` is given, ONLY those
21
47
  * adapters are probed (so `doctor --harness X` / `auth status X` pay one
@@ -43,15 +69,18 @@ export class HarnessGateway {
43
69
  }
44
70
  const report = (await runDoctor(new Map([[adapter.id, adapter]]), spec))[0] ?? null;
45
71
  const status = report?.status ?? "unavailable";
72
+ const enabledIntents = manifest ? allowedIntents(manifest, report) : [];
46
73
  out.push({
47
74
  id: adapter.id,
48
75
  available: manifest !== null && status !== "unavailable",
49
76
  status,
50
77
  manifest,
51
- enabledIntents: manifest ? allowedIntents(manifest, report) : [],
78
+ enabledIntents,
79
+ routableIntents: status === "ok" ? enabledIntents : [],
52
80
  disabledIntents: report?.disabled_intents ?? [],
53
81
  checks: report?.checks ?? [],
54
82
  reasons: [...(discoverError ? [discoverError] : []), ...(report?.reasons ?? [])],
83
+ authSources: report?.auth_sources ?? [],
55
84
  });
56
85
  }
57
86
  return out;
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"gating.d.ts","sourceRoot":"","sources":["../src/gating.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEzG,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAWrE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,GAAG,MAAM,EAAE,CAepG"}
1
+ {"version":3,"file":"gating.d.ts","sourceRoot":"","sources":["../src/gating.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,MAAM,EACP,MAAM,mBAAmB,CAAC;AAE3B,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAWrE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,iBAAiB,GAAG,IAAI,GAC/B,MAAM,EAAE,CAiBV"}
@@ -1 +1 @@
1
- {"version":3,"file":"gating.js","sourceRoot":"","sources":["../src/gating.ts"],"names":[],"mappings":"AAEA,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,IAAyB;IACzD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACxD,IAAI,IAAI,CAAC,mBAAmB;QAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChD,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAyB,EAAE,MAAgC;IACxF,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa;QAAE,OAAO,EAAE,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,qFAAqF;QACrF,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,sEAAsE;IACtE,2EAA2E;IAC3E,gCAAgC;IAChC,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACxG,CAAC"}
1
+ {"version":3,"file":"gating.js","sourceRoot":"","sources":["../src/gating.ts"],"names":[],"mappings":"AAOA,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,IAAyB;IACzD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACxD,IAAI,IAAI,CAAC,mBAAmB;QAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChD,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAyB,EACzB,MAAgC;IAEhC,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa;QAAE,OAAO,EAAE,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,qFAAqF;QACrF,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,sEAAsE;IACtE,2EAA2E;IAC3E,gCAAgC;IAChC,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnD,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAClF,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ export * from "./auth-readiness.js";
1
2
  export * from "./gating.js";
2
3
  export * from "./gateway.js";
4
+ export * from "./readiness-presentation.js";
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,6BAA6B,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,5 @@
1
+ export * from "./auth-readiness.js";
1
2
  export * from "./gating.js";
2
3
  export * from "./gateway.js";
4
+ export * from "./readiness-presentation.js";
3
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { HarnessStatusDto, ReadinessCheckDto } from "@claudexor/schema";
2
+ export declare function normalizeReadiness(input: Pick<HarnessStatusDto, "checks" | "authSources" | "configuredModel"> & {
3
+ configuredModelCheck: {
4
+ status: "ok" | "rejected";
5
+ message?: string | null;
6
+ } | null;
7
+ }): ReadinessCheckDto[];
8
+ //# sourceMappingURL=readiness-presentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness-presentation.d.ts","sourceRoot":"","sources":["../src/readiness-presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAqE3B,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,aAAa,GAAG,iBAAiB,CAAC,GAAG;IAC5E,oBAAoB,EAAE;QAAE,MAAM,EAAE,IAAI,GAAG,UAAU,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CACrF,GACA,iBAAiB,EAAE,CAiBrB"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * THE producer of the display-ready readiness list (W4.7 sol #18): raw doctor
3
+ * probes, per-source auth readiness, and the configured-model verdict
4
+ * normalize HERE, once, into typed rows every surface renders identically.
5
+ * Classification is an explicit TABLE — never an id-substring match (the
6
+ * no-regex governance class): an adapter adding a probe id extends the table
7
+ * (pinned by a test enumerating the real adapter ids), and an unknown id
8
+ * degrades honestly to a generic probe row with the id as its name.
9
+ */
10
+ const KNOWN_CHECKS = {
11
+ installed: { title: "Installed", kind: "binary" },
12
+ api_key: { title: "API key", kind: "auth" },
13
+ provider_auth: { title: "Provider login", kind: "auth" },
14
+ isolated_smoke: { title: "Isolated API-key smoke", kind: "smoke" },
15
+ structured_output: { title: "Structured output", kind: "probe" },
16
+ };
17
+ const AUTH_SOURCE_TITLES = {
18
+ native_session: "Native session",
19
+ oauth_token_env: "Setup token",
20
+ api_key_env: "API key",
21
+ };
22
+ function humanizeId(id) {
23
+ const words = id.split(/[_-]+/).filter(Boolean);
24
+ if (words.length === 0)
25
+ return id;
26
+ const joined = words.join(" ");
27
+ return joined.charAt(0).toUpperCase() + joined.slice(1);
28
+ }
29
+ function checkRow(check) {
30
+ const known = KNOWN_CHECKS[check.id];
31
+ return {
32
+ id: check.id,
33
+ kind: known?.kind ?? "probe",
34
+ title: known?.title ?? humanizeId(check.id),
35
+ status: check.status,
36
+ detail: check.detail ?? null,
37
+ };
38
+ }
39
+ /**
40
+ * An auth source is a row about THAT source: verified -> pass, a failed
41
+ * verification -> fail, everything else -> skip with honest detail (an
42
+ * unconfigured fallback source is not a failure of the harness).
43
+ */
44
+ function authSourceRow(source) {
45
+ const status = source.verification === "passed" ? "pass" : source.verification === "failed" ? "fail" : "skip";
46
+ const detail = source.detail ??
47
+ (source.verification === "not_run"
48
+ ? source.availability === "available"
49
+ ? "present, not verified"
50
+ : source.availability === "unavailable"
51
+ ? "not configured"
52
+ : "availability unknown"
53
+ : null);
54
+ return {
55
+ id: `auth_source:${source.source}`,
56
+ kind: "auth",
57
+ title: AUTH_SOURCE_TITLES[source.source] ?? humanizeId(source.source),
58
+ status,
59
+ detail,
60
+ };
61
+ }
62
+ export function normalizeReadiness(input) {
63
+ const rows = [];
64
+ for (const check of input.checks)
65
+ rows.push(checkRow(check));
66
+ for (const source of input.authSources)
67
+ rows.push(authSourceRow(source));
68
+ if (input.configuredModel && input.configuredModelCheck) {
69
+ rows.push({
70
+ id: "configured_model",
71
+ kind: "model",
72
+ title: "Configured model",
73
+ status: input.configuredModelCheck.status === "ok" ? "pass" : "fail",
74
+ detail: input.configuredModelCheck.status === "ok"
75
+ ? input.configuredModel
76
+ : (input.configuredModelCheck.message ?? null),
77
+ });
78
+ }
79
+ return rows;
80
+ }
81
+ //# sourceMappingURL=readiness-presentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness-presentation.js","sourceRoot":"","sources":["../src/readiness-presentation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claudexor/gateway",
3
- "version": "1.0.1",
3
+ "version": "2.1.2",
4
4
  "license": "MIT",
5
5
  "description": "HarnessGateway: discovery, conformance intent-gating, and harness selection.",
6
6
  "type": "module",
@@ -16,8 +16,8 @@
16
16
  "dist"
17
17
  ],
18
18
  "dependencies": {
19
- "@claudexor/schema": "1.0.1",
20
- "@claudexor/core": "1.0.1"
19
+ "@claudexor/schema": "2.1.2",
20
+ "@claudexor/core": "2.1.2"
21
21
  },
22
22
  "repository": {
23
23
  "type": "git",