studiograph 1.2.0-beta.9 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -18
- package/dist/agent/orchestrator.d.ts +56 -0
- package/dist/agent/orchestrator.js +167 -22
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/system.md +51 -63
- package/dist/agent/skill-loader.js +8 -0
- package/dist/agent/skill-loader.js.map +1 -1
- package/dist/agent/skills/entity-schema.md +4 -19
- package/dist/agent/skills/gather-context.md +1 -1
- package/dist/agent/tools/graph-tools.d.ts +41 -1
- package/dist/agent/tools/graph-tools.js +133 -57
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/ops-tools.js +82 -0
- package/dist/agent/tools/ops-tools.js.map +1 -1
- package/dist/agent/tools/permission-tools.d.ts +90 -0
- package/dist/agent/tools/permission-tools.js +207 -0
- package/dist/agent/tools/permission-tools.js.map +1 -0
- package/dist/agent/tools/sync-tools.js +2 -2
- package/dist/agent/tools/sync-tools.js.map +1 -1
- package/dist/auth/github.d.ts +1 -1
- package/dist/auth/github.js +21 -13
- package/dist/auth/github.js.map +1 -1
- package/dist/cli/commands/access.d.ts +11 -0
- package/dist/cli/commands/access.js +156 -0
- package/dist/cli/commands/access.js.map +1 -0
- package/dist/cli/commands/app.js +25 -2
- package/dist/cli/commands/app.js.map +1 -1
- package/dist/cli/commands/clear.d.ts +5 -0
- package/dist/cli/commands/clear.js +36 -0
- package/dist/cli/commands/clear.js.map +1 -0
- package/dist/cli/commands/clone.js +3 -3
- package/dist/cli/commands/clone.js.map +1 -1
- package/dist/cli/commands/collection.d.ts +10 -0
- package/dist/cli/commands/collection.js +187 -0
- package/dist/cli/commands/collection.js.map +1 -0
- package/dist/cli/commands/commit.js +2 -1
- package/dist/cli/commands/commit.js.map +1 -1
- package/dist/cli/commands/config.d.ts +100 -0
- package/dist/cli/commands/config.js +1 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/deploy.js +10 -1
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/index.js +1 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.js +32 -40
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/join.d.ts +0 -6
- package/dist/cli/commands/join.js +26 -111
- package/dist/cli/commands/join.js.map +1 -1
- package/dist/cli/commands/lint.js +1 -2
- package/dist/cli/commands/lint.js.map +1 -1
- package/dist/cli/commands/mcp.js +6 -5
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/org.d.ts +10 -0
- package/dist/cli/commands/org.js +132 -0
- package/dist/cli/commands/org.js.map +1 -0
- package/dist/cli/commands/orphans.js +1 -2
- package/dist/cli/commands/orphans.js.map +1 -1
- package/dist/cli/commands/provision.js +3 -3
- package/dist/cli/commands/provision.js.map +1 -1
- package/dist/cli/commands/resolve.d.ts +8 -0
- package/dist/cli/commands/resolve.js +85 -0
- package/dist/cli/commands/resolve.js.map +1 -0
- package/dist/cli/commands/serve.js +55 -25
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/start.js +22 -205
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/sync.js +53 -8
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/team.d.ts +12 -0
- package/dist/cli/commands/team.js +185 -0
- package/dist/cli/commands/team.js.map +1 -0
- package/dist/cli/index.js +41 -34
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/scaffolding.d.ts +5 -3
- package/dist/cli/scaffolding.js +191 -97
- package/dist/cli/scaffolding.js.map +1 -1
- package/dist/cli/setup-wizard.js +20 -10
- package/dist/cli/setup-wizard.js.map +1 -1
- package/dist/cli/sync-review-interactive.js +1 -1
- package/dist/cli/sync-review-interactive.js.map +1 -1
- package/dist/core/graph.d.ts +5 -10
- package/dist/core/graph.js +84 -85
- package/dist/core/graph.js.map +1 -1
- package/dist/core/migration-runner.d.ts +42 -0
- package/dist/core/migration-runner.js +232 -0
- package/dist/core/migration-runner.js.map +1 -0
- package/dist/core/migration-types.d.ts +101 -0
- package/dist/core/migration-types.js +21 -0
- package/dist/core/migration-types.js.map +1 -0
- package/dist/core/migrations/20260219-formalize-memory-location.d.ts +2 -0
- package/dist/core/migrations/20260219-formalize-memory-location.js +35 -0
- package/dist/core/migrations/20260219-formalize-memory-location.js.map +1 -0
- package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +12 -0
- package/dist/core/migrations/20260220-add-workspace-metadata.js +65 -0
- package/dist/core/migrations/20260220-add-workspace-metadata.js.map +1 -0
- package/dist/core/migrations/20260220-add-workspace-readme.d.ts +11 -0
- package/dist/core/migrations/20260220-add-workspace-readme.js +82 -0
- package/dist/core/migrations/20260220-add-workspace-readme.js.map +1 -0
- package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +9 -0
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js +64 -0
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +1 -0
- package/dist/core/migrations/index.d.ts +11 -0
- package/dist/core/migrations/index.js +23 -0
- package/dist/core/migrations/index.js.map +1 -0
- package/dist/core/types.d.ts +19 -34
- package/dist/core/types.js +3 -21
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +27 -0
- package/dist/core/user-config.js +51 -0
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +978 -2182
- package/dist/core/validation.js +242 -397
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +32 -31
- package/dist/core/workspace-manager.js +171 -186
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +0 -5
- package/dist/core/workspace.js +33 -101
- package/dist/core/workspace.js.map +1 -1
- package/dist/lib/lib/utils.d.ts +2 -0
- package/dist/lib/lib/utils.js +6 -0
- package/dist/lib/lib/utils.js.map +1 -0
- package/dist/mcp/tools.js +13 -13
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/chrome/chrome.css +562 -0
- package/dist/server/chrome/chrome.js +540 -0
- package/dist/server/index.js +163 -10
- package/dist/server/index.js.map +1 -1
- package/dist/server/plugin-loader.d.ts +7 -0
- package/dist/server/plugin-loader.js +9 -1
- package/dist/server/plugin-loader.js.map +1 -1
- package/dist/server/routes/chat.d.ts +3 -2
- package/dist/server/routes/chat.js +67 -16
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/git-api.d.ts +9 -0
- package/dist/server/routes/git-api.js +82 -0
- package/dist/server/routes/git-api.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +2 -2
- package/dist/server/routes/graph-api.js +267 -3
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/permissions-api.d.ts +9 -0
- package/dist/server/routes/permissions-api.js +176 -0
- package/dist/server/routes/permissions-api.js.map +1 -0
- package/dist/server/routes/workspace-api.d.ts +9 -0
- package/dist/server/routes/workspace-api.js +283 -0
- package/dist/server/routes/workspace-api.js.map +1 -0
- package/dist/services/assets/base.d.ts +2 -2
- package/dist/services/assets/base.js +4 -4
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +6 -6
- package/dist/services/assets/index.js +12 -12
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/git.d.ts +35 -0
- package/dist/services/git.js +93 -0
- package/dist/services/git.js.map +1 -1
- package/dist/services/github-provisioner.js +1 -2
- package/dist/services/github-provisioner.js.map +1 -1
- package/dist/services/github-service.d.ts +99 -0
- package/dist/services/github-service.js +310 -0
- package/dist/services/github-service.js.map +1 -0
- package/dist/services/markdown.js +4 -9
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/memory-service.d.ts +4 -0
- package/dist/services/memory-service.js +13 -1
- package/dist/services/memory-service.js.map +1 -1
- package/dist/services/sync/commit.d.ts +2 -0
- package/dist/services/sync/commit.js +21 -6
- package/dist/services/sync/commit.js.map +1 -1
- package/dist/services/sync/graphrag-indexer.js +2 -2
- package/dist/services/sync/graphrag-indexer.js.map +1 -1
- package/dist/utils/git.d.ts +5 -0
- package/dist/utils/git.js +10 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/merge-resolver.d.ts +33 -8
- package/dist/utils/merge-resolver.js +157 -55
- package/dist/utils/merge-resolver.js.map +1 -1
- package/dist/utils/preflight.d.ts +1 -1
- package/dist/utils/preflight.js +1 -1
- package/dist/web/_app/env.js +1 -0
- package/dist/web/_app/immutable/assets/0.CDbX4Cwz.css +1 -0
- package/dist/web/_app/immutable/assets/2.DRHi7ABa.css +1 -0
- package/dist/web/_app/immutable/assets/3.BJy7pVXi.css +1 -0
- package/dist/web/_app/immutable/assets/4.Ad16uh9o.css +1 -0
- package/dist/web/_app/immutable/assets/5.BhKgiXd2.css +1 -0
- package/dist/web/_app/immutable/assets/6.CeHKR5ZY.css +1 -0
- package/dist/web/_app/immutable/assets/AppShell.CXdE5aqF.css +1 -0
- package/dist/web/_app/immutable/assets/ChatPanel.RFD5GGYI.css +1 -0
- package/dist/web/_app/immutable/assets/editor.CPAf2SRV.css +1 -0
- package/dist/web/_app/immutable/chunks/3_5VIr68.js +1 -0
- package/dist/web/_app/immutable/chunks/4QY4j-jX.js +1 -0
- package/dist/web/_app/immutable/chunks/B0nldqWF.js +23 -0
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +3383 -0
- package/dist/web/_app/immutable/chunks/BButMJ6M.js +1 -0
- package/dist/web/_app/immutable/chunks/BiubvAUI.js +2 -0
- package/dist/web/_app/immutable/chunks/CAXuTUkp.js +1 -0
- package/dist/web/_app/immutable/chunks/CUzqHQY_.js +1 -0
- package/dist/web/_app/immutable/chunks/CYrVHOHA.js +1 -0
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +1 -0
- package/dist/web/_app/immutable/chunks/DPmdIe6Y.js +1 -0
- package/dist/web/_app/immutable/chunks/Dh_H7Owr.js +18 -0
- package/dist/web/_app/immutable/chunks/DnlgZ_Tk.js +5 -0
- package/dist/web/_app/immutable/chunks/DsERsGWg.js +64 -0
- package/dist/web/_app/immutable/chunks/DtVH--hH.js +6 -0
- package/dist/web/_app/immutable/chunks/F20aIBpJ.js +1 -0
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +1 -0
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +1 -0
- package/dist/web/_app/immutable/chunks/YFT1281h.js +2 -0
- package/dist/web/_app/immutable/chunks/aosHekRC.js +1 -0
- package/dist/web/_app/immutable/chunks/fwnBoL5x.js +1 -0
- package/dist/web/_app/immutable/chunks/hHxe9oXh.js +1 -0
- package/dist/web/_app/immutable/chunks/nZKqDQ0w.js +6 -0
- package/dist/web/_app/immutable/entry/app.B6Ngvu5P.js +2 -0
- package/dist/web/_app/immutable/entry/start.NykKAKQv.js +1 -0
- package/dist/web/_app/immutable/nodes/0.DQ5KdeNU.js +1 -0
- package/dist/web/_app/immutable/nodes/1.BR6DZ9ov.js +1 -0
- package/dist/web/_app/immutable/nodes/2.COSjVZ_C.js +1 -0
- package/dist/web/_app/immutable/nodes/3.B9r1XIlO.js +1 -0
- package/dist/web/_app/immutable/nodes/4.p-c6hlFf.js +16 -0
- package/dist/web/_app/immutable/nodes/5.CPc-Bqal.js +4 -0
- package/dist/web/_app/immutable/nodes/6.jJ67YnBc.js +2 -0
- package/dist/web/_app/version.json +1 -0
- package/dist/web/index.html +43 -0
- package/package.json +21 -3
- package/dist/agent/skills/bundled/enrich-entities.md +0 -124
- package/dist/agent/skills/bundled/gather-context.md +0 -46
|
@@ -1,15 +1,119 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Graph API routes
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* REST façade over WorkspaceManager.
|
|
5
|
+
* Read endpoints are unauthenticated; write endpoints require auth.
|
|
6
6
|
*/
|
|
7
|
+
import { Workspace } from '../../core/workspace.js';
|
|
8
|
+
import { existsSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
7
10
|
export async function registerGraphApiRoutes(fastify, workspaceManager) {
|
|
8
|
-
//
|
|
11
|
+
// POST /api/repos — create a new collection
|
|
12
|
+
fastify.post('/api/repos', async (req, reply) => {
|
|
13
|
+
const { name, description, private: isPrivate } = req.body || {};
|
|
14
|
+
if (!name || !/^[a-z0-9][a-z0-9-]*$/.test(name)) {
|
|
15
|
+
return reply.status(400).send({ error: 'Collection name must be kebab-case' });
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const workspace = new Workspace(workspaceManager['workspacePath']);
|
|
19
|
+
const repo = await workspace.registerRepo({ name, description, private: isPrivate });
|
|
20
|
+
workspaceManager.reloadConfig();
|
|
21
|
+
return reply.status(201).send(repo);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
return reply.status(409).send({ error: err.message });
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
// DELETE /api/repos/:repo — remove a collection and delete its files
|
|
28
|
+
fastify.delete('/api/repos/:repo', async (req, reply) => {
|
|
29
|
+
const { repo } = req.params;
|
|
30
|
+
try {
|
|
31
|
+
const workspace = new Workspace(workspaceManager['workspacePath']);
|
|
32
|
+
const config = await workspace.loadConfig();
|
|
33
|
+
const repoIndex = config.repos.findIndex(r => r.name === repo);
|
|
34
|
+
if (repoIndex === -1) {
|
|
35
|
+
return reply.status(404).send({ error: `Collection "${repo}" not found` });
|
|
36
|
+
}
|
|
37
|
+
const repoConfig = config.repos[repoIndex];
|
|
38
|
+
const repoPath = join(workspaceManager['workspacePath'], repoConfig.path);
|
|
39
|
+
// Remove from config
|
|
40
|
+
config.repos.splice(repoIndex, 1);
|
|
41
|
+
workspace.writeConfig(config);
|
|
42
|
+
// Delete files
|
|
43
|
+
const { rmSync } = await import('fs');
|
|
44
|
+
if (existsSync(repoPath)) {
|
|
45
|
+
rmSync(repoPath, { recursive: true, force: true });
|
|
46
|
+
}
|
|
47
|
+
workspaceManager.reloadConfig();
|
|
48
|
+
return reply.status(200).send({ success: true });
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
return reply.status(500).send({ error: err.message });
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// PATCH /api/repos/:repo — rename a collection
|
|
55
|
+
fastify.patch('/api/repos/:repo', async (req, reply) => {
|
|
56
|
+
const { repo } = req.params;
|
|
57
|
+
const { name: newName, ...rest } = req.body || {};
|
|
58
|
+
if ('private' in rest) {
|
|
59
|
+
return reply.status(400).send({ error: 'The private flag is immutable after creation' });
|
|
60
|
+
}
|
|
61
|
+
if (!newName || !/^[a-z0-9][a-z0-9-]*$/.test(newName)) {
|
|
62
|
+
return reply.status(400).send({ error: 'New name must be kebab-case' });
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const workspace = new Workspace(workspaceManager['workspacePath']);
|
|
66
|
+
const config = await workspace.loadConfig();
|
|
67
|
+
const repoConfig = config.repos.find(r => r.name === repo);
|
|
68
|
+
if (!repoConfig) {
|
|
69
|
+
return reply.status(404).send({ error: `Collection "${repo}" not found` });
|
|
70
|
+
}
|
|
71
|
+
if (config.repos.some(r => r.name === newName)) {
|
|
72
|
+
return reply.status(409).send({ error: `Collection "${newName}" already exists` });
|
|
73
|
+
}
|
|
74
|
+
const wsPath = workspaceManager['workspacePath'];
|
|
75
|
+
const oldPath = join(wsPath, repoConfig.path);
|
|
76
|
+
const newPath = join(wsPath, newName);
|
|
77
|
+
// Rename directory
|
|
78
|
+
const { renameSync, writeFileSync: writeFS } = await import('fs');
|
|
79
|
+
if (existsSync(oldPath)) {
|
|
80
|
+
renameSync(oldPath, newPath);
|
|
81
|
+
}
|
|
82
|
+
// Update config
|
|
83
|
+
repoConfig.name = newName;
|
|
84
|
+
repoConfig.path = newName;
|
|
85
|
+
workspace.writeConfig(config);
|
|
86
|
+
// Update .studiograph marker
|
|
87
|
+
const markerPath = join(newPath, '.studiograph');
|
|
88
|
+
if (existsSync(markerPath)) {
|
|
89
|
+
writeFS(markerPath, JSON.stringify({ repo_name: newName }, null, 2), 'utf-8');
|
|
90
|
+
}
|
|
91
|
+
workspaceManager.reloadConfig();
|
|
92
|
+
return reply.send(repoConfig);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return reply.status(500).send({ error: err.message });
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
// GET /api/repos — list all accessible repos (re-reads config to pick up CLI changes)
|
|
9
99
|
fastify.get('/api/repos', async (_req, reply) => {
|
|
100
|
+
workspaceManager.reloadConfig();
|
|
10
101
|
const repos = workspaceManager.getAllRepoConfigs();
|
|
11
102
|
return reply.send(repos);
|
|
12
103
|
});
|
|
104
|
+
// GET /api/repos/:repo/entities — list all entities in a repo
|
|
105
|
+
fastify.get('/api/repos/:repo/entities', async (req, reply) => {
|
|
106
|
+
const { repo } = req.params;
|
|
107
|
+
let graph;
|
|
108
|
+
try {
|
|
109
|
+
graph = workspaceManager.getGraph(repo);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
return reply.status(404).send({ error: err.message });
|
|
113
|
+
}
|
|
114
|
+
const entities = graph.search({});
|
|
115
|
+
return reply.send(entities);
|
|
116
|
+
});
|
|
13
117
|
// GET /api/repos/:repo/entities/:type — list entities of a type
|
|
14
118
|
fastify.get('/api/repos/:repo/entities/:type', async (req, reply) => {
|
|
15
119
|
const { repo, type } = req.params;
|
|
@@ -39,6 +143,33 @@ export async function registerGraphApiRoutes(fastify, workspaceManager) {
|
|
|
39
143
|
}
|
|
40
144
|
return reply.send(entity);
|
|
41
145
|
});
|
|
146
|
+
// GET /api/repos/:repo/entities/:type/:id/contents — list sub-content in entity folder
|
|
147
|
+
fastify.get('/api/repos/:repo/entities/:type/:id/contents', async (req, reply) => {
|
|
148
|
+
const { repo, type, id } = req.params;
|
|
149
|
+
let graph;
|
|
150
|
+
try {
|
|
151
|
+
graph = workspaceManager.getGraph(repo);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
return reply.status(404).send({ error: err.message });
|
|
155
|
+
}
|
|
156
|
+
// Sub-content removed — entities are flat files now
|
|
157
|
+
return reply.send([]);
|
|
158
|
+
});
|
|
159
|
+
// GET /api/repos/:repo/entities/:type/:id/contents/* — read a sub-content file
|
|
160
|
+
fastify.get('/api/repos/:repo/entities/:type/:id/contents/*', async (req, reply) => {
|
|
161
|
+
const { repo, type, id } = req.params;
|
|
162
|
+
const filePath = req.params['*'];
|
|
163
|
+
let graph;
|
|
164
|
+
try {
|
|
165
|
+
graph = workspaceManager.getGraph(repo);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
return reply.status(404).send({ error: err.message });
|
|
169
|
+
}
|
|
170
|
+
// Sub-content removed — entities are flat files now
|
|
171
|
+
return reply.status(404).send({ error: 'Sub-content not supported in flat file layout' });
|
|
172
|
+
});
|
|
42
173
|
// GET /api/repos/:repo/search?q=&type=&tags= — search within a repo
|
|
43
174
|
fastify.get('/api/repos/:repo/search', async (req, reply) => {
|
|
44
175
|
const { repo } = req.params;
|
|
@@ -57,6 +188,48 @@ export async function registerGraphApiRoutes(fastify, workspaceManager) {
|
|
|
57
188
|
});
|
|
58
189
|
return reply.send(results);
|
|
59
190
|
});
|
|
191
|
+
// GET /api/graph — full workspace graph topology (nodes + edges)
|
|
192
|
+
fastify.get('/api/graph', async (_req, reply) => {
|
|
193
|
+
const repos = workspaceManager.getAllRepoConfigs();
|
|
194
|
+
const nodes = [];
|
|
195
|
+
const edgeSet = new Set();
|
|
196
|
+
const edges = [];
|
|
197
|
+
const entityIds = new Set();
|
|
198
|
+
for (const repoConfig of repos) {
|
|
199
|
+
try {
|
|
200
|
+
const graph = workspaceManager.getGraph(repoConfig.name);
|
|
201
|
+
const entities = graph.search({});
|
|
202
|
+
for (const entity of entities) {
|
|
203
|
+
const nodeId = entity.id;
|
|
204
|
+
if (nodeId.toLowerCase().startsWith('readme'))
|
|
205
|
+
continue;
|
|
206
|
+
if (!entityIds.has(nodeId)) {
|
|
207
|
+
entityIds.add(nodeId);
|
|
208
|
+
nodes.push({
|
|
209
|
+
id: nodeId,
|
|
210
|
+
type: entity.entityType,
|
|
211
|
+
repo: repoConfig.name,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
// Extract wikilinks as edges
|
|
215
|
+
const wikilinks = entity.document?.wikilinks ?? [];
|
|
216
|
+
for (const target of wikilinks) {
|
|
217
|
+
const key = nodeId < target ? `${nodeId}|${target}` : `${target}|${nodeId}`;
|
|
218
|
+
if (!edgeSet.has(key) && nodeId !== target) {
|
|
219
|
+
edgeSet.add(key);
|
|
220
|
+
edges.push({ source: nodeId, target });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// Skip repos that can't be loaded
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Filter edges to only include both endpoints that exist as nodes
|
|
230
|
+
const validEdges = edges.filter(e => entityIds.has(e.source) && entityIds.has(e.target));
|
|
231
|
+
return reply.send({ nodes, edges: validEdges });
|
|
232
|
+
});
|
|
60
233
|
// GET /api/search?q=&type=&tags=&repos= — cross-repo search
|
|
61
234
|
fastify.get('/api/search', async (req, reply) => {
|
|
62
235
|
const { q, type, tags, repos } = req.query;
|
|
@@ -68,5 +241,96 @@ export async function registerGraphApiRoutes(fastify, workspaceManager) {
|
|
|
68
241
|
});
|
|
69
242
|
return reply.send(results);
|
|
70
243
|
});
|
|
244
|
+
// PUT /api/repos/:repo/entities/:type/:id — update entity (data and/or content)
|
|
245
|
+
fastify.put('/api/repos/:repo/entities/:type/:id', async (req, reply) => {
|
|
246
|
+
const { repo, type, id } = req.params;
|
|
247
|
+
let graph;
|
|
248
|
+
try {
|
|
249
|
+
graph = workspaceManager.getGraph(repo);
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
return reply.status(404).send({ error: err.message });
|
|
253
|
+
}
|
|
254
|
+
try {
|
|
255
|
+
const updated = await graph.update({
|
|
256
|
+
entityType: type,
|
|
257
|
+
entityId: id,
|
|
258
|
+
data: req.body.data,
|
|
259
|
+
content: req.body.content,
|
|
260
|
+
commitMessage: `Update ${type}/${id} from web UI`,
|
|
261
|
+
skipCommit: true,
|
|
262
|
+
});
|
|
263
|
+
return reply.send(updated);
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
return reply.status(400).send({ error: err.message });
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
// DELETE /api/repos/:repo/entities/:type/:id — delete an entity
|
|
270
|
+
fastify.delete('/api/repos/:repo/entities/:type/:id', async (req, reply) => {
|
|
271
|
+
const { repo, type, id } = req.params;
|
|
272
|
+
let graph;
|
|
273
|
+
try {
|
|
274
|
+
graph = workspaceManager.getGraph(repo);
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
return reply.status(404).send({ error: err.message });
|
|
278
|
+
}
|
|
279
|
+
try {
|
|
280
|
+
await graph.delete(type, id, `Delete ${type}/${id} from web UI`);
|
|
281
|
+
return reply.send({ ok: true });
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
return reply.status(400).send({ error: err.message });
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
// POST /api/repos/:repo/entities — create a new entity
|
|
288
|
+
fastify.post('/api/repos/:repo/entities', async (req, reply) => {
|
|
289
|
+
const { repo } = req.params;
|
|
290
|
+
const { entityType, entityId, data = {}, content = '' } = req.body;
|
|
291
|
+
if (!entityType || !entityId) {
|
|
292
|
+
return reply.status(400).send({ error: 'entityType and entityId are required' });
|
|
293
|
+
}
|
|
294
|
+
let graph;
|
|
295
|
+
try {
|
|
296
|
+
graph = workspaceManager.getGraph(repo);
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
return reply.status(404).send({ error: err.message });
|
|
300
|
+
}
|
|
301
|
+
try {
|
|
302
|
+
const entity = await graph.create({
|
|
303
|
+
entityType: entityType,
|
|
304
|
+
entityId,
|
|
305
|
+
data: { entity_type: entityType, entity_id: entityId, ...data },
|
|
306
|
+
content,
|
|
307
|
+
commitMessage: `Create ${entityType}/${entityId} from web UI`,
|
|
308
|
+
skipCommit: true,
|
|
309
|
+
});
|
|
310
|
+
return reply.status(201).send(entity);
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
return reply.status(400).send({ error: err.message });
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
// PUT /api/repos/:repo/entities/:type/:id/contents/* — write a sub-content file
|
|
317
|
+
fastify.put('/api/repos/:repo/entities/:type/:id/contents/*', async (req, reply) => {
|
|
318
|
+
const { repo, type, id } = req.params;
|
|
319
|
+
const filePath = req.params['*'];
|
|
320
|
+
let graph;
|
|
321
|
+
try {
|
|
322
|
+
graph = workspaceManager.getGraph(repo);
|
|
323
|
+
}
|
|
324
|
+
catch (err) {
|
|
325
|
+
return reply.status(404).send({ error: err.message });
|
|
326
|
+
}
|
|
327
|
+
try {
|
|
328
|
+
// Sub-content removed — entities are flat files now
|
|
329
|
+
return reply.status(400).send({ error: 'Sub-content not supported in flat file layout' });
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
return reply.status(400).send({ error: err.message });
|
|
333
|
+
}
|
|
334
|
+
});
|
|
71
335
|
}
|
|
72
336
|
//# sourceMappingURL=graph-api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-api.js","sourceRoot":"","sources":["../../../src/server/routes/graph-api.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"graph-api.js","sourceRoot":"","sources":["../../../src/server/routes/graph-api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAwB,EACxB,gBAAkC;IAElC,4CAA4C;IAC5C,OAAO,CAAC,IAAI,CACV,YAAY,EACZ,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACjE,IAAI,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC;YACnE,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YACrF,gBAAgB,CAAC,YAAY,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,OAAO,CAAC,MAAM,CACZ,kBAAkB,EAClB,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC/D,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;gBACrB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,IAAI,aAAa,EAAE,CAAC,CAAC;YAC7E,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;YAE1E,qBAAqB;YACrB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAClC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAE9B,eAAe;YACf,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC;YAED,gBAAgB,CAAC,YAAY,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CACF,CAAC;IAEF,+CAA+C;IAC/C,OAAO,CAAC,KAAK,CACX,kBAAkB,EAClB,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAC5B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,EAAS,CAAC;QACzD,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,CAAC,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;YAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC3D,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,IAAI,aAAa,EAAE,CAAC,CAAC;YAC7E,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;gBAC/C,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,OAAO,kBAAkB,EAAE,CAAC,CAAC;YACrF,CAAC;YAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAEtC,mBAAmB;YACnB,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAClE,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/B,CAAC;YAED,gBAAgB;YAChB,UAAU,CAAC,IAAI,GAAG,OAAO,CAAC;YAC1B,UAAU,CAAC,IAAI,GAAG,OAAO,CAAC;YAC1B,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAE9B,6BAA6B;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACjD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAChF,CAAC;YAED,gBAAgB,CAAC,YAAY,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CACF,CAAC;IAEF,sFAAsF;IACtF,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAC9C,gBAAgB,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,gBAAgB,CAAC,iBAAiB,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,8DAA8D;IAC9D,OAAO,CAAC,GAAG,CACT,2BAA2B,EAC3B,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAE5B,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC,CACF,CAAC;IAEF,gEAAgE;IAChE,OAAO,CAAC,GAAG,CACT,iCAAiC,EACjC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAElC,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAkB,EAAE,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC,CACF,CAAC;IAEF,8DAA8D;IAC9D,OAAO,CAAC,GAAG,CACT,qCAAqC,EACrC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAEtC,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAkB,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,uFAAuF;IACvF,OAAO,CAAC,GAAG,CACT,8CAA8C,EAC9C,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAEtC,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,oDAAoD;QACpD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC,CACF,CAAC;IAEF,+EAA+E;IAC/E,OAAO,CAAC,GAAG,CACT,gDAAgD,EAChD,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,oDAAoD;QACpD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC,CAAC;IAC5F,CAAC,CACF,CAAC;IAEF,oEAAoE;IACpE,OAAO,CAAC,GAAG,CAIT,yBAAyB,EACzB,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAC5B,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;QAEpC,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;YAC3B,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,IAA8B;YAC1C,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC,CACF,CAAC;IAEF,iEAAiE;IACjE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAC9C,MAAM,KAAK,GAAG,gBAAgB,CAAC,iBAAiB,EAAE,CAAC;QACnD,MAAM,KAAK,GAAsD,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,KAAK,GAA8C,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QAEpC,KAAK,MAAM,UAAU,IAAI,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAElC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;oBAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;oBACzB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;wBAAE,SAAS;oBACxD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC3B,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;wBACtB,KAAK,CAAC,IAAI,CAAC;4BACT,EAAE,EAAE,MAAM;4BACV,IAAI,EAAE,MAAM,CAAC,UAAU;4BACvB,IAAI,EAAE,UAAU,CAAC,IAAI;yBACtB,CAAC,CAAC;oBACL,CAAC;oBAED,6BAA6B;oBAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC;oBACnD,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;wBAC/B,MAAM,GAAG,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;wBAC5E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;4BAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BACjB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;wBACzC,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,kCAAkC;YACpC,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAEzF,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,4DAA4D;IAC5D,OAAO,CAAC,GAAG,CAGT,aAAa,EACb,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;QAE3C,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC;YAC5C,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,IAA8B;YAC1C,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YAC3D,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;SACnE,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC,CACF,CAAC;IAEF,gFAAgF;IAChF,OAAO,CAAC,GAAG,CAIT,qCAAqC,EACrC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAEtC,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;gBACjC,UAAU,EAAE,IAAkB;gBAC9B,QAAQ,EAAE,EAAE;gBACZ,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;gBACnB,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO;gBACzB,aAAa,EAAE,UAAU,IAAI,IAAI,EAAE,cAAc;gBACjD,UAAU,EAAE,IAAI;aACjB,CAAC,CAAC;YACH,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CACF,CAAC;IAEF,gEAAgE;IAChE,OAAO,CAAC,MAAM,CACZ,qCAAqC,EACrC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QACtC,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,MAAM,CAAC,IAAkB,EAAE,EAAE,EAAE,UAAU,IAAI,IAAI,EAAE,cAAc,CAAC,CAAC;YAC/E,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CACF,CAAC;IAEF,uDAAuD;IACvD,OAAO,CAAC,IAAI,CAIV,2BAA2B,EAC3B,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAC5B,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAEnE,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;gBAChC,UAAU,EAAE,UAAwB;gBACpC,QAAQ;gBACR,IAAI,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE;gBAC/D,OAAO;gBACP,aAAa,EAAE,UAAU,UAAU,IAAI,QAAQ,cAAc;gBAC7D,UAAU,EAAE,IAAI;aACjB,CAAC,CAAC;YACH,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CACF,CAAC;IAEF,gFAAgF;IAChF,OAAO,CAAC,GAAG,CAIT,gDAAgD,EAChD,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,CAAC;YACH,oDAAoD;YACpD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC,CAAC;QAC5F,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permissions API routes
|
|
3
|
+
*
|
|
4
|
+
* GitHub-based org, team, and repo access management.
|
|
5
|
+
* Only available when GitHub org is configured and user has a valid token.
|
|
6
|
+
*/
|
|
7
|
+
import type { FastifyInstance } from 'fastify';
|
|
8
|
+
import { WorkspaceConfig } from '../../core/types.js';
|
|
9
|
+
export declare function registerPermissionsApiRoutes(fastify: FastifyInstance, workspaceConfig: WorkspaceConfig): Promise<void>;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permissions API routes
|
|
3
|
+
*
|
|
4
|
+
* GitHub-based org, team, and repo access management.
|
|
5
|
+
* Only available when GitHub org is configured and user has a valid token.
|
|
6
|
+
*/
|
|
7
|
+
import { loadToken, getAuthenticatedOctokit } from '../../auth/github.js';
|
|
8
|
+
import { GitHubService } from '../../services/github-service.js';
|
|
9
|
+
function getGitHubService(config) {
|
|
10
|
+
const org = config.github?.org;
|
|
11
|
+
if (!org)
|
|
12
|
+
return null;
|
|
13
|
+
const stored = loadToken();
|
|
14
|
+
if (!stored)
|
|
15
|
+
return null;
|
|
16
|
+
const octokit = getAuthenticatedOctokit(stored.token);
|
|
17
|
+
return new GitHubService(octokit, org);
|
|
18
|
+
}
|
|
19
|
+
export async function registerPermissionsApiRoutes(fastify, workspaceConfig) {
|
|
20
|
+
// GET /api/permissions/role — current user's org role and login
|
|
21
|
+
fastify.get('/api/permissions/role', async (_req, reply) => {
|
|
22
|
+
const stored = loadToken();
|
|
23
|
+
const service = getGitHubService(workspaceConfig);
|
|
24
|
+
if (!service) {
|
|
25
|
+
return reply.send({ role: null, login: null, reason: 'not_configured' });
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const role = await service.getCurrentUserRole();
|
|
29
|
+
return reply.send({ role, login: stored?.user?.login ?? null });
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
return reply.status(500).send({ error: err.message });
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
// GET /api/permissions/members — list org members
|
|
36
|
+
fastify.get('/api/permissions/members', async (_req, reply) => {
|
|
37
|
+
const service = getGitHubService(workspaceConfig);
|
|
38
|
+
if (!service) {
|
|
39
|
+
return reply.status(400).send({ error: 'GitHub not configured' });
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const members = await service.listMembers();
|
|
43
|
+
return reply.send(members);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
return reply.status(500).send({ error: err.message });
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
// POST /api/permissions/members/invite — invite user to org
|
|
50
|
+
fastify.post('/api/permissions/members/invite', async (req, reply) => {
|
|
51
|
+
const service = getGitHubService(workspaceConfig);
|
|
52
|
+
if (!service) {
|
|
53
|
+
return reply.status(400).send({ error: 'GitHub not configured' });
|
|
54
|
+
}
|
|
55
|
+
const { username } = req.body ?? {};
|
|
56
|
+
if (!username) {
|
|
57
|
+
return reply.status(400).send({ error: 'username is required' });
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const isMember = await service.isOrgMember(username);
|
|
61
|
+
if (isMember) {
|
|
62
|
+
return reply.send({ status: 'already_member' });
|
|
63
|
+
}
|
|
64
|
+
await service.inviteUser(username);
|
|
65
|
+
return reply.send({ status: 'invited' });
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
if (err?.status === 422) {
|
|
69
|
+
return reply.send({ status: 'already_invited' });
|
|
70
|
+
}
|
|
71
|
+
return reply.status(err?.status ?? 500).send({ error: err.message });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
// DELETE /api/permissions/members/:username — remove user from org
|
|
75
|
+
fastify.delete('/api/permissions/members/:username', async (req, reply) => {
|
|
76
|
+
const service = getGitHubService(workspaceConfig);
|
|
77
|
+
if (!service) {
|
|
78
|
+
return reply.status(400).send({ error: 'GitHub not configured' });
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
await service.removeUser(req.params.username);
|
|
82
|
+
return reply.send({ ok: true });
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
return reply.status(err?.status ?? 500).send({ error: err.message });
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
// GET /api/permissions/collections — access info for all collections
|
|
89
|
+
fastify.get('/api/permissions/collections', async (_req, reply) => {
|
|
90
|
+
const service = getGitHubService(workspaceConfig);
|
|
91
|
+
if (!service) {
|
|
92
|
+
return reply.status(400).send({ error: 'GitHub not configured' });
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const repos = workspaceConfig.repos ?? [];
|
|
96
|
+
const results = await Promise.all(repos
|
|
97
|
+
.filter(r => !r.private)
|
|
98
|
+
.map(async (repo) => {
|
|
99
|
+
const repoName = extractRepoName(repo.github_url) ?? repo.name;
|
|
100
|
+
try {
|
|
101
|
+
const access = await service.getRepoAccess(repoName);
|
|
102
|
+
return { collection: repo.name, repoName, ...access };
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return { collection: repo.name, repoName, teams: [], collaborators: [] };
|
|
106
|
+
}
|
|
107
|
+
}));
|
|
108
|
+
return reply.send(results);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
return reply.status(500).send({ error: err.message });
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
// POST /api/permissions/collections/:collection/grant — grant user access via auto-team
|
|
115
|
+
fastify.post('/api/permissions/collections/:collection/grant', async (req, reply) => {
|
|
116
|
+
const service = getGitHubService(workspaceConfig);
|
|
117
|
+
if (!service) {
|
|
118
|
+
return reply.status(400).send({ error: 'GitHub not configured' });
|
|
119
|
+
}
|
|
120
|
+
const { username, permission } = req.body ?? {};
|
|
121
|
+
if (!username) {
|
|
122
|
+
return reply.status(400).send({ error: 'username is required' });
|
|
123
|
+
}
|
|
124
|
+
const repo = findRepo(workspaceConfig, req.params.collection);
|
|
125
|
+
if (!repo) {
|
|
126
|
+
return reply.status(404).send({ error: 'Collection not found' });
|
|
127
|
+
}
|
|
128
|
+
const repoName = extractRepoName(repo.github_url) ?? repo.name;
|
|
129
|
+
try {
|
|
130
|
+
const result = await service.grantAccessViaTeam(repoName, username, permission ?? 'push');
|
|
131
|
+
return reply.send(result);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
return reply.status(err?.status ?? 500).send({ error: err.message });
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
// DELETE /api/permissions/collections/:collection/revoke/:username — revoke user access
|
|
138
|
+
fastify.delete('/api/permissions/collections/:collection/revoke/:username', async (req, reply) => {
|
|
139
|
+
const service = getGitHubService(workspaceConfig);
|
|
140
|
+
if (!service) {
|
|
141
|
+
return reply.status(400).send({ error: 'GitHub not configured' });
|
|
142
|
+
}
|
|
143
|
+
const repo = findRepo(workspaceConfig, req.params.collection);
|
|
144
|
+
if (!repo) {
|
|
145
|
+
return reply.status(404).send({ error: 'Collection not found' });
|
|
146
|
+
}
|
|
147
|
+
const repoName = extractRepoName(repo.github_url) ?? repo.name;
|
|
148
|
+
const { username } = req.params;
|
|
149
|
+
try {
|
|
150
|
+
try {
|
|
151
|
+
await service.removeFromTeam(repoName, username);
|
|
152
|
+
}
|
|
153
|
+
catch { /* not on team */ }
|
|
154
|
+
try {
|
|
155
|
+
await service.revokeUserAccess(repoName, username);
|
|
156
|
+
}
|
|
157
|
+
catch { /* not a collaborator */ }
|
|
158
|
+
return reply.send({ ok: true });
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
return reply.status(err?.status ?? 500).send({ error: err.message });
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/** Extract repo name from a GitHub URL like https://github.com/org/repo-name.git */
|
|
166
|
+
function extractRepoName(url) {
|
|
167
|
+
if (!url)
|
|
168
|
+
return undefined;
|
|
169
|
+
const match = url.match(/\/([^/]+?)(?:\.git)?$/);
|
|
170
|
+
return match?.[1];
|
|
171
|
+
}
|
|
172
|
+
/** Find a repo config by collection name */
|
|
173
|
+
function findRepo(config, collection) {
|
|
174
|
+
return config.repos?.find(r => r.name === collection);
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=permissions-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions-api.js","sourceRoot":"","sources":["../../../src/server/routes/permissions-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace API routes
|
|
3
|
+
*
|
|
4
|
+
* Git operations: status, commit, push, pull across all repos.
|
|
5
|
+
*/
|
|
6
|
+
import type { FastifyInstance } from 'fastify';
|
|
7
|
+
import { WorkspaceManager } from '../../core/workspace-manager.js';
|
|
8
|
+
import { GitUser } from '../../services/git.js';
|
|
9
|
+
export declare function registerWorkspaceApiRoutes(fastify: FastifyInstance, workspaceManager: WorkspaceManager, gitUser: GitUser): Promise<void>;
|