@mastra/code-sdk 1.0.3-alpha.1 → 1.1.0-alpha.2
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/CHANGELOG.md +38 -0
- package/dist/acp/agent.js +155 -167
- package/dist/acp/agent.js.map +1 -1
- package/dist/acp/event-mapper.js +193 -168
- package/dist/acp/event-mapper.js.map +1 -1
- package/dist/acp/index.js +60 -49
- package/dist/acp/index.js.map +1 -1
- package/dist/acp/server.js +31 -30
- package/dist/acp/server.js.map +1 -1
- package/dist/acp.js +1 -4
- package/dist/agents/credential-resolver.js +40 -29
- package/dist/agents/credential-resolver.js.map +1 -1
- package/dist/agents/custom-provider-source.js +16 -9
- package/dist/agents/custom-provider-source.js.map +1 -1
- package/dist/agents/instructions.js +27 -36
- package/dist/agents/instructions.js.map +1 -1
- package/dist/agents/mastracode-gateway.js +355 -428
- package/dist/agents/mastracode-gateway.js.map +1 -1
- package/dist/agents/memory.js +87 -78
- package/dist/agents/memory.js.map +1 -1
- package/dist/agents/model.js +114 -119
- package/dist/agents/model.js.map +1 -1
- package/dist/agents/modes/build.js +12 -13
- package/dist/agents/modes/build.js.map +1 -1
- package/dist/agents/modes/explore.js +14 -13
- package/dist/agents/modes/explore.js.map +1 -1
- package/dist/agents/modes/plan.js +14 -15
- package/dist/agents/modes/plan.js.map +1 -1
- package/dist/agents/prompts/agent-instructions.js +78 -69
- package/dist/agents/prompts/agent-instructions.js.map +1 -1
- package/dist/agents/prompts/build.js +19 -16
- package/dist/agents/prompts/build.js.map +1 -1
- package/dist/agents/prompts/fast.js +8 -4
- package/dist/agents/prompts/fast.js.map +1 -1
- package/dist/agents/prompts/index.js +48 -47
- package/dist/agents/prompts/index.js.map +1 -1
- package/dist/agents/prompts/model.js +6 -5
- package/dist/agents/prompts/model.js.map +1 -1
- package/dist/agents/prompts/plan.js +20 -16
- package/dist/agents/prompts/plan.js.map +1 -1
- package/dist/agents/prompts/tool-guidance.js +77 -109
- package/dist/agents/prompts/tool-guidance.js.map +1 -1
- package/dist/agents/sandbox-filesystem.js +245 -259
- package/dist/agents/sandbox-filesystem.js.map +1 -1
- package/dist/agents/sandbox-reattach.js +9 -11
- package/dist/agents/sandbox-reattach.js.map +1 -1
- package/dist/agents/thread-caveman-state.js +92 -81
- package/dist/agents/thread-caveman-state.js.map +1 -1
- package/dist/agents/tool-availability.js +62 -80
- package/dist/agents/tool-availability.js.map +1 -1
- package/dist/agents/tools.js +99 -139
- package/dist/agents/tools.js.map +1 -1
- package/dist/agents/workspace.js +232 -225
- package/dist/agents/workspace.js.map +1 -1
- package/dist/analytics.js +139 -128
- package/dist/analytics.js.map +1 -1
- package/dist/auth/authorization-input.js +39 -25
- package/dist/auth/authorization-input.js.map +1 -1
- package/dist/auth/device-code.js +112 -80
- package/dist/auth/device-code.js.map +1 -1
- package/dist/auth/index.js +2 -9
- package/dist/auth/pkce.js +27 -16
- package/dist/auth/pkce.js.map +1 -1
- package/dist/auth/providers/anthropic.js +107 -93
- package/dist/auth/providers/anthropic.js.map +1 -1
- package/dist/auth/providers/github-copilot.js +304 -293
- package/dist/auth/providers/github-copilot.js.map +1 -1
- package/dist/auth/providers/openai-codex.js +442 -460
- package/dist/auth/providers/openai-codex.js.map +1 -1
- package/dist/auth/providers/xai.js +179 -145
- package/dist/auth/providers/xai.js.map +1 -1
- package/dist/auth/storage.js +182 -175
- package/dist/auth/storage.js.map +1 -1
- package/dist/auth/types.js +1 -1
- package/dist/clipboard/index.js +206 -172
- package/dist/clipboard/index.js.map +1 -1
- package/dist/constants.js +11 -16
- package/dist/constants.js.map +1 -1
- package/dist/error-classification.js +19 -11
- package/dist/error-classification.js.map +1 -1
- package/dist/evals/context-builder.js +145 -104
- package/dist/evals/context-builder.js.map +1 -1
- package/dist/evals/index.js +4 -7
- package/dist/evals/scorers/classify-command.js +62 -41
- package/dist/evals/scorers/classify-command.js.map +1 -1
- package/dist/evals/scorers/efficiency.js +239 -181
- package/dist/evals/scorers/efficiency.js.map +1 -1
- package/dist/evals/scorers/extract-tools.js +51 -47
- package/dist/evals/scorers/extract-tools.js.map +1 -1
- package/dist/evals/scorers/index.js +1 -5
- package/dist/evals/scorers/outcome.js +321 -212
- package/dist/evals/scorers/outcome.js.map +1 -1
- package/dist/goal-manager.js +266 -261
- package/dist/goal-manager.js.map +1 -1
- package/dist/goal-signal.js +14 -13
- package/dist/goal-signal.js.map +1 -1
- package/dist/headless/cli.js +153 -154
- package/dist/headless/cli.js.map +1 -1
- package/dist/headless/flags.js +180 -178
- package/dist/headless/flags.js.map +1 -1
- package/dist/headless/format.js +72 -71
- package/dist/headless/format.js.map +1 -1
- package/dist/headless/index.js +5 -31
- package/dist/headless/policy.js +35 -31
- package/dist/headless/policy.js.map +1 -1
- package/dist/headless/run-mc.js +332 -334
- package/dist/headless/run-mc.js.map +1 -1
- package/dist/headless/types.js +16 -7
- package/dist/headless/types.js.map +1 -1
- package/dist/hooks/config.js +56 -61
- package/dist/hooks/config.js.map +1 -1
- package/dist/hooks/executor.js +118 -116
- package/dist/hooks/executor.js.map +1 -1
- package/dist/hooks/index.js +4 -15
- package/dist/hooks/manager.js +221 -280
- package/dist/hooks/manager.js.map +1 -1
- package/dist/hooks/types.js +5 -4
- package/dist/hooks/types.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +632 -712
- package/dist/index.js.map +1 -1
- package/dist/ipc/ipc-reporter.js +19 -22
- package/dist/ipc/ipc-reporter.js.map +1 -1
- package/dist/lsp/client.js +248 -306
- package/dist/lsp/client.js.map +1 -1
- package/dist/lsp/index.js +1 -6
- package/dist/lsp/language.js +39 -43
- package/dist/lsp/language.js.map +1 -1
- package/dist/lsp/manager.js +78 -93
- package/dist/lsp/manager.js.map +1 -1
- package/dist/lsp/server.js +151 -120
- package/dist/lsp/server.js.map +1 -1
- package/dist/lsp/workspace.js +50 -47
- package/dist/lsp/workspace.js.map +1 -1
- package/dist/mcp/config.js +210 -199
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/index.js +2 -9
- package/dist/mcp/manager.js +482 -475
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/types.js +1 -1
- package/dist/onboarding/custom-packs.js +14 -17
- package/dist/onboarding/custom-packs.js.map +1 -1
- package/dist/onboarding/custom-providers.js +22 -20
- package/dist/onboarding/custom-providers.js.map +1 -1
- package/dist/onboarding/index.d.ts +1 -1
- package/dist/onboarding/index.d.ts.map +1 -1
- package/dist/onboarding/index.js +3 -21
- package/dist/onboarding/om-settings.d.ts +5 -0
- package/dist/onboarding/om-settings.d.ts.map +1 -1
- package/dist/onboarding/om-settings.js +41 -20
- package/dist/onboarding/om-settings.js.map +1 -1
- package/dist/onboarding/packs.d.ts +4 -6
- package/dist/onboarding/packs.d.ts.map +1 -1
- package/dist/onboarding/packs.js +154 -105
- package/dist/onboarding/packs.js.map +1 -1
- package/dist/onboarding/settings.js +575 -517
- package/dist/onboarding/settings.js.map +1 -1
- package/dist/permissions.js +112 -99
- package/dist/permissions.js.map +1 -1
- package/dist/plugin.js +21 -23
- package/dist/plugin.js.map +1 -1
- package/dist/plugins/dependencies.js +64 -87
- package/dist/plugins/dependencies.js.map +1 -1
- package/dist/plugins/install.js +159 -169
- package/dist/plugins/install.js.map +1 -1
- package/dist/plugins/loader.js +170 -185
- package/dist/plugins/loader.js.map +1 -1
- package/dist/plugins/manager.js +374 -380
- package/dist/plugins/manager.js.map +1 -1
- package/dist/plugins/manifest.js +38 -63
- package/dist/plugins/manifest.js.map +1 -1
- package/dist/plugins/package-link.js +48 -64
- package/dist/plugins/package-link.js.map +1 -1
- package/dist/plugins/paths.js +18 -19
- package/dist/plugins/paths.js.map +1 -1
- package/dist/plugins/registry.js +97 -81
- package/dist/plugins/registry.js.map +1 -1
- package/dist/plugins/scaffold.js +62 -98
- package/dist/plugins/scaffold.js.map +1 -1
- package/dist/plugins/types.js +1 -1
- package/dist/processors/plan-rejection-abort.js +45 -44
- package/dist/processors/plan-rejection-abort.js.map +1 -1
- package/dist/providers/amazon-bedrock-gateway.js +134 -125
- package/dist/providers/amazon-bedrock-gateway.js.map +1 -1
- package/dist/providers/amazon-bedrock.js +68 -47
- package/dist/providers/amazon-bedrock.js.map +1 -1
- package/dist/providers/claude-max.js +153 -133
- package/dist/providers/claude-max.js.map +1 -1
- package/dist/providers/github-copilot.js +232 -230
- package/dist/providers/github-copilot.js.map +1 -1
- package/dist/providers/openai-codex.js +271 -260
- package/dist/providers/openai-codex.js.map +1 -1
- package/dist/providers/xai.js +57 -50
- package/dist/providers/xai.js.map +1 -1
- package/dist/schema.js +91 -89
- package/dist/schema.js.map +1 -1
- package/dist/theme-palette.js +18 -14
- package/dist/theme-palette.js.map +1 -1
- package/dist/tool-names.js +46 -37
- package/dist/tool-names.js.map +1 -1
- package/dist/tools/index.js +2 -8
- package/dist/tools/request-sandbox-access.js +71 -80
- package/dist/tools/request-sandbox-access.js.map +1 -1
- package/dist/tools/utils.js +26 -16
- package/dist/tools/utils.js.map +1 -1
- package/dist/tools/web-search.js +51 -55
- package/dist/tools/web-search.js.map +1 -1
- package/dist/utils/binaries.js +65 -61
- package/dist/utils/binaries.js.map +1 -1
- package/dist/utils/debug-log.js +51 -47
- package/dist/utils/debug-log.js.map +1 -1
- package/dist/utils/errors.js +157 -192
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/gateway-sync.js +49 -37
- package/dist/utils/gateway-sync.js.map +1 -1
- package/dist/utils/path-security.js +7 -6
- package/dist/utils/path-security.js.map +1 -1
- package/dist/utils/plan-diff.js +58 -39
- package/dist/utils/plan-diff.js.map +1 -1
- package/dist/utils/plans.js +92 -74
- package/dist/utils/plans.js.map +1 -1
- package/dist/utils/project.js +318 -256
- package/dist/utils/project.js.map +1 -1
- package/dist/utils/signals-pubsub.js +117 -99
- package/dist/utils/signals-pubsub.js.map +1 -1
- package/dist/utils/slash-command-loader.js +118 -154
- package/dist/utils/slash-command-loader.js.map +1 -1
- package/dist/utils/slash-command-processor.js +92 -83
- package/dist/utils/slash-command-processor.js.map +1 -1
- package/dist/utils/stdin-pipe.js +87 -63
- package/dist/utils/stdin-pipe.js.map +1 -1
- package/dist/utils/storage-factory.js +104 -84
- package/dist/utils/storage-factory.js.map +1 -1
- package/dist/utils/storage-maintenance.js +249 -211
- package/dist/utils/storage-maintenance.js.map +1 -1
- package/dist/utils/thread-lock.js +96 -92
- package/dist/utils/thread-lock.js.map +1 -1
- package/dist/utils/token-estimator.js +12 -12
- package/dist/utils/token-estimator.js.map +1 -1
- package/dist/utils/update-check.d.ts +1 -1
- package/dist/utils/update-check.js +341 -259
- package/dist/utils/update-check.js.map +1 -1
- package/dist/voice/stt-registry.js +131 -113
- package/dist/voice/stt-registry.js.map +1 -1
- package/package.json +12 -12
- package/dist/acp.js.map +0 -1
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/types.js.map +0 -1
- package/dist/evals/index.js.map +0 -1
- package/dist/evals/scorers/index.js.map +0 -1
- package/dist/headless/index.js.map +0 -1
- package/dist/hooks/index.js.map +0 -1
- package/dist/lsp/index.js.map +0 -1
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/types.js.map +0 -1
- package/dist/onboarding/index.js.map +0 -1
- package/dist/plugins/types.js.map +0 -1
- package/dist/tools/index.js.map +0 -1
package/dist/utils/project.js
CHANGED
|
@@ -1,302 +1,364 @@
|
|
|
1
|
-
import { execFile, execSync } from "node:child_process";
|
|
2
|
-
import { createHash } from "node:crypto";
|
|
3
|
-
import fs from "node:fs";
|
|
4
|
-
import os from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
6
1
|
import { DEFAULT_CONFIG_DIR } from "../constants.js";
|
|
2
|
+
import { createHash } from "crypto";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import os from "os";
|
|
5
|
+
import path from "path";
|
|
6
|
+
import { execFile, execSync } from "child_process";
|
|
7
|
+
//#region src/utils/project.ts
|
|
8
|
+
/**
|
|
9
|
+
* Project detection utilities
|
|
10
|
+
*
|
|
11
|
+
* Detects project identity from git repo or filesystem path.
|
|
12
|
+
* Handles git worktrees by finding the main repository.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Run a git command and return stdout, or undefined if it fails
|
|
16
|
+
*/
|
|
7
17
|
function git(args, cwd) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
18
|
+
try {
|
|
19
|
+
return execSync(`git ${args}`, {
|
|
20
|
+
cwd,
|
|
21
|
+
encoding: "utf-8",
|
|
22
|
+
stdio: [
|
|
23
|
+
"pipe",
|
|
24
|
+
"pipe",
|
|
25
|
+
"pipe"
|
|
26
|
+
]
|
|
27
|
+
}).trim();
|
|
28
|
+
} catch {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
17
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Slugify a string for use in IDs
|
|
34
|
+
*/
|
|
18
35
|
function slugify(str) {
|
|
19
|
-
|
|
36
|
+
return str.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
20
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Create a short hash of a string
|
|
40
|
+
*/
|
|
21
41
|
function shortHash(str) {
|
|
22
|
-
|
|
42
|
+
return createHash("sha256").update(str).digest("hex").slice(0, 12);
|
|
23
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Normalize a git URL to a canonical form for comparison
|
|
46
|
+
* - Removes .git suffix
|
|
47
|
+
* - Converts SSH to HTTPS format for consistency
|
|
48
|
+
* - Lowercases
|
|
49
|
+
*/
|
|
24
50
|
function normalizeGitUrl(url) {
|
|
25
|
-
|
|
51
|
+
return url.replace(/\.git$/, "").replace(/^git@([^:]+):/, "https://$1/").replace(/^ssh:\/\/git@/, "https://").toLowerCase();
|
|
26
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Detect project info from a directory path
|
|
55
|
+
*/
|
|
27
56
|
function detectProject(projectPath) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
name: baseName,
|
|
68
|
-
rootPath,
|
|
69
|
-
gitUrl,
|
|
70
|
-
gitBranch,
|
|
71
|
-
isWorktree,
|
|
72
|
-
mainRepoPath
|
|
73
|
-
};
|
|
57
|
+
const absolutePath = path.resolve(projectPath);
|
|
58
|
+
const gitDir = git("rev-parse --git-dir", absolutePath);
|
|
59
|
+
const isGitRepo = gitDir !== void 0;
|
|
60
|
+
let rootPath = absolutePath;
|
|
61
|
+
let gitUrl;
|
|
62
|
+
let gitBranch;
|
|
63
|
+
let isWorktree = false;
|
|
64
|
+
let mainRepoPath;
|
|
65
|
+
if (isGitRepo) {
|
|
66
|
+
rootPath = git("rev-parse --show-toplevel", absolutePath) || absolutePath;
|
|
67
|
+
const commonDir = git("rev-parse --git-common-dir", absolutePath);
|
|
68
|
+
if (commonDir && commonDir !== ".git" && commonDir !== gitDir) {
|
|
69
|
+
isWorktree = true;
|
|
70
|
+
mainRepoPath = path.dirname(path.resolve(rootPath, commonDir));
|
|
71
|
+
}
|
|
72
|
+
gitUrl = git("remote get-url origin", absolutePath);
|
|
73
|
+
if (!gitUrl) {
|
|
74
|
+
const remotes = git("remote", absolutePath);
|
|
75
|
+
if (remotes) {
|
|
76
|
+
const firstRemote = remotes.split("\n")[0];
|
|
77
|
+
if (firstRemote) gitUrl = git(`remote get-url ${firstRemote}`, absolutePath);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
gitBranch = git("rev-parse --abbrev-ref HEAD", absolutePath);
|
|
81
|
+
}
|
|
82
|
+
let resourceIdSource;
|
|
83
|
+
if (gitUrl) resourceIdSource = normalizeGitUrl(gitUrl);
|
|
84
|
+
else if (mainRepoPath) resourceIdSource = mainRepoPath;
|
|
85
|
+
else resourceIdSource = rootPath;
|
|
86
|
+
const baseName = gitUrl ? gitUrl.split("/").pop()?.replace(/\.git$/, "") || "project" : path.basename(rootPath);
|
|
87
|
+
return {
|
|
88
|
+
resourceId: `${slugify(baseName)}-${shortHash(resourceIdSource)}`,
|
|
89
|
+
name: baseName,
|
|
90
|
+
rootPath,
|
|
91
|
+
gitUrl,
|
|
92
|
+
gitBranch,
|
|
93
|
+
isWorktree,
|
|
94
|
+
mainRepoPath
|
|
95
|
+
};
|
|
74
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Get the current git branch for a given directory.
|
|
99
|
+
* Lightweight alternative to detectProject() for refreshing just the branch.
|
|
100
|
+
*/
|
|
75
101
|
function getCurrentGitBranch(cwd) {
|
|
76
|
-
|
|
102
|
+
return git("rev-parse --abbrev-ref HEAD", cwd);
|
|
77
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Async version of getCurrentGitBranch — avoids blocking the event loop
|
|
106
|
+
* with execSync. Falls back to undefined on any failure.
|
|
107
|
+
*/
|
|
78
108
|
function getCurrentGitBranchAsync(cwd) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
109
|
+
return new Promise((resolve) => {
|
|
110
|
+
execFile("git", [
|
|
111
|
+
"rev-parse",
|
|
112
|
+
"--abbrev-ref",
|
|
113
|
+
"HEAD"
|
|
114
|
+
], {
|
|
115
|
+
cwd,
|
|
116
|
+
encoding: "utf-8"
|
|
117
|
+
}, (err, stdout) => {
|
|
118
|
+
if (err) {
|
|
119
|
+
resolve(void 0);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
resolve(stdout.trim() || void 0);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
89
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* Get the application data directory for mastracode
|
|
128
|
+
* - macOS: ~/Library/Application Support/mastracode
|
|
129
|
+
* - Linux: ~/.local/share/mastracode
|
|
130
|
+
* - Windows: %APPDATA%/mastracode
|
|
131
|
+
*/
|
|
90
132
|
function getAppDataDir() {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
const appDir = path.join(baseDir, "mastracode");
|
|
105
|
-
if (!fs.existsSync(appDir)) {
|
|
106
|
-
fs.mkdirSync(appDir, { recursive: true });
|
|
107
|
-
}
|
|
108
|
-
return appDir;
|
|
133
|
+
if (process.env.MASTRA_APP_DATA_DIR) {
|
|
134
|
+
fs.mkdirSync(process.env.MASTRA_APP_DATA_DIR, { recursive: true });
|
|
135
|
+
return process.env.MASTRA_APP_DATA_DIR;
|
|
136
|
+
}
|
|
137
|
+
const platform = os.platform();
|
|
138
|
+
let baseDir;
|
|
139
|
+
if (platform === "darwin") baseDir = path.join(os.homedir(), "Library", "Application Support");
|
|
140
|
+
else if (platform === "win32") baseDir = process.env.APPDATA || path.join(os.homedir(), "AppData", "Roaming");
|
|
141
|
+
else baseDir = process.env.XDG_DATA_HOME || path.join(os.homedir(), ".local", "share");
|
|
142
|
+
const appDir = path.join(baseDir, "mastracode");
|
|
143
|
+
if (!fs.existsSync(appDir)) fs.mkdirSync(appDir, { recursive: true });
|
|
144
|
+
return appDir;
|
|
109
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* Get the database path for mastracode
|
|
148
|
+
* Can be overridden with the MASTRA_DB_PATH environment variable for debugging.
|
|
149
|
+
*/
|
|
110
150
|
function getDatabasePath() {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
return path.join(getAppDataDir(), "mastra.db");
|
|
151
|
+
if (process.env.MASTRA_DB_PATH) return process.env.MASTRA_DB_PATH;
|
|
152
|
+
return path.join(getAppDataDir(), "mastra.db");
|
|
115
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* Get the vector database path for mastracode.
|
|
156
|
+
* Separate from the main DB to avoid bloating it with embedding data.
|
|
157
|
+
*/
|
|
116
158
|
function getVectorDatabasePath() {
|
|
117
|
-
|
|
159
|
+
return path.join(getAppDataDir(), "mastra-vectors.db");
|
|
118
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* Get the observability DuckDB database path for mastracode.
|
|
163
|
+
* Separate from the main DB — DuckDB is used for OLAP-style trace/score/feedback queries.
|
|
164
|
+
* Can be overridden with the MASTRA_OBSERVABILITY_DB_PATH environment variable.
|
|
165
|
+
*/
|
|
119
166
|
function getObservabilityDatabasePath() {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
123
|
-
return path.join(getAppDataDir(), "observability.duckdb");
|
|
167
|
+
if (process.env.MASTRA_OBSERVABILITY_DB_PATH) return process.env.MASTRA_OBSERVABILITY_DB_PATH;
|
|
168
|
+
return path.join(getAppDataDir(), "observability.duckdb");
|
|
124
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* Get the resolved storage configuration.
|
|
172
|
+
*
|
|
173
|
+
* Priority (highest to lowest):
|
|
174
|
+
* 1. Environment variables: MASTRA_STORAGE_BACKEND + backend-specific vars
|
|
175
|
+
* 2. Global settings (from /settings): settings.storage
|
|
176
|
+
* 3. Legacy config files: .mastracode/database.json (LibSQL only)
|
|
177
|
+
* 4. Local file database (LibSQL default)
|
|
178
|
+
*
|
|
179
|
+
* For PG, the env vars are:
|
|
180
|
+
* MASTRA_STORAGE_BACKEND=pg
|
|
181
|
+
* MASTRA_PG_CONNECTION_STRING or MASTRA_PG_HOST/PORT/DATABASE/USER/PASSWORD
|
|
182
|
+
* MASTRA_PG_SCHEMA_NAME (optional)
|
|
183
|
+
*
|
|
184
|
+
* For LibSQL, the legacy env vars still work:
|
|
185
|
+
* MASTRA_DB_URL + MASTRA_DB_AUTH_TOKEN
|
|
186
|
+
*/
|
|
125
187
|
function getStorageConfig(projectDir, storageSettings, configDirName = DEFAULT_CONFIG_DIR) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
const globalConfig = loadDatabaseConfig(path.join(os.homedir(), configDirName, "database.json"));
|
|
149
|
-
if (globalConfig) return globalConfig;
|
|
150
|
-
return {
|
|
151
|
-
backend: "libsql",
|
|
152
|
-
url: `file:${getDatabasePath()}`,
|
|
153
|
-
isRemote: false
|
|
154
|
-
};
|
|
188
|
+
const envBackend = process.env.MASTRA_STORAGE_BACKEND;
|
|
189
|
+
if (envBackend === "pg") return resolvePgFromEnv();
|
|
190
|
+
if (envBackend === "libsql" || process.env.MASTRA_DB_URL) return resolveLibSQLFromEnv();
|
|
191
|
+
if (storageSettings && storageSettings.backend === "pg") return resolvePgFromSettings(storageSettings);
|
|
192
|
+
if (storageSettings && storageSettings.backend === "libsql" && storageSettings.libsql.url) return {
|
|
193
|
+
backend: "libsql",
|
|
194
|
+
url: storageSettings.libsql.url,
|
|
195
|
+
authToken: storageSettings.libsql.authToken,
|
|
196
|
+
isRemote: !storageSettings.libsql.url.startsWith("file:")
|
|
197
|
+
};
|
|
198
|
+
if (projectDir) {
|
|
199
|
+
const projectConfig = loadDatabaseConfig(path.join(projectDir, configDirName, "database.json"));
|
|
200
|
+
if (projectConfig) return projectConfig;
|
|
201
|
+
}
|
|
202
|
+
const globalConfig = loadDatabaseConfig(path.join(os.homedir(), configDirName, "database.json"));
|
|
203
|
+
if (globalConfig) return globalConfig;
|
|
204
|
+
return {
|
|
205
|
+
backend: "libsql",
|
|
206
|
+
url: `file:${getDatabasePath()}`,
|
|
207
|
+
isRemote: false
|
|
208
|
+
};
|
|
155
209
|
}
|
|
156
210
|
function resolveLibSQLFromEnv() {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
211
|
+
const url = process.env.MASTRA_DB_URL;
|
|
212
|
+
return {
|
|
213
|
+
backend: "libsql",
|
|
214
|
+
url,
|
|
215
|
+
authToken: process.env.MASTRA_DB_AUTH_TOKEN,
|
|
216
|
+
isRemote: !url.startsWith("file:")
|
|
217
|
+
};
|
|
164
218
|
}
|
|
165
219
|
function resolvePgFromEnv() {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
schemaName: process.env.MASTRA_PG_SCHEMA_NAME
|
|
182
|
-
};
|
|
220
|
+
const connectionString = process.env.MASTRA_PG_CONNECTION_STRING;
|
|
221
|
+
if (connectionString) return {
|
|
222
|
+
backend: "pg",
|
|
223
|
+
connectionString,
|
|
224
|
+
schemaName: process.env.MASTRA_PG_SCHEMA_NAME
|
|
225
|
+
};
|
|
226
|
+
return {
|
|
227
|
+
backend: "pg",
|
|
228
|
+
host: process.env.MASTRA_PG_HOST,
|
|
229
|
+
port: process.env.MASTRA_PG_PORT ? parseInt(process.env.MASTRA_PG_PORT, 10) : void 0,
|
|
230
|
+
database: process.env.MASTRA_PG_DATABASE,
|
|
231
|
+
user: process.env.MASTRA_PG_USER,
|
|
232
|
+
password: process.env.MASTRA_PG_PASSWORD,
|
|
233
|
+
schemaName: process.env.MASTRA_PG_SCHEMA_NAME
|
|
234
|
+
};
|
|
183
235
|
}
|
|
184
236
|
function resolvePgFromSettings(settings) {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
237
|
+
const pg = settings.pg;
|
|
238
|
+
return {
|
|
239
|
+
backend: "pg",
|
|
240
|
+
connectionString: pg.connectionString,
|
|
241
|
+
host: pg.host,
|
|
242
|
+
port: pg.port,
|
|
243
|
+
database: pg.database,
|
|
244
|
+
user: pg.user,
|
|
245
|
+
password: pg.password,
|
|
246
|
+
schemaName: pg.schemaName,
|
|
247
|
+
disableInit: pg.disableInit,
|
|
248
|
+
skipDefaultIndexes: pg.skipDefaultIndexes
|
|
249
|
+
};
|
|
198
250
|
}
|
|
251
|
+
/**
|
|
252
|
+
* Load database config from a legacy JSON file.
|
|
253
|
+
* Expected format: { "url": "libsql://...", "authToken": "..." }
|
|
254
|
+
*/
|
|
199
255
|
function loadDatabaseConfig(filePath) {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
return null;
|
|
215
|
-
}
|
|
256
|
+
try {
|
|
257
|
+
if (!fs.existsSync(filePath)) return null;
|
|
258
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
259
|
+
const parsed = JSON.parse(raw);
|
|
260
|
+
if (typeof parsed?.url === "string" && parsed.url) return {
|
|
261
|
+
backend: "libsql",
|
|
262
|
+
url: parsed.url,
|
|
263
|
+
authToken: typeof parsed.authToken === "string" ? parsed.authToken : void 0,
|
|
264
|
+
isRemote: !parsed.url.startsWith("file:")
|
|
265
|
+
};
|
|
266
|
+
return null;
|
|
267
|
+
} catch {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
216
270
|
}
|
|
271
|
+
/**
|
|
272
|
+
* Get the current user identity.
|
|
273
|
+
*
|
|
274
|
+
* Priority:
|
|
275
|
+
* 1. MASTRA_USER_ID environment variable
|
|
276
|
+
* 2. git config user.email (from project dir or global)
|
|
277
|
+
* 3. OS username as fallback
|
|
278
|
+
*/
|
|
217
279
|
function getUserId(projectDir) {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
const email = git("config user.email", cwd);
|
|
223
|
-
if (email) {
|
|
224
|
-
return email;
|
|
225
|
-
}
|
|
226
|
-
return os.userInfo().username || "unknown";
|
|
280
|
+
if (process.env.MASTRA_USER_ID) return process.env.MASTRA_USER_ID;
|
|
281
|
+
const email = git("config user.email", projectDir || process.cwd());
|
|
282
|
+
if (email) return email;
|
|
283
|
+
return os.userInfo().username || "unknown";
|
|
227
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* Get the current user's display name.
|
|
287
|
+
*
|
|
288
|
+
* Priority:
|
|
289
|
+
* 1. git config user.name
|
|
290
|
+
* 2. OS username as fallback
|
|
291
|
+
*/
|
|
228
292
|
function getUserName(projectDir) {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
return name;
|
|
233
|
-
}
|
|
234
|
-
return os.userInfo().username || "unknown";
|
|
293
|
+
const name = git("config user.name", projectDir || process.cwd());
|
|
294
|
+
if (name) return name;
|
|
295
|
+
return os.userInfo().username || "unknown";
|
|
235
296
|
}
|
|
297
|
+
/**
|
|
298
|
+
* Get the configured observational memory scope.
|
|
299
|
+
*
|
|
300
|
+
* Priority:
|
|
301
|
+
* 1. MASTRA_OM_SCOPE environment variable ("thread" or "resource")
|
|
302
|
+
* 2. Project config: .mastracode/database.json → omScope
|
|
303
|
+
* 3. Global config: ~/.mastracode/database.json → omScope
|
|
304
|
+
* 4. Default: "thread"
|
|
305
|
+
*/
|
|
236
306
|
function getOmScope(projectDir, configDirName = DEFAULT_CONFIG_DIR) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
if (scope) return scope;
|
|
247
|
-
return "thread";
|
|
307
|
+
const envScope = process.env.MASTRA_OM_SCOPE;
|
|
308
|
+
if (envScope === "thread" || envScope === "resource") return envScope;
|
|
309
|
+
if (projectDir) {
|
|
310
|
+
const scope = loadOmScopeFromConfig(path.join(projectDir, configDirName, "database.json"));
|
|
311
|
+
if (scope) return scope;
|
|
312
|
+
}
|
|
313
|
+
const scope = loadOmScopeFromConfig(path.join(os.homedir(), configDirName, "database.json"));
|
|
314
|
+
if (scope) return scope;
|
|
315
|
+
return "thread";
|
|
248
316
|
}
|
|
249
317
|
function loadOmScopeFromConfig(filePath) {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
return null;
|
|
260
|
-
}
|
|
318
|
+
try {
|
|
319
|
+
if (!fs.existsSync(filePath)) return null;
|
|
320
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
321
|
+
const parsed = JSON.parse(raw);
|
|
322
|
+
if (parsed?.omScope === "thread" || parsed?.omScope === "resource") return parsed.omScope;
|
|
323
|
+
return null;
|
|
324
|
+
} catch {
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
261
327
|
}
|
|
328
|
+
/**
|
|
329
|
+
* Get an explicit resource ID override, if configured.
|
|
330
|
+
*
|
|
331
|
+
* Resource IDs act as shared tags — two users who set the same resourceId
|
|
332
|
+
* will share threads and observations for that resource.
|
|
333
|
+
*
|
|
334
|
+
* Priority:
|
|
335
|
+
* 1. MASTRA_RESOURCE_ID environment variable
|
|
336
|
+
* 2. Project config: .mastracode/database.json → resourceId
|
|
337
|
+
* 3. Global config: ~/.mastracode/database.json → resourceId
|
|
338
|
+
* 4. null (use auto-detected value)
|
|
339
|
+
*/
|
|
262
340
|
function getResourceIdOverride(projectDir, configDirName = DEFAULT_CONFIG_DIR) {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
if (rid) return rid;
|
|
272
|
-
return null;
|
|
341
|
+
if (process.env.MASTRA_RESOURCE_ID) return process.env.MASTRA_RESOURCE_ID;
|
|
342
|
+
if (projectDir) {
|
|
343
|
+
const rid = loadStringField(path.join(projectDir, configDirName, "database.json"), "resourceId");
|
|
344
|
+
if (rid) return rid;
|
|
345
|
+
}
|
|
346
|
+
const rid = loadStringField(path.join(os.homedir(), configDirName, "database.json"), "resourceId");
|
|
347
|
+
if (rid) return rid;
|
|
348
|
+
return null;
|
|
273
349
|
}
|
|
274
350
|
function loadStringField(filePath, field) {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
} catch {
|
|
285
|
-
return null;
|
|
286
|
-
}
|
|
351
|
+
try {
|
|
352
|
+
if (!fs.existsSync(filePath)) return null;
|
|
353
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
354
|
+
const value = JSON.parse(raw)?.[field];
|
|
355
|
+
if (typeof value === "string" && value) return value;
|
|
356
|
+
return null;
|
|
357
|
+
} catch {
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
287
360
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
getCurrentGitBranch,
|
|
292
|
-
getCurrentGitBranchAsync,
|
|
293
|
-
getDatabasePath,
|
|
294
|
-
getObservabilityDatabasePath,
|
|
295
|
-
getOmScope,
|
|
296
|
-
getResourceIdOverride,
|
|
297
|
-
getStorageConfig,
|
|
298
|
-
getUserId,
|
|
299
|
-
getUserName,
|
|
300
|
-
getVectorDatabasePath
|
|
301
|
-
};
|
|
361
|
+
//#endregion
|
|
362
|
+
export { detectProject, getAppDataDir, getCurrentGitBranch, getCurrentGitBranchAsync, getDatabasePath, getObservabilityDatabasePath, getOmScope, getResourceIdOverride, getStorageConfig, getUserId, getUserName, getVectorDatabasePath };
|
|
363
|
+
|
|
302
364
|
//# sourceMappingURL=project.js.map
|