@nifrajs/core 5.5.0 → 5.6.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.
Files changed (138) hide show
  1. package/CHANGELOG.md +159 -0
  2. package/dist/assurance.d.ts.map +1 -1
  3. package/dist/assurance.js.map +1 -1
  4. package/dist/evidence.d.ts +2 -0
  5. package/dist/evidence.d.ts.map +1 -1
  6. package/dist/evidence.js +2 -0
  7. package/dist/evidence.js.map +1 -1
  8. package/dist/file-type.d.ts +30 -0
  9. package/dist/file-type.d.ts.map +1 -0
  10. package/dist/file-type.js +118 -0
  11. package/dist/file-type.js.map +1 -0
  12. package/dist/index.d.ts +2 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +2 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/internal/route-program.d.ts +11 -0
  17. package/dist/internal/route-program.d.ts.map +1 -1
  18. package/dist/internal/route-program.js +133 -85
  19. package/dist/internal/route-program.js.map +1 -1
  20. package/dist/reflection.d.ts +14 -1
  21. package/dist/reflection.d.ts.map +1 -1
  22. package/dist/reflection.js +34 -7
  23. package/dist/reflection.js.map +1 -1
  24. package/dist/response-observer.d.ts +1 -0
  25. package/dist/response-observer.d.ts.map +1 -1
  26. package/dist/response-observer.js +1 -0
  27. package/dist/response-observer.js.map +1 -1
  28. package/dist/server/bare-error-lane.d.ts +4 -1
  29. package/dist/server/bare-error-lane.d.ts.map +1 -1
  30. package/dist/server/bare-error-lane.js +9 -3
  31. package/dist/server/bare-error-lane.js.map +1 -1
  32. package/dist/server/before-handler.d.ts +10 -0
  33. package/dist/server/before-handler.d.ts.map +1 -0
  34. package/dist/server/before-handler.js +12 -0
  35. package/dist/server/before-handler.js.map +1 -0
  36. package/dist/server/body-lane.d.ts.map +1 -1
  37. package/dist/server/body-lane.js +8 -2
  38. package/dist/server/body-lane.js.map +1 -1
  39. package/dist/server/body-parser.d.ts.map +1 -1
  40. package/dist/server/body-parser.js +2 -5
  41. package/dist/server/body-parser.js.map +1 -1
  42. package/dist/server/body.d.ts +24 -8
  43. package/dist/server/body.d.ts.map +1 -1
  44. package/dist/server/body.js +86 -33
  45. package/dist/server/body.js.map +1 -1
  46. package/dist/server/core-copies.js +1 -1
  47. package/dist/server/http.d.ts.map +1 -1
  48. package/dist/server/http.js +6 -17
  49. package/dist/server/http.js.map +1 -1
  50. package/dist/server/multipart.d.ts +3 -0
  51. package/dist/server/multipart.d.ts.map +1 -1
  52. package/dist/server/multipart.js +226 -97
  53. package/dist/server/multipart.js.map +1 -1
  54. package/dist/server/proto-guard.d.ts.map +1 -1
  55. package/dist/server/proto-guard.js +39 -4
  56. package/dist/server/proto-guard.js.map +1 -1
  57. package/dist/server/query.d.ts.map +1 -1
  58. package/dist/server/query.js +8 -14
  59. package/dist/server/query.js.map +1 -1
  60. package/dist/server/repeated-prefix.d.ts +17 -0
  61. package/dist/server/repeated-prefix.d.ts.map +1 -0
  62. package/dist/server/repeated-prefix.js +17 -0
  63. package/dist/server/repeated-prefix.js.map +1 -0
  64. package/dist/server/request-context.d.ts.map +1 -1
  65. package/dist/server/request-context.js +1 -3
  66. package/dist/server/request-context.js.map +1 -1
  67. package/dist/server/respond.d.ts +1 -3
  68. package/dist/server/respond.d.ts.map +1 -1
  69. package/dist/server/respond.js +21 -16
  70. package/dist/server/respond.js.map +1 -1
  71. package/dist/server/response-contract-lane.d.ts +12 -2
  72. package/dist/server/response-contract-lane.d.ts.map +1 -1
  73. package/dist/server/response-contract-lane.js +135 -8
  74. package/dist/server/response-contract-lane.js.map +1 -1
  75. package/dist/server/runtime-core.d.ts +7 -0
  76. package/dist/server/runtime-core.d.ts.map +1 -1
  77. package/dist/server/runtime-core.js +8 -1
  78. package/dist/server/runtime-core.js.map +1 -1
  79. package/dist/server/server-types.d.ts +6 -3
  80. package/dist/server/server-types.d.ts.map +1 -1
  81. package/dist/server/server.d.ts +6 -2
  82. package/dist/server/server.d.ts.map +1 -1
  83. package/dist/server/server.js +239 -78
  84. package/dist/server/server.js.map +1 -1
  85. package/dist/server/sse.d.ts +1 -1
  86. package/dist/server/sse.d.ts.map +1 -1
  87. package/dist/server/sse.js +5 -4
  88. package/dist/server/sse.js.map +1 -1
  89. package/dist/server/webhook.d.ts +1 -1
  90. package/dist/server/webhook.d.ts.map +1 -1
  91. package/dist/server/webhook.js +24 -19
  92. package/dist/server/webhook.js.map +1 -1
  93. package/dist/server/websocket.d.ts +18 -3
  94. package/dist/server/websocket.d.ts.map +1 -1
  95. package/dist/server/websocket.js +45 -5
  96. package/dist/server/websocket.js.map +1 -1
  97. package/dist/server/ws-bun.d.ts.map +1 -1
  98. package/dist/server/ws-bun.js +12 -3
  99. package/dist/server/ws-bun.js.map +1 -1
  100. package/dist/server.d.ts +1 -0
  101. package/dist/server.d.ts.map +1 -1
  102. package/dist/server.js +1 -0
  103. package/dist/server.js.map +1 -1
  104. package/dist/tool-cli.d.ts +64 -0
  105. package/dist/tool-cli.d.ts.map +1 -0
  106. package/dist/tool-cli.js +495 -0
  107. package/dist/tool-cli.js.map +1 -0
  108. package/package.json +11 -1
  109. package/src/assurance.ts +1 -0
  110. package/src/evidence.ts +4 -0
  111. package/src/file-type.ts +130 -0
  112. package/src/index.ts +2 -1
  113. package/src/internal/route-program.ts +261 -93
  114. package/src/reflection.ts +53 -7
  115. package/src/response-observer.ts +6 -0
  116. package/src/server/bare-error-lane.ts +9 -4
  117. package/src/server/before-handler.ts +14 -0
  118. package/src/server/body-lane.ts +19 -9
  119. package/src/server/body-parser.ts +1 -5
  120. package/src/server/body.ts +96 -36
  121. package/src/server/core-copies.ts +1 -1
  122. package/src/server/http.ts +6 -15
  123. package/src/server/multipart.ts +232 -100
  124. package/src/server/proto-guard.ts +39 -4
  125. package/src/server/query.ts +7 -13
  126. package/src/server/repeated-prefix.ts +25 -0
  127. package/src/server/request-context.ts +1 -3
  128. package/src/server/respond.ts +23 -15
  129. package/src/server/response-contract-lane.ts +130 -8
  130. package/src/server/runtime-core.ts +10 -1
  131. package/src/server/server-types.ts +6 -3
  132. package/src/server/server.ts +265 -76
  133. package/src/server/sse.ts +6 -5
  134. package/src/server/webhook.ts +29 -24
  135. package/src/server/websocket.ts +57 -8
  136. package/src/server/ws-bun.ts +17 -2
  137. package/src/server.ts +1 -0
  138. package/src/tool-cli.ts +584 -0
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Run tool contracts from a command line - the CLI adapter beside {@link createToolHttpHandler} and
3
+ * `@nifrajs/mcp`'s `toMcpTool`. Every call goes through {@link executeTool}, so admission, approval,
4
+ * dry-run, validation and evidence are the contract's, not this module's.
5
+ *
6
+ * ```ts
7
+ * import { runToolCli } from "@nifrajs/core/tool-cli"
8
+ *
9
+ * process.exitCode = await runToolCli([search, publish], process.argv.slice(2), {
10
+ * program: "acme",
11
+ * capabilities: [search.capability, publish.capability],
12
+ * })
13
+ * ```
14
+ *
15
+ * Grammar: `<program> <tool> [--<property> <value>]... [--input <json> | --input -] [--dry-run]
16
+ * [--yes] [--approve-level <n>] [--json]`. A flag names one top-level property of the tool's input
17
+ * schema, spelled exactly as declared. String, number, integer and boolean properties take a plain
18
+ * value (`--no-<property>` sets a boolean false); an array of those repeats the flag once per item;
19
+ * anything else takes JSON. `--input` supplies the whole input as JSON (`-` reads stdin) and flags
20
+ * override its fields. Approval comes only from the command line: `--yes`, or `--approve-level <n>`
21
+ * for a threshold policy.
22
+ *
23
+ * The result goes to stdout as the output's JSON; `--json` prints the full result envelope (the HTTP
24
+ * adapter's body shape) instead. Exit codes are {@link TOOL_CLI_EXIT}: usage errors and invalid input
25
+ * are `2`, a refusal (capability, policy, approval) is `3`, any other failure is `1`.
26
+ */
27
+ import { type ProtoPoisoning } from "./server/proto-guard.js";
28
+ import { type ToolCallOptions, type ToolContract } from "./tool-contract.js";
29
+ /** Process exit codes {@link runToolCli} resolves to. */
30
+ export declare const TOOL_CLI_EXIT: Readonly<{
31
+ ok: 0;
32
+ failed: 1;
33
+ usage: 2;
34
+ refused: 3;
35
+ }>;
36
+ /** Where the CLI writes. `process.stdout` / `process.stderr` / `process.stdin` satisfy it. */
37
+ export interface ToolCliStreams {
38
+ readonly stdout: {
39
+ write(chunk: string): unknown;
40
+ };
41
+ readonly stderr: {
42
+ write(chunk: string): unknown;
43
+ };
44
+ /** Read by `--input -`. */
45
+ readonly stdin?: AsyncIterable<Uint8Array | string>;
46
+ }
47
+ export interface ToolCliOptions extends Omit<ToolCallOptions, "approval" | "dryRun" | "ledger"> {
48
+ /** The command name shown in usage text. */
49
+ readonly program: string;
50
+ /** Default: the process streams. */
51
+ readonly streams?: ToolCliStreams;
52
+ /** Cap on `--input` JSON, inline or from stdin, in UTF-8 bytes. Default 1 MiB. */
53
+ readonly maxInputBytes?: number;
54
+ /** Prototype-poisoning policy for every JSON value read. Default `"reject"`. */
55
+ readonly protoPoisoning?: ProtoPoisoning;
56
+ }
57
+ /** A heterogeneous tool list. Each contract still validates its own input at execution. */
58
+ export type CliToolContract = ToolContract<any, any>;
59
+ /**
60
+ * Run one command line against `tools`. Resolves to the exit code; it never throws for anything a
61
+ * user typed. `argv` excludes the runtime and script (`process.argv.slice(2)`).
62
+ */
63
+ export declare function runToolCli(tools: readonly CliToolContract[], argv: readonly string[], options: ToolCliOptions): Promise<number>;
64
+ //# sourceMappingURL=tool-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cli.d.ts","sourceRoot":"","sources":["../src/tool-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,KAAK,cAAc,EAAoB,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EAIL,KAAK,eAAe,EAEpB,KAAK,YAAY,EAGlB,MAAM,oBAAoB,CAAA;AAE3B,yDAAyD;AACzD,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC;IAAE,EAAE,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,OAAO,EAAE,CAAC,CAAA;CAAE,CAK7E,CAAA;AAEF,8FAA8F;AAC9F,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAA;IAClD,QAAQ,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAA;IAClD,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,UAAU,GAAG,MAAM,CAAC,CAAA;CACpD;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC7F,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,oCAAoC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAA;IACjC,kFAAkF;IAClF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,gFAAgF;IAChF,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAA;CACzC;AAED,2FAA2F;AAE3F,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AA4BpD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,CAAC,CAoDjB"}
@@ -0,0 +1,495 @@
1
+ /**
2
+ * Run tool contracts from a command line - the CLI adapter beside {@link createToolHttpHandler} and
3
+ * `@nifrajs/mcp`'s `toMcpTool`. Every call goes through {@link executeTool}, so admission, approval,
4
+ * dry-run, validation and evidence are the contract's, not this module's.
5
+ *
6
+ * ```ts
7
+ * import { runToolCli } from "@nifrajs/core/tool-cli"
8
+ *
9
+ * process.exitCode = await runToolCli([search, publish], process.argv.slice(2), {
10
+ * program: "acme",
11
+ * capabilities: [search.capability, publish.capability],
12
+ * })
13
+ * ```
14
+ *
15
+ * Grammar: `<program> <tool> [--<property> <value>]... [--input <json> | --input -] [--dry-run]
16
+ * [--yes] [--approve-level <n>] [--json]`. A flag names one top-level property of the tool's input
17
+ * schema, spelled exactly as declared. String, number, integer and boolean properties take a plain
18
+ * value (`--no-<property>` sets a boolean false); an array of those repeats the flag once per item;
19
+ * anything else takes JSON. `--input` supplies the whole input as JSON (`-` reads stdin) and flags
20
+ * override its fields. Approval comes only from the command line: `--yes`, or `--approve-level <n>`
21
+ * for a threshold policy.
22
+ *
23
+ * The result goes to stdout as the output's JSON; `--json` prints the full result envelope (the HTTP
24
+ * adapter's body shape) instead. Exit codes are {@link TOOL_CLI_EXIT}: usage errors and invalid input
25
+ * are `2`, a refusal (capability, policy, approval) is `3`, any other failure is `1`.
26
+ */
27
+ import { parseJsonGuarded } from "./server/proto-guard.js";
28
+ import { DEFAULT_TOOL_MAX_BYTES, executeTool, toolInputJsonSchema, } from "./tool-contract.js";
29
+ /** Process exit codes {@link runToolCli} resolves to. */
30
+ export const TOOL_CLI_EXIT = Object.freeze({
31
+ ok: 0,
32
+ failed: 1,
33
+ usage: 2,
34
+ refused: 3,
35
+ });
36
+ const RESERVED = new Set(["help", "input", "dry-run", "yes", "approve-level", "json"]);
37
+ const INTEGER = /^-?(?:0|[1-9]\d*)$/;
38
+ const DECIMAL = /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$/;
39
+ /**
40
+ * Run one command line against `tools`. Resolves to the exit code; it never throws for anything a
41
+ * user typed. `argv` excludes the runtime and script (`process.argv.slice(2)`).
42
+ */
43
+ export async function runToolCli(tools, argv, options) {
44
+ const { program, streams, maxInputBytes, protoPoisoning, ...callOptions } = options;
45
+ const names = new Set();
46
+ for (const tool of tools) {
47
+ if (names.has(tool.name))
48
+ throw new TypeError(`runToolCli: duplicate tool ${tool.name}`);
49
+ names.add(tool.name);
50
+ }
51
+ const cap = maxInputBytes ?? DEFAULT_TOOL_MAX_BYTES;
52
+ if (!Number.isSafeInteger(cap) || cap <= 0) {
53
+ throw new RangeError("runToolCli: maxInputBytes must be a positive safe integer");
54
+ }
55
+ const io = streams ?? processStreams();
56
+ const policy = protoPoisoning ?? "reject";
57
+ const [first, ...rest] = argv;
58
+ if (first === undefined) {
59
+ io.stderr.write(programUsage(program, tools));
60
+ return TOOL_CLI_EXIT.usage;
61
+ }
62
+ if (first === "--help" || first === "-h") {
63
+ io.stdout.write(programUsage(program, tools));
64
+ return TOOL_CLI_EXIT.ok;
65
+ }
66
+ const tool = tools.find((candidate) => candidate.name === first);
67
+ if (tool === undefined) {
68
+ io.stderr.write(`${program}: unknown tool ${JSON.stringify(first)}\n\n${programUsage(program, tools)}`);
69
+ return TOOL_CLI_EXIT.usage;
70
+ }
71
+ const flags = flagsOf(tool);
72
+ const parsed = await parseInvocation(rest, flags, { io, cap, policy });
73
+ if (parsed.kind === "help") {
74
+ io.stdout.write(toolUsage(program, tool, flags));
75
+ return TOOL_CLI_EXIT.ok;
76
+ }
77
+ if (parsed.kind === "usage") {
78
+ io.stderr.write(`${program} ${tool.name}: ${parsed.message}\nRun \`${program} ${tool.name} --help\` for its options.\n`);
79
+ return TOOL_CLI_EXIT.usage;
80
+ }
81
+ const { invocation } = parsed;
82
+ const call = {
83
+ ...callOptions,
84
+ dryRun: invocation.dryRun,
85
+ };
86
+ if (invocation.approval !== undefined)
87
+ call.approval = invocation.approval;
88
+ const result = await executeTool(tool, invocation.input, call);
89
+ return report(result, { program, tool, json: invocation.json, io });
90
+ }
91
+ function report(result, context) {
92
+ const { io, program, tool } = context;
93
+ const code = result.ok ? TOOL_CLI_EXIT.ok : exitCodeOf(result.error.code);
94
+ let text;
95
+ try {
96
+ if (context.json) {
97
+ text = JSON.stringify(result.ok
98
+ ? { ok: true, output: result.output, dryRun: result.dryRun, evidence: result.evidence }
99
+ : { ok: false, error: result.error, dryRun: result.dryRun, evidence: result.evidence });
100
+ }
101
+ else if (result.ok && result.output !== undefined) {
102
+ text = JSON.stringify(result.output, null, 2);
103
+ }
104
+ }
105
+ catch {
106
+ io.stderr.write(`${program} ${tool.name}: the result is not JSON-serializable\n`);
107
+ return TOOL_CLI_EXIT.failed;
108
+ }
109
+ if (text !== undefined)
110
+ io.stdout.write(`${text}\n`);
111
+ if (context.json)
112
+ return code;
113
+ if (result.ok) {
114
+ if (result.dryRun)
115
+ io.stderr.write(`${program} ${tool.name}: dry run admitted; nothing executed\n`);
116
+ return code;
117
+ }
118
+ io.stderr.write(failureText(program, tool, result.error));
119
+ return code;
120
+ }
121
+ function failureText(program, tool, error) {
122
+ const lines = [`${program} ${tool.name}: ${error.code} (${error.stage})`];
123
+ for (const issue of error.issues ?? [])
124
+ lines.push(` ${issuePath(issue.path)}: ${issue.message}`);
125
+ if (error.code === "approval_required" || error.code === "approval_denied") {
126
+ lines.push(tool.approval.kind === "threshold"
127
+ ? ` approve with --approve-level ${tool.approval.level}`
128
+ : " approve with --yes");
129
+ }
130
+ return `${lines.join("\n")}\n`;
131
+ }
132
+ function issuePath(path) {
133
+ if (path === undefined || path.length === 0)
134
+ return "input";
135
+ const keys = path.map((segment) => segment !== null && typeof segment === "object" && "key" in segment ? segment.key : segment);
136
+ return keys.map((key) => (typeof key === "symbol" ? key.toString() : String(key))).join(".");
137
+ }
138
+ function exitCodeOf(code) {
139
+ switch (code) {
140
+ case "input_invalid":
141
+ return TOOL_CLI_EXIT.usage;
142
+ case "capability_denied":
143
+ case "execution_policy_unsatisfied":
144
+ case "approval_required":
145
+ case "approval_denied":
146
+ return TOOL_CLI_EXIT.refused;
147
+ default:
148
+ return TOOL_CLI_EXIT.failed;
149
+ }
150
+ }
151
+ async function parseInvocation(args, flags, context) {
152
+ const fields = new Map();
153
+ let inputText;
154
+ let inputFromStdin = false;
155
+ let dryRun = false;
156
+ let yes = false;
157
+ let level;
158
+ let json = false;
159
+ for (let index = 0; index < args.length; index += 1) {
160
+ const arg = args[index] ?? "";
161
+ if (arg === "--help" || arg === "-h")
162
+ return { kind: "help" };
163
+ if (!arg.startsWith("--") || arg === "--") {
164
+ return { kind: "usage", message: `unexpected argument ${JSON.stringify(arg)}` };
165
+ }
166
+ const equals = arg.indexOf("=");
167
+ const name = equals === -1 ? arg.slice(2) : arg.slice(2, equals);
168
+ const inline = equals === -1 ? undefined : arg.slice(equals + 1);
169
+ const takeValue = () => {
170
+ if (inline !== undefined)
171
+ return inline;
172
+ const next = args[index + 1];
173
+ if (next === undefined || next.startsWith("--"))
174
+ return undefined;
175
+ index += 1;
176
+ return next;
177
+ };
178
+ if (RESERVED.has(name)) {
179
+ if (name === "dry-run" || name === "yes" || name === "json") {
180
+ if (inline !== undefined)
181
+ return { kind: "usage", message: `--${name} takes no value` };
182
+ if (name === "dry-run")
183
+ dryRun = true;
184
+ else if (name === "yes")
185
+ yes = true;
186
+ else
187
+ json = true;
188
+ continue;
189
+ }
190
+ const value = takeValue();
191
+ if (value === undefined)
192
+ return { kind: "usage", message: `--${name} needs a value` };
193
+ if (name === "approve-level") {
194
+ if (!INTEGER.test(value) || Number(value) <= 0) {
195
+ return { kind: "usage", message: "--approve-level needs a positive integer" };
196
+ }
197
+ level = Number(value);
198
+ continue;
199
+ }
200
+ if (inputText !== undefined || inputFromStdin) {
201
+ return { kind: "usage", message: "--input given twice" };
202
+ }
203
+ if (value === "-")
204
+ inputFromStdin = true;
205
+ else
206
+ inputText = value;
207
+ continue;
208
+ }
209
+ const negated = name.startsWith("no-") ? flags.get(name.slice(3)) : undefined;
210
+ if (negated !== undefined &&
211
+ negated.kind === "boolean" &&
212
+ inline === undefined &&
213
+ !flags.has(name)) {
214
+ if (fields.has(negated.name))
215
+ return { kind: "usage", message: `--${negated.name} given twice` };
216
+ fields.set(negated.name, false);
217
+ continue;
218
+ }
219
+ const flag = flags.get(name);
220
+ if (flag === undefined)
221
+ return { kind: "usage", message: `unknown option --${name}` };
222
+ if (!flag.repeated && fields.has(flag.name)) {
223
+ return { kind: "usage", message: `--${flag.name} given twice` };
224
+ }
225
+ let raw;
226
+ if (flag.kind === "boolean" && !flag.repeated && inline === undefined)
227
+ raw = "true";
228
+ else
229
+ raw = takeValue();
230
+ if (raw === undefined)
231
+ return { kind: "usage", message: `--${flag.name} needs a value` };
232
+ const value = coerce(raw, flag.kind, context.policy);
233
+ if (!value.ok)
234
+ return { kind: "usage", message: `--${flag.name}: ${value.message}` };
235
+ if (flag.repeated) {
236
+ const items = fields.get(flag.name);
237
+ if (Array.isArray(items))
238
+ items.push(value.value);
239
+ else
240
+ fields.set(flag.name, [value.value]);
241
+ }
242
+ else {
243
+ fields.set(flag.name, value.value);
244
+ }
245
+ }
246
+ let input;
247
+ if (inputText !== undefined || inputFromStdin) {
248
+ const text = inputFromStdin ? await readStdin(context.io, context.cap) : inputText;
249
+ if (text === undefined)
250
+ return { kind: "usage", message: "--input - needs a readable stdin" };
251
+ if (typeof text === "object")
252
+ return { kind: "usage", message: text.message };
253
+ if (new TextEncoder().encode(text).byteLength > context.cap) {
254
+ return { kind: "usage", message: `--input exceeds ${context.cap} bytes` };
255
+ }
256
+ const parsed = parseJson(text, context.policy);
257
+ if (!parsed.ok)
258
+ return { kind: "usage", message: `--input: ${parsed.message}` };
259
+ input = parsed.value;
260
+ }
261
+ if (fields.size > 0) {
262
+ if (input !== undefined &&
263
+ (input === null || typeof input !== "object" || Array.isArray(input))) {
264
+ return { kind: "usage", message: "options need --input to be a JSON object" };
265
+ }
266
+ const merged = {};
267
+ if (input !== undefined)
268
+ for (const [key, value] of Object.entries(input))
269
+ define(merged, key, value);
270
+ for (const [key, value] of fields)
271
+ define(merged, key, value);
272
+ input = merged;
273
+ }
274
+ let approval;
275
+ if (level !== undefined)
276
+ approval = { granted: true, level };
277
+ else if (yes)
278
+ approval = { granted: true };
279
+ return { kind: "run", invocation: { input: input ?? {}, dryRun, approval, json } };
280
+ }
281
+ // `__proto__` as a declared property name must become an own field, never the prototype.
282
+ function define(target, key, value) {
283
+ Object.defineProperty(target, key, {
284
+ value,
285
+ enumerable: true,
286
+ writable: true,
287
+ configurable: true,
288
+ });
289
+ }
290
+ function coerce(raw, kind, policy) {
291
+ switch (kind) {
292
+ case "string":
293
+ return { ok: true, value: raw };
294
+ case "boolean":
295
+ if (raw === "true")
296
+ return { ok: true, value: true };
297
+ if (raw === "false")
298
+ return { ok: true, value: false };
299
+ return { ok: false, message: "expected true or false" };
300
+ case "integer": {
301
+ if (!INTEGER.test(raw))
302
+ return { ok: false, message: "expected an integer" };
303
+ const value = Number(raw);
304
+ return Number.isSafeInteger(value)
305
+ ? { ok: true, value }
306
+ : { ok: false, message: "integer is out of the safe range" };
307
+ }
308
+ case "number": {
309
+ if (!DECIMAL.test(raw))
310
+ return { ok: false, message: "expected a number" };
311
+ const value = Number(raw);
312
+ return Number.isFinite(value)
313
+ ? { ok: true, value }
314
+ : { ok: false, message: "number is not finite" };
315
+ }
316
+ default:
317
+ return parseJson(raw, policy);
318
+ }
319
+ }
320
+ function parseJson(text, policy) {
321
+ try {
322
+ return {
323
+ ok: true,
324
+ value: policy === "ignore" ? JSON.parse(text) : parseJsonGuarded(text, policy),
325
+ };
326
+ }
327
+ catch {
328
+ return { ok: false, message: "expected JSON" };
329
+ }
330
+ }
331
+ async function readStdin(io, cap) {
332
+ if (io.stdin === undefined)
333
+ return undefined;
334
+ const encoder = new TextEncoder();
335
+ const parts = [];
336
+ let total = 0;
337
+ for await (const chunk of io.stdin) {
338
+ const bytes = typeof chunk === "string" ? encoder.encode(chunk) : chunk;
339
+ total += bytes.byteLength;
340
+ if (total > cap)
341
+ return { message: `--input exceeds ${cap} bytes` };
342
+ parts.push(bytes.slice());
343
+ }
344
+ const joined = new Uint8Array(total);
345
+ let offset = 0;
346
+ for (const part of parts) {
347
+ joined.set(part, offset);
348
+ offset += part.byteLength;
349
+ }
350
+ try {
351
+ return new TextDecoder("utf-8", { fatal: true }).decode(joined);
352
+ }
353
+ catch {
354
+ return { message: "--input: stdin is not UTF-8" };
355
+ }
356
+ }
357
+ function flagsOf(tool) {
358
+ const schema = toolInputJsonSchema(tool);
359
+ const properties = record(schema.properties);
360
+ const required = Array.isArray(schema.required) ? schema.required : [];
361
+ const flags = new Map();
362
+ if (properties === undefined)
363
+ return flags;
364
+ for (const [name, value] of Object.entries(properties)) {
365
+ if (RESERVED.has(name))
366
+ continue;
367
+ const property = record(value) ?? {};
368
+ const items = property.type === "array" ? record(property.items) : undefined;
369
+ const itemKind = items === undefined ? undefined : primitiveOf(items);
370
+ const description = typeof property.description === "string" ? property.description : undefined;
371
+ flags.set(name, {
372
+ name,
373
+ kind: items === undefined ? (primitiveOf(property) ?? "json") : (itemKind ?? "json"),
374
+ repeated: items !== undefined,
375
+ required: required.includes(name),
376
+ description,
377
+ });
378
+ }
379
+ return flags;
380
+ }
381
+ function primitiveOf(schema) {
382
+ const type = schema.type;
383
+ if (typeof type === "string")
384
+ return isPrimitive(type) ? type : undefined;
385
+ if (Array.isArray(type)) {
386
+ const kinds = type.filter((entry) => entry !== "null");
387
+ const [only] = kinds;
388
+ return kinds.length === 1 && typeof only === "string" && isPrimitive(only) ? only : undefined;
389
+ }
390
+ const literals = Array.isArray(schema.enum)
391
+ ? schema.enum
392
+ : "const" in schema
393
+ ? [schema.const]
394
+ : undefined;
395
+ if (literals !== undefined && literals.length > 0) {
396
+ if (literals.every((literal) => typeof literal === "string"))
397
+ return "string";
398
+ if (literals.every((literal) => typeof literal === "number"))
399
+ return "number";
400
+ return undefined;
401
+ }
402
+ const members = Array.isArray(schema.anyOf)
403
+ ? schema.anyOf
404
+ : Array.isArray(schema.oneOf)
405
+ ? schema.oneOf
406
+ : undefined;
407
+ if (members === undefined || members.length === 0)
408
+ return undefined;
409
+ const kinds = new Set(members.map((member) => primitiveOf(record(member) ?? {})));
410
+ const [only] = kinds;
411
+ return kinds.size === 1 ? only : undefined;
412
+ }
413
+ function isPrimitive(type) {
414
+ return type === "string" || type === "number" || type === "integer" || type === "boolean";
415
+ }
416
+ function record(value) {
417
+ if (value === null || typeof value !== "object" || Array.isArray(value))
418
+ return undefined;
419
+ const out = {};
420
+ for (const [key, entry] of Object.entries(value))
421
+ out[key] = entry;
422
+ return out;
423
+ }
424
+ function programUsage(program, tools) {
425
+ const width = Math.max(0, ...tools.map((tool) => tool.name.length));
426
+ const rows = tools.map((tool) => ` ${tool.name.padEnd(width)} ${oneLine(tool.description)}`);
427
+ return [
428
+ `Usage: ${program} <tool> [options]`,
429
+ "",
430
+ "Tools:",
431
+ ...rows,
432
+ "",
433
+ `Run \`${program} <tool> --help\` for a tool's options.`,
434
+ "",
435
+ ].join("\n");
436
+ }
437
+ function toolUsage(program, tool, flags) {
438
+ const rows = [];
439
+ for (const flag of flags.values()) {
440
+ const value = flag.kind === "boolean" && !flag.repeated ? "" : ` <${flag.kind}>`;
441
+ const spelling = flag.kind === "boolean" && !flag.repeated
442
+ ? `--${flag.name} / --no-${flag.name}`
443
+ : `--${flag.name}${value}`;
444
+ const notes = [
445
+ flag.required ? "required" : undefined,
446
+ flag.repeated ? "repeatable" : undefined,
447
+ flag.description === undefined ? undefined : oneLine(flag.description),
448
+ ].filter((note) => note !== undefined);
449
+ rows.push([spelling, notes.join("; ")]);
450
+ }
451
+ rows.push([
452
+ "--input <json>|-",
453
+ "the whole input as JSON, `-` reads stdin; options above override its fields",
454
+ ]);
455
+ rows.push(["--dry-run", "admit the call without running it"]);
456
+ if (tool.approval.kind === "required")
457
+ rows.push(["--yes", "approve this call (the tool requires approval)"]);
458
+ if (tool.approval.kind === "threshold") {
459
+ rows.push(["--approve-level <n>", `approve at level n; this tool needs ${tool.approval.level}`]);
460
+ }
461
+ rows.push(["--json", "print the result envelope as JSON"]);
462
+ const width = Math.max(...rows.map(([spelling]) => spelling.length));
463
+ return [
464
+ `Usage: ${program} ${tool.name} [options]`,
465
+ "",
466
+ oneLine(tool.description),
467
+ "",
468
+ "Options:",
469
+ ...rows.map(([spelling, note]) => ` ${spelling.padEnd(width)} ${note}`.trimEnd()),
470
+ "",
471
+ ].join("\n");
472
+ }
473
+ function oneLine(text) {
474
+ return text.replace(/\s+/g, " ").trim();
475
+ }
476
+ function processStreams() {
477
+ const host = Reflect.get(globalThis, "process");
478
+ const stream = (name) => host !== null && typeof host === "object" ? Reflect.get(host, name) : undefined;
479
+ const stdout = stream("stdout");
480
+ const stderr = stream("stderr");
481
+ const stdin = stream("stdin");
482
+ if (!isWritable(stdout) || !isWritable(stderr)) {
483
+ throw new TypeError("runToolCli: this runtime has no process streams; pass `streams`");
484
+ }
485
+ return isReadable(stdin) ? { stdout, stderr, stdin } : { stdout, stderr };
486
+ }
487
+ function isWritable(value) {
488
+ return (value !== null && typeof value === "object" && typeof Reflect.get(value, "write") === "function");
489
+ }
490
+ function isReadable(value) {
491
+ return (value !== null &&
492
+ typeof value === "object" &&
493
+ typeof Reflect.get(value, Symbol.asyncIterator) === "function");
494
+ }
495
+ //# sourceMappingURL=tool-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cli.js","sourceRoot":"","sources":["../src/tool-cli.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nifrajs/core",
3
- "version": "5.5.0",
3
+ "version": "5.6.0",
4
4
  "description": "Bun-native, contract-first HTTP framework - the router, server, and route descriptor.",
