studiograph 1.3.2 → 1.3.3-next.10

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.
Files changed (118) hide show
  1. package/dist/agent/orchestrator.d.ts +8 -0
  2. package/dist/agent/orchestrator.js +13 -2
  3. package/dist/agent/orchestrator.js.map +1 -1
  4. package/dist/agent/tools/graph-tools.d.ts +5 -1
  5. package/dist/agent/tools/graph-tools.js +161 -9
  6. package/dist/agent/tools/graph-tools.js.map +1 -1
  7. package/dist/agent/tools/permission-tools.d.ts +15 -14
  8. package/dist/agent/tools/permission-tools.js +65 -128
  9. package/dist/agent/tools/permission-tools.js.map +1 -1
  10. package/dist/cli/commands/join.d.ts +3 -2
  11. package/dist/cli/commands/join.js +93 -98
  12. package/dist/cli/commands/join.js.map +1 -1
  13. package/dist/cli/commands/redeploy.js +14 -22
  14. package/dist/cli/commands/redeploy.js.map +1 -1
  15. package/dist/cli/commands/serve.js +3 -3
  16. package/dist/cli/commands/serve.js.map +1 -1
  17. package/dist/cli/commands/sync.d.ts +4 -2
  18. package/dist/cli/commands/sync.js +21 -22
  19. package/dist/cli/commands/sync.js.map +1 -1
  20. package/dist/cli/commands/user.d.ts +7 -0
  21. package/dist/cli/commands/user.js +153 -0
  22. package/dist/cli/commands/user.js.map +1 -0
  23. package/dist/cli/index.js +3 -0
  24. package/dist/cli/index.js.map +1 -1
  25. package/dist/core/graph.d.ts +8 -2
  26. package/dist/core/graph.js +11 -7
  27. package/dist/core/graph.js.map +1 -1
  28. package/dist/core/types.d.ts +9 -0
  29. package/dist/core/types.js +1 -0
  30. package/dist/core/types.js.map +1 -1
  31. package/dist/core/workspace-manager.js +1 -5
  32. package/dist/core/workspace-manager.js.map +1 -1
  33. package/dist/core/workspace.js +1 -1
  34. package/dist/core/workspace.js.map +1 -1
  35. package/dist/server/chrome/chrome.js +12 -212
  36. package/dist/server/commit-scheduler.d.ts +39 -0
  37. package/dist/server/commit-scheduler.js +99 -0
  38. package/dist/server/commit-scheduler.js.map +1 -0
  39. package/dist/server/index.js +86 -46
  40. package/dist/server/index.js.map +1 -1
  41. package/dist/server/routes/auth-api.d.ts +8 -0
  42. package/dist/server/routes/auth-api.js +163 -0
  43. package/dist/server/routes/auth-api.js.map +1 -0
  44. package/dist/server/routes/chat.js +4 -0
  45. package/dist/server/routes/chat.js.map +1 -1
  46. package/dist/server/routes/git-http.d.ts +23 -0
  47. package/dist/server/routes/git-http.js +213 -0
  48. package/dist/server/routes/git-http.js.map +1 -0
  49. package/dist/server/routes/graph-api.d.ts +6 -2
  50. package/dist/server/routes/graph-api.js +230 -50
  51. package/dist/server/routes/graph-api.js.map +1 -1
  52. package/dist/server/routes/permissions-api.d.ts +5 -4
  53. package/dist/server/routes/permissions-api.js +39 -167
  54. package/dist/server/routes/permissions-api.js.map +1 -1
  55. package/dist/server/routes/ws.d.ts +7 -0
  56. package/dist/server/routes/ws.js +35 -0
  57. package/dist/server/routes/ws.js.map +1 -0
  58. package/dist/server/ws-hub.d.ts +36 -0
  59. package/dist/server/ws-hub.js +63 -0
  60. package/dist/server/ws-hub.js.map +1 -0
  61. package/dist/services/auth-service.d.ts +77 -0
  62. package/dist/services/auth-service.js +302 -0
  63. package/dist/services/auth-service.js.map +1 -0
  64. package/dist/utils/git.d.ts +21 -1
  65. package/dist/utils/git.js +69 -3
  66. package/dist/utils/git.js.map +1 -1
  67. package/dist/web/_app/immutable/assets/{0.CDbX4Cwz.css → 0.CL-hNrKE.css} +1 -1
  68. package/dist/web/_app/immutable/assets/7.Cn2DG-J6.css +1 -0
  69. package/dist/web/_app/immutable/assets/8.Sm6jB3a0.css +1 -0
  70. package/dist/web/_app/immutable/assets/AppShell.RYbgfVr0.css +1 -0
  71. package/dist/web/_app/immutable/chunks/-lhxaNNQ.js +1 -0
  72. package/dist/web/_app/immutable/chunks/BFD-PG4k.js +2 -0
  73. package/dist/web/_app/immutable/chunks/BKhAbhZ4.js +1 -0
  74. package/dist/web/_app/immutable/chunks/BUuoVpOJ.js +1 -0
  75. package/dist/web/_app/immutable/chunks/BuHHk4nP.js +1 -0
  76. package/dist/web/_app/immutable/chunks/Bv8xNJQh.js +1 -0
  77. package/dist/web/_app/immutable/chunks/C0iyiXwO.js +1 -0
  78. package/dist/web/_app/immutable/chunks/CH-raHh7.js +1 -0
  79. package/dist/web/_app/immutable/chunks/{DTUXhwEY.js → CQo_whF8.js} +1 -1
  80. package/dist/web/_app/immutable/chunks/CiIF45lL.js +1 -0
  81. package/dist/web/_app/immutable/chunks/{DEJSHbC3.js → Cs6vwwZC.js} +1 -1
  82. package/dist/web/_app/immutable/chunks/{C1SF7XfX.js → DJO0wVMY.js} +4 -4
  83. package/dist/web/_app/immutable/chunks/DeY0oOW3.js +2 -0
  84. package/dist/web/_app/immutable/chunks/{BHedmkKI.js → Dj2efhG6.js} +18 -18
  85. package/dist/web/_app/immutable/chunks/ew-IdGn0.js +1 -0
  86. package/dist/web/_app/immutable/chunks/yEjjrv_c.js +23 -0
  87. package/dist/web/_app/immutable/entry/app.BNN66g6y.js +2 -0
  88. package/dist/web/_app/immutable/entry/start.CbKqTiwM.js +1 -0
  89. package/dist/web/_app/immutable/nodes/0.DthLeuCh.js +2 -0
  90. package/dist/web/_app/immutable/nodes/1.ZBkeuxO_.js +1 -0
  91. package/dist/web/_app/immutable/nodes/2.CioLRnGy.js +1 -0
  92. package/dist/web/_app/immutable/nodes/3.Df3ut4ji.js +1 -0
  93. package/dist/web/_app/immutable/nodes/4.HFzA-u2O.js +16 -0
  94. package/dist/web/_app/immutable/nodes/5.h31NMedP.js +4 -0
  95. package/dist/web/_app/immutable/nodes/6.MktCIoXa.js +2 -0
  96. package/dist/web/_app/immutable/nodes/7.CZ7lC_rb.js +1 -0
  97. package/dist/web/_app/immutable/nodes/8.CRf2WFmY.js +1 -0
  98. package/dist/web/_app/version.json +1 -1
  99. package/dist/web/index.html +12 -12
  100. package/package.json +11 -2
  101. package/dist/web/_app/immutable/assets/AppShell.D0rmbdqF.css +0 -1
  102. package/dist/web/_app/immutable/chunks/Bopa-Ask.js +0 -1
  103. package/dist/web/_app/immutable/chunks/CEkx7wvp.js +0 -1
  104. package/dist/web/_app/immutable/chunks/COwytaCP.js +0 -1
  105. package/dist/web/_app/immutable/chunks/Dml-u95b.js +0 -2
  106. package/dist/web/_app/immutable/chunks/DvKVaE7M.js +0 -1
  107. package/dist/web/_app/immutable/chunks/J4wxg_sP.js +0 -23
  108. package/dist/web/_app/immutable/chunks/MbiSz-iW.js +0 -2
  109. package/dist/web/_app/immutable/chunks/bSAC733J.js +0 -1
  110. package/dist/web/_app/immutable/entry/app.B0KkA_jR.js +0 -2
  111. package/dist/web/_app/immutable/entry/start.DFSNI2p-.js +0 -1
  112. package/dist/web/_app/immutable/nodes/0.DfbCOBhn.js +0 -2
  113. package/dist/web/_app/immutable/nodes/1.DMtWWiM4.js +0 -1
  114. package/dist/web/_app/immutable/nodes/2.CgKSJOen.js +0 -1
  115. package/dist/web/_app/immutable/nodes/3.CVYHBZE3.js +0 -1
  116. package/dist/web/_app/immutable/nodes/4.CHN1uWec.js +0 -16
  117. package/dist/web/_app/immutable/nodes/5.B4_87Wva.js +0 -4
  118. package/dist/web/_app/immutable/nodes/6.CGZ970f8.js +0 -2
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Embedded Git Smart HTTP Server
3
+ *
4
+ * Enables authenticated git clone, fetch, and push over HTTP.
5
+ * Uses Basic Auth against AuthService for credentials.
6
+ *
7
+ * Endpoints:
8
+ * GET /git/:repo/info/refs?service=git-upload-pack — advertise refs (clone/fetch)
9
+ * GET /git/:repo/info/refs?service=git-receive-pack — advertise refs (push)
10
+ * POST /git/:repo/git-upload-pack — clone/fetch data
11
+ * POST /git/:repo/git-receive-pack — push data
12
+ *
13
+ * Access rules:
14
+ * - No users configured (open mode) → full access
15
+ * - Admin → all collections
16
+ * - Member → only granted collections
17
+ * - Private repos → excluded entirely
18
+ */
19
+ import { spawn } from 'child_process';
20
+ import { join } from 'path';
21
+ /**
22
+ * Resolve Basic Auth header to an AuthUser, or null if open mode.
23
+ * Returns { user } on success, or { error, statusCode } on failure.
24
+ */
25
+ function authenticateBasic(authHeader, authService) {
26
+ // Open mode — no users configured, allow everything
27
+ if (!authService.hasUsers()) {
28
+ return { user: null };
29
+ }
30
+ if (!authHeader || !authHeader.startsWith('Basic ')) {
31
+ return { error: 'Authentication required', statusCode: 401 };
32
+ }
33
+ const decoded = Buffer.from(authHeader.slice(6), 'base64').toString('utf-8');
34
+ const colonIdx = decoded.indexOf(':');
35
+ if (colonIdx === -1) {
36
+ return { error: 'Invalid credentials', statusCode: 401 };
37
+ }
38
+ const email = decoded.slice(0, colonIdx);
39
+ const password = decoded.slice(colonIdx + 1);
40
+ const result = authService.authenticate(email, password);
41
+ if (!result) {
42
+ return { error: 'Invalid credentials', statusCode: 401 };
43
+ }
44
+ return { user: result.user };
45
+ }
46
+ /**
47
+ * Check whether a user can access the named collection.
48
+ */
49
+ function canAccessCollection(user, repoName, authService) {
50
+ if (!user)
51
+ return true; // open mode / API key
52
+ if (user.role === 'admin')
53
+ return true;
54
+ return authService.getUserCollections(user.id).includes(repoName);
55
+ }
56
+ /**
57
+ * Resolve a repo name to its absolute path on disk.
58
+ * Returns null if the repo doesn't exist or is private.
59
+ */
60
+ function resolveRepoPath(repoName, workspaceManager, workspacePath) {
61
+ const config = workspaceManager.getRepoConfig(repoName);
62
+ if (!config || config.private)
63
+ return null;
64
+ return join(workspacePath, config.path);
65
+ }
66
+ export async function registerGitHttpRoutes(fastify, workspaceManager, authService, workspacePath, wsHub) {
67
+ // GET /git/:repo/info/refs?service=git-upload-pack|git-receive-pack
68
+ fastify.get('/git/:repo/info/refs', async (req, reply) => {
69
+ const { repo } = req.params;
70
+ const service = req.query.service;
71
+ if (service !== 'git-upload-pack' && service !== 'git-receive-pack') {
72
+ return reply.status(403).send('Dumb HTTP protocol not supported');
73
+ }
74
+ // Authenticate
75
+ const auth = authenticateBasic(req.headers.authorization, authService);
76
+ if ('error' in auth) {
77
+ reply.header('WWW-Authenticate', 'Basic realm="Studiograph Git"');
78
+ return reply.status(auth.statusCode).send(auth.error);
79
+ }
80
+ // Resolve repo
81
+ const repoPath = resolveRepoPath(repo, workspaceManager, workspacePath);
82
+ if (!repoPath) {
83
+ return reply.status(404).send('Repository not found');
84
+ }
85
+ // Check collection access
86
+ if (!canAccessCollection(auth.user, repo, authService)) {
87
+ return reply.status(404).send('Repository not found');
88
+ }
89
+ // Push requires collection access (admin → all, member → granted only)
90
+ if (service === 'git-receive-pack' && !canAccessCollection(auth.user, repo, authService)) {
91
+ return reply.status(403).send('Push access denied');
92
+ }
93
+ // Spawn git to advertise refs
94
+ const gitService = service === 'git-upload-pack' ? 'upload-pack' : 'receive-pack';
95
+ reply.raw.writeHead(200, {
96
+ 'Content-Type': `application/x-${service}-advertisement`,
97
+ 'Cache-Control': 'no-cache',
98
+ });
99
+ // Write the pkt-line header for smart HTTP
100
+ const header = `# service=${service}\n`;
101
+ const headerLen = (header.length + 4).toString(16).padStart(4, '0');
102
+ reply.raw.write(`${headerLen}${header}`);
103
+ reply.raw.write('0000');
104
+ const proc = spawn('git', [gitService, '--stateless-rpc', '--advertise-refs', repoPath], {
105
+ stdio: ['pipe', 'pipe', 'pipe'],
106
+ });
107
+ proc.stdout.pipe(reply.raw, { end: false });
108
+ proc.stderr.on('data', (data) => {
109
+ fastify.log.warn(`git ${gitService} stderr: ${data.toString()}`);
110
+ });
111
+ proc.on('close', () => {
112
+ reply.raw.end();
113
+ });
114
+ proc.on('error', (err) => {
115
+ fastify.log.error(err, `Failed to spawn git ${gitService}`);
116
+ if (!reply.raw.headersSent) {
117
+ reply.raw.writeHead(500);
118
+ }
119
+ reply.raw.end();
120
+ });
121
+ // Don't let Fastify auto-send a response
122
+ return reply;
123
+ });
124
+ // POST /git/:repo/git-upload-pack — clone/fetch
125
+ fastify.post('/git/:repo/git-upload-pack', async (req, reply) => {
126
+ const { repo } = req.params;
127
+ const auth = authenticateBasic(req.headers.authorization, authService);
128
+ if ('error' in auth) {
129
+ reply.header('WWW-Authenticate', 'Basic realm="Studiograph Git"');
130
+ return reply.status(auth.statusCode).send(auth.error);
131
+ }
132
+ const repoPath = resolveRepoPath(repo, workspaceManager, workspacePath);
133
+ if (!repoPath) {
134
+ return reply.status(404).send('Repository not found');
135
+ }
136
+ if (!canAccessCollection(auth.user, repo, authService)) {
137
+ return reply.status(404).send('Repository not found');
138
+ }
139
+ reply.raw.writeHead(200, {
140
+ 'Content-Type': 'application/x-git-upload-pack-result',
141
+ 'Cache-Control': 'no-cache',
142
+ });
143
+ const proc = spawn('git', ['upload-pack', '--stateless-rpc', repoPath], {
144
+ stdio: ['pipe', 'pipe', 'pipe'],
145
+ });
146
+ // Pipe request body into git process
147
+ req.raw.pipe(proc.stdin);
148
+ proc.stdout.pipe(reply.raw, { end: false });
149
+ proc.stderr.on('data', (data) => {
150
+ fastify.log.warn(`git upload-pack stderr: ${data.toString()}`);
151
+ });
152
+ proc.on('close', () => {
153
+ reply.raw.end();
154
+ });
155
+ proc.on('error', (err) => {
156
+ fastify.log.error(err, 'Failed to spawn git upload-pack');
157
+ if (!reply.raw.headersSent) {
158
+ reply.raw.writeHead(500);
159
+ }
160
+ reply.raw.end();
161
+ });
162
+ return reply;
163
+ });
164
+ // POST /git/:repo/git-receive-pack — push
165
+ fastify.post('/git/:repo/git-receive-pack', async (req, reply) => {
166
+ const { repo } = req.params;
167
+ const auth = authenticateBasic(req.headers.authorization, authService);
168
+ if ('error' in auth) {
169
+ reply.header('WWW-Authenticate', 'Basic realm="Studiograph Git"');
170
+ return reply.status(auth.statusCode).send(auth.error);
171
+ }
172
+ const repoPath = resolveRepoPath(repo, workspaceManager, workspacePath);
173
+ if (!repoPath) {
174
+ return reply.status(404).send('Repository not found');
175
+ }
176
+ // Push requires collection access (admin → all, member → granted only)
177
+ if (!canAccessCollection(auth.user, repo, authService)) {
178
+ return reply.status(403).send('Push access denied');
179
+ }
180
+ reply.raw.writeHead(200, {
181
+ 'Content-Type': 'application/x-git-receive-pack-result',
182
+ 'Cache-Control': 'no-cache',
183
+ });
184
+ const proc = spawn('git', ['receive-pack', '--stateless-rpc', repoPath], {
185
+ stdio: ['pipe', 'pipe', 'pipe'],
186
+ });
187
+ req.raw.pipe(proc.stdin);
188
+ proc.stdout.pipe(reply.raw, { end: false });
189
+ proc.stderr.on('data', (data) => {
190
+ fastify.log.warn(`git receive-pack stderr: ${data.toString()}`);
191
+ });
192
+ proc.on('close', (code) => {
193
+ reply.raw.end();
194
+ if (code === 0) {
195
+ wsHub?.broadcast({
196
+ type: 'repo_sync', repo,
197
+ source: 'git-push',
198
+ actor: auth.user?.displayName ?? 'Git',
199
+ timestamp: new Date().toISOString(),
200
+ });
201
+ }
202
+ });
203
+ proc.on('error', (err) => {
204
+ fastify.log.error(err, 'Failed to spawn git receive-pack');
205
+ if (!reply.raw.headersSent) {
206
+ reply.raw.writeHead(500);
207
+ }
208
+ reply.raw.end();
209
+ });
210
+ return reply;
211
+ });
212
+ }
213
+ //# sourceMappingURL=git-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-http.js","sourceRoot":"","sources":["../../../src/server/routes/git-http.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,12 @@
2
2
  * Graph API routes
3
3
  *
4
4
  * REST façade over WorkspaceManager.
5
- * Read endpoints are unauthenticated; write endpoints require auth.
5
+ * Enforces per-collection access when users are authenticated via JWT.
6
+ * API key / open mode → full access (no filtering).
6
7
  */
7
8
  import type { FastifyInstance } from 'fastify';
8
9
  import { WorkspaceManager } from '../../core/workspace-manager.js';
9
- export declare function registerGraphApiRoutes(fastify: FastifyInstance, workspaceManager: WorkspaceManager): Promise<void>;
10
+ import { AuthService } from '../../services/auth-service.js';
11
+ import type { WsHub } from '../ws-hub.js';
12
+ import type { CommitScheduler } from '../commit-scheduler.js';
13
+ export declare function registerGraphApiRoutes(fastify: FastifyInstance, workspaceManager: WorkspaceManager, authService: AuthService, wsHub?: WsHub, commitScheduler?: CommitScheduler): Promise<void>;