@agent-relay/dashboard-server 2.0.68 → 2.0.69
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/server.js +35 -0
- package/dist/server.js.map +1 -1
- package/out/404.html +1 -1
- package/out/about.html +1 -1
- package/out/about.txt +1 -1
- package/out/app/onboarding.html +1 -1
- package/out/app/onboarding.txt +1 -1
- package/out/app.html +1 -1
- package/out/app.txt +1 -1
- package/out/blog/go-to-bed-wake-up-to-a-finished-product.html +1 -1
- package/out/blog/go-to-bed-wake-up-to-a-finished-product.txt +1 -1
- package/out/blog/let-them-cook-multi-agent-orchestration.html +1 -1
- package/out/blog/let-them-cook-multi-agent-orchestration.txt +1 -1
- package/out/blog.html +1 -1
- package/out/blog.txt +1 -1
- package/out/careers.html +1 -1
- package/out/careers.txt +1 -1
- package/out/changelog.html +1 -1
- package/out/changelog.txt +1 -1
- package/out/cloud/link.html +1 -1
- package/out/cloud/link.txt +1 -1
- package/out/complete-profile.html +1 -1
- package/out/complete-profile.txt +1 -1
- package/out/connect-repos.html +1 -1
- package/out/connect-repos.txt +1 -1
- package/out/contact.html +1 -1
- package/out/contact.txt +1 -1
- package/out/docs.html +1 -1
- package/out/docs.txt +1 -1
- package/out/history.html +1 -1
- package/out/history.txt +1 -1
- package/out/index.html +1 -1
- package/out/index.txt +1 -1
- package/out/login.html +1 -1
- package/out/login.txt +1 -1
- package/out/metrics.html +1 -1
- package/out/metrics.txt +1 -1
- package/out/pricing.html +1 -1
- package/out/pricing.txt +1 -1
- package/out/privacy.html +1 -1
- package/out/privacy.txt +1 -1
- package/out/providers/setup/claude.html +1 -1
- package/out/providers/setup/claude.txt +1 -1
- package/out/providers/setup/codex.html +1 -1
- package/out/providers/setup/codex.txt +1 -1
- package/out/providers/setup/cursor.html +1 -1
- package/out/providers/setup/cursor.txt +1 -1
- package/out/providers.html +1 -1
- package/out/providers.txt +1 -1
- package/out/security.html +1 -1
- package/out/security.txt +1 -1
- package/out/signup.html +1 -1
- package/out/signup.txt +1 -1
- package/out/terms.html +1 -1
- package/out/terms.txt +1 -1
- package/package.json +1 -1
- /package/out/_next/static/{pIFM3z2Q4_ebl06dD0vjJ → ksklx6dOwf9cjVY6ez8ZH}/_buildManifest.js +0 -0
- /package/out/_next/static/{pIFM3z2Q4_ebl06dD0vjJ → ksklx6dOwf9cjVY6ez8ZH}/_ssgManifest.js +0 -0
package/dist/server.js
CHANGED
|
@@ -4840,6 +4840,41 @@ export async function startDashboard(portOrOptions, dataDirArg, teamDirArg, dbPa
|
|
|
4840
4840
|
res.status(500).json({ success: false, error: safeMessage });
|
|
4841
4841
|
}
|
|
4842
4842
|
});
|
|
4843
|
+
/**
|
|
4844
|
+
* POST /api/repos/remove - Remove a cloned repo directory from the workspace
|
|
4845
|
+
* Body: { fullName: "Owner/RepoName" }
|
|
4846
|
+
* Used by cloud API when a user removes a repo from their workspace settings.
|
|
4847
|
+
*/
|
|
4848
|
+
app.post('/api/repos/remove', async (req, res) => {
|
|
4849
|
+
const { fullName } = req.body;
|
|
4850
|
+
if (!fullName || typeof fullName !== 'string' || !fullName.includes('/')) {
|
|
4851
|
+
return res.status(400).json({ success: false, error: 'fullName is required (e.g., "Owner/RepoName")' });
|
|
4852
|
+
}
|
|
4853
|
+
if (!/^[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+$/.test(fullName)) {
|
|
4854
|
+
return res.status(400).json({ success: false, error: 'Invalid repository name format' });
|
|
4855
|
+
}
|
|
4856
|
+
const repoName = fullName.split('/').pop();
|
|
4857
|
+
const workspaceDir = process.env.WORKSPACE_DIR || path.dirname(projectRoot || dataDir);
|
|
4858
|
+
const targetDir = path.join(workspaceDir, repoName);
|
|
4859
|
+
// Verify the directory is inside the workspace dir (prevent path traversal)
|
|
4860
|
+
const resolvedTarget = path.resolve(targetDir);
|
|
4861
|
+
const resolvedWorkspace = path.resolve(workspaceDir);
|
|
4862
|
+
if (!resolvedTarget.startsWith(resolvedWorkspace + path.sep)) {
|
|
4863
|
+
return res.status(400).json({ success: false, error: 'Invalid path' });
|
|
4864
|
+
}
|
|
4865
|
+
if (!fs.existsSync(targetDir)) {
|
|
4866
|
+
return res.json({ success: true, message: 'Directory does not exist', path: targetDir });
|
|
4867
|
+
}
|
|
4868
|
+
try {
|
|
4869
|
+
fs.rmSync(targetDir, { recursive: true, force: true });
|
|
4870
|
+
console.log(`[api/repos/remove] Removed directory: ${targetDir}`);
|
|
4871
|
+
res.json({ success: true, path: targetDir });
|
|
4872
|
+
}
|
|
4873
|
+
catch (err) {
|
|
4874
|
+
console.error('[api/repos/remove] Remove failed:', err.message);
|
|
4875
|
+
res.status(500).json({ success: false, error: err.message || 'Remove failed' });
|
|
4876
|
+
}
|
|
4877
|
+
});
|
|
4843
4878
|
/**
|
|
4844
4879
|
* POST /api/spawn/architect - Spawn an Architect agent for bridge mode
|
|
4845
4880
|
* Body: { cli?: string }
|