@devflow-tools/sdk 0.16.8 → 0.16.9

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/dist/index.d.ts CHANGED
@@ -11,6 +11,9 @@ export * from "./data/LocalDataProvider.js";
11
11
  export * from "./data/devflow-schema.js";
12
12
  export * from "./data/default-enforcer-rules.js";
13
13
  export * from "./plugin-loader.js";
14
+ export * from "./plugin-runtime.js";
15
+ export * from "./mcp-inventory.js";
16
+ export * from "./mcp-health.js";
14
17
  export { DevFlowApiClient } from "./api-client.js";
15
18
  export * from "./step-templates/index.js";
16
19
  export * from "./paths.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -11,6 +11,9 @@ export * from "./data/LocalDataProvider.js";
11
11
  export * from "./data/devflow-schema.js";
12
12
  export * from "./data/default-enforcer-rules.js";
13
13
  export * from "./plugin-loader.js";
14
+ export * from "./plugin-runtime.js";
15
+ export * from "./mcp-inventory.js";
16
+ export * from "./mcp-health.js";
14
17
  export { DevFlowApiClient } from "./api-client.js";
15
18
  export * from "./step-templates/index.js";
16
19
  export * from "./paths.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { McpInventoryReport } from "./mcp-inventory.js";
2
+ export type McpHealthStatus = "healthy" | "unhealthy" | "unknown";
3
+ export type McpFailureCategory = "configuration" | "command_missing" | "transport" | "timeout" | "auth" | "rate_limit" | "server_error";
4
+ export interface McpHealthRecord {
5
+ name: string;
6
+ fingerprint: string;
7
+ status: McpHealthStatus;
8
+ checkedAt: string;
9
+ expiresAt: string;
10
+ failureCategory?: McpFailureCategory;
11
+ failureCount: number;
12
+ retryAfter?: string;
13
+ lastError?: string;
14
+ lastRestoredAt?: string;
15
+ }
16
+ export interface McpHealthReport {
17
+ generatedAt: string;
18
+ records: McpHealthRecord[];
19
+ }
20
+ export declare function checkMcpHealth(report: McpInventoryReport, home?: string, now?: number): Promise<McpHealthReport>;
21
+ export declare function readCachedMcpHealth(home?: string): McpHealthReport;
22
+ //# sourceMappingURL=mcp-health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-health.d.ts","sourceRoot":"","sources":["../src/mcp-health.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAA2B,MAAM,oBAAoB,CAAC;AAEtF,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAClE,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,iBAAiB,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,cAAc,CAAC;AAExI,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,kBAAkB,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAqDD,wBAAsB,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE,IAAI,SAAY,EAAE,GAAG,SAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CA4B7H;AAED,wBAAgB,mBAAmB,CAAC,IAAI,SAAY,GAAG,eAAe,CAGrE"}
@@ -0,0 +1,97 @@
1
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { spawnSync } from "node:child_process";
5
+ const TTL_MS = 5 * 60 * 1000;
6
+ const MAX_BACKOFF_MS = 30 * 60 * 1000;
7
+ function statePath(home) {
8
+ return join(home, ".devflow", "mcp-health.json");
9
+ }
10
+ function readState(home) {
11
+ try {
12
+ const parsed = JSON.parse(readFileSync(statePath(home), "utf8"));
13
+ return parsed.records ?? {};
14
+ }
15
+ catch {
16
+ return {};
17
+ }
18
+ }
19
+ function writeState(records, home) {
20
+ const path = statePath(home);
21
+ mkdirSync(dirname(path), { recursive: true });
22
+ const temp = `${path}.${process.pid}.${Date.now()}.tmp`;
23
+ writeFileSync(temp, `${JSON.stringify({ schemaVersion: "devflow.mcp-health.v1", records }, null, 2)}\n`, "utf8");
24
+ renameSync(temp, path);
25
+ }
26
+ async function classifyServer(server) {
27
+ if (!server.enabled)
28
+ return { status: "unknown" };
29
+ if (server.transport === "unknown")
30
+ return { status: "unhealthy", failureCategory: "configuration", error: "server has no supported command or URL" };
31
+ if (server.transport === "stdio" && server.command) {
32
+ const result = spawnSync("which", [server.command], { encoding: "utf8", timeout: 1500 });
33
+ if (result.error?.name === "ETIMEDOUT")
34
+ return { status: "unhealthy", failureCategory: "timeout", error: "command lookup timed out" };
35
+ if (result.status !== 0)
36
+ return { status: "unhealthy", failureCategory: "command_missing", error: `command not found: ${server.command}` };
37
+ return { status: "healthy" };
38
+ }
39
+ if (!server.url)
40
+ return { status: "unhealthy", failureCategory: "configuration", error: "remote server URL is missing" };
41
+ const controller = new AbortController();
42
+ const timeout = setTimeout(() => controller.abort(), 3000);
43
+ try {
44
+ const response = await fetch(server.url, { method: "GET", signal: controller.signal, redirect: "manual" });
45
+ if (response.status === 401 || response.status === 403)
46
+ return { status: "unhealthy", failureCategory: "auth", error: `HTTP ${response.status}` };
47
+ if (response.status === 429)
48
+ return { status: "unhealthy", failureCategory: "rate_limit", error: "HTTP 429" };
49
+ if (response.status >= 500)
50
+ return { status: "unhealthy", failureCategory: "server_error", error: `HTTP ${response.status}` };
51
+ if ((response.status >= 200 && response.status < 400) || response.status === 406)
52
+ return { status: "healthy" };
53
+ return { status: "unhealthy", failureCategory: "transport", error: `HTTP ${response.status}` };
54
+ }
55
+ catch (error) {
56
+ if (error.name === "AbortError")
57
+ return { status: "unhealthy", failureCategory: "timeout", error: "request timed out" };
58
+ return { status: "unhealthy", failureCategory: "transport", error: error.message };
59
+ }
60
+ finally {
61
+ clearTimeout(timeout);
62
+ }
63
+ }
64
+ export async function checkMcpHealth(report, home = homedir(), now = Date.now()) {
65
+ const previous = readState(home);
66
+ const records = {};
67
+ for (const server of report.servers) {
68
+ const old = previous[server.name];
69
+ if (old && old.fingerprint === server.fingerprint && Date.parse(old.expiresAt) > now) {
70
+ records[server.name] = old;
71
+ continue;
72
+ }
73
+ const result = await classifyServer(server);
74
+ const failed = result.status === "unhealthy";
75
+ const failureCount = failed ? (old?.failureCount ?? 0) + 1 : 0;
76
+ const retryAfter = failed ? new Date(now + Math.min(MAX_BACKOFF_MS, 1000 * 2 ** Math.min(failureCount, 10))).toISOString() : undefined;
77
+ records[server.name] = {
78
+ name: server.name,
79
+ fingerprint: server.fingerprint,
80
+ status: result.status,
81
+ checkedAt: new Date(now).toISOString(),
82
+ expiresAt: new Date(now + TTL_MS).toISOString(),
83
+ ...(result.failureCategory ? { failureCategory: result.failureCategory } : {}),
84
+ failureCount,
85
+ ...(retryAfter ? { retryAfter } : {}),
86
+ ...(result.error ? { lastError: result.error } : {}),
87
+ ...(result.status === "healthy" && old?.status === "unhealthy" ? { lastRestoredAt: new Date(now).toISOString() } : {}),
88
+ };
89
+ }
90
+ writeState(records, home);
91
+ return { generatedAt: new Date(now).toISOString(), records: Object.values(records).sort((a, b) => a.name.localeCompare(b.name)) };
92
+ }
93
+ export function readCachedMcpHealth(home = homedir()) {
94
+ const records = readState(home);
95
+ return { generatedAt: new Date().toISOString(), records: Object.values(records).sort((a, b) => a.name.localeCompare(b.name)) };
96
+ }
97
+ //# sourceMappingURL=mcp-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-health.js","sourceRoot":"","sources":["../src/mcp-health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export type McpTransport = "stdio" | "sse" | "http" | "unknown";
2
+ export interface McpServerInventoryEntry {
3
+ name: string;
4
+ transport: McpTransport;
5
+ command?: string;
6
+ args?: string[];
7
+ url?: string;
8
+ sourcePaths: string[];
9
+ enabled: boolean;
10
+ environmentKeys: string[];
11
+ fingerprint: string;
12
+ drift?: string[];
13
+ }
14
+ export interface McpInventoryReport {
15
+ generatedAt: string;
16
+ servers: McpServerInventoryEntry[];
17
+ duplicates: Array<{
18
+ name: string;
19
+ sourcePaths: string[];
20
+ fingerprints: string[];
21
+ }>;
22
+ unreadable: Array<{
23
+ path: string;
24
+ reason: string;
25
+ }>;
26
+ }
27
+ export declare function readMcpInventory(projectRoot?: string, home?: string): McpInventoryReport;
28
+ export declare function redactMcpInventory(report: McpInventoryReport): McpInventoryReport;
29
+ //# sourceMappingURL=mcp-inventory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-inventory.d.ts","sourceRoot":"","sources":["../src/mcp-inventory.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhE,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnF,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AA6FD,wBAAgB,gBAAgB,CAC9B,WAAW,SAAgB,EAC3B,IAAI,SAAY,GACf,kBAAkB,CAmCpB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,CAQjF"}
@@ -0,0 +1,130 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ function stable(value) {
6
+ if (Array.isArray(value))
7
+ return `[${value.map(stable).join(",")}]`;
8
+ if (value && typeof value === "object") {
9
+ return `{${Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, entry]) => `${JSON.stringify(key)}:${stable(entry)}`).join(",")}}`;
10
+ }
11
+ return JSON.stringify(value) ?? "null";
12
+ }
13
+ function fingerprint(value) {
14
+ return createHash("sha256").update(stable(value)).digest("hex").slice(0, 16);
15
+ }
16
+ function configCandidates(projectRoot, home) {
17
+ return [
18
+ join(projectRoot, ".mcp.json"),
19
+ join(projectRoot, ".claude", "mcp.json"),
20
+ join(home, ".claude", ".mcp.json"),
21
+ join(home, ".claude.json"),
22
+ join(home, ".claude", "settings.json"),
23
+ ];
24
+ }
25
+ function extractServers(value, projectRoot) {
26
+ if (!value || typeof value !== "object")
27
+ return {};
28
+ const record = value;
29
+ const collection = record.mcpServers ?? record.servers;
30
+ const globalServers = collection && typeof collection === "object" ? collection : {};
31
+ const projects = record.projects && typeof record.projects === "object"
32
+ ? record.projects
33
+ : {};
34
+ const project = projects[projectRoot];
35
+ const projectRecord = project && typeof project === "object" ? project : {};
36
+ const projectCollection = projectRecord.mcpServers && typeof projectRecord.mcpServers === "object"
37
+ ? projectRecord.mcpServers
38
+ : {};
39
+ return Object.fromEntries(Object.entries({ ...globalServers, ...projectCollection })
40
+ .filter(([, server]) => server && typeof server === "object")
41
+ .map(([name, server]) => [name, server]));
42
+ }
43
+ function disabledServerNames(projectRoot) {
44
+ try {
45
+ const config = JSON.parse(readFileSync(join(projectRoot, ".devflow", "config.json"), "utf8"));
46
+ return new Set((Array.isArray(config.mcp?.disabledServers) ? config.mcp?.disabledServers : [])
47
+ .filter((name) => typeof name === "string"));
48
+ }
49
+ catch {
50
+ return new Set();
51
+ }
52
+ }
53
+ function normalize(name, server, path) {
54
+ const transport = typeof server.command === "string"
55
+ ? "stdio"
56
+ : typeof server.url === "string"
57
+ ? (server.type === "sse" ? "sse" : "http")
58
+ : "unknown";
59
+ const args = Array.isArray(server.args) ? server.args.filter((arg) => typeof arg === "string") : [];
60
+ const environmentKeys = server.env && typeof server.env === "object"
61
+ ? Object.keys(server.env).sort()
62
+ : [];
63
+ const config = {
64
+ transport,
65
+ command: typeof server.command === "string" ? server.command : undefined,
66
+ args,
67
+ url: typeof server.url === "string" ? server.url : undefined,
68
+ environmentKeys,
69
+ enabled: server.enabled !== false && server.disabled !== true,
70
+ };
71
+ return {
72
+ name,
73
+ transport,
74
+ ...(typeof server.command === "string" ? { command: server.command } : {}),
75
+ ...(args.length > 0 ? { args } : {}),
76
+ ...(typeof server.url === "string" ? { url: server.url } : {}),
77
+ sourcePaths: [path],
78
+ enabled: config.enabled,
79
+ environmentKeys,
80
+ fingerprint: fingerprint(config),
81
+ };
82
+ }
83
+ export function readMcpInventory(projectRoot = process.cwd(), home = homedir()) {
84
+ const byName = new Map();
85
+ const unreadable = [];
86
+ const disabled = disabledServerNames(projectRoot);
87
+ for (const path of configCandidates(projectRoot, home)) {
88
+ if (!existsSync(path))
89
+ continue;
90
+ try {
91
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
92
+ for (const [name, server] of Object.entries(extractServers(parsed, projectRoot))) {
93
+ const entries = byName.get(name) ?? [];
94
+ const normalized = normalize(name, server, path);
95
+ if (disabled.has(name)) {
96
+ normalized.enabled = false;
97
+ normalized.fingerprint = fingerprint({ base: normalized.fingerprint, enabled: false });
98
+ }
99
+ entries.push(normalized);
100
+ byName.set(name, entries);
101
+ }
102
+ }
103
+ catch (error) {
104
+ unreadable.push({ path, reason: error.message });
105
+ }
106
+ }
107
+ const servers = [];
108
+ const duplicates = [];
109
+ for (const [name, entries] of byName) {
110
+ const fingerprints = [...new Set(entries.map((entry) => entry.fingerprint))];
111
+ const sourcePaths = entries.flatMap((entry) => entry.sourcePaths);
112
+ const drift = fingerprints.length > 1 ? ["configuration differs across scopes"] : undefined;
113
+ servers.push({ ...entries[0], sourcePaths, ...(drift ? { drift } : {}) });
114
+ if (entries.length > 1)
115
+ duplicates.push({ name, sourcePaths, fingerprints });
116
+ }
117
+ servers.sort((a, b) => a.name.localeCompare(b.name));
118
+ duplicates.sort((a, b) => a.name.localeCompare(b.name));
119
+ return { generatedAt: new Date().toISOString(), servers, duplicates, unreadable };
120
+ }
121
+ export function redactMcpInventory(report) {
122
+ return {
123
+ ...report,
124
+ servers: report.servers.map((server) => ({
125
+ ...server,
126
+ url: server.url ? server.url.replace(/([?&](?:key|token|secret|password)=)[^&]+/gi, "$1<redacted>") : undefined,
127
+ })),
128
+ };
129
+ }
130
+ //# sourceMappingURL=mcp-inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-inventory.js","sourceRoot":"","sources":["../src/mcp-inventory.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,12 @@
1
1
  import type { DevFlowPlugin } from "./types/plugin.js";
