@inhuman.tools/harness-contract 0.0.0-stage → 0.1.0
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.
- package/LICENSE.md +7 -0
- package/dist/contract.d.ts +1910 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +353 -0
- package/dist/contract.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/jsonrpc.d.ts +18 -0
- package/dist/jsonrpc.d.ts.map +1 -0
- package/dist/jsonrpc.js +34 -0
- package/dist/jsonrpc.js.map +1 -0
- package/dist/schemas/authorization.d.ts +1721 -0
- package/dist/schemas/authorization.d.ts.map +1 -0
- package/dist/schemas/authorization.js +289 -0
- package/dist/schemas/authorization.js.map +1 -0
- package/dist/schemas/connection.d.ts +133 -0
- package/dist/schemas/connection.d.ts.map +1 -0
- package/dist/schemas/connection.js +55 -0
- package/dist/schemas/connection.js.map +1 -0
- package/dist/schemas/rpc.d.ts +86 -0
- package/dist/schemas/rpc.d.ts.map +1 -0
- package/dist/schemas/rpc.js +66 -0
- package/dist/schemas/rpc.js.map +1 -0
- package/dist/schemas/shapes.d.ts +514 -0
- package/dist/schemas/shapes.d.ts.map +1 -0
- package/dist/schemas/shapes.js +342 -0
- package/dist/schemas/shapes.js.map +1 -0
- package/dist/spec/cli.d.ts +3 -0
- package/dist/spec/cli.d.ts.map +1 -0
- package/dist/spec/cli.js +40 -0
- package/dist/spec/cli.js.map +1 -0
- package/dist/spec/generate.d.ts +21 -0
- package/dist/spec/generate.d.ts.map +1 -0
- package/dist/spec/generate.js +100 -0
- package/dist/spec/generate.js.map +1 -0
- package/dist/spec/readme.d.ts +4 -0
- package/dist/spec/readme.d.ts.map +1 -0
- package/dist/spec/readme.js +124 -0
- package/dist/spec/readme.js.map +1 -0
- package/package.json +57 -3
- package/src/contract.ts +418 -0
- package/src/index.ts +6 -0
- package/src/jsonrpc.ts +42 -0
- package/src/schemas/authorization.ts +312 -0
- package/src/schemas/connection.ts +68 -0
- package/src/schemas/rpc.ts +88 -0
- package/src/schemas/shapes.ts +379 -0
- package/src/spec/cli.ts +45 -0
- package/src/spec/generate.ts +115 -0
- package/src/spec/readme.ts +126 -0
- package/README.md +0 -3
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { uiFormSchema } from "./rpc.js";
|
|
3
|
+
/**
|
|
4
|
+
* Mirrors `REASONING_EFFORTS` in `@inhuman.tools/plugin-sdk`. Inlined so this
|
|
5
|
+
* package stays dependency-light; harness has a test that the two lists match.
|
|
6
|
+
*/
|
|
7
|
+
export const REASONING_EFFORTS = ["none", "minimal", "low", "medium", "high", "xhigh", "max"];
|
|
8
|
+
const nonempty = z.string().trim().min(1);
|
|
9
|
+
/** Access to one already-running MCP server, by the server's name. */
|
|
10
|
+
export const botMcpGrantSchema = z.strictObject({
|
|
11
|
+
server: nonempty,
|
|
12
|
+
tools: z.array(nonempty).optional(),
|
|
13
|
+
account: nonempty.optional(),
|
|
14
|
+
session: nonempty.optional(),
|
|
15
|
+
});
|
|
16
|
+
export const kvScopeSchema = z.enum(["session", "project", "kernel"]).default("session");
|
|
17
|
+
export const kvSetInput = z.object({
|
|
18
|
+
key: z.string().trim().min(1, "key is required"),
|
|
19
|
+
value: z.string(),
|
|
20
|
+
scope: kvScopeSchema,
|
|
21
|
+
/**
|
|
22
|
+
* Session `model` / `connection` also become the last-choice default
|
|
23
|
+
* (project + kernel). `/model` and `/connect` send "1". Scheme #t does
|
|
24
|
+
* not survive the action JSON walk. A bare session write — subagent,
|
|
25
|
+
* `--model`, `--connection` — does not.
|
|
26
|
+
*/
|
|
27
|
+
remember: z
|
|
28
|
+
.union([z.boolean(), z.literal("1")])
|
|
29
|
+
.optional()
|
|
30
|
+
.transform((value) => value === true || value === "1"),
|
|
31
|
+
});
|
|
32
|
+
export const kvClearInput = z.object({
|
|
33
|
+
key: z.string().trim().min(1, "key is required"),
|
|
34
|
+
scope: kvScopeSchema,
|
|
35
|
+
});
|
|
36
|
+
export const kvOutput = z.object({ ok: z.literal(true) });
|
|
37
|
+
/**
|
|
38
|
+
* A plugin command's call into that plugin's own state. `args` is a JSON
|
|
39
|
+
* object, since action params cross as strings. `field` names the argument
|
|
40
|
+
* the composer text (`input`) fills; an empty `input` then refuses.
|
|
41
|
+
*/
|
|
42
|
+
export const pluginMethodInput = z.object({
|
|
43
|
+
plugin: z.string().trim().min(1, "plugin is required"),
|
|
44
|
+
method: z.string().trim().min(1, "method is required"),
|
|
45
|
+
scope: z.enum(["session", "project", "global"]).default("session"),
|
|
46
|
+
args: z.string().optional(),
|
|
47
|
+
field: z.string().trim().optional(),
|
|
48
|
+
input: z.string().optional(),
|
|
49
|
+
});
|
|
50
|
+
/** A failure is data, so a command body that reads state still renders; the TUI shows `error` for a fired action. */
|
|
51
|
+
export const pluginMethodOutput = z.union([
|
|
52
|
+
z.object({ ok: z.literal(true), value: z.unknown() }),
|
|
53
|
+
z.object({ ok: z.literal(false), error: z.string() }),
|
|
54
|
+
]);
|
|
55
|
+
export const policySetInput = z.object({
|
|
56
|
+
policy: z.enum(["manual", "auto", "yolo"]),
|
|
57
|
+
});
|
|
58
|
+
export const policySetOutput = z.object({ ok: z.literal(true) });
|
|
59
|
+
export const termContinueSetInput = z.object({
|
|
60
|
+
key: z.string().trim().min(1, "key is required"),
|
|
61
|
+
sessionId: z.string().trim().min(1, "sessionId is required"),
|
|
62
|
+
});
|
|
63
|
+
export const termContinueClearInput = z.object({
|
|
64
|
+
key: z.string().trim().min(1, "key is required"),
|
|
65
|
+
});
|
|
66
|
+
export const termContinueOutput = z.object({ ok: z.literal(true) });
|
|
67
|
+
/** One picture on a `turn`. Bytes are standard base64. The daemon stores them beside the session. */
|
|
68
|
+
export const turnVisualInput = z.object({
|
|
69
|
+
mime: z.string().trim().min(1),
|
|
70
|
+
bytesBase64: z.string().trim().min(1).max(7_000_000),
|
|
71
|
+
sourcePath: z.string().optional(),
|
|
72
|
+
});
|
|
73
|
+
export const turnInput = z.object({
|
|
74
|
+
prompt: z.string(),
|
|
75
|
+
kind: z.enum(["steer", "queue", "continue"]).optional(),
|
|
76
|
+
visuals: z.array(turnVisualInput).max(8).optional(),
|
|
77
|
+
});
|
|
78
|
+
export const turnOutput = z.object({ ok: z.literal(true) });
|
|
79
|
+
export const turnVisualReadInput = z.object({
|
|
80
|
+
id: z.string().trim().min(1),
|
|
81
|
+
});
|
|
82
|
+
export const turnVisualReadOutput = z.object({
|
|
83
|
+
id: z.string(),
|
|
84
|
+
mime: z.string(),
|
|
85
|
+
bytesBase64: z.string(),
|
|
86
|
+
width: z.number(),
|
|
87
|
+
height: z.number(),
|
|
88
|
+
resizedFrom: z.object({ width: z.number(), height: z.number() }).nullable(),
|
|
89
|
+
sourcePath: z.string().nullable(),
|
|
90
|
+
});
|
|
91
|
+
/** A blob the session's document references by content hash (`StoredBlob.sha256`). */
|
|
92
|
+
export const blobGetInput = z.object({
|
|
93
|
+
sha256: z.string().regex(/^[0-9a-f]{64}$/),
|
|
94
|
+
});
|
|
95
|
+
/** `text` for `text/*` media types, `bytesBase64` for everything else; exactly one is non-null. */
|
|
96
|
+
export const blobGetOutput = z.object({
|
|
97
|
+
sha256: z.string(),
|
|
98
|
+
bytes: z.number().int().min(0),
|
|
99
|
+
mime: z.string(),
|
|
100
|
+
text: z.string().nullable(),
|
|
101
|
+
bytesBase64: z.string().nullable(),
|
|
102
|
+
});
|
|
103
|
+
/** `dryRun` counts what would move and writes nothing. */
|
|
104
|
+
export const blobVacuumInput = z.object({
|
|
105
|
+
dryRun: z.boolean().optional(),
|
|
106
|
+
});
|
|
107
|
+
/** What moved (or, on a dry run, would): entities by seat, the UTF-8 bytes taken out of the document, and the stored image's size either side. */
|
|
108
|
+
export const blobVacuumOutput = z.object({
|
|
109
|
+
dryRun: z.boolean(),
|
|
110
|
+
fileMutates: z.number().int().min(0),
|
|
111
|
+
promptMessages: z.number().int().min(0),
|
|
112
|
+
promptTexts: z.number().int().min(0),
|
|
113
|
+
bytesMoved: z.number().int().min(0),
|
|
114
|
+
imageBytesBefore: z.number().int().min(0),
|
|
115
|
+
imageBytesAfter: z.number().int().min(0),
|
|
116
|
+
});
|
|
117
|
+
export const connectAdoptInput = z.object({
|
|
118
|
+
driver: z.union([
|
|
119
|
+
z.string().trim().min(1),
|
|
120
|
+
z.object({ name: z.string().trim().min(1) }).transform((row) => row.name),
|
|
121
|
+
]),
|
|
122
|
+
name: z.string().optional(),
|
|
123
|
+
settings: z.record(z.string(), z.unknown()).optional(),
|
|
124
|
+
secrets: z.record(z.string(), z.string()).optional(),
|
|
125
|
+
});
|
|
126
|
+
export const connectAdoptOutput = z.union([z.object({ id: z.string() }), z.object({ ok: z.literal(false) })]);
|
|
127
|
+
export const sessionConnectAdoptOutput = z.union([connectAdoptOutput, uiFormSchema]);
|
|
128
|
+
export const connectDropInput = z.object({
|
|
129
|
+
id: z.string().trim().min(1, "id is required"),
|
|
130
|
+
confirm: z.boolean().optional(),
|
|
131
|
+
});
|
|
132
|
+
export const connectDropOutput = z.object({ ok: z.boolean() });
|
|
133
|
+
export const mcpServerAdoptInput = z.object({
|
|
134
|
+
name: z.string().optional(),
|
|
135
|
+
input: z.string().optional(),
|
|
136
|
+
settings: z.record(z.string(), z.unknown()).optional(),
|
|
137
|
+
secrets: z.record(z.string(), z.string()).optional(),
|
|
138
|
+
});
|
|
139
|
+
export const mcpServerAdoptOutput = connectAdoptOutput;
|
|
140
|
+
export const mcpServerSearchInput = z.object({
|
|
141
|
+
query: z.string().trim().min(1, "query is required"),
|
|
142
|
+
limit: z.number().int().min(1).max(20).optional(),
|
|
143
|
+
});
|
|
144
|
+
export const mcpServerSearchHit = z.object({
|
|
145
|
+
name: z.string(),
|
|
146
|
+
title: z.string(),
|
|
147
|
+
description: z.string(),
|
|
148
|
+
install: z.string(),
|
|
149
|
+
});
|
|
150
|
+
export const mcpServerSearchOutput = z.object({
|
|
151
|
+
servers: z.array(mcpServerSearchHit),
|
|
152
|
+
});
|
|
153
|
+
export const pluginSetInput = z
|
|
154
|
+
.object({
|
|
155
|
+
name: z.string().trim().min(1, "name is required"),
|
|
156
|
+
enabled: z.boolean().optional(),
|
|
157
|
+
foreground: z.boolean().optional(),
|
|
158
|
+
})
|
|
159
|
+
.refine((row) => row.enabled !== undefined || row.foreground !== undefined, {
|
|
160
|
+
message: "enabled or foreground is required",
|
|
161
|
+
});
|
|
162
|
+
export const pluginSetOutput = z.object({ ok: z.literal(true) });
|
|
163
|
+
export const pluginInstallInput = z.object({
|
|
164
|
+
spec: z.string().trim().min(1, "spec is required"),
|
|
165
|
+
});
|
|
166
|
+
export const pluginInstallOutput = z.object({
|
|
167
|
+
name: z.string(),
|
|
168
|
+
npmName: z.string(),
|
|
169
|
+
});
|
|
170
|
+
export const pluginRemoveInput = z.object({
|
|
171
|
+
name: z.string().trim().min(1, "name is required"),
|
|
172
|
+
});
|
|
173
|
+
export const pluginRemoveOutput = z.object({ ok: z.literal(true) });
|
|
174
|
+
/** Rename or merge settings of a connection that already exists. The id stays. */
|
|
175
|
+
export const connectUpdateInput = z
|
|
176
|
+
.object({
|
|
177
|
+
id: z.string().trim().min(1, "id is required"),
|
|
178
|
+
name: z.string().trim().min(1).optional(),
|
|
179
|
+
settings: z.record(z.string(), z.unknown()).optional(),
|
|
180
|
+
})
|
|
181
|
+
.refine((row) => row.name !== undefined || row.settings !== undefined, {
|
|
182
|
+
message: "name or settings is required",
|
|
183
|
+
});
|
|
184
|
+
export const connectUpdateOutput = z.object({ ok: z.literal(true) });
|
|
185
|
+
export const configSetInput = z.object({
|
|
186
|
+
compact: z.string().optional(),
|
|
187
|
+
compactKeepTurns: z.number().int().positive().optional(),
|
|
188
|
+
compactTriggers: z.object({ hard: z.string().optional(), soft: z.string().optional() }).optional(),
|
|
189
|
+
contextGlowRemaining: z.string().optional(),
|
|
190
|
+
autoModeClassifier: z.string().optional(),
|
|
191
|
+
defaultPermissionMode: z.enum(["manual", "auto", "yolo"]).optional(),
|
|
192
|
+
approvalAskThrottleMs: z.number().finite().nonnegative().optional(),
|
|
193
|
+
shellTailBytes: z.number().finite().nonnegative().optional(),
|
|
194
|
+
superKey: z.enum(["ctrl", "cmd"]).optional(),
|
|
195
|
+
hideFloorTools: z.boolean().optional(),
|
|
196
|
+
statusline: z.string().optional(),
|
|
197
|
+
statuslineRefresh: z.string().optional(),
|
|
198
|
+
speculativePolicyProcessingTools: z.number().finite().nonnegative().optional(),
|
|
199
|
+
textOnlyContinue: z.boolean().optional(),
|
|
200
|
+
/** The user layer of the authorization table (validated by the daemon). `null` clears it. */
|
|
201
|
+
authorization: z.record(z.string(), z.unknown()).nullable().optional(),
|
|
202
|
+
});
|
|
203
|
+
export const configSetOutput = z.object({ ok: z.literal(true) });
|
|
204
|
+
const skillScope = z.enum(["project", "home"]);
|
|
205
|
+
export const skillListInput = z.object({
|
|
206
|
+
project: z.string().optional(),
|
|
207
|
+
});
|
|
208
|
+
export const skillRowSchema = z.object({
|
|
209
|
+
name: z.string(),
|
|
210
|
+
description: z.string(),
|
|
211
|
+
location: z.string(),
|
|
212
|
+
invoke: z.string(),
|
|
213
|
+
scope: skillScope,
|
|
214
|
+
});
|
|
215
|
+
export const skillListOutput = z.object({ skills: z.array(skillRowSchema) });
|
|
216
|
+
export const skillWriteInput = z.object({
|
|
217
|
+
scope: skillScope,
|
|
218
|
+
project: z.string().optional(),
|
|
219
|
+
name: z.string().trim().min(1, "name is required"),
|
|
220
|
+
description: z.string().default(""),
|
|
221
|
+
body: z.string().default(""),
|
|
222
|
+
});
|
|
223
|
+
export const skillWriteOutput = skillRowSchema;
|
|
224
|
+
export const skillRemoveInput = z.object({
|
|
225
|
+
scope: skillScope,
|
|
226
|
+
project: z.string().optional(),
|
|
227
|
+
name: z.string().trim().min(1, "name is required"),
|
|
228
|
+
});
|
|
229
|
+
export const skillRemoveOutput = z.object({ ok: z.literal(true) });
|
|
230
|
+
export const skillReadInput = skillRemoveInput;
|
|
231
|
+
export const skillReadOutput = skillRowSchema.extend({ body: z.string() });
|
|
232
|
+
const recipeScope = z.enum(["session", "project", "global"]);
|
|
233
|
+
export const botWriteInput = z.object({
|
|
234
|
+
scope: z.enum(["home", "project"]),
|
|
235
|
+
project: z.string().optional(),
|
|
236
|
+
name: z.string().trim().min(1, "name is required"),
|
|
237
|
+
description: z.string().default(""),
|
|
238
|
+
instructions: z.string().default(""),
|
|
239
|
+
recipeScope: recipeScope.default("session"),
|
|
240
|
+
tools: z.array(z.string()).default([]),
|
|
241
|
+
skills: z.array(z.string()).default([]),
|
|
242
|
+
keepAlive: z.boolean().default(false),
|
|
243
|
+
/**
|
|
244
|
+
* Absent means keep the file's current value. An empty list clears it.
|
|
245
|
+
* A settings save that does not know these fields must not wipe them.
|
|
246
|
+
*/
|
|
247
|
+
invokes: z.array(z.string().trim().min(1)).optional(),
|
|
248
|
+
reasoningEffort: z.enum(REASONING_EFFORTS).nullable().optional(),
|
|
249
|
+
modelPreferences: z.array(z.string().trim().min(1)).optional(),
|
|
250
|
+
/** Absent keeps the file's grants. An empty list clears them. */
|
|
251
|
+
mcp: z.array(botMcpGrantSchema).optional(),
|
|
252
|
+
});
|
|
253
|
+
export const botWriteOutput = z.object({ ok: z.literal(true) });
|
|
254
|
+
export const botRemoveInput = z.object({
|
|
255
|
+
scope: z.enum(["home", "project"]),
|
|
256
|
+
project: z.string().optional(),
|
|
257
|
+
name: z.string().trim().min(1, "name is required"),
|
|
258
|
+
});
|
|
259
|
+
export const botRemoveOutput = z.object({ ok: z.literal(true) });
|
|
260
|
+
export const compactInput = z.object({
|
|
261
|
+
focus: z.string().optional(),
|
|
262
|
+
from: z.literal("overflow").optional(),
|
|
263
|
+
});
|
|
264
|
+
export const compactOutput = z.union([
|
|
265
|
+
z.object({ ok: z.literal(true), compacted: z.boolean() }),
|
|
266
|
+
z.object({ ok: z.literal(false), reason: z.string() }),
|
|
267
|
+
]);
|
|
268
|
+
export const renameInput = z.object({
|
|
269
|
+
title: z.string(),
|
|
270
|
+
});
|
|
271
|
+
export const renameOutput = z.object({
|
|
272
|
+
ok: z.literal(true),
|
|
273
|
+
title: z.string(),
|
|
274
|
+
});
|
|
275
|
+
export const evalInput = z
|
|
276
|
+
.object({
|
|
277
|
+
requestId: z.string().trim().min(1, "requestId is required"),
|
|
278
|
+
expr: z.string(),
|
|
279
|
+
source: z.string().optional(),
|
|
280
|
+
sourcePath: z.string().trim().min(1).optional(),
|
|
281
|
+
policy: z.string().trim().optional().default("auto"),
|
|
282
|
+
})
|
|
283
|
+
.refine((value) => value.source == null || value.sourcePath != null, {
|
|
284
|
+
message: "source requires sourcePath",
|
|
285
|
+
});
|
|
286
|
+
export const evalOutput = z.union([
|
|
287
|
+
z.object({
|
|
288
|
+
ok: z.literal(true),
|
|
289
|
+
turnId: z.string(),
|
|
290
|
+
programId: z.string(),
|
|
291
|
+
}),
|
|
292
|
+
z.object({
|
|
293
|
+
ok: z.literal(false),
|
|
294
|
+
code: z.literal("policy_unavailable"),
|
|
295
|
+
text: z.string(),
|
|
296
|
+
}),
|
|
297
|
+
]);
|
|
298
|
+
export const turnCancelInput = z.union([
|
|
299
|
+
z.object({ turnId: z.string().trim().min(1) }).strict(),
|
|
300
|
+
z.object({ requestId: z.string().trim().min(1) }).strict(),
|
|
301
|
+
]);
|
|
302
|
+
export const turnCancelOutput = z.object({ ok: z.literal(true) });
|
|
303
|
+
export const turnRewindInput = z.object({
|
|
304
|
+
turnId: z.string().trim().min(1),
|
|
305
|
+
});
|
|
306
|
+
export const turnRewindOutput = z.object({
|
|
307
|
+
ok: z.literal(true),
|
|
308
|
+
turnId: z.string(),
|
|
309
|
+
});
|
|
310
|
+
export const turnRetryInput = z.object({}).strict();
|
|
311
|
+
export const turnRetryOutput = z.object({ ok: z.literal(true) });
|
|
312
|
+
export const residentSetInput = z.object({ resident: z.boolean() });
|
|
313
|
+
export const residentSetOutput = z.object({ ok: z.literal(true) });
|
|
314
|
+
/** A queued row named by the id the client saw. Already drained or moved is `ok: false`. */
|
|
315
|
+
export const queueRowInput = z.object({ id: z.string().trim().min(1) });
|
|
316
|
+
export const queueRowOutput = z.object({ ok: z.boolean() });
|
|
317
|
+
export const agentCallsListInput = z.object({}).strict();
|
|
318
|
+
export const agentCallsListOutput = z.object({
|
|
319
|
+
calls: z.array(z.object({
|
|
320
|
+
requestId: z.string(),
|
|
321
|
+
callerSessionId: z.string(),
|
|
322
|
+
tool: z.string(),
|
|
323
|
+
workerSessionId: z.string(),
|
|
324
|
+
contributionRevision: z.string(),
|
|
325
|
+
state: z.enum(["admitted", "accepted", "running", "paused", "terminal"]),
|
|
326
|
+
blocker: z.string().nullable(),
|
|
327
|
+
delivery: z.enum(["pending", "delivered"]),
|
|
328
|
+
outcome: z.unknown().nullable(),
|
|
329
|
+
})),
|
|
330
|
+
});
|
|
331
|
+
export const agentCallsInspectInput = z.object({
|
|
332
|
+
requestId: z.string().trim().min(1),
|
|
333
|
+
});
|
|
334
|
+
export const agentCallsInspectOutput = z.union([
|
|
335
|
+
agentCallsListOutput.shape.calls.element,
|
|
336
|
+
z.object({ ok: z.literal(false), reason: z.string() }),
|
|
337
|
+
]);
|
|
338
|
+
export const agentCallsCancelInput = z.object({
|
|
339
|
+
requestId: z.string().trim().min(1),
|
|
340
|
+
});
|
|
341
|
+
export const agentCallsCancelOutput = z.object({ ok: z.boolean() });
|
|
342
|
+
//# sourceMappingURL=shapes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shapes.js","sourceRoot":"","sources":["../../src/schemas/shapes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/spec/cli.ts"],"names":[],"mappings":""}
|
package/dist/spec/cli.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { generateArtifacts } from "./generate.js";
|
|
6
|
+
// dist/spec/cli.js -> packages/harness-contract; the spec lives in its spec/ folder.
|
|
7
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const packageRoot = resolve(here, "..", "..");
|
|
9
|
+
const defaultOut = resolve(packageRoot, "spec");
|
|
10
|
+
const args = process.argv.slice(2);
|
|
11
|
+
const check = args.includes("--check");
|
|
12
|
+
const outFlag = args.indexOf("--out");
|
|
13
|
+
const out = outFlag === -1 ? defaultOut : resolve(args[outFlag + 1] ?? defaultOut);
|
|
14
|
+
const manifest = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8"));
|
|
15
|
+
const version = typeof manifest === "object" && manifest !== null && "version" in manifest && typeof manifest.version === "string"
|
|
16
|
+
? manifest.version
|
|
17
|
+
: "0.0.0";
|
|
18
|
+
const artifacts = await generateArtifacts(version);
|
|
19
|
+
if (check) {
|
|
20
|
+
const stale = artifacts.filter((artifact) => {
|
|
21
|
+
try {
|
|
22
|
+
return readFileSync(join(out, artifact.file), "utf8") !== artifact.text;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
if (stale.length > 0) {
|
|
29
|
+
console.error(`spec/ is stale: ${stale.map((artifact) => artifact.file).join(", ")}. Run: pnpm --filter @inhuman.tools/harness-contract spec`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
console.log("spec/ is up to date");
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
mkdirSync(out, { recursive: true });
|
|
36
|
+
for (const artifact of artifacts)
|
|
37
|
+
writeFileSync(join(out, artifact.file), artifact.text);
|
|
38
|
+
console.log(`wrote ${artifacts.map((artifact) => artifact.file).join(", ")} to ${out}`);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/spec/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,qFAAqF;AACrF,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACtC,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC;AAEnF,MAAM,QAAQ,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9F,MAAM,OAAO,GACX,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,SAAS,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;IAChH,CAAC,CAAC,QAAQ,CAAC,OAAO;IAClB,CAAC,CAAC,OAAO,CAAC;AAEd,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAEnD,IAAI,KAAK,EAAE,CAAC;IACV,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CACX,mBAAmB,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,2DAA2D,CAChI,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AACrC,CAAC;KAAM,CAAC;IACN,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,KAAK,MAAM,QAAQ,IAAI,SAAS;QAAE,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,SAAS,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;AAC1F,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
type Json = Record<string, unknown>;
|
|
2
|
+
/**
|
|
3
|
+
* The OpenAPI view of the contract. This is the HTTP projection (one POST per
|
|
4
|
+
* method, params as the JSON body); the daemon itself speaks JSON-RPC over a
|
|
5
|
+
* WebSocket, see `openrpc.json` for the wire-accurate description.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateOpenApi(version: string): Promise<Json>;
|
|
8
|
+
/**
|
|
9
|
+
* OpenRPC 1.3 description of the wire. Method names come from `meta.method`.
|
|
10
|
+
* Params are by-name: an object input contributes one param per property; an
|
|
11
|
+
* input that is not a plain object (a union) is given whole in `x-params-schema`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateOpenRpc(version: string): Promise<Json>;
|
|
14
|
+
export interface Artifact {
|
|
15
|
+
readonly file: string;
|
|
16
|
+
readonly text: string;
|
|
17
|
+
}
|
|
18
|
+
/** Every generated file, by name relative to the package's `spec/` folder. */
|
|
19
|
+
export declare function generateArtifacts(version: string): Promise<Artifact[]>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/spec/generate.ts"],"names":[],"mappings":"AAMA,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAUpC;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBpE;AAWD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCpE;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAID,8EAA8E;AAC9E,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAM5E"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { OpenAPIGenerator } from "@orpc/openapi";
|
|
2
|
+
import { ZodToJsonSchemaConverter } from "@orpc/zod/zod4";
|
|
3
|
+
import { contract, httpPathOf, listProcedures } from "../contract.js";
|
|
4
|
+
import { renderReadme } from "./readme.js";
|
|
5
|
+
const converter = new ZodToJsonSchemaConverter();
|
|
6
|
+
const INFO = (version) => ({
|
|
7
|
+
title: "inhuman-harness daemon RPC",
|
|
8
|
+
version,
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* The OpenAPI view of the contract. This is the HTTP projection (one POST per
|
|
12
|
+
* method, params as the JSON body); the daemon itself speaks JSON-RPC over a
|
|
13
|
+
* WebSocket, see `openrpc.json` for the wire-accurate description.
|
|
14
|
+
*/
|
|
15
|
+
export async function generateOpenApi(version) {
|
|
16
|
+
const generator = new OpenAPIGenerator({ schemaConverters: [converter] });
|
|
17
|
+
const document = (await generator.generate(contract, {
|
|
18
|
+
info: {
|
|
19
|
+
...INFO(version),
|
|
20
|
+
description: "HTTP projection of the daemon contract, generated from @inhuman.tools/harness-contract. " +
|
|
21
|
+
"The daemon's only transport today is JSON-RPC 2.0 over WebSocket (see openrpc.json); each operation here " +
|
|
22
|
+
"names its wire method in `x-rpc-method`.",
|
|
23
|
+
},
|
|
24
|
+
}));
|
|
25
|
+
const byPath = new Map(listProcedures().map((entry) => [httpPathOf(entry.meta), entry]));
|
|
26
|
+
const paths = (document.paths ?? {});
|
|
27
|
+
for (const [path, item] of Object.entries(paths)) {
|
|
28
|
+
const entry = byPath.get(path);
|
|
29
|
+
const operation = item.post;
|
|
30
|
+
if (entry === undefined || operation === undefined)
|
|
31
|
+
continue;
|
|
32
|
+
operation["x-rpc-method"] = entry.meta.method;
|
|
33
|
+
operation["x-host"] = entry.meta.host;
|
|
34
|
+
if (entry.meta.mayPark === true)
|
|
35
|
+
operation["x-may-park"] = true;
|
|
36
|
+
}
|
|
37
|
+
return document;
|
|
38
|
+
}
|
|
39
|
+
function schemaOf(schema, strategy) {
|
|
40
|
+
const [, json] = converter.convert(schema, { strategy });
|
|
41
|
+
return json;
|
|
42
|
+
}
|
|
43
|
+
function isObjectSchema(schema) {
|
|
44
|
+
return schema.type === "object" && schema.anyOf === undefined && schema.oneOf === undefined;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* OpenRPC 1.3 description of the wire. Method names come from `meta.method`.
|
|
48
|
+
* Params are by-name: an object input contributes one param per property; an
|
|
49
|
+
* input that is not a plain object (a union) is given whole in `x-params-schema`.
|
|
50
|
+
*/
|
|
51
|
+
export async function generateOpenRpc(version) {
|
|
52
|
+
const methods = [];
|
|
53
|
+
for (const entry of listProcedures()) {
|
|
54
|
+
const def = entry.procedure["~orpc"];
|
|
55
|
+
const input = schemaOf(def.inputSchema, "input");
|
|
56
|
+
const output = schemaOf(def.outputSchema, "output");
|
|
57
|
+
const tags = def.route.tags?.map((name) => ({ name })) ?? [];
|
|
58
|
+
const row = {
|
|
59
|
+
name: entry.meta.method,
|
|
60
|
+
summary: def.route.summary,
|
|
61
|
+
...(def.route.description === undefined ? {} : { description: def.route.description }),
|
|
62
|
+
tags,
|
|
63
|
+
paramStructure: "by-name",
|
|
64
|
+
params: [],
|
|
65
|
+
result: { name: "result", schema: output },
|
|
66
|
+
"x-host": entry.meta.host,
|
|
67
|
+
...(entry.meta.mayPark === true ? { "x-may-park": true } : {}),
|
|
68
|
+
};
|
|
69
|
+
if (typeof input !== "boolean" && isObjectSchema(input)) {
|
|
70
|
+
const required = new Set(input.required);
|
|
71
|
+
row.params = Object.entries(input.properties ?? {}).map(([name, schema]) => ({
|
|
72
|
+
name,
|
|
73
|
+
required: required.has(name),
|
|
74
|
+
schema,
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
row["x-params-schema"] = input;
|
|
79
|
+
}
|
|
80
|
+
methods.push(row);
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
openrpc: "1.3.2",
|
|
84
|
+
info: {
|
|
85
|
+
...INFO(version),
|
|
86
|
+
description: "JSON-RPC 2.0 over WebSocket text frames on `<root>/daemon.sock`. Generated from @inhuman.tools/harness-contract.",
|
|
87
|
+
},
|
|
88
|
+
methods,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const text = (value) => `${JSON.stringify(value, null, 2)}\n`;
|
|
92
|
+
/** Every generated file, by name relative to the package's `spec/` folder. */
|
|
93
|
+
export async function generateArtifacts(version) {
|
|
94
|
+
return [
|
|
95
|
+
{ file: "openapi.json", text: text(await generateOpenApi(version)) },
|
|
96
|
+
{ file: "openrpc.json", text: text(await generateOpenRpc(version)) },
|
|
97
|
+
{ file: "README.md", text: renderReadme(listProcedures()) },
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/spec/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ContractEntry } from "../contract.js";
|
|
2
|
+
/** `packages/harness-contract/spec/README.md`. Generated: edit this function, then run the `spec` script. */
|
|
3
|
+
export declare function renderReadme(entries: readonly ContractEntry[]): string;
|
|
4
|
+
//# sourceMappingURL=readme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readme.d.ts","sourceRoot":"","sources":["../../src/spec/readme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAapD,6GAA6G;AAC7G,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CA+GtE"}
|