@ankhorage/studio 0.3.0 → 0.4.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.
Files changed (33) hide show
  1. package/README.md +1 -1
  2. package/dist/authSettings.d.ts +33 -0
  3. package/dist/authSettings.d.ts.map +1 -0
  4. package/dist/authSettings.js +525 -0
  5. package/dist/authSettings.js.map +1 -0
  6. package/dist/host/auth/projectAuthService.d.ts +23 -0
  7. package/dist/host/auth/projectAuthService.d.ts.map +1 -0
  8. package/dist/host/auth/projectAuthService.js +63 -0
  9. package/dist/host/auth/projectAuthService.js.map +1 -0
  10. package/dist/host/http/authRoutes.d.ts +6 -0
  11. package/dist/host/http/authRoutes.d.ts.map +1 -0
  12. package/dist/host/http/authRoutes.js +34 -0
  13. package/dist/host/http/authRoutes.js.map +1 -0
  14. package/dist/host/http/serverWithSecrets.d.ts +6 -0
  15. package/dist/host/http/serverWithSecrets.d.ts.map +1 -0
  16. package/dist/host/http/serverWithSecrets.js +27 -0
  17. package/dist/host/http/serverWithSecrets.js.map +1 -0
  18. package/dist/host/index.d.ts +3 -0
  19. package/dist/host/index.d.ts.map +1 -1
  20. package/dist/host/index.js +3 -0
  21. package/dist/host/index.js.map +1 -1
  22. package/dist/projectAuthApi.d.ts +17 -0
  23. package/dist/projectAuthApi.d.ts.map +1 -0
  24. package/dist/projectAuthApi.js +83 -0
  25. package/dist/projectAuthApi.js.map +1 -0
  26. package/dist/ui/StudioAuthSettingsOverlay.d.ts +9 -0
  27. package/dist/ui/StudioAuthSettingsOverlay.d.ts.map +1 -0
  28. package/dist/ui/StudioAuthSettingsOverlay.js +399 -0
  29. package/dist/ui/StudioAuthSettingsOverlay.js.map +1 -0
  30. package/dist/ui/useStudioAppBarAugmentation.d.ts.map +1 -1
  31. package/dist/ui/useStudioAppBarAugmentation.js +11 -4
  32. package/dist/ui/useStudioAppBarAugmentation.js.map +1 -1
  33. package/package.json +1 -1
