@crowdedkingdoms/crowdy-dsh 0.4.14 → 0.5.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 (83) hide show
  1. package/README.md +44 -7
  2. package/dist/dsh-web/BUILD.json +5 -5
  3. package/dist/dsh-web/preview/vfs-image.tar.gz +0 -0
  4. package/lib/bridge/client-service.js +33 -0
  5. package/lib/bridge/client-service.js.map +1 -0
  6. package/lib/bridge/client.js +20 -1
  7. package/lib/bridge/client.js.map +1 -1
  8. package/lib/bridge/index.js +33 -24
  9. package/lib/bridge/index.js.map +1 -1
  10. package/lib/bridge/protocol.js +30 -1
  11. package/lib/bridge/protocol.js.map +1 -1
  12. package/lib/crowdy/config.js +6 -0
  13. package/lib/crowdy/config.js.map +1 -1
  14. package/lib/crowdy/playbook.js +24 -0
  15. package/lib/crowdy/playbook.js.map +1 -0
  16. package/lib/crowdy/repo-paths.js +27 -0
  17. package/lib/crowdy/repo-paths.js.map +1 -0
  18. package/lib/crowdy/token.js +16 -0
  19. package/lib/crowdy/token.js.map +1 -0
  20. package/lib/fs/crowdy-file-system.js +4 -10
  21. package/lib/fs/crowdy-file-system.js.map +1 -1
  22. package/lib/fs/entry.js +22 -0
  23. package/lib/fs/entry.js.map +1 -0
  24. package/lib/fs/game-file-system.js +532 -0
  25. package/lib/fs/game-file-system.js.map +1 -0
  26. package/lib/fs/studio-fs.js +14 -0
  27. package/lib/fs/studio-fs.js.map +1 -0
  28. package/lib/index.js +2 -0
  29. package/lib/index.js.map +1 -1
  30. package/lib/search/search-tools.js +4 -5
  31. package/lib/search/search-tools.js.map +1 -1
  32. package/lib/skills/playbook.js +80 -0
  33. package/lib/skills/playbook.js.map +1 -0
  34. package/lib/tools/game.js +155 -0
  35. package/lib/tools/game.js.map +1 -0
  36. package/lib/tools/index.js +21 -12
  37. package/lib/tools/index.js.map +1 -1
  38. package/lib/types/bridge/client-service.d.ts +32 -0
  39. package/lib/types/bridge/client-service.d.ts.map +1 -0
  40. package/lib/types/bridge/client.d.ts +6 -0
  41. package/lib/types/bridge/client.d.ts.map +1 -1
  42. package/lib/types/bridge/index.d.ts +9 -13
  43. package/lib/types/bridge/index.d.ts.map +1 -1
  44. package/lib/types/bridge/protocol.d.ts +189 -2
  45. package/lib/types/bridge/protocol.d.ts.map +1 -1
  46. package/lib/types/crowdy/config.d.ts +7 -0
  47. package/lib/types/crowdy/config.d.ts.map +1 -1
  48. package/lib/types/crowdy/playbook.d.ts +13 -0
  49. package/lib/types/crowdy/playbook.d.ts.map +1 -0
  50. package/lib/types/crowdy/repo-paths.d.ts +15 -0
  51. package/lib/types/crowdy/repo-paths.d.ts.map +1 -0
  52. package/lib/types/crowdy/repo-paths.test.d.ts.map +1 -0
  53. package/lib/types/crowdy/token.d.ts +10 -0
  54. package/lib/types/crowdy/token.d.ts.map +1 -0
  55. package/lib/types/crowdy/token.test.d.ts.map +1 -0
  56. package/lib/types/fs/crowdy-file-system.d.ts +7 -2
  57. package/lib/types/fs/crowdy-file-system.d.ts.map +1 -1
  58. package/lib/types/fs/entry.d.ts +21 -0
  59. package/lib/types/fs/entry.d.ts.map +1 -0
  60. package/lib/types/fs/game-file-system.d.ts +107 -0
  61. package/lib/types/fs/game-file-system.d.ts.map +1 -0
  62. package/lib/types/fs/game-file-system.test.d.ts.map +1 -0
  63. package/lib/types/fs/studio-fs.d.ts +42 -0
  64. package/lib/types/fs/studio-fs.d.ts.map +1 -0
  65. package/lib/types/index.d.ts +3 -0
  66. package/lib/types/index.d.ts.map +1 -1
  67. package/lib/types/search/search-tools.d.ts.map +1 -1
  68. package/lib/types/skills/playbook.d.ts +25 -0
  69. package/lib/types/skills/playbook.d.ts.map +1 -0
  70. package/lib/types/skills/playbook.test.d.ts.map +1 -0
  71. package/lib/types/tools/game.d.ts +25 -0
  72. package/lib/types/tools/game.d.ts.map +1 -0
  73. package/lib/types/tools/game.test.d.ts.map +1 -0
  74. package/lib/types/tools/index.d.ts +5 -0
  75. package/lib/types/tools/index.d.ts.map +1 -1
  76. package/lib/vendor/crowdyjs-sdk.js +50 -10
  77. package/lib/vendor/crowdyjs-sdk.version.json +1 -1
  78. package/package.json +25 -9
  79. package/presets/crowdy/agent.cordis.yml +1 -0
  80. package/presets/crowdy-game/agent.cordis.yml +143 -0
  81. package/presets/crowdy-game/preset.yml +3 -0
  82. package/profile/crowdy-node.patch.yml +3 -0
  83. package/profile/crowdy-web.patch.yml +10 -3
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Filesystem plugin: mounts the backend this boot's editor needs, so exactly
3
+ * one `ctx.fs` exists. `studioMode: 'game'` in `crowdy.json` mounts the bound
4
+ * game repository's draft (the page owns it); anything else mounts the mod
5
+ * crates of the open Crowdy Studio project.
6
+ *
7
+ * @module @crowdedkingdoms/crowdy-dsh/fs
8
+ */
9
+ import type { Context } from '@deepseek-ai/cordis';
10
+ import CrowdyFileSystem, { type Config as ModConfig } from './crowdy-file-system.js';
11
+ import GameFileSystem, { type Config as GameConfig } from './game-file-system.js';
12
+ export declare const name = "crowdy-fs";
13
+ export type Config = ModConfig & GameConfig;
14
+ export declare function apply(ctx: Context, config?: Config): Promise<void>;
15
+ export { CrowdyFileSystem, GameFileSystem };
16
+ declare const _default: {
17
+ name: string;
18
+ apply: typeof apply;
19
+ };
20
+ export default _default;
21
+ //# sourceMappingURL=entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../../src/fs/entry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,gBAAgB,EAAE,EAAE,KAAK,MAAM,IAAI,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACpF,OAAO,cAAc,EAAE,EAAE,KAAK,MAAM,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEjF,eAAO,MAAM,IAAI,cAAc,CAAA;AAE/B,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,UAAU,CAAA;AAE3C,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5E;AAED,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAA;;;;;AAC3C,wBAA8B"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Game filesystem backend: the page's draft of the bound game repository.
3
+ *
4
+ * The page owns the draft (CrowdyJS `DraftStore`). This backend keeps a
5
+ * snapshot of it, path -> git blob id, from `draft.tree`, and follows every
6
+ * change through `page.draftChanged`; file text is fetched with `draft.read`
7
+ * in batches and cached by blob id, which never changes meaning. Versions are
8
+ * those blob ids, so listing, stat and read always agree. Writes carry the
9
+ * harness's own guarded-write intent to the page (`createIfAbsent` /
10
+ * `ifHash`), so an edit made on the page since the model read a file is a
11
+ * stale write here, never a silent overwrite. Nothing here commits: a write
12
+ * changes the draft, and `commit_game_files` asks the player.
13
+ */
14
+ import type { Context } from '@deepseek-ai/cordis';
15
+ import z from '@deepseek-ai/schemastery';
16
+ import { FileSystem, FsVersion } from '@deepseek-ai/dsh-fs';
17
+ import type { FsDirEntry, FsEditOutcome, FsEditRequest, FsInfo, FsPathInfo, FsTarget, FsWriteIntent, FsWriteOutcome } from '@deepseek-ai/dsh-fs';
18
+ import { type DraftChangedPayload } from '../bridge/protocol.js';
19
+ import { type CrowdyBootConfig } from '../crowdy/config.js';
20
+ import { ScratchStore } from './scratch-store.js';
21
+ import type { StudioFileSystem } from './studio-fs.js';
22
+ export interface Config {
23
+ root?: string;
24
+ /** How long the first read waits for the page to say hello. */
25
+ pageWaitMs?: number;
26
+ }
27
+ export declare class GameFileSystem extends FileSystem implements StudioFileSystem {
28
+ static inject: string[];
29
+ static Config: z<Config>;
30
+ readonly studioMode: "game";
31
+ boot: CrowdyBootConfig;
32
+ readonly scratch: ScratchStore;
33
+ private readonly root;
34
+ private readonly pageWaitMs;
35
+ private readonly client;
36
+ private entries;
37
+ private deleted;
38
+ private baseCommitSha;
39
+ private revision;
40
+ private loaded;
41
+ /** Blob id -> text. */
42
+ private readonly text;
43
+ private readonly warnings;
44
+ private readonly warningListeners;
45
+ constructor(ctx: Context, config?: Config);
46
+ get mountRoot(): string;
47
+ get storeReason(): string | undefined;
48
+ setProject(projectId: string): void;
49
+ /** The game backend holds no token; the bridge publishes it for the model route. */
50
+ setToken(_token: string | undefined): void;
51
+ invalidate(): void;
52
+ applyDraftChange(change: DraftChangedPayload): void;
53
+ onChange(_listener: (change: {
54
+ target: 'SERVER' | 'CLIENT';
55
+ path: string;
56
+ }) => void): () => void;
57
+ onWarning(listener: (message: string) => void): () => void;
58
+ drainWarnings(): string[];
59
+ searchSnapshot(): Promise<{
60
+ root: string;
61
+ files: Array<{
62
+ virtualPath: string;
63
+ content: string;
64
+ }>;
65
+ }>;
66
+ resolve(path: string, opts?: {
67
+ cwd?: string;
68
+ signal?: AbortSignal;
69
+ }): Promise<FsTarget>;
70
+ processPath(target: FsTarget): string;
71
+ fileUrl(target: FsTarget): string;
72
+ contains(parent: FsTarget, child: FsTarget): boolean;
73
+ stat(target: FsTarget, signal?: AbortSignal): Promise<FsInfo | undefined>;
74
+ lstat(path: string, opts?: {
75
+ cwd?: string;
76
+ }, signal?: AbortSignal): Promise<FsPathInfo | undefined>;
77
+ readText(target: FsTarget, signal?: AbortSignal): Promise<string>;
78
+ streamText(target: FsTarget, signal?: AbortSignal): Promise<AsyncIterable<string>>;
79
+ readBytes(target: FsTarget, signal: AbortSignal | undefined, maxBytes: number): Promise<Uint8Array>;
80
+ readByteRange(target: FsTarget, range: {
81
+ offset: number;
82
+ length: number;
83
+ }, signal?: AbortSignal): Promise<Uint8Array>;
84
+ listDir(target: FsTarget, signal?: AbortSignal): Promise<FsDirEntry[]>;
85
+ writeText(target: FsTarget, content: string, expected?: FsWriteIntent, signal?: AbortSignal): Promise<FsWriteOutcome>;
86
+ editText(target: FsTarget, edit: FsEditRequest, expected?: {
87
+ version: FsVersion;
88
+ }, signal?: AbortSignal): Promise<FsEditOutcome>;
89
+ private ensureLoaded;
90
+ private loadTree;
91
+ private readRepoText;
92
+ /** Text of `paths` from the cache by blob id, fetching the rest in batches. */
93
+ private readMany;
94
+ private bytesOf;
95
+ /** undefined: not a scratch path; null: a scratch path with no file. */
96
+ private scratchFile;
97
+ private requireWritable;
98
+ private asFsError;
99
+ private relativeOrNull;
100
+ private relative;
101
+ private absolute;
102
+ private baseFor;
103
+ private warn;
104
+ private assertLive;
105
+ }
106
+ export default GameFileSystem;
107
+ //# sourceMappingURL=game-file-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-file-system.d.ts","sourceRoot":"","sources":["../../../src/fs/game-file-system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-file-system.test.d.ts","sourceRoot":"","sources":["../../../src/fs/game-file-system.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * What the bridge, the search tools and the Studio tools need from whichever
3
+ * filesystem backend this boot mounted: the mod crates
4
+ * (`CrowdyFileSystem`) or the game draft (`GameFileSystem`).
5
+ */
6
+ import type { CrowdyBootConfig } from '../crowdy/config.js';
7
+ import type { DraftChangedPayload } from '../bridge/protocol.js';
8
+ import type { ScratchStore } from './scratch-store.js';
9
+ export interface StudioFileSystem {
10
+ /** Which editor this backend serves. */
11
+ readonly studioMode: 'mod' | 'game';
12
+ readonly boot: CrowdyBootConfig;
13
+ readonly scratch: ScratchStore;
14
+ /** Virtual root the project or repository is mounted at. */
15
+ readonly mountRoot: string;
16
+ /** Where files come from, for the page's status line; undefined until known. */
17
+ readonly storeReason: string | undefined;
18
+ /** The page switched projects. */
19
+ setProject(projectId: string): void;
20
+ /** The page handed over (or refreshed) the app token. */
21
+ setToken(token: string | undefined): void;
22
+ /** Cached content may be behind the page; reload on next use. */
23
+ invalidate(): void;
24
+ /** Game editor: the page's draft changed. The mod backend ignores it. */
25
+ applyDraftChange(change: DraftChangedPayload): void;
26
+ onChange(listener: (change: {
27
+ target: 'SERVER' | 'CLIENT';
28
+ path: string;
29
+ }) => void): () => void;
30
+ onWarning(listener: (message: string) => void): () => void;
31
+ drainWarnings(): string[];
32
+ /** Every text file the in-memory glob/grep may search. */
33
+ searchSnapshot(): Promise<{
34
+ root: string;
35
+ files: Array<{
36
+ virtualPath: string;
37
+ content: string;
38
+ }>;
39
+ }>;
40
+ }
41
+ export declare function isStudioFileSystem(value: unknown): value is StudioFileSystem;
42
+ //# sourceMappingURL=studio-fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-fs.d.ts","sourceRoot":"","sources":["../../../src/fs/studio-fs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,QAAQ,CAAC,UAAU,EAAE,KAAK,GAAG,MAAM,CAAA;IACnC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;IAC9B,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,gFAAgF;IAChF,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IACxC,kCAAkC;IAClC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,yDAAyD;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAA;IACzC,iEAAiE;IACjE,UAAU,IAAI,IAAI,CAAA;IAClB,yEAAyE;IACzE,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAA;IACnD,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAC/F,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAC1D,aAAa,IAAI,MAAM,EAAE,CAAA;IACzB,0DAA0D;IAC1D,cAAc,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAA;CACpG;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAS5E"}
@@ -8,6 +8,9 @@
8
8
  */
