@crowdedkingdoms/crowdy-dsh 0.2.0-dev.1 → 0.2.0-dev.2

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 (105) hide show
  1. package/THIRD_PARTY_NOTICES.md +226 -0
  2. package/dist/dsh-web/BUILD.json +3 -3
  3. package/dist/dsh-web/preview/vfs-image.tar.gz +0 -0
  4. package/lib/attachments/crowdy-attachment-store.js +200 -0
  5. package/lib/attachments/crowdy-attachment-store.js.map +1 -0
  6. package/lib/bridge/client.js +161 -0
  7. package/lib/bridge/client.js.map +1 -0
  8. package/lib/bridge/index.js +155 -0
  9. package/lib/bridge/index.js.map +1 -0
  10. package/lib/bridge/protocol.js +30 -0
  11. package/lib/bridge/protocol.js.map +1 -0
  12. package/lib/crowdy/client.js +247 -0
  13. package/lib/crowdy/client.js.map +1 -0
  14. package/lib/crowdy/config.js +95 -0
  15. package/lib/crowdy/config.js.map +1 -0
  16. package/lib/crowdy/github-layout.js +97 -0
  17. package/lib/crowdy/github-layout.js.map +1 -0
  18. package/lib/crowdy/paths.js +145 -0
  19. package/lib/crowdy/paths.js.map +1 -0
  20. package/lib/crowdy/project-store.js +223 -0
  21. package/lib/crowdy/project-store.js.map +1 -0
  22. package/lib/fs/crowdy-file-system.js +621 -0
  23. package/lib/fs/crowdy-file-system.js.map +1 -0
  24. package/lib/fs/scratch-store.js +61 -0
  25. package/lib/fs/scratch-store.js.map +1 -0
  26. package/lib/index.js +15 -0
  27. package/lib/index.js.map +1 -0
  28. package/lib/persist/index.js +199 -0
  29. package/lib/persist/index.js.map +1 -0
  30. package/lib/scripts/probe.js +59 -0
  31. package/lib/scripts/probe.js.map +1 -0
  32. package/lib/sdk-index/catalog.js +237 -0
  33. package/lib/sdk-index/catalog.js.map +1 -0
  34. package/lib/sdk-index/index.js +10 -0
  35. package/lib/sdk-index/index.js.map +1 -0
  36. package/lib/sdk-index/parse-sdk.js +131 -0
  37. package/lib/sdk-index/parse-sdk.js.map +1 -0
  38. package/lib/sdk-index/plugin.js +90 -0
  39. package/lib/sdk-index/plugin.js.map +1 -0
  40. package/lib/sdk-index/snapshot.js +215 -0
  41. package/lib/sdk-index/snapshot.js.map +1 -0
  42. package/lib/search/glob-match.js +114 -0
  43. package/lib/search/glob-match.js.map +1 -0
  44. package/lib/search/search-tools.js +414 -0
  45. package/lib/search/search-tools.js.map +1 -0
  46. package/lib/tools/index.js +344 -0
  47. package/lib/tools/index.js.map +1 -0
  48. package/lib/types/attachments/crowdy-attachment-store.d.ts +45 -0
  49. package/lib/types/attachments/crowdy-attachment-store.d.ts.map +1 -0
  50. package/lib/types/attachments/crowdy-attachment-store.test.d.ts.map +1 -0
  51. package/lib/types/bridge/client.d.ts +57 -0
  52. package/lib/types/bridge/client.d.ts.map +1 -0
  53. package/lib/types/bridge/client.test.d.ts.map +1 -0
  54. package/lib/types/bridge/index.d.ts +66 -0
  55. package/lib/types/bridge/index.d.ts.map +1 -0
  56. package/lib/types/bridge/protocol.d.ts +242 -0
  57. package/lib/types/bridge/protocol.d.ts.map +1 -0
  58. package/lib/types/crowdy/client.d.ts +126 -0
  59. package/lib/types/crowdy/client.d.ts.map +1 -0
  60. package/lib/types/crowdy/client.test.d.ts.map +1 -0
  61. package/lib/types/crowdy/config.d.ts +60 -0
  62. package/lib/types/crowdy/config.d.ts.map +1 -0
  63. package/lib/types/crowdy/github-layout.d.ts +36 -0
  64. package/lib/types/crowdy/github-layout.d.ts.map +1 -0
  65. package/lib/types/crowdy/paths.d.ts +89 -0
  66. package/lib/types/crowdy/paths.d.ts.map +1 -0
  67. package/lib/types/crowdy/project-store.d.ts +84 -0
  68. package/lib/types/crowdy/project-store.d.ts.map +1 -0
  69. package/lib/types/crowdy/project-store.test.d.ts.map +1 -0
  70. package/lib/types/fs/crowdy-file-system.d.ts +173 -0
  71. package/lib/types/fs/crowdy-file-system.d.ts.map +1 -0
  72. package/lib/types/fs/crowdy-file-system.test.d.ts.map +1 -0
  73. package/lib/types/fs/scratch-store.d.ts +31 -0
  74. package/lib/types/fs/scratch-store.d.ts.map +1 -0
  75. package/lib/types/index.d.ts +19 -0
  76. package/lib/types/index.d.ts.map +1 -0
  77. package/lib/types/persist/index.d.ts +85 -0
  78. package/lib/types/persist/index.d.ts.map +1 -0
  79. package/lib/types/scripts/probe.d.ts +9 -0
  80. package/lib/types/scripts/probe.d.ts.map +1 -0
  81. package/lib/types/sdk-index/catalog.d.ts +39 -0
  82. package/lib/types/sdk-index/catalog.d.ts.map +1 -0
  83. package/lib/types/sdk-index/catalog.test.d.ts.map +1 -0
  84. package/lib/types/sdk-index/index.d.ts +13 -0
  85. package/lib/types/sdk-index/index.d.ts.map +1 -0
  86. package/lib/types/sdk-index/parse-sdk.d.ts +25 -0
  87. package/lib/types/sdk-index/parse-sdk.d.ts.map +1 -0
  88. package/lib/types/sdk-index/plugin.d.ts +26 -0
  89. package/lib/types/sdk-index/plugin.d.ts.map +1 -0
  90. package/lib/types/sdk-index/snapshot.d.ts +11 -0
  91. package/lib/types/sdk-index/snapshot.d.ts.map +1 -0
  92. package/lib/types/search/glob-match.d.ts +31 -0
  93. package/lib/types/search/glob-match.d.ts.map +1 -0
  94. package/lib/types/search/glob-match.test.d.ts.map +1 -0
  95. package/lib/types/search/search-tools.d.ts +81 -0
  96. package/lib/types/search/search-tools.d.ts.map +1 -0
  97. package/lib/types/search/search-tools.test.d.ts.map +1 -0
  98. package/lib/types/tools/index.d.ts +27 -0
  99. package/lib/types/tools/index.d.ts.map +1 -0
  100. package/lib/types/vendor/crowdyjs-sdk.d.ts +17 -0
  101. package/lib/types/vendor/crowdyjs-sdk.d.ts.map +1 -0
  102. package/lib/vendor/crowdyjs-sdk.js +18338 -0
  103. package/lib/vendor/crowdyjs-sdk.js.map +1 -0
  104. package/lib/vendor/crowdyjs-sdk.version.json +5 -0
  105. package/package.json +151 -38
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/bridge/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,aAAa,GAQd,MAAM,eAAe,CAAA;AAEtB,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGzB;IAFX,YACE,OAAe,EACN,IAAY;QAErB,KAAK,CAAC,OAAO,CAAC,CAAA;QAFL,SAAI,GAAJ,IAAI,CAAQ;QAGrB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAA;IAC3B,CAAC;CACF;AAUD,SAAS,qBAAqB;IAC5B,MAAM,KAAK,GAAG,UAAsE,CAAA;IACpF,IAAI,OAAO,KAAK,CAAC,gBAAgB,KAAK,UAAU;QAAE,OAAO,SAAS,CAAA;IAClE,MAAM,IAAI,GAAG,KAAK,CAAC,gBAAgB,CAAA;IACnC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC;AAaD,MAAM,OAAO,YAAY;IACN,OAAO,CAAyB;IAChC,OAAO,GAAG,IAAI,GAAG,EAG/B,CAAA;IACc,SAAS,GAAG,IAAI,GAAG,EAA2C,CAAA;IAC9D,SAAS,CAAQ;IACjB,KAAK,CAAQ;IACtB,QAAQ,GAAG,CAAC,CAAA;IACpB,8DAA8D;IAC9D,WAAW,GAAG,KAAK,CAAA;IAEnB,YAAY,UAA+B,EAAE;QAC3C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAA;QAC5C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAA;QAChC,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,IAAI,qBAAqB,EAAE,CAAA;QACjE,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,mHAAmH,CAAC,CAAA;QACnI,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;YAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YACvC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACzB,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAA;IACnC,CAAC;IAED,EAAE,CAAsB,KAAQ,EAAE,QAA4C;QAC5E,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;YACf,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAChC,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,QAAsC,CAAC,CAAA;QAC/C,OAAO,GAAG,EAAE;YACV,GAAG,EAAE,MAAM,CAAC,QAAsC,CAAC,CAAA;QACrD,CAAC,CAAA;IACH,CAAC;IAED,IAAI,CAAwB,KAAQ,EAAE,OAA0B;QAC9D,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAM;QACzB,MAAM,KAAK,GAAgB,EAAE,CAAC,EAAE,8BAA8B,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;QAC3H,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,OAAO,CACX,MAAS,EACT,MAAqC,EACrC,UAAwD,EAAE;QAE1D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,WAAW,CACnB,sGAAsG,EACtG,kBAAkB,CAAC,WAAW,CAC/B,CAAA;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,WAAW,CACnB,qGAAqG,EACrG,kBAAkB,CAAC,WAAW,CAC/B,CAAA;QACH,CAAC;QACD,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;QAChC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAA;QAClB,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAA;QACzD,MAAM,KAAK,GAAgB,EAAE,CAAC,EAAE,8BAA8B,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;QAC7H,OAAO,IAAI,OAAO,CAAgC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAA;YACnD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBACvB,MAAM,CAAC,IAAI,WAAW,CAAC,gCAAgC,MAAM,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAA;YACtI,CAAC,EAAE,OAAO,CAAC,CAAA;YACX,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,YAAY,CAAC,KAAK,CAAC,CAAA;gBACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBACvB,MAAM,CAAC,IAAI,WAAW,CAAC,GAAG,MAAM,iBAAiB,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAA;YACjF,CAAC,CAAA;YACD,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YAClE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;gBACnB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBACjB,YAAY,CAAC,KAAK,CAAC,CAAA;oBACnB,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;oBACrD,OAAO,CAAC,KAAsC,CAAC,CAAA;gBACjD,CAAC;gBACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChB,YAAY,CAAC,KAAK,CAAC,CAAA;oBACnB,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;oBACrD,MAAM,CAAC,KAAK,CAAC,CAAA;gBACf,CAAC;gBACD,KAAK;aACN,CAAC,CAAA;YACF,IAAI,CAAC,OAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK;QACH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,KAAK,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAA;QACrF,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACpB,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAA;IACvB,CAAC;IAEO,MAAM,CAAC,IAAa;QAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAM;QACpE,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC;YACf,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACvC,IAAI,CAAC,KAAK;oBAAE,OAAM;gBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAC5B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBAC1B,OAAM;YACR,CAAC;YACD,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACvC,IAAI,CAAC,KAAK;oBAAE,OAAM;gBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAC5B,KAAK,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAA;gBACtF,OAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,IAAI,IAAI,CAAC,KAAK,KAAK,YAAY;oBAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;gBACxD,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU;oBAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;gBACvD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC1C,IAAI,CAAC,GAAG;oBAAE,OAAM;gBAChB,KAAK,MAAM,QAAQ,IAAI,GAAG,EAAE,CAAC;oBAC3B,IAAI,CAAC;wBACH,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBACxB,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,IAAI,CAAC,+BAA+B,IAAI,CAAC,KAAK,QAAQ,EAAE,KAAK,CAAC,CAAA;oBACxE,CAAC;gBACH,CAAC;gBACD,OAAM;YACR,CAAC;YACD;gBACE,OAAM;QACV,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Cordis service `ctx.crowdyBridge`: the harness's link to the Crowdy Studio
3
+ * page. It joins the page's `BroadcastChannel`, keeps the filesystem backend's
4
+ * token and project in step with the page, mirrors page-shared context into
5
+ * the `context/` and `captures/` scratch directories, and lets tools ask the
6
+ * page to run a draft test, take a screenshot, or switch projects.
7
+ *
8
+ * @module @crowdedkingdoms/crowdy-dsh/bridge
9
+ */
10
+ import { Service } from '@deepseek-ai/cordis';
11
+ import z from '@deepseek-ai/schemastery';
12
+ import { CrowdyFileSystem } from '../fs/crowdy-file-system.js';
13
+ import { BridgeClient } from './client.js';
14
+ export { BridgeClient, BridgeError } from './client.js';
15
+ export * from './protocol.js';
16
+ /** Cordis plugin name used by loader diagnostics. */
17
+ export const name = 'crowdy-bridge';
18
+ export class CrowdyBridge extends Service {
19
+ static inject = ['fs'];
20
+ static Config = z.object({
21
+ channel: z.string(),
22
+ nonce: z.string(),
23
+ timeoutMs: z.number().default(15_000),
24
+ });
25
+ client;
26
+ fs;
27
+ captureCounter = 0;
28
+ disposers = [];
29
+ constructor(ctx, config = {}) {
30
+ super(ctx, 'crowdyBridge');
31
+ const fs = ctx.fs;
32
+ if (!(fs instanceof CrowdyFileSystem)) {
33
+ throw new Error('crowdy-bridge: ctx.fs must be the Crowdy filesystem backend (@crowdedkingdoms/crowdy-dsh/fs).');
34
+ }
35
+ this.fs = fs;
36
+ this.client = new BridgeClient({
37
+ channel: config.channel ?? fs.boot.bridgeChannel,
38
+ nonce: config.nonce ?? fs.boot.bridgeNonce,
39
+ timeoutMs: config.timeoutMs,
40
+ });
41
+ this.wire();
42
+ // Registrations unwind with the plugin: the channel closes and the fs
43
+ // listeners detach when the row unloads.
44
+ ctx.effect(() => () => {
45
+ for (const dispose of this.disposers)
46
+ dispose();
47
+ this.disposers.length = 0;
48
+ this.client.close();
49
+ }, 'crowdy bridge');
50
+ }
51
+ /** Whether a Studio page is attached (page-executed tools can work). */
52
+ get pageConnected() {
53
+ return this.client.available && this.client.pagePresent;
54
+ }
55
+ /** Store a capture under `captures/` and return its virtual path. */
56
+ putCapture(shot) {
57
+ this.captureCounter += 1;
58
+ const extension = shot.mediaType === 'image/jpeg' ? 'jpg' : shot.mediaType === 'image/webp' ? 'webp' : 'png';
59
+ const name = shot.name && /^[\w.-]+$/.test(shot.name) ? shot.name : `capture-${String(this.captureCounter).padStart(4, '0')}.${extension}`;
60
+ const file = this.fs.scratch.putBytes('captures', name, new Uint8Array(shot.bytes));
61
+ if (shot.caption)
62
+ this.fs.scratch.putText('captures', `${name}.txt`, shot.caption);
63
+ return { path: `${this.fs.mountRoot}/captures/${name}`, file };
64
+ }
65
+ /** Store page-shared context as readable files under `context/`. */
66
+ putContext(payload) {
67
+ const written = [];
68
+ const put = (name, text) => {
69
+ this.fs.scratch.putText('context', name, text);
70
+ written.push(`${this.fs.mountRoot}/context/${name}`);
71
+ };
72
+ if (payload.observation !== undefined)
73
+ put('game-observation.json', JSON.stringify(payload.observation, null, 2));
74
+ if (payload.clientLogs)
75
+ put('client-logs.txt', payload.clientLogs.join('\n'));
76
+ if (payload.diagnostics)
77
+ put('diagnostics.json', JSON.stringify(payload.diagnostics, null, 2));
78
+ if (payload.runtime)
79
+ put('runtime.json', JSON.stringify(payload.runtime, null, 2));
80
+ if (payload.note)
81
+ put('note.txt', payload.note);
82
+ return written;
83
+ }
84
+ /**
85
+ * Queue text into the player's current session: the most recently created
86
+ * live agent, or a fresh session in the project mount when none is live.
87
+ * Uses the same host controller the web client's composer goes through, so
88
+ * the message shows up in the pane like a typed one.
89
+ */
90
+ async promptAgent(text, mode) {
91
+ const trimmed = text.trim();
92
+ if (!trimmed)
93
+ return;
94
+ const sessions = this.ctx.get('sessionController');
95
+ if (!sessions)
96
+ throw new Error('no session controller in this composition');
97
+ const agents = this.ctx.get('agents');
98
+ const live = agents?.list() ?? [];
99
+ let sessionId = live.length > 0 ? live[live.length - 1].session.id : undefined;
100
+ if (sessionId === undefined) {
101
+ const created = await sessions.create({ cwd: this.fs.mountRoot, agentPreset: 'crowdy' });
102
+ sessionId = created.sessionId;
103
+ }
104
+ await sessions.prompt({
105
+ requestId: `crowdy-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`,
106
+ sessionId,
107
+ mode,
108
+ content: [{ type: 'text', text: trimmed }],
109
+ }, new AbortController().signal);
110
+ }
111
+ wire() {
112
+ const { client, fs } = this;
113
+ if (!client.available)
114
+ return;
115
+ this.disposers.push(client.on('page.hello', (payload) => {
116
+ if (payload.appToken)
117
+ fs.setToken(payload.appToken);
118
+ if (payload.projectId)
119
+ fs.setProject(payload.projectId);
120
+ fs.invalidate();
121
+ client.emit('worker.ready', { root: fs.mountRoot, ...(fs.storeReason ? { store: fs.storeReason } : {}) });
122
+ }), client.on('page.token', (payload) => {
123
+ // Also republishes CROWDY_APP_TOKEN, which the model route reads per request.
124
+ fs.setToken(payload.appToken);
125
+ }), client.on('page.project', (payload) => {
126
+ if (payload.projectId)
127
+ fs.setProject(payload.projectId);
128
+ }), client.on('page.saved', () => {
129
+ fs.invalidate();
130
+ }), client.on('page.context', (payload) => {
131
+ this.putContext(payload);
132
+ }), client.on('page.capture', (payload) => {
133
+ this.putCapture(payload);
134
+ }), client.on('page.prompt', (payload) => {
135
+ void this.promptAgent(payload.text, payload.mode ?? 'queue').catch((error) => {
136
+ client.emit('worker.warning', {
137
+ message: `The prompt from Crowdy Studio was not delivered: ${error instanceof Error ? error.message : String(error)}`,
138
+ });
139
+ });
140
+ }), fs.onChange((change) => {
141
+ client.emit('worker.fileChanged', change);
142
+ }),
143
+ // A GitHub->Studio fallback or a failed mirror is the player's business:
144
+ // the page shows it in the pane instead of it sitting in a buffer.
145
+ fs.onWarning((message) => {
146
+ client.emit('worker.warning', { message });
147
+ }));
148
+ for (const message of fs.drainWarnings())
149
+ client.emit('worker.warning', { message });
150
+ // Announce so a page that connected before the worker booted learns we exist.
151
+ client.emit('worker.ready', { root: fs.mountRoot });
152
+ }
153
+ }
154
+ export default CrowdyBridge;
155
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Wire protocol between the harness (running in the browser worker) and the
3
+ * Crowdy Studio page that embeds it. Both sides join one `BroadcastChannel`
4
+ * whose name the page chose and wrote into `crowdy.json`.
5
+ *
6
+ * The page executes anything that needs the game or the Studio editor
7
+ * (screenshots, draft tests, deploys, project switching, game observation); the
8
+ * worker executes file edits and model calls. CrowdyJS mirrors these types in
9
+ * `src/crowdy-dsh/protocol.ts`; keep the two in step.
10
+ *
11
+ * @module @crowdedkingdoms/crowdy-dsh/bridge-protocol
12
+ */
13
+ export const CROWDY_BRIDGE_PROTOCOL_VERSION = 2;
14
+ export const BRIDGE_ERROR_CODES = {
15
+ unavailable: 'BRIDGE_UNAVAILABLE',
16
+ timeout: 'BRIDGE_TIMEOUT',
17
+ refused: 'BRIDGE_REFUSED',
18
+ pageError: 'PAGE_ERROR',
19
+ };
20
+ export function isBridgeFrame(value, nonce) {
21
+ if (!value || typeof value !== 'object')
22
+ return false;
23
+ const frame = value;
24
+ if (frame.v !== CROWDY_BRIDGE_PROTOCOL_VERSION || typeof frame.n !== 'string' || typeof frame.t !== 'string')
25
+ return false;
26
+ if (frame.from !== 'page' && frame.from !== 'worker')
27
+ return false;
28
+ return nonce === undefined || frame.n === nonce;
29
+ }
30
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +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;AAyJxD,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"}
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Crowdy Studio project-file access for the cockpit, on top of CrowdyJS.
3
+ *
4
+ * The cockpit is a client of the platform exactly like a browser running Studio:
5
+ * it signs in as the modder with the public SDK, mints an app-scoped token for
6
+ * the target app, and reads / writes project files through the same GraphQL
7
+ * operations Studio uses. There is no private wire, no second endpoint, and no
8
+ * server-side component that knows this process exists.
9
+ *
10
+ * Only the operations a filesystem backend needs are exposed: authenticate,
11
+ * load a project with its files, save a batch of upserts / deletes under an
12
+ * expected project revision, and (for the setup script) create a project.
13
+ */
14
+ import { createCrowdyClient, CrowdyGraphQLError, CrowdyStudioProjectCreateDocument, CrowdyStudioProjectDocument, } from '../vendor/crowdyjs-sdk.js';
15
+ /**
16
+ * A GraphQL error surfaced with the server's error code intact so callers can
17
+ * branch on it. Revision conflicts in particular need distinct handling.
18
+ */
19
+ export class CrowdyApiError extends Error {
20
+ code;
21
+ remediation;
22
+ constructor(message, code, remediation) {
23
+ super(message);
24
+ this.code = code;
25
+ this.remediation = remediation;
26
+ this.name = 'CrowdyApiError';
27
+ }
28
+ /** True when the write lost an optimistic-concurrency race and must be replayed. */
29
+ get isRevisionConflict() {
30
+ return this.code === 'CROWDY_STUDIO_REVISION_CONFLICT' || this.code === 'GITHUB_STALE_SHA';
31
+ }
32
+ /** True when the bearer is missing, expired, or not app-scoped. */
33
+ get isAuthFailure() {
34
+ return (this.code === 'UNAUTHENTICATED' ||
35
+ this.code === 'UNAUTHORIZED' ||
36
+ this.code === 'TOKEN_EXPIRED' ||
37
+ this.code === 'SCOPE_MISSING');
38
+ }
39
+ }
40
+ function toProject(dto) {
41
+ return {
42
+ projectId: dto.projectId,
43
+ appId: String(dto.appId),
44
+ ownerUserId: String(dto.ownerUserId),
45
+ name: dto.name,
46
+ revision: String(dto.revision),
47
+ archived: dto.archived,
48
+ updatedAt: dto.updatedAt,
49
+ files: dto.files.map((file) => ({
50
+ target: file.target,
51
+ path: file.path,
52
+ content: file.content,
53
+ revision: String(file.revision),
54
+ updatedAt: file.updatedAt,
55
+ })),
56
+ };
57
+ }
58
+ /**
59
+ * Translate CrowdyJS's error into the cockpit's, keeping `extensions.code` and
60
+ * `extensions.remediation` so the filesystem can map conflicts and denials.
61
+ */
62
+ function toApiError(error) {
63
+ if (error instanceof CrowdyApiError)
64
+ return error;
65
+ if (error instanceof CrowdyGraphQLError) {
66
+ const first = error.graphqlErrors[0];
67
+ const extensions = (first?.extensions ?? {});
68
+ return new CrowdyApiError(first?.message ?? error.message, typeof extensions.code === 'string' ? extensions.code : undefined, typeof extensions.remediation === 'string' ? extensions.remediation : undefined);
69
+ }
70
+ if (error instanceof Error) {
71
+ return new CrowdyApiError(error.message, 'CROWDY_DSH_TRANSPORT');
72
+ }
73
+ return new CrowdyApiError(String(error), 'CROWDY_DSH_TRANSPORT');
74
+ }
75
+ /**
76
+ * Project-file client. One instance per configured `(endpoint, appId)`; the
77
+ * bearer is resolved lazily on the first call and held in memory only.
78
+ */
79
+ export class CrowdyStudioClient {
80
+ options;
81
+ sdk;
82
+ appToken;
83
+ authenticating;
84
+ constructor(options) {
85
+ this.options = options;
86
+ // The SDK expects an origin; the cockpit is configured with the endpoint.
87
+ this.sdk = createCrowdyClient({ graphqlEndpoint: options.endpoint });
88
+ this.appToken = options.appToken;
89
+ if (this.appToken)
90
+ this.sdk.setToken(this.appToken);
91
+ }
92
+ /** The app id every call is scoped to. */
93
+ get appId() {
94
+ return this.options.appId;
95
+ }
96
+ /**
97
+ * Replace the bearer, e.g. when the Studio page refreshes the app token over
98
+ * the bridge. An empty token falls back to the credential mint path.
99
+ */
100
+ setToken(token) {
101
+ this.appToken = token || undefined;
102
+ this.sdk.setToken(this.appToken ?? null);
103
+ }
104
+ /** GitHub loop of the bound repository; every call carries `(appId, projectId)`. */
105
+ get github() {
106
+ return this.sdk.crowdyStudioGitHub;
107
+ }
108
+ /** Projects the caller owns in this app. */
109
+ async listProjects() {
110
+ await this.authenticate();
111
+ try {
112
+ // The SDK scope type also names a grid, but the query is app-wide; the grid
113
+ // is irrelevant to listing and is passed empty.
114
+ const projects = await this.sdk.crowdyStudio.listProjects({ appId: this.options.appId, gridId: '' });
115
+ return projects.map((project) => ({
116
+ projectId: project.projectId,
117
+ name: project.name,
118
+ kind: String(project.kind),
119
+ updatedAt: project.updatedAt,
120
+ }));
121
+ }
122
+ catch (error) {
123
+ throw toApiError(error);
124
+ }
125
+ }
126
+ /**
127
+ * Resolve the app-scoped bearer. A pre-minted `appToken` wins; otherwise sign
128
+ * in as the modder (first-party, no browser Origin — the same path
129
+ * CrowdyCPP and the load tests use) and mint a token for `appId`.
130
+ */
131
+ async authenticate() {
132
+ if (this.appToken)
133
+ return this.appToken;
134
+ if (this.authenticating)
135
+ return this.authenticating;
136
+ const { email, password, appId } = this.options;
137
+ if (!email || !password) {
138
+ throw new CrowdyApiError('No appToken supplied and no email/password available to mint one.', 'CROWDY_DSH_NO_CREDENTIALS', 'Set CROWDY_APP_TOKEN, or set CROWDY_EMAIL and CROWDY_PASSWORD.');
139
+ }
140
+ this.authenticating = (async () => {
141
+ try {
142
+ await this.sdk.auth.login({ email, password });
143
+ const minted = await this.sdk.portal.mintAppToken(appId);
144
+ this.appToken = minted.token;
145
+ this.sdk.setToken(this.appToken);
146
+ return this.appToken;
147
+ }
148
+ catch (error) {
149
+ throw toApiError(error);
150
+ }
151
+ finally {
152
+ this.authenticating = undefined;
153
+ }
154
+ })();
155
+ return this.authenticating;
156
+ }
157
+ /** Load a project and the full text of every file it contains. */
158
+ async loadProject(projectId) {
159
+ await this.authenticate();
160
+ try {
161
+ const data = await this.sdk.graphql.request(CrowdyStudioProjectDocument, {
162
+ appId: this.options.appId,
163
+ projectId,
164
+ });
165
+ return toProject(data.crowdyStudioProject);
166
+ }
167
+ catch (error) {
168
+ throw toApiError(error);
169
+ }
170
+ }
171
+ /**
172
+ * Apply upserts and deletes in one transaction guarded by `expectedRevision`.
173
+ * A stale revision throws {@link CrowdyApiError} with `isRevisionConflict`.
174
+ *
175
+ * Studio's own editor goes through `crowdyStudioProjectSave` with the whole
176
+ * file list; a filesystem needs the files-only twin so a single `write`
177
+ * cannot disturb metadata it never read.
178
+ *
179
+ * @returns the project as it exists after the write, with its new revision.
180
+ */
181
+ async saveFiles(args) {
182
+ await this.authenticate();
183
+ try {
184
+ const data = await this.sdk.graphql.query(SAVE_FILES, {
185
+ input: {
186
+ appId: this.options.appId,
187
+ projectId: args.projectId,
188
+ expectedRevision: args.expectedRevision,
189
+ ...(args.upserts?.length ? { upserts: args.upserts } : {}),
190
+ ...(args.deletes?.length ? { deletes: args.deletes } : {}),
191
+ ...(args.idempotencyKey ? { idempotencyKey: args.idempotencyKey } : {}),
192
+ },
193
+ });
194
+ return toProject(data.crowdyStudioProjectSaveFiles);
195
+ }
196
+ catch (error) {
197
+ throw toApiError(error);
198
+ }
199
+ }
200
+ /** Create a project, used by the setup script to produce a scratch target. */
201
+ async createProject(args) {
202
+ await this.authenticate();
203
+ try {
204
+ const data = await this.sdk.graphql.request(CrowdyStudioProjectCreateDocument, {
205
+ input: {
206
+ appId: this.options.appId,
207
+ name: args.name,
208
+ ...(args.description ? { description: args.description } : {}),
209
+ ...(args.initialFiles?.length
210
+ ? { initialFiles: args.initialFiles.map((f) => ({ ...f, target: f.target })) }
211
+ : {}),
212
+ },
213
+ });
214
+ return toProject(data.crowdyStudioProjectCreate);
215
+ }
216
+ catch (error) {
217
+ throw toApiError(error);
218
+ }
219
+ }
220
+ }
221
+ const PROJECT_FIELDS = `
222
+ projectId
223
+ appId
224
+ ownerUserId
225
+ name
226
+ revision
227
+ archived
228
+ updatedAt
229
+ files {
230
+ target
231
+ path
232
+ content
233
+ revision
234
+ updatedAt
235
+ }
236
+ `;
237
+ /**
238
+ * The files-only save is not in CrowdyJS's generated document set (Studio's
239
+ * editor saves whole projects), so it is carried here as a named operation
240
+ * against the same public schema.
241
+ */
242
+ const SAVE_FILES = `
243
+ mutation CrowdyDshSaveFiles($input: SaveCrowdyStudioProjectFilesInput!) {
244
+ crowdyStudioProjectSaveFiles(input: $input) { ${PROJECT_FIELDS} }
245
+ }
246
+ `;
247
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/crowdy/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Boot configuration shared by every Crowdy plugin.
3
+ *
4
+ * Two hosts run these plugins:
5
+ *
6
+ * - the **browser worker image** embedded by Crowdy Studio, where the page
7
+ * writes `$DSH_HOME/crowdy.json` into the worker's virtual filesystem as a
8
+ * pre-boot overlay before the harness tree mounts;
9
+ * - the **developer cockpit** (`dsh web --patch profile/crowdy-node.patch.yml`
10
+ * on Node 22), where the same keys arrive as `CROWDY_*` environment
11
+ * variables.
12
+ *
13
+ * Both hosts converge here. Environment wins over the file so a developer can
14
+ * override one field without editing the overlay.
15
+ *
16
+ * @module @crowdedkingdoms/crowdy-dsh/crowdy/config
17
+ */
18
+ import { readFileSync } from 'node:fs';
19
+ import { join } from 'node:path';
20
+ /** File the page-side bridge writes into the worker's `$DSH_HOME`. */
21
+ export const CROWDY_CONFIG_FILENAME = 'crowdy.json';
22
+ const ENV_KEYS = {
23
+ graphqlUrl: 'CROWDY_GRAPHQL_URL',
24
+ appId: 'CROWDY_APP_ID',
25
+ projectId: 'CROWDY_PROJECT_ID',
26
+ appToken: 'CROWDY_APP_TOKEN',
27
+ email: 'CROWDY_EMAIL',
28
+ password: 'CROWDY_PASSWORD',
29
+ root: 'CROWDY_MOUNT',
30
+ bridgeChannel: 'CROWDY_BRIDGE_CHANNEL',
31
+ bridgeNonce: 'CROWDY_BRIDGE_NONCE',
32
+ githubFirst: 'CROWDY_GITHUB_FIRST',
33
+ studioOrigin: 'CROWDY_STUDIO_ORIGIN',
34
+ persistScope: 'CROWDY_PERSIST_SCOPE',
35
+ };
36
+ function readFile(home) {
37
+ if (!home)
38
+ return {};
39
+ try {
40
+ const text = readFileSync(join(home, CROWDY_CONFIG_FILENAME), 'utf8');
41
+ const parsed = JSON.parse(text);
42
+ return parsed && typeof parsed === 'object' ? parsed : {};
43
+ }
44
+ catch {
45
+ return {};
46
+ }
47
+ }
48
+ /**
49
+ * Resolve the boot configuration from `$DSH_HOME/crowdy.json` and the
50
+ * environment. Missing required fields are reported together so the first
51
+ * failed tool call names every problem at once.
52
+ */
53
+ export function loadCrowdyConfig(overrides = {}) {
54
+ const env = process.env;
55
+ const file = readFile(env.DSH_HOME);
56
+ const pick = (key) => {
57
+ const fromEnv = env[ENV_KEYS[key]];
58
+ if (fromEnv !== undefined && fromEnv !== '') {
59
+ return (key === 'githubFirst' ? fromEnv === '1' || fromEnv === 'true' : fromEnv);
60
+ }
61
+ if (overrides[key] !== undefined)
62
+ return overrides[key];
63
+ return file[key];
64
+ };
65
+ const graphqlUrl = pick('graphqlUrl') ?? 'http://localhost:3000/graphql';
66
+ const config = {
67
+ graphqlUrl,
68
+ appId: pick('appId') ?? '0',
69
+ projectId: pick('projectId') ?? '',
70
+ appToken: pick('appToken'),
71
+ email: pick('email'),
72
+ password: pick('password'),
73
+ root: pick('root'),
74
+ bridgeChannel: pick('bridgeChannel'),
75
+ bridgeNonce: pick('bridgeNonce'),
76
+ githubFirst: pick('githubFirst') ?? true,
77
+ studioOrigin: pick('studioOrigin'),
78
+ persistScope: pick('persistScope'),
79
+ };
80
+ return config;
81
+ }
82
+ /** Human-readable reason the configuration cannot reach a project yet. */
83
+ export function describeMissing(config) {
84
+ const missing = [];
85
+ if (!config.appId || config.appId === '0')
86
+ missing.push('appId');
87
+ if (!config.projectId)
88
+ missing.push('projectId');
89
+ if (!config.appToken && !(config.email && config.password))
90
+ missing.push('appToken');
91
+ if (missing.length === 0)
92
+ return undefined;
93
+ return `Crowdy Studio is not connected yet (missing ${missing.join(', ')}). Open a project in Crowdy Studio and try again.`;
94
+ }
95
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/crowdy/config.ts"],"names":[],"mappings":"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"}