@@ -0,0 +1,63 @@
1
+ import { applyStudioAuthSettings, readStudioAuthSettings, validateStudioAuthSettings, } from '../../authSettings';
2
+ export class ProjectAuthService {
3
+ projectManager;
4
+ constructor(projectManager) {
5
+ this.projectManager = projectManager;
6
+ }
7
+ async get(projectId) {
8
+ try {
9
+ const manifest = await this.readEditableManifest(projectId);
10
+ return { ok: true, state: 'loaded', data: readStudioAuthSettings(manifest) };
11
+ }
12
+ catch {
13
+ return {
14
+ ok: false,
15
+ error: {
16
+ code: 'manifest_read_failed',
17
+ message: 'The project authentication configuration could not be loaded.',
18
+ },
19
+ };
20
+ }
21
+ }
22
+ async configure(projectId, value) {
23
+ const parsed = validateStudioAuthSettings(value);
24
+ if (!parsed.ok)
25
+ return parsed;
26
+ let manifest;
27
+ try {
28
+ manifest = await this.readEditableManifest(projectId);
29
+ }
30
+ catch {
31
+ return {
32
+ ok: false,
33
+ error: {
34
+ code: 'manifest_read_failed',
35
+ message: 'The project authentication configuration could not be loaded.',
36
+ },
37
+ };
38
+ }
39
+ const nextManifest = applyStudioAuthSettings(manifest, parsed.data);
40
+ try {
41
+ await this.projectManager.saveStudioManifest({ projectId, manifest: nextManifest });
42
+ }
43
+ catch {
44
+ return {
45
+ ok: false,
46
+ error: {
47
+ code: 'manifest_write_failed',
48
+ message: 'The canonical authentication configuration could not be saved.',
49
+ },
50
+ };
51
+ }
52
+ return { ok: true, state: 'saved', data: readStudioAuthSettings(nextManifest) };
53
+ }
54
+ async readEditableManifest(projectId) {
55
+ try {
56
+ return await this.projectManager.getStudioManifest(projectId);
57
+ }
58
+ catch {
59
+ return this.projectManager.getProjectManifest(projectId);
60
+ }
61
+ }
62
+ }
63
+ //# sourceMappingURL=projectAuthService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectAuthService.js","sourceRoot":"","sources":["../../../src/host/auth/projectAuthService.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EAEtB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAsB5B,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,cAAkC;QAAlC,mBAAc,GAAd,cAAc,CAAoB;IAAG,CAAC;IAEnE,KAAK,CAAC,GAAG,CAAC,SAAiB;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAC5D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,sBAAsB;oBAC5B,OAAO,EAAE,+DAA+D;iBACzE;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,KAAc;QAC/C,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC;QAE9B,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,sBAAsB;oBAC5B,OAAO,EAAE,+DAA+D;iBACzE;aACF,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,uBAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QACtF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,gEAAgE;iBAC1E;aACF,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,CAAC,YAAY,CAAC,EAAE,CAAC;IAClF,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,SAAiB;QAClD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ import type { ProjectManager } from '../orchestrator/projectManager';
3
+ export declare function registerProjectAuthRoutes(fastify: FastifyInstance, options: {
4
+ readonly projectManager: ProjectManager;
5
+ }): void;
6
+ //# sourceMappingURL=authRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authRoutes.d.ts","sourceRoot":"","sources":["../../../src/host/http/authRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAG7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE;IAAE,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;CAAE,GACnD,IAAI,CAuBN"}
@@ -0,0 +1,34 @@
1
+ import { ProjectAuthService } from '../auth/projectAuthService';
2
+ export function registerProjectAuthRoutes(fastify, options) {
3
+ const service = new ProjectAuthService(options.projectManager);
4
+ fastify.get('/api/projects/:id/auth/config', async (request, reply) => {
5
+ const { id } = request.params;
6
+ return sendProjectAuthResult(reply, await service.get(id));
7
+ });
8
+ fastify.put('/api/projects/:id/auth/config', async (request, reply) => {
9
+ const { id } = request.params;
10
+ const body = asRecord(request.body);
11
+ if (!body || !Object.hasOwn(body, 'config')) {
12
+ return reply.status(400).send({
13
+ ok: false,
14
+ error: {
15
+ code: 'invalid_config',
16
+ message: 'Auth configuration request requires a config object.',
17
+ },
18
+ });
19
+ }
20
+ return sendProjectAuthResult(reply, await service.configure(id, body.config));
21
+ });
22
+ }
23
+ function sendProjectAuthResult(reply, result) {
24
+ if (result.ok)
25
+ return result;
26
+ const status = result.error.code === 'invalid_config' ? 400 : 500;
27
+ return reply.status(status).send(result);
28
+ }
29
+ function asRecord(value) {
30
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
31
+ ? value
32
+ : null;
33
+ }
34
+ //# sourceMappingURL=authRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authRoutes.js","sourceRoot":"","sources":["../../../src/host/http/authRoutes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAkC,MAAM,4BAA4B,CAAC;AAGhG,MAAM,UAAU,yBAAyB,CACvC,OAAwB,EACxB,OAAoD;IAEpD,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAK,EAAE,EAAE;QACpF,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAwB,CAAC;QAChD,OAAO,qBAAqB,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAK,EAAE,EAAE;QACpF,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAwB,CAAC;QAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC5B,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,sDAAsD;iBAChE;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,qBAAqB,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAmB,EAAE,MAAiC;IACnF,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAE7B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAClE,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type StartStudioHostServerOptions } from './server';
2
+ /**
3
+ * Starts the Studio host with the Phase 2 auth and metadata-only secret bridges registered.
4
+ */
5
+ export declare function startStudioHostServerWithSecrets(options?: number | StartStudioHostServerOptions): Promise<import("fastify").FastifyInstance<import("fastify").RawServerDefault, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>>;
6
+ //# sourceMappingURL=serverWithSecrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverWithSecrets.d.ts","sourceRoot":"","sources":["../../../src/host/http/serverWithSecrets.ts"],"names":[],"mappings":"AAKA,OAAO,EAA0B,KAAK,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAErF;;GAEG;AACH,wBAAsB,gCAAgC,CACpD,OAAO,GAAE,MAAM,GAAG,4BAAiC,mRAmBpD"}
@@ -0,0 +1,27 @@
1
+ import { ModuleManager } from '../orchestrator/moduleManager';
2
+ import { ProjectManager } from '../orchestrator/projectManager';
3
+ import { resolveWorkspaceRoot } from '../utils/workspaceRoot';
4
+ import { registerProjectAuthRoutes } from './authRoutes';
5
+ import { registerProjectSecretRoutes } from './secretRoutes';
6
+ import { createStudioHostServer } from './server';
7
+ /**
8
+ * Starts the Studio host with the Phase 2 auth and metadata-only secret bridges registered.
9
+ */
10
+ export async function startStudioHostServerWithSecrets(options = {}) {
11
+ const resolvedOptions = typeof options === 'number' ? { port: options } : options;
12
+ const projectRoot = resolvedOptions.projectRoot ?? resolveWorkspaceRoot(import.meta.dirname);
13
+ const orchestrator = new ModuleManager(projectRoot);
14
+ const projectManager = new ProjectManager(projectRoot);
15
+ const fastify = await createStudioHostServer({ projectManager, orchestrator, projectRoot });
16
+ registerProjectAuthRoutes(fastify, { projectManager });
17
+ registerProjectSecretRoutes(fastify, {
18
+ projectManager,
19
+ workspaceRoot: projectRoot,
20
+ });
21
+ const port = resolvedOptions.port ?? 3000;
22
+ const host = resolvedOptions.host ?? '127.0.0.1';
23
+ await fastify.listen({ port, host });
24
+ console.log(`Ankhorage Studio Host running at http://${host}:${port}`);
25
+ return fastify;
26
+ }
27
+ //# sourceMappingURL=serverWithSecrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverWithSecrets.js","sourceRoot":"","sources":["../../../src/host/http/serverWithSecrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAqC,MAAM,UAAU,CAAC;AAErF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,UAAiD,EAAE;IAEnD,MAAM,eAAe,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAClF,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,IAAI,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7F,MAAM,YAAY,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;IAE5F,yBAAyB,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;IACvD,2BAA2B,CAAC,OAAO,EAAE;QACnC,cAAc;QACd,aAAa,EAAE,WAAW;KAC3B,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC;IAC1C,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,WAAW,CAAC;IACjD,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,7 +1,10 @@
1
+ export { ProjectAuthService, type ProjectAuthSettingsResult } from './auth/projectAuthService';
1
2
  export { createStudioHost, type CreateStudioHostOptions, type StudioHost, } from './createStudioHost';
