@crowdedkingdoms/crowdy-dsh 0.2.1 → 0.3.0-test.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.
- package/README.md +5 -4
- package/dist/dsh-web/BUILD.json +5 -5
- package/dist/dsh-web/preview/vfs-image.tar.gz +0 -0
- package/lib/bridge/index.js +3 -0
- package/lib/bridge/index.js.map +1 -1
- package/lib/bridge/protocol.js +9 -1
- package/lib/bridge/protocol.js.map +1 -1
- package/lib/crowdy/client.js +10 -0
- package/lib/crowdy/client.js.map +1 -1
- package/lib/crowdy/config.js +1 -3
- package/lib/crowdy/config.js.map +1 -1
- package/lib/crowdy/project-store.js +97 -181
- package/lib/crowdy/project-store.js.map +1 -1
- package/lib/fs/crowdy-file-system.js +14 -34
- package/lib/fs/crowdy-file-system.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/scripts/probe.js +4 -7
- package/lib/scripts/probe.js.map +1 -1
- package/lib/types/bridge/index.d.ts.map +1 -1
- package/lib/types/bridge/protocol.d.ts +21 -2
- package/lib/types/bridge/protocol.d.ts.map +1 -1
- package/lib/types/crowdy/client.d.ts +17 -1
- package/lib/types/crowdy/client.d.ts.map +1 -1
- package/lib/types/crowdy/config.d.ts +0 -2
- package/lib/types/crowdy/config.d.ts.map +1 -1
- package/lib/types/crowdy/project-store.d.ts +39 -47
- package/lib/types/crowdy/project-store.d.ts.map +1 -1
- package/lib/types/fs/crowdy-file-system.d.ts +6 -6
- package/lib/types/fs/crowdy-file-system.d.ts.map +1 -1
- package/lib/types/index.d.ts +2 -2
- package/lib/types/index.d.ts.map +1 -1
- package/lib/vendor/crowdyjs-sdk.js +334 -114
- package/lib/vendor/crowdyjs-sdk.version.json +1 -1
- package/package.json +7 -7
- package/profile/crowdy-web.patch.yml +0 -1
- package/lib/crowdy/github-layout.js +0 -97
- package/lib/crowdy/github-layout.js.map +0 -1
- package/lib/types/crowdy/github-layout.d.ts +0 -36
- package/lib/types/crowdy/github-layout.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -31,7 +31,7 @@ game page (the-construct) iframe /dsh/index.html Web
|
|
|
31
31
|
|
|
32
32
|
| Seam | Stock | Here |
|
|
33
33
|
|---|---|---|
|
|
34
|
-
| `ctx.fs` | `dsh-fs-sandbox` over the local disk | [`./fs`](src/fs/crowdy-file-system.ts): the project.
|
|
34
|
+
| `ctx.fs` | `dsh-fs-sandbox` over the local disk | [`./fs`](src/fs/crowdy-file-system.ts): the project. Reads are always the project's files (`crowdyStudioProject`); for a project bound to GitHub those are the server's mirror of the repository at `githubSha`. Writes go by `source`: a STUDIO project through the files-only save under `expectedRevision`, a GITHUB project as one commit per changed file (`crowdyStudioGitHubPutFile` / `DeleteFile` carrying `expectedCommitSha`). Nothing is mirrored from here; the server advances the mirror with each commit, so Monaco and the agent look at one tree. Layout comes from `crowdyStudioGitHubLayout`; this package does not parse `crowdy.json`. GitHub is never required. `captures/` and `context/` are in-memory scratch dirs the page fills. |
|
|
35
35
|
| `ctx.attachments` | `dsh-attachment-local` (sharp) | [`./attachments`](src/attachments/crowdy-attachment-store.ts): in-memory, header-sniffed dimensions; the browser worker has no native image codec. |
|
|
36
36
|
| agent preset | `standard` | [`presets/crowdy`](presets/crowdy/agent.cordis.yml): file tools, in-memory `glob`/`grep`, `sdk_lookup`, and the Studio tools below. No shell, no web, no subagents. |
|
|
37
37
|
| page link | — | [`./bridge`](src/bridge/index.ts): `ctx.crowdyBridge`, a `BroadcastChannel` to the Studio page ([protocol](src/bridge/protocol.ts)). |
|
|
@@ -47,7 +47,7 @@ The iframe posts `{type:'crowdy-dsh:ready'}`; the page answers with:
|
|
|
47
47
|
iframe.contentWindow.postMessage({
|
|
48
48
|
type: 'crowdy-dsh:boot',
|
|
49
49
|
files: {
|
|
50
|
-
'crowdy.json': JSON.stringify({ graphqlUrl, appId, projectId, bridgeChannel, bridgeNonce,
|
|
50
|
+
'crowdy.json': JSON.stringify({ graphqlUrl, appId, projectId, bridgeChannel, bridgeNonce, root: '/dsh/workspace', persistScope }),
|
|
51
51
|
'settings.yaml': `llm-deepseek:\n apiKeyEnv: CROWDY_APP_TOKEN\n baseURL: ${modelBaseUrl}\n thinking: disabled\n models: [...]\nagent-default-model:\n provider: deepseek-official\n model: ${defaultModel}\n`,
|
|
52
52
|
},
|
|
53
53
|
nonce: bridgeNonce, // one-time secret; every bridge frame carries it
|
|
@@ -170,6 +170,7 @@ dsh --profile web --patch ./profile/crowdy-node.patch.yml
|
|
|
170
170
|
- Experimental upstream packages (`webworker-runtime`, `webworker-packer`) are
|
|
171
171
|
private and may change; the tag is pinned and the build fails loud.
|
|
172
172
|
- Attachments are in memory: a reload keeps the session text but not the pixels.
|
|
173
|
-
-
|
|
174
|
-
|
|
173
|
+
- A multi-file write on a GitHub-bound project is one commit per file; a
|
|
174
|
+
stale race part-way through leaves the earlier commits on the branch and the
|
|
175
|
+
filesystem reports `FS_STALE_VERSION` for the rest. Re-read and retry.
|
|
175
176
|
- The developer cockpit needs a real, empty mount directory (`CROWDY_MOUNT`).
|
package/dist/dsh-web/BUILD.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "@crowdedkingdoms/crowdy-dsh",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"builtAt": "2026-09-
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"builtAt": "2026-09-13T17:06:07.316Z",
|
|
5
5
|
"source": {
|
|
6
6
|
"repository": "CrowdedKingdoms/crowdy-dsh",
|
|
7
|
-
"commit": "
|
|
7
|
+
"commit": "aaf88d71f3613b3c13badaa0ff3d08c7b9fc835e",
|
|
8
8
|
"dirty": false
|
|
9
9
|
},
|
|
10
10
|
"upstream": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"crowdyjs": {
|
|
17
17
|
"name": "@crowdedkingdoms/crowdyjs",
|
|
18
|
-
"version": "
|
|
18
|
+
"version": "17.0.1-test.1",
|
|
19
19
|
"source": "node_modules"
|
|
20
20
|
},
|
|
21
21
|
"files": {
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
"manifest.webmanifest": "sha256:9b54d57eea00f2fdd1affe6e7999a4209a515755f12ac1a3299da2d55e178d4c",
|
|
113
113
|
"preview/bootstrap-CYECZNXt.js": "sha256:9f303a0485c0badfdd19fad0c357ef050c5b9a343744ab5bf0c70015e7d95092",
|
|
114
114
|
"preview/crowdy-boot-Cklh1qNl.js": "sha256:b21e8eb126e1cd8a52159d2d577e610df6c8af36a436f9ed5028cfabd11a85ff",
|
|
115
|
-
"preview/vfs-image.tar.gz": "sha256:
|
|
115
|
+
"preview/vfs-image.tar.gz": "sha256:7b64cce1183766e297ba9c881475137ffb70954b82aeddf6a4aa740d9b6fa3ec",
|
|
116
116
|
"preview/worker-C8-_ANaz.js": "sha256:81099e5732dfe0c32bacd5897316b7956c5a0a22da01b4a0c6e21d0a3b9d9aa1"
|
|
117
117
|
}
|
|
118
118
|
}
|
|
Binary file
|
package/lib/bridge/index.js
CHANGED
|
@@ -125,6 +125,9 @@ export class CrowdyBridge extends Service {
|
|
|
125
125
|
}), client.on('page.project', (payload) => {
|
|
126
126
|
if (payload.projectId)
|
|
127
127
|
fs.setProject(payload.projectId);
|
|
128
|
+
// Same project, moved commit (bind, refresh, or a Studio save on a
|
|
129
|
+
// bound project): the snapshot is behind the mirror.
|
|
130
|
+
fs.invalidate();
|
|
128
131
|
}), client.on('page.saved', () => {
|
|
129
132
|
fs.invalidate();
|
|
130
133
|
}), client.on('page.context', (payload) => {
|
package/lib/bridge/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"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"}
|
package/lib/bridge/protocol.js
CHANGED
|
@@ -10,7 +10,15 @@
|
|
|
10
10
|
*
|
|
11
11
|
* @module @crowdedkingdoms/crowdy-dsh/bridge-protocol
|
|
12
12
|
*/
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* v3 (crowdy-dsh 0.3 / CrowdyJS 17): a project carries `source` and
|
|
15
|
+
* `githubSha`. A GITHUB project's files are the server's mirror of the bound
|
|
16
|
+
* repository at that commit; the worker writes them as commits carrying
|
|
17
|
+
* `expectedCommitSha = githubSha` and mirrors nothing back to Studio itself.
|
|
18
|
+
* `page.project` / `page.saved` re-announce the commit whenever it moves so the
|
|
19
|
+
* worker's next write carries the current one.
|
|
20
|
+
*/
|
|
21
|
+
export const CROWDY_BRIDGE_PROTOCOL_VERSION = 3;
|
|
14
22
|
export const BRIDGE_ERROR_CODES = {
|
|
15
23
|
unavailable: 'BRIDGE_UNAVAILABLE',
|
|
16
24
|
timeout: 'BRIDGE_TIMEOUT',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/bridge/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/bridge/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAU,CAAA;AAsKxD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,WAAW,EAAE,oBAAoB;IACjC,OAAO,EAAE,gBAAgB;IACzB,OAAO,EAAE,gBAAgB;IACzB,SAAS,EAAE,YAAY;CACf,CAAA;AAEV,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,KAAc;IAC1D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACrD,MAAM,KAAK,GAAG,KAA6B,CAAA;IAC3C,IAAI,KAAK,CAAC,CAAC,KAAK,8BAA8B,IAAI,OAAO,KAAK,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC1H,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAClE,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,KAAK,KAAK,CAAA;AACjD,CAAC"}
|
package/lib/crowdy/client.js
CHANGED
|
@@ -38,6 +38,7 @@ export class CrowdyApiError extends Error {
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
function toProject(dto) {
|
|
41
|
+
const bound = dto.source === 'GITHUB' && dto.githubOwner && dto.githubRepo && dto.githubBranch;
|
|
41
42
|
return {
|
|
42
43
|
projectId: dto.projectId,
|
|
43
44
|
appId: String(dto.appId),
|
|
@@ -46,6 +47,10 @@ function toProject(dto) {
|
|
|
46
47
|
revision: String(dto.revision),
|
|
47
48
|
archived: dto.archived,
|
|
48
49
|
updatedAt: dto.updatedAt,
|
|
50
|
+
source: bound ? 'GITHUB' : 'STUDIO',
|
|
51
|
+
github: bound
|
|
52
|
+
? { owner: dto.githubOwner, repo: dto.githubRepo, branch: dto.githubBranch, sha: dto.githubSha ?? null }
|
|
53
|
+
: null,
|
|
49
54
|
files: dto.files.map((file) => ({
|
|
50
55
|
target: file.target,
|
|
51
56
|
path: file.path,
|
|
@@ -226,6 +231,11 @@ const PROJECT_FIELDS = `
|
|
|
226
231
|
revision
|
|
227
232
|
archived
|
|
228
233
|
updatedAt
|
|
234
|
+
source
|
|
235
|
+
githubOwner
|
|
236
|
+
githubRepo
|
|
237
|
+
githubBranch
|
|
238
|
+
githubSha
|
|
229
239
|
files {
|
|
230
240
|
target
|
|
231
241
|
path
|
package/lib/crowdy/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/crowdy/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,iCAAiC,EACjC,2BAA2B,GAG5B,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/crowdy/client.ts"],"names":[],"mappings":"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"}
|
package/lib/crowdy/config.js
CHANGED
|
@@ -29,7 +29,6 @@ const ENV_KEYS = {
|
|
|
29
29
|
root: 'CROWDY_MOUNT',
|
|
30
30
|
bridgeChannel: 'CROWDY_BRIDGE_CHANNEL',
|
|
31
31
|
bridgeNonce: 'CROWDY_BRIDGE_NONCE',
|
|
32
|
-
githubFirst: 'CROWDY_GITHUB_FIRST',
|
|
33
32
|
studioOrigin: 'CROWDY_STUDIO_ORIGIN',
|
|
34
33
|
persistScope: 'CROWDY_PERSIST_SCOPE',
|
|
35
34
|
};
|
|
@@ -56,7 +55,7 @@ export function loadCrowdyConfig(overrides = {}) {
|
|
|
56
55
|
const pick = (key) => {
|
|
57
56
|
const fromEnv = env[ENV_KEYS[key]];
|
|
58
57
|
if (fromEnv !== undefined && fromEnv !== '') {
|
|
59
|
-
return
|
|
58
|
+
return fromEnv;
|
|
60
59
|
}
|
|
61
60
|
if (overrides[key] !== undefined)
|
|
62
61
|
return overrides[key];
|
|
@@ -73,7 +72,6 @@ export function loadCrowdyConfig(overrides = {}) {
|
|
|
73
72
|
root: pick('root'),
|
|
74
73
|
bridgeChannel: pick('bridgeChannel'),
|
|
75
74
|
bridgeNonce: pick('bridgeNonce'),
|
|
76
|
-
githubFirst: pick('githubFirst') ?? true,
|
|
77
75
|
studioOrigin: pick('studioOrigin'),
|
|
78
76
|
persistScope: pick('persistScope'),
|
|
79
77
|
};
|
package/lib/crowdy/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/crowdy/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,sEAAsE;AACtE,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/crowdy/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,223 +1,139 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Where a project's files live
|
|
3
|
-
* bound one (GitHub is then the source of truth and Studio holds the deployable
|
|
4
|
-
* mirror), otherwise the Crowdy Studio project itself.
|
|
2
|
+
* Where a project's files live, and how a batch of edits reaches them.
|
|
5
3
|
*
|
|
6
|
-
* Both
|
|
7
|
-
* the filesystem backend never learns which one it is talking to
|
|
4
|
+
* Both sources present the same versioned bag of `(target, path, content)` so
|
|
5
|
+
* the filesystem backend never learns which one it is talking to:
|
|
6
|
+
*
|
|
7
|
+
* - a STUDIO project is read and written through the Crowdy Studio project
|
|
8
|
+
* API under its revision counter;
|
|
9
|
+
* - a GITHUB project is READ the same way — its `files` are the server's
|
|
10
|
+
* mirror of the bound repository at `github.sha` — and WRITTEN as commits:
|
|
11
|
+
* one `crowdyStudioGitHubPutFile` / `DeleteFile` per changed file, each
|
|
12
|
+
* carrying `expectedCommitSha` (the commit the previous one produced). The
|
|
13
|
+
* server advances the mirror with every commit, so nothing is mirrored from
|
|
14
|
+
* here; the harness and Monaco are always looking at one tree.
|
|
15
|
+
*
|
|
16
|
+
* A lost race is {@link CrowdyApiError} with `isRevisionConflict` either way
|
|
17
|
+
* (`CROWDY_STUDIO_REVISION_CONFLICT` or `GITHUB_STALE_SHA`); the filesystem
|
|
18
|
+
* reports `FS_STALE_VERSION` and the agent re-reads.
|
|
19
|
+
*
|
|
20
|
+
* Layout comes from the API (`crowdyStudioGitHubLayout`) at the commit being
|
|
21
|
+
* written to. This module does not parse `crowdy.json`; the API is the only
|
|
22
|
+
* grammar.
|
|
8
23
|
*
|
|
9
24
|
* @module @crowdedkingdoms/crowdy-dsh/crowdy/project-store
|
|
10
25
|
*/
|
|
11
26
|
import { CrowdyApiError } from './client.js';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
27
|
+
/**
|
|
28
|
+
* The one store. Which path a commit takes is decided by the snapshot it is
|
|
29
|
+
* applied to, which is decided by the project's `source` at load time.
|
|
30
|
+
*/
|
|
31
|
+
export class CrowdyProjectStore {
|
|
15
32
|
client;
|
|
16
33
|
projectId;
|
|
17
|
-
|
|
34
|
+
/** Layout per commit; commits are immutable so this never goes stale. */
|
|
35
|
+
layouts = new Map();
|
|
18
36
|
constructor(client, projectId) {
|
|
19
37
|
this.client = client;
|
|
20
38
|
this.projectId = projectId;
|
|
21
39
|
}
|
|
22
40
|
async load() {
|
|
23
41
|
const project = await this.client.loadProject(this.projectId);
|
|
24
|
-
return
|
|
25
|
-
revision: project.revision,
|
|
26
|
-
files: project.files,
|
|
27
|
-
source: 'studio',
|
|
28
|
-
label: `Crowdy Studio project "${project.name}"`,
|
|
29
|
-
};
|
|
42
|
+
return snapshotOf(project);
|
|
30
43
|
}
|
|
31
44
|
async commit(snapshot, batch) {
|
|
45
|
+
if (snapshot.source === 'github')
|
|
46
|
+
return this.commitToGitHub(snapshot, batch);
|
|
32
47
|
const project = await this.client.saveFiles({
|
|
33
48
|
projectId: this.projectId,
|
|
34
49
|
expectedRevision: snapshot.revision,
|
|
35
50
|
...batch,
|
|
36
51
|
});
|
|
37
|
-
return
|
|
38
|
-
revision: project.revision,
|
|
39
|
-
files: project.files,
|
|
40
|
-
source: 'studio',
|
|
41
|
-
label: snapshot.label,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* The bound GitHub repository, read through `crowdyStudioGitHubTree/File` and
|
|
47
|
-
* written through `crowdyStudioGitHubPutFile` (Contents API, SHA-guarded).
|
|
48
|
-
*
|
|
49
|
-
* After every successful GitHub write the same batch is mirrored onto the
|
|
50
|
-
* Studio project so a draft test or deploy compiles what the agent wrote. The
|
|
51
|
-
* mirror is best-effort: GitHub already holds the truth, and a Studio revision
|
|
52
|
-
* race is reported, not treated as a failed write.
|
|
53
|
-
*/
|
|
54
|
-
export class GitHubProjectStore {
|
|
55
|
-
client;
|
|
56
|
-
projectId;
|
|
57
|
-
repoLabel;
|
|
58
|
-
warn;
|
|
59
|
-
kind = 'github';
|
|
60
|
-
shas = new Map();
|
|
61
|
-
layout;
|
|
62
|
-
/** Last mirror failure, surfaced once by the filesystem in its next result. */
|
|
63
|
-
mirrorWarning;
|
|
64
|
-
constructor(client, projectId, repoLabel, warn = () => undefined) {
|
|
65
|
-
this.client = client;
|
|
66
|
-
this.projectId = projectId;
|
|
67
|
-
this.repoLabel = repoLabel;
|
|
68
|
-
this.warn = warn;
|
|
69
|
-
}
|
|
70
|
-
get scope() {
|
|
71
|
-
return { appId: this.client.appId, projectId: this.projectId };
|
|
72
|
-
}
|
|
73
|
-
async load() {
|
|
74
|
-
await this.client.authenticate();
|
|
75
|
-
const entries = await this.client.github.tree(this.scope);
|
|
76
|
-
const crowdyJson = entries.find((entry) => entry.type === 'blob' && entry.path === 'crowdy.json');
|
|
77
|
-
let layout = null;
|
|
78
|
-
if (crowdyJson) {
|
|
79
|
-
const file = await this.client.github.getFile({ ...this.scope, path: 'crowdy.json' });
|
|
80
|
-
layout = parseCrowdyJson(file.content);
|
|
81
|
-
}
|
|
82
|
-
this.layout = layout ?? layoutFromTree(entries);
|
|
83
|
-
const mapped = [];
|
|
84
|
-
for (const entry of entries) {
|
|
85
|
-
if (entry.type !== 'blob')
|
|
86
|
-
continue;
|
|
87
|
-
const studio = repoPathToStudioFile(this.layout, entry.path);
|
|
88
|
-
if (!studio)
|
|
89
|
-
continue;
|
|
90
|
-
if (!isSourcePath(studio.path))
|
|
91
|
-
continue;
|
|
92
|
-
mapped.push({ repoPath: entry.path, ...studio, sha: entry.sha });
|
|
93
|
-
}
|
|
94
|
-
const files = [];
|
|
95
|
-
const shas = new Map();
|
|
96
|
-
// Small projects: fetch sequentially in modest parallel batches so a
|
|
97
|
-
// fleet-wide op limit is not tripped by one listing.
|
|
98
|
-
const batchSize = 4;
|
|
99
|
-
for (let index = 0; index < mapped.length; index += batchSize) {
|
|
100
|
-
const slice = mapped.slice(index, index + batchSize);
|
|
101
|
-
const loaded = await Promise.all(slice.map(async (entry) => {
|
|
102
|
-
const file = await this.client.github.getFile({ ...this.scope, path: entry.repoPath });
|
|
103
|
-
return { entry, file };
|
|
104
|
-
}));
|
|
105
|
-
for (const { entry, file } of loaded) {
|
|
106
|
-
shas.set(key(entry.target, entry.path), { sha: file.sha, repoPath: entry.repoPath });
|
|
107
|
-
files.push({
|
|
108
|
-
target: entry.target,
|
|
109
|
-
path: entry.path,
|
|
110
|
-
content: file.content,
|
|
111
|
-
revision: file.sha,
|
|
112
|
-
updatedAt: '',
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
this.shas = shas;
|
|
117
|
-
files.sort((a, b) => (a.target === b.target ? a.path.localeCompare(b.path) : a.target.localeCompare(b.target)));
|
|
118
|
-
return {
|
|
119
|
-
revision: revisionOf(shas),
|
|
120
|
-
files,
|
|
121
|
-
source: 'github',
|
|
122
|
-
label: `GitHub ${this.repoLabel}`,
|
|
123
|
-
};
|
|
52
|
+
return snapshotOf(project);
|
|
124
53
|
}
|
|
125
|
-
async
|
|
126
|
-
|
|
127
|
-
|
|
54
|
+
async commitToGitHub(snapshot, batch) {
|
|
55
|
+
const scope = { appId: this.client.appId, projectId: this.projectId };
|
|
56
|
+
let sha = snapshot.revision;
|
|
57
|
+
if (!/^[0-9a-f]{40}$/.test(sha)) {
|
|
58
|
+
throw new CrowdyApiError('The bound project has no mirror commit yet; refresh it from GitHub in Crowdy Studio.', 'GITHUB_NOT_BOUND');
|
|
128
59
|
}
|
|
129
|
-
|
|
130
|
-
throw new CrowdyApiError('Deleting files in a GitHub-bound project is not supported here; delete it on GitHub or in Crowdy Studio.', 'GITHUB_DELETE_UNSUPPORTED');
|
|
131
|
-
}
|
|
132
|
-
const layout = this.layout ?? layoutFromTree([]);
|
|
60
|
+
const layout = await this.layoutAt(scope, sha);
|
|
133
61
|
for (const upsert of batch.upserts ?? []) {
|
|
134
|
-
const repoPath =
|
|
135
|
-
if (!repoPath) {
|
|
136
|
-
throw new CrowdyApiError(`The bound repository has no ${upsert.target.toLowerCase()} root in crowdy.json, so ${upsert.path} has no place to go.`, 'GITHUB_PATH_INVALID');
|
|
137
|
-
}
|
|
138
|
-
const existing = this.shas.get(key(upsert.target, upsert.path));
|
|
62
|
+
const repoPath = repoPathFor(layout, upsert.target, upsert.path);
|
|
139
63
|
const written = await this.client.github.putFile({
|
|
140
|
-
...
|
|
64
|
+
...scope,
|
|
141
65
|
path: repoPath,
|
|
142
66
|
content: upsert.content,
|
|
143
|
-
message: `Crowdy Studio agent:
|
|
144
|
-
|
|
67
|
+
message: `Crowdy Studio agent: update ${repoPath}`,
|
|
68
|
+
expectedCommitSha: sha,
|
|
145
69
|
});
|
|
146
|
-
|
|
70
|
+
sha = written.commitSha ?? sha;
|
|
147
71
|
}
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
content: upsert.content,
|
|
156
|
-
revision: state?.sha ?? '',
|
|
157
|
-
updatedAt: new Date().toISOString(),
|
|
158
|
-
};
|
|
159
|
-
if (index === -1)
|
|
160
|
-
files.push(next);
|
|
161
|
-
else
|
|
162
|
-
files[index] = next;
|
|
163
|
-
}
|
|
164
|
-
await this.mirrorToStudio(batch);
|
|
165
|
-
return { revision: revisionOf(this.shas), files, source: 'github', label: snapshot.label };
|
|
166
|
-
}
|
|
167
|
-
/** Copy the batch onto the Studio project so builds see the same bytes. */
|
|
168
|
-
async mirrorToStudio(batch) {
|
|
169
|
-
try {
|
|
170
|
-
const project = await this.client.loadProject(this.projectId);
|
|
171
|
-
await this.client.saveFiles({
|
|
172
|
-
projectId: this.projectId,
|
|
173
|
-
expectedRevision: project.revision,
|
|
174
|
-
...batch,
|
|
72
|
+
for (const del of batch.deletes ?? []) {
|
|
73
|
+
const repoPath = repoPathFor(layout, del.target, del.path);
|
|
74
|
+
const status = await this.client.github.deleteFile({
|
|
75
|
+
...scope,
|
|
76
|
+
path: repoPath,
|
|
77
|
+
message: `Crowdy Studio agent: delete ${repoPath}`,
|
|
78
|
+
expectedCommitSha: sha,
|
|
175
79
|
});
|
|
176
|
-
|
|
80
|
+
sha = status.githubSha ?? sha;
|
|
177
81
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
82
|
+
// The server advanced the mirror with each commit; read it back rather
|
|
83
|
+
// than guessing at the shape it produced.
|
|
84
|
+
return snapshotOf(await this.client.loadProject(this.projectId));
|
|
85
|
+
}
|
|
86
|
+
async layoutAt(scope, commitSha) {
|
|
87
|
+
const cached = this.layouts.get(commitSha);
|
|
88
|
+
if (cached)
|
|
89
|
+
return cached;
|
|
90
|
+
const layout = await this.client.github.layout({ ...scope, commitSha });
|
|
91
|
+
if (this.layouts.size > 32) {
|
|
92
|
+
const [oldest] = this.layouts.keys();
|
|
93
|
+
if (oldest !== undefined)
|
|
94
|
+
this.layouts.delete(oldest);
|
|
182
95
|
}
|
|
96
|
+
this.layouts.set(commitSha, layout);
|
|
97
|
+
return layout;
|
|
183
98
|
}
|
|
184
99
|
}
|
|
185
|
-
|
|
186
|
-
|
|
100
|
+
/** Repository path of a project file under the API-resolved layout. */
|
|
101
|
+
export function repoPathFor(layout, target, path) {
|
|
102
|
+
const root = target === 'SERVER' ? layout.server : layout.client;
|
|
103
|
+
if (root == null) {
|
|
104
|
+
throw new CrowdyApiError(`The bound repository's crowdy.json has no ${target.toLowerCase()} directory, so ${path} has nowhere to go.`, 'GITHUB_PATH_INVALID', 'Add a "client" directory to crowdy.json on the bound branch.');
|
|
105
|
+
}
|
|
106
|
+
const base = root.replace(/^\/+|\/+$/g, '');
|
|
107
|
+
const rel = path.replace(/^\/+/, '');
|
|
108
|
+
if (!base || base === '.')
|
|
109
|
+
return rel;
|
|
110
|
+
return `${base}/${rel}`;
|
|
187
111
|
}
|
|
188
|
-
function
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
112
|
+
export function snapshotOf(project) {
|
|
113
|
+
if (project.source === 'GITHUB' && project.github) {
|
|
114
|
+
const label = `${project.github.owner}/${project.github.repo}@${project.github.branch}`;
|
|
115
|
+
return {
|
|
116
|
+
revision: project.github.sha ?? '',
|
|
117
|
+
files: project.files,
|
|
118
|
+
source: 'github',
|
|
119
|
+
label: `GitHub ${label}`,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
revision: project.revision,
|
|
124
|
+
files: project.files,
|
|
125
|
+
source: 'studio',
|
|
126
|
+
label: `Crowdy Studio project "${project.name}"`,
|
|
127
|
+
};
|
|
193
128
|
}
|
|
194
129
|
/** Crowdy Studio stores only `Cargo.toml` and `.rs` files under `src/`. */
|
|
195
130
|
export function isSourcePath(path) {
|
|
196
131
|
return path === 'Cargo.toml' || (path.startsWith('src/') && path.endsWith('.rs'));
|
|
197
132
|
}
|
|
198
|
-
/**
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
if (options.githubFirst) {
|
|
204
|
-
try {
|
|
205
|
-
const status = await client.github.status({ appId: client.appId, projectId });
|
|
206
|
-
if (status.configured && status.connected && status.owner && status.repo) {
|
|
207
|
-
const label = `${status.owner}/${status.repo}@${status.branch ?? 'default'}`;
|
|
208
|
-
return {
|
|
209
|
-
store: new GitHubProjectStore(client, projectId, label, options.warn),
|
|
210
|
-
reason: `The project is bound to GitHub (${label}); the repository is the source of truth and Studio mirrors it.`,
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
catch (error) {
|
|
215
|
-
options.warn?.(`GitHub status unavailable, falling back to Studio files: ${error instanceof Error ? error.message : String(error)}`);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
return {
|
|
219
|
-
store: new StudioProjectStore(client, projectId),
|
|
220
|
-
reason: 'The project is not bound to a GitHub repository; Crowdy Studio project files are the source of truth.',
|
|
221
|
-
};
|
|
133
|
+
/** Why a snapshot's files live where they do, for the system prompt and tool messages. */
|
|
134
|
+
export function describeSource(snapshot) {
|
|
135
|
+
return snapshot.source === 'github'
|
|
136
|
+
? `The project is bound to ${snapshot.label.replace(/^GitHub /, '')}; the repository is the working tree and every write is a commit on it. Monaco in Crowdy Studio sees the same commit.`
|
|
137
|
+
: 'The project is not bound to a GitHub repository; Crowdy Studio project files are the working tree.';
|
|
222
138
|
}
|
|
223
139
|
//# sourceMappingURL=project-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-store.js","sourceRoot":"","sources":["../../src/crowdy/project-store.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"project-store.js","sourceRoot":"","sources":["../../src/crowdy/project-store.ts"],"names":[],"mappings":"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"}
|