9
9
  export { CrowdyFileSystem, default, versionOf } from './fs/crowdy-file-system.js';
10
10
  export type { Config } from './fs/crowdy-file-system.js';
11
+ export { GameFileSystem } from './fs/game-file-system.js';
12
+ export { isStudioFileSystem } from './fs/studio-fs.js';
13
+ export type { StudioFileSystem } from './fs/studio-fs.js';
11
14
  export { ScratchStore } from './fs/scratch-store.js';
12
15
  export { CrowdyApiError, CrowdyStudioClient } from './crowdy/client.js';
13
16
  export type { CrowdyFileDelete, CrowdyFileUpsert, CrowdyProject, CrowdyProjectFile, CrowdyProjectGitHub, CrowdyProjectSource, CrowdyTarget, } from './crowdy/client.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACjF,YAAY,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEpD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvE,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,GACb,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC9F,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACrH,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE9E,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACjF,YAAY,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEpD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvE,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,GACb,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC9F,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACrH,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE9E,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"search-tools.d.ts","sourceRoot":"","sources":["../../../src/search/search-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAaxC,MAAM,WAAW,MAAM;IACrB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,qDAAqD;AACrD,eAAO,MAAM,IAAI,0BAA0B,CAAA;AAE3C,yDAAyD;AACzD,eAAO,MAAM,MAAM,UAAkC,CAAA;AAErD,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAIH,CAAA;AAE1B,yEAAyE;AACzE,MAAM,WAAW,UAAU;IACzB,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,6EAA6E;AAC7E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;CACb;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CASxF;AAkBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CAWV;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOlE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,YAAY,EAAE,MAAM,GACnB,SAAS,EAAE,CAkCb;AAOD,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAYvE;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAU1F;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAOrF;AAsED;;;GAGG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8KvE"}
