kadi-harness-runtime 0.1.8

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 (86) hide show
  1. package/README.md +20 -0
  2. package/dist/adapter-loader.d.ts +35 -0
  3. package/dist/adapter-loader.d.ts.map +1 -0
  4. package/dist/adapter-loader.js +109 -0
  5. package/dist/adapter-loader.js.map +1 -0
  6. package/dist/event-bus.d.ts +55 -0
  7. package/dist/event-bus.d.ts.map +1 -0
  8. package/dist/event-bus.js +170 -0
  9. package/dist/event-bus.js.map +1 -0
  10. package/dist/event-normalizer.d.ts +41 -0
  11. package/dist/event-normalizer.d.ts.map +1 -0
  12. package/dist/event-normalizer.js +68 -0
  13. package/dist/event-normalizer.js.map +1 -0
  14. package/dist/gateways/artifacts.d.ts +24 -0
  15. package/dist/gateways/artifacts.d.ts.map +1 -0
  16. package/dist/gateways/artifacts.js +128 -0
  17. package/dist/gateways/artifacts.js.map +1 -0
  18. package/dist/gateways/authorization.d.ts +38 -0
  19. package/dist/gateways/authorization.d.ts.map +1 -0
  20. package/dist/gateways/authorization.js +118 -0
  21. package/dist/gateways/authorization.js.map +1 -0
  22. package/dist/gateways/events.d.ts +31 -0
  23. package/dist/gateways/events.d.ts.map +1 -0
  24. package/dist/gateways/events.js +135 -0
  25. package/dist/gateways/events.js.map +1 -0
  26. package/dist/gateways/redaction.d.ts +2 -0
  27. package/dist/gateways/redaction.d.ts.map +1 -0
  28. package/dist/gateways/redaction.js +2 -0
  29. package/dist/gateways/redaction.js.map +1 -0
  30. package/dist/gateways/sessions.d.ts +27 -0
  31. package/dist/gateways/sessions.d.ts.map +1 -0
  32. package/dist/gateways/sessions.js +167 -0
  33. package/dist/gateways/sessions.js.map +1 -0
  34. package/dist/gateways/tools.d.ts +36 -0
  35. package/dist/gateways/tools.d.ts.map +1 -0
  36. package/dist/gateways/tools.js +135 -0
  37. package/dist/gateways/tools.js.map +1 -0
  38. package/dist/index.d.ts +82 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +27 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/lifecycle.d.ts +23 -0
  43. package/dist/lifecycle.d.ts.map +1 -0
  44. package/dist/lifecycle.js +63 -0
  45. package/dist/lifecycle.js.map +1 -0
  46. package/dist/policy/redaction.d.ts +10 -0
  47. package/dist/policy/redaction.d.ts.map +1 -0
  48. package/dist/policy/redaction.js +48 -0
  49. package/dist/policy/redaction.js.map +1 -0
  50. package/dist/protocol/context-client.d.ts +50 -0
  51. package/dist/protocol/context-client.d.ts.map +1 -0
  52. package/dist/protocol/context-client.js +49 -0
  53. package/dist/protocol/context-client.js.map +1 -0
  54. package/dist/protocol/context-server.d.ts +19 -0
  55. package/dist/protocol/context-server.d.ts.map +1 -0
  56. package/dist/protocol/context-server.js +103 -0
  57. package/dist/protocol/context-server.js.map +1 -0
  58. package/dist/registry.d.ts +42 -0
  59. package/dist/registry.d.ts.map +1 -0
  60. package/dist/registry.js +210 -0
  61. package/dist/registry.js.map +1 -0
  62. package/dist/run-coordinator.d.ts +47 -0
  63. package/dist/run-coordinator.d.ts.map +1 -0
  64. package/dist/run-coordinator.js +241 -0
  65. package/dist/run-coordinator.js.map +1 -0
  66. package/dist/runner/cli.d.ts +18 -0
  67. package/dist/runner/cli.d.ts.map +1 -0
  68. package/dist/runner/cli.js +54 -0
  69. package/dist/runner/cli.js.map +1 -0
  70. package/dist/runner/runner-service.d.ts +88 -0
  71. package/dist/runner/runner-service.d.ts.map +1 -0
  72. package/dist/runner/runner-service.js +138 -0
  73. package/dist/runner/runner-service.js.map +1 -0
  74. package/dist/runtime.d.ts +96 -0
  75. package/dist/runtime.d.ts.map +1 -0
  76. package/dist/runtime.js +330 -0
  77. package/dist/runtime.js.map +1 -0
  78. package/dist/scheduling/request-store.d.ts +71 -0
  79. package/dist/scheduling/request-store.d.ts.map +1 -0
  80. package/dist/scheduling/request-store.js +173 -0
  81. package/dist/scheduling/request-store.js.map +1 -0
  82. package/dist/scheduling/signing.d.ts +57 -0
  83. package/dist/scheduling/signing.d.ts.map +1 -0
  84. package/dist/scheduling/signing.js +142 -0
  85. package/dist/scheduling/signing.js.map +1 -0
  86. package/package.json +47 -0
