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,167 @@
1
+ import { CheckpointReferenceSchema, } from "@kadi.build/kadi-harness-contracts";
2
+ import { redactJson, redactObject } from "./redaction.js";
3
+ import { normalizeArtifactReference } from "./artifacts.js";
4
+ function scopeDetails(scope) {
5
+ return { sessionId: scope.sessionId, runId: scope.runId, adapterId: scope.adapterId };
6
+ }
7
+ function makeError(scope, code, category, message, retryable, details = {}) {
8
+ return { code, category, message, retryable, correlationId: scope.correlationId, details: { ...scopeDetails(scope), ...(redactObject(details) ?? {}) } };
9
+ }
10
+ function isRecord(value) {
11
+ return typeof value === "object" && value !== null && !Array.isArray(value);
12
+ }
13
+ function isKadiError(value) {
14
+ return isRecord(value) && typeof value.code === "string" && typeof value.category === "string" && typeof value.message === "string";
15
+ }
16
+ function normalizeError(scope, value, operation) {
17
+ if (isKadiError(value))
18
+ return { ...value, correlationId: scope.correlationId, details: redactObject(value.details) };
19
+ return makeError(scope, "session_persistence_error", "service_failure", `${operation} failed`, true);
20
+ }
21
+ function cancellationError(scope) {
22
+ return makeError(scope, "operation_cancelled", "cancellation", "The scoped operation was cancelled", false);
23
+ }
24
+ async function authorize(options, operation) {
25
+ if (!options.authorize)
26
+ return undefined;
27
+ try {
28
+ const decision = await options.authorize({ operation, scope: options.scope });
29
+ if (decision === true || (typeof decision === "object" && decision.ok))
30
+ return undefined;
31
+ if (decision === false)
32
+ return makeError(options.scope, "authorization_denied", "authorization", `Authorization denied for ${operation}`, false, { operation });
33
+ return decision.error;
34
+ }
35
+ catch (caught) {
36
+ return normalizeError(options.scope, caught, `${operation} authorization`);
37
+ }
38
+ }
39
+ function unwrap(value) {
40
+ if (isRecord(value) && value.ok === false)
41
+ throw value.error;
42
+ if (isRecord(value) && value.success === false)
43
+ throw new Error("backend rejected operation");
44
+ if (isRecord(value) && value.ok === true && "value" in value)
45
+ return value.value;
46
+ return value;
47
+ }
48
+ function ensureSession(scope, sessionId) {
49
+ if (sessionId !== scope.sessionId)
50
+ return makeError(scope, "session_scope_violation", "authorization", "Session ID does not match the current run scope", false, { requestedSessionId: sessionId });
51
+ return undefined;
52
+ }
53
+ function normalizeStatus(value) {
54
+ return typeof value === "string" && ["queued", "starting", "running", "completed", "failed", "cancelled", "timed_out"].includes(value) ? value : undefined;
55
+ }
56
+ function normalizeCheckpoint(value, scope) {
57
+ if (value === undefined)
58
+ return undefined;
59
+ const parsed = CheckpointReferenceSchema.safeParse(value);
60
+ if (!parsed.success)
61
+ throw makeError(scope, "invalid_checkpoint", "validation", "Session backend returned an invalid checkpoint reference", false);
62
+ return parsed.data;
63
+ }
64
+ function normalizeSnapshot(value, scope) {
65
+ if (value === undefined || value === null)
66
+ return undefined;
67
+ if (isRecord(value) && value.found === false)
68
+ return undefined;
69
+ const source = isRecord(value) && "snapshot" in value ? value.snapshot : value;
70
+ if (isRecord(source) && typeof source.sessionId === "string") {
71
+ return {
72
+ sessionId: source.sessionId,
73
+ runId: typeof source.runId === "string" ? source.runId : undefined,
74
+ status: normalizeStatus(source.status),
75
+ data: isRecord(source.data) ? redactJson(source.data) : undefined,
76
+ checkpoint: normalizeCheckpoint(source.checkpoint, scope),
77
+ artifacts: Array.isArray(source.artifacts) ? source.artifacts.map((artifact) => normalizeArtifactReference(artifact, scope)) : undefined,
78
+ metadata: isRecord(source.metadata) ? redactJson(source.metadata) : undefined,
79
+ };
80
+ }
81
+ if (!isRecord(source) || !isRecord(source.session) || typeof source.session.sessionId !== "string") {
82
+ throw makeError(scope, "invalid_session_snapshot", "service_failure", "Session backend returned an invalid snapshot", false);
83
+ }
84
+ const runs = Array.isArray(source.runs) ? source.runs : [];
85
+ const latestRun = runs.at(-1);
86
+ const session = source.session;
87
+ const sessionId = typeof session.sessionId === "string" ? session.sessionId : "";
88
+ const metadata = { correlationId: scope.correlationId };
89
+ if (isRecord(source.metadata))
90
+ Object.assign(metadata, redactJson(source.metadata));
91
+ return {
92
+ sessionId,
93
+ runId: isRecord(latestRun) && typeof latestRun.runId === "string" ? latestRun.runId : undefined,
94
+ status: normalizeStatus(session.status),
95
+ data: redactJson({ session, plan: source.plan, progress: source.progress, runs }),
96
+ checkpoint: normalizeCheckpoint(source.checkpoint, scope),
97
+ artifacts: Array.isArray(source.artifacts) ? source.artifacts.map((artifact) => normalizeArtifactReference(artifact, scope)) : undefined,
98
+ metadata,
99
+ };
100
+ }
101
+ /** Scoped session-state facade over the session-state ability or another durable backend. */
102
+ export class SessionGateway {
103
+ options;
104
+ constructor(options) {
105
+ this.options = options;
106
+ }
107
+ async load(sessionId) {
108
+ const denied = await authorize(this.options, "sessions.load");
109
+ if (denied)
110
+ return { ok: false, error: denied };
111
+ const scoped = ensureSession(this.options.scope, sessionId);
112
+ if (scoped)
113
+ return { ok: false, error: scoped };
114
+ if (this.options.scope.signal?.aborted)
115
+ return { ok: false, error: cancellationError(this.options.scope) };
116
+ try {
117
+ const value = unwrap(await this.options.backend.load(this.options.scope, sessionId, { includeRuns: true, includeArtifacts: true }));
118
+ return { ok: true, value: normalizeSnapshot(value, this.options.scope) };
119
+ }
120
+ catch (caught) {
121
+ return { ok: false, error: caught && isKadiError(caught) ? caught : normalizeError(this.options.scope, caught, "sessions.load") };
122
+ }
123
+ }
124
+ async save(snapshot) {
125
+ const denied = await authorize(this.options, "sessions.save");
126
+ if (denied)
127
+ return { ok: false, error: denied };
128
+ const scoped = ensureSession(this.options.scope, snapshot.sessionId);
129
+ if (scoped)
130
+ return { ok: false, error: scoped };
131
+ if (this.options.scope.signal?.aborted)
132
+ return { ok: false, error: cancellationError(this.options.scope) };
133
+ try {
134
+ const persisted = {
135
+ ...snapshot,
136
+ data: snapshot.data ? redactJson(snapshot.data) : undefined,
137
+ metadata: { ...snapshot.metadata, correlationId: this.options.scope.correlationId },
138
+ };
139
+ unwrap(await this.options.backend.save(this.options.scope, persisted));
140
+ return { ok: true, value: undefined };
141
+ }
142
+ catch (caught) {
143
+ return { ok: false, error: caught && isKadiError(caught) ? caught : normalizeError(this.options.scope, caught, "sessions.save") };
144
+ }
145
+ }
146
+ async appendTimeline(entry) {
147
+ const denied = await authorize(this.options, "sessions.appendTimeline");
148
+ if (denied)
149
+ return { ok: false, error: denied };
150
+ if (this.options.scope.signal?.aborted)
151
+ return { ok: false, error: cancellationError(this.options.scope) };
152
+ if (!this.options.backend.appendTimeline)
153
+ return { ok: false, error: makeError(this.options.scope, "session_timeline_unavailable", "service_failure", "Session backend does not support timeline persistence", false) };
154
+ try {
155
+ const persisted = { ...entry, data: { ...entry.data, correlationId: this.options.scope.correlationId } };
156
+ unwrap(await this.options.backend.appendTimeline(this.options.scope, persisted));
157
+ return { ok: true, value: undefined };
158
+ }
159
+ catch (caught) {
160
+ return { ok: false, error: caught && isKadiError(caught) ? caught : normalizeError(this.options.scope, caught, "sessions.appendTimeline") };
161
+ }
162
+ }
163
+ }
164
+ export function createSessionGateway(options) {
165
+ return new SessionGateway(options);
166
+ }
167
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/gateways/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { ScopedToolService, ServiceResult, ToolDefinition, ToolInvocationRequest, ToolInvocationResult, ToolListOptions } from "@kadi.build/kadi-harness-contracts";
2
+ export interface GatewayScope {
3
+ readonly contractVersion: string;
4
+ readonly sessionId: string;
5
+ readonly runId: string;
6
+ readonly adapterId: string;
7
+ readonly correlationId: string;
8
+ readonly signal?: AbortSignal;
9
+ }
10
+ export type GatewayOperation = "tools.list" | "tools.invoke" | "events.publish" | "events.subscribe" | "sessions.load" | "sessions.save" | "sessions.appendTimeline" | "artifacts.put" | "artifacts.get" | "artifacts.list";
11
+ export interface GatewayAuthorizationRequest {
12
+ readonly operation: GatewayOperation;
13
+ readonly scope: GatewayScope;
14
+ readonly toolName?: string;
15
+ readonly eventType?: string;
16
+ }
17
+ export type GatewayAuthorizer = (request: GatewayAuthorizationRequest) => Promise<ServiceResult<void> | boolean> | ServiceResult<void> | boolean;
18
+ /** The smallest surface required to wrap BridgeToolRouter or another KADI router. */
19
+ export interface ToolRouterBackend {
20
+ getAvailableTools(): readonly unknown[] | Promise<readonly unknown[]>;
21
+ route(toolName: string, params: Record<string, unknown>): Promise<unknown>;
22
+ }
23
+ export interface ToolGatewayOptions {
24
+ readonly scope: GatewayScope;
25
+ readonly router: ToolRouterBackend;
26
+ readonly authorize?: GatewayAuthorizer;
27
+ }
28
+ /** Scoped facade over native, broker, or MCP-backed KADI tool routing. */
29
+ export declare class ToolGateway implements ScopedToolService {
30
+ private readonly options;
31
+ constructor(options: ToolGatewayOptions);
32
+ list(options?: ToolListOptions): Promise<ServiceResult<readonly ToolDefinition[]>>;
33
+ invoke(request: ToolInvocationRequest): Promise<ServiceResult<ToolInvocationResult>>;
34
+ }
35
+ export declare function createToolGateway(options: ToolGatewayOptions): ScopedToolService;
36
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/gateways/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EAChB,MAAM,oCAAoC,CAAC;AAG5C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,MAAM,gBAAgB,GACxB,YAAY,GAAG,cAAc,GAAG,gBAAgB,GAAG,kBAAkB,GACrE,eAAe,GAAG,eAAe,GAAG,yBAAyB,GAC7D,eAAe,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAEzD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,iBAAiB,GAAG,CAC9B,OAAO,EAAE,2BAA2B,KACjC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;AAE5E,qFAAqF;AACrF,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,IAAI,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CACxC;AAyGD,0EAA0E;AAC1E,qBAAa,WAAY,YAAW,iBAAiB;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAE1B,OAAO,EAAE,kBAAkB;IAIjC,IAAI,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;IAoBtF,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;CAWlG;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CAEhF"}
@@ -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, "service_transport_error", "service_failure", `${operation} failed: ${message}`, true);
34
+ }
35
+ function isRecord(value) {
36
+ return typeof value === "object" && value !== null && !Array.isArray(value);
37
+ }
38
+ function normalizeDefinition(value) {
39
+ if (!isRecord(value) || typeof value.name !== "string")
40
+ return undefined;
41
+ return {
42
+ name: value.name,
43
+ description: typeof value.description === "string" ? value.description : undefined,
44
+ inputSchema: isRecord(value.inputSchema) ? redactJson(value.inputSchema) : undefined,
45
+ metadata: isRecord(value.metadata) ? redactJson(value.metadata) : undefined,
46
+ };
47
+ }
48
+ function normalizeInvocation(value, scope) {
49
+ if (isRecord(value) && value.success === false) {
50
+ const error = value.error;
51
+ throw normalizeError(scope, error, "tools.invoke");
52
+ }
53
+ if (isRecord(value) && value.success === true && "data" in value) {
54
+ return {
55
+ output: redactJson(value.data),
56
+ metadata: { correlationId: scope.correlationId },
57
+ };
58
+ }
59
+ if (isRecord(value) && ("output" in value || "metadata" in value || "artifacts" in value)) {
60
+ return {
61
+ output: "output" in value ? redactJson(value.output) : undefined,
62
+ metadata: {
63
+ ...(isRecord(value.metadata) ? redactJson(value.metadata) : {}),
64
+ correlationId: scope.correlationId,
65
+ },
66
+ };
67
+ }
68
+ return { output: redactJson(value), metadata: { correlationId: scope.correlationId } };
69
+ }
70
+ async function authorize(options, request) {
71
+ if (!options.authorize)
72
+ return undefined;
73
+ try {
74
+ const decision = await options.authorize(request);
75
+ if (decision === true || (typeof decision === "object" && decision.ok))
76
+ return undefined;
77
+ if (decision === false) {
78
+ return makeError(options.scope, "authorization_denied", "authorization", `Authorization denied for ${request.operation}`, false, { operation: request.operation, toolName: request.toolName });
79
+ }
80
+ return decision.error;
81
+ }
82
+ catch (caught) {
83
+ return normalizeError(options.scope, caught, `${request.operation} authorization`);
84
+ }
85
+ }
86
+ function cancellationError(scope) {
87
+ return makeError(scope, "operation_cancelled", "cancellation", "The scoped operation was cancelled", false);
88
+ }
89
+ /** Scoped facade over native, broker, or MCP-backed KADI tool routing. */
90
+ export class ToolGateway {
91
+ options;
92
+ constructor(options) {
93
+ this.options = options;
94
+ }
95
+ async list(options = {}) {
96
+ const denied = await authorize(this.options, { operation: "tools.list", scope: this.options.scope });
97
+ if (denied)
98
+ return { ok: false, error: denied };
99
+ if (this.options.scope.signal?.aborted)
100
+ return { ok: false, error: cancellationError(this.options.scope) };
101
+ try {
102
+ const definitions = await this.options.router.getAvailableTools();
103
+ const normalized = definitions
104
+ .map(normalizeDefinition)
105
+ .filter((definition) => definition !== undefined)
106
+ .filter((definition) => options.prefix === undefined || definition.name.startsWith(options.prefix))
107
+ .filter((definition) => options.includeDisabled === true || definition.metadata?.disabled !== true);
108
+ return {
109
+ ok: true,
110
+ value: normalized,
111
+ };
112
+ }
113
+ catch (caught) {
114
+ return { ok: false, error: normalizeError(this.options.scope, caught, "tools.list") };
115
+ }
116
+ }
117
+ async invoke(request) {
118
+ const denied = await authorize(this.options, { operation: "tools.invoke", scope: this.options.scope, toolName: request.name });
119
+ if (denied)
120
+ return { ok: false, error: denied };
121
+ if (this.options.scope.signal?.aborted)
122
+ return { ok: false, error: cancellationError(this.options.scope) };
123
+ try {
124
+ const value = await this.options.router.route(request.name, request.arguments);
125
+ return { ok: true, value: normalizeInvocation(value, this.options.scope) };
126
+ }
127
+ catch (caught) {
128
+ return { ok: false, error: normalizeError(this.options.scope, caught, "tools.invoke") };
129
+ }
130
+ }
131
+ }
132
+ export function createToolGateway(options) {
133
+ return new ToolGateway(options);
134
+ }
135
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/gateways/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import type { AdapterIdentity, CancellationRequest, HarnessEvent, JsonObject, RunHandle, RunInput, RunRequest, RunResult, RunStatus, ScheduleCreateRequest, ScheduleReference, ServiceCapabilities } from "@kadi.build/kadi-harness-contracts";
2
+ export * from "./adapter-loader.js";
3
+ export * from "./event-bus.js";
4
+ export * from "./event-normalizer.js";
5
+ export * from "./lifecycle.js";
6
+ export * from "./registry.js";
7
+ export * from "./run-coordinator.js";
8
+ export * from "./gateways/redaction.js";
9
+ export * from "./gateways/tools.js";
10
+ export * from "./gateways/events.js";
11
+ export * from "./gateways/authorization.js";
12
+ export * from "./gateways/sessions.js";
13
+ export * from "./gateways/artifacts.js";
14
+ export * from "./scheduling/request-store.js";
15
+ export * from "./scheduling/signing.js";
16
+ export * from "./runner/runner-service.js";
17
+ export * from "./protocol/context-server.js";
18
+ export * from "./protocol/context-client.js";
19
+ export type RuntimeHealthStatus = "healthy" | "degraded" | "unavailable";
20
+ export interface RuntimeObserveOptions {
21
+ readonly afterEventId?: string;
22
+ readonly signal?: AbortSignal;
23
+ }
24
+ export interface RuntimeSessionSummary {
25
+ readonly sessionId: string;
26
+ readonly latestRunId?: string;
27
+ readonly status?: RunStatus;
28
+ readonly metadata?: JsonObject;
29
+ }
30
+ export interface RuntimeSessionQuery {
31
+ readonly limit?: number;
32
+ readonly cursor?: string;
33
+ }
34
+ export interface RuntimeForkOptions {
35
+ readonly input?: RunInput;
36
+ readonly metadata?: JsonObject;
37
+ }
38
+ export interface RuntimeResumeOptions {
39
+ readonly runId?: string;
40
+ readonly metadata?: JsonObject;
41
+ }
42
+ export interface RuntimeHealth {
43
+ readonly status: RuntimeHealthStatus;
44
+ readonly contractVersion: string;
45
+ readonly adapterCount: number;
46
+ readonly services: ServiceCapabilities;
47
+ readonly details?: JsonObject;
48
+ }
49
+ /**
50
+ * Frontend-neutral execution API. It contains no CLI, UI, Pi, ACP, or service
51
+ * implementation types, so a web app, CLI, service, or embedded SDK can use it.
52
+ */
53
+ export interface RuntimeClient {
54
+ execute(request: RunRequest): Promise<RunHandle>;
55
+ observe(runId: string, options?: RuntimeObserveOptions): AsyncIterable<HarnessEvent>;
56
+ getRun(runId: string): Promise<RunHandle | RunResult>;
57
+ cancel(runId: string, request?: CancellationRequest): Promise<void>;
58
+ steer(runId: string, input: RunInput): Promise<void>;
59
+ resume(sessionId: string, options?: RuntimeResumeOptions): Promise<RunHandle>;
60
+ fork(runId: string, options?: RuntimeForkOptions): Promise<RunHandle>;
61
+ listSessions(query?: RuntimeSessionQuery): Promise<readonly RuntimeSessionSummary[]>;
62
+ getSessionTimeline(sessionId: string, options?: RuntimeObserveOptions): AsyncIterable<HarnessEvent>;
63
+ schedule(request: ScheduleCreateRequest): Promise<ScheduleReference>;
64
+ unschedule(scheduleId: string): Promise<void>;
65
+ listAdapters(): Promise<readonly AdapterIdentity[]>;
66
+ health(): Promise<RuntimeHealth>;
67
+ }
68
+ /**
69
+ * Runtime implementation boundary used while the coordinator and gateways are
70
+ * developed. Future runtime internals implement this same public contract.
71
+ */
72
+ export interface RuntimeClientOptions {
73
+ readonly implementation: RuntimeClient;
74
+ }
75
+ /**
76
+ * Creates a runtime client without starting a process or taking ownership of a
77
+ * frontend. The implementation is injected so the public API can be adopted by
78
+ * CLI, web, service, and embedded callers before coordinator internals land.
79
+ */
80
+ export declare function createRuntimeClient(options: RuntimeClientOptions): RuntimeClient;
81
+ export * from "./runtime.js";
82
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ export * from "./adapter-loader.js";
2
+ export * from "./event-bus.js";
3
+ export * from "./event-normalizer.js";
4
+ export * from "./lifecycle.js";
5
+ export * from "./registry.js";
6
+ export * from "./run-coordinator.js";
7
+ export * from "./gateways/redaction.js";
8
+ export * from "./gateways/tools.js";
9
+ export * from "./gateways/events.js";
10
+ export * from "./gateways/authorization.js";
11
+ export * from "./gateways/sessions.js";
12
+ export * from "./gateways/artifacts.js";
13
+ export * from "./scheduling/request-store.js";
14
+ export * from "./scheduling/signing.js";
15
+ export * from "./runner/runner-service.js";
16
+ export * from "./protocol/context-server.js";
17
+ export * from "./protocol/context-client.js";
18
+ /**
19
+ * Creates a runtime client without starting a process or taking ownership of a
20
+ * frontend. The implementation is injected so the public API can be adopted by
21
+ * CLI, web, service, and embedded callers before coordinator internals land.
22
+ */
23
+ export function createRuntimeClient(options) {
24
+ return options.implementation;
25
+ }
26
+ export * from "./runtime.js";
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAsE7C;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,OAAO,OAAO,CAAC,cAAc,CAAC;AAChC,CAAC;AAED,cAAc,cAAc,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { JsonObject, JsonValue, RunHandle, RunResult, RunStatus, TerminalRunStatus } from "@kadi.build/kadi-harness-contracts";
2
+ export interface LifecycleOutcome {
3
+ readonly status: TerminalRunStatus;
4
+ readonly output?: JsonValue;
5
+ readonly metadata?: JsonObject;
6
+ }
7
+ export declare function isTerminalStatus(status: RunStatus): status is TerminalRunStatus;
8
+ /**
9
+ * Owns the state machine for one run. Closing is idempotent: only the first
10
+ * terminal outcome changes state and produces a result.
11
+ */
12
+ export declare class RunLifecycle {
13
+ private readonly base;
14
+ private currentStatus;
15
+ private terminalResult?;
16
+ constructor(base: Omit<RunHandle, "status">);
17
+ get status(): RunStatus;
18
+ get result(): RunResult | undefined;
19
+ transition(nextStatus: RunStatus): boolean;
20
+ close(outcome: LifecycleOutcome): boolean;
21
+ handle(): RunHandle;
22
+ }
23
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,iBAAiB,EAClB,MAAM,oCAAoC,CAAC;AAE5C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;CAChC;AAmBD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,IAAI,iBAAiB,CAE/E;AAED;;;GAGG;AACH,qBAAa,YAAY;IAIJ,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHxC,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,cAAc,CAAC,CAAY;gBAEC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;IAInE,IAAW,MAAM,IAAI,SAAS,CAE7B;IAED,IAAW,MAAM,IAAI,SAAS,GAAG,SAAS,CAEzC;IAEM,UAAU,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO;IAO1C,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;IAazC,MAAM,IAAI,SAAS;CAG3B"}
@@ -0,0 +1,63 @@
1
+ const TERMINAL_STATUSES = [
2
+ "completed",
3
+ "failed",
4
+ "cancelled",
5
+ "timed_out",
6
+ ];
7
+ const TRANSITIONS = {
8
+ queued: ["starting", "failed", "cancelled", "timed_out"],
9
+ starting: ["running", "failed", "cancelled", "timed_out"],
10
+ running: ["completed", "failed", "cancelled", "timed_out"],
11
+ completed: [],
12
+ failed: [],
13
+ cancelled: [],
14
+ timed_out: [],
15
+ };
16
+ export function isTerminalStatus(status) {
17
+ return TERMINAL_STATUSES.includes(status);
18
+ }
19
+ /**
20
+ * Owns the state machine for one run. Closing is idempotent: only the first
21
+ * terminal outcome changes state and produces a result.
22
+ */
23
+ export class RunLifecycle {
24
+ base;
25
+ currentStatus;
26
+ terminalResult;
27
+ constructor(base) {
28
+ this.base = base;
29
+ this.currentStatus = "queued";
30
+ }
31
+ get status() {
32
+ return this.currentStatus;
33
+ }
34
+ get result() {
35
+ return this.terminalResult;
36
+ }
37
+ transition(nextStatus) {
38
+ if (isTerminalStatus(this.currentStatus))
39
+ return false;
40
+ if (!TRANSITIONS[this.currentStatus].includes(nextStatus))
41
+ return false;
42
+ this.currentStatus = nextStatus;
43
+ return true;
44
+ }
45
+ close(outcome) {
46
+ if (isTerminalStatus(this.currentStatus))
47
+ return false;
48
+ if (!isTerminalStatus(outcome.status))
49
+ return false;
50
+ this.currentStatus = outcome.status;
51
+ this.terminalResult = {
52
+ ...this.base,
53
+ status: outcome.status,
54
+ output: outcome.output,
55
+ metadata: outcome.metadata,
56
+ };
57
+ return true;
58
+ }
59
+ handle() {
60
+ return { ...this.base, status: this.currentStatus };
61
+ }
62
+ }
63
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAeA,MAAM,iBAAiB,GAAiC;IACtD,WAAW;IACX,QAAQ;IACR,WAAW;IACX,WAAW;CACZ,CAAC;AAEF,MAAM,WAAW,GAAsD;IACrE,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IACxD,QAAQ,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IACzD,OAAO,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;IAC1D,SAAS,EAAE,EAAE;IACb,MAAM,EAAE,EAAE;IACV,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;CACd,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,OAAO,iBAAiB,CAAC,QAAQ,CAAC,MAA2B,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,YAAY;IAIa;IAH5B,aAAa,CAAY;IACzB,cAAc,CAAa;IAEnC,YAAoC,IAA+B;QAA/B,SAAI,GAAJ,IAAI,CAA2B;QACjE,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;IAChC,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEM,UAAU,CAAC,UAAqB;QACrC,IAAI,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC;YAAE,OAAO,KAAK,CAAC;QACvD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QACxE,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,OAAyB;QACpC,IAAI,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC;YAAE,OAAO,KAAK,CAAC;QACvD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACpD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG;YACpB,GAAG,IAAI,CAAC,IAAI;YACZ,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,MAAM;QACX,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IACtD,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { JsonObject, JsonValue } from "@kadi.build/kadi-harness-contracts";
2
+ /**
3
+ * Converts untrusted values into bounded JSON-safe data while redacting
4
+ * credential-like keys. Cycles and excessively deep/large values are replaced
5
+ * with safe markers instead of being serialized or logged.
6
+ */
7
+ export declare function redactJson(value: unknown): JsonValue;
8
+ export declare function redactObject(value: Record<string, unknown> | undefined): JsonObject | undefined;
9
+ export declare function isSensitiveKey(key: string): boolean;
10
+ //# sourceMappingURL=redaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../../src/policy/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAWhF;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CA0BpD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAG/F;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD"}