1
+ {"version":3,"file":"search-tools.d.ts","sourceRoot":"","sources":["../../../src/search/search-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAaxC,MAAM,WAAW,MAAM;IACrB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,qDAAqD;AACrD,eAAO,MAAM,IAAI,0BAA0B,CAAA;AAE3C,yDAAyD;AACzD,eAAO,MAAM,MAAM,UAAkC,CAAA;AAErD,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAIH,CAAA;AAE1B,yEAAyE;AACzE,MAAM,WAAW,UAAU;IACzB,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,6EAA6E;AAC7E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;CACb;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CASxF;AAkBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CAWV;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOlE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,YAAY,EAAE,MAAM,GACnB,SAAS,EAAE,CAkCb;AAOD,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAYvE;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAU1F;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAOrF;AAmED;;;GAGG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8KvE"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The game's skills, as an upstream skill provider registered by the
3
+ * `crowdy-game` preset. The page lists them from the game's playbook
4
+ * (`studio.listSkills` reads `<playbookBase>skills/index.json`) and serves
5
+ * each body as a playbook page (`studio.readPlaybook`), so the harness names
6
+ * no game and fetches nothing itself: a game that ships no playbook simply
7
+ * has no skills here.
8
+ *
9
+ * @module @crowdedkingdoms/crowdy-dsh/playbook-skills
10
+ */
11
+ import type { Context } from '@deepseek-ai/cordis';
12
+ import type { SkillProvider } from '@deepseek-ai/dsh-skill';
13
+ import type { CrowdyBridge } from '../bridge/index.js';
14
+ export declare const name = "crowdy-playbook-skills";
15
+ export declare const inject: string[];
16
+ /** The provider; exported for tests. */
17
+ export declare function playbookSkillProvider(bridge: Pick<CrowdyBridge, 'client'>): SkillProvider;
18
+ export declare function apply(ctx: Context): void;
19
+ declare const _default: {
20
+ name: string;
21
+ inject: string[];
22
+ apply: typeof apply;
23
+ };
24
+ export default _default;
25
+ //# sourceMappingURL=playbook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook.d.ts","sourceRoot":"","sources":["../../../src/skills/playbook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAuD,aAAa,EAA4B,MAAM,wBAAwB,CAAA;AAE1I,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAItD,eAAO,MAAM,IAAI,2BAA2B,CAAA;AAC5C,eAAO,MAAM,MAAM,UAA6B,CAAA;AAMhD,wCAAwC;AACxC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,aAAa,CAqDzF;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAExC;;;;;;AAED,wBAAsC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook.test.d.ts","sourceRoot":"","sources":["../../../src/skills/playbook.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Game editor tools, registered by the `crowdy-game` preset. File edits go
3
+ * through the game filesystem into the page's draft; these tools publish the
4
+ * draft, ask whether the world took it, and read the game's playbook.
5
+ *
6
+ * @module @crowdedkingdoms/crowdy-dsh/game-tools
7
+ */
8
+ import type { Context } from '@deepseek-ai/cordis';
9
+ import z from '@deepseek-ai/schemastery';
10
+ export interface Config {
11
+ /** Deadline for a commit, the player's confirmation included, in milliseconds. */
12
+ commitTimeoutMs?: number;
13
+ }
14
+ export declare const name = "crowdy-game-tools";
15
+ export declare const inject: string[];
16
+ export declare const Config: z<Config>;
17
+ export declare function apply(ctx: Context, config?: Config): Promise<void>;
18
+ declare const _default: {
19
+ name: string;
20
+ inject: string[];
21
+ Config: z<Config>;
22
+ apply: typeof apply;
23
+ };
24
+ export default _default;
25
+ //# sourceMappingURL=game.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../../../src/tools/game.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAYxC,MAAM,WAAW,MAAM;IACrB,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,eAAO,MAAM,IAAI,sBAAsB,CAAA;AACvC,eAAO,MAAM,MAAM,UAA4B,CAAA;AAE/C,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAEH,CAAA;AA4B1B,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+H5E;;;;;;;AAED,wBAA8C"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game.test.d.ts","sourceRoot":"","sources":["../../../src/tools/game.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -18,6 +18,11 @@ export interface Config {
18
18
  screenshotTimeoutMs?: number;
19
19
  /** Take a screenshot automatically after a draft test that started the client target. */
20
20
  autoScreenshot?: boolean;
21
+ /**
22
+ * Register only these tools. The game editor's preset reuses the page tools
23
+ * (screenshot, game_observe, client_logs) without the mod build tools.
24
+ */
25
+ only?: string[];
21
26
  }
22
27
  /** Cordis plugin name used by loader diagnostics. */
23
28
  export declare const name = "crowdy-tools";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAaxC,MAAM,WAAW,MAAM;IACrB,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,yFAAyF;IACzF,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,qDAAqD;AACrD,eAAO,MAAM,IAAI,iBAAiB,CAAA;AAElC,eAAO,MAAM,MAAM,UAAkC,CAAA;AAErD,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAIH,CAAA;AAoD1B,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAwY5E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAaxC,MAAM,WAAW,MAAM;IACrB,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,yFAAyF;IACzF,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,qDAAqD;AACrD,eAAO,MAAM,IAAI,iBAAiB,CAAA;AAElC,eAAO,MAAM,MAAM,UAAkC,CAAA;AAErD,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CAKH,CAAA;AAoD1B,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+Y5E"}
@@ -5214,6 +5214,11 @@ var CrowdyStudioGitHubBindInitial;
5214
5214
  CrowdyStudioGitHubBindInitial2["PushProject"] = "PUSH_PROJECT";
5215
5215
  CrowdyStudioGitHubBindInitial2["TakeRepository"] = "TAKE_REPOSITORY";
5216
5216
  })(CrowdyStudioGitHubBindInitial || (CrowdyStudioGitHubBindInitial = {}));
