@agent-vm/agent-portal-sdk 0.0.135 → 0.0.139

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 (24) hide show
  1. package/dist/approval-surface/index.d.ts +1 -1
  2. package/dist/capability-description-surface/index.d.ts +1 -1
  3. package/dist/cli/tool-portal.js +139 -159
  4. package/dist/cli/tool-portal.js.map +1 -1
  5. package/dist/gateway-runtime-client/index.d.ts +2 -2
  6. package/dist/{index-BoYiYKiy.d.ts → index-BQ12JshX.d.ts} +39 -39
  7. package/dist/{index-BoYiYKiy.d.ts.map → index-BQ12JshX.d.ts.map} +1 -1
  8. package/dist/{index-DvcQs-mM.d.ts → index-B_FqoejO.d.ts} +19 -19
  9. package/dist/{index-DvcQs-mM.d.ts.map → index-B_FqoejO.d.ts.map} +1 -1
  10. package/dist/{index-Cwtgu-ga.d.ts → index-BqWw914Z.d.ts} +5 -5
  11. package/dist/{index-Cwtgu-ga.d.ts.map → index-BqWw914Z.d.ts.map} +1 -1
  12. package/dist/{index-D8uVfMBv.d.ts → index-D4-HMHHY.d.ts} +2 -2
  13. package/dist/{index-D8uVfMBv.d.ts.map → index-D4-HMHHY.d.ts.map} +1 -1
  14. package/dist/{index-CscGl_Rj.d.ts → index-yuB9HEo-.d.ts} +3 -3
  15. package/dist/{index-CscGl_Rj.d.ts.map → index-yuB9HEo-.d.ts.map} +1 -1
  16. package/dist/index.d.ts +5 -5
  17. package/dist/{portal-call-result-schema-CGopcrjJ.d.ts → portal-call-result-schema-DalyNrfW.d.ts} +191 -191
  18. package/dist/{portal-call-result-schema-CGopcrjJ.d.ts.map → portal-call-result-schema-DalyNrfW.d.ts.map} +1 -1
  19. package/dist/portal-call-surface/index.d.ts +2 -2
  20. package/dist/portal-event-surface/index.d.ts +1 -1
  21. package/dist/testing/index.d.ts +1 -1
  22. package/dist/tool-portal-mcp-client/index.d.ts +1 -1
  23. package/dist/tool-portal-mcp-client/node-tool-portal-mcp-transport.d.ts +1 -1
  24. package/package.json +4 -3
@@ -1,2 +1,2 @@
1
- import { a as ApprovalRequiredResult, i as ApprovalDecisionReferenceSchema, n as ApprovalChallengeReferenceSchema, o as ApprovalRequiredResultSchema, r as ApprovalDecisionReference, t as ApprovalChallengeReference } from "../index-Cwtgu-ga.js";
1
+ import { a as ApprovalRequiredResult, i as ApprovalDecisionReferenceSchema, n as ApprovalChallengeReferenceSchema, o as ApprovalRequiredResultSchema, r as ApprovalDecisionReference, t as ApprovalChallengeReference } from "../index-BqWw914Z.js";
2
2
  export { ApprovalChallengeReference, ApprovalChallengeReferenceSchema, ApprovalDecisionReference, ApprovalDecisionReferenceSchema, ApprovalRequiredResult, ApprovalRequiredResultSchema };
@@ -1,2 +1,2 @@
1
- import { _ as ToolSchemaSummarySchema, a as CapabilitySummary, c as ResultExpectation, d as SafeCallingHintSchema, f as ToolSafetySummary, g as ToolSchemaSummary, h as ToolSchemaHintSchema, i as CapabilitySearchMatchSchema, l as ResultExpectationSchema, m as ToolSchemaHint, n as CapabilityDescriptorSchema, o as CapabilitySummarySchema, p as ToolSafetySummarySchema, r as CapabilitySearchMatch, s as JsonSchemaDocumentSchema, t as CapabilityDescriptor, u as SafeCallingHint } from "../index-D8uVfMBv.js";
1
+ import { _ as ToolSchemaSummarySchema, a as CapabilitySummary, c as ResultExpectation, d as SafeCallingHintSchema, f as ToolSafetySummary, g as ToolSchemaSummary, h as ToolSchemaHintSchema, i as CapabilitySearchMatchSchema, l as ResultExpectationSchema, m as ToolSchemaHint, n as CapabilityDescriptorSchema, o as CapabilitySummarySchema, p as ToolSafetySummarySchema, r as CapabilitySearchMatch, s as JsonSchemaDocumentSchema, t as CapabilityDescriptor, u as SafeCallingHint } from "../index-D4-HMHHY.js";
2
2
  export { CapabilityDescriptor, CapabilityDescriptorSchema, CapabilitySearchMatch, CapabilitySearchMatchSchema, CapabilitySummary, CapabilitySummarySchema, JsonSchemaDocumentSchema, ResultExpectation, ResultExpectationSchema, SafeCallingHint, SafeCallingHintSchema, ToolSafetySummary, ToolSafetySummarySchema, ToolSchemaHint, ToolSchemaHintSchema, ToolSchemaSummary, ToolSchemaSummarySchema };
@@ -6,165 +6,34 @@ import { a as encodeCanonicalJson } from "../portable-contracts-C5rtqe-H.js";
6
6
  import { t as ToolPortalMcpClient } from "../tool-portal-mcp-client-nMGxqQ-A.js";
7
7
  import { t as createNodeToolPortalMcpTransport } from "../node-tool-portal-mcp-transport-CnB8MCW2.js";
8
8
  import { z } from "zod";
9
+ import { run } from "@optique/run";
9
10
  import { readFile } from "node:fs/promises";
10
11
  import path from "node:path";
11
- import { conditional, object, or } from "@optique/core/constructs";
12
- import { runParser } from "@optique/core/facade";
13
- import "@optique/core/message";
14
- import { map, optional } from "@optique/core/modifiers";
15
- import "@optique/core/parser";
16
- import { command, option } from "@optique/core/primitives";
12
+ import { object, or } from "@optique/core/constructs";
13
+ import { map, optional, withDefault } from "@optique/core/modifiers";
14
+ import { command, constant, option } from "@optique/core/primitives";
17
15
  import { zod } from "@optique/zod";
