golutra-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,109 @@
1
+ import { existsSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import path from "node:path";
4
+ import { GOLUTRA_PROFILES } from "./types.js";
5
+ const DEFAULT_TIMEOUT_MS = 30_000;
6
+ const MAX_TIMEOUT_MS = 300_000;
7
+ const DEFAULT_CLI_COMMAND = "golutra-cli";
8
+ function normalizeNonEmptyString(value) {
9
+ const trimmed = value?.trim();
10
+ return trimmed ? trimmed : undefined;
11
+ }
12
+ function normalizeTimeout(value) {
13
+ if (typeof value === "number" && Number.isInteger(value) && value > 0) {
14
+ return Math.min(value, MAX_TIMEOUT_MS);
15
+ }
16
+ if (typeof value === "string") {
17
+ const parsed = Number.parseInt(value, 10);
18
+ if (Number.isInteger(parsed) && parsed > 0) {
19
+ return Math.min(parsed, MAX_TIMEOUT_MS);
20
+ }
21
+ }
22
+ return DEFAULT_TIMEOUT_MS;
23
+ }
24
+ function normalizeProfile(value) {
25
+ const trimmed = normalizeNonEmptyString(value);
26
+ if (!trimmed) {
27
+ return undefined;
28
+ }
29
+ if (GOLUTRA_PROFILES.includes(trimmed)) {
30
+ return trimmed;
31
+ }
32
+ throw new Error(`Unsupported Golutra profile: ${trimmed}`);
33
+ }
34
+ function getDefaultCliCandidates(platform, homeDirectory) {
35
+ if (platform === "darwin") {
36
+ return [
37
+ "/Applications/Golutra.app/Contents/MacOS/golutra-cli",
38
+ path.join(homeDirectory, "Applications", "Golutra.app", "Contents", "MacOS", "golutra-cli"),
39
+ DEFAULT_CLI_COMMAND
40
+ ];
41
+ }
42
+ return [DEFAULT_CLI_COMMAND];
43
+ }
44
+ export function resolveDefaultCliPath(env, options = {}) {
45
+ const explicitCliPath = normalizeNonEmptyString(env.GOLUTRA_CLI_PATH);
46
+ if (explicitCliPath) {
47
+ return explicitCliPath;
48
+ }
49
+ const platform = options.platform ?? process.platform;
50
+ const homeDirectory = options.homeDirectory ?? homedir();
51
+ const pathExists = options.pathExists ?? existsSync;
52
+ const candidates = getDefaultCliCandidates(platform, homeDirectory);
53
+ return (candidates.find((candidatePath) => path.isAbsolute(candidatePath) && pathExists(candidatePath)) ?? DEFAULT_CLI_COMMAND);
54
+ }
55
+ export function createInitialContext(env) {
56
+ return {
57
+ cliPath: resolveDefaultCliPath(env),
58
+ profile: normalizeProfile(env.GOLUTRA_PROFILE),
59
+ workspacePath: normalizeNonEmptyString(env.GOLUTRA_WORKSPACE_PATH),
60
+ timeoutMs: normalizeTimeout(env.GOLUTRA_COMMAND_TIMEOUT_MS)
61
+ };
62
+ }
63
+ export class ContextStore {
64
+ initialContext;
65
+ context;
66
+ constructor(initialContext) {
67
+ this.initialContext = { ...initialContext };
68
+ this.context = { ...initialContext };
69
+ }
70
+ getSnapshot() {
71
+ return { ...this.context };
72
+ }
73
+ reset() {
74
+ this.context = { ...this.initialContext };
75
+ return this.getSnapshot();
76
+ }
77
+ update(nextValues) {
78
+ const nextContext = {
79
+ cliPath: normalizeNonEmptyString(nextValues.cliPath) ?? this.context.cliPath,
80
+ profile: nextValues.profile ?? this.context.profile,
81
+ workspacePath: normalizeNonEmptyString(nextValues.workspacePath) ??
82
+ this.context.workspacePath,
83
+ timeoutMs: typeof nextValues.timeoutMs === "number"
84
+ ? normalizeTimeout(nextValues.timeoutMs)
85
+ : this.context.timeoutMs
86
+ };
87
+ this.context = nextContext;
88
+ return this.getSnapshot();
89
+ }
90
+ resolveCommandContext(nextValues = {}) {
91
+ return {
92
+ cliPath: normalizeNonEmptyString(nextValues.cliPath) ?? this.context.cliPath,
93
+ profile: nextValues.profile ?? this.context.profile,
94
+ workspacePath: normalizeNonEmptyString(nextValues.workspacePath) ??
95
+ this.context.workspacePath,
96
+ timeoutMs: typeof nextValues.timeoutMs === "number"
97
+ ? normalizeTimeout(nextValues.timeoutMs)
98
+ : this.context.timeoutMs
99
+ };
100
+ }
101
+ requireWorkspacePath(nextValues = {}) {
102
+ const workspacePath = this.resolveCommandContext(nextValues).workspacePath;
103
+ if (!workspacePath) {
104
+ throw new Error("workspacePath is required. Pass it to the tool call or set a default with golutra-set-context.");
105
+ }
106
+ return workspacePath;
107
+ }
108
+ }
109
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/lib/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare class CliExecutionError extends Error {
2
+ readonly cliPath: string;
3
+ readonly args: string[];
4
+ readonly exitCode: number | null;
5
+ readonly stdout: string;
6
+ readonly stderr: string;
7
+ constructor(options: {
8
+ message: string;
9
+ cliPath: string;
10
+ args: string[];
11
+ exitCode: number | null;
12
+ stdout?: string;
13
+ stderr?: string;
14
+ });
15
+ }
@@ -0,0 +1,17 @@
1
+ export class CliExecutionError extends Error {
2
+ cliPath;
3
+ args;
4
+ exitCode;
5
+ stdout;
6
+ stderr;
7
+ constructor(options) {
8
+ super(options.message);
9
+ this.name = "CliExecutionError";
10
+ this.cliPath = options.cliPath;
11
+ this.args = options.args;
12
+ this.exitCode = options.exitCode;
13
+ this.stdout = options.stdout ?? "";
14
+ this.stderr = options.stderr ?? "";
15
+ }
16
+ }
17
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,OAAO,CAAS;IAChB,IAAI,CAAW;IACf,QAAQ,CAAgB;IACxB,MAAM,CAAS;IACf,MAAM,CAAS;IAExB,YAAY,OAOX;QACC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,54 @@
1
+ import type { CliJsonRunner } from "./cli-runner.js";
2
+ import type { ChatConversationsListData, ChatMessagesListData, ChatSendData, CommandContextInput, ListSkillsResponse, RoadmapResultData, RuntimeContextSnapshot, SkillValidationResult, StructuredCommand } from "./types.js";
3
+ declare function buildProfileArgs(profile: RuntimeContextSnapshot["profile"]): string[];
4
+ declare function buildStructuredRunArgs(profile: RuntimeContextSnapshot["profile"], command: StructuredCommand): string[];
5
+ declare function buildSkillsArgs(profile: RuntimeContextSnapshot["profile"], options: {
6
+ skillName?: string | undefined;
7
+ workspacePath?: string | undefined;
8
+ }): string[];
9
+ declare function buildSkillValidateArgs(profile: RuntimeContextSnapshot["profile"], skillPath: string): string[];
10
+ export declare class GolutraCliGateway {
11
+ private readonly runner;
12
+ constructor(runner: CliJsonRunner);
13
+ private executeStructured;
14
+ listConversations(runtimeContext: RuntimeContextSnapshot, input: {
15
+ workspacePath: string;
16
+ userId: string;
17
+ }): Promise<ChatConversationsListData>;
18
+ listMessages(runtimeContext: RuntimeContextSnapshot, input: {
19
+ workspacePath: string;
20
+ conversationId: string;
21
+ limit?: number | undefined;
22
+ beforeId?: string | undefined;
23
+ }): Promise<ChatMessagesListData>;
24
+ sendMessage(runtimeContext: RuntimeContextSnapshot, input: {
25
+ workspacePath: string;
26
+ conversationId: string;
27
+ senderId: string;
28
+ text: string;
29
+ mentionIds: string[];
30
+ }): Promise<ChatSendData>;
31
+ readRoadmap(runtimeContext: RuntimeContextSnapshot, input: {
32
+ workspacePath: string;
33
+ conversationId?: string | undefined;
34
+ }): Promise<RoadmapResultData>;
35
+ updateRoadmap(runtimeContext: RuntimeContextSnapshot, input: {
36
+ workspacePath: string;
37
+ conversationId?: string | undefined;
38
+ readOnly?: boolean | undefined;
39
+ roadmap: {
40
+ objective: string;
41
+ tasks: Array<{
42
+ id: number;
43
+ number?: string | undefined;
44
+ title: string;
45
+ status: "pending" | "in-progress" | "done";
46
+ pinned?: boolean | undefined;
47
+ }>;
48
+ };
49
+ }): Promise<RoadmapResultData>;
50
+ listSkills(runtimeContext: RuntimeContextSnapshot, input: Pick<CommandContextInput, "workspacePath">): Promise<ListSkillsResponse>;
51
+ getSkill(runtimeContext: RuntimeContextSnapshot, skillName: string): Promise<Record<string, unknown>>;
52
+ validateSkill(runtimeContext: RuntimeContextSnapshot, skillPath: string): Promise<SkillValidationResult>;
53
+ }
54
+ export { buildProfileArgs, buildSkillValidateArgs, buildSkillsArgs, buildStructuredRunArgs };
@@ -0,0 +1,131 @@
1
+ import { CliExecutionError } from "./errors.js";
2
+ function buildProfileArgs(profile) {
3
+ return profile ? ["--profile", profile] : [];
4
+ }
5
+ function buildStructuredRunArgs(profile, command) {
6
+ return [
7
+ ...buildProfileArgs(profile),
8
+ "run",
9
+ "--command",
10
+ JSON.stringify(command)
11
+ ];
12
+ }
13
+ function buildSkillsArgs(profile, options) {
14
+ const args = [...buildProfileArgs(profile), "skills"];
15
+ if (options.workspacePath) {
16
+ args.push("--workspace", options.workspacePath);
17
+ }
18
+ if (options.skillName) {
19
+ args.push(options.skillName);
20
+ }
21
+ return args;
22
+ }
23
+ function buildSkillValidateArgs(profile, skillPath) {
24
+ return [...buildProfileArgs(profile), "skill-validate", skillPath];
25
+ }
26
+ export class GolutraCliGateway {
27
+ runner;
28
+ constructor(runner) {
29
+ this.runner = runner;
30
+ }
31
+ async executeStructured(command, runtimeContext) {
32
+ const response = await this.runner.executeJson({
33
+ cliPath: runtimeContext.cliPath,
34
+ args: buildStructuredRunArgs(runtimeContext.profile, command),
35
+ timeoutMs: runtimeContext.timeoutMs
36
+ });
37
+ if (!response.ok || response.result?.status !== "ok") {
38
+ throw new CliExecutionError({
39
+ message: response.error ??
40
+ response.result?.message ??
41
+ "golutra-cli returned an unsuccessful command result",
42
+ cliPath: runtimeContext.cliPath,
43
+ args: buildStructuredRunArgs(runtimeContext.profile, command),
44
+ exitCode: 1
45
+ });
46
+ }
47
+ return (response.result?.data ?? {});
48
+ }
49
+ async listConversations(runtimeContext, input) {
50
+ return this.executeStructured({
51
+ type: "chat.conversations.list",
52
+ payload: {
53
+ workspacePath: input.workspacePath,
54
+ userId: input.userId
55
+ }
56
+ }, runtimeContext);
57
+ }
58
+ async listMessages(runtimeContext, input) {
59
+ const payload = {
60
+ type: "chat.messages.list",
61
+ payload: {
62
+ workspacePath: input.workspacePath,
63
+ conversationId: input.conversationId,
64
+ ...(typeof input.limit === "number" ? { limit: input.limit } : {}),
65
+ ...(input.beforeId ? { beforeId: input.beforeId } : {})
66
+ }
67
+ };
68
+ return this.executeStructured(payload, runtimeContext);
69
+ }
70
+ async sendMessage(runtimeContext, input) {
71
+ return this.executeStructured({
72
+ type: "chat.send",
73
+ payload: {
74
+ workspacePath: input.workspacePath,
75
+ conversationId: input.conversationId,
76
+ senderId: input.senderId,
77
+ text: input.text,
78
+ mentionIds: input.mentionIds
79
+ }
80
+ }, runtimeContext);
81
+ }
82
+ async readRoadmap(runtimeContext, input) {
83
+ const payload = {
84
+ type: "roadmap.read",
85
+ payload: {
86
+ workspacePath: input.workspacePath,
87
+ ...(input.conversationId ? { conversationId: input.conversationId } : {})
88
+ }
89
+ };
90
+ return this.executeStructured(payload, runtimeContext);
91
+ }
92
+ async updateRoadmap(runtimeContext, input) {
93
+ const payload = {
94
+ type: "roadmap.update",
95
+ payload: {
96
+ workspacePath: input.workspacePath,
97
+ ...(input.conversationId ? { conversationId: input.conversationId } : {}),
98
+ ...(typeof input.readOnly === "boolean" ? { readOnly: input.readOnly } : {}),
99
+ roadmap: input.roadmap
100
+ }
101
+ };
102
+ return this.executeStructured(payload, runtimeContext);
103
+ }
104
+ async listSkills(runtimeContext, input) {
105
+ return this.runner.executeJson({
106
+ cliPath: runtimeContext.cliPath,
107
+ args: buildSkillsArgs(runtimeContext.profile, {
108
+ ...(input.workspacePath ? { workspacePath: input.workspacePath } : {})
109
+ }),
110
+ timeoutMs: runtimeContext.timeoutMs
111
+ });
112
+ }
113
+ async getSkill(runtimeContext, skillName) {
114
+ return this.runner.executeJson({
115
+ cliPath: runtimeContext.cliPath,
116
+ args: buildSkillsArgs(runtimeContext.profile, {
117
+ skillName
118
+ }),
119
+ timeoutMs: runtimeContext.timeoutMs
120
+ });
121
+ }
122
+ async validateSkill(runtimeContext, skillPath) {
123
+ return this.runner.executeJson({
124
+ cliPath: runtimeContext.cliPath,
125
+ args: buildSkillValidateArgs(runtimeContext.profile, skillPath),
126
+ timeoutMs: runtimeContext.timeoutMs
127
+ });
128
+ }
129
+ }
130
+ export { buildProfileArgs, buildSkillValidateArgs, buildSkillsArgs, buildStructuredRunArgs };
131
+ //# sourceMappingURL=golutra-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"golutra-client.js","sourceRoot":"","sources":["../../src/lib/golutra-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ListSkillsResponse, ProjectSkillDescriptor } from "./types.js";
2
+ export interface ProjectSkillDocument extends ProjectSkillDescriptor {
3
+ content: string;
4
+ }
5
+ export declare function findProjectSkillByName(skillsResponse: ListSkillsResponse, skillName: string): ProjectSkillDescriptor;
6
+ export declare function readProjectSkillDocument(projectSkill: ProjectSkillDescriptor): Promise<ProjectSkillDocument>;
@@ -0,0 +1,22 @@
1
+ import { readFile } from "node:fs/promises";
2
+ export function findProjectSkillByName(skillsResponse, skillName) {
3
+ const projectSkills = skillsResponse.projectSkills ?? [];
4
+ if (projectSkills.length === 0) {
5
+ throw new Error("No project skills were found for this workspace. Run golutra-list-project-skills first to verify discovery.");
6
+ }
7
+ const matchedSkill = projectSkills.find((projectSkill) => projectSkill.name === skillName);
8
+ if (!matchedSkill) {
9
+ throw new Error(`Project skill "${skillName}" was not found. Available project skills: ${projectSkills
10
+ .map((projectSkill) => projectSkill.name)
11
+ .join(", ")}`);
12
+ }
13
+ return matchedSkill;
14
+ }
15
+ export async function readProjectSkillDocument(projectSkill) {
16
+ const content = await readFile(projectSkill.skillMdPath, "utf8");
17
+ return {
18
+ ...projectSkill,
19
+ content
20
+ };
21
+ }
22
+ //# sourceMappingURL=project-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-skills.js","sourceRoot":"","sources":["../../src/lib/project-skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAW5C,MAAM,UAAU,sBAAsB,CACpC,cAAkC,EAClC,SAAiB;IAEjB,MAAM,aAAa,GAAG,cAAc,CAAC,aAAa,IAAI,EAAE,CAAC;IACzD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,6GAA6G,CAC9G,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAC3F,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,kBAAkB,SAAS,8CAA8C,aAAa;aACnF,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;aACxC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,YAAoC;IAEpC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACjE,OAAO;QACL,GAAG,YAAY;QACf,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare function buildToolSuccess<T extends object>(summary: string, structuredContent: T): {
2
+ content: Array<{
3
+ type: "text";
4
+ text: string;
5
+ }>;
6
+ structuredContent: Record<string, unknown>;
7
+ };
8
+ export declare function buildToolError(error: unknown): {
9
+ content: Array<{
10
+ type: "text";
11
+ text: string;
12
+ }>;
13
+ structuredContent: Record<string, unknown>;
14
+ isError: true;
15
+ };
@@ -0,0 +1,58 @@
1
+ import { CliExecutionError } from "./errors.js";
2
+ function toPrettyJson(value) {
3
+ return JSON.stringify(value, null, 2);
4
+ }
5
+ export function buildToolSuccess(summary, structuredContent) {
6
+ const normalizedStructuredContent = {
7
+ ...structuredContent
8
+ };
9
+ return {
10
+ content: [
11
+ {
12
+ type: "text",
13
+ text: `${summary}\n\n${toPrettyJson(normalizedStructuredContent)}`
14
+ }
15
+ ],
16
+ structuredContent: normalizedStructuredContent
17
+ };
18
+ }
19
+ export function buildToolError(error) {
20
+ const structuredContent = buildErrorContent(error);
21
+ const message = typeof structuredContent.message === "string"
22
+ ? structuredContent.message
23
+ : String(error);
24
+ return {
25
+ content: [
26
+ {
27
+ type: "text",
28
+ text: `Error: ${message}\n\n${toPrettyJson(structuredContent)}`
29
+ }
30
+ ],
31
+ structuredContent,
32
+ isError: true
33
+ };
34
+ }
35
+ function buildErrorContent(error) {
36
+ if (error instanceof CliExecutionError) {
37
+ return {
38
+ type: error.name,
39
+ message: error.message,
40
+ cliPath: error.cliPath,
41
+ args: error.args,
42
+ exitCode: error.exitCode,
43
+ stdout: error.stdout,
44
+ stderr: error.stderr
45
+ };
46
+ }
47
+ if (error instanceof Error) {
48
+ return {
49
+ type: error.name,
50
+ message: error.message
51
+ };
52
+ }
53
+ return {
54
+ type: "UnknownError",
55
+ message: String(error)
56
+ };
57
+ }
58
+ //# sourceMappingURL=tool-results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-results.js","sourceRoot":"","sources":["../../src/lib/tool-results.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,iBAAoB;IAKpB,MAAM,2BAA2B,GAAG;QAClC,GAAG,iBAAiB;KACM,CAAC;IAE7B,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,GAAG,OAAO,OAAO,YAAY,CAAC,2BAA2B,CAAC,EAAE;aACnE;SACF;QACD,iBAAiB,EAAE,2BAA2B;KAC/C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAK3C,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,OAAO,GACX,OAAO,iBAAiB,CAAC,OAAO,KAAK,QAAQ;QAC3C,CAAC,CAAC,iBAAiB,CAAC,OAAO;QAC3B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEpB,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU,OAAO,OAAO,YAAY,CAAC,iBAAiB,CAAC,EAAE;aAChE;SACF;QACD,iBAAiB;QACjB,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;QACvC,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ContextStore } from "./context.js";
3
+ import type { GolutraCliGateway } from "./golutra-client.js";
4
+ export declare function registerTools(server: McpServer, contextStore: ContextStore, gateway: GolutraCliGateway): void;