2
+ import { type PluginLoadDiagnostic, type PluginRuntimeOptions } from "./plugin-runtime.js";
2
3
  export declare function loadPluginPackageNames(registryPath?: string): string[];
3
- export declare function loadPlugins(): Promise<Map<string, DevFlowPlugin>>;
4
+ export declare function loadPluginsWithDiagnostics(options?: PluginRuntimeOptions): Promise<{
5
+ plugins: Map<string, DevFlowPlugin>;
6
+ diagnostics: PluginLoadDiagnostic[];
7
+ }>;
8
+ export declare function loadPlugins(options?: PluginRuntimeOptions): Promise<Map<string, DevFlowPlugin>>;
9
+ export declare function getPluginLoadDiagnostics(): PluginLoadDiagnostic[];
4
10
  export declare function loadPluginsSync(): Map<string, DevFlowPlugin>;
5
11
  export declare function clearPluginCache(): void;
6
12
  export declare function getPluginsDir(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAavD,wBAAgB,sBAAsB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBtE;AAuBD,wBAAsB,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAUvE;AAED,wBAAgB,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAE5D;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAMtC"}
1
+ {"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAOL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAU7B,wBAAgB,sBAAsB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBtE;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAAC,WAAW,EAAE,oBAAoB,EAAE,CAAA;CAAE,CAAC,CAuCvF;AAED,wBAAsB,WAAW,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAErG;AAED,wBAAgB,wBAAwB,IAAI,oBAAoB,EAAE,CAEjE;AAED,wBAAgB,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAE5D;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAItC"}
@@ -1,8 +1,9 @@
1
1
  import { existsSync, readFileSync } from "node:fs";
2
2
  import { dirname, join, resolve } from "node:path";
3
- import { homedir } from "node:os";
4
3
  import { fileURLToPath } from "node:url";
4
+ import { extractPlugin, importPluginModule, pluginCapabilities, recordPluginLoadDiagnostics, resolvePluginCandidates, validatePlugin, } from "./plugin-runtime.js";
5
5
  let _loadedPlugins = null;
6
+ let _loadDiagnostics = [];
6
7
  export function loadPluginPackageNames(registryPath) {
7
8
  const moduleDir = dirname(fileURLToPath(import.meta.url));
8
9
  const explicitPath = registryPath ?? process.env.DEVFLOW_PLUGIN_REGISTRY;
@@ -17,8 +18,8 @@ export function loadPluginPackageNames(registryPath) {
17
18
  if (!/^1(?:\.|$)/.test(registry.version) || !Array.isArray(registry.plugins))
18
19
  continue;
19
20
  return [...new Set(registry.plugins
20
- .map(plugin => plugin.name)
21
- .filter(name => /^@devflow-tools\/plugin-[a-z0-9-]+$/.test(name)))];
21
+ .map((plugin) => plugin.name)
22
+ .filter((name) => /^@devflow-tools\/plugin-[a-z0-9-]+$/.test(name)))];
22
23
  }