5217
+ var CrowdyStudioGitHubLayoutKind;
5218
+ (function(CrowdyStudioGitHubLayoutKind2) {
5219
+ CrowdyStudioGitHubLayoutKind2["ConstructGame"] = "CONSTRUCT_GAME";
5220
+ CrowdyStudioGitHubLayoutKind2["StudioCrates"] = "STUDIO_CRATES";
5221
+ })(CrowdyStudioGitHubLayoutKind || (CrowdyStudioGitHubLayoutKind = {}));
5217
5222
  var CrowdyStudioImportSource;
5218
5223
  (function(CrowdyStudioImportSource2) {
5219
5224
  CrowdyStudioImportSource2["Common"] = "COMMON";
@@ -5495,7 +5500,7 @@ var ExecConnectDocument = { "kind": "Document", "definitions": [{ "kind": "Opera
5495
5500
  var ExecDeployDocument = { "kind": "Document", "definitions": [{ "kind": "OperationDefinition", "operation": "mutation", "name": { "kind": "Name", "value": "ExecDeploy" }, "variableDefinitions": [{ "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "input" } }, "type": { "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "ExecDeployInput" } } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "execDeploy" }, "arguments": [{ "kind": "Argument", "name": { "kind": "Name", "value": "input" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "input" } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "version" } }] } }] } }] };