18
- //#region src/cli/tool-portal-cli-parser.ts
19
- z.enum([
20
- "artifact-read",
21
- "call",
22
- "describe",
23
- "list",
24
- "search"
25
- ]);
26
- const transportKindSchema = z.enum(["http", "scoped-stdio"]);
27
- const environmentVariableNameSchema = z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/u);
28
- const absolutePathSchema = z.string().min(1).refine(path.isAbsolute, { message: "Scoped stdio configuration path must be absolute." });
29
- function createEnvironmentVariableNameParser() {
30
- return zod(environmentVariableNameSchema, {
31
- metavar: "ENV_NAME",
32
- placeholder: "TOOL_PORTAL_AUTH"
33
- });
34
- }
35
- function createInputJsonParser() {
36
- return zod(z.string().min(1), {
37
- metavar: "JSON",
38
- placeholder: "{}"
39
- });
40
- }
41
- function createHttpTransportParser() {
42
- return map(object({
43
- authorizationEnvironmentName: option("--authorization-env", createEnvironmentVariableNameParser()),
44
- endpoint: option("--endpoint", zod(z.string().min(1), {
45
- metavar: "URL",
46
- placeholder: "https://example.test/mcp"
47
- }))
48
- }), (options) => ({
49
- ...options,
50
- kind: "http"
51
- }));
52
- }
53
- function createScopedStdioTransportParser() {
54
- return map(object({ scopedStdioConfigPath: option("--stdio-config", zod(absolutePathSchema, {
55
- metavar: "PATH",
56
- placeholder: "/tmp/tool-portal.json"
57
- })) }), (options) => ({
58
- ...options,
59
- kind: "scoped-stdio"
60
- }));
61
- }
62
- function createTransportParser() {
63
- return map(conditional(option("--transport", zod(transportKindSchema, {
64
- metavar: "TRANSPORT",
65
- placeholder: "http"
66
- })), {
67
- http: createHttpTransportParser(),
68
- "scoped-stdio": createScopedStdioTransportParser()
69
- }), ([, transport]) => transport);
70
- }
71
- function createInputJsonOption() {
72
- return option("--input-json", createInputJsonParser());
73
- }
74
- function createCallCommand() {
75
- return command("call", map(object({
76
- approvalTokenEnvironmentName: optional(option("--approval-token-env", createEnvironmentVariableNameParser())),
77
- inputJson: createInputJsonOption(),
78
- transport: createTransportParser()
79
- }), ({ approvalTokenEnvironmentName, inputJson, transport }) => ({
80
- ...approvalTokenEnvironmentName === void 0 ? {} : { approvalTokenEnvironmentName },
81
- inputJson,
82
- operation: "call",
83
- transport
84
- })));
85
- }
86
- function createNonCallCommand(operation) {
87
- return command(operation, map(object({
88
- inputJson: createInputJsonOption(),
89
- transport: createTransportParser()
90
- }), ({ inputJson, transport }) => ({
91
- inputJson,
92
- operation,
93
- transport
94
- })));
95
- }
96
- const toolPortalCliParser = or(createNonCallCommand("artifact-read"), createCallCommand(), createNonCallCommand("describe"), createNonCallCommand("list"), createNonCallCommand("search"));
97
- var ToolPortalCliRunnerSignalError = class extends Error {
98
- signal;
99
- constructor(signal) {
100
- super(`Tool Portal CLI runner signal: ${signal.kind}`);
101
- this.signal = signal;
102
- }
103
- };
104
- function writeOutput(write, text) {
105
- write.write(text.endsWith("\n") ? text : `${text}\n`);
106
- }
107
- function createRunOptions(io) {
108
- return {
109
- help: {
110
- command: true,
111
- option: { names: ["-h", "--help"] },
112
- onShow: () => {
113
- throw new ToolPortalCliRunnerSignalError({
114
- exitCode: 0,
115
- kind: "help"
116
- });
117
- }
118
- },
119
- onError: (exitCode) => {
120
- throw new ToolPortalCliRunnerSignalError({
121
- exitCode,
122
- kind: "parse-error"
123
- });
124
- },
125
- stderr: (text) => writeOutput(io.stderr, text),
126
- stdout: (text) => writeOutput(io.stdout, text)
127
- };
128
- }
129
- function runToolPortalCliParser(argv, io) {
130
- try {
131
- return {
132
- kind: "parsed",
133
- value: runParser(toolPortalCliParser, "tool-portal", argv, createRunOptions(io))
134
- };
135
- } catch (error) {
136
- if (error instanceof ToolPortalCliRunnerSignalError) return error.signal;
137
- throw error;
138
- }
139
- }
140
- //#endregion
141
- //#region src/cli/tool-portal.ts
16
+ //#region src/cli/tool-portal-cli-operation.ts
142
17
  const canonicalResultGraceAfterInterruptMilliseconds = 250;
