@wirecat/cli-core 0.325.0 → 0.327.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/README.md +6 -5
- package/dist/cli/bot/admins.js +2 -2
- package/dist/cli/bot/admins.js.map +1 -1
- package/dist/cli/bot/api.js +1 -1
- package/dist/cli/bot/api.js.map +1 -1
- package/dist/cli/bot/command.js +3 -3
- package/dist/cli/bot/command.js.map +1 -1
- package/dist/cli/bot/mcp.d.ts +0 -3
- package/dist/cli/bot/mcp.d.ts.map +1 -1
- package/dist/cli/bot/mcp.js +7 -20
- package/dist/cli/bot/mcp.js.map +1 -1
- package/dist/cli/bot/messages.d.ts.map +1 -1
- package/dist/cli/bot/messages.js +7 -7
- package/dist/cli/bot/messages.js.map +1 -1
- package/dist/cli/bot/moderation.d.ts.map +1 -1
- package/dist/cli/bot/moderation.js +3 -3
- package/dist/cli/bot/moderation.js.map +1 -1
- package/dist/cli/bot/port.d.ts +10 -4
- package/dist/cli/bot/port.d.ts.map +1 -1
- package/dist/cli/bot/setup.js +3 -3
- package/dist/cli/bot/setup.js.map +1 -1
- package/dist/cli/bot/store.js +1 -1
- package/dist/cli/bot/store.js.map +1 -1
- package/dist/cli/commands-command.js +1 -1
- package/dist/cli/commands-command.js.map +1 -1
- package/dist/cli/config-command.d.ts.map +1 -1
- package/dist/cli/config-command.js +1 -1
- package/dist/cli/config-command.js.map +1 -1
- package/dist/cli/context.d.ts +13 -0
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/context.js +6 -2
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/effects.d.ts +4 -2
- package/dist/cli/effects.d.ts.map +1 -1
- package/dist/cli/effects.js +6 -3
- package/dist/cli/effects.js.map +1 -1
- package/dist/cli/index.d.ts +3 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/meeting-preparation-command.js +1 -1
- package/dist/cli/meeting-preparation-command.js.map +1 -1
- package/dist/cli/messenger/account-sessions-command.js +1 -1
- package/dist/cli/messenger/account-sessions-command.js.map +1 -1
- package/dist/cli/messenger/archive-commands.js +1 -1
- package/dist/cli/messenger/archive-commands.js.map +1 -1
- package/dist/cli/messenger/ask.d.ts +1 -1
- package/dist/cli/messenger/ask.d.ts.map +1 -1
- package/dist/cli/messenger/ask.js +3 -1
- package/dist/cli/messenger/ask.js.map +1 -1
- package/dist/cli/messenger/complete-command.js +1 -1
- package/dist/cli/messenger/complete-command.js.map +1 -1
- package/dist/cli/messenger/doctor-command.js +1 -1
- package/dist/cli/messenger/doctor-command.js.map +1 -1
- package/dist/cli/messenger/flood-command.js +1 -1
- package/dist/cli/messenger/flood-command.js.map +1 -1
- package/dist/cli/messenger/mcp-command.js +1 -1
- package/dist/cli/messenger/mcp-command.js.map +1 -1
- package/dist/cli/messenger/messages-delete-command.d.ts +1 -1
- package/dist/cli/messenger/messages-delete-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-delete-command.js +10 -5
- package/dist/cli/messenger/messages-delete-command.js.map +1 -1
- package/dist/cli/messenger/models-command.d.ts.map +1 -1
- package/dist/cli/messenger/models-command.js +2 -2
- package/dist/cli/messenger/models-command.js.map +1 -1
- package/dist/cli/messenger/records-command.d.ts.map +1 -1
- package/dist/cli/messenger/records-command.js +5 -5
- package/dist/cli/messenger/records-command.js.map +1 -1
- package/dist/cli/messenger/replies-command.js +1 -1
- package/dist/cli/messenger/replies-command.js.map +1 -1
- package/dist/cli/messenger/schedule-command.js +1 -1
- package/dist/cli/messenger/schedule-command.js.map +1 -1
- package/dist/cli/messenger/serve-relay.d.ts +5 -0
- package/dist/cli/messenger/serve-relay.d.ts.map +1 -1
- package/dist/cli/messenger/serve-relay.js +38 -33
- package/dist/cli/messenger/serve-relay.js.map +1 -1
- package/dist/cli/messenger/server-command.js +1 -1
- package/dist/cli/messenger/server-command.js.map +1 -1
- package/dist/cli/messenger/topics-command.d.ts.map +1 -1
- package/dist/cli/messenger/topics-command.js +2 -2
- package/dist/cli/messenger/topics-command.js.map +1 -1
- package/dist/cli/program.js +5 -1
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/runs/command.d.ts.map +1 -1
- package/dist/cli/runs/command.js +1 -1
- package/dist/cli/runs/command.js.map +1 -1
- package/dist/cli/skill-command.d.ts.map +1 -1
- package/dist/cli/skill-command.js +2 -1
- package/dist/cli/skill-command.js.map +1 -1
- package/dist/cli/upgrade-command.js +1 -1
- package/dist/cli/upgrade-command.js.map +1 -1
- package/dist/mcp/agent.d.ts +68 -0
- package/dist/mcp/agent.d.ts.map +1 -0
- package/dist/mcp/agent.js +201 -0
- package/dist/mcp/agent.js.map +1 -0
- package/dist/mcp/bot/server.d.ts +11 -20
- package/dist/mcp/bot/server.d.ts.map +1 -1
- package/dist/mcp/bot/server.js +39 -82
- package/dist/mcp/bot/server.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +2 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/output.d.ts +3 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +5 -2
- package/dist/output.js.map +1 -1
- package/dist/services/searches.d.ts +1 -1
- package/dist/services/searches.d.ts.map +1 -1
- package/dist/store/document-transfer/digest.d.ts +2 -0
- package/dist/store/document-transfer/digest.d.ts.map +1 -0
- package/dist/store/document-transfer/digest.js +3 -0
- package/dist/store/document-transfer/digest.js.map +1 -0
- package/dist/store/document-transfer/index.d.ts +7 -0
- package/dist/store/document-transfer/index.d.ts.map +1 -0
- package/dist/store/document-transfer/index.js +115 -0
- package/dist/store/document-transfer/index.js.map +1 -0
- package/dist/store/document-transfer/model.d.ts +69 -0
- package/dist/store/document-transfer/model.d.ts.map +1 -0
- package/dist/store/document-transfer/model.js +2 -0
- package/dist/store/document-transfer/model.js.map +1 -0
- package/dist/store/index.d.ts +2 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -0
- package/dist/store/index.js.map +1 -1
- package/dist/store/sqlite/document-transfer/apply.d.ts +4 -0
- package/dist/store/sqlite/document-transfer/apply.d.ts.map +1 -0
- package/dist/store/sqlite/document-transfer/apply.js +179 -0
- package/dist/store/sqlite/document-transfer/apply.js.map +1 -0
- package/dist/store/sqlite/document-transfer/people.d.ts +10 -0
- package/dist/store/sqlite/document-transfer/people.d.ts.map +1 -0
- package/dist/store/sqlite/document-transfer/people.js +75 -0
- package/dist/store/sqlite/document-transfer/people.js.map +1 -0
- package/dist/store/sqlite/document-transfer/plan.d.ts +12 -0
- package/dist/store/sqlite/document-transfer/plan.d.ts.map +1 -0
- package/dist/store/sqlite/document-transfer/plan.js +195 -0
- package/dist/store/sqlite/document-transfer/plan.js.map +1 -0
- package/dist/store/sqlite/document-transfer/snapshot.d.ts +10 -0
- package/dist/store/sqlite/document-transfer/snapshot.d.ts.map +1 -0
- package/dist/store/sqlite/document-transfer/snapshot.js +183 -0
- package/dist/store/sqlite/document-transfer/snapshot.js.map +1 -0
- package/dist/store/sqlite/manifest.d.ts.map +1 -1
- package/dist/store/sqlite/manifest.js +1 -0
- package/dist/store/sqlite/manifest.js.map +1 -1
- package/dist/store/sqlite/migrations.generated.d.ts.map +1 -1
- package/dist/store/sqlite/migrations.generated.js +6 -0
- package/dist/store/sqlite/migrations.generated.js.map +1 -1
- package/dist/store/sqlite/schema/document-index-pending.d.ts +40 -0
- package/dist/store/sqlite/schema/document-index-pending.d.ts.map +1 -0
- package/dist/store/sqlite/schema/document-index-pending.js +6 -0
- package/dist/store/sqlite/schema/document-index-pending.js.map +1 -0
- package/dist/store/sqlite/schema/document-transfers.d.ts +104 -0
- package/dist/store/sqlite/schema/document-transfers.d.ts.map +1 -0
- package/dist/store/sqlite/schema/document-transfers.js +10 -0
- package/dist/store/sqlite/schema/document-transfers.js.map +1 -0
- package/dist/store/sqlite/schema.d.ts +2 -39
- package/dist/store/sqlite/schema.d.ts.map +1 -1
- package/dist/store/sqlite/schema.js +2 -4
- package/dist/store/sqlite/schema.js.map +1 -1
- package/package.json +3 -3
- package/dist/mcp/bot/tools.d.ts +0 -49
- package/dist/mcp/bot/tools.d.ts.map +0 -1
- package/dist/mcp/bot/tools.js +0 -244
- package/dist/mcp/bot/tools.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade-command.js","sourceRoot":"","sources":["../../src/cli/upgrade-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAuD,cAAc,EAAE,MAAM,gCAAgC,CAAA;AACpH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAQ/D,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,GAAgB,EAChB,WAAmB,EACnB,UAAgD,EACvC,EAAE,CACX,eAAe,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"upgrade-command.js","sourceRoot":"","sources":["../../src/cli/upgrade-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type CommandInfo } from "@wirecat/cli-base/commands";
|
|
2
|
+
import { type ErrorObject } from "@wirecat/cli-base/standards";
|
|
3
|
+
import * as v from "valibot";
|
|
4
|
+
import type { RunOptions } from "../cli/program.js";
|
|
5
|
+
import type { MessengerAdapter } from "../ports/messenger.js";
|
|
6
|
+
import { type Level, type PermissionKey } from "../sends/permissions.js";
|
|
7
|
+
/** The CLI's own `run` — a fresh program on every call — and its command tree as `commands --json` describes it. */
|
|
8
|
+
export interface AgentProgram {
|
|
9
|
+
run: (argv: string[], environment: RunOptions) => Promise<number>;
|
|
10
|
+
commands: readonly CommandInfo[];
|
|
11
|
+
}
|
|
12
|
+
export interface AgentContext {
|
|
13
|
+
profile: string;
|
|
14
|
+
env?: NodeJS.ProcessEnv;
|
|
15
|
+
/** The levels in force now, this server's stricter ones included; read on every call. */
|
|
16
|
+
levels?: () => Readonly<Record<PermissionKey, Level>>;
|
|
17
|
+
/** This server's own stricter levels, `key=level`, which the command's guard applies too. */
|
|
18
|
+
overrides?: readonly string[];
|
|
19
|
+
/** The key a CLI's own command is checked against, when `keyForCommand` does not know it. */
|
|
20
|
+
keyOf?: (path: readonly string[]) => PermissionKey | null | undefined;
|
|
21
|
+
/** The server's one open connection. The command borrows it: it cannot close it, and never opens its own. */
|
|
22
|
+
connection?: () => Promise<MessengerAdapter>;
|
|
23
|
+
}
|
|
24
|
+
export type AgentAnswer = {
|
|
25
|
+
result: unknown;
|
|
26
|
+
} | {
|
|
27
|
+
error: ErrorObject;
|
|
28
|
+
};
|
|
29
|
+
/** One command an agent may run: its path under the server's root, and its arguments as a schema. */
|
|
30
|
+
export interface AgentTool {
|
|
31
|
+
command: string;
|
|
32
|
+
/** From the program's root: `["bot", "messages", "send"]`. */
|
|
33
|
+
path: readonly string[];
|
|
34
|
+
title: string;
|
|
35
|
+
description: string;
|
|
36
|
+
writes: boolean;
|
|
37
|
+
input: v.ObjectSchema<v.ObjectEntries, undefined>;
|
|
38
|
+
}
|
|
39
|
+
export interface CatalogueOptions {
|
|
40
|
+
/** The subtree a server is built from: `["bot"]` for the bot server. */
|
|
41
|
+
root?: readonly string[];
|
|
42
|
+
/** Subtrees under the root left out: the personal server leaves out `["bot"]`. */
|
|
43
|
+
exclude?: readonly (readonly string[])[];
|
|
44
|
+
/** The profile's levels when the server starts: what they refuse is not offered. */
|
|
45
|
+
levels?: Readonly<Record<PermissionKey, Level>>;
|
|
46
|
+
keyOf?: (path: readonly string[]) => PermissionKey | null | undefined;
|
|
47
|
+
/** Arguments left out of every tool, by name. */
|
|
48
|
+
omit?: readonly string[];
|
|
49
|
+
/** Offer `offline` on commands that read the messenger: answer from the copy on this machine. */
|
|
50
|
+
offline?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* One tool per command an agent may run under `root` (NEED-1411): every leaf command, except one marked
|
|
54
|
+
* `mcp: false` (on itself or a group above it), one with a `lifetime` — an agent call must return — and one the
|
|
55
|
+
* profile's levels refuse. Its input is the command's arguments and options in snake_case, typed as far as the
|
|
56
|
+
* command tree and the shared flag vocabulary say; an option marked `mcp: false` is left out.
|
|
57
|
+
*/
|
|
58
|
+
export declare const toolsFromCommands: (commands: readonly CommandInfo[], options?: CatalogueOptions) => AgentTool[];
|
|
59
|
+
/**
|
|
60
|
+
* Runs one command for an agent through the CLI itself, in this process: the same parsing, guard, answer and
|
|
61
|
+
* error as on the command line. The answer comes back as the object the command rendered, and a failure as the
|
|
62
|
+
* error object the CLI would print. A write at level `ask` goes ahead (NEED-773); the server's stricter levels
|
|
63
|
+
* apply, to the check before the run and to the command's own guard. With `connection`, the command borrows the
|
|
64
|
+
* server's open connection and never opens one of its own. Which commands are offered is the catalogue's
|
|
65
|
+
* decision (`toolsFromCommands`); this runs what it is handed, except a command that never returns.
|
|
66
|
+
*/
|
|
67
|
+
export declare const runCommandForAgent: (program: AgentProgram, path: readonly string[], input: Record<string, unknown>, ctx: AgentContext) => Promise<AgentAnswer>;
|
|
68
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/mcp/agent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,WAAW,EAA4B,MAAM,4BAA4B,CAAA;AAC1G,OAAO,EAAE,KAAK,WAAW,EAAsB,MAAM,6BAA6B,CAAA;AAClF,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAiB,KAAK,KAAK,EAAY,KAAK,aAAa,EAAsB,MAAM,yBAAyB,CAAA;AAErH,oHAAoH;AACpH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACjE,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAA;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAA;IACrD,6FAA6F;IAC7F,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC7B,6FAA6F;IAC7F,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,aAAa,GAAG,IAAI,GAAG,SAAS,CAAA;IACrE,6GAA6G;IAC7G,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAA;CAC7C;AAED,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CAAA;AAEtE,qGAAqG;AACrG,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;CAClD;AAED,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,kFAAkF;IAClF,OAAO,CAAC,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAA;IACxC,oFAAoF;IACpF,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAA;IAC/C,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,aAAa,GAAG,IAAI,GAAG,SAAS,CAAA;IACrE,iDAAiD;IACjD,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,iGAAiG;IACjG,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAqHD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,aAAc,SAAS,WAAW,EAAE,YAAW,gBAAgB,KAAQ,SAAS,EAqB7G,CAAA;AAqBD;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,YACpB,YAAY,QACf,SAAS,MAAM,EAAE,SAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,OACzB,YAAY,KAChB,OAAO,CAAC,WAAW,CA+CrB,CAAA"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { Readable } from "node:stream";
|
|
2
|
+
import { CliError, captureStreams, errorObjectOf } from "@wirecat/cli-base";
|
|
3
|
+
import { flatten } from "@wirecat/cli-base/commands";
|
|
4
|
+
import { VOCABULARY, writes } from "@wirecat/cli-base/standards";
|
|
5
|
+
import * as v from "valibot";
|
|
6
|
+
import { lentConnection } from "../cli/messenger/serve-relay.js";
|
|
7
|
+
import { keyForCommand, levelFor, readKeysForCommand } from "../sends/permissions.js";
|
|
8
|
+
const TYPES = new Map(VOCABULARY.flags.map((flag) => [flag.name, flag.type]));
|
|
9
|
+
const snake = (name) => name.replaceAll("-", "_");
|
|
10
|
+
const longOf = (option) => option.flags.match(/--[a-z0-9][a-z0-9-]*/)?.[0];
|
|
11
|
+
const text = (description) => v.pipe(v.string(), v.minLength(1),
|
|
12
|
+
// `-` alone reads stdin, which is the MCP transport.
|
|
13
|
+
v.regex(/^(?!-$)[\s\S]+$/, "a value, and not only -"), v.description(description));
|
|
14
|
+
const optionKind = (option, long) => {
|
|
15
|
+
if (!option.takes_value)
|
|
16
|
+
return "switch";
|
|
17
|
+
if (option.choices)
|
|
18
|
+
return "text";
|
|
19
|
+
const type = TYPES.get(long);
|
|
20
|
+
if (type === "count" || type === "number" || type === "list")
|
|
21
|
+
return type;
|
|
22
|
+
return /\.\.\.[>\]]/.test(option.flags) ? "variadic" : "text";
|
|
23
|
+
};
|
|
24
|
+
const optionField = (option, long) => {
|
|
25
|
+
const kind = optionKind(option, long);
|
|
26
|
+
const about = option.description;
|
|
27
|
+
const schema = kind === "switch"
|
|
28
|
+
? v.pipe(v.boolean(), v.description(about))
|
|
29
|
+
: option.choices
|
|
30
|
+
? v.pipe(v.picklist(option.choices), v.description(about))
|
|
31
|
+
: kind === "count"
|
|
32
|
+
? v.pipe(v.number(), v.integer(), v.minValue(1), v.description(about))
|
|
33
|
+
: kind === "number"
|
|
34
|
+
? v.pipe(v.number(), v.description(about))
|
|
35
|
+
: kind === "list" || kind === "variadic"
|
|
36
|
+
? v.pipe(v.array(text("one value")), v.minLength(1), v.description(about))
|
|
37
|
+
: text(about);
|
|
38
|
+
return {
|
|
39
|
+
name: snake(long.slice(2)),
|
|
40
|
+
required: option.mandatory,
|
|
41
|
+
schema,
|
|
42
|
+
positional: false,
|
|
43
|
+
argv: (value) => {
|
|
44
|
+
if (kind === "switch")
|
|
45
|
+
return value === true ? [long] : [];
|
|
46
|
+
if (kind === "variadic")
|
|
47
|
+
return value.map((one) => `${long}=${String(one)}`);
|
|
48
|
+
if (kind === "list")
|
|
49
|
+
return [`${long}=${value.map(String).join(",")}`];
|
|
50
|
+
return [`${long}=${String(value)}`];
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
const argumentField = (argument) => {
|
|
55
|
+
const one = argument.choices
|
|
56
|
+
? v.pipe(v.picklist(argument.choices), v.description(argument.description))
|
|
57
|
+
: text(argument.description || argument.name);
|
|
58
|
+
return {
|
|
59
|
+
name: snake(argument.name),
|
|
60
|
+
required: argument.required,
|
|
61
|
+
schema: argument.variadic ? v.pipe(v.array(one), v.minLength(argument.required ? 1 : 0)) : one,
|
|
62
|
+
positional: true,
|
|
63
|
+
argv: (value) => (Array.isArray(value) ? value.map(String) : [String(value)]),
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
const OFFLINE = {
|
|
67
|
+
name: "offline",
|
|
68
|
+
required: false,
|
|
69
|
+
schema: v.pipe(v.boolean(), v.description("answer from the copy on this machine only")),
|
|
70
|
+
positional: false,
|
|
71
|
+
argv: (value) => (value === true ? ["--offline"] : []),
|
|
72
|
+
};
|
|
73
|
+
const fieldsOf = (info, { omit = [], offline = false }) => {
|
|
74
|
+
const fields = info.arguments.map(argumentField);
|
|
75
|
+
for (const option of info.options) {
|
|
76
|
+
const long = longOf(option);
|
|
77
|
+
if (!long || option.mcp === false)
|
|
78
|
+
continue;
|
|
79
|
+
fields.push(optionField(option, long));
|
|
80
|
+
}
|
|
81
|
+
if (offline && info.effects?.remote === "read")
|
|
82
|
+
fields.push(OFFLINE);
|
|
83
|
+
return fields.filter((field) => !omit.includes(field.name));
|
|
84
|
+
};
|
|
85
|
+
const schemaOf = (fields) => v.object(Object.fromEntries(fields.map((field) => [field.name, field.required ? field.schema : v.optional(field.schema)])));
|
|
86
|
+
const startsWith = (path, prefix) => prefix.every((word, at) => path[at] === word);
|
|
87
|
+
/** Why the profile refuses this command now, or nothing. */
|
|
88
|
+
const refusal = (info, levels, keyOf) => {
|
|
89
|
+
const key = keyOf?.(info.path) ?? keyForCommand(info.path);
|
|
90
|
+
const level = key ? levelFor(levels, key).level : "allow";
|
|
91
|
+
if (level === "deny")
|
|
92
|
+
return `the profile denies ${key}`;
|
|
93
|
+
if (level === "readonly" && writes(info.effects))
|
|
94
|
+
return `${key} is readonly in this profile`;
|
|
95
|
+
const denied = readKeysForCommand(info.path).find((read) => levelFor(levels, read).level === "deny");
|
|
96
|
+
return denied ? `the profile denies ${denied}` : undefined;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* One tool per command an agent may run under `root` (NEED-1411): every leaf command, except one marked
|
|
100
|
+
* `mcp: false` (on itself or a group above it), one with a `lifetime` — an agent call must return — and one the
|
|
101
|
+
* profile's levels refuse. Its input is the command's arguments and options in snake_case, typed as far as the
|
|
102
|
+
* command tree and the shared flag vocabulary say; an option marked `mcp: false` is left out.
|
|
103
|
+
*/
|
|
104
|
+
export const toolsFromCommands = (commands, options = {}) => {
|
|
105
|
+
const { root = [], exclude = [], levels, keyOf } = options;
|
|
106
|
+
return flatten(commands)
|
|
107
|
+
.filter((info) => info.commands.length === 0 &&
|
|
108
|
+
info.path.length > root.length &&
|
|
109
|
+
startsWith(info.path, root) &&
|
|
110
|
+
!exclude.some((skipped) => startsWith(info.path.slice(root.length), skipped)) &&
|
|
111
|
+
info.mcp !== false &&
|
|
112
|
+
info.lifetime === undefined &&
|
|
113
|
+
(levels === undefined || refusal(info, levels, keyOf) === undefined))
|
|
114
|
+
.map((info) => ({
|
|
115
|
+
command: info.path.slice(root.length).join(" "),
|
|
116
|
+
path: info.path,
|
|
117
|
+
title: info.summary ?? info.description,
|
|
118
|
+
description: info.description,
|
|
119
|
+
writes: writes(info.effects),
|
|
120
|
+
input: schemaOf(fieldsOf(info, options)),
|
|
121
|
+
}));
|
|
122
|
+
};
|
|
123
|
+
const argvOf = (info, input, profile) => {
|
|
124
|
+
const fields = fieldsOf(info, { offline: true });
|
|
125
|
+
const known = new Map(fields.map((field) => [field.name, field]));
|
|
126
|
+
for (const name of Object.keys(input))
|
|
127
|
+
if (!known.has(name))
|
|
128
|
+
throw new CliError("validation_error", `${info.path.join(" ")}: no argument "${name}"`);
|
|
129
|
+
const options = [];
|
|
130
|
+
const positionals = [];
|
|
131
|
+
for (const field of fields) {
|
|
132
|
+
const value = input[field.name];
|
|
133
|
+
if (value === undefined) {
|
|
134
|
+
if (field.required)
|
|
135
|
+
throw new CliError("validation_error", `${info.path.join(" ")}: "${field.name}" is required`);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
for (const token of field.argv(value))
|
|
139
|
+
(field.positional ? positionals : options).push(token);
|
|
140
|
+
}
|
|
141
|
+
// Values never reach commander as tokens of their own, and positionals come after `--`: no value becomes a flag.
|
|
142
|
+
return [profile, ...info.path, ...options, "--json", ...(positionals.length > 0 ? ["--", ...positionals] : [])];
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* Runs one command for an agent through the CLI itself, in this process: the same parsing, guard, answer and
|
|
146
|
+
* error as on the command line. The answer comes back as the object the command rendered, and a failure as the
|
|
147
|
+
* error object the CLI would print. A write at level `ask` goes ahead (NEED-773); the server's stricter levels
|
|
148
|
+
* apply, to the check before the run and to the command's own guard. With `connection`, the command borrows the
|
|
149
|
+
* server's open connection and never opens one of its own. Which commands are offered is the catalogue's
|
|
150
|
+
* decision (`toolsFromCommands`); this runs what it is handed, except a command that never returns.
|
|
151
|
+
*/
|
|
152
|
+
export const runCommandForAgent = async (program, path, input, ctx) => {
|
|
153
|
+
try {
|
|
154
|
+
const info = flatten(program.commands).find((one) => one.path.length === path.length && startsWith(one.path, path));
|
|
155
|
+
if (!info || info.commands.length > 0)
|
|
156
|
+
throw new CliError("validation_error", `no command "${path.join(" ")}" to run`);
|
|
157
|
+
if (info.lifetime)
|
|
158
|
+
throw new CliError("validation_error", `"${path.join(" ")}" runs until it is stopped; an agent call must return`);
|
|
159
|
+
const levels = ctx.levels?.();
|
|
160
|
+
const refused = levels && refusal(info, levels, ctx.keyOf);
|
|
161
|
+
if (refused)
|
|
162
|
+
throw new CliError("permission_error", `${path.join(" ")}: ${refused}`, { sent: false });
|
|
163
|
+
const argv = argvOf(info, input, ctx.profile);
|
|
164
|
+
const borrowed = ctx.connection ? lentConnection(await ctx.connection()) : undefined;
|
|
165
|
+
let answered = false;
|
|
166
|
+
let result;
|
|
167
|
+
let failure;
|
|
168
|
+
const streams = captureStreams();
|
|
169
|
+
const code = await program.run(argv, {
|
|
170
|
+
streams,
|
|
171
|
+
tty: false,
|
|
172
|
+
...(ctx.env ? { env: ctx.env } : {}),
|
|
173
|
+
stdin: Readable.from([]),
|
|
174
|
+
answer: () => null,
|
|
175
|
+
agent: {
|
|
176
|
+
result: (value) => {
|
|
177
|
+
answered = true;
|
|
178
|
+
result = value;
|
|
179
|
+
},
|
|
180
|
+
failure: (object) => {
|
|
181
|
+
failure = object;
|
|
182
|
+
},
|
|
183
|
+
...(ctx.overrides?.length ? { overrides: ctx.overrides } : {}),
|
|
184
|
+
},
|
|
185
|
+
...(borrowed ? { relayed: { profile: ctx.profile, cwd: process.cwd(), connection: () => borrowed } } : {}),
|
|
186
|
+
});
|
|
187
|
+
if (failure)
|
|
188
|
+
return { error: failure };
|
|
189
|
+
if (answered)
|
|
190
|
+
return { result };
|
|
191
|
+
if (code !== 0)
|
|
192
|
+
throw new CliError("invalid_response", `the command exited with ${code} and said nothing`);
|
|
193
|
+
if (streams.stdout.length > 0)
|
|
194
|
+
throw new CliError("invalid_response", "the command printed its answer instead of handing it over — the CLI's run must pass its whole environment on");
|
|
195
|
+
return { result: null };
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
return { error: errorObjectOf(error) };
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/mcp/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/bot/server.d.ts
CHANGED
|
@@ -1,34 +1,25 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/server";
|
|
2
|
-
import { type Streams } from "@wirecat/cli-base";
|
|
3
2
|
import type { BotMessenger } from "../../cli/bot/port.js";
|
|
4
3
|
import type { Settings } from "../../cli/settings.js";
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
tty: false;
|
|
10
|
-
env: NodeJS.ProcessEnv;
|
|
11
|
-
answer?: (question: string) => string | null;
|
|
12
|
-
}) => Promise<number>;
|
|
4
|
+
import type { Level, PermissionKey } from "../../sends/permissions.js";
|
|
5
|
+
import { type AgentProgram } from "../agent.js";
|
|
6
|
+
/** The CLI's own `run`, which cli-core cannot import. It must pass the whole environment it is given on. */
|
|
7
|
+
export type RunBotCommand = AgentProgram["run"];
|
|
13
8
|
export interface BotServerOptions {
|
|
14
9
|
bot: BotMessenger;
|
|
15
|
-
/**
|
|
16
|
-
|
|
17
|
-
* a tool is offered only when its command is there.
|
|
18
|
-
*/
|
|
19
|
-
commandAt: (words: readonly string[]) => {
|
|
20
|
-
accepts: (flag: string) => boolean;
|
|
21
|
-
} | undefined;
|
|
10
|
+
/** The CLI's `run` and its whole command tree; the tools are the commands under `bot`. */
|
|
11
|
+
program: AgentProgram;
|
|
22
12
|
settings: Pick<Settings, "profile" | "permissions" | "readOtherBots">;
|
|
13
|
+
/** The levels in force now, read before every call; `settings.permissions` when unset. */
|
|
14
|
+
levels?: () => Readonly<Record<PermissionKey, Level>>;
|
|
15
|
+
/** The key a CLI's own bot command is guarded by, from its full path, when `keyForCommand` does not know it. */
|
|
16
|
+
keyOf?: (path: readonly string[]) => PermissionKey | null | undefined;
|
|
23
17
|
env: NodeJS.ProcessEnv;
|
|
24
|
-
run: RunBotCommand;
|
|
25
|
-
/** The CLI's own tools, beside the shared ones; one with the same words replaces the shared one. */
|
|
26
|
-
tools?: readonly BotTool[];
|
|
27
18
|
skill?: URL;
|
|
28
19
|
}
|
|
29
|
-
export declare const botToolName: (command: string, words: readonly string[]) => string;
|
|
30
20
|
export declare const createBotServer: (options: BotServerOptions) => {
|
|
31
21
|
build: () => McpServer;
|
|
22
|
+
tools: import("../agent.js").AgentTool[];
|
|
32
23
|
offered: string[];
|
|
33
24
|
};
|
|
34
25
|
/** Serves until the client closes stdin or the process is told to stop; returning lets the process exit. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/bot/server.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/bot/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAM7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAGzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AACtE,OAAO,EAAoB,KAAK,YAAY,EAAyC,MAAM,aAAa,CAAA;AAMxG,4GAA4G;AAC5G,MAAM,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,YAAY,CAAA;IACjB,0FAA0F;IAC1F,OAAO,EAAE,YAAY,CAAA;IACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,GAAG,aAAa,GAAG,eAAe,CAAC,CAAA;IACrE,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAA;IACrD,gHAAgH;IAChH,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,aAAa,GAAG,IAAI,GAAG,SAAS,CAAA;IACrE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,KAAK,CAAC,EAAE,GAAG,CAAA;CACZ;AAUD,eAAO,MAAM,eAAe,YAAa,gBAAgB;iBA8BrC,SAAS;;;CAsD5B,CAAA;AAED,4GAA4G;AAC5G,eAAO,MAAM,iBAAiB,YAAmB,gBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,KAAG,OAAO,CAAC,IAAI,CAUhH,CAAA"}
|
package/dist/mcp/bot/server.js
CHANGED
|
@@ -1,89 +1,46 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/server";
|
|
2
2
|
import { serveStdio } from "@modelcontextprotocol/server/stdio";
|
|
3
|
-
import {
|
|
3
|
+
import { mcpErrorResult } from "@wirecat/cli-base";
|
|
4
4
|
import { skillResource } from "@wirecat/cli-base/skill";
|
|
5
5
|
import * as v from "valibot";
|
|
6
6
|
import { itemOf } from "../../cli/envelope.js";
|
|
7
|
-
import { skipFlagFor } from "../../cli/messenger/ask.js";
|
|
8
7
|
import { wholeList } from "../../cli/messenger/chat-answers.js";
|
|
9
|
-
import {
|
|
8
|
+
import { runCommandForAgent, toolsFromCommands } from "../agent.js";
|
|
10
9
|
import { registerCommands } from "../surface.js";
|
|
10
|
+
import { agentJson } from "../text.js";
|
|
11
11
|
import { answered } from "../tool.js";
|
|
12
12
|
import { botInstructions } from "./instructions.js";
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
if (text.trim() === "")
|
|
17
|
-
return null;
|
|
18
|
-
try {
|
|
19
|
-
return JSON.parse(text);
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
return text
|
|
23
|
-
.split("\n")
|
|
24
|
-
.filter((line) => line.trim() !== "")
|
|
25
|
-
.map((line) => JSON.parse(line));
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
/** A command's `--json` answer is already an envelope; anything else — a CLI's own tool — is wrapped as one. */
|
|
29
|
-
const body = (words, value) => Array.isArray(value)
|
|
30
|
-
? wholeList(["bot", ...words].join(" "), value)
|
|
13
|
+
/** A command's `--json` answer is already an envelope; a bare list or value is wrapped as one. */
|
|
14
|
+
const body = (command, value) => Array.isArray(value)
|
|
15
|
+
? wholeList(`bot ${command}`, value)
|
|
31
16
|
: value !== null && typeof value === "object" && ("item" in value || "items" in value)
|
|
32
17
|
? value
|
|
33
18
|
: itemOf(value !== null && typeof value === "object" ? value : { value });
|
|
34
|
-
/**
|
|
35
|
-
* Runs bot commands in this process and returns their `--json` answers. A command never sees a
|
|
36
|
-
* terminal: stdin is the MCP transport. Calls are queued — they share the journal, the registry and
|
|
37
|
-
* the local copy.
|
|
38
|
-
*/
|
|
39
|
-
const runner = ({ settings, run, env }) => {
|
|
40
|
-
let queue = Promise.resolve();
|
|
41
|
-
const profile = [settings.profile];
|
|
42
|
-
const once = async (words, { options = [], positionals = [] }, answer) => {
|
|
43
|
-
const streams = captureStreams();
|
|
44
|
-
const argv = [...profile, "bot", ...words, ...options, "--json", "--", ...positionals];
|
|
45
|
-
const code = await run(argv, { streams, tty: false, env, ...(answer ? { answer } : {}) });
|
|
46
|
-
if (code === 0)
|
|
47
|
-
return parsed(streams.stdout.join("\n"));
|
|
48
|
-
const error = parsed(streams.stderr.at(-1) ?? "")?.error;
|
|
49
|
-
throw new CliError((error?.code ?? "generic_failure"), error?.message ?? `the command exited with ${code}`, error);
|
|
50
|
-
};
|
|
51
|
-
return (words, invocation, answer) => {
|
|
52
|
-
const next = queue.then(() => once(words, invocation, answer));
|
|
53
|
-
queue = next.catch(() => undefined);
|
|
54
|
-
return next;
|
|
55
|
-
};
|
|
56
|
-
};
|
|
57
19
|
export const createBotServer = (options) => {
|
|
58
|
-
const { bot,
|
|
20
|
+
const { bot, program, settings, env } = options;
|
|
59
21
|
const command = bot.app.command;
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const offered = [...byName]
|
|
71
|
-
.filter(([, tool]) => {
|
|
72
|
-
const level = levelOf(tool);
|
|
73
|
-
return commandAt(tool.words) !== undefined && level !== "deny" && !(tool.writes && level === "readonly");
|
|
74
|
-
})
|
|
75
|
-
.map(([name, tool]) => [name, tool.across && settings.readOtherBots ? withAcross(tool) : tool]);
|
|
76
|
-
const writes = offered.filter(([, tool]) => tool.writes).map(([, tool]) => tool.words.join(" "));
|
|
77
|
-
const kit = { invoke };
|
|
22
|
+
const levels = options.levels ?? (() => settings.permissions);
|
|
23
|
+
const tools = toolsFromCommands(program.commands, {
|
|
24
|
+
root: ["bot"],
|
|
25
|
+
levels: settings.permissions,
|
|
26
|
+
...(options.keyOf ? { keyOf: options.keyOf } : {}),
|
|
27
|
+
offline: true,
|
|
28
|
+
// Another bot's copy is this bot's to read only where `read_other_bots` says so.
|
|
29
|
+
...(settings.readOtherBots ? {} : { omit: ["all_bots", "bots"] }),
|
|
30
|
+
});
|
|
31
|
+
const writes = tools.filter((tool) => tool.writes).map((tool) => tool.command);
|
|
78
32
|
const skill = options.skill ? skillResource(bot.app, options.skill) : undefined;
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
33
|
+
// One at a time: the commands share the journal, the registry and the local copy.
|
|
34
|
+
let queue = Promise.resolve();
|
|
35
|
+
const invoke = (path, input) => {
|
|
36
|
+
const next = queue.then(() => runCommandForAgent(program, path, input, {
|
|
37
|
+
profile: settings.profile,
|
|
38
|
+
env,
|
|
39
|
+
levels,
|
|
40
|
+
...(options.keyOf ? { keyOf: options.keyOf } : {}),
|
|
41
|
+
}));
|
|
42
|
+
queue = next.catch(() => undefined);
|
|
43
|
+
return next;
|
|
87
44
|
};
|
|
88
45
|
const build = () => {
|
|
89
46
|
const server = new McpServer({ name: `${command}-bot-${settings.profile}`, version: bot.app.version }, {
|
|
@@ -99,18 +56,18 @@ export const createBotServer = (options) => {
|
|
|
99
56
|
const { uri, name, title, description, mimeType, read } = skill;
|
|
100
57
|
server.registerResource(name, uri, { title, description, mimeType }, read);
|
|
101
58
|
}
|
|
102
|
-
const commands = Object.fromEntries(
|
|
103
|
-
tool.
|
|
59
|
+
const commands = Object.fromEntries(tools.map((tool) => [
|
|
60
|
+
tool.command,
|
|
104
61
|
{
|
|
105
62
|
title: tool.title,
|
|
106
63
|
description: tool.description,
|
|
107
|
-
writes: tool.writes
|
|
64
|
+
writes: tool.writes,
|
|
108
65
|
input: tool.input,
|
|
109
|
-
run: async (args
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
66
|
+
run: async (args) => {
|
|
67
|
+
const answer = await invoke(tool.path, args);
|
|
68
|
+
return "error" in answer
|
|
69
|
+
? mcpErrorResult(JSON.parse(agentJson(answer.error)))
|
|
70
|
+
: answered(body(tool.command, answer.result));
|
|
114
71
|
},
|
|
115
72
|
},
|
|
116
73
|
]));
|
|
@@ -121,15 +78,15 @@ export const createBotServer = (options) => {
|
|
|
121
78
|
writes: false,
|
|
122
79
|
input: v.object({}),
|
|
123
80
|
run: async () => {
|
|
124
|
-
const auth = await invoke(["auth", "show"], {})
|
|
125
|
-
const shown = auth.item ?? auth;
|
|
81
|
+
const auth = await invoke(["bot", "auth", "show"], {});
|
|
82
|
+
const shown = "error" in auth ? auth.error : (auth.result?.item ?? auth.result);
|
|
126
83
|
return answered(itemOf({ profile: settings.profile, kind: "bot", auth: shown, writes, permissions: settings.permissions }));
|
|
127
84
|
},
|
|
128
85
|
};
|
|
129
86
|
registerCommands(server, `${command}_bot`, commands);
|
|
130
87
|
return server;
|
|
131
88
|
};
|
|
132
|
-
return { build, offered:
|
|
89
|
+
return { build, tools, offered: tools.map((tool) => tool.command) };
|
|
133
90
|
};
|
|
134
91
|
/** Serves until the client closes stdin or the process is told to stop; returning lets the process exit. */
|
|
135
92
|
export const serveBotOverStdio = async (options, note) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/bot/server.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/bot/server.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { type
|
|
1
|
+
export { type AgentAnswer, type AgentContext, type AgentProgram, type AgentTool, type CatalogueOptions, runCommandForAgent, toolsFromCommands, } from "./agent.js";
|
|
2
|
+
export { type BotServerOptions, createBotServer, type RunBotCommand } from "./bot/server.js";
|
|
2
3
|
export { revokeAll } from "./http/oauth.js";
|
|
3
4
|
export { type HttpOptions, MCP_PATH, serveOverHttp } from "./http/serve.js";
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/mcp/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,KAAK,gBAAgB,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC5F,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,KAAK,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA"}
|
package/dist/mcp/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Apart from the `cli` entry, so a CLI loads the MCP SDK and zod only when it serves MCP.
|
|
2
|
-
export {
|
|
2
|
+
export { runCommandForAgent, toolsFromCommands, } from "./agent.js";
|
|
3
|
+
export { createBotServer } from "./bot/server.js";
|
|
3
4
|
export { revokeAll } from "./http/oauth.js";
|
|
4
5
|
export { MCP_PATH, serveOverHttp } from "./http/serve.js";
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
package/dist/mcp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,OAAO,EAML,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAyB,eAAe,EAAsB,MAAM,iBAAiB,CAAA;AAC5F,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAoB,QAAQ,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA"}
|