3
+ export { registerProjectAuthRoutes } from './http/authRoutes';
2
4
  export { registerProjectSecretRoutes } from './http/secretRoutes';
3
5
  export { isOriginAllowed } from './http/security';
4
6
  export { createStudioHostServer, startStudioHostServer, type StartStudioHostServerOptions, } from './http/server';
7
+ export { startStudioHostServerWithSecrets } from './http/serverWithSecrets';
5
8
  export { ModuleManager } from './orchestrator/moduleManager';
6
9
  export { ProjectManager } from './orchestrator/projectManager';
7
10
  export { assertProjectId, getAppsRoot, getProjectPath } from './orchestrator/projectPaths';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,UAAU,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,KAAK,4BAA4B,GAClC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EACL,KAAK,sBAAsB,EAC3B,4BAA4B,GAC7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,8BAA8B,EAC9B,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,oBAAoB,EACpB,KAAK,2BAA2B,GACjC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,UAAU,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,KAAK,4BAA4B,GAClC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EACL,KAAK,sBAAsB,EAC3B,4BAA4B,GAC7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,8BAA8B,EAC9B,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,oBAAoB,EACpB,KAAK,2BAA2B,GACjC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,7 +1,10 @@
1
+ export { ProjectAuthService } from './auth/projectAuthService';
1
2
  export { createStudioHost, } from './createStudioHost';
3
+ export { registerProjectAuthRoutes } from './http/authRoutes';
2
4
  export { registerProjectSecretRoutes } from './http/secretRoutes';
3
5
  export { isOriginAllowed } from './http/security';
4
6
  export { createStudioHostServer, startStudioHostServer, } from './http/server';
7
+ export { startStudioHostServerWithSecrets } from './http/serverWithSecrets';
5
8
  export { ModuleManager } from './orchestrator/moduleManager';
6
9
  export { ProjectManager } from './orchestrator/projectManager';
7
10
  export { assertProjectId, getAppsRoot, getProjectPath } from './orchestrator/projectPaths';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GAEtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAuB,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAEL,4BAA4B,GAC7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,8BAA8B,EAG9B,oBAAoB,GAErB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAkC,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EACL,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GAEtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAuB,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAEL,4BAA4B,GAC7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,8BAA8B,EAG9B,oBAAoB,GAErB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { StudioAuthSettings } from './authSettings';