5496
5501
  var ExecConnectAsDeveloperDocument = { "kind": "Document", "definitions": [{ "kind": "OperationDefinition", "operation": "mutation", "name": { "kind": "Name", "value": "ExecConnectAsDeveloper" }, "variableDefinitions": [{ "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } }, "type": { "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "BigInt" } } } }, { "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "nodeType" } }, "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "String" } } }, { "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "key" } }, "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "String" } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "execConnectAsDeveloper" }, "arguments": [{ "kind": "Argument", "name": { "kind": "Name", "value": "appId" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } } }, { "kind": "Argument", "name": { "kind": "Name", "value": "nodeType" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "nodeType" } } }, { "kind": "Argument", "name": { "kind": "Name", "value": "key" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "key" } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "gatewayUrl" } }, { "kind": "Field", "name": { "kind": "Name", "value": "token" } }, { "kind": "Field", "name": { "kind": "Name", "value": "host" } }, { "kind": "Field", "name": { "kind": "Name", "value": "expiresAt" } }] } }] } }] };
5497
5502
  var ExecLogsDocument = { "kind": "Document", "definitions": [{ "kind": "OperationDefinition", "operation": "query", "name": { "kind": "Name", "value": "ExecLogs" }, "variableDefinitions": [{ "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } }, "type": { "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "BigInt" } } } }, { "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "nodeType" } }, "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "String" } } }, { "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "key" } }, "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "String" } } }, { "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "maxLevel" } }, "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "Int" } } }, { "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "before" } }, "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "String" } } }, { "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "limit" } }, "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "Int" } } }, { "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "flow" } }, "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "String" } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "execLogs" }, "arguments": [{ "kind": "Argument", "name": { "kind": "Name", "value": "appId" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } } }, { "kind": "Argument", "name": { "kind": "Name", "value": "nodeType" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "nodeType" } } }, { "kind": "Argument", "name": { "kind": "Name", "value": "key" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "key" } } }, { "kind": "Argument", "name": { "kind": "Name", "value": "maxLevel" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "maxLevel" } } }, { "kind": "Argument", "name": { "kind": "Name", "value": "before" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "before" } } }, { "kind": "Argument", "name": { "kind": "Name", "value": "limit" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "limit" } } }, { "kind": "Argument", "name": { "kind": "Name", "value": "flow" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "flow" } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "id" } }, { "kind": "Field", "name": { "kind": "Name", "value": "nodeType" } }, { "kind": "Field", "name": { "kind": "Name", "value": "key" } }, { "kind": "Field", "name": { "kind": "Name", "value": "level" } }, { "kind": "Field", "name": { "kind": "Name", "value": "host" } }, { "kind": "Field", "name": { "kind": "Name", "value": "at" } }, { "kind": "Field", "name": { "kind": "Name", "value": "text" } }, { "kind": "Field", "name": { "kind": "Name", "value": "flow" } }] } }] } }] };
