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,48 @@
1
+ /** Keys that commonly contain credentials or other sensitive material. */
2
+ const SENSITIVE_KEY = /(?:secret|token|password|passwd|api[_-]?key|authorization|credential|private[_-]?key|cookie)/i;
3
+ const MAX_DEPTH = 12;
4
+ const MAX_COLLECTION_ENTRIES = 256;
5
+ function isRecord(value) {
6
+ return typeof value === "object" && value !== null && !Array.isArray(value);
7
+ }
8
+ /**
9
+ * Converts untrusted values into bounded JSON-safe data while redacting
10
+ * credential-like keys. Cycles and excessively deep/large values are replaced
11
+ * with safe markers instead of being serialized or logged.
12
+ */
13
+ export function redactJson(value) {
14
+ const seen = new WeakSet();
15
+ const visit = (candidate, depth) => {
16
+ if (candidate === null || typeof candidate === "string" || typeof candidate === "number" || typeof candidate === "boolean") {
17
+ return candidate;
18
+ }
19
+ if (depth >= MAX_DEPTH)
20
+ return "[TRUNCATED]";
21
+ if (typeof candidate !== "object")
22
+ return String(candidate);
23
+ if (seen.has(candidate))
24
+ return "[CIRCULAR]";
25
+ seen.add(candidate);
26
+ if (Array.isArray(candidate)) {
27
+ return candidate.slice(0, MAX_COLLECTION_ENTRIES).map((item) => visit(item, depth + 1));
28
+ }
29
+ if (isRecord(candidate)) {
30
+ const result = {};
31
+ for (const [key, item] of Object.entries(candidate).slice(0, MAX_COLLECTION_ENTRIES)) {
32
+ result[key] = SENSITIVE_KEY.test(key) ? "[REDACTED]" : visit(item, depth + 1);
33
+ }
34
+ return result;
35
+ }
36
+ return String(candidate);
37
+ };
38
+ return visit(value, 0);
39
+ }
40
+ export function redactObject(value) {
41
+ if (!value)
42
+ return undefined;
43
+ return redactJson(value);
44
+ }
45
+ export function isSensitiveKey(key) {
46
+ return SENSITIVE_KEY.test(key);
47
+ }
48
+ //# sourceMappingURL=redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../src/policy/redaction.ts"],"names":[],"mappings":"AAEA,0EAA0E;AAC1E,MAAM,aAAa,GAAG,+FAA+F,CAAC;AACtH,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;IAEnC,MAAM,KAAK,GAAG,CAAC,SAAkB,EAAE,KAAa,EAAa,EAAE;QAC7D,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,SAAS,EAAE,CAAC;YAC3H,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,KAAK,IAAI,SAAS;YAAE,OAAO,aAAa,CAAC;QAC7C,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO,YAAY,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEpB,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,GAAe,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,EAAE,CAAC;gBACrF,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAChF,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAA0C;IACrE,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,UAAU,CAAC,KAAK,CAAe,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { ArtifactContent, ArtifactReference, ArtifactWriteRequest, AuthorizationCheckRequest, ContextRpcMethod, ContextRpcParams, ContextRpcRequest, ContextRpcResults, EventFilter, EventSubscription, HarnessEvent, ScheduleCreateRequest, ScheduleReference, ServiceCapabilities, ServiceResult, SessionSnapshot, SessionTimelineEntry, ToolInvocationRequest, ToolListOptions } from "@kadi.build/kadi-harness-contracts";
2
+ export interface ContextRpcTransport {
3
+ request(request: ContextRpcRequest, options?: {
4
+ readonly signal?: AbortSignal;
5
+ }): Promise<unknown>;
6
+ }
7
+ export interface ContextRpcClientOptions {
8
+ readonly transport: ContextRpcTransport;
9
+ readonly contractVersion: string;
10
+ readonly sessionId: string;
11
+ readonly runId: string;
12
+ readonly correlationId: string;
13
+ readonly capabilities?: ServiceCapabilities;
14
+ readonly signal?: AbortSignal;
15
+ }
16
+ /** Typed service facade that serializes calls through a ContextRpcTransport. */
17
+ export declare class ContextRpcClient {
18
+ readonly capabilities: ServiceCapabilities;
19
+ readonly tools: {
20
+ list: (options?: ToolListOptions) => Promise<ServiceResult<readonly import("@kadi.build/kadi-harness-contracts").ToolDefinition[]>>;
21
+ invoke: (request: ToolInvocationRequest) => Promise<ServiceResult<import("@kadi.build/kadi-harness-contracts").ToolInvocationResult>>;
22
+ };
23
+ readonly events: {
24
+ publish: (event: HarnessEvent) => Promise<ServiceResult<null>>;
25
+ subscribe: (_filter?: EventFilter) => Promise<ServiceResult<EventSubscription>>;
26
+ };
27
+ readonly authorization: {
28
+ check: (request: AuthorizationCheckRequest) => Promise<ServiceResult<import("@kadi.build/kadi-harness-contracts").AuthorizationDecision>>;
29
+ };
30
+ readonly sessions: {
31
+ load: (sessionId: string) => Promise<ServiceResult<SessionSnapshot | undefined>>;
32
+ save: (snapshot: SessionSnapshot) => Promise<ServiceResult<null>>;
33
+ appendTimeline: (_entry: SessionTimelineEntry) => Promise<ServiceResult<void>>;
34
+ };
35
+ readonly artifacts: {
36
+ put: (request: ArtifactWriteRequest) => Promise<ServiceResult<ArtifactReference>>;
37
+ get: (_reference: ArtifactReference) => Promise<ServiceResult<ArtifactContent | undefined>>;
38
+ list: () => Promise<ServiceResult<readonly ArtifactReference[]>>;
39
+ };
40
+ readonly scheduling: {
41
+ create: (request: ScheduleCreateRequest) => Promise<ServiceResult<ScheduleReference>>;
42
+ get: (_scheduleId: string) => Promise<ServiceResult<ScheduleReference | undefined>>;
43
+ cancel: (_scheduleId: string) => Promise<ServiceResult<void>>;
44
+ };
45
+ private readonly options;
46
+ private sequence;
47
+ constructor(options: ContextRpcClientOptions);
48
+ call<M extends ContextRpcMethod>(method: M, params: ContextRpcParams[M]): Promise<ServiceResult<ContextRpcResults[M]>>;
49
+ }
50
+ //# sourceMappingURL=context-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-client.d.ts","sourceRoot":"","sources":["../../src/protocol/context-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EAEjB,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,YAAY,EAEZ,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EAChB,MAAM,oCAAoC,CAAC;AAG5C,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpG;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAYD,gFAAgF;AAChF,qBAAa,gBAAgB;IAC3B,SAAgB,YAAY,EAAE,mBAAmB,CAAC;IAClD,SAAgB,KAAK;yBAAsB,eAAe;0BAA+D,qBAAqB;MAA0C;IACxL,SAAgB,MAAM;yBAAsB,YAAY;8BAAqE,WAAW,KAAG,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;MAAsC;IAC1N,SAAgB,aAAa;yBAAsB,yBAAyB;MAAiD;IAC7H,SAAgB,QAAQ;0BAAuB,MAAM;yBAAiE,eAAe;iCAA0E,oBAAoB,KAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;MAA6C;IAC/S,SAAgB,SAAS;uBAAoB,oBAAoB;0BAAkE,iBAAiB,KAAG,OAAO,CAAC,aAAa,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;oBAAkD,OAAO,CAAC,aAAa,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;MAAoC;IACpV,SAAgB,UAAU;0BAAuB,qBAAqB;2BAAuE,MAAM,KAAG,OAAO,CAAC,aAAa,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;8BAA+D,MAAM,KAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;MAAuC;IAEtV,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAK;gBAEF,OAAO,EAAE,uBAAuB;IAKtC,IAAI,CAAC,CAAC,SAAS,gBAAgB,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;CAoBpI"}
@@ -0,0 +1,49 @@
1
+ import { ContextRpcResponseSchema, isContextRpcErrorResponse } from "@kadi.build/kadi-harness-contracts";
2
+ const unsupported = (method) => ({
3
+ ok: false,
4
+ error: {
5
+ code: "protocol.method_not_exposed",
6
+ category: "protocol_error",
7
+ message: `${method} is not exposed by Context RPC v1`,
8
+ retryable: false,
9
+ },
10
+ });
11
+ /** Typed service facade that serializes calls through a ContextRpcTransport. */
12
+ export class ContextRpcClient {
13
+ capabilities;
14
+ tools = { list: (options) => this.call("tools.list", options ?? {}), invoke: (request) => this.call("tools.invoke", request) };
15
+ events = { publish: (event) => this.call("events.publish", event), subscribe: async (_filter) => unsupported("events.subscribe") };
16
+ authorization = { check: (request) => this.call("authorization.check", request) };
17
+ sessions = { load: (sessionId) => this.call("sessions.load", { sessionId }), save: (snapshot) => this.call("sessions.save", snapshot), appendTimeline: async (_entry) => unsupported("sessions.appendTimeline") };
18
+ artifacts = { put: (request) => this.call("artifacts.put", request), get: async (_reference) => unsupported("artifacts.get"), list: async () => unsupported("artifacts.list") };
19
+ scheduling = { create: (request) => this.call("scheduling.create", request), get: async (_scheduleId) => unsupported("scheduling.get"), cancel: async (_scheduleId) => unsupported("scheduling.cancel") };
20
+ options;
21
+ sequence = 0;
22
+ constructor(options) {
23
+ this.options = options;
24
+ this.capabilities = options.capabilities ?? {};
25
+ }
26
+ async call(method, params) {
27
+ const request = {
28
+ jsonrpc: "2.0",
29
+ id: `${this.options.correlationId}:${++this.sequence}`,
30
+ contractVersion: this.options.contractVersion,
31
+ sessionId: this.options.sessionId,
32
+ runId: this.options.runId,
33
+ correlationId: this.options.correlationId,
34
+ method,
35
+ params,
36
+ };
37
+ try {
38
+ const response = ContextRpcResponseSchema.parse(await this.options.transport.request(request, { signal: this.options.signal }));
39
+ if (isContextRpcErrorResponse(response))
40
+ return { ok: false, error: response.error.data };
41
+ return { ok: true, value: response.result };
42
+ }
43
+ catch (cause) {
44
+ const kadiError = { code: "protocol.transport_failure", category: "protocol_error", message: cause instanceof Error ? cause.message : "Context RPC transport failed", retryable: true, correlationId: this.options.correlationId };
45
+ return { ok: false, error: kadiError };
46
+ }
47
+ }
48
+ }
49
+ //# sourceMappingURL=context-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-client.js","sourceRoot":"","sources":["../../src/protocol/context-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ContextRpcResponse, HarnessContext } from "@kadi.build/kadi-harness-contracts";
2
+ export interface ContextRpcHandleOptions {
3
+ readonly signal?: AbortSignal;
4
+ }
5
+ export interface ContextRpcServerOptions {
6
+ readonly context: HarnessContext;
7
+ readonly maxRequestIds?: number;
8
+ }
9
+ /** Dispatches serialized context calls against one runtime-created HarnessContext. */
10
+ export declare class ContextRpcServer {
11
+ private readonly context;
12
+ private readonly seenIds;
13
+ private readonly maxRequestIds;
14
+ constructor(options: ContextRpcServerOptions);
15
+ handle(input: unknown, options?: ContextRpcHandleOptions): Promise<ContextRpcResponse>;
16
+ private dispatch;
17
+ private fromService;
18
+ }
19
+ //# sourceMappingURL=context-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-server.d.ts","sourceRoot":"","sources":["../../src/protocol/context-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,kBAAkB,EAClB,cAAc,EAKf,MAAM,oCAAoC,CAAC;AAG5C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAgDD,sFAAsF;AACtF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAEpB,OAAO,EAAE,uBAAuB;IAKtC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAwCzF,QAAQ;IAgBtB,OAAO,CAAC,WAAW;CAIpB"}
@@ -0,0 +1,103 @@
1
+ import { ContextRpcRequestSchema } from "@kadi.build/kadi-harness-contracts";
2
+ const JSON_RPC_INVALID_REQUEST = -32600;
3
+ const JSON_RPC_METHOD_NOT_FOUND = -32601;
4
+ const KADI_CONTRACT_MISMATCH = -32001;
5
+ const KADI_SCOPE_MISMATCH = -32002;
6
+ const KADI_REPLAY = -32003;
7
+ const KADI_CANCELLED = -32800;
8
+ const KADI_SERVICE_FAILURE = -32004;
9
+ function error(code, category, message, correlationId, details) {
10
+ return { code, category, message, retryable: category === "timeout", correlationId, details };
11
+ }
12
+ function errorResponse(id, rpcCode, kadiError) {
13
+ return { jsonrpc: "2.0", id, error: { code: rpcCode, message: kadiError.message, data: kadiError } };
14
+ }
15
+ function resultResponse(id, value) {
16
+ return { jsonrpc: "2.0", id, result: value };
17
+ }
18
+ function throwIfAborted(signal) {
19
+ if (signal.aborted) {
20
+ throw new Error("aborted");
21
+ }
22
+ }
23
+ async function cancellable(promise, signal) {
24
+ throwIfAborted(signal);
25
+ return await new Promise((resolve, reject) => {
26
+ const onAbort = () => reject(new Error("aborted"));
27
+ signal.addEventListener("abort", onAbort, { once: true });
28
+ promise.then(resolve, reject).finally(() => signal.removeEventListener("abort", onAbort));
29
+ });
30
+ }
31
+ function jsonValue(value) {
32
+ if (value === undefined)
33
+ return null;
34
+ return value;
35
+ }
36
+ /** Dispatches serialized context calls against one runtime-created HarnessContext. */
37
+ export class ContextRpcServer {
38
+ context;
39
+ seenIds = new Set();
40
+ maxRequestIds;
41
+ constructor(options) {
42
+ this.context = options.context;
43
+ this.maxRequestIds = options.maxRequestIds ?? 10_000;
44
+ }
45
+ async handle(input, options = {}) {
46
+ const id = typeof input === "object" && input !== null && "id" in input && typeof input.id === "string" ? input.id : null;
47
+ const parsed = ContextRpcRequestSchema.safeParse(input);
48
+ if (!parsed.success) {
49
+ return errorResponse(id, JSON_RPC_INVALID_REQUEST, error("protocol.invalid_request", "protocol_error", "Malformed Context RPC request"));
50
+ }
51
+ const request = parsed.data;
52
+ if (request.contractVersion !== this.context.contractVersion) {
53
+ return errorResponse(request.id, KADI_CONTRACT_MISMATCH, error("contract.mismatch", "contract_incompatible", "Contract version mismatch", request.correlationId));
54
+ }
55
+ if (request.sessionId !== this.context.sessionId || request.runId !== this.context.runId || request.correlationId !== this.context.correlationId) {
56
+ return errorResponse(request.id, KADI_SCOPE_MISMATCH, error("scope.mismatch", "authorization", "Request scope does not match the active harness context", this.context.correlationId));
57
+ }
58
+ if (this.seenIds.has(request.id)) {
59
+ return errorResponse(request.id, KADI_REPLAY, error("protocol.replayed_request", "protocol_error", "Request id has already been processed", request.correlationId));
60
+ }
61
+ this.seenIds.add(request.id);
62
+ if (this.seenIds.size > this.maxRequestIds) {
63
+ const oldest = this.seenIds.values().next().value;
64
+ if (oldest)
65
+ this.seenIds.delete(oldest);
66
+ }
67
+ const signal = options.signal ?? this.context.signal;
68
+ if (signal.aborted) {
69
+ return errorResponse(request.id, KADI_CANCELLED, error("protocol.cancelled", "cancellation", "Context RPC request was cancelled", request.correlationId));
70
+ }
71
+ try {
72
+ const response = await cancellable(this.dispatch(request, signal), signal);
73
+ return response;
74
+ }
75
+ catch (cause) {
76
+ if (signal.aborted || cause instanceof Error && cause.message === "aborted") {
77
+ return errorResponse(request.id, KADI_CANCELLED, error("protocol.cancelled", "cancellation", "Context RPC request was cancelled", request.correlationId));
78
+ }
79
+ return errorResponse(request.id, KADI_SERVICE_FAILURE, error("protocol.service_failure", "service_failure", "Context service failed", request.correlationId, { cause: String(cause) }));
80
+ }
81
+ }
82
+ async dispatch(request, signal) {
83
+ throwIfAborted(signal);
84
+ const { id } = request;
85
+ switch (request.method) {
86
+ case "tools.list": return this.fromService(id, await this.context.tools.list(request.params));
87
+ case "tools.invoke": return this.fromService(id, await this.context.tools.invoke(request.params));
88
+ case "events.publish": return this.fromService(id, await this.context.events.publish(request.params), null);
89
+ case "sessions.save": return this.fromService(id, await this.context.sessions.save(request.params), null);
90
+ case "sessions.load": return this.fromService(id, await this.context.sessions.load(request.params.sessionId ?? this.context.sessionId));
91
+ case "artifacts.put": return this.fromService(id, await this.context.artifacts.put(request.params));
92
+ case "authorization.check": return this.fromService(id, await this.context.authorization.check(request.params));
93
+ case "scheduling.create": return this.fromService(id, await this.context.scheduling.create(request.params));
94
+ default: return errorResponse(id, JSON_RPC_METHOD_NOT_FOUND, error("protocol.method_not_found", "protocol_error", "Unknown Context RPC method", request.correlationId));
95
+ }
96
+ }
97
+ fromService(id, result, voidValue) {
98
+ if (!result.ok)
99
+ return errorResponse(id, KADI_SERVICE_FAILURE, result.error);
100
+ return resultResponse(id, jsonValue(result.value === undefined ? voidValue ?? null : result.value));
101
+ }
102
+ }
103
+ //# sourceMappingURL=context-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-server.js","sourceRoot":"","sources":["../../src/protocol/context-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type AdapterIdentity, type AdapterInitialization, type AdapterSelector, type CapabilityName, type CapabilityRequirements, type HarnessAdapter, type HarnessCapabilities, type HarnessContext, type KadiError, type RunRequest } from "@kadi.build/kadi-harness-contracts";
2
+ import type { AdapterLoadFailure, AdapterLoader, AdapterLoadResult } from "./adapter-loader.js";
3
+ export type AdapterAvailability = "available" | "unavailable";
4
+ export interface AdapterDescriptor {
5
+ readonly identity: AdapterIdentity;
6
+ readonly source?: string;
7
+ readonly status: AdapterAvailability;
8
+ readonly error?: KadiError;
9
+ }
10
+ export interface AdapterResolution {
11
+ readonly adapter: HarnessAdapter;
12
+ readonly descriptor: AdapterDescriptor;
13
+ readonly capabilities: HarnessCapabilities;
14
+ }
15
+ export interface AdapterRegistryOptions {
16
+ readonly contractVersion?: string;
17
+ }
18
+ export declare class AdapterRegistryError extends Error {
19
+ readonly error: KadiError;
20
+ constructor(error: KadiError);
21
+ }
22
+ /** A runtime contract can consume its own patch and older minor releases. */
23
+ export declare function isContractVersionCompatible(runtimeVersion: string, adapterVersion: string): boolean;
24
+ export declare function missingCapabilities(capabilities: HarnessCapabilities, requirements?: CapabilityRequirements): readonly CapabilityName[];
25
+ export declare class AdapterRegistry {
26
+ private readonly contractVersion;
27
+ private readonly records;
28
+ constructor(options?: AdapterRegistryOptions);
29
+ register(adapter: HarnessAdapter, source?: string): AdapterDescriptor;
30
+ registerLoadResult(result: AdapterLoadResult): readonly AdapterDescriptor[];
31
+ discover(loader: AdapterLoader): Promise<AdapterLoadResult>;
32
+ registerFailure(failure: AdapterLoadFailure): AdapterDescriptor;
33
+ list(): readonly AdapterDescriptor[];
34
+ resolve(selector: AdapterSelector, requirements?: CapabilityRequirements): Promise<AdapterResolution>;
35
+ select(selector: AdapterSelector, requirements?: CapabilityRequirements): Promise<HarnessAdapter>;
36
+ initialize(selector: AdapterSelector, context: HarnessContext, request: RunRequest, requirements?: CapabilityRequirements): Promise<AdapterInitialization>;
37
+ private candidates;
38
+ private recordFor;
39
+ private markUnavailable;
40
+ private key;
41
+ }
42
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,UAAU,EAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEhG,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,aAAa,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;CAC5C;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAgB,KAAK,EAAE,SAAS,CAAC;gBAEd,KAAK,EAAE,SAAS;CAKpC;AA2CD,6EAA6E;AAC7E,wBAAgB,2BAA2B,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAKnG;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,mBAAmB,EACjC,YAAY,CAAC,EAAE,sBAAsB,GACpC,SAAS,cAAc,EAAE,CAI3B;AAwCD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;gBAE1C,OAAO,GAAE,sBAA2B;IAIhD,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB;IAsCrE,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,iBAAiB,EAAE;IAcrE,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAMjE,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,iBAAiB;IAW/D,IAAI,IAAI,SAAS,iBAAiB,EAAE;IAQ9B,OAAO,CAClB,QAAQ,EAAE,eAAe,EACzB,YAAY,CAAC,EAAE,sBAAsB,GACpC,OAAO,CAAC,iBAAiB,CAAC;IAqDhB,MAAM,CAAC,QAAQ,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC;IAIjG,UAAU,CACrB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,UAAU,EACnB,YAAY,CAAC,EAAE,sBAAsB,GACpC,OAAO,CAAC,qBAAqB,CAAC;IAgBjC,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,GAAG;CAGZ"}
@@ -0,0 +1,210 @@
1
+ import { AdapterIdentitySchema, CONTRACT_VERSION, } from "@kadi.build/kadi-harness-contracts";
2
+ export class AdapterRegistryError extends Error {
3
+ error;
4
+ constructor(error) {
5
+ super(error.message);
6
+ this.name = "AdapterRegistryError";
7
+ this.error = error;
8
+ }
9
+ }
10
+ const CAPABILITY_FIELDS = {
11
+ steering: "steering",
12
+ resume: "resume",
13
+ fork: "fork",
14
+ compaction: "compaction",
15
+ tool_calling: "toolCalling",
16
+ native_checkpointing: "nativeCheckpointing",
17
+ streaming: "streaming",
18
+ permissions: "permissions",
19
+ artifacts: "artifacts",
20
+ };
21
+ function parseVersion(value) {
22
+ const match = /^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(value);
23
+ if (!match)
24
+ return undefined;
25
+ const major = Number(match[1]);
26
+ const minor = Number(match[2]);
27
+ const patch = Number(match[3]);
28
+ return [major, minor, patch].every(Number.isSafeInteger)
29
+ ? { major, minor, patch }
30
+ : undefined;
31
+ }
32
+ function compareVersions(left, right) {
33
+ const a = parseVersion(left);
34
+ const b = parseVersion(right);
35
+ if (!a || !b)
36
+ return left.localeCompare(right);
37
+ return a.major - b.major || a.minor - b.minor || a.patch - b.patch;
38
+ }
39
+ /** A runtime contract can consume its own patch and older minor releases. */
40
+ export function isContractVersionCompatible(runtimeVersion, adapterVersion) {
41
+ const runtime = parseVersion(runtimeVersion);
42
+ const adapter = parseVersion(adapterVersion);
43
+ return runtime !== undefined && adapter !== undefined &&
44
+ runtime.major === adapter.major && adapter.minor <= runtime.minor;
45
+ }
46
+ export function missingCapabilities(capabilities, requirements) {
47
+ return (requirements?.required ?? []).filter((name) => !capabilities[CAPABILITY_FIELDS[name]]);
48
+ }
49
+ function error(code, category, message, details = {}) {
50
+ return {
51
+ code,
52
+ category,
53
+ message,
54
+ retryable: category === "adapter_unavailable" || category === "service_failure",
55
+ details: Object.fromEntries(Object.entries(details).filter(([, value]) => value !== undefined)),
56
+ };
57
+ }
58
+ function unavailableIdentity(source, contractVersion) {
59
+ return {
60
+ id: `unavailable:${source}`,
61
+ name: source,
62
+ version: "0.0.0",
63
+ contractVersion,
64
+ transport: "native",
65
+ capabilities: {
66
+ steering: false,
67
+ resume: false,
68
+ fork: false,
69
+ compaction: false,
70
+ toolCalling: false,
71
+ nativeCheckpointing: false,
72
+ streaming: false,
73
+ permissions: false,
74
+ artifacts: false,
75
+ },
76
+ };
77
+ }
78
+ export class AdapterRegistry {
79
+ contractVersion;
80
+ records = new Map();
81
+ constructor(options = {}) {
82
+ this.contractVersion = options.contractVersion ?? CONTRACT_VERSION;
83
+ }
84
+ register(adapter, source) {
85
+ const parsed = AdapterIdentitySchema.safeParse(adapter.identity);
86
+ if (!parsed.success) {
87
+ throw new AdapterRegistryError(error("invalid_adapter_identity", "validation", "adapter identity does not satisfy the published contract", { source: source ?? "explicit-registration", adapterId: adapter.identity?.id }));
88
+ }
89
+ const identity = parsed.data;
90
+ const key = this.key(identity);
91
+ if (this.records.has(key)) {
92
+ throw new AdapterRegistryError(error("duplicate_adapter", "validation", `adapter '${identity.id}@${identity.version}' is already registered`, { adapterId: identity.id, version: identity.version }));
93
+ }
94
+ const incompatibility = isContractVersionCompatible(this.contractVersion, identity.contractVersion)
95
+ ? undefined
96
+ : error("contract_version_incompatible", "contract_incompatible", `adapter '${identity.id}' uses contract ${identity.contractVersion}; runtime requires ${this.contractVersion}`, { adapterId: identity.id, adapterContractVersion: identity.contractVersion, runtimeContractVersion: this.contractVersion });
97
+ const descriptor = {
98
+ identity,
99
+ source,
100
+ status: incompatibility ? "unavailable" : "available",
101
+ error: incompatibility,
102
+ };
103
+ this.records.set(key, { adapter, descriptor });
104
+ return descriptor;
105
+ }
106
+ registerLoadResult(result) {
107
+ const descriptors = [];
108
+ for (const loaded of result.adapters) {
109
+ try {
110
+ descriptors.push(this.register(loaded.adapter, loaded.source));
111
+ }
112
+ catch (caught) {
113
+ if (!(caught instanceof AdapterRegistryError))
114
+ throw caught;
115
+ descriptors.push(this.registerFailure({ source: loaded.source, error: caught.error }));
116
+ }
117
+ }
118
+ for (const failure of result.failures)
119
+ descriptors.push(this.registerFailure(failure));
120
+ return descriptors;
121
+ }
122
+ async discover(loader) {
123
+ const result = await loader.load();
124
+ this.registerLoadResult(result);
125
+ return result;
126
+ }
127
+ registerFailure(failure) {
128
+ const descriptor = {
129
+ identity: unavailableIdentity(failure.source, this.contractVersion),
130
+ source: failure.source,
131
+ status: "unavailable",
132
+ error: failure.error,
133
+ };
134
+ this.records.set(this.key(descriptor.identity), { descriptor });
135
+ return descriptor;
136
+ }
137
+ list() {
138
+ return [...this.records.values()]
139
+ .map((record) => record.descriptor)
140
+ .sort((left, right) => left.identity.id.localeCompare(right.identity.id) ||
141
+ compareVersions(right.identity.version, left.identity.version) ||
142
+ (left.source ?? "").localeCompare(right.source ?? ""));
143
+ }
144
+ async resolve(selector, requirements) {
145
+ const candidates = this.candidates(selector);
146
+ if (candidates.length === 0) {
147
+ throw new AdapterRegistryError(error("adapter_not_found", "adapter_unavailable", `no adapter matches '${selector.id}'${selector.version ? `@${selector.version}` : ""}`, { adapterId: selector.id, requestedVersion: selector.version, availableAdapters: this.list().map((entry) => entry.identity.id) }));
148
+ }
149
+ let lastError;
150
+ for (const record of candidates) {
151
+ const descriptor = record.descriptor;
152
+ if (descriptor.status === "unavailable") {
153
+ lastError = descriptor.error;
154
+ continue;
155
+ }
156
+ if (!record.adapter)
157
+ continue;
158
+ let capabilities;
159
+ try {
160
+ capabilities = await record.adapter.getCapabilities();
161
+ }
162
+ catch (cause) {
163
+ lastError = error("adapter_capability_discovery_failed", "adapter_unavailable", `adapter '${descriptor.identity.id}' failed capability discovery`, { adapterId: descriptor.identity.id, cause: cause instanceof Error ? cause.message : String(cause) });
164
+ this.markUnavailable(record, lastError);
165
+ continue;
166
+ }
167
+ const missing = missingCapabilities(capabilities, requirements);
168
+ if (missing.length > 0) {
169
+ lastError = error("required_capability_missing", "unsupported_capability", `adapter '${descriptor.identity.id}' does not support required capabilities: ${missing.join(", ")}`, { adapterId: descriptor.identity.id, missingCapabilities: missing });
170
+ continue;
171
+ }
172
+ return { adapter: record.adapter, descriptor, capabilities };
173
+ }
174
+ throw new AdapterRegistryError(lastError ?? error("adapter_unavailable", "adapter_unavailable", `no compatible adapter is available for '${selector.id}'`, { adapterId: selector.id }));
175
+ }
176
+ async select(selector, requirements) {
177
+ return (await this.resolve(selector, requirements)).adapter;
178
+ }
179
+ async initialize(selector, context, request, requirements) {
180
+ const resolution = await this.resolve(selector, requirements ?? request.capabilities);
181
+ try {
182
+ return await resolution.adapter.initialize(context, request);
183
+ }
184
+ catch (cause) {
185
+ const failure = error("adapter_initialization_failed", "adapter_unavailable", `adapter '${resolution.descriptor.identity.id}' failed initialization`, { adapterId: resolution.descriptor.identity.id, cause: cause instanceof Error ? cause.message : String(cause) });
186
+ this.markUnavailable(this.recordFor(resolution.descriptor), failure);
187
+ throw new AdapterRegistryError(failure);
188
+ }
189
+ }
190
+ candidates(selector) {
191
+ return [...this.records.values()]
192
+ .filter((record) => record.descriptor.identity.id === selector.id)
193
+ .filter((record) => selector.version === undefined || record.descriptor.identity.version === selector.version)
194
+ .filter((record) => selector.transport === undefined || record.descriptor.identity.transport === selector.transport)
195
+ .sort((left, right) => compareVersions(right.descriptor.identity.version, left.descriptor.identity.version));
196
+ }
197
+ recordFor(descriptor) {
198
+ return this.records.get(this.key(descriptor.identity)) ?? { descriptor };
199
+ }
200
+ markUnavailable(record, failure) {
201
+ this.records.set(this.key(record.descriptor.identity), {
202
+ ...record,
203
+ descriptor: { ...record.descriptor, status: "unavailable", error: failure },
204
+ });
205
+ }
206
+ key(identity) {
207
+ return `${identity.id}\u0000${identity.version}`;
208
+ }
209
+ }
210
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { type AdapterIdentity, type CancellationRequest, type HarnessContext, type HarnessEvent, type KadiError, type RunHandle, type RunRequest, type RunResult, type RunStatus, type TerminalRunStatus } from "@kadi.build/kadi-harness-contracts";
2
+ import { AdapterRegistry } from "./registry.js";
3
+ export type RunIdKind = "session" | "run" | "correlation";
4
+ export type RunIdFactory = (kind: RunIdKind) => string;
5
+ export interface RunContextInput {
6
+ readonly request: RunRequest;
7
+ readonly handle: RunHandle;
8
+ readonly correlationId: string;
9
+ readonly adapter: AdapterIdentity;
10
+ readonly signal: AbortSignal;
11
+ }
12
+ export type RunContextFactory = (input: RunContextInput) => HarnessContext | Promise<HarnessContext>;
13
+ export type RunEventHandler = (event: HarnessEvent, handle: RunHandle) => void | Promise<void>;
14
+ export type RunStatusHandler = (handle: RunHandle) => void | Promise<void>;
15
+ export interface RunCoordinatorOptions {
16
+ readonly registry: AdapterRegistry;
17
+ readonly contextFactory: RunContextFactory;
18
+ readonly idFactory?: RunIdFactory;
19
+ readonly timeoutMs?: number;
20
+ readonly onEvent?: RunEventHandler;
21
+ readonly onStatus?: RunStatusHandler;
22
+ }
23
+ export declare class RunCoordinatorError extends Error {
24
+ readonly error: KadiError;
25
+ constructor(error: KadiError);
26
+ }
27
+ export declare class RunCoordinator {
28
+ private readonly options;
29
+ private readonly records;
30
+ private readonly idFactory;
31
+ constructor(options: RunCoordinatorOptions);
32
+ execute(request: RunRequest): Promise<RunHandle>;
33
+ getRun(runId: string): Promise<RunHandle | RunResult>;
34
+ waitForResult(runId: string): Promise<RunResult>;
35
+ cancel(runId: string, request?: CancellationRequest): Promise<void>;
36
+ close(runId: string): Promise<void>;
37
+ private start;
38
+ private consumeEvents;
39
+ private cancelAdapter;
40
+ private fail;
41
+ private finish;
42
+ private cleanup;
43
+ private notifyStatus;
44
+ private getRecord;
45
+ }
46
+ export declare function isRunTerminal(status: RunStatus): status is TerminalRunStatus;
47
+ //# sourceMappingURL=run-coordinator.d.ts.map