5
5
  "keywords": [
6
6
  "bun",
@@ -205,6 +205,11 @@
205
205
  "types": "./dist/static-file.d.ts",
206
206
  "default": "./dist/static-file.js"
207
207
  },
208
+ "./file-type": {
209
+ "bun": "./src/file-type.ts",
210
+ "types": "./dist/file-type.d.ts",
211
+ "default": "./dist/file-type.js"
212
+ },
208
213
  "./contract": {
209
214
  "bun": "./src/server/contract.ts",
210
215
  "types": "./dist/server/contract.d.ts",
@@ -290,6 +295,11 @@
290
295
  "types": "./dist/tool-catalog.d.ts",
291
296
  "default": "./dist/tool-catalog.js"
292
297
  },
298
+ "./tool-cli": {
299
+ "bun": "./src/tool-cli.ts",
300
+ "types": "./dist/tool-cli.d.ts",
301
+ "default": "./dist/tool-cli.js"
302
+ },
293
303
  "./execution-policy": {
294
304
  "bun": "./src/execution-policy.ts",
295
305
  "types": "./dist/execution-policy.d.ts",
package/src/assurance.ts CHANGED
@@ -93,6 +93,7 @@ export interface InvariantSetupResult {
93
93
  }
94
94
 
95
95
  /** Provisions a throwaway L4 target. Called once, before the first L4 request - never on import. */
96
+ // biome-ignore lint/suspicious/noConfusingVoidType: `void` lets a setup that provisions nothing be written as `async () => {}`.
96
97
  export type InvariantSetup = () => Promise<InvariantSetupResult | undefined | void>
97
98
 
98
99
  /** Fixture options handed to the L4 contract runner (`runAdversarialContract` in `@nifrajs/testing`). */
package/src/evidence.ts CHANGED
@@ -46,6 +46,8 @@ export interface ProjectEvidenceSchema {
46
46
  readonly response?: ProjectEvidenceSchemaPart
47
47
  readonly errors?: Readonly<Record<string, ProjectEvidenceSchemaPart>>
48
48
  readonly sse?: ProjectEvidenceSchemaPart
49
+ /** Set when an `onValidationError` hook answers the route's validation failures. */
50
+ readonly validationErrorHook?: true
49
51
  }
50
52
 
51
53
  export interface ProjectEvidenceSourceLocation {
@@ -173,6 +175,7 @@ function schemaOf(route: ReflectedRoute): ProjectEvidenceSchema | undefined {
173
175
  ...(response !== undefined ? { response } : {}),
174
176
  ...(Object.keys(errors).length > 0 ? { errors: Object.freeze(errors) } : {}),
175
177
  ...(sse !== undefined ? { sse } : {}),
178
+ ...(source.validationErrorHook === true ? { validationErrorHook: true as const } : {}),
176
179
  }
177
180
  return Object.freeze(schema)
178
181
  }
@@ -518,6 +521,7 @@ function schemaFromEvidence(schema: ProjectEvidenceSchema | undefined): Reflecte
518
521
  ...(response !== undefined ? { response } : {}),
519
522
  ...(Object.keys(errors).length > 0 ? { errors } : {}),
520
523
  ...(sse !== undefined ? { sse } : {}),
524
+ ...(schema.validationErrorHook === true ? { validationErrorHook: true as const } : {}),
521
525
  }
522
526
  }
523
527