2
+ export declare class ProjectAuthApiError extends Error {
3
+ readonly code: string;
4
+ readonly status: number;
5
+ constructor(args: {
6
+ readonly code: string;
7
+ readonly message: string;
8
+ readonly status: number;
9
+ });
10
+ }
11
+ export declare function getProjectAuthSettings(projectId: string): Promise<StudioAuthSettings | null>;
12
+ export declare function saveProjectAuthSettings(input: {
13
+ readonly projectId: string;
14
+ readonly config: StudioAuthSettings;
15
+ }): Promise<StudioAuthSettings>;
16
+ export declare function parseProjectAuthSettingsResponse(value: unknown, expectedState: 'loaded' | 'saved'): StudioAuthSettings | null;
17
+ //# sourceMappingURL=projectAuthApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectAuthApi.d.ts","sourceRoot":"","sources":["../src/projectAuthApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzD,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,IAAI,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAM/F;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAGpC;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;CACrC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAe9B;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,QAAQ,GAAG,OAAO,GAChC,kBAAkB,GAAG,IAAI,CAU3B"}
@@ -0,0 +1,83 @@
1
+ import { validateStudioAuthSettings } from './authSettings';
2
+ export class ProjectAuthApiError extends Error {
3
+ code;
4
+ status;
5
+ constructor(args) {
6
+ super(args.message);
7
+ this.name = 'ProjectAuthApiError';
8
+ this.code = args.code;
9
+ this.status = args.status;
10
+ }
11
+ }
12
+ export async function getProjectAuthSettings(projectId) {
13
+ const value = await requestJson(`/projects/${encodeURIComponent(projectId)}/auth/config`);
14
+ return parseProjectAuthSettingsResponse(value, 'loaded');
15
+ }
16
+ export async function saveProjectAuthSettings(input) {
17
+ const value = await requestJson(`/projects/${encodeURIComponent(input.projectId)}/auth/config`, {
18
+ method: 'PUT',
19
+ headers: { 'Content-Type': 'application/json' },
20
+ body: JSON.stringify({ config: input.config }),
21
+ });
22
+ const result = parseProjectAuthSettingsResponse(value, 'saved');
23
+ if (!result) {
24
+ throw new ProjectAuthApiError({
25
+ code: 'invalid_response',
26
+ message: 'Saved auth configuration response did not contain configuration data.',
27
+ status: 502,
28
+ });
29
+ }
30
+ return result;
31
+ }
32
+ export function parseProjectAuthSettingsResponse(value, expectedState) {
33
+ const record = asRecord(value);
34
+ if (record?.ok !== true || record.state !== expectedState) {
35
+ throw invalidResponse('Project auth response was invalid.');
36
+ }
37
+ if (record.data === null && expectedState === 'loaded')
38
+ return null;
39
+ const parsed = validateStudioAuthSettings(record.data);
40
+ if (!parsed.ok)
41
+ throw invalidResponse(parsed.error.message);
42
+ return parsed.data;
43
+ }
44
+ async function requestJson(path, init) {
45
+ const { API_BASE } = await import('./core/constants');
46
+ const response = await fetch(`${API_BASE}${path}`, init);
47
+ const value = await readJson(response);
48
+ if (!response.ok)
49
+ throw parseHttpError(value, response.status);
50
+ return value;
51
+ }
52
+ async function readJson(response) {
53
+ try {
54
+ return await response.json();
55
+ }
56
+ catch {
57
+ throw new ProjectAuthApiError({
58
+ code: 'invalid_response',
59
+ message: 'The Studio host returned a non-JSON auth response.',
60
+ status: response.status,
61
+ });
62
+ }
63
+ }
64
+ function parseHttpError(value, status) {
65
+ const record = asRecord(value);
66
+ const error = asRecord(record?.error);
67
+ return new ProjectAuthApiError({
68
+ code: typeof error?.code === 'string' ? error.code : 'request_failed',
69
+ message: typeof error?.message === 'string'
70
+ ? error.message
71
+ : 'The Studio authentication configuration request failed.',
72
+ status,
73
+ });
74
+ }
75
+ function invalidResponse(message) {
76
+ return new ProjectAuthApiError({ code: 'invalid_response', message, status: 502 });
77
+ }
78
+ function asRecord(value) {
79
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
80
+ ? value
81
+ : null;
82
+ }
83
+ //# sourceMappingURL=projectAuthApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectAuthApi.js","sourceRoot":"","sources":["../src/projectAuthApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type AppManifest } from '@ankhorage/contracts';
2
+ import React from 'react';
3
+ export interface StudioAuthSettingsOverlayProps {
4
+ readonly projectId: string;
5
+ readonly manifest: AppManifest | null;
6
+ readonly onClose: () => void;
7
+ }
8
+ export declare function StudioAuthSettingsOverlay(props: StudioAuthSettingsOverlayProps): React.JSX.Element;
9
+ //# sourceMappingURL=StudioAuthSettingsOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StudioAuthSettingsOverlay.d.ts","sourceRoot":"","sources":["../../src/ui/StudioAuthSettingsOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAO3E,OAAO,KAAoD,MAAM,OAAO,CAAC;AAoBzE,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAaD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,8BAA8B,qBAqa9E"}