@oscharko-dev/keiko-contracts 0.2.8 → 0.2.9

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 (106) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/bff-wire.d.ts +33 -0
  3. package/dist/bff-wire.d.ts.map +1 -1
  4. package/dist/command-runner.d.ts +81 -0
  5. package/dist/command-runner.d.ts.map +1 -0
  6. package/dist/command-runner.js +209 -0
  7. package/dist/container-runtime.d.ts +125 -0
  8. package/dist/container-runtime.d.ts.map +1 -0
  9. package/dist/container-runtime.js +287 -0
  10. package/dist/context-engineering.js +2 -2
  11. package/dist/discussion-intelligence.d.ts +70 -0
  12. package/dist/discussion-intelligence.d.ts.map +1 -0
  13. package/dist/discussion-intelligence.js +440 -0
  14. package/dist/editor-agent-governance.d.ts +65 -0
  15. package/dist/editor-agent-governance.d.ts.map +1 -0
  16. package/dist/editor-agent-governance.js +180 -0
  17. package/dist/editor-agent.d.ts +29 -1
  18. package/dist/editor-agent.d.ts.map +1 -1
  19. package/dist/editor-agent.js +183 -6
  20. package/dist/editor-builtin-capabilities.d.ts +13 -0
  21. package/dist/editor-builtin-capabilities.d.ts.map +1 -0
  22. package/dist/editor-builtin-capabilities.js +135 -0
  23. package/dist/editor-language-mode-map.d.ts +11 -0
  24. package/dist/editor-language-mode-map.d.ts.map +1 -0
  25. package/dist/editor-language-mode-map.js +89 -0
  26. package/dist/editor-layout.d.ts +37 -0
  27. package/dist/editor-layout.d.ts.map +1 -1
  28. package/dist/editor-layout.js +125 -8
  29. package/dist/editor-workspace-path.d.ts +20 -0
  30. package/dist/editor-workspace-path.d.ts.map +1 -0
  31. package/dist/editor-workspace-path.js +133 -0
  32. package/dist/evidence.d.ts +3 -1
  33. package/dist/evidence.d.ts.map +1 -1
  34. package/dist/gateway.d.ts +72 -3
  35. package/dist/gateway.d.ts.map +1 -1
  36. package/dist/gateway.js +73 -3
  37. package/dist/git-commit-intent.d.ts +28 -0
  38. package/dist/git-commit-intent.d.ts.map +1 -0
  39. package/dist/git-commit-intent.js +155 -0
  40. package/dist/git-commit-policy.d.ts +29 -0
  41. package/dist/git-commit-policy.d.ts.map +1 -0
  42. package/dist/git-commit-policy.js +173 -0
  43. package/dist/git-delivery-action-sheet.d.ts +157 -0
  44. package/dist/git-delivery-action-sheet.d.ts.map +1 -0
  45. package/dist/git-delivery-action-sheet.js +430 -0
  46. package/dist/git-delivery-evidence.d.ts +92 -0
  47. package/dist/git-delivery-evidence.d.ts.map +1 -0
  48. package/dist/git-delivery-evidence.js +272 -0
  49. package/dist/git-delivery-policy.d.ts +40 -0
  50. package/dist/git-delivery-policy.d.ts.map +1 -0
  51. package/dist/git-delivery-policy.js +183 -0
  52. package/dist/git-delivery-provider.d.ts +53 -0
  53. package/dist/git-delivery-provider.d.ts.map +1 -0
  54. package/dist/git-delivery-provider.js +96 -0
  55. package/dist/git-delivery.d.ts +202 -0
  56. package/dist/git-delivery.d.ts.map +1 -0
  57. package/dist/git-delivery.js +410 -0
  58. package/dist/git-history.d.ts +27 -0
  59. package/dist/git-history.d.ts.map +1 -0
  60. package/dist/git-history.js +73 -0
  61. package/dist/git-merge.d.ts +67 -0
  62. package/dist/git-merge.d.ts.map +1 -0
  63. package/dist/git-merge.js +323 -0
  64. package/dist/git-pull-request.d.ts +112 -0
  65. package/dist/git-pull-request.d.ts.map +1 -0
  66. package/dist/git-pull-request.js +351 -0
  67. package/dist/git-repository-agent.d.ts +46 -0
  68. package/dist/git-repository-agent.d.ts.map +1 -0
  69. package/dist/git-repository-agent.js +198 -0
  70. package/dist/git-repository-summary.d.ts +54 -0
  71. package/dist/git-repository-summary.d.ts.map +1 -0
  72. package/dist/git-repository-summary.js +105 -0
  73. package/dist/git-repository.d.ts +60 -0
  74. package/dist/git-repository.d.ts.map +1 -0
  75. package/dist/git-repository.js +106 -0
  76. package/dist/git-sync.d.ts +49 -0
  77. package/dist/git-sync.d.ts.map +1 -0
  78. package/dist/git-sync.js +110 -0
  79. package/dist/index.d.ts +63 -9
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +33 -6
  82. package/dist/lsp-process.d.ts +38 -0
  83. package/dist/lsp-process.d.ts.map +1 -0
  84. package/dist/lsp-process.js +103 -0
  85. package/dist/runtime-capabilities.d.ts +44 -0
  86. package/dist/runtime-capabilities.d.ts.map +1 -0
  87. package/dist/runtime-capabilities.js +141 -0
  88. package/dist/task-workspace.d.ts +302 -0
  89. package/dist/task-workspace.d.ts.map +1 -0
  90. package/dist/task-workspace.js +1236 -0
  91. package/dist/voice-action-intent.d.ts +86 -0
  92. package/dist/voice-action-intent.d.ts.map +1 -0
  93. package/dist/voice-action-intent.js +387 -0
  94. package/dist/voice-playback.d.ts +50 -0
  95. package/dist/voice-playback.d.ts.map +1 -0
  96. package/dist/voice-playback.js +240 -0
  97. package/dist/voice-protocol.d.ts +165 -0
  98. package/dist/voice-protocol.d.ts.map +1 -0
  99. package/dist/voice-protocol.js +312 -0
  100. package/dist/voice-transcript.d.ts +57 -0
  101. package/dist/voice-transcript.d.ts.map +1 -0
  102. package/dist/voice-transcript.js +221 -0
  103. package/package.json +5 -1
  104. package/dist/conversation-budget.d.ts +0 -37
  105. package/dist/conversation-budget.d.ts.map +0 -1
  106. package/dist/conversation-budget.js +0 -97