5498
- var ExecInstancesDocument = { "kind": "Document", "definitions": [{ "kind": "OperationDefinition", "operation": "query", "name": { "kind": "Name", "value": "ExecInstances" }, "variableDefinitions": [{ "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } }, "type": { "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "BigInt" } } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "execInstances" }, "arguments": [{ "kind": "Argument", "name": { "kind": "Name", "value": "appId" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "instanceId" } }, { "kind": "Field", "name": { "kind": "Name", "value": "nodeType" } }, { "kind": "Field", "name": { "kind": "Name", "value": "key" } }, { "kind": "Field", "name": { "kind": "Name", "value": "kind" } }, { "kind": "Field", "name": { "kind": "Name", "value": "phase" } }, { "kind": "Field", "name": { "kind": "Name", "value": "host" } }, { "kind": "Field", "name": { "kind": "Name", "value": "epoch" } }, { "kind": "Field", "name": { "kind": "Name", "value": "sinceMs" } }, { "kind": "Field", "name": { "kind": "Name", "value": "heldBack" } }] } }] } }] };
5503
+ var ExecInstancesDocument = { "kind": "Document", "definitions": [{ "kind": "OperationDefinition", "operation": "query", "name": { "kind": "Name", "value": "ExecInstances" }, "variableDefinitions": [{ "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } }, "type": { "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "BigInt" } } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "execInstances" }, "arguments": [{ "kind": "Argument", "name": { "kind": "Name", "value": "appId" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "instanceId" } }, { "kind": "Field", "name": { "kind": "Name", "value": "nodeType" } }, { "kind": "Field", "name": { "kind": "Name", "value": "key" } }, { "kind": "Field", "name": { "kind": "Name", "value": "kind" } }, { "kind": "Field", "name": { "kind": "Name", "value": "phase" } }, { "kind": "Field", "name": { "kind": "Name", "value": "host" } }, { "kind": "Field", "name": { "kind": "Name", "value": "epoch" } }, { "kind": "Field", "name": { "kind": "Name", "value": "sinceMs" } }, { "kind": "Field", "name": { "kind": "Name", "value": "heldBack" } }, { "kind": "Field", "name": { "kind": "Name", "value": "orphaned" } }] } }] } }] };
5499
5504
  var ExecVersionsDocument = { "kind": "Document", "definitions": [{ "kind": "OperationDefinition", "operation": "query", "name": { "kind": "Name", "value": "ExecVersions" }, "variableDefinitions": [{ "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } }, "type": { "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "BigInt" } } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "execVersions" }, "arguments": [{ "kind": "Argument", "name": { "kind": "Name", "value": "appId" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "version" } }, { "kind": "Field", "name": { "kind": "Name", "value": "createdBy" } }, { "kind": "Field", "name": { "kind": "Name", "value": "createdAt" } }, { "kind": "Field", "name": { "kind": "Name", "value": "types" } }, { "kind": "Field", "name": { "kind": "Name", "value": "active" } }, { "kind": "Field", "name": { "kind": "Name", "value": "manifestJson" } }] } }] } }] };
5500
5505
  var ExecEndpointStatsDocument = { "kind": "Document", "definitions": [{ "kind": "OperationDefinition", "operation": "query", "name": { "kind": "Name", "value": "ExecEndpointStats" }, "variableDefinitions": [{ "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } }, "type": { "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "BigInt" } } } }, { "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "nodeType" } }, "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "String" } } }, { "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "sinceMinutes" } }, "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "Int" } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "execEndpointStats" }, "arguments": [{ "kind": "Argument", "name": { "kind": "Name", "value": "appId" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } } }, { "kind": "Argument", "name": { "kind": "Name", "value": "nodeType" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "nodeType" } } }, { "kind": "Argument", "name": { "kind": "Name", "value": "sinceMinutes" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "sinceMinutes" } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "nodeType" } }, { "kind": "Field", "name": { "kind": "Name", "value": "method" } }, { "kind": "Field", "name": { "kind": "Name", "value": "calls" } }, { "kind": "Field", "name": { "kind": "Name", "value": "appErrors" } }, { "kind": "Field", "name": { "kind": "Name", "value": "busy" } }, { "kind": "Field", "name": { "kind": "Name", "value": "denied" } }, { "kind": "Field", "name": { "kind": "Name", "value": "deadlineExceeded" } }, { "kind": "Field", "name": { "kind": "Name", "value": "otherErrors" } }, { "kind": "Field", "name": { "kind": "Name", "value": "timedCalls" } }, { "kind": "Field", "name": { "kind": "Name", "value": "latencyMsAvg" } }, { "kind": "Field", "name": { "kind": "Name", "value": "latencyMsMax" } }, { "kind": "Field", "name": { "kind": "Name", "value": "firstMinute" } }, { "kind": "Field", "name": { "kind": "Name", "value": "lastMinute" } }] } }] } }] };