143
- const ScopedStdioConfigSchema = z.object({
18
+ const scopedStdioConfigSchema = z.object({
144
19
  argv: z.array(z.string()).max(128),
145
20
  executable: z.string().min(1),
146
21
  schemaVersion: z.literal(1)
147
22
  }).strict();
148
- function parseHttpEndpoint(endpoint) {
149
- const parsedEndpoint = new URL(endpoint);
150
- if (!["http:", "https:"].includes(parsedEndpoint.protocol) || parsedEndpoint.username.length > 0 || parsedEndpoint.password.length > 0 || parsedEndpoint.hash.length > 0) throw new Error("Tool Portal HTTP endpoint must be an HTTP(S) URL without credentials or a fragment.");
151
- return parsedEndpoint;
152
- }
153
- async function createCliTransport(arguments_, environment) {
154
- if (arguments_.transport.kind === "http") {
155
- const environmentName = arguments_.transport.authorizationEnvironmentName;
156
- const authorization = environmentName === void 0 ? void 0 : environment[environmentName];
23
+ async function createCliTransport(command, environment) {
24
+ if (command.transport.kind === "http") {
25
+ const authorization = environment[command.transport.authorizationEnvironmentName];
157
26
  if (authorization === void 0 || authorization.length === 0) throw new Error("The explicit Tool Portal authorization environment variable is unset.");
158
27
  return {
159
28
  authorization,
160
29
  transport: createNodeToolPortalMcpTransport({
161
30
  authorization,
162
- endpoint: parseHttpEndpoint(arguments_.transport.endpoint),
31
+ endpoint: new URL(command.transport.endpoint),
163
32
  kind: "http"
164
33
  })
165
34
  };
166
35
  }
167
- const config = ScopedStdioConfigSchema.parse(JSON.parse(await readFile(arguments_.transport.scopedStdioConfigPath, "utf8")));
36
+ const config = scopedStdioConfigSchema.parse(JSON.parse(await readFile(command.transport.scopedStdioConfigPath, "utf8")));
168
37
  return {
169
38
  authorization: void 0,
170
39
  transport: createNodeToolPortalMcpTransport({
@@ -204,13 +73,13 @@ async function invokePortalOperation(props) {
204
73
  result: await props.client.search(PortalSearchRequestSchema.parse(props.publicRequest), options)
205
74
  };
206
75
  }
207
- return assertNever(props.operation);
76
+ return assertNever$1(props.operation);
208
77
  }
209
- function assertNever(value) {
78
+ function assertNever$1(value) {
210
79
  throw new Error(`Unsupported Tool Portal CLI operation: ${String(value)}.`);
211
80
  }
212
- function readApprovalToken(arguments_, environment) {
213
- const environmentName = arguments_.approvalTokenEnvironmentName;
81
+ function readApprovalToken(command, environment) {
82
+ const environmentName = command.approvalTokenEnvironmentName;
214
83
  if (environmentName === void 0) return void 0;
215
84
  const approvalToken = environment[environmentName];
216
85
  if (approvalToken === void 0 || approvalToken.length === 0) throw new Error("The explicit Tool Portal approval-token environment variable is unset.");
@@ -224,7 +93,7 @@ function safeDiagnostic(error, secrets) {
224
93
  async function waitForCancellationNotificationFlush() {
225
94
  await new Promise((resolve) => setImmediate(resolve));
226
95
  }
227
- async function runToolPortalCli(argv, environment) {
96
+ async function runToolPortalOperation(command, environment) {
228
97
  let authorization;
229
98
  let approvalToken;
230
99
  let client;
@@ -232,23 +101,16 @@ async function runToolPortalCli(argv, environment) {
232
101
  const interrupt = () => cancellation.abort(/* @__PURE__ */ new Error("Tool Portal CLI interrupted."));
233
102
  process.once("SIGINT", interrupt);
234
103
  try {
235
- const parseResult = runToolPortalCliParser(argv, {
236
- stderr: process.stderr,
237
- stdout: process.stdout
238
- });
239
- if (parseResult.kind === "help") return parseResult.exitCode;
240
- if (parseResult.kind === "parse-error") return 2;
241
- const cliArguments = parseResult.value;
242
- const transportResult = await createCliTransport(cliArguments, environment);
104
+ const transportResult = await createCliTransport(command, environment);
243
105
  authorization = transportResult.authorization;
244
106
  client = new ToolPortalMcpClient({ transport: transportResult.transport });
245
107
  await client.connect();
246
- const publicRequest = JSON.parse(cliArguments.inputJson);
247
- approvalToken = cliArguments.operation === "call" ? readApprovalToken(cliArguments, environment) : void 0;
108
+ const publicRequest = JSON.parse(command.inputJson);
109
+ approvalToken = command.operation === "call" ? readApprovalToken(command, environment) : void 0;
248
110
  const invocation = await invokePortalOperation({
249
111
  ...approvalToken === void 0 ? {} : { approvalToken },
250
112
  client,
251
- operation: cliArguments.operation,
113
+ operation: command.operation,
252
114
  publicRequest,
253
115
  signal: cancellation.signal
254
116
  });
@@ -270,7 +132,125 @@ async function runToolPortalCli(argv, environment) {
270
132
  } catch {}
271
133
  }
272
134
  }
273
- process.exitCode = await runToolPortalCli(process.argv.slice(2), process.env);
135
+ //#endregion
136
+ //#region src/cli/tool-portal-cli-dispatcher.ts
137
+ function assertNever(value) {
138
+ throw new Error(`Unsupported Tool Portal CLI operation: ${String(value)}.`);
139
+ }
140
+ async function dispatchToolPortalCommand(command, environment, operation = runToolPortalOperation) {
141
+ switch (command.operation) {
142
+ case "artifact-read":
143
+ case "call":
144
+ case "describe":
145
+ case "list":
146
+ case "search": return operation(command, environment);
147
+ default: return assertNever(command);
148
+ }
149
+ }
150
+ //#endregion
151
+ //#region src/cli/tool-portal-cli-parser.ts
152
+ const toolPortalTransportKindSchema = z.enum(["http", "scoped-stdio"]);
153
+ const toolPortalHttpTransportKindSchema = toolPortalTransportKindSchema.extract(["http"]);
154
+ const toolPortalScopedStdioTransportKindSchema = toolPortalTransportKindSchema.extract(["scoped-stdio"]);
155
+ const toolPortalInputJsonSchema = z.string().min(1);
156
+ const toolPortalEnvironmentVariableNameSchema = z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/u);
157
+ const toolPortalOptionalApprovalEnvironmentNameSchema = toolPortalEnvironmentVariableNameSchema.optional();
158
+ const toolPortalHttpEndpointSchema = z.string().min(1).refine((value) => {
159
+ try {
160
+ const endpoint = new URL(value);
161
+ return (endpoint.protocol === "http:" || endpoint.protocol === "https:") && endpoint.username.length === 0 && endpoint.password.length === 0 && endpoint.hash.length === 0;
162
+ } catch {
163
+ return false;
164
+ }
165
+ }, { message: "Tool Portal HTTP endpoint must be an HTTP(S) URL without credentials or a fragment." });
166
+ const toolPortalScopedStdioConfigPathSchema = z.string().min(1).refine(path.isAbsolute, { message: "Scoped stdio configuration path must be absolute." });
167
+ function projectZodScalarPresence(props) {
168
+ if (props.schema instanceof z.ZodOptional) {
169
+ if (props.schema.unwrap() instanceof z.ZodDefault) throw new Error("CLI value schemas must not mix ZodOptional and ZodDefault.");
170
+ return optional(props.parser);
171
+ }
172
+ if (props.schema instanceof z.ZodDefault) {
173
+ if (props.schema.unwrap() instanceof z.ZodOptional) throw new Error("CLI value schemas must not mix ZodOptional and ZodDefault.");
174
+ return withDefault(props.parser, props.schema.parse(void 0));
175
+ }
176
+ if (props.schema.safeParse(void 0).success) throw new TypeError("CLI value schemas accepting undefined must use ZodOptional or ZodDefault.");
177
+ return props.parser;
178
+ }
179
+ const toolPortalTransportParser = or(map(object({
180
+ authorizationEnvironmentName: option("--authorization-env", zod(toolPortalEnvironmentVariableNameSchema, {
181
+ metavar: "ENV_NAME",
182
+ placeholder: "TOOL_PORTAL_AUTH"
183
+ })),
184
+ endpoint: option("--endpoint", zod(toolPortalHttpEndpointSchema, {
185
+ metavar: "URL",
186
+ placeholder: "https://example.test/mcp"
187
+ })),
188
+ kind: constant("http"),
189
+ transportKind: option("--transport", zod(toolPortalHttpTransportKindSchema, {
190
+ metavar: "TRANSPORT",
191
+ placeholder: "http"
192
+ }))
193
+ }), ({ authorizationEnvironmentName, endpoint, kind }) => ({
194
+ authorizationEnvironmentName,
195
+ endpoint,
196
+ kind
197
+ })), map(object({
198
+ kind: constant("scoped-stdio"),
199
+ scopedStdioConfigPath: option("--stdio-config", zod(toolPortalScopedStdioConfigPathSchema, {
200
+ metavar: "PATH",
201
+ placeholder: "/tmp/tool-portal.json"
202
+ })),
203
+ transportKind: option("--transport", zod(toolPortalScopedStdioTransportKindSchema, {
204
+ metavar: "TRANSPORT",
205
+ placeholder: "scoped-stdio"
206
+ }))
207
+ }), ({ kind, scopedStdioConfigPath }) => ({
208
+ kind,
209
+ scopedStdioConfigPath
210
+ })));
211
+ function createInputJsonOption() {
212
+ return option("--input-json", zod(toolPortalInputJsonSchema, {
213
+ metavar: "JSON",
214
+ placeholder: "{}"
215
+ }));
216
+ }
217
+ const callCommandParser = command("call", object({
218
+ approvalTokenEnvironmentName: projectZodScalarPresence({
219
+ parser: option("--approval-token-env", zod(toolPortalOptionalApprovalEnvironmentNameSchema, {
220
+ metavar: "ENV_NAME",
221
+ placeholder: void 0
222
+ })),
223
+ schema: toolPortalOptionalApprovalEnvironmentNameSchema
224
+ }),
225
+ inputJson: createInputJsonOption(),
226
+ operation: constant("call"),
227
+ transport: toolPortalTransportParser
228
+ }));
229
+ //#endregion
230
+ //#region src/cli/tool-portal.ts
231
+ const command$1 = run(or(command("artifact-read", object({
232
+ inputJson: createInputJsonOption(),
233
+ operation: constant("artifact-read"),
234
+ transport: toolPortalTransportParser
235
+ })), callCommandParser, command("describe", object({
236
+ inputJson: createInputJsonOption(),
237
+ operation: constant("describe"),
238
+ transport: toolPortalTransportParser
239
+ })), command("list", object({
240
+ inputJson: createInputJsonOption(),
241
+ operation: constant("list"),
242
+ transport: toolPortalTransportParser
243
+ })), command("search", object({
244
+ inputJson: createInputJsonOption(),
245
+ operation: constant("search"),
246
+ transport: toolPortalTransportParser
247
+ }))), {
248
+ errorExitCode: 2,
249
+ help: "both",
250
+ programName: "tool-portal",
251
+ showDefault: true
252
+ });
253
+ process.exitCode = await dispatchToolPortalCommand(command$1, process.env);
274
254
  //#endregion
275
255
  export {};
276
256
 
@@ -1 +1 @@
1
- {"version":3,"file":"tool-portal.js","names":[],"sources":["../../src/cli/tool-portal-cli-parser.ts","../../src/cli/tool-portal.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { conditional, object, or } from '@optique/core/constructs';\nimport { runParser, type RunOptions } from '@optique/core/facade';\nimport { formatMessage } from '@optique/core/message';\nimport { map, optional } from '@optique/core/modifiers';\nimport type { Parser } from '@optique/core/parser';\nimport { parseSync } from '@optique/core/parser';\nimport { command, option } from '@optique/core/primitives';\nimport { zod } from '@optique/zod';\nimport { z } from 'zod';\n\nconst operationSchema = z.enum(['artifact-read', 'call', 'describe', 'list', 'search']);\nconst transportKindSchema = z.enum(['http', 'scoped-stdio']);\nconst environmentVariableNameSchema = z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/u);\nconst absolutePathSchema = z.string().min(1).refine(path.isAbsolute, {\n\tmessage: 'Scoped stdio configuration path must be absolute.',\n});\n\nexport type ToolPortalCliOperation = z.infer<typeof operationSchema>;\n\nexport interface ToolPortalHttpTransportArguments {\n\treadonly authorizationEnvironmentName: string;\n\treadonly endpoint: string;\n\treadonly kind: 'http';\n}\n\nexport interface ToolPortalScopedStdioTransportArguments {\n\treadonly kind: 'scoped-stdio';\n\treadonly scopedStdioConfigPath: string;\n}\n\nexport type ToolPortalCliTransport =\n\t| ToolPortalHttpTransportArguments\n\t| ToolPortalScopedStdioTransportArguments;\n\ntype ToolPortalNonCallOperation = Exclude<ToolPortalCliOperation, 'call'>;\n\nexport type ToolPortalCliArguments =\n\t| {\n\t\t\treadonly approvalTokenEnvironmentName?: string;\n\t\t\treadonly inputJson: string;\n\t\t\treadonly operation: 'call';\n\t\t\treadonly transport: ToolPortalCliTransport;\n\t }\n\t| {\n\t\t\treadonly inputJson: string;\n\t\t\treadonly operation: ToolPortalNonCallOperation;\n\t\t\treadonly transport: ToolPortalCliTransport;\n\t };\n\nexport type ToolPortalCliParseResult =\n\t| { readonly kind: 'parsed'; readonly value: ToolPortalCliArguments }\n\t| { readonly kind: 'help'; readonly exitCode: 0 }\n\t| { readonly kind: 'parse-error'; readonly exitCode: number };\n\nexport interface ToolPortalCliParserIo {\n\treadonly stderr: Pick<NodeJS.WriteStream, 'write'>;\n\treadonly stdout: Pick<NodeJS.WriteStream, 'write'>;\n}\n\nfunction createEnvironmentVariableNameParser(): ReturnType<typeof zod<string>> {\n\treturn zod(environmentVariableNameSchema, {\n\t\tmetavar: 'ENV_NAME',\n\t\tplaceholder: 'TOOL_PORTAL_AUTH',\n\t});\n}\n\nfunction createInputJsonParser(): ReturnType<typeof zod<string>> {\n\treturn zod(z.string().min(1), {\n\t\tmetavar: 'JSON',\n\t\tplaceholder: '{}',\n\t});\n}\n\nfunction createHttpTransportParser(): Parser<'sync', ToolPortalHttpTransportArguments> {\n\tconst httpTransportOptionsParser = object({\n\t\tauthorizationEnvironmentName: option(\n\t\t\t'--authorization-env',\n\t\t\tcreateEnvironmentVariableNameParser(),\n\t\t),\n\t\tendpoint: option(\n\t\t\t'--endpoint',\n\t\t\tzod(z.string().min(1), {\n\t\t\t\tmetavar: 'URL',\n\t\t\t\tplaceholder: 'https://example.test/mcp',\n\t\t\t}),\n\t\t),\n\t});\n\treturn map(\n\t\thttpTransportOptionsParser,\n\t\t(options): ToolPortalHttpTransportArguments => ({\n\t\t\t...options,\n\t\t\tkind: 'http',\n\t\t}),\n\t);\n}\n\nfunction createScopedStdioTransportParser(): Parser<\n\t'sync',\n\tToolPortalScopedStdioTransportArguments\n> {\n\tconst scopedStdioTransportOptionsParser = object({\n\t\tscopedStdioConfigPath: option(\n\t\t\t'--stdio-config',\n\t\t\tzod(absolutePathSchema, {\n\t\t\t\tmetavar: 'PATH',\n\t\t\t\tplaceholder: '/tmp/tool-portal.json',\n\t\t\t}),\n\t\t),\n\t});\n\treturn map(\n\t\tscopedStdioTransportOptionsParser,\n\t\t(options): ToolPortalScopedStdioTransportArguments => ({\n\t\t\t...options,\n\t\t\tkind: 'scoped-stdio',\n\t\t}),\n\t);\n}\n\nfunction createTransportParser(): Parser<'sync', ToolPortalCliTransport> {\n\tconst transportSelectionParser = conditional(\n\t\toption(\n\t\t\t'--transport',\n\t\t\tzod(transportKindSchema, {\n\t\t\t\tmetavar: 'TRANSPORT',\n\t\t\t\tplaceholder: 'http',\n\t\t\t}),\n\t\t),\n\t\t{\n\t\t\thttp: createHttpTransportParser(),\n\t\t\t'scoped-stdio': createScopedStdioTransportParser(),\n\t\t},\n\t);\n\treturn map(transportSelectionParser, ([, transport]): ToolPortalCliTransport => transport);\n}\n\nfunction createInputJsonOption(): Parser<'sync', string> {\n\treturn option('--input-json', createInputJsonParser());\n}\n\nfunction createCallCommand(): Parser<'sync', ToolPortalCliArguments> {\n\treturn command(\n\t\t'call',\n\t\tmap(\n\t\t\tobject({\n\t\t\t\tapprovalTokenEnvironmentName: optional(\n\t\t\t\t\toption('--approval-token-env', createEnvironmentVariableNameParser()),\n\t\t\t\t),\n\t\t\t\tinputJson: createInputJsonOption(),\n\t\t\t\ttransport: createTransportParser(),\n\t\t\t}),\n\t\t\t({ approvalTokenEnvironmentName, inputJson, transport }): ToolPortalCliArguments => ({\n\t\t\t\t...(approvalTokenEnvironmentName === undefined ? {} : { approvalTokenEnvironmentName }),\n\t\t\t\tinputJson,\n\t\t\t\toperation: 'call',\n\t\t\t\ttransport,\n\t\t\t}),\n\t\t),\n\t);\n}\n\nfunction createNonCallCommand(\n\toperation: ToolPortalNonCallOperation,\n): Parser<'sync', ToolPortalCliArguments> {\n\treturn command(\n\t\toperation,\n\t\tmap(\n\t\t\tobject({\n\t\t\t\tinputJson: createInputJsonOption(),\n\t\t\t\ttransport: createTransportParser(),\n\t\t\t}),\n\t\t\t({ inputJson, transport }): ToolPortalCliArguments => ({\n\t\t\t\tinputJson,\n\t\t\t\toperation,\n\t\t\t\ttransport,\n\t\t\t}),\n\t\t),\n\t);\n}\n\nexport const toolPortalCliParser: Parser<'sync', ToolPortalCliArguments> = or(\n\tcreateNonCallCommand('artifact-read'),\n\tcreateCallCommand(),\n\tcreateNonCallCommand('describe'),\n\tcreateNonCallCommand('list'),\n\tcreateNonCallCommand('search'),\n);\n\ntype ToolPortalCliRunnerSignal = Exclude<ToolPortalCliParseResult, { readonly kind: 'parsed' }>;\n\nclass ToolPortalCliRunnerSignalError extends Error {\n\treadonly signal: ToolPortalCliRunnerSignal;\n\n\tconstructor(signal: ToolPortalCliRunnerSignal) {\n\t\tsuper(`Tool Portal CLI runner signal: ${signal.kind}`);\n\t\tthis.signal = signal;\n\t}\n}\n\nfunction writeOutput(write: ToolPortalCliParserIo['stdout'], text: string): void {\n\twrite.write(text.endsWith('\\n') ? text : `${text}\\n`);\n}\n\nfunction createRunOptions(io: ToolPortalCliParserIo): RunOptions<never, never> {\n\treturn {\n\t\thelp: {\n\t\t\tcommand: true,\n\t\t\toption: { names: ['-h', '--help'] as const },\n\t\t\tonShow: (): never => {\n\t\t\t\tthrow new ToolPortalCliRunnerSignalError({ exitCode: 0, kind: 'help' });\n\t\t\t},\n\t\t},\n\t\tonError: (exitCode: number): never => {\n\t\t\tthrow new ToolPortalCliRunnerSignalError({ exitCode, kind: 'parse-error' });\n\t\t},\n\t\tstderr: (text: string): void => writeOutput(io.stderr, text),\n\t\tstdout: (text: string): void => writeOutput(io.stdout, text),\n\t};\n}\n\nexport function runToolPortalCliParser(\n\targv: readonly string[],\n\tio: ToolPortalCliParserIo,\n): ToolPortalCliParseResult {\n\ttry {\n\t\treturn {\n\t\t\tkind: 'parsed',\n\t\t\tvalue: runParser(toolPortalCliParser, 'tool-portal', argv, createRunOptions(io)),\n\t\t};\n\t} catch (error: unknown) {\n\t\tif (error instanceof ToolPortalCliRunnerSignalError) return error.signal;\n\t\tthrow error;\n\t}\n}\n\nexport function parseToolPortalCliArguments(argv: readonly string[]): ToolPortalCliArguments {\n\tconst result = parseSync(toolPortalCliParser, argv);\n\tif (!result.success) {\n\t\tthrow new Error(formatMessage(result.error));\n\t}\n\treturn result.value;\n}\n","#!/usr/bin/env node\n\nimport { readFile } from 'node:fs/promises';\n\nimport { z } from 'zod';\n\nimport {\n\tPortalArtifactReadRequestSchema,\n\ttype PortalArtifactReadResult,\n} from '../artifact-surface/index.js';\nimport { encodeCanonicalJson } from '../portable-contracts/index.js';\nimport {\n\tPortalCallRequestSchema,\n\tPortalDescribeRequestSchema,\n\tPortalListRequestSchema,\n\tPortalSearchRequestSchema,\n\ttype PortalCallResult,\n\ttype PortalDescribeResult,\n\ttype PortalListResult,\n\ttype PortalSearchResult,\n} from '../portal-call-surface/index.js';\nimport {\n\tToolPortalMcpClient,\n\ttype ToolPortalMcpTransport,\n} from '../tool-portal-mcp-client/index.js';\nimport { createNodeToolPortalMcpTransport } from '../tool-portal-mcp-client/node-tool-portal-mcp-transport.js';\nimport {\n\trunToolPortalCliParser,\n\ttype ToolPortalCliArguments,\n\ttype ToolPortalCliOperation,\n} from './tool-portal-cli-parser.js';\n\nconst canonicalResultGraceAfterInterruptMilliseconds = 250;\nconst ScopedStdioConfigSchema = z\n\t.object({\n\t\targv: z.array(z.string()).max(128),\n\t\texecutable: z.string().min(1),\n\t\tschemaVersion: z.literal(1),\n\t})\n\t.strict();\n\ntype ToolPortalCliInvocationResult =\n\t| { readonly kind: 'artifact-read'; readonly result: PortalArtifactReadResult }\n\t| {\n\t\t\treadonly kind: 'portal';\n\t\t\treadonly result:\n\t\t\t\t| PortalCallResult\n\t\t\t\t| PortalDescribeResult\n\t\t\t\t| PortalListResult\n\t\t\t\t| PortalSearchResult;\n\t };\n\ninterface ToolPortalCliTransportResult {\n\treadonly authorization: string | undefined;\n\treadonly transport: ToolPortalMcpTransport;\n}\n\nfunction parseHttpEndpoint(endpoint: string): URL {\n\tconst parsedEndpoint = new URL(endpoint);\n\tif (\n\t\t!['http:', 'https:'].includes(parsedEndpoint.protocol) ||\n\t\tparsedEndpoint.username.length > 0 ||\n\t\tparsedEndpoint.password.length > 0 ||\n\t\tparsedEndpoint.hash.length > 0\n\t) {\n\t\tthrow new Error(\n\t\t\t'Tool Portal HTTP endpoint must be an HTTP(S) URL without credentials or a fragment.',\n\t\t);\n\t}\n\treturn parsedEndpoint;\n}\n\nasync function createCliTransport(\n\targuments_: ToolPortalCliArguments,\n\tenvironment: NodeJS.ProcessEnv,\n): Promise<ToolPortalCliTransportResult> {\n\tif (arguments_.transport.kind === 'http') {\n\t\tconst environmentName = arguments_.transport.authorizationEnvironmentName;\n\t\tconst authorization = environmentName === undefined ? undefined : environment[environmentName];\n\t\tif (authorization === undefined || authorization.length === 0) {\n\t\t\tthrow new Error('The explicit Tool Portal authorization environment variable is unset.');\n\t\t}\n\t\treturn {\n\t\t\tauthorization,\n\t\t\ttransport: createNodeToolPortalMcpTransport({\n\t\t\t\tauthorization,\n\t\t\t\tendpoint: parseHttpEndpoint(arguments_.transport.endpoint),\n\t\t\t\tkind: 'http',\n\t\t\t}),\n\t\t};\n\t}\n\n\tconst config = ScopedStdioConfigSchema.parse(\n\t\tJSON.parse(await readFile(arguments_.transport.scopedStdioConfigPath, 'utf8')) as unknown,\n\t);\n\treturn {\n\t\tauthorization: undefined,\n\t\ttransport: createNodeToolPortalMcpTransport({\n\t\t\targv: config.argv,\n\t\t\texecutable: config.executable,\n\t\t\tkind: 'scoped-stdio',\n\t\t}),\n\t};\n}\n\nasync function invokePortalOperation(props: {\n\treadonly approvalToken?: string;\n\treadonly client: ToolPortalMcpClient;\n\treadonly operation: ToolPortalCliOperation;\n\treadonly publicRequest: unknown;\n\treadonly signal: AbortSignal;\n}): Promise<ToolPortalCliInvocationResult> {\n\tconst options = {\n\t\tresultGraceAfterAbortMs: canonicalResultGraceAfterInterruptMilliseconds,\n\t\tsignal: props.signal,\n\t};\n\tswitch (props.operation) {\n\t\tcase 'artifact-read':\n\t\t\treturn {\n\t\t\t\tkind: 'artifact-read',\n\t\t\t\tresult: await props.client.artifacts.read(\n\t\t\t\t\tPortalArtifactReadRequestSchema.parse(props.publicRequest),\n\t\t\t\t\toptions,\n\t\t\t\t),\n\t\t\t};\n\t\tcase 'call':\n\t\t\treturn {\n\t\t\t\tkind: 'portal',\n\t\t\t\tresult: await props.client.call(PortalCallRequestSchema.parse(props.publicRequest), {\n\t\t\t\t\t...options,\n\t\t\t\t\t...(props.approvalToken === undefined ? {} : { approvalToken: props.approvalToken }),\n\t\t\t\t}),\n\t\t\t};\n\t\tcase 'describe':\n\t\t\treturn {\n\t\t\t\tkind: 'portal',\n\t\t\t\tresult: await props.client.describe(\n\t\t\t\t\tPortalDescribeRequestSchema.parse(props.publicRequest),\n\t\t\t\t\toptions,\n\t\t\t\t),\n\t\t\t};\n\t\tcase 'list':\n\t\t\treturn {\n\t\t\t\tkind: 'portal',\n\t\t\t\tresult: await props.client.list(\n\t\t\t\t\tPortalListRequestSchema.parse(props.publicRequest),\n\t\t\t\t\toptions,\n\t\t\t\t),\n\t\t\t};\n\t\tcase 'search':\n\t\t\treturn {\n\t\t\t\tkind: 'portal',\n\t\t\t\tresult: await props.client.search(\n\t\t\t\t\tPortalSearchRequestSchema.parse(props.publicRequest),\n\t\t\t\t\toptions,\n\t\t\t\t),\n\t\t\t};\n\t}\n\treturn assertNever(props.operation);\n}\n\nfunction assertNever(value: never): never {\n\tthrow new Error(`Unsupported Tool Portal CLI operation: ${String(value)}.`);\n}\n\nfunction readApprovalToken(\n\targuments_: Extract<ToolPortalCliArguments, { readonly operation: 'call' }>,\n\tenvironment: NodeJS.ProcessEnv,\n): string | undefined {\n\tconst environmentName = arguments_.approvalTokenEnvironmentName;\n\tif (environmentName === undefined) return undefined;\n\tconst approvalToken = environment[environmentName];\n\tif (approvalToken === undefined || approvalToken.length === 0) {\n\t\tthrow new Error('The explicit Tool Portal approval-token environment variable is unset.');\n\t}\n\treturn z.string().min(1).max(16_384).parse(approvalToken);\n}\n\nfunction safeDiagnostic(error: unknown, secrets: readonly string[]): string {\n\tlet message = error instanceof Error ? error.message : String(error);\n\tfor (const secret of secrets) {\n\t\tif (secret.length > 0) message = message.replaceAll(secret, '[redacted]');\n\t}\n\treturn message;\n}\n\nasync function waitForCancellationNotificationFlush(): Promise<void> {\n\tawait new Promise<void>((resolve) => setImmediate(resolve));\n}\n\nasync function runToolPortalCli(\n\targv: readonly string[],\n\tenvironment: NodeJS.ProcessEnv,\n): Promise<number> {\n\tlet authorization: string | undefined;\n\tlet approvalToken: string | undefined;\n\tlet client: ToolPortalMcpClient | undefined;\n\tconst cancellation = new AbortController();\n\tconst interrupt = (): void => cancellation.abort(new Error('Tool Portal CLI interrupted.'));\n\tprocess.once('SIGINT', interrupt);\n\ttry {\n\t\tconst parseResult = runToolPortalCliParser(argv, {\n\t\t\tstderr: process.stderr,\n\t\t\tstdout: process.stdout,\n\t\t});\n\t\tif (parseResult.kind === 'help') return parseResult.exitCode;\n\t\tif (parseResult.kind === 'parse-error') return 2;\n\t\tconst cliArguments = parseResult.value;\n\t\tconst transportResult = await createCliTransport(cliArguments, environment);\n\t\tauthorization = transportResult.authorization;\n\t\tclient = new ToolPortalMcpClient({ transport: transportResult.transport });\n\t\tawait client.connect();\n\t\tconst publicRequest = JSON.parse(cliArguments.inputJson) as unknown;\n\t\tapprovalToken =\n\t\t\tcliArguments.operation === 'call' ? readApprovalToken(cliArguments, environment) : undefined;\n\t\tconst invocation = await invokePortalOperation({\n\t\t\t...(approvalToken === undefined ? {} : { approvalToken }),\n\t\t\tclient,\n\t\t\toperation: cliArguments.operation,\n\t\t\tpublicRequest,\n\t\t\tsignal: cancellation.signal,\n\t\t});\n\t\tprocess.stdout.write(`${encodeCanonicalJson(invocation.result)}\\n`);\n\t\tconst exitCode = invocation.kind === 'artifact-read' || invocation.result.ok ? 0 : 1;\n\t\ttry {\n\t\t\tawait client.close();\n\t\t} catch {\n\t\t\t// A canonical result already returned and remains authoritative after interrupt/close races.\n\t\t}\n\t\tclient = undefined;\n\t\treturn exitCode;\n\t} catch (error: unknown) {\n\t\tif (cancellation.signal.aborted) {\n\t\t\tawait waitForCancellationNotificationFlush();\n\t\t}\n\t\tprocess.stderr.write(\n\t\t\t`tool-portal: ${safeDiagnostic(error, [\n\t\t\t\t...(authorization === undefined ? [] : [authorization]),\n\t\t\t\t...(approvalToken === undefined ? [] : [approvalToken]),\n\t\t\t])}\\n`,\n\t\t);\n\t\treturn 2;\n\t} finally {\n\t\tprocess.removeListener('SIGINT', interrupt);\n\t\tif (client !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait client.close();\n\t\t\t} catch {\n\t\t\t\t// The primary diagnostic and exit class remain authoritative.\n\t\t\t}\n\t\t}\n\t}\n}\n\nprocess.exitCode = await runToolPortalCli(process.argv.slice(2), process.env);\n"],"mappings":"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"}
1
+ {"version":3,"file":"tool-portal.js","names":["assertNever","command"],"sources":["../../src/cli/tool-portal-cli-operation.ts","../../src/cli/tool-portal-cli-dispatcher.ts","../../src/cli/tool-portal-cli-parser.ts","../../src/cli/tool-portal.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\n\nimport { z } from 'zod';\n\nimport {\n\tPortalArtifactReadRequestSchema,\n\ttype PortalArtifactReadResult,\n} from '../artifact-surface/index.js';\nimport { encodeCanonicalJson } from '../portable-contracts/index.js';\nimport {\n\tPortalCallRequestSchema,\n\tPortalDescribeRequestSchema,\n\tPortalListRequestSchema,\n\tPortalSearchRequestSchema,\n\ttype PortalCallResult,\n\ttype PortalDescribeResult,\n\ttype PortalListResult,\n\ttype PortalSearchResult,\n} from '../portal-call-surface/index.js';\nimport {\n\tToolPortalMcpClient,\n\ttype ToolPortalMcpTransport,\n} from '../tool-portal-mcp-client/index.js';\nimport { createNodeToolPortalMcpTransport } from '../tool-portal-mcp-client/node-tool-portal-mcp-transport.js';\nimport type { ToolPortalCommand } from './tool-portal-cli-parser.js';\n\nconst canonicalResultGraceAfterInterruptMilliseconds = 250;\nconst scopedStdioConfigSchema = z\n\t.object({\n\t\targv: z.array(z.string()).max(128),\n\t\texecutable: z.string().min(1),\n\t\tschemaVersion: z.literal(1),\n\t})\n\t.strict();\n\ntype ToolPortalCliInvocationResult =\n\t| { readonly kind: 'artifact-read'; readonly result: PortalArtifactReadResult }\n\t| {\n\t\t\treadonly kind: 'portal';\n\t\t\treadonly result:\n\t\t\t\t| PortalCallResult\n\t\t\t\t| PortalDescribeResult\n\t\t\t\t| PortalListResult\n\t\t\t\t| PortalSearchResult;\n\t };\n\ninterface ToolPortalCliTransportResult {\n\treadonly authorization: string | undefined;\n\treadonly transport: ToolPortalMcpTransport;\n}\n\nasync function createCliTransport(\n\tcommand: ToolPortalCommand,\n\tenvironment: NodeJS.ProcessEnv,\n): Promise<ToolPortalCliTransportResult> {\n\tif (command.transport.kind === 'http') {\n\t\tconst authorization = environment[command.transport.authorizationEnvironmentName];\n\t\tif (authorization === undefined || authorization.length === 0) {\n\t\t\tthrow new Error('The explicit Tool Portal authorization environment variable is unset.');\n\t\t}\n\t\treturn {\n\t\t\tauthorization,\n\t\t\ttransport: createNodeToolPortalMcpTransport({\n\t\t\t\tauthorization,\n\t\t\t\tendpoint: new URL(command.transport.endpoint),\n\t\t\t\tkind: 'http',\n\t\t\t}),\n\t\t};\n\t}\n\n\tconst config = scopedStdioConfigSchema.parse(\n\t\tJSON.parse(await readFile(command.transport.scopedStdioConfigPath, 'utf8')) as unknown,\n\t);\n\treturn {\n\t\tauthorization: undefined,\n\t\ttransport: createNodeToolPortalMcpTransport({\n\t\t\targv: config.argv,\n\t\t\texecutable: config.executable,\n\t\t\tkind: 'scoped-stdio',\n\t\t}),\n\t};\n}\n\nasync function invokePortalOperation(props: {\n\treadonly approvalToken?: string;\n\treadonly client: ToolPortalMcpClient;\n\treadonly operation: ToolPortalCommand['operation'];\n\treadonly publicRequest: unknown;\n\treadonly signal: AbortSignal;\n}): Promise<ToolPortalCliInvocationResult> {\n\tconst options = {\n\t\tresultGraceAfterAbortMs: canonicalResultGraceAfterInterruptMilliseconds,\n\t\tsignal: props.signal,\n\t};\n\tswitch (props.operation) {\n\t\tcase 'artifact-read':\n\t\t\treturn {\n\t\t\t\tkind: 'artifact-read',\n\t\t\t\tresult: await props.client.artifacts.read(\n\t\t\t\t\tPortalArtifactReadRequestSchema.parse(props.publicRequest),\n\t\t\t\t\toptions,\n\t\t\t\t),\n\t\t\t};\n\t\tcase 'call':\n\t\t\treturn {\n\t\t\t\tkind: 'portal',\n\t\t\t\tresult: await props.client.call(PortalCallRequestSchema.parse(props.publicRequest), {\n\t\t\t\t\t...options,\n\t\t\t\t\t...(props.approvalToken === undefined ? {} : { approvalToken: props.approvalToken }),\n\t\t\t\t}),\n\t\t\t};\n\t\tcase 'describe':\n\t\t\treturn {\n\t\t\t\tkind: 'portal',\n\t\t\t\tresult: await props.client.describe(\n\t\t\t\t\tPortalDescribeRequestSchema.parse(props.publicRequest),\n\t\t\t\t\toptions,\n\t\t\t\t),\n\t\t\t};\n\t\tcase 'list':\n\t\t\treturn {\n\t\t\t\tkind: 'portal',\n\t\t\t\tresult: await props.client.list(\n\t\t\t\t\tPortalListRequestSchema.parse(props.publicRequest),\n\t\t\t\t\toptions,\n\t\t\t\t),\n\t\t\t};\n\t\tcase 'search':\n\t\t\treturn {\n\t\t\t\tkind: 'portal',\n\t\t\t\tresult: await props.client.search(\n\t\t\t\t\tPortalSearchRequestSchema.parse(props.publicRequest),\n\t\t\t\t\toptions,\n\t\t\t\t),\n\t\t\t};\n\t}\n\treturn assertNever(props.operation);\n}\n\nfunction assertNever(value: never): never {\n\tthrow new Error(`Unsupported Tool Portal CLI operation: ${String(value)}.`);\n}\n\nfunction readApprovalToken(\n\tcommand: Extract<ToolPortalCommand, { readonly operation: 'call' }>,\n\tenvironment: NodeJS.ProcessEnv,\n): string | undefined {\n\tconst environmentName = command.approvalTokenEnvironmentName;\n\tif (environmentName === undefined) return undefined;\n\tconst approvalToken = environment[environmentName];\n\tif (approvalToken === undefined || approvalToken.length === 0) {\n\t\tthrow new Error('The explicit Tool Portal approval-token environment variable is unset.');\n\t}\n\treturn z.string().min(1).max(16_384).parse(approvalToken);\n}\n\nfunction safeDiagnostic(error: unknown, secrets: readonly string[]): string {\n\tlet message = error instanceof Error ? error.message : String(error);\n\tfor (const secret of secrets) {\n\t\tif (secret.length > 0) message = message.replaceAll(secret, '[redacted]');\n\t}\n\treturn message;\n}\n\nasync function waitForCancellationNotificationFlush(): Promise<void> {\n\tawait new Promise<void>((resolve) => setImmediate(resolve));\n}\n\nexport async function runToolPortalOperation(\n\tcommand: ToolPortalCommand,\n\tenvironment: NodeJS.ProcessEnv,\n): Promise<number> {\n\tlet authorization: string | undefined;\n\tlet approvalToken: string | undefined;\n\tlet client: ToolPortalMcpClient | undefined;\n\tconst cancellation = new AbortController();\n\tconst interrupt = (): void => cancellation.abort(new Error('Tool Portal CLI interrupted.'));\n\tprocess.once('SIGINT', interrupt);\n\ttry {\n\t\tconst transportResult = await createCliTransport(command, environment);\n\t\tauthorization = transportResult.authorization;\n\t\tclient = new ToolPortalMcpClient({ transport: transportResult.transport });\n\t\tawait client.connect();\n\t\tconst publicRequest = JSON.parse(command.inputJson) as unknown;\n\t\tapprovalToken =\n\t\t\tcommand.operation === 'call' ? readApprovalToken(command, environment) : undefined;\n\t\tconst invocation = await invokePortalOperation({\n\t\t\t...(approvalToken === undefined ? {} : { approvalToken }),\n\t\t\tclient,\n\t\t\toperation: command.operation,\n\t\t\tpublicRequest,\n\t\t\tsignal: cancellation.signal,\n\t\t});\n\t\tprocess.stdout.write(`${encodeCanonicalJson(invocation.result)}\\n`);\n\t\tconst exitCode = invocation.kind === 'artifact-read' || invocation.result.ok ? 0 : 1;\n\t\ttry {\n\t\t\tawait client.close();\n\t\t} catch {\n\t\t\t// A canonical result already returned and remains authoritative after interrupt/close races.\n\t\t}\n\t\tclient = undefined;\n\t\treturn exitCode;\n\t} catch (error: unknown) {\n\t\tif (cancellation.signal.aborted) await waitForCancellationNotificationFlush();\n\t\tprocess.stderr.write(\n\t\t\t`tool-portal: ${safeDiagnostic(error, [\n\t\t\t\t...(authorization === undefined ? [] : [authorization]),\n\t\t\t\t...(approvalToken === undefined ? [] : [approvalToken]),\n\t\t\t])}\\n`,\n\t\t);\n\t\treturn 2;\n\t} finally {\n\t\tprocess.removeListener('SIGINT', interrupt);\n\t\tif (client !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait client.close();\n\t\t\t} catch {\n\t\t\t\t// The primary diagnostic and exit class remain authoritative.\n\t\t\t}\n\t\t}\n\t}\n}\n","import { runToolPortalOperation } from './tool-portal-cli-operation.js';\nimport type { ToolPortalCommand } from './tool-portal-cli-parser.js';\n\nexport type ToolPortalOperation = (\n\tcommand: ToolPortalCommand,\n\tenvironment: NodeJS.ProcessEnv,\n) => Promise<number>;\n\nfunction assertNever(value: never): never {\n\tthrow new Error(`Unsupported Tool Portal CLI operation: ${String(value)}.`);\n}\n\nexport async function dispatchToolPortalCommand(\n\tcommand: ToolPortalCommand,\n\tenvironment: NodeJS.ProcessEnv,\n\toperation: ToolPortalOperation = runToolPortalOperation,\n): Promise<number> {\n\tswitch (command.operation) {\n\t\tcase 'artifact-read':\n\t\tcase 'call':\n\t\tcase 'describe':\n\t\tcase 'list':\n\t\tcase 'search':\n\t\t\treturn operation(command, environment);\n\t\tdefault:\n\t\t\treturn assertNever(command);\n\t}\n}\n","import path from 'node:path';\n\nimport { object, or } from '@optique/core/constructs';\nimport { map, optional, withDefault } from '@optique/core/modifiers';\nimport type { InferValue, Parser } from '@optique/core/parser';\nimport { command, constant, option } from '@optique/core/primitives';\nimport { zod } from '@optique/zod';\nimport { z } from 'zod';\n\nconst toolPortalTransportKindSchema = z.enum(['http', 'scoped-stdio']);\nconst toolPortalHttpTransportKindSchema = toolPortalTransportKindSchema.extract(['http']);\nconst toolPortalScopedStdioTransportKindSchema = toolPortalTransportKindSchema.extract([\n\t'scoped-stdio',\n]);\nconst toolPortalInputJsonSchema = z.string().min(1);\nconst toolPortalEnvironmentVariableNameSchema = z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/u);\nconst toolPortalOptionalApprovalEnvironmentNameSchema =\n\ttoolPortalEnvironmentVariableNameSchema.optional();\nconst toolPortalHttpEndpointSchema = z\n\t.string()\n\t.min(1)\n\t.refine(\n\t\t(value): boolean => {\n\t\t\ttry {\n\t\t\t\tconst endpoint = new URL(value);\n\t\t\t\treturn (\n\t\t\t\t\t(endpoint.protocol === 'http:' || endpoint.protocol === 'https:') &&\n\t\t\t\t\tendpoint.username.length === 0 &&\n\t\t\t\t\tendpoint.password.length === 0 &&\n\t\t\t\t\tendpoint.hash.length === 0\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage:\n\t\t\t\t'Tool Portal HTTP endpoint must be an HTTP(S) URL without credentials or a fragment.',\n\t\t},\n\t);\nconst toolPortalScopedStdioConfigPathSchema = z.string().min(1).refine(path.isAbsolute, {\n\tmessage: 'Scoped stdio configuration path must be absolute.',\n});\n\ninterface ZodScalarPresenceProps<TSchema extends z.ZodType, TState> {\n\treadonly parser: Parser<'sync', z.infer<TSchema>, TState>;\n\treadonly schema: TSchema;\n}\n\nexport function projectZodScalarPresence<TSchema extends z.ZodType, TState>(\n\tprops: ZodScalarPresenceProps<TSchema, TState>,\n): Parser<'sync', z.infer<TSchema>>;\nexport function projectZodScalarPresence(props: {\n\treadonly parser: Parser;\n\treadonly schema: z.ZodType;\n}): Parser {\n\tif (props.schema instanceof z.ZodOptional) {\n\t\tif (props.schema.unwrap() instanceof z.ZodDefault) {\n\t\t\tthrow new Error('CLI value schemas must not mix ZodOptional and ZodDefault.');\n\t\t}\n\t\treturn optional(props.parser);\n\t}\n\tif (props.schema instanceof z.ZodDefault) {\n\t\tif (props.schema.unwrap() instanceof z.ZodOptional) {\n\t\t\tthrow new Error('CLI value schemas must not mix ZodOptional and ZodDefault.');\n\t\t}\n\t\treturn withDefault(props.parser, props.schema.parse(undefined));\n\t}\n\tif (props.schema.safeParse(undefined).success) {\n\t\tthrow new TypeError(\n\t\t\t'CLI value schemas accepting undefined must use ZodOptional or ZodDefault.',\n\t\t);\n\t}\n\treturn props.parser;\n}\n\nconst toolPortalHttpTransportParser = map(\n\tobject({\n\t\tauthorizationEnvironmentName: option(\n\t\t\t'--authorization-env',\n\t\t\tzod(toolPortalEnvironmentVariableNameSchema, {\n\t\t\t\tmetavar: 'ENV_NAME',\n\t\t\t\tplaceholder: 'TOOL_PORTAL_AUTH',\n\t\t\t}),\n\t\t),\n\t\tendpoint: option(\n\t\t\t'--endpoint',\n\t\t\tzod(toolPortalHttpEndpointSchema, {\n\t\t\t\tmetavar: 'URL',\n\t\t\t\tplaceholder: 'https://example.test/mcp',\n\t\t\t}),\n\t\t),\n\t\tkind: constant('http'),\n\t\ttransportKind: option(\n\t\t\t'--transport',\n\t\t\tzod(toolPortalHttpTransportKindSchema, {\n\t\t\t\tmetavar: 'TRANSPORT',\n\t\t\t\tplaceholder: 'http',\n\t\t\t}),\n\t\t),\n\t}),\n\t({ authorizationEnvironmentName, endpoint, kind }) => ({\n\t\tauthorizationEnvironmentName,\n\t\tendpoint,\n\t\tkind,\n\t}),\n);\n\nconst toolPortalScopedStdioTransportParser = map(\n\tobject({\n\t\tkind: constant('scoped-stdio'),\n\t\tscopedStdioConfigPath: option(\n\t\t\t'--stdio-config',\n\t\t\tzod(toolPortalScopedStdioConfigPathSchema, {\n\t\t\t\tmetavar: 'PATH',\n\t\t\t\tplaceholder: '/tmp/tool-portal.json',\n\t\t\t}),\n\t\t),\n\t\ttransportKind: option(\n\t\t\t'--transport',\n\t\t\tzod(toolPortalScopedStdioTransportKindSchema, {\n\t\t\t\tmetavar: 'TRANSPORT',\n\t\t\t\tplaceholder: 'scoped-stdio',\n\t\t\t}),\n\t\t),\n\t}),\n\t({ kind, scopedStdioConfigPath }) => ({ kind, scopedStdioConfigPath }),\n);\n\nconst toolPortalTransportParser = or(\n\ttoolPortalHttpTransportParser,\n\ttoolPortalScopedStdioTransportParser,\n);\n\nfunction createInputJsonOption(): Parser<'sync', z.infer<typeof toolPortalInputJsonSchema>> {\n\treturn option(\n\t\t'--input-json',\n\t\tzod(toolPortalInputJsonSchema, { metavar: 'JSON', placeholder: '{}' }),\n\t);\n}\n\nconst callCommandParser = command(\n\t'call',\n\tobject({\n\t\tapprovalTokenEnvironmentName: projectZodScalarPresence({\n\t\t\tparser: option(\n\t\t\t\t'--approval-token-env',\n\t\t\t\tzod(toolPortalOptionalApprovalEnvironmentNameSchema, {\n\t\t\t\t\tmetavar: 'ENV_NAME',\n\t\t\t\t\tplaceholder: undefined,\n\t\t\t\t}),\n\t\t\t),\n\t\t\tschema: toolPortalOptionalApprovalEnvironmentNameSchema,\n\t\t}),\n\t\tinputJson: createInputJsonOption(),\n\t\toperation: constant('call'),\n\t\ttransport: toolPortalTransportParser,\n\t}),\n);\n\nconst artifactReadCommandParser = command(\n\t'artifact-read',\n\tobject({\n\t\tinputJson: createInputJsonOption(),\n\t\toperation: constant('artifact-read'),\n\t\ttransport: toolPortalTransportParser,\n\t}),\n);\nconst describeCommandParser = command(\n\t'describe',\n\tobject({\n\t\tinputJson: createInputJsonOption(),\n\t\toperation: constant('describe'),\n\t\ttransport: toolPortalTransportParser,\n\t}),\n);\nconst listCommandParser = command(\n\t'list',\n\tobject({\n\t\tinputJson: createInputJsonOption(),\n\t\toperation: constant('list'),\n\t\ttransport: toolPortalTransportParser,\n\t}),\n);\nconst searchCommandParser = command(\n\t'search',\n\tobject({\n\t\tinputJson: createInputJsonOption(),\n\t\toperation: constant('search'),\n\t\ttransport: toolPortalTransportParser,\n\t}),\n);\n\nexport const toolPortalRootParser = or(\n\tartifactReadCommandParser,\n\tcallCommandParser,\n\tdescribeCommandParser,\n\tlistCommandParser,\n\tsearchCommandParser,\n);\n\nexport type ToolPortalCommand = InferValue<typeof toolPortalRootParser>;\n","#!/usr/bin/env node\n\nimport { run } from '@optique/run';\n\nimport { dispatchToolPortalCommand } from './tool-portal-cli-dispatcher.js';\nimport { toolPortalRootParser } from './tool-portal-cli-parser.js';\n\nconst command = run(toolPortalRootParser, {\n\terrorExitCode: 2,\n\thelp: 'both',\n\tprogramName: 'tool-portal',\n\tshowDefault: true,\n});\n\nprocess.exitCode = await dispatchToolPortalCommand(command, process.env);\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { c as PortalArtifactReadRequest, u as PortalArtifactReadResult } from "../index-B_xYdo3v.js";
2
2
  import { A as SandboxTerminalResizeResult, At as SandboxFsRenameResult, B as SandboxStreamWriteRequest, Bt as SandboxExecCancelRequest, E as SandboxTerminalAttachResult, Et as SandboxFsRemoveResult, Gt as SandboxExecStartRequest, H as SandboxStreamWriteResult, Ht as SandboxExecCancelResult, I as SandboxStreamReadRequest, It as SandboxFsWriteRequest, K as SandboxProcessCancelResult, M as SandboxStreamCloseRequest, Mt as SandboxFsStatRequest, O as SandboxTerminalResizeRequest, Ot as SandboxFsRenameRequest, P as SandboxStreamCloseResult, Pt as SandboxFsStatResult, Q as SandboxProcessLogsResult, R as SandboxStreamReadResult, Rt as SandboxFsWriteResult, St as SandboxFsReadResult, W as SandboxProcessCancelRequest, X as SandboxProcessLogsRequest, Yt as SandboxExecWaitRequest, Zt as SandboxExecWaitResult, _ as GatewayRuntimeTrustedInvocationRequester, _n as SandboxRetainedResultLookupRequest, at as SandboxProcessStatusResult, bt as SandboxFsReadRequest, c as GatewayRuntimeManagedPluginClientKind, cn as SandboxEnvironmentStatusRequest, d as GatewayRuntimeTrustedInvocationContext, en as SandboxEnvironmentCloseRequest, et as SandboxProcessStartRequest, f as GatewayRuntimeTrustedInvocationContextSchema, ft as SandboxFsListRequest, g as GatewayRuntimeTrustedInvocationPrincipalSchema, gt as SandboxFsMkdirRequest, h as GatewayRuntimeTrustedInvocationPrincipal, in as SandboxEnvironmentOpenRequest, it as SandboxProcessStatusRequest, ln as SandboxEnvironmentStatusResult, lt as SandboxProcessWaitResult, m as GatewayRuntimeTrustedInvocationCorrelationSchema, mt as SandboxFsListResult, n as GatewayRuntimeAttachmentMetadata$1, nt as SandboxProcessStartResult, on as SandboxEnvironmentOpenResult, p as GatewayRuntimeTrustedInvocationCorrelation, qt as SandboxExecStartResult, st as SandboxProcessWaitRequest, tn as SandboxEnvironmentCloseResult, v as GatewayRuntimeTrustedInvocationRequesterSchema, vt as SandboxFsMkdirResult, w as SandboxTerminalAttachRequest, wt as SandboxFsRemoveRequest, yn as SandboxRetainedResultLookupResult } from "../index-C5NhyO2R.js";
3
- import { S as PortalCallRequest, _ as PortalSearchResult, c as PortalDescribeResult, i as PortalCallResult, p as PortalListResult } from "../portal-call-result-schema-CGopcrjJ.js";
4
- import { i as PortalSearchRequest, m as PortalDescribeRequest, s as PortalListRequest } from "../index-DvcQs-mM.js";
3
+ import { S as PortalCallRequest, _ as PortalSearchResult, c as PortalDescribeResult, i as PortalCallResult, p as PortalListResult } from "../portal-call-result-schema-DalyNrfW.js";
4
+ import { i as PortalSearchRequest, m as PortalDescribeRequest, s as PortalListRequest } from "../index-B_FqoejO.js";
5
5
  import { z } from "zod/v4";
6
6
 
7
7
  //#region src/gateway-runtime-client/gateway-runtime-trace-context.d.ts