23
24
  catch {
24
25
  continue;
@@ -26,50 +27,61 @@ export function loadPluginPackageNames(registryPath) {
26
27
  }
27
28
  return [];
28
29
  }
29
- async function tryLoad(packageName) {
30
- try {
31
- const mod = await import(packageName);
32
- const name = packageName.replace("@devflow-tools/plugin-", "");
33
- const exportName = `${name}Plugin`;
34
- const plugin = mod[exportName];
35
- if (plugin && plugin.meta && plugin.knowledge) {
36
- return plugin;
37
- }
38
- for (const key of Object.keys(mod)) {
39
- const candidate = mod[key];
40
- if (candidate && candidate.meta && candidate.knowledge) {
41
- return candidate;
30
+ export async function loadPluginsWithDiagnostics(options = {}) {
31
+ if (_loadedPlugins && options.projectRoot === undefined && options.homeDir === undefined && options.registryPath === undefined) {
32
+ return { plugins: _loadedPlugins, diagnostics: _loadDiagnostics };
33
+ }
34
+ const plugins = new Map();
35
+ const diagnostics = [];
36
+ for (const candidate of resolvePluginCandidates(options)) {
37
+ try {
38
+ const module = await importPluginModule(candidate);
39
+ const plugin = extractPlugin(module, candidate.packageName);
40
+ if (!plugin) {
41
+ diagnostics.push({ packageName: candidate.packageName, source: candidate.source, installPath: candidate.installPath, status: "failed", capabilities: [], reason: "No valid DevFlowPlugin export found" });
42
+ continue;
42
43
  }
44
+ const issues = validatePlugin(plugin, candidate.packageName);
45
+ if (issues.length > 0) {
46
+ diagnostics.push({ packageName: candidate.packageName, pluginName: plugin.meta.name, version: plugin.meta.version, source: candidate.source, installPath: candidate.installPath, status: "failed", capabilities: pluginCapabilities(plugin), reason: issues.join("; ") });
47
+ continue;
48
+ }
49
+ const duplicate = plugins.get(plugin.meta.name);
50
+ if (duplicate) {
51
+ diagnostics.push({ packageName: candidate.packageName, pluginName: plugin.meta.name, version: plugin.meta.version, source: candidate.source, installPath: candidate.installPath, status: "failed", capabilities: pluginCapabilities(plugin), reason: `Plugin name conflicts with ${duplicate.meta.version}` });
52
+ continue;
53
+ }
54
+ plugins.set(plugin.meta.name, plugin);
55
+ diagnostics.push({ packageName: candidate.packageName, pluginName: plugin.meta.name, version: plugin.meta.version, source: candidate.source, installPath: candidate.installPath, status: "loaded", capabilities: pluginCapabilities(plugin) });
56
+ }
57
+ catch (error) {
58
+ diagnostics.push({ packageName: candidate.packageName, source: candidate.source, installPath: candidate.installPath, status: "failed", capabilities: [], reason: error.message });
43
59
  }
44
- return null;
45
60
  }
46
- catch {
47
- return null;
61
+ recordPluginLoadDiagnostics(diagnostics, options.homeDir);
62
+ if (options.projectRoot === undefined && options.homeDir === undefined && options.registryPath === undefined) {
63
+ _loadedPlugins = plugins;
64
+ _loadDiagnostics = diagnostics;
48
65
  }
66
+ return { plugins, diagnostics };
49
67
  }
50
- export async function loadPlugins() {
51
- if (_loadedPlugins)
52
- return _loadedPlugins;
53
- _loadedPlugins = new Map();
54
- for (const packageName of loadPluginPackageNames()) {
55
- const plugin = await tryLoad(packageName);
56
- if (plugin) {
57
- _loadedPlugins.set(plugin.meta.name, plugin);
58
- }
59
- }
60
- return _loadedPlugins;
68
+ export async function loadPlugins(options) {
69
+ return (await loadPluginsWithDiagnostics(options)).plugins;
70
+ }
71
+ export function getPluginLoadDiagnostics() {
72
+ return [..._loadDiagnostics];
61
73
  }
62
74
  export function loadPluginsSync() {
63
75
  return _loadedPlugins ?? new Map();
64
76
  }
65
77
  export function clearPluginCache() {
66
78
  _loadedPlugins = null;
79
+ _loadDiagnostics = [];
67
80
  }
68
81
  export function getPluginsDir() {
69
82
  const devPluginsDir = join(process.cwd(), "plugins");
70
- if (existsSync(devPluginsDir)) {
83
+ if (existsSync(devPluginsDir))
71
84
  return devPluginsDir;
72
- }
73
- return join(homedir(), ".devflow", "skills");
85
+ return join(process.env.HOME ?? "~", ".devflow", "plugins");
74
86
  }
75
87
  //# sourceMappingURL=plugin-loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../src/plugin-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { DevFlowPlugin } from "./types/plugin.js";
2
+ export type PluginInstallSource = "npm" | "workspace" | "path";
3
+ export interface PluginLoadDiagnostic {
4
+ packageName: string;
5
+ pluginName?: string;
6
+ version?: string;
7
+ status: "loaded" | "skipped" | "failed";
8
+ capabilities: Array<"knowledge" | "memory" | "workflow" | "tools" | "skill">;
9
+ source?: PluginInstallSource;
10
+ installPath?: string;
11
+ reason?: string;
12
+ }
13
+ export interface PluginRuntimeInstallRecord {
14
+ packageName: string;
15
+ pluginName: string;
16
+ version: string;
17
+ installPath: string;
18
+ source: PluginInstallSource;
19
+ installedAt: string;
20
+ updatedAt: string;
21
+ projects: string[];
22
+ lastLoad?: {
23
+ status: "loaded" | "failed" | "skipped";
24
+ checkedAt: string;
25
+ reason?: string;
26
+ };
27
+ }
28
+ export interface PluginInstallState {
29
+ schemaVersion: "devflow.plugins.v1";
30
+ plugins: Record<string, PluginRuntimeInstallRecord>;
31
+ }
32
+ export interface PluginRuntimeOptions {
33
+ projectRoot?: string;
34
+ homeDir?: string;
35
+ registryPath?: string;
36
+ }
37
+ export interface PluginCandidate {
38
+ packageName: string;
39
+ modulePath?: string;
40
+ source: PluginInstallSource;
41
+ installPath?: string;
42
+ }
43
+ export declare function getPluginInstallRoot(home?: string): string;
44
+ export declare function getPluginInstallStatePath(home?: string): string;
45
+ export declare function emptyPluginInstallState(): PluginInstallState;
46
+ export declare function readPluginInstallState(home?: string): PluginInstallState;
47
+ export declare function writePluginInstallState(state: PluginInstallState, home?: string): void;
48
+ export declare function upsertPluginInstallRecord(record: PluginRuntimeInstallRecord, home?: string): PluginInstallState;
49
+ export declare function removePluginInstallRecord(packageName: string, home?: string): PluginInstallState;
50
+ export declare function resolvePluginCandidates(options?: PluginRuntimeOptions): PluginCandidate[];
51
+ export declare function recordPluginLoadDiagnostics(diagnostics: PluginLoadDiagnostic[], home?: string): void;
52
+ export declare function importPluginModule(candidate: PluginCandidate): Promise<Record<string, unknown>>;
53
+ export declare function extractPlugin(module: Record<string, unknown>, packageName: string): DevFlowPlugin | null;
54
+ export declare function pluginCapabilities(plugin: DevFlowPlugin): PluginLoadDiagnostic["capabilities"];
55
+ export declare function pluginFingerprint(plugin: DevFlowPlugin): string;
56
+ export declare function validatePlugin(plugin: DevFlowPlugin, packageName: string): string[];
57
+ export declare function validatePluginSet(plugins: DevFlowPlugin[], reservedToolNames?: Iterable<string>): string[];
58
+ //# sourceMappingURL=plugin-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-runtime.d.ts","sourceRoot":"","sources":["../src/plugin-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,236 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createRequire } from "node:module";
3
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from "node:fs";
4
+ import { homedir } from "node:os";
5
+ import { dirname, join, resolve } from "node:path";
6
+ import { fileURLToPath, pathToFileURL } from "node:url";
7
+ const PACKAGE_RE = /^@devflow-tools\/plugin-[a-z0-9-]+$/;
8
+ export function getPluginInstallRoot(home = homedir()) {
9
+ return join(home, ".devflow", "plugins");
10
+ }
11
+ export function getPluginInstallStatePath(home = homedir()) {
12
+ return join(getPluginInstallRoot(home), "installed.json");
13
+ }
14
+ export function emptyPluginInstallState() {
15
+ return { schemaVersion: "devflow.plugins.v1", plugins: {} };
16
+ }
17
+ export function readPluginInstallState(home = homedir()) {
18
+ try {
19
+ const parsed = JSON.parse(readFileSync(getPluginInstallStatePath(home), "utf8"));
20
+ if (parsed.schemaVersion !== "devflow.plugins.v1" || !parsed.plugins || typeof parsed.plugins !== "object") {
21
+ return emptyPluginInstallState();
22
+ }
23
+ return { schemaVersion: "devflow.plugins.v1", plugins: parsed.plugins };
24
+ }
25
+ catch {
26
+ return emptyPluginInstallState();
27
+ }
28
+ }
29
+ export function writePluginInstallState(state, home = homedir()) {
30
+ const path = getPluginInstallStatePath(home);
31
+ mkdirSync(dirname(path), { recursive: true });
32
+ const temporary = `${path}.${process.pid}.${Date.now()}.tmp`;
33
+ writeFileSync(temporary, `${JSON.stringify(state, null, 2)}\n`, "utf8");
34
+ renameSync(temporary, path);
35
+ }
36
+ export function upsertPluginInstallRecord(record, home = homedir()) {
37
+ const state = readPluginInstallState(home);
38
+ state.plugins[record.packageName] = record;
39
+ writePluginInstallState(state, home);
40
+ return state;
41
+ }
42
+ export function removePluginInstallRecord(packageName, home = homedir()) {
43
+ const state = readPluginInstallState(home);
44
+ delete state.plugins[packageName];
45
+ writePluginInstallState(state, home);
46
+ return state;
47
+ }
48
+ function projectPluginNames(projectRoot) {
49
+ try {
50
+ const config = JSON.parse(readFileSync(join(projectRoot, ".devflow", "config.json"), "utf8"));
51
+ return new Set((Array.isArray(config.plugins) ? config.plugins : [])
52
+ .filter((name) => typeof name === "string")
53
+ .map((name) => name.startsWith("@devflow-tools/plugin-") ? name : `@devflow-tools/plugin-${name}`));
54
+ }
55
+ catch {
56
+ return new Set();
57
+ }
58
+ }
59
+ function registryPackageNames(registryPath) {
60
+ const moduleDir = dirname(fileURLToPath(import.meta.url));
61
+ const paths = registryPath ? [registryPath] : [
62
+ join(process.cwd(), "plugin-registry.json"),
63
+ join(process.cwd(), "packages", "devflow", "plugin-registry.json"),
64
+ resolve(moduleDir, "..", "..", "devflow", "plugin-registry.json"),
65
+ ];
66
+ for (const path of paths) {
67
+ try {
68
+ const value = JSON.parse(readFileSync(path, "utf8"));
69
+ if (!/^1(?:\.|$)/.test(value.version ?? "") || !Array.isArray(value.plugins))
70
+ continue;
71
+ return value.plugins.map((entry) => entry.name).filter((name) => typeof name === "string" && PACKAGE_RE.test(name));
72
+ }
73
+ catch {
74
+ // Try the next registry location.
75
+ }
76
+ }
77
+ return [];
78
+ }
79
+ function packagePathFromInstallRoot(packageName, root) {
80
+ const path = join(root, ...packageName.split("/"));
81
+ return existsSync(path) ? path : undefined;
82
+ }
83
+ export function resolvePluginCandidates(options = {}) {
84
+ const projectRoot = options.projectRoot ?? process.cwd();
85
+ const home = options.homeDir ?? homedir();
86
+ const configured = projectPluginNames(projectRoot);
87
+ const state = readPluginInstallState(home);
88
+ const names = new Set([
89
+ ...configured,
90
+ ...registryPackageNames(options.registryPath),
91
+ ]);
92
+ const candidates = [];
93
+ for (const packageName of names) {
94
+ if (!PACKAGE_RE.test(packageName))
95
+ continue;
96
+ const record = state.plugins[packageName];
97
+ if (record?.installPath && existsSync(record.installPath)) {
98
+ candidates.push({ packageName, modulePath: record.installPath, installPath: record.installPath, source: record.source });
99
+ continue;
100
+ }
101
+ const projectPath = packagePathFromInstallRoot(packageName, join(projectRoot, "node_modules"));
102
+ if (projectPath) {
103
+ candidates.push({ packageName, modulePath: projectPath, installPath: projectPath, source: "npm" });
104
+ continue;
105
+ }
106
+ const isolatedPath = packagePathFromInstallRoot(packageName, join(getPluginInstallRoot(home), "node_modules"));
107
+ if (isolatedPath) {
108
+ candidates.push({ packageName, modulePath: isolatedPath, installPath: isolatedPath, source: "npm" });
109
+ continue;
110
+ }
111
+ candidates.push({ packageName, source: "workspace" });
112
+ }
113
+ return candidates;
114
+ }
115
+ export function recordPluginLoadDiagnostics(diagnostics, home = homedir()) {
116
+ const state = readPluginInstallState(home);
117
+ let changed = false;
118
+ for (const diagnostic of diagnostics) {
119
+ const record = state.plugins[diagnostic.packageName];
120
+ if (!record)
121
+ continue;
122
+ record.lastLoad = {
123
+ status: diagnostic.status,
124
+ checkedAt: new Date().toISOString(),
125
+ ...(diagnostic.reason ? { reason: diagnostic.reason } : {}),
126
+ };
127
+ changed = true;
128
+ }
129
+ if (changed)
130
+ writePluginInstallState(state, home);
131
+ }
132
+ export async function importPluginModule(candidate) {
133
+ if (!candidate.modulePath) {
134
+ return import(candidate.packageName);
135
+ }
136
+ const packageJson = join(candidate.modulePath, "package.json");
137
+ let entry = candidate.modulePath;
138
+ try {
139
+ const pkg = JSON.parse(readFileSync(packageJson, "utf8"));
140
+ entry = join(candidate.modulePath, pkg.module ?? pkg.main ?? "dist/index.js");
141
+ }
142
+ catch {
143
+ // A direct module path can still be imported.
144
+ }
145
+ try {
146
+ return await import(pathToFileURL(entry).href);
147
+ }
148
+ catch (error) {
149
+ // CommonJS packages are supported as a controlled fallback.
150
+ const require = createRequire(import.meta.url);
151
+ try {
152
+ return require(entry);
153
+ }
154
+ catch {
155
+ throw error;
156
+ }
157
+ }
158
+ }
159
+ export function extractPlugin(module, packageName) {
160
+ const shortName = packageName.replace("@devflow-tools/plugin-", "");
161
+ const expected = module[`${shortName}Plugin`];
162
+ if (isPlugin(expected))
163
+ return expected;
164
+ return Object.values(module).find(isPlugin) ?? null;
165
+ }
166
+ export function pluginCapabilities(plugin) {
167
+ const capabilities = ["knowledge"];
168
+ if (plugin.memory)
169
+ capabilities.push("memory");
170
+ if (plugin.workflow)
171
+ capabilities.push("workflow");
172
+ if (plugin.tools?.length)
173
+ capabilities.push("tools");
174
+ if (plugin.prompt || plugin.workflow?.templates?.length)
175
+ capabilities.push("skill");
176
+ return capabilities;
177
+ }
178
+ export function pluginFingerprint(plugin) {
179
+ return createHash("sha256").update(`${plugin.meta.name}:${plugin.meta.version}`).digest("hex").slice(0, 16);
180
+ }
181
+ function isPlugin(value) {
182
+ if (!value || typeof value !== "object")
183
+ return false;
184
+ const candidate = value;
185
+ return Boolean(candidate.meta && typeof candidate.meta.name === "string" && typeof candidate.meta.version === "string" && candidate.knowledge && Array.isArray(candidate.knowledge.sources));
186
+ }
187
+ export function validatePlugin(plugin, packageName) {
188
+ const issues = [];
189
+ if (!plugin.meta.name.trim())
190
+ issues.push("meta.name is empty");
191
+ if (!/^\d+\.\d+\.\d+/.test(plugin.meta.version))
192
+ issues.push(`invalid plugin version: ${plugin.meta.version}`);
193
+ if (!PACKAGE_RE.test(packageName))
194
+ issues.push(`unsupported package name: ${packageName}`);
195
+ const toolNames = new Set();
196
+ for (const tool of plugin.tools ?? []) {
197
+ if (!/^[a-z0-9][a-z0-9_-]*$/.test(tool.name))
198
+ issues.push(`invalid tool name: ${tool.name}`);
199
+ if (toolNames.has(tool.name))
200
+ issues.push(`duplicate tool name: ${tool.name}`);
201
+ toolNames.add(tool.name);
202
+ if (!tool.handler || typeof tool.handler !== "function")
203
+ issues.push(`tool ${tool.name} has no handler`);
204
+ }
205
+ const stepIds = new Set();
206
+ for (const step of plugin.workflow?.steps ?? []) {
207
+ if (stepIds.has(step.id))
208
+ issues.push(`duplicate workflow step: ${step.id}`);
209
+ stepIds.add(step.id);
210
+ }
211
+ return issues;
212
+ }
213
+ export function validatePluginSet(plugins, reservedToolNames = []) {
214
+ const issues = [];
215
+ const names = new Set();
216
+ const tools = new Set(reservedToolNames);
217
+ const workflows = new Set();
218
+ for (const plugin of plugins) {
219
+ if (names.has(plugin.meta.name))
220
+ issues.push(`duplicate plugin name: ${plugin.meta.name}`);
221
+ names.add(plugin.meta.name);
222
+ for (const tool of plugin.tools ?? []) {
223
+ if (tools.has(tool.name))
224
+ issues.push(`tool name conflict: ${tool.name} (${plugin.meta.name})`);
225
+ tools.add(tool.name);
226
+ }
227
+ for (const template of plugin.workflow?.templates ?? []) {
228
+ const workflowName = `${plugin.meta.name}:${template.name}`;
229
+ if (workflows.has(workflowName))
230
+ issues.push(`workflow name conflict: ${workflowName}`);
231
+ workflows.add(workflowName);
232
+ }
233
+ }
234
+ return issues;
235
+ }
236
+ //# sourceMappingURL=plugin-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-runtime.js","sourceRoot":"","sources":["../src/plugin-runtime.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/sdk",
3
- "version": "0.16.8",
3
+ "version": "0.16.9",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -33,7 +33,7 @@
33
33
  "clean": "rm -rf dist"
34
34
  },
35
35
  "dependencies": {
36
- "@devflow-tools/database": "0.16.8",
36
+ "@devflow-tools/database": "0.16.9",
37
37
  "tiktoken": "^1.0.0"
38
38
  },
39
39
  "devDependencies": {
@@ -43,5 +43,5 @@
43
43
  "files": [
44
44
  "dist"
45
45
  ],
46
- "gitHead": "38b7ea6653ad6e0d3edb7eae260367032f0bb854"
46
+ "gitHead": "964af33767bf232606e63d973b3a29d7d53c8119"
47
47
  }