@@ -0,0 +1,128 @@
1
+ import { redactJson, redactObject } from "./redaction.js";
2
+ function makeError(scope, code, category, message, retryable, details = {}) {
3
+ return { code, category, message, retryable, correlationId: scope.correlationId, details: { sessionId: scope.sessionId, runId: scope.runId, adapterId: scope.adapterId, ...redactObject(details) } };
4
+ }
5
+ function isRecord(value) {
6
+ return typeof value === "object" && value !== null && !Array.isArray(value);
7
+ }
8
+ function isKadiError(value) {
9
+ return isRecord(value) && typeof value.code === "string" && typeof value.category === "string" && typeof value.message === "string";
10
+ }
11
+ function normalizeError(scope, value, operation) {
12
+ if (isKadiError(value))
13
+ return { ...value, correlationId: scope.correlationId, details: redactObject(value.details) };
14
+ return makeError(scope, "artifact_persistence_error", "service_failure", `${operation} failed`, true);
15
+ }
16
+ function cancellationError(scope) {
17
+ return makeError(scope, "operation_cancelled", "cancellation", "The scoped operation was cancelled", false);
18
+ }
19
+ async function authorize(options, operation) {
20
+ if (!options.authorize)
21
+ return undefined;
22
+ try {
23
+ const decision = await options.authorize({ operation, scope: options.scope });
24
+ if (decision === true || (typeof decision === "object" && decision.ok))
25
+ return undefined;
26
+ if (decision === false)
27
+ return makeError(options.scope, "authorization_denied", "authorization", `Authorization denied for ${operation}`, false, { operation });
28
+ return decision.error;
29
+ }
30
+ catch (caught) {
31
+ return normalizeError(options.scope, caught, `${operation} authorization`);
32
+ }
33
+ }
34
+ function unwrap(value) {
35
+ if (isRecord(value) && value.ok === false)
36
+ throw value.error;
37
+ if (isRecord(value) && value.success === false)
38
+ throw new Error("backend rejected operation");
39
+ if (isRecord(value) && value.ok === true && "value" in value)
40
+ return value.value;
41
+ return value;
42
+ }
43
+ export function normalizeArtifactReference(value, scope) {
44
+ const source = isRecord(value) && isRecord(value.artifact) ? value.artifact : value;
45
+ if (!isRecord(source))
46
+ throw makeError(scope, "invalid_artifact_reference", "service_failure", "Artifact backend returned an invalid reference", false);
47
+ if (typeof source.id === "string" && typeof source.kind === "string") {
48
+ return {
49
+ id: source.id,
50
+ kind: source.kind,
51
+ name: typeof source.name === "string" ? source.name : undefined,
52
+ uri: typeof source.uri === "string" ? source.uri : undefined,
53
+ mediaType: typeof source.mediaType === "string" ? source.mediaType : undefined,
54
+ sizeBytes: typeof source.sizeBytes === "number" ? source.sizeBytes : undefined,
55
+ createdAt: typeof source.createdAt === "string" ? source.createdAt : undefined,
56
+ redaction: isRecord(source.redaction) ? redactJson(source.redaction) : undefined,
57
+ };
58
+ }
59
+ if (typeof source.artifactId === "string") {
60
+ return {
61
+ id: source.artifactId,
62
+ kind: "file",
63
+ uri: typeof source.path === "string" ? source.path : undefined,
64
+ mediaType: typeof source.mimeType === "string" ? source.mimeType : undefined,
65
+ sizeBytes: typeof source.size === "number" ? source.size : undefined,
66
+ createdAt: typeof source.created === "string" ? source.created : undefined,
67
+ redaction: { redacted: false },
68
+ };
69
+ }
70
+ throw makeError(scope, "invalid_artifact_reference", "service_failure", "Artifact backend returned an invalid reference", false);
71
+ }
72
+ /** Scoped artifact facade over session-state storage or another durable backend. */
73
+ export class ArtifactGateway {
74
+ options;
75
+ constructor(options) {
76
+ this.options = options;
77
+ }
78
+ async put(request) {
79
+ const denied = await authorize(this.options, "artifacts.put");
80
+ if (denied)
81
+ return { ok: false, error: denied };
82
+ if (this.options.scope.signal?.aborted)
83
+ return { ok: false, error: cancellationError(this.options.scope) };
84
+ try {
85
+ const safeRequest = { ...request, content: request.content === undefined ? undefined : redactJson(request.content), metadata: request.metadata ? redactJson(request.metadata) : undefined };
86
+ return { ok: true, value: normalizeArtifactReference(unwrap(await this.options.backend.put(this.options.scope, safeRequest)), this.options.scope) };
87
+ }
88
+ catch (caught) {
89
+ return { ok: false, error: caught && isKadiError(caught) ? caught : normalizeError(this.options.scope, caught, "artifacts.put") };
90
+ }
91
+ }
92
+ async get(reference) {
93
+ const denied = await authorize(this.options, "artifacts.get");
94
+ if (denied)
95
+ return { ok: false, error: denied };
96
+ if (this.options.scope.signal?.aborted)
97
+ return { ok: false, error: cancellationError(this.options.scope) };
98
+ try {
99
+ const value = unwrap(await this.options.backend.get(this.options.scope, reference));
100
+ if (value === undefined || value === null || (isRecord(value) && value.found === false))
101
+ return { ok: true, value: undefined };
102
+ const source = isRecord(value) && "content" in value ? value : { content: value };
103
+ return { ok: true, value: { reference: normalizeArtifactReference(source.reference ?? reference, this.options.scope), content: source.content === undefined ? undefined : redactJson(source.content) } };
104
+ }
105
+ catch (caught) {
106
+ return { ok: false, error: caught && isKadiError(caught) ? caught : normalizeError(this.options.scope, caught, "artifacts.get") };
107
+ }
108
+ }
109
+ async list() {
110
+ const denied = await authorize(this.options, "artifacts.list");
111
+ if (denied)
112
+ return { ok: false, error: denied };
113
+ if (this.options.scope.signal?.aborted)
114
+ return { ok: false, error: cancellationError(this.options.scope) };
115
+ try {
116
+ const value = unwrap(await this.options.backend.list(this.options.scope));
117
+ const entries = Array.isArray(value) ? value : isRecord(value) && Array.isArray(value.artifacts) ? value.artifacts : [];
118
+ return { ok: true, value: entries.map((entry) => normalizeArtifactReference(entry, this.options.scope)) };
119
+ }
120
+ catch (caught) {
121
+ return { ok: false, error: caught && isKadiError(caught) ? caught : normalizeError(this.options.scope, caught, "artifacts.list") };
122
+ }
123
+ }
124
+ }
125
+ export function createArtifactGateway(options) {
126
+ return new ArtifactGateway(options);
127
+ }
128
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/gateways/artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type AuthorizationCheckRequest, type AuthorizationDecision, type PrincipalRef, type ScopedAuthorizationService, type ServiceResult } from "@kadi.build/kadi-harness-contracts";
2
+ import type { GatewayScope } from "./tools.js";
3
+ export interface AuthorizationScope extends GatewayScope {
4
+ readonly principal: PrincipalRef;
5
+ readonly expiresAt: string;
6
+ }
7
+ export type AuthorizationPolicy = (request: AuthorizationCheckRequest, principal: PrincipalRef) => AuthorizationDecision | Promise<AuthorizationDecision>;
8
+ export interface AuthorizationGatewayOptions {
9
+ readonly scope: GatewayScope;
10
+ readonly principal: PrincipalRef;
11
+ readonly ttlMs?: number;
12
+ readonly now?: () => number;
13
+ readonly policy?: AuthorizationPolicy;
14
+ }
15
+ export interface AuthorizationGatewayStatus {
16
+ readonly active: boolean;
17
+ readonly expiresAt: string;
18
+ readonly principalId: string;
19
+ readonly sessionId: string;
20
+ readonly runId: string;
21
+ }
22
+ /** Runtime-owned per-run authorization facade with expiry and revocation. */
23
+ export declare class AuthorizationGateway implements ScopedAuthorizationService {
24
+ private readonly options;
25
+ private readonly scope;
26
+ private readonly now;
27
+ private readonly principalValid;
28
+ private revoked;
29
+ constructor(options: AuthorizationGatewayOptions);
30
+ getAuthorizationScope(): AuthorizationScope;
31
+ getStatus(): AuthorizationGatewayStatus;
32
+ revoke(): void;
33
+ close(): Promise<void>;
34
+ check(request: AuthorizationCheckRequest): Promise<ServiceResult<AuthorizationDecision>>;
35
+ private isActive;
36
+ }
37
+ export declare function createAuthorizationGateway(options: AuthorizationGatewayOptions): AuthorizationGateway;
38
+ //# sourceMappingURL=authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../src/gateways/authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAE1B,KAAK,YAAY,EACjB,KAAK,0BAA0B,EAC/B,KAAK,aAAa,EACnB,MAAM,oCAAoC,CAAC;AAG5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,mBAAmB,GAAG,CAChC,OAAO,EAAE,yBAAyB,EAClC,SAAS,EAAE,YAAY,KACpB,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAE5D,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC;CACvC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAwDD,6EAA6E;AAC7E,qBAAa,oBAAqB,YAAW,0BAA0B;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,OAAO,CAAS;gBAEL,OAAO,EAAE,2BAA2B;IAUhD,qBAAqB,IAAI,kBAAkB;IAI3C,SAAS,IAAI,0BAA0B;IAUvC,MAAM,IAAI,IAAI;IAIR,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;IA4BrG,OAAO,CAAC,QAAQ;CAGjB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,2BAA2B,GAAG,oBAAoB,CAErG"}
@@ -0,0 +1,118 @@
1
+ import { PrincipalRefSchema, } from "@kadi.build/kadi-harness-contracts";
2
+ import { redactJson, redactObject } from "../policy/redaction.js";
3
+ const DEFAULT_TTL_MS = 60 * 60 * 1000;
4
+ const OPERATION_SCOPE = {
5
+ tools: "run",
6
+ events: "run",
7
+ authorization: "run",
8
+ sessions: "session",
9
+ artifacts: "run",
10
+ scheduling: "session",
11
+ };
12
+ function makeError(scope, code, category, message, retryable, details = {}) {
13
+ return {
14
+ code,
15
+ category,
16
+ message,
17
+ retryable,
18
+ correlationId: scope.correlationId,
19
+ details: {
20
+ sessionId: scope.sessionId,
21
+ runId: scope.runId,
22
+ adapterId: scope.adapterId,
23
+ ...redactObject(details),
24
+ },
25
+ };
26
+ }
27
+ function operationName(action) {
28
+ return action.trim().toLowerCase();
29
+ }
30
+ function requiredScopeFor(operation) {
31
+ const [service] = operation.split(".");
32
+ return service ? OPERATION_SCOPE[service] : undefined;
33
+ }
34
+ function scopeAllows(principal, operation) {
35
+ const required = requiredScopeFor(operation);
36
+ if (!required)
37
+ return principal.scopes.includes("*") || principal.scopes.includes(operation);
38
+ return principal.scopes.some((scope) => scope === "*" || scope === required || scope === operation || (scope.endsWith(".*") && operation.startsWith(scope.slice(0, -1))));
39
+ }
40
+ function invalidPrincipalError(scope, principal) {
41
+ return makeError(scope, "invalid_principal", "validation", "Caller principal is invalid", false, {
42
+ principalType: typeof principal === "object" && principal !== null && "type" in principal ? principal.type : undefined,
43
+ });
44
+ }
45
+ /** Runtime-owned per-run authorization facade with expiry and revocation. */
46
+ export class AuthorizationGateway {
47
+ options;
48
+ scope;
49
+ now;
50
+ principalValid;
51
+ revoked = false;
52
+ constructor(options) {
53
+ this.options = options;
54
+ this.now = options.now ?? Date.now;
55
+ const parsed = PrincipalRefSchema.safeParse(options.principal);
56
+ this.principalValid = parsed.success && options.scope.sessionId.length > 0 && options.scope.runId.length > 0 && options.scope.adapterId.length > 0;
57
+ const expiresAt = this.now() + Math.max(1, options.ttlMs ?? DEFAULT_TTL_MS);
58
+ this.scope = { ...options.scope, principal: options.principal, expiresAt: new Date(expiresAt).toISOString() };
59
+ options.scope.signal?.addEventListener("abort", () => this.revoke(), { once: true });
60
+ }
61
+ getAuthorizationScope() {
62
+ return this.scope;
63
+ }
64
+ getStatus() {
65
+ return {
66
+ active: this.isActive(),
67
+ expiresAt: this.scope.expiresAt,
68
+ principalId: this.scope.principal.id,
69
+ sessionId: this.scope.sessionId,
70
+ runId: this.scope.runId,
71
+ };
72
+ }
73
+ revoke() {
74
+ this.revoked = true;
75
+ }
76
+ async close() {
77
+ this.revoke();
78
+ }
79
+ async check(request) {
80
+ if (!this.principalValid)
81
+ return { ok: false, error: invalidPrincipalError(this.scope, this.scope.principal) };
82
+ if (this.options.scope.signal?.aborted)
83
+ return { ok: false, error: makeError(this.scope, "operation_cancelled", "cancellation", "The authorization scope was cancelled", false) };
84
+ if (this.revoked)
85
+ return { ok: false, error: makeError(this.scope, "authorization_scope_revoked", "authorization", "The authorization scope has been revoked", false) };
86
+ if (this.now() >= Date.parse(this.scope.expiresAt))
87
+ return { ok: false, error: makeError(this.scope, "authorization_scope_expired", "authorization", "The authorization scope has expired", false, { expiresAt: this.scope.expiresAt }) };
88
+ const operation = operationName(request.action);
89
+ if (!operation)
90
+ return { ok: false, error: makeError(this.scope, "invalid_authorization_request", "validation", "Authorization action is required", false) };
91
+ if (!scopeAllows(this.scope.principal, operation)) {
92
+ return { ok: true, value: { allowed: false, reason: "Principal scope does not permit this operation", scopes: this.scope.principal.scopes } };
93
+ }
94
+ if (!this.options.policy)
95
+ return { ok: true, value: { allowed: true, scopes: this.scope.principal.scopes } };
96
+ try {
97
+ const decision = await this.options.policy({ ...request, action: operation }, this.scope.principal);
98
+ return {
99
+ ok: true,
100
+ value: {
101
+ allowed: decision.allowed,
102
+ reason: decision.reason === undefined ? undefined : String(redactJson(decision.reason)),
103
+ scopes: decision.scopes.length > 0 ? decision.scopes : this.scope.principal.scopes,
104
+ },
105
+ };
106
+ }
107
+ catch {
108
+ return { ok: false, error: makeError(this.scope, "authorization_policy_error", "authorization", "Authorization policy failed", true) };
109
+ }
110
+ }
111
+ isActive() {
112
+ return this.principalValid && !this.revoked && !this.options.scope.signal?.aborted && this.now() < Date.parse(this.scope.expiresAt);
113
+ }
114
+ }
115
+ export function createAuthorizationGateway(options) {
116
+ return new AuthorizationGateway(options);
117
+ }
118
+ //# sourceMappingURL=authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../src/gateways/authorization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { EventFilter, EventSubscription, HarnessEvent, KadiError, ScopedEventService, ServiceResult } from "@kadi.build/kadi-harness-contracts";
2
+ import type { EventObserveOptions, EventPublishResult } from "../event-bus.js";
3
+ import { type GatewayAuthorizer, type GatewayScope } from "./tools.js";
4
+ export interface EventGatewaySubscription {
5
+ readonly events: AsyncIterable<HarnessEvent>;
6
+ close(): Promise<void>;
7
+ }
8
+ /** The smallest publication/subscription surface required by EventBus or a KADI broker bridge. */
9
+ export interface EventBackend {
10
+ publish(event: HarnessEvent): Promise<EventPublishResult | void>;
11
+ subscribe(runId: string, options: EventObserveOptions): EventGatewaySubscription;
12
+ }
13
+ export interface EventGatewayOptions {
14
+ readonly scope: GatewayScope;
15
+ readonly backend: EventBackend;
16
+ readonly authorize?: GatewayAuthorizer;
17
+ }
18
+ /** Scoped facade over normalized event publication and streaming. */
19
+ export declare class EventGateway implements ScopedEventService {
20
+ private readonly options;
21
+ constructor(options: EventGatewayOptions);
22
+ publish(event: HarnessEvent): Promise<ServiceResult<void>>;
23
+ subscribe(filter?: EventFilter): Promise<ServiceResult<EventSubscription>>;
24
+ private filterScopedEvents;
25
+ }
26
+ export declare class EventGatewayError extends Error {
27
+ readonly error: KadiError;
28
+ constructor(error: KadiError);
29
+ }
30
+ export declare function createEventGateway(options: EventGatewayOptions): ScopedEventService;
31
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/gateways/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,kBAAkB,EAClB,aAAa,EACd,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE/E,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAElB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,kGAAkG;AAClG,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACjE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,wBAAwB,CAAC;CAClF;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CACxC;AAiFD,qEAAqE;AACrE,qBAAa,YAAa,YAAW,kBAAkB;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAE3B,OAAO,EAAE,mBAAmB;IAIlC,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAiB1D,SAAS,CAAC,MAAM,GAAE,WAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;YAa5E,kBAAkB;CAUlC;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAgB,KAAK,EAAE,SAAS,CAAC;gBAEd,KAAK,EAAE,SAAS;CAKpC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAEnF"}
@@ -0,0 +1,135 @@
1
+ import { redactJson, redactObject } from "./redaction.js";
2
+ function makeError(scope, code, category, message, retryable, details = {}) {
3
+ return {
4
+ code,
5
+ category,
6
+ message,
7
+ retryable,
8
+ correlationId: scope.correlationId,
9
+ details: {
10
+ sessionId: scope.sessionId,
11
+ runId: scope.runId,
12
+ adapterId: scope.adapterId,
13
+ ...redactObject(details),
14
+ },
15
+ };
16
+ }
17
+ function isKadiError(value) {
18
+ if (typeof value !== "object" || value === null)
19
+ return false;
20
+ const candidate = value;
21
+ return typeof candidate.code === "string" && typeof candidate.category === "string" && typeof candidate.message === "string";
22
+ }
23
+ function normalizeError(scope, value, operation) {
24
+ if (isKadiError(value)) {
25
+ return {
26
+ ...value,
27
+ correlationId: scope.correlationId,
28
+ details: redactObject(value.details),
29
+ cause: value.cause ? { code: value.cause.code, message: value.cause.message } : undefined,
30
+ };
31
+ }
32
+ const message = value instanceof Error ? value.message : String(value);
33
+ return makeError(scope, "event_transport_error", "service_failure", `${operation} failed: ${message}`, true);
34
+ }
35
+ async function authorize(options, request) {
36
+ if (!options.authorize)
37
+ return undefined;
38
+ try {
39
+ const decision = await options.authorize(request);
40
+ if (decision === true || (typeof decision === "object" && decision.ok))
41
+ return undefined;
42
+ if (decision === false)
43
+ return makeError(options.scope, "authorization_denied", "authorization", `Authorization denied for ${request.operation}`, false, { operation: request.operation, eventType: request.eventType });
44
+ return decision.error;
45
+ }
46
+ catch (caught) {
47
+ return normalizeError(options.scope, caught, `${request.operation} authorization`);
48
+ }
49
+ }
50
+ function scopedEvent(scope, event) {
51
+ if (event.contractVersion !== scope.contractVersion) {
52
+ return { ok: false, error: makeError(scope, "contract_incompatible", "contract_incompatible", "Event contract version does not match the run scope", false, { eventContractVersion: event.contractVersion }) };
53
+ }
54
+ if (event.sessionId !== scope.sessionId || event.runId !== scope.runId || event.adapterId !== scope.adapterId) {
55
+ return { ok: false, error: makeError(scope, "event_scope_violation", "authorization", "Event scope does not match the current run", false, { eventSessionId: event.sessionId, eventRunId: event.runId, eventAdapterId: event.adapterId }) };
56
+ }
57
+ return {
58
+ ok: true,
59
+ value: {
60
+ ...event,
61
+ correlation: { ...event.correlation, requestId: scope.correlationId },
62
+ payload: event.payload ? redactJson(event.payload) : undefined,
63
+ native: event.native ? { namespace: event.native.namespace, payload: redactJson(event.native.payload) } : undefined,
64
+ },
65
+ };
66
+ }
67
+ function cancellationError(scope) {
68
+ return makeError(scope, "operation_cancelled", "cancellation", "The scoped operation was cancelled", false);
69
+ }
70
+ /** Scoped facade over normalized event publication and streaming. */
71
+ export class EventGateway {
72
+ options;
73
+ constructor(options) {
74
+ this.options = options;
75
+ }
76
+ async publish(event) {
77
+ const denied = await authorize(this.options, { operation: "events.publish", scope: this.options.scope, eventType: event.type });
78
+ if (denied)
79
+ return { ok: false, error: denied };
80
+ if (this.options.scope.signal?.aborted)
81
+ return { ok: false, error: cancellationError(this.options.scope) };
82
+ const scoped = scopedEvent(this.options.scope, event);
83
+ if (!scoped.ok)
84
+ return scoped;
85
+ try {
86
+ const result = await this.options.backend.publish(scoped.value);
87
+ if (result && "accepted" in result && !result.accepted && result.reason === "terminal_closed") {
88
+ return { ok: false, error: makeError(this.options.scope, "event_stream_closed", "service_failure", "The run event stream is already terminal", false) };
89
+ }
90
+ return { ok: true, value: undefined };
91
+ }
92
+ catch (caught) {
93
+ return { ok: false, error: normalizeError(this.options.scope, caught, "events.publish") };
94
+ }
95
+ }
96
+ async subscribe(filter = {}) {
97
+ const denied = await authorize(this.options, { operation: "events.subscribe", scope: this.options.scope });
98
+ if (denied)
99
+ return { ok: false, error: denied };
100
+ if (this.options.scope.signal?.aborted)
101
+ return { ok: false, error: cancellationError(this.options.scope) };
102
+ try {
103
+ const source = this.options.backend.subscribe(this.options.scope.runId, { ...filter, signal: this.options.scope.signal });
104
+ const events = this.filterScopedEvents(source.events);
105
+ return { ok: true, value: { events, close: source.close } };
106
+ }
107
+ catch (caught) {
108
+ return { ok: false, error: normalizeError(this.options.scope, caught, "events.subscribe") };
109
+ }
110
+ }
111
+ async *filterScopedEvents(events) {
112
+ try {
113
+ for await (const event of events) {
114
+ const scoped = scopedEvent(this.options.scope, event);
115
+ if (scoped.ok)
116
+ yield scoped.value;
117
+ }
118
+ }
119
+ catch (caught) {
120
+ throw new EventGatewayError(normalizeError(this.options.scope, caught, "events.stream"));
121
+ }
122
+ }
123
+ }
124
+ export class EventGatewayError extends Error {
125
+ error;
126
+ constructor(error) {
127
+ super(error.message);
128
+ this.name = "EventGatewayError";
129
+ this.error = error;
130
+ }
131
+ }
132
+ export function createEventGateway(options) {
133
+ return new EventGateway(options);
134
+ }
135
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/gateways/events.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAwB1D,SAAS,SAAS,CAChB,KAAmB,EACnB,IAAY,EACZ,QAA+B,EAC/B,OAAe,EACf,SAAkB,EAClB,UAAmC,EAAE;IAErC,OAAO;QACL,IAAI;QACJ,QAAQ;QACR,OAAO;QACP,SAAS;QACT,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,OAAO,EAAE;YACP,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,GAAG,YAAY,CAAC,OAAO,CAAC;SACzB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,SAAS,GAAG,KAAgC,CAAC;IACnD,OAAO,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,CAAC;AAC/H,CAAC;AAED,SAAS,cAAc,CAAC,KAAmB,EAAE,KAAc,EAAE,SAAiB;IAC5E,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,GAAG,KAAK;YACR,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC;YACpC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;SAC1F,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,SAAS,CAAC,KAAK,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,GAAG,SAAS,YAAY,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;AAC/G,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,OAA4B,EAC5B,OAAoC;IAEpC,IAAI,CAAC,OAAO,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,SAAS,CAAC;QACzF,IAAI,QAAQ,KAAK,KAAK;YAAE,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,4BAA4B,OAAO,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACzN,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,OAAO,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,gBAAgB,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAmB,EAAE,KAAmB;IAC3D,IAAI,KAAK,CAAC,eAAe,KAAK,KAAK,CAAC,eAAe,EAAE,CAAC;QACpD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,qDAAqD,EAAE,KAAK,EAAE,EAAE,oBAAoB,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC;IACjN,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;QAC9G,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,4CAA4C,EAAE,KAAK,EAAE,EAAE,cAAc,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;IAC9O,CAAC;IACD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE;YACL,GAAG,KAAK;YACR,WAAW,EAAE,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,aAAa,EAAE;YACrE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAA0B,CAAC,CAAC,CAAC,SAAS;YACvF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;SACpH;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAmB;IAC5C,OAAO,SAAS,CAAC,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,oCAAoC,EAAE,KAAK,CAAC,CAAC;AAC9G,CAAC;AAED,qEAAqE;AACrE,MAAM,OAAO,YAAY;IACN,OAAO,CAAsB;IAE9C,YAAmB,OAA4B;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,KAAmB;QACtC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAChI,IAAI,MAAM;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3G,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChE,IAAI,MAAM,IAAI,UAAU,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;gBAC9F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,0CAA0C,EAAE,KAAK,CAAC,EAAE,CAAC;YAC1J,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QACxC,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,CAAC;QAC5F,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,SAAsB,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3G,IAAI,MAAM;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3G,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1H,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QAC9D,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,CAAC,kBAAkB,CAAC,MAAmC;QACnE,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACtD,IAAI,MAAM,CAAC,EAAE;oBAAE,MAAM,MAAM,CAAC,KAAK,CAAC;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1B,KAAK,CAAY;IAEjC,YAAmB,KAAgB;QACjC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC7D,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { isSensitiveKey, redactJson, redactObject } from "../policy/redaction.js";
2
+ //# sourceMappingURL=redaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../../src/gateways/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { isSensitiveKey, redactJson, redactObject } from "../policy/redaction.js";
2
+ //# sourceMappingURL=redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../src/gateways/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type ScopedSessionService, type ServiceResult, type SessionSnapshot, type SessionTimelineEntry } from "@kadi.build/kadi-harness-contracts";
2
+ import type { GatewayAuthorizer } from "./tools.js";
3
+ import type { GatewayScope } from "./tools.js";
4
+ export interface SessionLoadOptions {
5
+ readonly includeRuns?: boolean;
6
+ readonly includeArtifacts?: boolean;
7
+ }
8
+ export interface SessionStateBackend {
9
+ save(scope: GatewayScope, snapshot: SessionSnapshot): Promise<unknown> | unknown;
10
+ load(scope: GatewayScope, sessionId: string, options?: SessionLoadOptions): Promise<unknown> | unknown;
11
+ appendTimeline?(scope: GatewayScope, entry: SessionTimelineEntry): Promise<unknown> | unknown;
12
+ }
13
+ export interface SessionGatewayOptions {
14
+ readonly scope: GatewayScope;
15
+ readonly backend: SessionStateBackend;
16
+ readonly authorize?: GatewayAuthorizer;
17
+ }
18
+ /** Scoped session-state facade over the session-state ability or another durable backend. */
19
+ export declare class SessionGateway implements ScopedSessionService {
20
+ private readonly options;
21
+ constructor(options: SessionGatewayOptions);
22
+ load(sessionId: string): Promise<ServiceResult<SessionSnapshot | undefined>>;
23
+ save(snapshot: SessionSnapshot): Promise<ServiceResult<void>>;
24
+ appendTimeline(entry: SessionTimelineEntry): Promise<ServiceResult<void>>;
25
+ }
26
+ export declare function createSessionGateway(options: SessionGatewayOptions): SessionGateway;
27
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/gateways/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAC1B,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACjF,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACvG,cAAc,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAC/F;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CACxC;AAkGD,6FAA6F;AAC7F,qBAAa,cAAe,YAAW,oBAAoB;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;gBAE7B,OAAO,EAAE,qBAAqB;IAIpC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IAc5E,IAAI,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAmB7D,cAAc,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;CAavF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAEnF"}