@agent-deck/backend 1.7.0 โ†’ 1.7.1

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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-stdio.d.ts","sourceRoot":"","sources":["../src/mcp-stdio.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-stdio.js","sourceRoot":"","sources":["../src/mcp-stdio.ts"],"names":[],"mappings":";;AAAA,wEAAiF;AACjF,mDAAqD;AAErD;;;GAGG;AACH,KAAK,UAAU,mBAAmB;IAChC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,uBAAuB,CAAC;IACjF,MAAM,IAAI,GAAG,IAAI,kCAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,mBAAmB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACpC,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Playbook } from '@agent-deck/shared';
2
+ export declare class PlaybookParseError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ /** Parse a minimal YAML-like frontmatter block (no external YAML dependency). */
6
+ export declare function parseSimpleFrontmatter(block: string): Record<string, string | string[]>;
7
+ export declare function parsePlaybookFile(content: string, filePath: string): Playbook;
8
+ //# sourceMappingURL=playbook-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-parser.d.ts","sourceRoot":"","sources":["../../src/playbooks/playbook-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAGT,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,iFAAiF;AACjF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAsCvF;AAMD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CA4B7E"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PlaybookParseError = void 0;
4
+ exports.parseSimpleFrontmatter = parseSimpleFrontmatter;
5
+ exports.parsePlaybookFile = parsePlaybookFile;
6
+ const shared_1 = require("@agent-deck/shared");
7
+ class PlaybookParseError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = 'PlaybookParseError';
11
+ }
12
+ }
13
+ exports.PlaybookParseError = PlaybookParseError;
14
+ /** Parse a minimal YAML-like frontmatter block (no external YAML dependency). */
15
+ function parseSimpleFrontmatter(block) {
16
+ const result = {};
17
+ let currentListKey = null;
18
+ for (const rawLine of block.split('\n')) {
19
+ const line = rawLine.trimEnd();
20
+ if (!line.trim()) {
21
+ continue;
22
+ }
23
+ const listMatch = line.match(/^\s+-\s+(.+)$/);
24
+ if (listMatch && currentListKey) {
25
+ const list = result[currentListKey];
26
+ if (Array.isArray(list)) {
27
+ list.push(stripQuotes(listMatch[1].trim()));
28
+ }
29
+ continue;
30
+ }
31
+ const kvMatch = line.match(/^([\w-]+):\s*(.*)$/);
32
+ if (!kvMatch) {
33
+ continue;
34
+ }
35
+ const [, key, rawValue] = kvMatch;
36
+ const value = rawValue.trim();
37
+ if (!value) {
38
+ currentListKey = key;
39
+ result[key] = [];
40
+ continue;
41
+ }
42
+ currentListKey = null;
43
+ result[key] = stripQuotes(value);
44
+ }
45
+ return result;
46
+ }
47
+ function stripQuotes(value) {
48
+ return value.replace(/^["']|["']$/g, '');
49
+ }
50
+ function parsePlaybookFile(content, filePath) {
51
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
52
+ if (!match) {
53
+ throw new PlaybookParseError(`Missing YAML frontmatter in ${filePath}`);
54
+ }
55
+ const [, frontmatterBlock, body] = match;
56
+ const raw = parseSimpleFrontmatter(frontmatterBlock);
57
+ const frontmatter = shared_1.PlaybookFrontmatterSchema.parse({
58
+ id: raw.id,
59
+ triggers: Array.isArray(raw.triggers) ? raw.triggers : [],
60
+ connections: Array.isArray(raw.connections) ? raw.connections : [],
61
+ exec: typeof raw.exec === 'string' ? raw.exec : undefined,
62
+ skill: typeof raw.skill === 'string' ? raw.skill : undefined,
63
+ });
64
+ const source = filePath.includes('.agent-deck/playbooks')
65
+ ? 'repo'
66
+ : 'global';
67
+ return {
68
+ id: frontmatter.id,
69
+ path: filePath,
70
+ triggers: frontmatter.triggers,
71
+ source,
72
+ frontmatter,
73
+ body: body.trim(),
74
+ };
75
+ }
76
+ //# sourceMappingURL=playbook-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-parser.js","sourceRoot":"","sources":["../../src/playbooks/playbook-parser.ts"],"names":[],"mappings":";;;AAcA,wDAsCC;AAMD,8CA4BC;AAtFD,+CAI4B;AAE5B,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC;AAED,iFAAiF;AACjF,SAAgB,sBAAsB,CAAC,KAAa;IAClD,MAAM,MAAM,GAAsC,EAAE,CAAC;IACrD,IAAI,cAAc,GAAkB,IAAI,CAAC;IAEzC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC9C,IAAI,SAAS,IAAI,cAAc,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAE9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,cAAc,GAAG,GAAG,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,cAAc,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAAe,EAAE,QAAgB;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC1E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,kBAAkB,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IACzC,MAAM,GAAG,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,kCAAyB,CAAC,KAAK,CAAC;QAClD,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;QACzD,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;QAClE,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QACzD,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC,CAAC;IAEH,MAAM,MAAM,GAA8B,QAAQ,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAClF,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,QAAQ,CAAC;IAEb,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,EAAE;QAClB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,MAAM;QACN,WAAW;QACX,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Playbook, PlaybookSummary } from '@agent-deck/shared';
2
+ export declare function getGlobalPlaybooksDir(): string;
3
+ export declare function discoverPlaybookPaths(workspaceRoot?: string): Promise<Array<{
4
+ filePath: string;
5
+ source: PlaybookSummary['source'];
6
+ }>>;
7
+ export declare function listPlaybooks(workspaceRoot?: string): Promise<PlaybookSummary[]>;
8
+ export declare function getPlaybook(playbookId: string, workspaceRoot?: string): Promise<Playbook | null>;
9
+ //# sourceMappingURL=playbook-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-service.d.ts","sourceRoot":"","sources":["../../src/playbooks/playbook-service.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EACR,eAAe,EAEhB,MAAM,oBAAoB,CAAC;AAK5B,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AA8CD,wBAAsB,qBAAqB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;CACnC,CAAC,CAAC,CA4BF;AAED,wBAAsB,aAAa,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAiBtF;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAW1B"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getGlobalPlaybooksDir = getGlobalPlaybooksDir;
7
+ exports.discoverPlaybookPaths = discoverPlaybookPaths;
8
+ exports.listPlaybooks = listPlaybooks;
9
+ exports.getPlaybook = getPlaybook;
10
+ const promises_1 = __importDefault(require("node:fs/promises"));
11
+ const node_path_1 = __importDefault(require("node:path"));
12
+ const shared_1 = require("@agent-deck/shared");
13
+ const yaml_sync_1 = require("../vault/yaml-sync");
14
+ const repo_deck_1 = require("../scope/repo-deck");
15
+ const playbook_parser_1 = require("./playbook-parser");
16
+ function getGlobalPlaybooksDir() {
17
+ return node_path_1.default.join((0, yaml_sync_1.getAgentDeckHome)(), 'playbooks');
18
+ }
19
+ async function pathExists(filePath) {
20
+ try {
21
+ await promises_1.default.access(filePath);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ async function listMarkdownFiles(dir) {
29
+ if (!(await pathExists(dir))) {
30
+ return [];
31
+ }
32
+ const entries = await promises_1.default.readdir(dir, { withFileTypes: true });
33
+ return entries
34
+ .filter((entry) => entry.isFile() && entry.name.endsWith('.md'))
35
+ .map((entry) => node_path_1.default.join(dir, entry.name));
36
+ }
37
+ function resolvePlaybookPath(workspaceRoot, playbookPath) {
38
+ if (node_path_1.default.isAbsolute(playbookPath)) {
39
+ return playbookPath;
40
+ }
41
+ return node_path_1.default.join(node_path_1.default.resolve(workspaceRoot), playbookPath);
42
+ }
43
+ async function loadPlaybookFromFile(filePath, source) {
44
+ try {
45
+ const content = await promises_1.default.readFile(filePath, 'utf8');
46
+ const playbook = (0, playbook_parser_1.parsePlaybookFile)(content, filePath);
47
+ return { ...playbook, source };
48
+ }
49
+ catch (error) {
50
+ if (error instanceof playbook_parser_1.PlaybookParseError) {
51
+ console.warn(error.message);
52
+ return null;
53
+ }
54
+ throw error;
55
+ }
56
+ }
57
+ async function discoverPlaybookPaths(workspaceRoot) {
58
+ const discovered = new Map();
59
+ const addPath = (filePath, source) => {
60
+ const resolved = node_path_1.default.resolve(filePath);
61
+ if (!discovered.has(resolved)) {
62
+ discovered.set(resolved, { filePath: resolved, source });
63
+ }
64
+ };
65
+ if (workspaceRoot) {
66
+ const manifest = await (0, repo_deck_1.loadRepoDeckManifest)(workspaceRoot);
67
+ for (const playbookPath of manifest?.playbooks ?? []) {
68
+ addPath(resolvePlaybookPath(workspaceRoot, playbookPath), 'repo');
69
+ }
70
+ const repoDir = node_path_1.default.join(node_path_1.default.resolve(workspaceRoot), shared_1.REPO_PLAYBOOKS_DIR);
71
+ for (const filePath of await listMarkdownFiles(repoDir)) {
72
+ addPath(filePath, 'repo');
73
+ }
74
+ }
75
+ const globalDir = getGlobalPlaybooksDir();
76
+ for (const filePath of await listMarkdownFiles(globalDir)) {
77
+ addPath(filePath, 'global');
78
+ }
79
+ return [...discovered.values()];
80
+ }
81
+ async function listPlaybooks(workspaceRoot) {
82
+ const paths = await discoverPlaybookPaths(workspaceRoot);
83
+ const summaries = [];
84
+ for (const { filePath, source } of paths) {
85
+ const playbook = await loadPlaybookFromFile(filePath, source);
86
+ if (playbook) {
87
+ summaries.push({
88
+ id: playbook.id,
89
+ path: playbook.path,
90
+ triggers: playbook.triggers,
91
+ source: playbook.source,
92
+ });
93
+ }
94
+ }
95
+ return summaries.sort((a, b) => a.id.localeCompare(b.id));
96
+ }
97
+ async function getPlaybook(playbookId, workspaceRoot) {
98
+ const paths = await discoverPlaybookPaths(workspaceRoot);
99
+ for (const { filePath, source } of paths) {
100
+ const playbook = await loadPlaybookFromFile(filePath, source);
101
+ if (playbook?.id === playbookId) {
102
+ return playbook;
103
+ }
104
+ }
105
+ return null;
106
+ }
107
+ //# sourceMappingURL=playbook-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-service.js","sourceRoot":"","sources":["../../src/playbooks/playbook-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { BindingEntry } from '@agent-deck/shared';
2
+ /** Write workspace-keyed binding for terminal status line; prune orphaned MCP session UUID keys. */
3
+ export declare function upsertWorkspaceDisplayBinding(workspaceRoot: string, entry: BindingEntry): Promise<void>;
4
+ export declare function readBindingForDisplay(options: {
5
+ sessionId?: string;
6
+ workspaceRoot: string;
7
+ }): Promise<BindingEntry | null>;
8
+ export declare function readBindingForWorkspace(workspaceRoot: string): Promise<BindingEntry | null>;
9
+ //# sourceMappingURL=bindings-sidecar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindings-sidecar.d.ts","sourceRoot":"","sources":["../../src/scope/bindings-sidecar.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EASb,MAAM,oBAAoB,CAAC;AAoC5B,oGAAoG;AACpG,wBAAsB,6BAA6B,CACjD,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAG/B;AAED,wBAAsB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAGjG"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.upsertWorkspaceDisplayBinding = upsertWorkspaceDisplayBinding;
7
+ exports.readBindingForDisplay = readBindingForDisplay;
8
+ exports.readBindingForWorkspace = readBindingForWorkspace;
9
+ const promises_1 = __importDefault(require("node:fs/promises"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const shared_1 = require("@agent-deck/shared");
12
+ async function readBindingsFile() {
13
+ const merged = {};
14
+ for (const filePath of (0, shared_1.listBindingsFileCandidates)()) {
15
+ try {
16
+ const raw = await promises_1.default.readFile(filePath, 'utf8');
17
+ const parsed = shared_1.BindingsFileSchema.safeParse(JSON.parse(raw));
18
+ if (parsed.success) {
19
+ Object.assign(merged, parsed.data);
20
+ }
21
+ }
22
+ catch (error) {
23
+ if (error.code !== 'ENOENT') {
24
+ throw error;
25
+ }
26
+ }
27
+ }
28
+ return merged;
29
+ }
30
+ async function writeBindingsFile(bindings) {
31
+ const filePath = (0, shared_1.resolveBindingsFilePath)();
32
+ await promises_1.default.mkdir(node_path_1.default.dirname(filePath), { recursive: true });
33
+ await promises_1.default.writeFile(filePath, `${JSON.stringify(bindings, null, 2)}\n`, 'utf8');
34
+ }
35
+ function pruneLegacySessionKeys(bindings) {
36
+ for (const key of Object.keys(bindings)) {
37
+ if ((0, shared_1.isBindingSidecarSessionKey)(key)) {
38
+ delete bindings[key];
39
+ }
40
+ }
41
+ }
42
+ /** Write workspace-keyed binding for terminal status line; prune orphaned MCP session UUID keys. */
43
+ async function upsertWorkspaceDisplayBinding(workspaceRoot, entry) {
44
+ const bindings = await readBindingsFile();
45
+ bindings[(0, shared_1.normalizeWorkspaceRoot)(workspaceRoot)] = entry;
46
+ pruneLegacySessionKeys(bindings);
47
+ await writeBindingsFile(bindings);
48
+ }
49
+ async function readBindingForDisplay(options) {
50
+ const bindings = await readBindingsFile();
51
+ return (0, shared_1.resolveBindingEntry)(bindings, options);
52
+ }
53
+ async function readBindingForWorkspace(workspaceRoot) {
54
+ const bindings = await readBindingsFile();
55
+ return (0, shared_1.lookupWorkspaceBinding)(bindings, workspaceRoot);
56
+ }
57
+ //# sourceMappingURL=bindings-sidecar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindings-sidecar.js","sourceRoot":"","sources":["../../src/scope/bindings-sidecar.ts"],"names":[],"mappings":";;;;;AAiDA,sEAQC;AAED,sDAMC;AAED,0DAGC;AAtED,gEAAkC;AAClC,0DAA6B;AAC7B,+CAU4B;AAE5B,KAAK,UAAU,gBAAgB;IAC7B,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,KAAK,MAAM,QAAQ,IAAI,IAAA,mCAA0B,GAAE,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,2BAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAsB;IACrD,MAAM,QAAQ,GAAG,IAAA,gCAAuB,GAAE,CAAC;IAC3C,MAAM,kBAAE,CAAC,KAAK,CAAC,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAsB;IACpD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,IAAI,IAAA,mCAA0B,EAAC,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED,oGAAoG;AAC7F,KAAK,UAAU,6BAA6B,CACjD,aAAqB,EACrB,KAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC1C,QAAQ,CAAC,IAAA,+BAAsB,EAAC,aAAa,CAAC,CAAC,GAAG,KAAK,CAAC;IACxD,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAEM,KAAK,UAAU,qBAAqB,CAAC,OAG3C;IACC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC1C,OAAO,IAAA,4BAAmB,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAEM,KAAK,UAAU,uBAAuB,CAAC,aAAqB;IACjE,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC1C,OAAO,IAAA,+BAAsB,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { RepoDeckManifest } from '@agent-deck/shared';
2
+ export declare class RepoDeckManifestError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ /** Lightweight parser โ€” avoids a YAML dependency for the single-field MVP manifest. */
6
+ export declare function parseRepoDeckManifest(content: string): RepoDeckManifest;
7
+ export declare function repoDeckManifestFilePath(workspaceRoot: string): string;
8
+ export declare function loadRepoDeckManifest(workspaceRoot: string): Promise<RepoDeckManifest | null>;
9
+ export declare function formatRepoDeckManifest(deckId: string, name?: string): string;
10
+ //# sourceMappingURL=repo-deck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-deck.d.ts","sourceRoot":"","sources":["../../src/scope/repo-deck.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAmD,MAAM,oBAAoB,CAAC;AAEvG,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAavE;AAED,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAsB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAiBlG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAS5E"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RepoDeckManifestError = void 0;
7
+ exports.parseRepoDeckManifest = parseRepoDeckManifest;
8
+ exports.repoDeckManifestFilePath = repoDeckManifestFilePath;
9
+ exports.loadRepoDeckManifest = loadRepoDeckManifest;
10
+ exports.formatRepoDeckManifest = formatRepoDeckManifest;
11
+ const promises_1 = __importDefault(require("node:fs/promises"));
12
+ const node_path_1 = __importDefault(require("node:path"));
13
+ const shared_1 = require("@agent-deck/shared");
14
+ class RepoDeckManifestError extends Error {
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = 'RepoDeckManifestError';
18
+ }
19
+ }
20
+ exports.RepoDeckManifestError = RepoDeckManifestError;
21
+ /** Lightweight parser โ€” avoids a YAML dependency for the single-field MVP manifest. */
22
+ function parseRepoDeckManifest(content) {
23
+ const deckIdMatch = content.match(/^deck_id:\s*["']?([0-9a-f-]{36})["']?\s*$/im);
24
+ if (!deckIdMatch) {
25
+ throw new RepoDeckManifestError('deck_id is required in .agent-deck/deck.yaml');
26
+ }
27
+ const nameMatch = content.match(/^name:\s*["']?(.+?)["']?\s*$/im);
28
+ const raw = {
29
+ deck_id: deckIdMatch[1],
30
+ ...(nameMatch ? { name: nameMatch[1].trim() } : {}),
31
+ };
32
+ return shared_1.RepoDeckManifestSchema.parse(raw);
33
+ }
34
+ function repoDeckManifestFilePath(workspaceRoot) {
35
+ return node_path_1.default.join(node_path_1.default.resolve(workspaceRoot), shared_1.REPO_DECK_MANIFEST_PATH);
36
+ }
37
+ async function loadRepoDeckManifest(workspaceRoot) {
38
+ const filePath = repoDeckManifestFilePath(workspaceRoot);
39
+ try {
40
+ const content = await promises_1.default.readFile(filePath, 'utf8');
41
+ return parseRepoDeckManifest(content);
42
+ }
43
+ catch (error) {
44
+ if (error.code === 'ENOENT') {
45
+ return null;
46
+ }
47
+ if (error instanceof RepoDeckManifestError) {
48
+ throw error;
49
+ }
50
+ throw new RepoDeckManifestError(error instanceof Error ? error.message : 'Failed to read .agent-deck/deck.yaml');
51
+ }
52
+ }
53
+ function formatRepoDeckManifest(deckId, name) {
54
+ const lines = [
55
+ '# Link this repo to an Agent Deck (copy to .agent-deck/deck.yaml in your project)',
56
+ `deck_id: ${deckId}`,
57
+ ];
58
+ if (name) {
59
+ lines.push(`name: ${name}`);
60
+ }
61
+ return lines.join('\n') + '\n';
62
+ }
63
+ //# sourceMappingURL=repo-deck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-deck.js","sourceRoot":"","sources":["../../src/scope/repo-deck.ts"],"names":[],"mappings":";;;;;;AAYA,sDAaC;AAED,4DAEC;AAED,oDAiBC;AAED,wDASC;AA3DD,gEAAkC;AAClC,0DAA6B;AAC7B,+CAAuG;AAEvG,MAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AALD,sDAKC;AAED,uFAAuF;AACvF,SAAgB,qBAAqB,CAAC,OAAe;IACnD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,qBAAqB,CAAC,8CAA8C,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG;QACV,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;QACvB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC;IAEF,OAAO,+BAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,SAAgB,wBAAwB,CAAC,aAAqB;IAC5D,OAAO,mBAAI,CAAC,IAAI,CAAC,mBAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,gCAAuB,CAAC,CAAC;AACzE,CAAC;AAEM,KAAK,UAAU,oBAAoB,CAAC,aAAqB;IAC9D,MAAM,QAAQ,GAAG,wBAAwB,CAAC,aAAa,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpD,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;YAC3C,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,IAAI,qBAAqB,CAC7B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAChF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAgB,sBAAsB,CAAC,MAAc,EAAE,IAAa;IAClE,MAAM,KAAK,GAAG;QACZ,mFAAmF;QACnF,YAAY,MAAM,EAAE;KACrB,CAAC;IACF,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env tsx
2
+ export {};
3
+ //# sourceMappingURL=test-local-mcp-e2e.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-local-mcp-e2e.d.ts","sourceRoot":"","sources":["../src/test-local-mcp-e2e.ts"],"names":[],"mappings":""}
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env tsx
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const local_mcp_server_manager_1 = require("./services/local-mcp-server-manager");
5
+ const config_manager_1 = require("./services/config-manager");
6
+ const service_manager_1 = require("./services/service-manager");
7
+ const mcp_client_manager_1 = require("./services/mcp-client-manager");
8
+ const oauth_manager_1 = require("./services/oauth-manager");
9
+ const database_1 = require("./models/database");
10
+ async function testLocalMCPServerE2E() {
11
+ console.log('๐Ÿงช Testing Local MCP Server End-to-End Flow...\n');
12
+ // Initialize managers
13
+ const db = new database_1.DatabaseManager();
14
+ const configManager = new config_manager_1.ConfigManager();
15
+ const localManager = new local_mcp_server_manager_1.LocalMCPServerManager();
16
+ // Create MCP client manager with local server manager
17
+ const mcpClient = new mcp_client_manager_1.MCPClientManager();
18
+ mcpClient.localServerManager = localManager;
19
+ // Create OAuth manager (required by ServiceManager)
20
+ const oauthManager = new oauth_manager_1.OAuthManager();
21
+ const serviceManager = new service_manager_1.ServiceManager(db, mcpClient, oauthManager);
22
+ try {
23
+ // Test 1: Import local servers from configuration
24
+ console.log('๐Ÿ“‹ Test 1: Importing local servers from configuration...');
25
+ const config = {
26
+ mcpServers: {
27
+ memory: {
28
+ command: 'npx',
29
+ args: ['-y', '@modelcontextprotocol/server-memory']
30
+ }
31
+ }
32
+ };
33
+ const services = await serviceManager.importLocalServersFromConfig(JSON.stringify(config));
34
+ console.log('โœ… Imported services:', services.length);
35
+ services.forEach(service => {
36
+ console.log(` - ${service.name} (${service.id}): ${service.localCommand} ${service.localArgs?.join(' ')}`);
37
+ });
38
+ if (services.length === 0) {
39
+ throw new Error('No services were imported');
40
+ }
41
+ const memoryService = services[0];
42
+ // Test 2: Start the local MCP server
43
+ console.log('\n๐Ÿ“‹ Test 2: Starting local MCP server...');
44
+ await serviceManager.startLocalServer(memoryService.id);
45
+ console.log('โœ… Local MCP server started');
46
+ // Test 3: Discover tools (using unified API)
47
+ console.log('\n๐Ÿ“‹ Test 3: Discovering tools (unified API)...');
48
+ const tools = await serviceManager.discoverServiceTools(memoryService.id);
49
+ console.log('โœ… Discovered tools:', tools.length);
50
+ tools.forEach(tool => {
51
+ console.log(` - ${tool.name}: ${tool.description}`);
52
+ });
53
+ if (tools.length === 0) {
54
+ console.log('โš ๏ธ No tools discovered - this might be normal for some servers');
55
+ }
56
+ // Test 4: Call a tool (using unified API)
57
+ console.log('\n๐Ÿ“‹ Test 4: Calling tool (unified API)...');
58
+ if (tools.length > 0) {
59
+ const firstTool = tools[0];
60
+ console.log(` Calling tool: ${firstTool.name}`);
61
+ try {
62
+ const result = await serviceManager.callServiceTool(memoryService.id, firstTool.name, {});
63
+ console.log('โœ… Tool call result:', result);
64
+ }
65
+ catch (error) {
66
+ console.log('โš ๏ธ Tool call failed (this might be expected):', error.message);
67
+ }
68
+ }
69
+ else {
70
+ console.log('โš ๏ธ Skipping tool call - no tools available');
71
+ }
72
+ // Test 5: Check service health (using unified API)
73
+ console.log('\n๐Ÿ“‹ Test 5: Checking service health (unified API)...');
74
+ const health = await serviceManager.checkServiceHealth(memoryService.id);
75
+ console.log('โœ… Service health:', health);
76
+ // Test 6: Get local server status
77
+ console.log('\n๐Ÿ“‹ Test 6: Getting local server status...');
78
+ const status = await serviceManager.getLocalServerStatus(memoryService.id);
79
+ console.log('โœ… Local server status:', status);
80
+ // Test 7: Stop the local MCP server
81
+ console.log('\n๐Ÿ“‹ Test 7: Stopping local MCP server...');
82
+ await serviceManager.stopLocalServer(memoryService.id);
83
+ console.log('โœ… Local MCP server stopped');
84
+ // Test 8: Verify server is stopped
85
+ console.log('\n๐Ÿ“‹ Test 8: Verifying server is stopped...');
86
+ const finalStatus = await serviceManager.getLocalServerStatus(memoryService.id);
87
+ console.log('โœ… Final status:', finalStatus);
88
+ console.log('\n๐ŸŽ‰ All end-to-end tests passed! Local MCP server integration is working correctly.');
89
+ }
90
+ catch (error) {
91
+ console.error('โŒ End-to-end test failed:', error);
92
+ process.exit(1);
93
+ }
94
+ finally {
95
+ // Cleanup
96
+ console.log('\n๐Ÿงน Cleaning up...');
97
+ await localManager.cleanup();
98
+ await db.close();
99
+ console.log('โœ… Cleanup completed');
100
+ }
101
+ }
102
+ // Run the end-to-end test
103
+ testLocalMCPServerE2E().catch(console.error);
104
+ //# sourceMappingURL=test-local-mcp-e2e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-local-mcp-e2e.js","sourceRoot":"","sources":["../src/test-local-mcp-e2e.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-deck/backend",
3
- "version": "1.7.0",
3
+ "version": "1.7.1",
4
4
  "description": "Agent Deck backend API, MCP server, and vault",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -46,7 +46,7 @@
46
46
  "prepublishOnly": "node ../../scripts/pre-publish-check.mjs && npm run build"
47
47
  },
48
48
  "dependencies": {
49
- "@agent-deck/shared": "^1.7.0",
49
+ "@agent-deck/shared": "^1.7.1",
50
50
  "@fastify/cors": "^10.0.0",
51
51
  "@fastify/static": "^8.0.0",
52
52
  "@fastify/websocket": "^11.2.0",