5501
5506
  var ExecAppStatusDocument = { "kind": "Document", "definitions": [{ "kind": "OperationDefinition", "operation": "query", "name": { "kind": "Name", "value": "ExecAppStatus" }, "variableDefinitions": [{ "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } }, "type": { "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "BigInt" } } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "execAppStatus" }, "arguments": [{ "kind": "Argument", "name": { "kind": "Name", "value": "appId" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "appId" } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "FragmentSpread", "name": { "kind": "Name", "value": "ExecAppStatusFields" } }] } }] } }, { "kind": "FragmentDefinition", "name": { "kind": "Name", "value": "ExecAppStatusFields" }, "typeCondition": { "kind": "NamedType", "name": { "kind": "Name", "value": "ExecAppStatus" } }, "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "activeVersion" } }, { "kind": "Field", "name": { "kind": "Name", "value": "disabled" } }, { "kind": "Field", "name": { "kind": "Name", "value": "disabledTypes" } }, { "kind": "Field", "name": { "kind": "Name", "value": "budgetPaused" } }, { "kind": "Field", "name": { "kind": "Name", "value": "budgetPauseReason" } }, { "kind": "Field", "name": { "kind": "Name", "value": "maxInstances" } }, { "kind": "Field", "name": { "kind": "Name", "value": "maxReservedMb" } }, { "kind": "Field", "name": { "kind": "Name", "value": "instanceLimit" } }, { "kind": "Field", "name": { "kind": "Name", "value": "instances" } }, { "kind": "Field", "name": { "kind": "Name", "value": "reservedMb" } }] } }] };
@@ -10055,8 +10060,10 @@ var ExecAPI = class {
10055
10060
  return strip(data.execAppStatus);
10056
10061
  }
10057
10062
  /**
10058
- * Makes an earlier version active again, a rollback; instances pick it up when they
10059
- * next start. Requires `manage_compute`.
10063
+ * Makes an earlier version active again, a rollback. As after a deploy, instances of the
10064
+ * types it keeps pick it up when they next start, and those of a type it lacks are
10065
+ * persisted and stopped at once; a type it lacks leaves the switched-off list. Requires
10066
+ * `manage_compute`.
10060
10067
  */
10061
10068
  async activateVersion(appId, version) {
10062
10069
  const data = await this.graphql.request(ExecActivateVersionDocument, { appId, version });
@@ -10064,8 +10071,9 @@ var ExecAPI = class {
10064
10071
  }
10065
10072
  /**
10066
10073
  * The kill switch, for the whole app or one node type. Off: nothing of it is placed,
10067
- * what runs is persisted and stopped, and calls are refused with `Denied`. Requires
10068
- * `manage_compute`.
10074
+ * what runs is persisted and stopped, and calls are refused with `Denied`. A type's switch
10075
+ * lasts while the active version deploys the type: a deploy or a rollback that drops the
10076
+ * type drops its switch. Requires `manage_compute`.
10069
10077
  */
10070
10078
  async setEnabled(appId, enabled, nodeType) {
10071
10079
  const data = await this.graphql.request(ExecSetEnabledDocument, { appId, enabled, nodeType });
@@ -10074,8 +10082,9 @@ var ExecAPI = class {
10074
10082
  /**
10075
10083
  * Moves one node type's running instances to the app's active version: each is
10076
10084
  * persisted and stopped, and starts again on the active version at its next
10077
- * call. A deploy changes what NEW instances run; this moves the running ones
10078
- * without switching the type off. Requires `manage_compute`.
10085
+ * call. A deploy changes what NEW instances run, and stops those of a type it drops
10086
+ * itself; this moves the running ones of a type it keeps without switching the type
10087
+ * off. Requires `manage_compute`.
10079
10088
  *
10080
10089
  * @returns The node type and how many instances were stopped.
10081
10090
  */
@@ -10427,8 +10436,10 @@ var ExecAPI = class {
10427
10436
  /**
10428
10437
  * Deploys a new version of the app's nodes and makes it active: the manifest, and
10429
10438
  * each distinct module once. A type gives its module as `wasm`, or names a `crate` of
10430
- * `buildId`, whose modules the platform already holds. Running instances pick it up
10431
- * when they next start. Requires the org `manage_compute` permission.
10439
+ * `buildId`, whose modules the platform already holds. Running instances of the types
10440
+ * it keeps pick it up when they next start; those of a type it drops are persisted and
10441
+ * stopped at once, and the type leaves the switched-off list. Requires the org
10442
+ * `manage_compute` permission.
10432
10443
  */
10433
10444
  async deploy(options) {
10434
10445
  const types = {};
@@ -18103,7 +18114,17 @@ var REFRESH = `
18103
18114
  `;
18104
18115
  var LAYOUT = `
18105
18116
  query CrowdyStudioGitHubLayout($input: CrowdyStudioGitHubAtCommitInput!) {
18106
- crowdyStudioGitHubLayout(input: $input) { commitSha server client assets fromFile }
18117
+ crowdyStudioGitHubLayout(input: $input) { commitSha server client assets fromFile kind }
18118
+ }
18119
+ `;
18120
+ var FILES = `
18121
+ query CrowdyStudioGitHubFiles($input: CrowdyStudioGitHubFilesInput!) {
18122
+ crowdyStudioGitHubFiles(input: $input) { commitSha missing files { path sha size binary content } }
18123
+ }
18124
+ `;
18125
+ var COMMIT_FILES = `
18126
+ mutation CrowdyStudioGitHubCommitFiles($input: CrowdyStudioGitHubCommitFilesInput!) {
18127
+ crowdyStudioGitHubCommitFiles(input: $input) { commitSha parentSha written deleted }
18107
18128
  }
18108
18129
  `;
18109
18130
  var TREE = `
@@ -18193,6 +18214,25 @@ var CrowdyStudioGitHubTransport = class {
18193
18214
  });
18194
18215
  return data.crowdyStudioGitHubPutFile;
18195
18216
  }
18217
+ /**
18218
+ * Up to 100 files at one commit (default: the mirror commit) for one
18219
+ * operation against the per-user GitHub budget. Paths that are not files
18220
+ * there come back in `missing`; binary or oversize blobs with `content: null`.
18221
+ */
18222
+ async getFiles(input) {
18223
+ const data = await this.graphql.query(FILES, { input });
18224
+ return data.crowdyStudioGitHubFiles;
18225
+ }
18226
+ /**
18227
+ * Up to 100 writes and deletions as ONE commit on top of `expectedCommitSha`
18228
+ * (the project's `github.sha`). A moved project or branch is refused with
18229
+ * GITHUB_STALE_SHA and nothing is written; the returned `commitSha` is the new
18230
+ * `github.sha`.
18231
+ */
18232
+ async commitFiles(input) {
18233
+ const data = await this.graphql.query(COMMIT_FILES, { input });
18234
+ return data.crowdyStudioGitHubCommitFiles;
18235
+ }
18196
18236
  /** Delete one file from the bound branch under the same guards as {@link putFile}. */
18197
18237
  async deleteFile(input) {
18198
18238
  const data = await this.graphql.query(DELETE_FILE, { input });
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@crowdedkingdoms/crowdyjs",
3
- "version": "18.21.0",
3
+ "version": "18.23.0-dev.1",
4
4
  "source": "node_modules"
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crowdedkingdoms/crowdy-dsh",
3
- "version": "0.4.14",
3
+ "version": "0.5.0-dev.1",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -22,8 +22,12 @@
22
22
  "default": "./lib/index.js"
23
23
  },
24
24
  "./fs": {
25
- "types": "./lib/types/fs/crowdy-file-system.d.ts",
26
- "default": "./lib/fs/crowdy-file-system.js"
25
+ "types": "./lib/types/fs/entry.d.ts",
26
+ "default": "./lib/fs/entry.js"
27
+ },
28
+ "./bridge-client": {
29
+ "types": "./lib/types/bridge/client-service.d.ts",
30
+ "default": "./lib/bridge/client-service.js"
27
31
  },
28
32
  "./search": {
29
33
  "types": "./lib/types/search/search-tools.d.ts",
@@ -37,6 +41,14 @@
37
41
  "types": "./lib/types/tools/index.d.ts",
38
42
  "default": "./lib/tools/index.js"
39
43
  },
44
+ "./game-tools": {
45
+ "types": "./lib/types/tools/game.d.ts",
46
+ "default": "./lib/tools/game.js"
47
+ },
48
+ "./playbook-skills": {
49
+ "types": "./lib/types/skills/playbook.d.ts",
50
+ "default": "./lib/skills/playbook.js"
51
+ },
40
52
  "./attachments": {
41
53
  "types": "./lib/types/attachments/crowdy-attachment-store.d.ts",
42
54
  "default": "./lib/attachments/crowdy-attachment-store.js"
@@ -66,7 +78,8 @@
66
78
  "@deepseek-ai/dsh-llm": "*",
67
79
  "@deepseek-ai/dsh-tools": "*",
68
80
  "@deepseek-ai/dsh-user-approval": "*",
69
- "@deepseek-ai/schemastery": "*"
81
+ "@deepseek-ai/schemastery": "*",
82
+ "@deepseek-ai/dsh-skill": "*"
70
83
  },
71
84
  "peerDependenciesMeta": {
72
85
  "@deepseek-ai/cordis": {
@@ -89,16 +102,19 @@
89
102
  },
90
103
  "@deepseek-ai/schemastery": {
91
104
  "optional": true
105
+ },
106
+ "@deepseek-ai/dsh-skill": {
107
+ "optional": true
92
108
  }
93
109
  },
94
110
  "crowdyDsh": {
95
111
  "build": {
96
112
  "package": "@crowdedkingdoms/crowdy-dsh",
97
- "version": "0.4.14",
98
- "builtAt": "2026-10-25T20:20:13.036Z",
113
+ "version": "0.5.0",
114
+ "builtAt": "2026-10-29T18:46:30.824Z",
99
115
  "source": {
100
116
  "repository": "CrowdedKingdoms/crowdy-dsh",
101
- "commit": "38139f89aebc8d210d10cb4f50dd23e96d21549e",
117
+ "commit": "c92aba4652a01e190173d08d38cb8cc3aa72feaa",
102
118
  "dirty": false
103
119
  },
104
120
  "upstream": {
@@ -109,7 +125,7 @@
109
125
  },
110
126
  "crowdyjs": {
111
127
  "name": "@crowdedkingdoms/crowdyjs",
112
- "version": "18.21.0",
128
+ "version": "18.23.0-dev.1",
113
129
  "source": "node_modules"
114
130
  },
115
131
  "files": {
@@ -206,7 +222,7 @@
206
222
  "manifest.webmanifest": "sha256:9b54d57eea00f2fdd1affe6e7999a4209a515755f12ac1a3299da2d55e178d4c",
207
223
  "preview/bootstrap-CYECZNXt.js": "sha256:9f303a0485c0badfdd19fad0c357ef050c5b9a343744ab5bf0c70015e7d95092",
208
224
  "preview/crowdy-boot-Cklh1qNl.js": "sha256:b21e8eb126e1cd8a52159d2d577e610df6c8af36a436f9ed5028cfabd11a85ff",
209
- "preview/vfs-image.tar.gz": "sha256:eee43b1480defda80426977e6566defaef7a0314bbdc259683b98e958e6db6c4",
225
+ "preview/vfs-image.tar.gz": "sha256:4a0db11a886375b333ab3ce340d363a7ae49d6b69aa76e8595842a9cf98c94d0",
210
226
  "preview/worker-C8-_ANaz.js": "sha256:81099e5732dfe0c32bacd5897316b7956c5a0a22da01b4a0c6e21d0a3b9d9aa1"
211
227
  }
212
228
  }
@@ -13,6 +13,7 @@
13
13
  # deliberately NOT through `ctx.fs`. The Crowdy
14
14
  # search plugin registers the same names in memory.
15
15
  # tool-jobs, skill-* — background jobs and skill discovery walk local roots.
16
+ # The game editor's preset (`crowdy-game`) has skills.
16
17
  # tool-web — the platform's model endpoint forbids provider web
17
18
  # plugins; the harness gets no browser either.
18
19
  # delegation — subagents are a later cut (each one costs the