@ankhorage/studio 0.2.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 (42) 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/projectSecretApi.d.ts +70 -0
  27. package/dist/projectSecretApi.d.ts.map +1 -0
  28. package/dist/projectSecretApi.js +233 -0
  29. package/dist/projectSecretApi.js.map +1 -0
  30. package/dist/ui/StudioAdminOverlay.d.ts +11 -0
  31. package/dist/ui/StudioAdminOverlay.d.ts.map +1 -0
  32. package/dist/ui/StudioAdminOverlay.js +359 -0
  33. package/dist/ui/StudioAdminOverlay.js.map +1 -0
  34. package/dist/ui/StudioAuthSettingsOverlay.d.ts +9 -0
  35. package/dist/ui/StudioAuthSettingsOverlay.d.ts.map +1 -0
  36. package/dist/ui/StudioAuthSettingsOverlay.js +399 -0
  37. package/dist/ui/StudioAuthSettingsOverlay.js.map +1 -0
  38. package/dist/ui/useStudioAppBarAugmentation.d.ts +1 -1
  39. package/dist/ui/useStudioAppBarAugmentation.d.ts.map +1 -1
  40. package/dist/ui/useStudioAppBarAugmentation.js +45 -1
  41. package/dist/ui/useStudioAppBarAugmentation.js.map +1 -1
  42. 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,70 @@
