@crowdedkingdoms/crowdyjs 15.10.0 → 15.11.0-dev.1

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 (35) hide show
  1. package/MIGRATION.md +18 -0
  2. package/dist/crowdy-client.d.ts +3 -0
  3. package/dist/crowdy-client.d.ts.map +1 -1
  4. package/dist/crowdy-client.js +2 -0
  5. package/dist/crowdy-studio/controller.d.ts +30 -1
  6. package/dist/crowdy-studio/controller.d.ts.map +1 -1
  7. package/dist/crowdy-studio/controller.js +168 -0
  8. package/dist/crowdy-studio/dom-shell.d.ts +13 -0
  9. package/dist/crowdy-studio/dom-shell.d.ts.map +1 -1
  10. package/dist/crowdy-studio/dom-shell.js +85 -0
  11. package/dist/crowdy-studio/embed/panel.d.ts +3 -0
  12. package/dist/crowdy-studio/embed/panel.d.ts.map +1 -1
  13. package/dist/crowdy-studio/embed/panel.js +1 -0
  14. package/dist/crowdy-studio/github/index.d.ts +3 -0
  15. package/dist/crowdy-studio/github/index.d.ts.map +1 -0
  16. package/dist/crowdy-studio/github/index.js +2 -0
  17. package/dist/crowdy-studio/github/sync.d.ts +49 -0
  18. package/dist/crowdy-studio/github/sync.d.ts.map +1 -0
  19. package/dist/crowdy-studio/github/sync.js +200 -0
  20. package/dist/crowdy-studio/github/transport.d.ts +81 -0
  21. package/dist/crowdy-studio/github/transport.d.ts.map +1 -0
  22. package/dist/crowdy-studio/github/transport.js +104 -0
  23. package/dist/crowdy-studio/index.d.ts +1 -0
  24. package/dist/crowdy-studio/index.d.ts.map +1 -1
  25. package/dist/crowdy-studio/index.js +1 -0
  26. package/dist/crowdy-studio/styles.d.ts +1 -1
  27. package/dist/crowdy-studio/styles.d.ts.map +1 -1
  28. package/dist/crowdy-studio/styles.js +4 -0
  29. package/dist/default-origin.d.ts +6 -6
  30. package/dist/default-origin.d.ts.map +1 -1
  31. package/dist/default-origin.js +6 -6
  32. package/dist/index.d.ts +1 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +1 -1
  35. package/package.json +1 -1
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Map Crowdy Studio SERVER/CLIENT files onto the repository bound to the
3
+ * project, and move files both ways through the game API.
4
+ *
5
+ * Layout (from `crowdy.json` at the repo root, else inferred):
6
+ * SERVER src/lib.rs <-> server/src/lib.rs
7
+ * CLIENT src/lib.rs <-> client/src/lib.rs
8
+ *
9
+ * The repository itself is never named here: every call carries only
10
+ * `(appId, projectId)` and the game API resolves the bind.
11
+ */
12
+ import type { CrowdyStudioProjectFile, CrowdyStudioTarget } from '../models.js';
13
+ import type { CrowdyStudioGitHubProjectScope, CrowdyStudioGitHubTransport, CrowdyStudioGitHubTreeEntry } from './transport.js';
14
+ export interface GitHubLayout {
15
+ serverRoot: string | null;
16
+ clientRoot: string | null;
17
+ }
18
+ /** Minimal surface the sync needs; the transport satisfies it. */
19
+ export type GitHubFiles = Pick<CrowdyStudioGitHubTransport, 'tree' | 'getFile' | 'putFile'>;
20
+ export declare const DEFAULT_FULL_STACK_CROWDY_JSON = "{\n \"server\": \"server\",\n \"client\": \"client\"\n}\n";
21
+ export declare function trimSlash(path: string): string;
22
+ export declare function joinRepo(root: string, rel: string): string;
23
+ export declare function underRoot(path: string, root: string | null): string | null;
24
+ export declare function parseCrowdyJson(content: string): GitHubLayout | null;
25
+ export declare function layoutFromTree(entries: ReadonlyArray<CrowdyStudioGitHubTreeEntry>): GitHubLayout;
26
+ export declare function repoPathToStudioFile(layout: GitHubLayout, repoPath: string): {
27
+ target: CrowdyStudioTarget;
28
+ path: string;
29
+ } | null;
30
+ export declare function studioFileToRepoPath(layout: GitHubLayout, target: CrowdyStudioTarget, path: string): string | null;
31
+ export declare function mergeStudioFilesFromGitHub(current: readonly CrowdyStudioProjectFile[], incoming: readonly CrowdyStudioProjectFile[]): {
32
+ files: CrowdyStudioProjectFile[];
33
+ changed: boolean;
34
+ };
35
+ /** Files present in Studio that the repository no longer has (for the UI to list). */
36
+ export declare function studioFilesMissingOnGitHub(layout: GitHubLayout, current: readonly CrowdyStudioProjectFile[], tree: ReadonlyArray<CrowdyStudioGitHubTreeEntry>): CrowdyStudioProjectFile[];
37
+ export declare function resolveGitHubLayout(github: GitHubFiles, scope: CrowdyStudioGitHubProjectScope, tree?: ReadonlyArray<CrowdyStudioGitHubTreeEntry>): Promise<{
38
+ layout: GitHubLayout;
39
+ tree: CrowdyStudioGitHubTreeEntry[];
40
+ }>;
41
+ /** One tree call, then one read per mapped blob. */
42
+ export declare function pullStudioFilesFromGitHub(github: GitHubFiles, scope: CrowdyStudioGitHubProjectScope): Promise<{
43
+ files: CrowdyStudioProjectFile[];
44
+ layout: GitHubLayout;
45
+ tree: CrowdyStudioGitHubTreeEntry[];
46
+ }>;
47
+ /** Push the given Studio files to the bound repository. Returns files written. */
48
+ export declare function pushStudioFilesToGitHub(github: GitHubFiles, scope: CrowdyStudioGitHubProjectScope, files: readonly CrowdyStudioProjectFile[]): Promise<number>;
49
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/crowdy-studio/github/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,KAAK,EACV,8BAA8B,EAC9B,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,kEAAkE;AAClE,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,2BAA2B,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC;AAK5F,eAAO,MAAM,8BAA8B,gEAI1C,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAO1E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAUpE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,CAAC,2BAA2B,CAAC,GAAG,YAAY,CAQhG;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,MAAM,GACf;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUrD;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,kBAAkB,EAC1B,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAIf;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,SAAS,uBAAuB,EAAE,EAC3C,QAAQ,EAAE,SAAS,uBAAuB,EAAE,GAC3C;IAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAkBxD;AAED,sFAAsF;AACtF,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,SAAS,uBAAuB,EAAE,EAC3C,IAAI,EAAE,aAAa,CAAC,2BAA2B,CAAC,GAC/C,uBAAuB,EAAE,CAM3B;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,8BAA8B,EACrC,IAAI,CAAC,EAAE,aAAa,CAAC,2BAA2B,CAAC,GAChD,OAAO,CAAC;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,2BAA2B,EAAE,CAAA;CAAE,CAAC,CAYxE;AAED,oDAAoD;AACpD,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,8BAA8B,GACpC,OAAO,CAAC;IAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,2BAA2B,EAAE,CAAA;CAAE,CAAC,CAe1G;AAyBD,kFAAkF;AAClF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,8BAA8B,EACrC,KAAK,EAAE,SAAS,uBAAuB,EAAE,GACxC,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Map Crowdy Studio SERVER/CLIENT files onto the repository bound to the
3
+ * project, and move files both ways through the game API.
4
+ *
5
+ * Layout (from `crowdy.json` at the repo root, else inferred):
6
+ * SERVER src/lib.rs <-> server/src/lib.rs
7
+ * CLIENT src/lib.rs <-> client/src/lib.rs
8
+ *
9
+ * The repository itself is never named here: every call carries only
10
+ * `(appId, projectId)` and the game API resolves the bind.
11
+ */
12
+ const SKIP_DIRS = new Set(['.git', 'node_modules', 'target', 'dist', '.cursor']);
13
+ const SKIP_FILES = new Set(['crowdy.json', 'readme.md', 'license', '.gitignore']);
14
+ export const DEFAULT_FULL_STACK_CROWDY_JSON = `{
15
+ "server": "server",
16
+ "client": "client"
17
+ }
18
+ `;
19
+ export function trimSlash(path) {
20
+ let start = 0;
21
+ let end = path.length;
22
+ while (start < end && path.charCodeAt(start) === 47)
23
+ start += 1;
24
+ while (end > start && path.charCodeAt(end - 1) === 47)
25
+ end -= 1;
26
+ return start === 0 && end === path.length ? path : path.slice(start, end);
27
+ }
28
+ export function joinRepo(root, rel) {
29
+ const base = trimSlash(root);
30
+ const rest = trimSlash(rel);
31
+ if (!base || base === '.')
32
+ return rest;
33
+ return rest ? `${base}/${rest}` : base;
34
+ }
35
+ export function underRoot(path, root) {
36
+ if (root == null)
37
+ return null;
38
+ const base = trimSlash(root);
39
+ if (!base || base === '.')
40
+ return path;
41
+ if (path === base)
42
+ return '';
43
+ if (path.startsWith(`${base}/`))
44
+ return path.slice(base.length + 1);
45
+ return null;
46
+ }
47
+ export function parseCrowdyJson(content) {
48
+ try {
49
+ const parsed = JSON.parse(content);
50
+ const server = typeof parsed.server === 'string' ? parsed.server.trim() || '.' : null;
51
+ const clientRoot = typeof parsed.client === 'string' ? parsed.client.trim() || '.' : null;
52
+ if (server == null && clientRoot == null)
53
+ return null;
54
+ return { serverRoot: server, clientRoot };
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ export function layoutFromTree(entries) {
61
+ const hasDir = (name) => entries.some((e) => e.type === 'tree' && e.path === name);
62
+ const hasClient = hasDir('client');
63
+ const hasServer = hasDir('server');
64
+ if (hasServer && hasClient)
65
+ return { serverRoot: 'server', clientRoot: 'client' };
66
+ if (hasClient)
67
+ return { serverRoot: '.', clientRoot: 'client' };
68
+ if (hasServer)
69
+ return { serverRoot: 'server', clientRoot: null };
70
+ return { serverRoot: '.', clientRoot: null };
71
+ }
72
+ export function repoPathToStudioFile(layout, repoPath) {
73
+ const segments = repoPath.split('/');
74
+ if (segments.some((s) => SKIP_DIRS.has(s)))
75
+ return null;
76
+ const name = segments[segments.length - 1]?.toLowerCase() ?? '';
77
+ if (SKIP_FILES.has(name) || SKIP_FILES.has(repoPath.toLowerCase()))
78
+ return null;
79
+ const clientRel = underRoot(repoPath, layout.clientRoot);
80
+ if (clientRel != null && clientRel !== '')
81
+ return { target: 'CLIENT', path: clientRel };
82
+ const serverRel = underRoot(repoPath, layout.serverRoot);
83
+ if (serverRel != null && serverRel !== '')
84
+ return { target: 'SERVER', path: serverRel };
85
+ return null;
86
+ }
87
+ export function studioFileToRepoPath(layout, target, path) {
88
+ const root = target === 'CLIENT' ? layout.clientRoot : layout.serverRoot;
89
+ if (root == null)
90
+ return null;
91
+ return joinRepo(root, path);
92
+ }
93
+ export function mergeStudioFilesFromGitHub(current, incoming) {
94
+ const keyOf = (file) => `${file.target}:${file.path}`;
95
+ const next = new Map(current.map((file) => [keyOf(file), { ...file }]));
96
+ let changed = false;
97
+ for (const file of incoming) {
98
+ const key = keyOf(file);
99
+ const existing = next.get(key);
100
+ if (!existing) {
101
+ next.set(key, { ...file });
102
+ changed = true;
103
+ continue;
104
+ }
105
+ if (existing.content !== file.content) {
106
+ next.set(key, { ...existing, content: file.content });
107
+ changed = true;
108
+ }
109
+ }
110
+ return { files: [...next.values()], changed };
111
+ }
112
+ /** Files present in Studio that the repository no longer has (for the UI to list). */
113
+ export function studioFilesMissingOnGitHub(layout, current, tree) {
114
+ const blobs = new Set(tree.filter((e) => e.type === 'blob').map((e) => e.path));
115
+ return current.filter((file) => {
116
+ const repoPath = studioFileToRepoPath(layout, file.target, file.path);
117
+ return repoPath != null && !blobs.has(repoPath);
118
+ });
119
+ }
120
+ export async function resolveGitHubLayout(github, scope, tree) {
121
+ const entries = tree ? [...tree] : await github.tree(scope);
122
+ if (entries.some((e) => e.type === 'blob' && e.path === 'crowdy.json')) {
123
+ try {
124
+ const file = await github.getFile({ ...scope, path: 'crowdy.json' });
125
+ const parsed = parseCrowdyJson(file.content);
126
+ if (parsed)
127
+ return { layout: parsed, tree: entries };
128
+ }
129
+ catch {
130
+ // Unreadable crowdy.json: infer from the tree.
131
+ }
132
+ }
133
+ return { layout: layoutFromTree(entries), tree: entries };
134
+ }
135
+ /** One tree call, then one read per mapped blob. */
136
+ export async function pullStudioFilesFromGitHub(github, scope) {
137
+ const { layout, tree } = await resolveGitHubLayout(github, scope);
138
+ const files = [];
139
+ for (const entry of tree) {
140
+ if (entry.type !== 'blob')
141
+ continue;
142
+ const mapped = repoPathToStudioFile(layout, entry.path);
143
+ if (!mapped)
144
+ continue;
145
+ try {
146
+ const body = await github.getFile({ ...scope, path: entry.path });
147
+ files.push({ target: mapped.target, path: mapped.path, content: body.content });
148
+ }
149
+ catch {
150
+ continue;
151
+ }
152
+ }
153
+ return { files, layout, tree };
154
+ }
155
+ async function putFileCreateOrUpdate(github, scope, path, content, message, knownSha) {
156
+ let sha = knownSha ?? undefined;
157
+ if (knownSha) {
158
+ // Skip the write when the blob already matches.
159
+ try {
160
+ const existing = await github.getFile({ ...scope, path });
161
+ if (existing.content === content)
162
+ return false;
163
+ sha = existing.sha;
164
+ }
165
+ catch {
166
+ sha = undefined;
167
+ }
168
+ }
169
+ await github.putFile({ ...scope, path, content, message, ...(sha ? { sha } : {}) });
170
+ return true;
171
+ }
172
+ /** Push the given Studio files to the bound repository. Returns files written. */
173
+ export async function pushStudioFilesToGitHub(github, scope, files) {
174
+ const resolved = await resolveGitHubLayout(github, scope);
175
+ let layout = resolved.layout;
176
+ const shaByPath = new Map(resolved.tree.filter((e) => e.type === 'blob').map((e) => [e.path, e.sha]));
177
+ let pushed = 0;
178
+ const wantsFullStack = files.some((f) => f.target === 'SERVER') && files.some((f) => f.target === 'CLIENT');
179
+ if (wantsFullStack && !shaByPath.has('crowdy.json')) {
180
+ // A full-stack project on a repo with no layout file: declare server/ +
181
+ // client/ first so both trees land under their roots from this push on.
182
+ await github.putFile({
183
+ ...scope,
184
+ path: 'crowdy.json',
185
+ content: DEFAULT_FULL_STACK_CROWDY_JSON,
186
+ message: 'studio: add crowdy.json layout',
187
+ });
188
+ pushed += 1;
189
+ layout = { serverRoot: 'server', clientRoot: 'client' };
190
+ }
191
+ for (const file of files) {
192
+ const path = studioFileToRepoPath(layout, file.target, file.path);
193
+ if (!path)
194
+ continue;
195
+ const wrote = await putFileCreateOrUpdate(github, scope, path, file.content, `studio: update ${file.target} ${file.path}`, shaByPath.get(path));
196
+ if (wrote)
197
+ pushed += 1;
198
+ }
199
+ return pushed;
200
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * GraphQL transport for GitHub-backed Crowdy Studio projects.
3
+ *
4
+ * Same GraphQL client and session as everything else in the SDK: the game
5
+ * API resolves the repository from the project's bind, so no operation here
6
+ * names an `owner` / `repo` on a read or write, and no GitHub token ever
7
+ * reaches the browser. GitHub is a filesystem for the project, not a login.
8
+ *
9
+ * Which token may call what is decided server-side: `connectUrl`, `repos`,
10
+ * `bind`, `unbind` need the identity session (hosted Studio); `status`,
11
+ * `setAutosave`, `tree`, `getFile`, `putFile` also work under the in-game
12
+ * embed's app token.
13
+ */
14
+ import type { GraphQLClient } from '../../client.js';
15
+ export interface CrowdyStudioGitHubStatus {
16
+ configured: boolean;
17
+ connected: boolean;
18
+ accountLogin: string | null;
19
+ accountType: string | null;
20
+ owner: string | null;
21
+ repo: string | null;
22
+ branch: string | null;
23
+ /** Autosave also pushes to GitHub. Off by default; the owner opts in. */
24
+ autosave: boolean;
25
+ installUrl: string | null;
26
+ }
27
+ export interface CrowdyStudioGitHubRepo {
28
+ owner: string;
29
+ name: string;
30
+ fullName: string;
31
+ private: boolean;
32
+ defaultBranch: string | null;
33
+ }
34
+ export interface CrowdyStudioGitHubTreeEntry {
35
+ path: string;
36
+ /** `blob` or `tree`. */
37
+ type: string;
38
+ sha: string | null;
39
+ size: number | null;
40
+ }
41
+ export interface CrowdyStudioGitHubFile {
42
+ path: string;
43
+ content: string;
44
+ sha: string;
45
+ }
46
+ export interface CrowdyStudioGitHubProjectScope {
47
+ appId: string;
48
+ projectId: string;
49
+ }
50
+ export declare class CrowdyStudioGitHubTransport {
51
+ private readonly graphql;
52
+ constructor(graphql: GraphQLClient);
53
+ status(input?: {
54
+ appId?: string;
55
+ projectId?: string;
56
+ }): Promise<CrowdyStudioGitHubStatus>;
57
+ connectUrl(): Promise<{
58
+ connectUrl: string;
59
+ }>;
60
+ repos(): Promise<CrowdyStudioGitHubRepo[]>;
61
+ bind(input: CrowdyStudioGitHubProjectScope & {
62
+ owner: string;
63
+ repo: string;
64
+ branch?: string;
65
+ }): Promise<CrowdyStudioGitHubStatus>;
66
+ unbind(input: CrowdyStudioGitHubProjectScope): Promise<CrowdyStudioGitHubStatus>;
67
+ setAutosave(input: CrowdyStudioGitHubProjectScope & {
68
+ autosave: boolean;
69
+ }): Promise<CrowdyStudioGitHubStatus>;
70
+ tree(input: CrowdyStudioGitHubProjectScope): Promise<CrowdyStudioGitHubTreeEntry[]>;
71
+ getFile(input: CrowdyStudioGitHubProjectScope & {
72
+ path: string;
73
+ }): Promise<CrowdyStudioGitHubFile>;
74
+ putFile(input: CrowdyStudioGitHubProjectScope & {
75
+ path: string;
76
+ content: string;
77
+ message: string;
78
+ sha?: string;
79
+ }): Promise<CrowdyStudioGitHubFile>;
80
+ }
81
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/crowdy-studio/github/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,yEAAyE;IACzE,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAgDD,qBAAa,2BAA2B;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa;IAE7C,MAAM,CAAC,KAAK,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAQ7F,UAAU,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAK7C,KAAK,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAK1C,IAAI,CACR,KAAK,EAAE,8BAA8B,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACvF,OAAO,CAAC,wBAAwB,CAAC;IAK9B,MAAM,CAAC,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAOhF,WAAW,CACf,KAAK,EAAE,8BAA8B,GAAG;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,GAC5D,OAAO,CAAC,wBAAwB,CAAC;IAQ9B,IAAI,CAAC,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC;IAOnF,OAAO,CAAC,KAAK,EAAE,8BAA8B,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAKlG,OAAO,CACX,KAAK,EAAE,8BAA8B,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GACvG,OAAO,CAAC,sBAAsB,CAAC;CAMnC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * GraphQL transport for GitHub-backed Crowdy Studio projects.
3
+ *
4
+ * Same GraphQL client and session as everything else in the SDK: the game
5
+ * API resolves the repository from the project's bind, so no operation here
6
+ * names an `owner` / `repo` on a read or write, and no GitHub token ever
7
+ * reaches the browser. GitHub is a filesystem for the project, not a login.
8
+ *
9
+ * Which token may call what is decided server-side: `connectUrl`, `repos`,
10
+ * `bind`, `unbind` need the identity session (hosted Studio); `status`,
11
+ * `setAutosave`, `tree`, `getFile`, `putFile` also work under the in-game
12
+ * embed's app token.
13
+ */
14
+ const STATUS_FIELDS = `
15
+ configured connected accountLogin accountType owner repo branch autosave installUrl
16
+ `;
17
+ const STATUS = `
18
+ query CrowdyStudioGitHubStatus($appId: BigInt, $projectId: String) {
19
+ crowdyStudioGitHubStatus(appId: $appId, projectId: $projectId) { ${STATUS_FIELDS} }
20
+ }
21
+ `;
22
+ const CONNECT = `
23
+ mutation CrowdyStudioGitHubConnectUrl { crowdyStudioGitHubConnectUrl { connectUrl } }
24
+ `;
25
+ const REPOS = `
26
+ query CrowdyStudioGitHubRepos { crowdyStudioGitHubRepos { owner name fullName private defaultBranch } }
27
+ `;
28
+ const BIND = `
29
+ mutation CrowdyStudioGitHubBind($input: BindCrowdyStudioGitHubInput!) {
30
+ crowdyStudioGitHubBind(input: $input) { ${STATUS_FIELDS} }
31
+ }
32
+ `;
33
+ const UNBIND = `
34
+ mutation CrowdyStudioGitHubUnbind($input: CrowdyStudioGitHubProjectInput!) {
35
+ crowdyStudioGitHubUnbind(input: $input) { ${STATUS_FIELDS} }
36
+ }
37
+ `;
38
+ const SET_AUTOSAVE = `
39
+ mutation CrowdyStudioGitHubSetAutosave($input: SetCrowdyStudioGitHubAutosaveInput!) {
40
+ crowdyStudioGitHubSetAutosave(input: $input) { ${STATUS_FIELDS} }
41
+ }
42
+ `;
43
+ const TREE = `
44
+ query CrowdyStudioGitHubTree($input: CrowdyStudioGitHubProjectInput!) {
45
+ crowdyStudioGitHubTree(input: $input) { path type sha size }
46
+ }
47
+ `;
48
+ const FILE = `
49
+ query CrowdyStudioGitHubFile($input: CrowdyStudioGitHubFileInput!) {
50
+ crowdyStudioGitHubFile(input: $input) { path content sha }
51
+ }
52
+ `;
53
+ const PUT_FILE = `
54
+ mutation CrowdyStudioGitHubPutFile($input: CrowdyStudioGitHubPutFileInput!) {
55
+ crowdyStudioGitHubPutFile(input: $input) { path content sha }
56
+ }
57
+ `;
58
+ export class CrowdyStudioGitHubTransport {
59
+ constructor(graphql) {
60
+ this.graphql = graphql;
61
+ }
62
+ async status(input = {}) {
63
+ const data = await this.graphql.query(STATUS, { appId: input.appId, projectId: input.projectId });
64
+ return data.crowdyStudioGitHubStatus;
65
+ }
66
+ async connectUrl() {
67
+ const data = await this.graphql.query(CONNECT);
68
+ return data.crowdyStudioGitHubConnectUrl;
69
+ }
70
+ async repos() {
71
+ const data = await this.graphql.query(REPOS);
72
+ return data.crowdyStudioGitHubRepos ?? [];
73
+ }
74
+ async bind(input) {
75
+ const data = await this.graphql.query(BIND, { input });
76
+ return data.crowdyStudioGitHubBind;
77
+ }
78
+ async unbind(input) {
79
+ const data = await this.graphql.query(UNBIND, {
80
+ input,
81
+ });
82
+ return data.crowdyStudioGitHubUnbind;
83
+ }
84
+ async setAutosave(input) {
85
+ const data = await this.graphql.query(SET_AUTOSAVE, { input });
86
+ return data.crowdyStudioGitHubSetAutosave;
87
+ }
88
+ async tree(input) {
89
+ const data = await this.graphql.query(TREE, {
90
+ input,
91
+ });
92
+ return data.crowdyStudioGitHubTree ?? [];
93
+ }
94
+ async getFile(input) {
95
+ const data = await this.graphql.query(FILE, { input });
96
+ return data.crowdyStudioGitHubFile;
97
+ }
98
+ async putFile(input) {
99
+ const data = await this.graphql.query(PUT_FILE, {
100
+ input,
101
+ });
102
+ return data.crowdyStudioGitHubPutFile;
103
+ }
104
+ }
@@ -15,4 +15,5 @@ export { createPaneSplitter, type PaneSplitterHandle, type PaneSplitterOptions,
15
15
  export * from './embed/index.js';
16
16
  export * from '../crowdy-agent/index.js';
17
17
  export * from '../player-host/index.js';
18
+ export * from './github/index.js';
18
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/index.ts"],"names":[],"mappings":"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"}
@@ -15,3 +15,4 @@ export { createPaneSplitter, } from './splitter.js';
15
15
  export * from './embed/index.js';
16
16
  export * from '../crowdy-agent/index.js';
17
17
  export * from '../player-host/index.js';
18
+ export * from './github/index.js';
@@ -1,2 +1,2 @@
1
- export declare const CROWDY_STUDIO_STYLES = "\n.ck-crowdy-studio{--ck-bg:#111827;--ck-panel:#182235;--ck-line:#334155;--ck-text:#e5e7eb;--ck-muted:#94a3b8;--ck-accent:#38bdf8;container-type:inline-size;display:flex;flex-direction:column;position:relative;isolation:isolate;width:100%;height:100%;min-height:0;overflow:hidden;background:var(--ck-bg);color:var(--ck-text);font:13px/1.4 ui-sans-serif,system-ui,sans-serif;border:1px solid var(--ck-line)}\n.ck-crowdy-studio *{box-sizing:border-box}.ck-crowdy-studio button,.ck-crowdy-studio input,.ck-crowdy-studio select,.ck-crowdy-studio textarea{font:inherit}.ck-crowdy-studio button,.ck-crowdy-studio select,.ck-crowdy-studio input{background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line);border-radius:4px;padding:5px 8px}.ck-crowdy-studio button{cursor:pointer}.ck-crowdy-studio button:hover{border-color:var(--ck-accent)}.ck-crowdy-studio button:disabled{opacity:.5;cursor:not-allowed}\n.ck-crowdy-studio [hidden]{display:none!important}\n\n/* Top bar */\n.ck-crowdy-studio-toolbar{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:6px 8px;border-bottom:1px solid var(--ck-line);position:relative;z-index:30}\n.ck-crowdy-studio-project-tools,.ck-crowdy-studio-runtime-tools{display:flex;align-items:center;gap:6px;min-width:0}\n.ck-crowdy-studio-primary{border-color:var(--ck-accent);color:#bae6fd}\n.ck-crowdy-studio-save{color:var(--ck-muted)}\n.ck-crowdy-studio-save[data-state=SAVED]{color:#86efac}.ck-crowdy-studio-save[data-state=SAVING]{color:#fde68a}.ck-crowdy-studio-save[data-state=CONFLICT]{color:#fca5a5;border-color:#f87171}.ck-crowdy-studio-save[data-state=OFFLINE]{color:#fdba74;border-color:#fb923c}\n.ck-crowdy-studio-save-message{margin:0;padding:4px 6px;color:var(--ck-muted);max-width:280px}\n.ck-crowdy-studio-save-actions{display:flex;gap:6px;padding:4px 6px}\n\n/* Menus */\n.ck-crowdy-studio-menu-wrap{position:relative;display:inline-flex;min-width:0}\n.ck-crowdy-studio-menu-button{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.ck-crowdy-studio-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:40;min-width:180px;max-width:320px;max-height:60vh;overflow:auto;display:flex;flex-direction:column;background:var(--ck-panel);border:1px solid var(--ck-line);border-radius:6px;padding:4px;box-shadow:0 8px 24px rgba(2,6,23,.55)}\n.ck-crowdy-studio-runtime-tools .ck-crowdy-studio-menu{left:auto;right:0}\n.ck-crowdy-studio-menu-item{display:block;width:100%;text-align:left;background:transparent;border:0;border-radius:4px;padding:6px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.ck-crowdy-studio-menu-item:hover{background:#0f172a;border:0}\n.ck-crowdy-studio-menu-item[data-active=true]{color:#bae6fd}\n.ck-crowdy-studio-menu-divider{border-top:1px solid var(--ck-line);margin:4px 2px}\n\n/* New-project popover */\n.ck-crowdy-studio-new{display:none;position:absolute;top:100%;left:8px;z-index:35;gap:6px;align-items:center;padding:8px;background:var(--ck-panel);border:1px solid var(--ck-line);border-radius:6px;box-shadow:0 8px 24px rgba(2,6,23,.55)}\n.ck-crowdy-studio-new[data-open=true]{display:flex}\n.ck-crowdy-studio-new input{flex:1;min-width:160px}\n\n/* Workspace: rail + panes + editor */\n.ck-crowdy-studio-workspace{display:flex;flex:1;min-height:0;min-width:0;position:relative}\n.ck-crowdy-studio-rail{display:flex;flex-direction:column;gap:4px;padding:6px 3px;border-right:1px solid var(--ck-line);background:#0b1220}\n.ck-crowdy-studio-rail-button{writing-mode:vertical-rl;padding:8px 4px;background:transparent;border:1px solid transparent;color:var(--ck-muted);border-radius:4px}\n.ck-crowdy-studio-rail-button:hover{color:var(--ck-text)}\n.ck-crowdy-studio-rail-button[aria-pressed=true]{color:#bae6fd;border-color:var(--ck-line);background:#0f172a}\n.ck-crowdy-studio-explorer,.ck-crowdy-studio-settings{flex:none;background:var(--ck-panel);overflow:auto;padding:8px;min-width:0}\n.ck-crowdy-studio-settings{border-left:1px solid var(--ck-line)}\n.ck-crowdy-studio-settings h3{margin:0 0 8px}\n.ck-crowdy-studio-editor-column{display:flex;flex-direction:column;flex:1;min-width:240px;min-height:0}\n.ck-crowdy-studio-editor{flex:1;min-height:80px;position:relative}\n.ck-crowdy-studio-textarea{width:100%;height:100%;min-height:0;resize:none;background:#0b1020;color:var(--ck-text);border:0;padding:12px;font:13px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}\n.ck-crowdy-studio-editor-notice{padding:4px 8px;background:#78350f;color:#ffedd5}\n\n/* Splitters */\n.ck-crowdy-studio-splitter{flex:none;background:transparent;position:relative;z-index:5}\n.ck-crowdy-studio-splitter[data-orientation=vertical]{width:6px;cursor:col-resize}\n.ck-crowdy-studio-splitter[data-orientation=horizontal]{height:6px;cursor:row-resize}\n.ck-crowdy-studio-splitter:hover,.ck-crowdy-studio-splitter[data-dragging=true]{background:var(--ck-accent);opacity:.5}\n\n/* Explorer */\n.ck-crowdy-studio-section{margin-bottom:12px}\n.ck-crowdy-studio-section-header{display:flex;align-items:center;justify-content:space-between;color:var(--ck-muted);font-weight:700;text-transform:uppercase;font-size:11px;margin-bottom:4px}\n.ck-crowdy-studio-file{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:3px;align-items:center}\n.ck-crowdy-studio-file>button:first-child{text-align:left;overflow:hidden;text-overflow:ellipsis;border:0;background:transparent}\n.ck-crowdy-studio-file-action{padding:1px 6px}\n.ck-crowdy-studio-file .ck-crowdy-studio-menu{left:auto;right:0;min-width:130px}\n.ck-crowdy-studio-inline-form{display:flex;flex-wrap:wrap;gap:4px;margin:4px 0;padding:6px;border:1px solid var(--ck-line);border-radius:4px;background:#0f172a}\n.ck-crowdy-studio-inline-form input{flex:1 1 100%;min-width:0}\n.ck-crowdy-studio-file-form-row{display:flex;flex-wrap:wrap;gap:4px;align-items:center;margin:4px 0;padding:6px;border:1px solid #f59e0b66;border-radius:4px}\n\n/* Editor tabs */\n.ck-crowdy-studio-tabs{display:flex;align-items:center;gap:6px;padding:4px;border-bottom:1px solid var(--ck-line);overflow:auto}\n.ck-crowdy-studio-tab{white-space:nowrap}\n.ck-crowdy-studio-tab[data-active=true],.ck-crowdy-studio-panel-tab[data-active=true]{border-color:var(--ck-accent);color:#bae6fd}\n.ck-crowdy-studio-tab span{margin-left:7px;color:var(--ck-muted)}\n\n/* Settings */\n.ck-crowdy-studio-settings label{display:grid;gap:3px;margin-bottom:9px;color:var(--ck-muted)}\n.ck-crowdy-studio-settings input,.ck-crowdy-studio-settings select{width:100%}\n\n/* Bottom panel */\n.ck-crowdy-studio-bottom{flex:none;display:flex;flex-direction:column;min-height:0;border-top:1px solid var(--ck-line)}\n.ck-crowdy-studio-panel-tabs{display:flex;align-items:center;gap:6px;padding:5px 7px;border-bottom:1px solid var(--ck-line)}\n.ck-crowdy-studio-panel-hide{margin-left:auto;padding:1px 7px;color:var(--ck-muted)}\n.ck-crowdy-studio-panel-body{flex:1;min-height:0;display:flex;flex-direction:column}\n.ck-crowdy-studio-panel{display:none;flex:1;overflow:auto;padding:8px}\n.ck-crowdy-studio-panel[data-active=true]{display:block}\n.ck-crowdy-studio-panel pre{white-space:pre-wrap;margin:0;font:12px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}\n.ck-crowdy-studio-problem{display:grid;grid-template-columns:auto auto 1fr;gap:8px;padding:3px;border-bottom:1px solid #243247;width:100%;text-align:left;background:transparent;border-left:0;border-right:0;border-top:0;border-radius:0}\n.ck-crowdy-studio-problem[data-source=rustc]{color:#fecaca}\n.ck-crowdy-studio-problem[data-source=local-advisory]{color:#fde68a}\n.ck-crowdy-studio-invoke{display:grid;grid-template-columns:180px 1fr auto;gap:6px}\n.ck-crowdy-studio-invoke textarea{min-height:70px;background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line)}\n.ck-crowdy-studio-empty{color:var(--ck-muted);padding:8px}\n\n/* Status bar */\n.ck-crowdy-studio-statusbar{display:flex;align-items:center;gap:14px;padding:3px 10px;border-top:1px solid var(--ck-line);background:#0b1220;font-size:12px;min-height:24px}\n.ck-crowdy-studio-status{color:var(--ck-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.ck-crowdy-studio-statusbar-runtime{background:transparent;border:0;padding:1px 4px;border-radius:3px}\n.ck-crowdy-studio-statusbar-runtime:hover{color:var(--ck-text)}\n.ck-crowdy-studio-statusbar-runtime[data-phase=RUNNING]{color:#86efac}\n.ck-crowdy-studio-statusbar-runtime[data-phase=COMPILING],.ck-crowdy-studio-statusbar-runtime[data-phase=TESTING_DRAFT],.ck-crowdy-studio-statusbar-runtime[data-phase=DEPLOYING_LIVE],.ck-crowdy-studio-statusbar-runtime[data-phase=ENABLING]{color:#fde68a}\n.ck-crowdy-studio-statusbar-runtime[data-phase=COMPILE_FAILED],.ck-crowdy-studio-statusbar-runtime[data-phase=ERROR],.ck-crowdy-studio-statusbar-runtime[data-phase=PARTIAL_FAILURE]{color:#fca5a5}\n\n/* Agent dock */\n.ck-crowdy-studio-agent-dock{flex:none;display:flex;flex-direction:column;gap:8px;min-width:0;min-height:0;padding:10px;border-left:1px solid var(--ck-line);background:#0b1220;overflow:auto}\n.ck-crowdy-studio-agent-dock header{display:flex;align-items:center;justify-content:space-between;gap:8px}\n.ck-crowdy-studio-agent-dock h2,.ck-crowdy-studio-agent-dock h3{margin:0;font-size:13px}\n.ck-crowdy-studio-agent-status,.ck-crowdy-studio-agent-budget,.ck-crowdy-studio-agent-lease{color:var(--ck-muted);font-size:12px}\n.ck-crowdy-studio-agent-lease[data-active=true]{color:#fde68a;border:1px solid #f59e0b;border-radius:5px;padding:6px}\n.ck-crowdy-studio-agent-controls-row{display:flex;align-items:center;justify-content:space-between;gap:6px;flex-wrap:wrap}\n.ck-crowdy-studio-agent-modes,.ck-crowdy-studio-agent-controls{display:flex;gap:5px;flex-wrap:wrap}\n.ck-crowdy-studio-agent-modes button[data-active=true]{border-color:var(--ck-accent);color:#bae6fd}\n.ck-crowdy-studio-agent-stop{border-color:#ef4444!important;color:#fecaca!important}\n.ck-crowdy-studio-agent-disclosure{border:1px solid var(--ck-line);border-radius:5px;padding:0}\n.ck-crowdy-studio-agent-disclosure>summary{cursor:pointer;padding:6px 8px;color:var(--ck-muted)}\n.ck-crowdy-studio-agent-disclosure[open]>summary{border-bottom:1px solid var(--ck-line);color:var(--ck-text)}\n.ck-crowdy-studio-agent-disclosure>:not(summary){padding:6px 8px}\n.ck-crowdy-studio-agent-lease-controls{display:flex;gap:6px;flex-wrap:wrap;margin:0;padding:7px;border:1px solid var(--ck-line)}\n.ck-crowdy-studio-agent-lease-controls legend{color:var(--ck-muted)}\n.ck-crowdy-studio-agent-lease-controls label{display:flex;gap:3px;align-items:center}\n.ck-crowdy-studio-agent-messages{display:flex;flex-direction:column;gap:6px;flex:1;min-height:120px;overflow:auto}\n.ck-crowdy-studio-agent-message,.ck-crowdy-studio-agent-stream,.ck-crowdy-studio-agent-approval,.ck-crowdy-studio-agent-diff,.ck-crowdy-studio-agent-checkpoint{padding:7px;border:1px solid var(--ck-line);border-radius:5px;background:var(--ck-panel)}\n.ck-crowdy-studio-agent-message[data-role=USER]{border-color:#155e75}\n.ck-crowdy-studio-agent-message p,.ck-crowdy-studio-agent-approval p,.ck-crowdy-studio-agent-diff p,.ck-crowdy-studio-agent-checkpoint p{margin:3px 0;white-space:pre-wrap;overflow-wrap:anywhere}\n.ck-crowdy-studio-agent-timeline{display:grid;gap:5px;margin:0;padding-left:22px;max-height:190px;overflow:auto}\n.ck-crowdy-studio-agent-timeline li{padding:4px;border-bottom:1px solid #243247}\n.ck-crowdy-studio-agent-timeline li>span{margin-left:6px;color:var(--ck-muted)}\n.ck-crowdy-studio-agent-approvals,.ck-crowdy-studio-agent-checkpoints{display:grid;gap:7px}\n.ck-crowdy-studio-agent-approval{border-color:#f59e0b}\n.ck-crowdy-studio-agent-approval code{display:block;overflow-wrap:anywhere;color:#fde68a}\n.ck-crowdy-studio-agent-approval>div{display:flex;gap:6px}\n.ck-crowdy-studio-agent-composer{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px}\n.ck-crowdy-studio-agent-composer textarea{min-height:62px;resize:vertical;background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line);padding:7px}\n.ck-crowdy-studio :focus-visible{outline:2px solid var(--ck-accent);outline-offset:2px}\n\n/* Narrow widths: side panes become overlays so the editor keeps priority. */\n@container(max-width:900px){.ck-crowdy-studio-settings{position:absolute;right:0;top:0;bottom:0;z-index:20;max-width:85%;border-left:1px solid var(--ck-line);box-shadow:-8px 0 24px rgba(2,6,23,.55)}.ck-crowdy-studio-splitter[data-orientation=vertical]{display:none}}\n@container(max-width:760px){.ck-crowdy-studio-agent-dock{position:absolute;right:0;top:0;bottom:0;z-index:22;max-width:92%;box-shadow:-8px 0 24px rgba(2,6,23,.55)}}\n@container(max-width:620px){.ck-crowdy-studio-explorer{position:absolute;left:34px;top:0;bottom:0;z-index:21;max-width:85%;border-right:1px solid var(--ck-line);box-shadow:8px 0 24px rgba(2,6,23,.55)}}\n";
1
+ export declare const CROWDY_STUDIO_STYLES = "\n.ck-crowdy-studio{--ck-bg:#111827;--ck-panel:#182235;--ck-line:#334155;--ck-text:#e5e7eb;--ck-muted:#94a3b8;--ck-accent:#38bdf8;container-type:inline-size;display:flex;flex-direction:column;position:relative;isolation:isolate;width:100%;height:100%;min-height:0;overflow:hidden;background:var(--ck-bg);color:var(--ck-text);font:13px/1.4 ui-sans-serif,system-ui,sans-serif;border:1px solid var(--ck-line)}\n.ck-crowdy-studio *{box-sizing:border-box}.ck-crowdy-studio button,.ck-crowdy-studio input,.ck-crowdy-studio select,.ck-crowdy-studio textarea{font:inherit}.ck-crowdy-studio button,.ck-crowdy-studio select,.ck-crowdy-studio input{background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line);border-radius:4px;padding:5px 8px}.ck-crowdy-studio button{cursor:pointer}.ck-crowdy-studio button:hover{border-color:var(--ck-accent)}.ck-crowdy-studio button:disabled{opacity:.5;cursor:not-allowed}\n.ck-crowdy-studio [hidden]{display:none!important}\n\n/* Top bar */\n.ck-crowdy-studio-toolbar{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:6px 8px;border-bottom:1px solid var(--ck-line);position:relative;z-index:30}\n.ck-crowdy-studio-project-tools,.ck-crowdy-studio-runtime-tools{display:flex;align-items:center;gap:6px;min-width:0}\n.ck-crowdy-studio-primary{border-color:var(--ck-accent);color:#bae6fd}\n.ck-crowdy-studio-save{color:var(--ck-muted)}\n.ck-crowdy-studio-save[data-state=SAVED]{color:#86efac}.ck-crowdy-studio-save[data-state=SAVING]{color:#fde68a}.ck-crowdy-studio-save[data-state=CONFLICT]{color:#fca5a5;border-color:#f87171}.ck-crowdy-studio-save[data-state=OFFLINE]{color:#fdba74;border-color:#fb923c}\n.ck-crowdy-studio-save-message{margin:0;padding:4px 6px;color:var(--ck-muted);max-width:280px}\n.ck-crowdy-studio-save-actions{display:flex;gap:6px;padding:4px 6px}\n\n/* Menus */\n.ck-crowdy-studio-menu-wrap{position:relative;display:inline-flex;min-width:0}\n.ck-crowdy-studio-menu-button{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.ck-crowdy-studio-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:40;min-width:180px;max-width:320px;max-height:60vh;overflow:auto;display:flex;flex-direction:column;background:var(--ck-panel);border:1px solid var(--ck-line);border-radius:6px;padding:4px;box-shadow:0 8px 24px rgba(2,6,23,.55)}\n.ck-crowdy-studio-runtime-tools .ck-crowdy-studio-menu{left:auto;right:0}\n.ck-crowdy-studio-menu-item{display:block;width:100%;text-align:left;background:transparent;border:0;border-radius:4px;padding:6px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.ck-crowdy-studio-menu-item:hover{background:#0f172a;border:0}\n.ck-crowdy-studio-menu-item[data-active=true]{color:#bae6fd}\n.ck-crowdy-studio-menu-divider{border-top:1px solid var(--ck-line);margin:4px 2px}\n\n/* New-project popover */\n.ck-crowdy-studio-new{display:none;position:absolute;top:100%;left:8px;z-index:35;gap:6px;align-items:center;padding:8px;background:var(--ck-panel);border:1px solid var(--ck-line);border-radius:6px;box-shadow:0 8px 24px rgba(2,6,23,.55)}\n.ck-crowdy-studio-new[data-open=true]{display:flex}\n.ck-crowdy-studio-new input{flex:1;min-width:160px}\n\n/* Workspace: rail + panes + editor */\n.ck-crowdy-studio-workspace{display:flex;flex:1;min-height:0;min-width:0;position:relative}\n.ck-crowdy-studio-rail{display:flex;flex-direction:column;gap:4px;padding:6px 3px;border-right:1px solid var(--ck-line);background:#0b1220}\n.ck-crowdy-studio-rail-button{writing-mode:vertical-rl;padding:8px 4px;background:transparent;border:1px solid transparent;color:var(--ck-muted);border-radius:4px}\n.ck-crowdy-studio-rail-button:hover{color:var(--ck-text)}\n.ck-crowdy-studio-rail-button[aria-pressed=true]{color:#bae6fd;border-color:var(--ck-line);background:#0f172a}\n.ck-crowdy-studio-explorer,.ck-crowdy-studio-settings{flex:none;background:var(--ck-panel);overflow:auto;padding:8px;min-width:0}\n.ck-crowdy-studio-settings{border-left:1px solid var(--ck-line)}\n.ck-crowdy-studio-settings h3{margin:0 0 8px}\n.ck-crowdy-studio-github{margin-top:16px;padding-top:12px;border-top:1px solid var(--ck-line)}\n.ck-crowdy-studio-github-row{display:flex;gap:6px;flex-wrap:wrap;margin:6px 0}\n.ck-crowdy-studio-github-row input{flex:1;min-width:0}\n.ck-crowdy-studio-github-status,.ck-crowdy-studio-github-message{margin:4px 0;font-size:12px;opacity:.85}\n.ck-crowdy-studio-editor-column{display:flex;flex-direction:column;flex:1;min-width:240px;min-height:0}\n.ck-crowdy-studio-editor{flex:1;min-height:80px;position:relative}\n.ck-crowdy-studio-textarea{width:100%;height:100%;min-height:0;resize:none;background:#0b1020;color:var(--ck-text);border:0;padding:12px;font:13px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}\n.ck-crowdy-studio-editor-notice{padding:4px 8px;background:#78350f;color:#ffedd5}\n\n/* Splitters */\n.ck-crowdy-studio-splitter{flex:none;background:transparent;position:relative;z-index:5}\n.ck-crowdy-studio-splitter[data-orientation=vertical]{width:6px;cursor:col-resize}\n.ck-crowdy-studio-splitter[data-orientation=horizontal]{height:6px;cursor:row-resize}\n.ck-crowdy-studio-splitter:hover,.ck-crowdy-studio-splitter[data-dragging=true]{background:var(--ck-accent);opacity:.5}\n\n/* Explorer */\n.ck-crowdy-studio-section{margin-bottom:12px}\n.ck-crowdy-studio-section-header{display:flex;align-items:center;justify-content:space-between;color:var(--ck-muted);font-weight:700;text-transform:uppercase;font-size:11px;margin-bottom:4px}\n.ck-crowdy-studio-file{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:3px;align-items:center}\n.ck-crowdy-studio-file>button:first-child{text-align:left;overflow:hidden;text-overflow:ellipsis;border:0;background:transparent}\n.ck-crowdy-studio-file-action{padding:1px 6px}\n.ck-crowdy-studio-file .ck-crowdy-studio-menu{left:auto;right:0;min-width:130px}\n.ck-crowdy-studio-inline-form{display:flex;flex-wrap:wrap;gap:4px;margin:4px 0;padding:6px;border:1px solid var(--ck-line);border-radius:4px;background:#0f172a}\n.ck-crowdy-studio-inline-form input{flex:1 1 100%;min-width:0}\n.ck-crowdy-studio-file-form-row{display:flex;flex-wrap:wrap;gap:4px;align-items:center;margin:4px 0;padding:6px;border:1px solid #f59e0b66;border-radius:4px}\n\n/* Editor tabs */\n.ck-crowdy-studio-tabs{display:flex;align-items:center;gap:6px;padding:4px;border-bottom:1px solid var(--ck-line);overflow:auto}\n.ck-crowdy-studio-tab{white-space:nowrap}\n.ck-crowdy-studio-tab[data-active=true],.ck-crowdy-studio-panel-tab[data-active=true]{border-color:var(--ck-accent);color:#bae6fd}\n.ck-crowdy-studio-tab span{margin-left:7px;color:var(--ck-muted)}\n\n/* Settings */\n.ck-crowdy-studio-settings label{display:grid;gap:3px;margin-bottom:9px;color:var(--ck-muted)}\n.ck-crowdy-studio-settings input,.ck-crowdy-studio-settings select{width:100%}\n\n/* Bottom panel */\n.ck-crowdy-studio-bottom{flex:none;display:flex;flex-direction:column;min-height:0;border-top:1px solid var(--ck-line)}\n.ck-crowdy-studio-panel-tabs{display:flex;align-items:center;gap:6px;padding:5px 7px;border-bottom:1px solid var(--ck-line)}\n.ck-crowdy-studio-panel-hide{margin-left:auto;padding:1px 7px;color:var(--ck-muted)}\n.ck-crowdy-studio-panel-body{flex:1;min-height:0;display:flex;flex-direction:column}\n.ck-crowdy-studio-panel{display:none;flex:1;overflow:auto;padding:8px}\n.ck-crowdy-studio-panel[data-active=true]{display:block}\n.ck-crowdy-studio-panel pre{white-space:pre-wrap;margin:0;font:12px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}\n.ck-crowdy-studio-problem{display:grid;grid-template-columns:auto auto 1fr;gap:8px;padding:3px;border-bottom:1px solid #243247;width:100%;text-align:left;background:transparent;border-left:0;border-right:0;border-top:0;border-radius:0}\n.ck-crowdy-studio-problem[data-source=rustc]{color:#fecaca}\n.ck-crowdy-studio-problem[data-source=local-advisory]{color:#fde68a}\n.ck-crowdy-studio-invoke{display:grid;grid-template-columns:180px 1fr auto;gap:6px}\n.ck-crowdy-studio-invoke textarea{min-height:70px;background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line)}\n.ck-crowdy-studio-empty{color:var(--ck-muted);padding:8px}\n\n/* Status bar */\n.ck-crowdy-studio-statusbar{display:flex;align-items:center;gap:14px;padding:3px 10px;border-top:1px solid var(--ck-line);background:#0b1220;font-size:12px;min-height:24px}\n.ck-crowdy-studio-status{color:var(--ck-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.ck-crowdy-studio-statusbar-runtime{background:transparent;border:0;padding:1px 4px;border-radius:3px}\n.ck-crowdy-studio-statusbar-runtime:hover{color:var(--ck-text)}\n.ck-crowdy-studio-statusbar-runtime[data-phase=RUNNING]{color:#86efac}\n.ck-crowdy-studio-statusbar-runtime[data-phase=COMPILING],.ck-crowdy-studio-statusbar-runtime[data-phase=TESTING_DRAFT],.ck-crowdy-studio-statusbar-runtime[data-phase=DEPLOYING_LIVE],.ck-crowdy-studio-statusbar-runtime[data-phase=ENABLING]{color:#fde68a}\n.ck-crowdy-studio-statusbar-runtime[data-phase=COMPILE_FAILED],.ck-crowdy-studio-statusbar-runtime[data-phase=ERROR],.ck-crowdy-studio-statusbar-runtime[data-phase=PARTIAL_FAILURE]{color:#fca5a5}\n\n/* Agent dock */\n.ck-crowdy-studio-agent-dock{flex:none;display:flex;flex-direction:column;gap:8px;min-width:0;min-height:0;padding:10px;border-left:1px solid var(--ck-line);background:#0b1220;overflow:auto}\n.ck-crowdy-studio-agent-dock header{display:flex;align-items:center;justify-content:space-between;gap:8px}\n.ck-crowdy-studio-agent-dock h2,.ck-crowdy-studio-agent-dock h3{margin:0;font-size:13px}\n.ck-crowdy-studio-agent-status,.ck-crowdy-studio-agent-budget,.ck-crowdy-studio-agent-lease{color:var(--ck-muted);font-size:12px}\n.ck-crowdy-studio-agent-lease[data-active=true]{color:#fde68a;border:1px solid #f59e0b;border-radius:5px;padding:6px}\n.ck-crowdy-studio-agent-controls-row{display:flex;align-items:center;justify-content:space-between;gap:6px;flex-wrap:wrap}\n.ck-crowdy-studio-agent-modes,.ck-crowdy-studio-agent-controls{display:flex;gap:5px;flex-wrap:wrap}\n.ck-crowdy-studio-agent-modes button[data-active=true]{border-color:var(--ck-accent);color:#bae6fd}\n.ck-crowdy-studio-agent-stop{border-color:#ef4444!important;color:#fecaca!important}\n.ck-crowdy-studio-agent-disclosure{border:1px solid var(--ck-line);border-radius:5px;padding:0}\n.ck-crowdy-studio-agent-disclosure>summary{cursor:pointer;padding:6px 8px;color:var(--ck-muted)}\n.ck-crowdy-studio-agent-disclosure[open]>summary{border-bottom:1px solid var(--ck-line);color:var(--ck-text)}\n.ck-crowdy-studio-agent-disclosure>:not(summary){padding:6px 8px}\n.ck-crowdy-studio-agent-lease-controls{display:flex;gap:6px;flex-wrap:wrap;margin:0;padding:7px;border:1px solid var(--ck-line)}\n.ck-crowdy-studio-agent-lease-controls legend{color:var(--ck-muted)}\n.ck-crowdy-studio-agent-lease-controls label{display:flex;gap:3px;align-items:center}\n.ck-crowdy-studio-agent-messages{display:flex;flex-direction:column;gap:6px;flex:1;min-height:120px;overflow:auto}\n.ck-crowdy-studio-agent-message,.ck-crowdy-studio-agent-stream,.ck-crowdy-studio-agent-approval,.ck-crowdy-studio-agent-diff,.ck-crowdy-studio-agent-checkpoint{padding:7px;border:1px solid var(--ck-line);border-radius:5px;background:var(--ck-panel)}\n.ck-crowdy-studio-agent-message[data-role=USER]{border-color:#155e75}\n.ck-crowdy-studio-agent-message p,.ck-crowdy-studio-agent-approval p,.ck-crowdy-studio-agent-diff p,.ck-crowdy-studio-agent-checkpoint p{margin:3px 0;white-space:pre-wrap;overflow-wrap:anywhere}\n.ck-crowdy-studio-agent-timeline{display:grid;gap:5px;margin:0;padding-left:22px;max-height:190px;overflow:auto}\n.ck-crowdy-studio-agent-timeline li{padding:4px;border-bottom:1px solid #243247}\n.ck-crowdy-studio-agent-timeline li>span{margin-left:6px;color:var(--ck-muted)}\n.ck-crowdy-studio-agent-approvals,.ck-crowdy-studio-agent-checkpoints{display:grid;gap:7px}\n.ck-crowdy-studio-agent-approval{border-color:#f59e0b}\n.ck-crowdy-studio-agent-approval code{display:block;overflow-wrap:anywhere;color:#fde68a}\n.ck-crowdy-studio-agent-approval>div{display:flex;gap:6px}\n.ck-crowdy-studio-agent-composer{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px}\n.ck-crowdy-studio-agent-composer textarea{min-height:62px;resize:vertical;background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line);padding:7px}\n.ck-crowdy-studio :focus-visible{outline:2px solid var(--ck-accent);outline-offset:2px}\n\n/* Narrow widths: side panes become overlays so the editor keeps priority. */\n@container(max-width:900px){.ck-crowdy-studio-settings{position:absolute;right:0;top:0;bottom:0;z-index:20;max-width:85%;border-left:1px solid var(--ck-line);box-shadow:-8px 0 24px rgba(2,6,23,.55)}.ck-crowdy-studio-splitter[data-orientation=vertical]{display:none}}\n@container(max-width:760px){.ck-crowdy-studio-agent-dock{position:absolute;right:0;top:0;bottom:0;z-index:22;max-width:92%;box-shadow:-8px 0 24px rgba(2,6,23,.55)}}\n@container(max-width:620px){.ck-crowdy-studio-explorer{position:absolute;left:34px;top:0;bottom:0;z-index:21;max-width:85%;border-right:1px solid var(--ck-line);box-shadow:8px 0 24px rgba(2,6,23,.55)}}\n";
2
2
  //# sourceMappingURL=styles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,2iZAkIhC,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,83ZAsIhC,CAAC"}
@@ -36,6 +36,10 @@ export const CROWDY_STUDIO_STYLES = `
36
36
  .ck-crowdy-studio-explorer,.ck-crowdy-studio-settings{flex:none;background:var(--ck-panel);overflow:auto;padding:8px;min-width:0}
37
37
  .ck-crowdy-studio-settings{border-left:1px solid var(--ck-line)}
38
38
  .ck-crowdy-studio-settings h3{margin:0 0 8px}
39
+ .ck-crowdy-studio-github{margin-top:16px;padding-top:12px;border-top:1px solid var(--ck-line)}
40
+ .ck-crowdy-studio-github-row{display:flex;gap:6px;flex-wrap:wrap;margin:6px 0}
41
+ .ck-crowdy-studio-github-row input{flex:1;min-width:0}
42
+ .ck-crowdy-studio-github-status,.ck-crowdy-studio-github-message{margin:4px 0;font-size:12px;opacity:.85}
39
43
  .ck-crowdy-studio-editor-column{display:flex;flex-direction:column;flex:1;min-width:240px;min-height:0}
40
44
  .ck-crowdy-studio-editor{flex:1;min-height:80px;position:relative}
41
45
  .ck-crowdy-studio-textarea{width:100%;height:100%;min-height:0;resize:none;background:#0b1020;color:var(--ck-text);border:0;padding:12px;font:13px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * GENERATED — do not edit. The operator tooling's
3
- * `sync-client-origins.mjs --write --tier prod` writes this file, and
3
+ * `sync-client-origins.mjs --write --tier dev` writes this file, and
4
4
  * `check-sdk-default-origin.mjs` refuses it when it names the wrong tier or a
5
5
  * host that declaration does not carry. Regenerate; never hand-edit.
6
6
  *
@@ -10,14 +10,14 @@
10
10
  * than no default at all. Every fallback this SDK ever removed named a host that
11
11
  * was already dead. A generated file plus a gate is what makes this one different.
12
12
  *
13
- * Source: the operator's per-tier public CK API origin declaration, tier 'prod'
13
+ * Source: the operator's per-tier public CK API origin declaration, tier 'dev'
14
14
  */
15
15
  /** The tier this build of the SDK is published for. */
16
- export declare const CROWDY_DEFAULT_TIER = "prod";
16
+ export declare const CROWDY_DEFAULT_TIER = "dev";
17
17
  /** The public CK API origin for that tier. */
18
- export declare const CROWDY_DEFAULT_HTTP_ORIGIN = "https://ck.prod.crowdedkingdoms.com";
18
+ export declare const CROWDY_DEFAULT_HTTP_ORIGIN = "https://ck.dev.crowdedkingdoms.com";
19
19
  /** The same host over WebSocket. A scheme is composed; a hostname is looked up. */
20
- export declare const CROWDY_DEFAULT_WS_ORIGIN = "wss://ck.prod.crowdedkingdoms.com";
20
+ export declare const CROWDY_DEFAULT_WS_ORIGIN = "wss://ck.dev.crowdedkingdoms.com";
21
21
  /** The bare hostname, for callers that need to compare rather than dial. */
22
- export declare const CROWDY_DEFAULT_HOST = "ck.prod.crowdedkingdoms.com";
22
+ export declare const CROWDY_DEFAULT_HOST = "ck.dev.crowdedkingdoms.com";
23
23
  //# sourceMappingURL=default-origin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"default-origin.d.ts","sourceRoot":"","sources":["../src/default-origin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAE1C,8CAA8C;AAC9C,eAAO,MAAM,0BAA0B,wCAAwC,CAAC;AAEhF,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,sCAAsC,CAAC;AAE5E,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,gCAAgC,CAAC"}
1
+ {"version":3,"file":"default-origin.d.ts","sourceRoot":"","sources":["../src/default-origin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC,8CAA8C;AAC9C,eAAO,MAAM,0BAA0B,uCAAuC,CAAC;AAE/E,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,qCAAqC,CAAC;AAE3E,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,+BAA+B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * GENERATED — do not edit. The operator tooling's
3
- * `sync-client-origins.mjs --write --tier prod` writes this file, and
3
+ * `sync-client-origins.mjs --write --tier dev` writes this file, and
4
4
  * `check-sdk-default-origin.mjs` refuses it when it names the wrong tier or a
5
5
  * host that declaration does not carry. Regenerate; never hand-edit.
6
6
  *
@@ -10,13 +10,13 @@
10
10
  * than no default at all. Every fallback this SDK ever removed named a host that
11
11
  * was already dead. A generated file plus a gate is what makes this one different.
12
12
  *
13
- * Source: the operator's per-tier public CK API origin declaration, tier 'prod'
13
+ * Source: the operator's per-tier public CK API origin declaration, tier 'dev'
14
14
  */
15
15
  /** The tier this build of the SDK is published for. */
16
- export const CROWDY_DEFAULT_TIER = 'prod';
16
+ export const CROWDY_DEFAULT_TIER = 'dev';
17
17
  /** The public CK API origin for that tier. */
18
- export const CROWDY_DEFAULT_HTTP_ORIGIN = 'https://ck.prod.crowdedkingdoms.com';
18
+ export const CROWDY_DEFAULT_HTTP_ORIGIN = 'https://ck.dev.crowdedkingdoms.com';
19
19
  /** The same host over WebSocket. A scheme is composed; a hostname is looked up. */
20
- export const CROWDY_DEFAULT_WS_ORIGIN = 'wss://ck.prod.crowdedkingdoms.com';
20
+ export const CROWDY_DEFAULT_WS_ORIGIN = 'wss://ck.dev.crowdedkingdoms.com';
21
21
  /** The bare hostname, for callers that need to compare rather than dial. */
22
- export const CROWDY_DEFAULT_HOST = 'ck.prod.crowdedkingdoms.com';
22
+ export const CROWDY_DEFAULT_HOST = 'ck.dev.crowdedkingdoms.com';
package/dist/index.d.ts CHANGED
@@ -47,7 +47,7 @@
47
47
  * or internal tooling, never an untrusted browser.
48
48
  */
49
49
  /** The published package version. Mirrors `package.json`. */
50
- export declare const VERSION = "15.10.0";
50
+ export declare const VERSION = "15.11.0-dev.1";
51
51
  export { LbCookieStore } from './lb-cookie-store.js';
52
52
  export { CrowdyClient, createCrowdyClient, type CrowdyClientConfig, } from './crowdy-client.js';
53
53
  export { CROWDY_DEFAULT_TIER, CROWDY_DEFAULT_HOST, CROWDY_DEFAULT_HTTP_ORIGIN, CROWDY_DEFAULT_WS_ORIGIN, } from './default-origin.js';