@@ -0,0 +1,81 @@
1
+ import type { CommandRule } from "./tools.js";
2
+ export declare const COMMAND_RUNNER_SCHEMA_VERSION: "1";
3
+ export type CommandTaskKind = "test" | "build" | "run";
4
+ export declare const COMMAND_TASK_KINDS: readonly CommandTaskKind[];
5
+ export type CommandTaskSource = "package-json-script";
6
+ export declare const COMMAND_TASK_SOURCES: readonly CommandTaskSource[];
7
+ export interface CommandTask {
8
+ readonly id: string;
9
+ readonly kind: CommandTaskKind;
10
+ readonly label: string;
11
+ readonly executable: string;
12
+ readonly args: readonly string[];
13
+ readonly source: CommandTaskSource;
14
+ }
15
+ export interface CommandTaskCatalog {
16
+ readonly schemaVersion: typeof COMMAND_RUNNER_SCHEMA_VERSION;
17
+ readonly projectId: string;
18
+ readonly tasks: readonly CommandTask[];
19
+ }
20
+ export type CommandFailureReason = "none" | "non-zero-exit" | "timed-out" | "cancelled" | "denied" | "spawn-error";
21
+ export declare const COMMAND_FAILURE_REASONS: readonly CommandFailureReason[];
22
+ export interface CommandTaskRunRequest {
23
+ readonly projectId: string;
24
+ readonly taskId: string;
25
+ readonly timeoutMs?: number | undefined;
26
+ readonly requestId?: string | undefined;
27
+ }
28
+ export interface CommandTaskRunResult {
29
+ readonly schemaVersion: typeof COMMAND_RUNNER_SCHEMA_VERSION;
30
+ readonly runId: string;
31
+ readonly taskId: string;
32
+ readonly kind: CommandTaskKind;
33
+ readonly exitCode: number | null;
34
+ readonly durationMs: number;
35
+ readonly truncated: boolean;
36
+ readonly timedOut: boolean;
37
+ readonly failureReason: CommandFailureReason;
38
+ readonly stdout: string;
39
+ readonly stderr: string;
40
+ }
41
+ export type CommandRunnerEventKind = "run-started" | "run-completed" | "run-failed" | "run-cancelled";
42
+ export declare const COMMAND_RUNNER_EVENT_KINDS: readonly CommandRunnerEventKind[];
43
+ export interface CommandRunnerEvent {
44
+ readonly kind: CommandRunnerEventKind;
45
+ readonly runId: string;
46
+ readonly payload: Readonly<Record<string, unknown>>;
47
+ }
48
+ export declare const COMMAND_TASK_RULES: readonly CommandRule[];
49
+ export interface CommandTaskRunRequestParseOk {
50
+ readonly ok: true;
51
+ readonly value: CommandTaskRunRequest;
52
+ }
53
+ export interface CommandTaskRunRequestParseFail {
54
+ readonly ok: false;
55
+ readonly errors: readonly string[];
56
+ }
57
+ export type CommandTaskRunRequestParse = CommandTaskRunRequestParseOk | CommandTaskRunRequestParseFail;
58
+ export interface CommandTaskCatalogParseOk {
59
+ readonly ok: true;
60
+ readonly value: CommandTaskCatalog;
61
+ }
62
+ export interface CommandTaskCatalogParseFail {
63
+ readonly ok: false;
64
+ readonly errors: readonly string[];
65
+ }
66
+ export type CommandTaskCatalogParse = CommandTaskCatalogParseOk | CommandTaskCatalogParseFail;
67
+ export interface CommandTaskRunResultParseOk {
68
+ readonly ok: true;
69
+ readonly value: CommandTaskRunResult;
70
+ }
71
+ export interface CommandTaskRunResultParseFail {
72
+ readonly ok: false;
73
+ readonly errors: readonly string[];
74
+ }
75
+ export type CommandTaskRunResultParse = CommandTaskRunResultParseOk | CommandTaskRunResultParseFail;
76
+ export declare const MAX_TASK_ID_LENGTH = 256;
77
+ export declare const MAX_REQUEST_ID_LENGTH = 128;
78
+ export declare function parseCommandTaskRunRequest(input: unknown): CommandTaskRunRequestParse;
79
+ export declare function validateCommandTaskCatalog(value: unknown): CommandTaskCatalogParse;
80
+ export declare function validateCommandTaskRunResult(value: unknown): CommandTaskRunResultParse;
81
+ //# sourceMappingURL=command-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-runner.d.ts","sourceRoot":"","sources":["../src/command-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,209 @@
1
+ // Governed test/build/run command executor wire contract (Issue #1387, Epic #1491). This leaf
2
+ // module owns the wire-stable vocabulary for the controlled command runner only. It is intentionally
3
+ // pure: no IO, no process execution, no clock, no randomness, and no imports from sibling packages —
4
+ // the one in-package import is the `CommandRule` shape reused for the executor allowlist.
5
+ //
6
+ // The runner never accepts free-form argv. A request names a `taskId` from a server-discovered
7
+ // catalog; the BFF resolves that id to a vetted `CommandTask` whose `executable`+`args` are frozen.
8
+ // Discovery and execution live in keiko-server (composing keiko-tools `runCommand`), so the browser
9
+ // never gains process, shell, or filesystem authority.
10
+ export const COMMAND_RUNNER_SCHEMA_VERSION = "1";
11
+ export const COMMAND_TASK_KINDS = Object.freeze([
12
+ "test",
13
+ "build",
14
+ "run",
15
+ ]);
16
+ export const COMMAND_TASK_SOURCES = Object.freeze([
17
+ "package-json-script",
18
+ ]);
19
+ export const COMMAND_FAILURE_REASONS = Object.freeze([
20
+ "none",
21
+ "non-zero-exit",
22
+ "timed-out",
23
+ "cancelled",
24
+ "denied",
25
+ "spawn-error",
26
+ ]);
27
+ export const COMMAND_RUNNER_EVENT_KINDS = Object.freeze([
28
+ "run-started",
29
+ "run-completed",
30
+ "run-failed",
31
+ "run-cancelled",
32
+ ]);
33
+ // The deny-by-default executor allowlist for discovered tasks. Deliberately SEPARATE from
34
+ // DEFAULT_COMMAND_RULES (read-only agent tools) and TERMINAL_COMMAND_RULES (read-only inspection) so
35
+ // the test/build/run surface cannot widen either: only the package-manager `run`/`test` subcommands
36
+ // back a task, and shell-spawning / scope-shifting flags are denied even though discovery only ever
37
+ // emits a frozen `["run", <script>]` argv (defense in depth).
38
+ export const COMMAND_TASK_RULES = Object.freeze([
39
+ {
40
+ executable: "npm",
41
+ allowedSubcommands: Object.freeze(["run", "test"]),
42
+ denyFlags: Object.freeze([
43
+ "-c",
44
+ "--call",
45
+ "--prefix",
46
+ "-g",
47
+ "--global",
48
+ "--location",
49
+ "-w",
50
+ "--workspace",
51
+ "--workspaces",
52
+ ]),
53
+ },
54
+ ]);
55
+ function isRecord(value) {
56
+ return typeof value === "object" && value !== null && !Array.isArray(value);
57
+ }
58
+ function isOneOf(value, allowed) {
59
+ return typeof value === "string" && allowed.includes(value);
60
+ }
61
+ // Bound the identifier fields at the parse boundary so an oversized or non-token value cannot reach
62
+ // the manager, the audit ledger, or the SSE fan-out. The 16 KB body cap is the outer backstop; these
63
+ // are the precise per-field limits.
64
+ export const MAX_TASK_ID_LENGTH = 256;
65
+ export const MAX_REQUEST_ID_LENGTH = 128;
66
+ const REQUEST_ID_PATTERN = /^[A-Za-z0-9._:-]+$/;
67
+ function isNonEmptyString(value) {
68
+ return typeof value === "string" && value.length > 0;
69
+ }
70
+ function isBoundedNonEmptyString(value, maxLength) {
71
+ return isNonEmptyString(value) && value.length <= maxLength;
72
+ }
73
+ function isPositiveFinite(value) {
74
+ return typeof value === "number" && Number.isFinite(value) && value > 0;
75
+ }
76
+ function isValidRequestId(value) {
77
+ return (typeof value === "string" &&
78
+ value.length > 0 &&
79
+ value.length <= MAX_REQUEST_ID_LENGTH &&
80
+ REQUEST_ID_PATTERN.test(value));
81
+ }
82
+ function collectOptionalRequestErrors(input, errors) {
83
+ if (input.timeoutMs !== undefined && !isPositiveFinite(input.timeoutMs)) {
84
+ errors.push("timeoutMs must be a positive finite number");
85
+ }
86
+ if (input.requestId !== undefined && !isValidRequestId(input.requestId)) {
87
+ errors.push(`requestId must be a token of 1-${String(MAX_REQUEST_ID_LENGTH)} characters`);
88
+ }
89
+ }
90
+ // Parses an incoming run request at the BFF trust boundary. Collects ALL field errors in a fixed
91
+ // order (deterministic strings for test assertions); never throws.
92
+ export function parseCommandTaskRunRequest(input) {
93
+ const errors = [];
94
+ if (!isRecord(input)) {
95
+ return { ok: false, errors: ["request must be an object"] };
96
+ }
97
+ if (!isNonEmptyString(input.projectId)) {
98
+ errors.push("projectId must be a non-empty string");
99
+ }
100
+ if (!isBoundedNonEmptyString(input.taskId, MAX_TASK_ID_LENGTH)) {
101
+ errors.push(`taskId must be a non-empty string of up to ${String(MAX_TASK_ID_LENGTH)} characters`);
102
+ }
103
+ collectOptionalRequestErrors(input, errors);
104
+ if (errors.length > 0) {
105
+ return { ok: false, errors };
106
+ }
107
+ return { ok: true, value: input };
108
+ }
109
+ function validateTaskArgs(value, path, errors) {
110
+ const args = value.args;
111
+ if (!Array.isArray(args)) {
112
+ errors.push(`${path}.args must be an array`);
113
+ return;
114
+ }
115
+ if (!args.every((arg) => typeof arg === "string")) {
116
+ errors.push(`${path}.args must be an array of strings`);
117
+ }
118
+ }
119
+ function validateTask(value, index, errors) {
120
+ const path = `tasks[${String(index)}]`;
121
+ if (!isRecord(value)) {
122
+ errors.push(`${path} must be an object`);
123
+ return;
124
+ }
125
+ if (!isNonEmptyString(value.id))
126
+ errors.push(`${path}.id must be a non-empty string`);
127
+ if (!isNonEmptyString(value.label))
128
+ errors.push(`${path}.label must be a non-empty string`);
129
+ if (!isNonEmptyString(value.executable)) {
130
+ errors.push(`${path}.executable must be a non-empty string`);
131
+ }
132
+ if (!isOneOf(value.kind, COMMAND_TASK_KINDS))
133
+ errors.push(`${path}.kind is invalid`);
134
+ if (!isOneOf(value.source, COMMAND_TASK_SOURCES))
135
+ errors.push(`${path}.source is invalid`);
136
+ validateTaskArgs(value, path, errors);
137
+ }
138
+ export function validateCommandTaskCatalog(value) {
139
+ const errors = [];
140
+ if (!isRecord(value)) {
141
+ return { ok: false, errors: ["catalog must be an object"] };
142
+ }
143
+ if (value.schemaVersion !== COMMAND_RUNNER_SCHEMA_VERSION) {
144
+ errors.push("schemaVersion is invalid");
145
+ }
146
+ if (!isNonEmptyString(value.projectId)) {
147
+ errors.push("projectId must be a non-empty string");
148
+ }
149
+ if (!Array.isArray(value.tasks)) {
150
+ errors.push("tasks must be an array");
151
+ }
152
+ else {
153
+ value.tasks.forEach((task, index) => {
154
+ validateTask(task, index, errors);
155
+ });
156
+ }
157
+ if (errors.length > 0) {
158
+ return { ok: false, errors };
159
+ }
160
+ return { ok: true, value: value };
161
+ }
162
+ function validateResultScalars(value, errors) {
163
+ if (value.schemaVersion !== COMMAND_RUNNER_SCHEMA_VERSION)
164
+ errors.push("schemaVersion is invalid");
165
+ if (!isNonEmptyString(value.runId))
166
+ errors.push("runId must be a non-empty string");
167
+ if (!isNonEmptyString(value.taskId))
168
+ errors.push("taskId must be a non-empty string");
169
+ if (!isOneOf(value.kind, COMMAND_TASK_KINDS))
170
+ errors.push("kind is invalid");
171
+ if (!isOneOf(value.failureReason, COMMAND_FAILURE_REASONS))
172
+ errors.push("failureReason is invalid");
173
+ }
174
+ function validateResultNumbers(value, errors) {
175
+ const exitCode = value.exitCode;
176
+ if (exitCode !== null && (typeof exitCode !== "number" || !Number.isInteger(exitCode))) {
177
+ errors.push("exitCode must be an integer or null");
178
+ }
179
+ const durationMs = value.durationMs;
180
+ if (typeof durationMs !== "number" || !Number.isFinite(durationMs) || durationMs < 0) {
181
+ errors.push("durationMs must be a non-negative finite number");
182
+ }
183
+ }
184
+ function validateResultFlagsAndText(value, errors) {
185
+ if (typeof value.truncated !== "boolean")
186
+ errors.push("truncated must be a boolean");
187
+ if (typeof value.timedOut !== "boolean")
188
+ errors.push("timedOut must be a boolean");
189
+ if (typeof value.stdout !== "string")
190
+ errors.push("stdout must be a string");
191
+ if (typeof value.stderr !== "string")
192
+ errors.push("stderr must be a string");
193
+ }
194
+ function validateResultRuntime(value, errors) {
195
+ validateResultNumbers(value, errors);
196
+ validateResultFlagsAndText(value, errors);
197
+ }
198
+ export function validateCommandTaskRunResult(value) {
199
+ const errors = [];
200
+ if (!isRecord(value)) {
201
+ return { ok: false, errors: ["result must be an object"] };
202
+ }
203
+ validateResultScalars(value, errors);
204
+ validateResultRuntime(value, errors);
205
+ if (errors.length > 0) {
206
+ return { ok: false, errors };
207
+ }
208
+ return { ok: true, value: value };
209
+ }
@@ -0,0 +1,125 @@
1
+ import type { CommandRule } from "./tools.js";
2
+ import type { RuntimeCapabilityState, RuntimeCapabilityUnavailableReason } from "./runtime-capabilities.js";
3
+ export declare const CONTAINER_RUNTIME_SCHEMA_VERSION: "1";
4
+ export type ContainerEngineId = "docker" | "podman";
5
+ export declare const CONTAINER_ENGINE_IDS: readonly ContainerEngineId[];
6
+ export type ContainerEngineState = RuntimeCapabilityState;
7
+ export type ContainerEngineUnavailableReason = RuntimeCapabilityUnavailableReason;
8
+ export interface ContainerEngineStatus {
9
+ readonly engine: ContainerEngineId;
10
+ readonly state: ContainerEngineState;
11
+ readonly version?: string | undefined;
12
+ readonly unavailableReason?: ContainerEngineUnavailableReason | undefined;
13
+ readonly remediationHint?: string | undefined;
14
+ }
15
+ export interface ContainerCapabilityResponse {
16
+ readonly schemaVersion: typeof CONTAINER_RUNTIME_SCHEMA_VERSION;
17
+ readonly generatedAtMs: number;
18
+ readonly deadlineMs: number;
19
+ readonly engines: readonly ContainerEngineStatus[];
20
+ readonly anyAvailable: boolean;
21
+ }
22
+ export type ContainerMountMode = "read-only";
23
+ export declare const CONTAINER_MOUNT_MODES: readonly ContainerMountMode[];
24
+ export type ContainerNetworkMode = "none";
25
+ export declare const CONTAINER_NETWORK_MODES: readonly ContainerNetworkMode[];
26
+ export interface ContainerResourceLimits {
27
+ readonly pidsLimit: number;
28
+ readonly memoryBytes: number;
29
+ readonly cpus: number;
30
+ }
31
+ export interface ContainerExecutionPolicy {
32
+ readonly imageAllowlist: readonly string[];
33
+ readonly limits: ContainerResourceLimits;
34
+ readonly mountMode: ContainerMountMode;
35
+ readonly networkMode: ContainerNetworkMode;
36
+ readonly workspaceMountPath: string;
37
+ readonly pull: "never";
38
+ }
39
+ export type ContainerTaskKind = "diagnostic" | "verify";
40
+ export declare const CONTAINER_TASK_KINDS: readonly ContainerTaskKind[];
41
+ export interface ContainerTask {
42
+ readonly id: string;
43
+ readonly kind: ContainerTaskKind;
44
+ readonly label: string;
45
+ readonly image: string;
46
+ readonly args: readonly string[];
47
+ readonly engine: ContainerEngineId;
48
+ }
49
+ export interface ContainerTaskCatalog {
50
+ readonly schemaVersion: typeof CONTAINER_RUNTIME_SCHEMA_VERSION;
51
+ readonly projectId: string;
52
+ readonly engineAvailable: boolean;
53
+ readonly tasks: readonly ContainerTask[];
54
+ }
55
+ export interface ContainerRunRequest {
56
+ readonly projectId: string;
57
+ readonly taskId: string;
58
+ readonly timeoutMs?: number | undefined;
59
+ readonly requestId?: string | undefined;
60
+ }
61
+ export type ContainerFailureReason = "none" | "non-zero-exit" | "engine-unavailable" | "image-missing" | "pull-denied" | "mount-failure" | "timed-out" | "cancelled" | "denied" | "spawn-error" | "output-capped";
62
+ export declare const CONTAINER_FAILURE_REASONS: readonly ContainerFailureReason[];
63
+ export interface ContainerRunResult {
64
+ readonly schemaVersion: typeof CONTAINER_RUNTIME_SCHEMA_VERSION;
65
+ readonly runId: string;
66
+ readonly taskId: string;
67
+ readonly kind: ContainerTaskKind;
68
+ readonly engine: ContainerEngineId;
69
+ readonly exitCode: number | null;
70
+ readonly durationMs: number;
71
+ readonly truncated: boolean;
72
+ readonly timedOut: boolean;
73
+ readonly failureReason: ContainerFailureReason;
74
+ readonly stdout: string;
75
+ readonly stderr: string;
76
+ }
77
+ export type ContainerRunnerEventKind = "run-started" | "run-completed" | "run-failed" | "run-cancelled";
78
+ export declare const CONTAINER_RUNNER_EVENT_KINDS: readonly ContainerRunnerEventKind[];
79
+ export interface ContainerRunnerEvent {
80
+ readonly kind: ContainerRunnerEventKind;
81
+ readonly runId: string;
82
+ readonly payload: Readonly<Record<string, unknown>>;
83
+ }
84
+ export declare const CONTAINER_TASK_RULES: readonly CommandRule[];
85
+ export interface ContainerRunRequestParseOk {
86
+ readonly ok: true;
87
+ readonly value: ContainerRunRequest;
88
+ }
89
+ export interface ContainerRunRequestParseFail {
90
+ readonly ok: false;
91
+ readonly errors: readonly string[];
92
+ }
93
+ export type ContainerRunRequestParse = ContainerRunRequestParseOk | ContainerRunRequestParseFail;
94
+ export interface ContainerCapabilityResponseParseOk {
95
+ readonly ok: true;
96
+ readonly value: ContainerCapabilityResponse;
97
+ }
98
+ export interface ContainerCapabilityResponseParseFail {
99
+ readonly ok: false;
100
+ readonly errors: readonly string[];
101
+ }
102
+ export type ContainerCapabilityResponseParse = ContainerCapabilityResponseParseOk | ContainerCapabilityResponseParseFail;
103
+ export interface ContainerTaskCatalogParseOk {
104
+ readonly ok: true;
105
+ readonly value: ContainerTaskCatalog;
106
+ }
107
+ export interface ContainerTaskCatalogParseFail {
108
+ readonly ok: false;
109
+ readonly errors: readonly string[];
110
+ }
111
+ export type ContainerTaskCatalogParse = ContainerTaskCatalogParseOk | ContainerTaskCatalogParseFail;
112
+ export interface ContainerRunResultParseOk {
113
+ readonly ok: true;
114
+ readonly value: ContainerRunResult;
115
+ }
116
+ export interface ContainerRunResultParseFail {
117
+ readonly ok: false;
118
+ readonly errors: readonly string[];
119
+ }
120
+ export type ContainerRunResultParse = ContainerRunResultParseOk | ContainerRunResultParseFail;
121
+ export declare function parseContainerRunRequest(input: unknown): ContainerRunRequestParse;
122
+ export declare function validateContainerCapabilityResponse(value: unknown): ContainerCapabilityResponseParse;
123
+ export declare function validateContainerTaskCatalog(value: unknown): ContainerTaskCatalogParse;
124
+ export declare function validateContainerRunResult(value: unknown): ContainerRunResultParse;
125
+ //# sourceMappingURL=container-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-runtime.d.ts","sourceRoot":"","sources":["../src/container-runtime.ts"],"names":[],"mappings":"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"}