1
+ import type { AuthOAuthProviderId } from '@ankhorage/contracts';
2
+ import type { SecretMetadata, SecretPayload } from '@ankhorage/contracts/secrets';
3
+ export interface ProjectSecretCreateInput {
4
+ readonly projectId: string;
5
+ readonly environment?: string;
6
+ readonly ref: string;
7
+ readonly kind: string;
8
+ readonly provider?: string;
9
+ readonly payload: SecretPayload;
10
+ }
11
+ export interface ProjectSecretReplaceInput {
12
+ readonly projectId: string;
13
+ readonly environment?: string;
14
+ readonly ref: string;
15
+ readonly payload: SecretPayload;
16
+ }
17
+ export interface ProjectSecretRemoveInput {
18
+ readonly projectId: string;
19
+ readonly environment?: string;
20
+ readonly ref: string;
21
+ }
22
+ export interface ConfigureProjectOAuthProviderInput {
23
+ readonly projectId: string;
24
+ readonly providerId: AuthOAuthProviderId;
25
+ readonly environment?: string;
26
+ readonly credentialsRef?: string;
27
+ readonly enabled?: boolean;
28
+ readonly label?: string;
29
+ readonly scopes?: readonly string[];
30
+ readonly callbackRoute?: string;
31
+ readonly payload: SecretPayload;
32
+ }
33
+ export type ConfigureProjectOAuthProviderResponse = {
34
+ readonly ok: true;
35
+ readonly state: 'saved';
36
+ readonly metadata: SecretMetadata;
37
+ readonly credentialsRef: string;
38
+ } | {
39
+ readonly ok: false;
40
+ readonly state: 'secret_write_failed' | 'secret_saved_manifest_failed';
41
+ readonly error: {
42
+ readonly code: string;
43
+ readonly message: string;
44
+ };
45
+ readonly metadata?: SecretMetadata;
46
+ readonly credentialsRef?: string;
47
+ };
48
+ export declare class ProjectSecretApiError extends Error {
49
+ readonly code: string;
50
+ readonly status: number;
51
+ constructor(args: {
52
+ readonly code: string;
53
+ readonly message: string;
54
+ readonly status: number;
55
+ });
56
+ }
57
+ export declare function listProjectSecrets(input: {
58
+ readonly projectId: string;
59
+ readonly environment?: string;
60
+ readonly kind?: string;
61
+ readonly provider?: string;
62
+ }): Promise<readonly SecretMetadata[]>;
63
+ export declare function createProjectSecret(input: ProjectSecretCreateInput): Promise<SecretMetadata>;
64
+ export declare function replaceProjectSecret(input: ProjectSecretReplaceInput): Promise<SecretMetadata>;
65
+ export declare function removeProjectSecret(input: ProjectSecretRemoveInput): Promise<void>;
66
+ export declare function configureProjectOAuthProvider(input: ConfigureProjectOAuthProviderInput): Promise<ConfigureProjectOAuthProviderResponse>;
67
+ export declare function parseProjectSecretListResponse(value: unknown): readonly SecretMetadata[];
68
+ export declare function parseProjectSecretMetadataResponse(value: unknown): SecretMetadata;
69
+ export declare function parseConfigureProjectOAuthProviderResponse(value: unknown): ConfigureProjectOAuthProviderResponse;
70
+ //# sourceMappingURL=projectSecretApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectSecretApi.d.ts","sourceRoot":"","sources":["../src/projectSecretApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,233 @@
1
+ const FORBIDDEN_SECRET_RESPONSE_KEYS = new Set([
2
+ 'clientSecret',
3
+ 'payload',
4
+ 'privateKey',
5
+ 'rawValue',
6
+ 'secret',
7
+ 'secretValue',
8
+ 'token',
9
+ 'value',
10
+ ]);
11
+ export class ProjectSecretApiError extends Error {
12
+ code;
13
+ status;
14
+ constructor(args) {
15
+ super(args.message);
16
+ this.name = 'ProjectSecretApiError';
17
+ this.code = args.code;
18
+ this.status = args.status;
19
+ }
20
+ }
21
+ export async function listProjectSecrets(input) {
22
+ const query = createQuery({
23
+ environment: input.environment,
24
+ kind: input.kind,
25
+ provider: input.provider,
26
+ });
27
+ const value = await requestJson(`/projects/${encodeURIComponent(input.projectId)}/secrets${query}`);
28
+ return parseProjectSecretListResponse(value);
29
+ }
30
+ export async function createProjectSecret(input) {
31
+ const value = await requestJson(`/projects/${encodeURIComponent(input.projectId)}/secrets`, {
32
+ method: 'POST',
33
+ headers: { 'Content-Type': 'application/json' },
34
+ body: JSON.stringify({
35
+ environment: input.environment,
36
+ ref: input.ref,
37
+ kind: input.kind,
38
+ provider: input.provider,
39
+ payload: input.payload,
40
+ }),
41
+ });
42
+ return parseProjectSecretMetadataResponse(value);
43
+ }
44
+ export async function replaceProjectSecret(input) {
45
+ const value = await requestJson(`/projects/${encodeURIComponent(input.projectId)}/secrets`, {
46
+ method: 'PUT',
47
+ headers: { 'Content-Type': 'application/json' },
48
+ body: JSON.stringify({
49
+ environment: input.environment,
50
+ ref: input.ref,
51
+ payload: input.payload,
52
+ }),
53
+ });
54
+ return parseProjectSecretMetadataResponse(value);
55
+ }
56
+ export async function removeProjectSecret(input) {
57
+ const query = createQuery({ environment: input.environment, ref: input.ref });
58
+ const value = await requestJson(`/projects/${encodeURIComponent(input.projectId)}/secrets${query}`, { method: 'DELETE' });
59
+ parseProjectSecretRemoveResponse(value);
60
+ }
61
+ export async function configureProjectOAuthProvider(input) {
62
+ const value = await requestJson(`/projects/${encodeURIComponent(input.projectId)}/auth/oauth/${encodeURIComponent(input.providerId)}`, {
63
+ method: 'POST',
64
+ headers: { 'Content-Type': 'application/json' },
65
+ body: JSON.stringify({
66
+ environment: input.environment,
67
+ credentialsRef: input.credentialsRef,
68
+ enabled: input.enabled,
69
+ label: input.label,
70
+ scopes: input.scopes,
71
+ callbackRoute: input.callbackRoute,
72
+ payload: input.payload,
73
+ }),
74
+ }, true);
75
+ return parseConfigureProjectOAuthProviderResponse(value);
76
+ }
77
+ export function parseProjectSecretListResponse(value) {
78
+ const result = readResult(value);
79
+ if (!result.ok || !Array.isArray(result.data)) {
80
+ throw createInvalidResponseError('Secret list response was invalid.');
81
+ }
82
+ return result.data.map(parseSecretMetadata);
83
+ }
84
+ export function parseProjectSecretMetadataResponse(value) {
85
+ const result = readResult(value);
86
+ if (!result.ok) {
87
+ throw createInvalidResponseError('Secret metadata response was invalid.');
88
+ }
89
+ return parseSecretMetadata(result.data);
90
+ }
91
+ function parseProjectSecretRemoveResponse(value) {
92
+ const result = readResult(value);
93
+ if (!result.ok) {
94
+ throw createInvalidResponseError('Secret removal response was invalid.');
95
+ }
96
+ }
97
+ export function parseConfigureProjectOAuthProviderResponse(value) {
98
+ const record = asRecord(value);
99
+ if (record === null || typeof record.ok !== 'boolean') {
100
+ throw createInvalidResponseError('OAuth configuration response was invalid.');
101
+ }
102
+ if (record.ok) {
103
+ if (record.state !== 'saved' || typeof record.credentialsRef !== 'string') {
104
+ throw createInvalidResponseError('OAuth configuration response was invalid.');
105
+ }
106
+ return {
107
+ ok: true,
108
+ state: 'saved',
109
+ metadata: parseSecretMetadata(record.metadata),
110
+ credentialsRef: record.credentialsRef,
111
+ };
112
+ }
113
+ if (record.state !== 'secret_write_failed' && record.state !== 'secret_saved_manifest_failed') {
114
+ throw createInvalidResponseError('OAuth configuration response was invalid.');
115
+ }
116
+ return {
117
+ ok: false,
118
+ state: record.state,
119
+ error: parseError(record.error),
120
+ ...(record.metadata === undefined ? {} : { metadata: parseSecretMetadata(record.metadata) }),
121
+ ...(typeof record.credentialsRef === 'string' ? { credentialsRef: record.credentialsRef } : {}),
122
+ };
123
+ }
124
+ async function requestJson(path, init, allowStructuredFailure = false) {
125
+ const { API_BASE } = await import('./core/constants');
126
+ const response = await fetch(`${API_BASE}${path}`, init);
127
+ const value = await readJson(response);
128
+ if (!response.ok && !allowStructuredFailure) {
129
+ throw parseHttpError(value, response.status);
130
+ }
131
+ if (!response.ok && allowStructuredFailure) {
132
+ const record = asRecord(value);
133
+ if (record?.ok !== false) {
134
+ throw parseHttpError(value, response.status);
135
+ }
136
+ }
137
+ return value;
138
+ }
139
+ async function readJson(response) {
140
+ try {
141
+ return await response.json();
142
+ }
143
+ catch {
144
+ throw new ProjectSecretApiError({
145
+ code: 'invalid_response',
146
+ message: 'The Studio host returned a non-JSON secret response.',
147
+ status: response.status,
148
+ });
149
+ }
150
+ }
151
+ function parseHttpError(value, status) {
152
+ const record = asRecord(value);
153
+ const errorRecord = asRecord(record?.error);
154
+ const code = typeof errorRecord?.code === 'string'
155
+ ? errorRecord.code
156
+ : typeof record?.code === 'string'
157
+ ? record.code
158
+ : 'request_failed';
159
+ const message = typeof errorRecord?.message === 'string'
160
+ ? errorRecord.message
161
+ : typeof record?.error === 'string'
162
+ ? record.error
163
+ : 'The Studio secret request failed.';
164
+ return new ProjectSecretApiError({ code, message, status });
165
+ }
166
+ function readResult(value) {
167
+ const record = asRecord(value);
168
+ if (record === null || typeof record.ok !== 'boolean') {
169
+ throw createInvalidResponseError('Secret-store response was invalid.');
170
+ }
171
+ return { ok: record.ok, data: record.data };
172
+ }
173
+ function parseSecretMetadata(value) {
174
+ const record = asRecord(value);
175
+ if (record === null) {
176
+ throw createInvalidResponseError('Secret metadata was invalid.');
177
+ }
178
+ for (const key of Object.keys(record)) {
179
+ if (FORBIDDEN_SECRET_RESPONSE_KEYS.has(key)) {
180
+ throw createInvalidResponseError('Secret response unexpectedly contained a raw value field.');
181
+ }
182
+ }
183
+ const scope = asRecord(record.scope);
184
+ if (typeof record.ref !== 'string' ||
185
+ scope === null ||
186
+ typeof scope.projectId !== 'string' ||
187
+ typeof scope.environment !== 'string' ||
188
+ typeof record.kind !== 'string' ||
189
+ (record.provider !== undefined && typeof record.provider !== 'string') ||
190
+ !isStringArray(record.configuredFields) ||
191
+ typeof record.createdAt !== 'string' ||
192
+ typeof record.updatedAt !== 'string') {
193
+ throw createInvalidResponseError('Secret metadata was invalid.');
194
+ }
195
+ return {
196
+ ref: record.ref,
197
+ scope: { projectId: scope.projectId, environment: scope.environment },
198
+ kind: record.kind,
199
+ ...(typeof record.provider === 'string' ? { provider: record.provider } : {}),
200
+ configuredFields: [...record.configuredFields],
201
+ createdAt: record.createdAt,
202
+ updatedAt: record.updatedAt,
203
+ };
204
+ }
205
+ function parseError(value) {
206
+ const record = asRecord(value);
207
+ if (record === null || typeof record.code !== 'string' || typeof record.message !== 'string') {
208
+ throw createInvalidResponseError('Secret error response was invalid.');
209
+ }
210
+ return { code: record.code, message: record.message };
211
+ }
212
+ function createQuery(values) {
213
+ const params = new URLSearchParams();
214
+ for (const [key, value] of Object.entries(values)) {
215
+ const normalized = value?.trim();
216
+ if (normalized)
217
+ params.set(key, normalized);
218
+ }
219
+ const query = params.toString();
220
+ return query ? `?${query}` : '';
221
+ }
222
+ function asRecord(value) {
223
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
224
+ ? value
225
+ : null;
226
+ }
227
+ function isStringArray(value) {
228
+ return Array.isArray(value) && value.every((entry) => typeof entry === 'string');
229
+ }
230
+ function createInvalidResponseError(message) {
231
+ return new ProjectSecretApiError({ code: 'invalid_response', message, status: 502 });
232
+ }
233
+ //# sourceMappingURL=projectSecretApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectSecretApi.js","sourceRoot":"","sources":["../src/projectSecretApi.ts"],"names":[],"mappings":"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"}