threenative-asset-mcp 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/README.md +441 -0
  2. package/dist/ambientcg/client.d.ts +61 -0
  3. package/dist/ambientcg/client.d.ts.map +1 -0
  4. package/dist/ambientcg/client.js +234 -0
  5. package/dist/ambientcg/client.js.map +1 -0
  6. package/dist/audio/catalog.d.ts +36 -0
  7. package/dist/audio/catalog.d.ts.map +1 -0
  8. package/dist/audio/catalog.js +169 -0
  9. package/dist/audio/catalog.js.map +1 -0
  10. package/dist/audio/client.d.ts +46 -0
  11. package/dist/audio/client.d.ts.map +1 -0
  12. package/dist/audio/client.js +196 -0
  13. package/dist/audio/client.js.map +1 -0
  14. package/dist/bundle/client.d.ts +89 -0
  15. package/dist/bundle/client.d.ts.map +1 -0
  16. package/dist/bundle/client.js +324 -0
  17. package/dist/bundle/client.js.map +1 -0
  18. package/dist/config.d.ts +20 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +130 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/download/direct-asset-downloader.d.ts +41 -0
  23. package/dist/download/direct-asset-downloader.d.ts.map +1 -0
  24. package/dist/download/direct-asset-downloader.js +232 -0
  25. package/dist/download/direct-asset-downloader.js.map +1 -0
  26. package/dist/fab/api-download.d.ts +30 -0
  27. package/dist/fab/api-download.d.ts.map +1 -0
  28. package/dist/fab/api-download.js +200 -0
  29. package/dist/fab/api-download.js.map +1 -0
  30. package/dist/fab/browser-transport.d.ts +79 -0
  31. package/dist/fab/browser-transport.d.ts.map +1 -0
  32. package/dist/fab/browser-transport.js +492 -0
  33. package/dist/fab/browser-transport.js.map +1 -0
  34. package/dist/fab/cache.d.ts +22 -0
  35. package/dist/fab/cache.d.ts.map +1 -0
  36. package/dist/fab/cache.js +55 -0
  37. package/dist/fab/cache.js.map +1 -0
  38. package/dist/fab/client.d.ts +61 -0
  39. package/dist/fab/client.d.ts.map +1 -0
  40. package/dist/fab/client.js +868 -0
  41. package/dist/fab/client.js.map +1 -0
  42. package/dist/fab/direct-transport.d.ts +68 -0
  43. package/dist/fab/direct-transport.d.ts.map +1 -0
  44. package/dist/fab/direct-transport.js +184 -0
  45. package/dist/fab/direct-transport.js.map +1 -0
  46. package/dist/fab/download-store.d.ts +21 -0
  47. package/dist/fab/download-store.d.ts.map +1 -0
  48. package/dist/fab/download-store.js +93 -0
  49. package/dist/fab/download-store.js.map +1 -0
  50. package/dist/fab/errors.d.ts +20 -0
  51. package/dist/fab/errors.d.ts.map +1 -0
  52. package/dist/fab/errors.js +65 -0
  53. package/dist/fab/errors.js.map +1 -0
  54. package/dist/fab/impersonate-fetch.d.ts +48 -0
  55. package/dist/fab/impersonate-fetch.d.ts.map +1 -0
  56. package/dist/fab/impersonate-fetch.js +228 -0
  57. package/dist/fab/impersonate-fetch.js.map +1 -0
  58. package/dist/fab/normalize.d.ts +3 -0
  59. package/dist/fab/normalize.d.ts.map +1 -0
  60. package/dist/fab/normalize.js +285 -0
  61. package/dist/fab/normalize.js.map +1 -0
  62. package/dist/fab/schemas.d.ts +10 -0
  63. package/dist/fab/schemas.d.ts.map +1 -0
  64. package/dist/fab/schemas.js +105 -0
  65. package/dist/fab/schemas.js.map +1 -0
  66. package/dist/index.d.ts +3 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +58 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/itch/catalog.d.ts +13 -0
  71. package/dist/itch/catalog.d.ts.map +1 -0
  72. package/dist/itch/catalog.js +50 -0
  73. package/dist/itch/catalog.js.map +1 -0
  74. package/dist/itch/client.d.ts +46 -0
  75. package/dist/itch/client.d.ts.map +1 -0
  76. package/dist/itch/client.js +175 -0
  77. package/dist/itch/client.js.map +1 -0
  78. package/dist/polyhaven/client.d.ts +55 -0
  79. package/dist/polyhaven/client.d.ts.map +1 -0
  80. package/dist/polyhaven/client.js +210 -0
  81. package/dist/polyhaven/client.js.map +1 -0
  82. package/dist/server.d.ts +25 -0
  83. package/dist/server.d.ts.map +1 -0
  84. package/dist/server.js +448 -0
  85. package/dist/server.js.map +1 -0
  86. package/dist/sketchfab/client.d.ts +70 -0
  87. package/dist/sketchfab/client.d.ts.map +1 -0
  88. package/dist/sketchfab/client.js +255 -0
  89. package/dist/sketchfab/client.js.map +1 -0
  90. package/dist/smithsonian/client.d.ts +32 -0
  91. package/dist/smithsonian/client.d.ts.map +1 -0
  92. package/dist/smithsonian/client.js +142 -0
  93. package/dist/smithsonian/client.js.map +1 -0
  94. package/dist/tools/ambientcg.d.ts +296 -0
  95. package/dist/tools/ambientcg.d.ts.map +1 -0
  96. package/dist/tools/ambientcg.js +183 -0
  97. package/dist/tools/ambientcg.js.map +1 -0
  98. package/dist/tools/audio.d.ts +211 -0
  99. package/dist/tools/audio.d.ts.map +1 -0
  100. package/dist/tools/audio.js +156 -0
  101. package/dist/tools/audio.js.map +1 -0
  102. package/dist/tools/bundle.d.ts +237 -0
  103. package/dist/tools/bundle.d.ts.map +1 -0
  104. package/dist/tools/bundle.js +206 -0
  105. package/dist/tools/bundle.js.map +1 -0
  106. package/dist/tools/direct-download.d.ts +53 -0
  107. package/dist/tools/direct-download.d.ts.map +1 -0
  108. package/dist/tools/direct-download.js +68 -0
  109. package/dist/tools/direct-download.js.map +1 -0
  110. package/dist/tools/download-free-asset.d.ts +66 -0
  111. package/dist/tools/download-free-asset.d.ts.map +1 -0
  112. package/dist/tools/download-free-asset.js +60 -0
  113. package/dist/tools/download-free-asset.js.map +1 -0
  114. package/dist/tools/get-asset.d.ts +161 -0
  115. package/dist/tools/get-asset.d.ts.map +1 -0
  116. package/dist/tools/get-asset.js +131 -0
  117. package/dist/tools/get-asset.js.map +1 -0
  118. package/dist/tools/itch.d.ts +120 -0
  119. package/dist/tools/itch.d.ts.map +1 -0
  120. package/dist/tools/itch.js +120 -0
  121. package/dist/tools/itch.js.map +1 -0
  122. package/dist/tools/list-filters.d.ts +127 -0
  123. package/dist/tools/list-filters.d.ts.map +1 -0
  124. package/dist/tools/list-filters.js +68 -0
  125. package/dist/tools/list-filters.js.map +1 -0
  126. package/dist/tools/list-limited-time-free.d.ts +57 -0
  127. package/dist/tools/list-limited-time-free.d.ts.map +1 -0
  128. package/dist/tools/list-limited-time-free.js +47 -0
  129. package/dist/tools/list-limited-time-free.js.map +1 -0
  130. package/dist/tools/polyhaven.d.ts +266 -0
  131. package/dist/tools/polyhaven.d.ts.map +1 -0
  132. package/dist/tools/polyhaven.js +233 -0
  133. package/dist/tools/polyhaven.js.map +1 -0
  134. package/dist/tools/search-assets.d.ts +176 -0
  135. package/dist/tools/search-assets.d.ts.map +1 -0
  136. package/dist/tools/search-assets.js +172 -0
  137. package/dist/tools/search-assets.js.map +1 -0
  138. package/dist/tools/sketchfab.d.ts +325 -0
  139. package/dist/tools/sketchfab.d.ts.map +1 -0
  140. package/dist/tools/sketchfab.js +203 -0
  141. package/dist/tools/sketchfab.js.map +1 -0
  142. package/dist/tools/smithsonian.d.ts +189 -0
  143. package/dist/tools/smithsonian.d.ts.map +1 -0
  144. package/dist/tools/smithsonian.js +189 -0
  145. package/dist/tools/smithsonian.js.map +1 -0
  146. package/dist/tools/source-directory.d.ts +226 -0
  147. package/dist/tools/source-directory.d.ts.map +1 -0
  148. package/dist/tools/source-directory.js +583 -0
  149. package/dist/tools/source-directory.js.map +1 -0
  150. package/package.json +69 -0
@@ -0,0 +1,234 @@
1
+ const API_BASE = "https://ambientcg.com/api/v3";
2
+ const TIMEOUT_MS = 20_000;
3
+ export const AMBIENTCG_TYPES = [
4
+ "material",
5
+ "hdri",
6
+ "substance",
7
+ "decal",
8
+ "atlas",
9
+ "3d-model",
10
+ "plain-image",
11
+ "brush",
12
+ "terrain",
13
+ "hdri-element",
14
+ ];
15
+ export class AmbientCgClientError extends Error {
16
+ code;
17
+ retryable;
18
+ constructor(code, message, retryable = false) {
19
+ super(message);
20
+ this.code = code;
21
+ this.retryable = retryable;
22
+ this.name = "AmbientCgClientError";
23
+ }
24
+ }
25
+ function record(value) {
26
+ return typeof value === "object" && value !== null && !Array.isArray(value)
27
+ ? value
28
+ : undefined;
29
+ }
30
+ function text(value, max = 12_000) {
31
+ return typeof value === "string" && value.length > 0
32
+ ? value.slice(0, max)
33
+ : undefined;
34
+ }
35
+ function number(value) {
36
+ return typeof value === "number" && Number.isFinite(value)
37
+ ? value
38
+ : undefined;
39
+ }
40
+ function isType(value) {
41
+ return (typeof value === "string" &&
42
+ AMBIENTCG_TYPES.includes(value));
43
+ }
44
+ function normalizeDownload(value) {
45
+ const item = record(value);
46
+ const attributes = text(item?.attributes, 100);
47
+ const extension = text(item?.extension, 20);
48
+ const url = text(item?.url, 2_048);
49
+ const sizeBytes = number(item?.size);
50
+ if (!attributes || !extension || !url || sizeBytes === undefined)
51
+ return;
52
+ try {
53
+ const parsed = new URL(url);
54
+ if (parsed.protocol !== "https:" || parsed.hostname !== "ambientcg.com") {
55
+ return;
56
+ }
57
+ }
58
+ catch {
59
+ return;
60
+ }
61
+ return { attributes, extension, url, sizeBytes };
62
+ }
63
+ function normalizeAsset(value) {
64
+ const item = record(value);
65
+ const id = text(item?.id, 200);
66
+ const type = item?.type;
67
+ const title = text(item?.title, 500);
68
+ const url = text(item?.url, 2_048);
69
+ if (!id || !isType(type) || !title || !url) {
70
+ throw new AmbientCgClientError("AMBIENTCG_UPSTREAM_CHANGED", "ambientCG returned invalid asset metadata.");
71
+ }
72
+ const descriptions = [
73
+ text(item?.longDescription),
74
+ text(item?.shortDescription),
75
+ ];
76
+ const description = descriptions.find((entry) => entry !== undefined);
77
+ const statistics = record(item?.downloadStatistics);
78
+ const dimensions = record(item?.dimensions);
79
+ const thumbnails = record(item?.thumbnails);
80
+ const thumbnailUrl = text(thumbnails?.["512-WEBP"], 2_048) ??
81
+ text(thumbnails?.["512-PNG"], 2_048) ??
82
+ text(thumbnails?.["256-WEBP"], 2_048);
83
+ const downloads = Array.isArray(item?.downloads)
84
+ ? item.downloads
85
+ .map(normalizeDownload)
86
+ .filter((entry) => entry !== undefined)
87
+ .slice(0, 500)
88
+ : [];
89
+ return {
90
+ id,
91
+ type,
92
+ title,
93
+ url,
94
+ tags: Array.isArray(item?.tags)
95
+ ? item.tags
96
+ .filter((entry) => typeof entry === "string")
97
+ .map((entry) => entry.slice(0, 100))
98
+ .slice(0, 100)
99
+ : [],
100
+ maps: Array.isArray(item?.maps)
101
+ ? item.maps
102
+ .filter((entry) => typeof entry === "string")
103
+ .map((entry) => entry.slice(0, 100))
104
+ .slice(0, 100)
105
+ : [],
106
+ downloads,
107
+ ...(description ? { description } : {}),
108
+ ...(text(item?.releaseDate, 20)
109
+ ? { releaseDate: text(item?.releaseDate, 20) }
110
+ : {}),
111
+ ...(text(item?.technique, 100)
112
+ ? { technique: text(item?.technique, 100) }
113
+ : {}),
114
+ ...(number(statistics?.total) !== undefined
115
+ ? { downloadCount: number(statistics?.total) }
116
+ : {}),
117
+ ...(thumbnailUrl ? { thumbnailUrl } : {}),
118
+ ...(dimensions &&
119
+ number(dimensions.width) !== undefined &&
120
+ number(dimensions.height) !== undefined &&
121
+ number(dimensions.depth) !== undefined
122
+ ? {
123
+ dimensions: {
124
+ width: number(dimensions.width),
125
+ height: number(dimensions.height),
126
+ depth: number(dimensions.depth),
127
+ },
128
+ }
129
+ : {}),
130
+ };
131
+ }
132
+ export class AmbientCgClient {
133
+ fetchImpl;
134
+ constructor(fetchImpl = fetch) {
135
+ this.fetchImpl = fetchImpl;
136
+ }
137
+ async request(path) {
138
+ let response;
139
+ try {
140
+ response = await this.fetchImpl(`${API_BASE}${path}`, {
141
+ headers: {
142
+ accept: "application/json",
143
+ "user-agent": "threenative-asset-mcp/0.4.0",
144
+ },
145
+ signal: AbortSignal.timeout(TIMEOUT_MS),
146
+ });
147
+ }
148
+ catch {
149
+ throw new AmbientCgClientError("AMBIENTCG_UPSTREAM_UNAVAILABLE", "ambientCG could not be reached.", true);
150
+ }
151
+ if (response.status === 429) {
152
+ throw new AmbientCgClientError("AMBIENTCG_RATE_LIMITED", "ambientCG rate-limited the request.", true);
153
+ }
154
+ if (!response.ok) {
155
+ throw new AmbientCgClientError("AMBIENTCG_UPSTREAM_UNAVAILABLE", `ambientCG returned HTTP ${response.status}.`, response.status >= 500);
156
+ }
157
+ try {
158
+ return (await response.json());
159
+ }
160
+ catch {
161
+ throw new AmbientCgClientError("AMBIENTCG_UPSTREAM_CHANGED", "ambientCG returned invalid JSON.");
162
+ }
163
+ }
164
+ async search(input) {
165
+ const params = new URLSearchParams({
166
+ sort: input.sort,
167
+ limit: String(input.limit),
168
+ offset: String(input.offset),
169
+ include: [
170
+ "type",
171
+ "releaseDate",
172
+ "shortDescription",
173
+ "title",
174
+ "url",
175
+ "tags",
176
+ "dimensions",
177
+ "downloadStatistics",
178
+ "technique",
179
+ "maps",
180
+ "thumbnails",
181
+ ...(input.includeDownloads ? ["downloads"] : []),
182
+ ].join(","),
183
+ });
184
+ if (input.query)
185
+ params.set("q", input.query);
186
+ if (input.type)
187
+ params.set("type", input.type);
188
+ const payload = record(await this.request(`/assets?${params}`));
189
+ const assets = Array.isArray(payload?.assets)
190
+ ? payload.assets.map(normalizeAsset)
191
+ : undefined;
192
+ const total = number(payload?.totalResults);
193
+ if (!assets || total === undefined) {
194
+ throw new AmbientCgClientError("AMBIENTCG_UPSTREAM_CHANGED", "ambientCG returned an invalid search result.");
195
+ }
196
+ return {
197
+ assets,
198
+ total,
199
+ ...(input.offset + assets.length < total
200
+ ? { nextOffset: input.offset + assets.length }
201
+ : {}),
202
+ };
203
+ }
204
+ async getAsset(id) {
205
+ const params = new URLSearchParams({
206
+ id,
207
+ limit: "1",
208
+ include: "type,releaseDate,shortDescription,longDescription,title,url,tags,dimensions,downloadStatistics,downloads,technique,maps,thumbnails",
209
+ });
210
+ const payload = record(await this.request(`/assets?${params}`));
211
+ const first = Array.isArray(payload?.assets) ? payload.assets[0] : undefined;
212
+ if (!first) {
213
+ throw new AmbientCgClientError("AMBIENTCG_NOT_FOUND", "The ambientCG asset was not found.");
214
+ }
215
+ return normalizeAsset(first);
216
+ }
217
+ async listCategories() {
218
+ const payload = await this.request("/categories");
219
+ if (!Array.isArray(payload)) {
220
+ throw new AmbientCgClientError("AMBIENTCG_UPSTREAM_CHANGED", "ambientCG returned an invalid category list.");
221
+ }
222
+ return payload.flatMap((value) => {
223
+ const item = record(value);
224
+ const id = text(item?.id, 200);
225
+ const title = text(item?.title, 200);
226
+ const type = item?.type;
227
+ const assetCount = number(item?.numberOfAssets);
228
+ return id && title && isType(type) && assetCount !== undefined
229
+ ? [{ id, title, type, assetCount }]
230
+ : [];
231
+ });
232
+ }
233
+ }
234
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/ambientcg/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export type AudioSourceId = "sonniss" | "kenney" | "tallbeard" | "scott-buckley" | "itch-io" | "mixkit" | "pixabay" | "freesound" | "opengameart" | "abstraction";
2
+ export type AudioKind = "sfx" | "music" | "mixed";
3
+ export type ProgrammaticDownload = "curated-direct" | "provider-page";
4
+ export interface AudioSource {
5
+ id: AudioSourceId;
6
+ name: string;
7
+ bestFor: string;
8
+ kinds: AudioKind[];
9
+ browseUrls: string[];
10
+ licenseSummary: string;
11
+ commercialUse: string;
12
+ attribution: string;
13
+ programmaticDownload: ProgrammaticDownload;
14
+ caution?: string;
15
+ }
16
+ export interface AudioCatalogAsset {
17
+ id: string;
18
+ sourceId: AudioSourceId;
19
+ name: string;
20
+ description: string;
21
+ kind: AudioKind;
22
+ tags: string[];
23
+ license: string;
24
+ commercialUse: boolean;
25
+ attributionRequired: boolean;
26
+ attributionText?: string;
27
+ sourcePageUrl: string;
28
+ downloadUrl: string;
29
+ fileName: string;
30
+ sizeBytes?: number;
31
+ directDownload: true;
32
+ redistributionAllowed: false;
33
+ }
34
+ export declare const AUDIO_SOURCES: readonly AudioSource[];
35
+ export declare const AUDIO_ASSETS: readonly AudioCatalogAsset[];
36
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/audio/catalog.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,QAAQ,GACR,WAAW,GACX,eAAe,GACf,SAAS,GACT,QAAQ,GACR,SAAS,GACT,WAAW,GACX,aAAa,GACb,aAAa,CAAC;AAElB,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;AAClD,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,aAAa,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,IAAI,CAAC;IACrB,qBAAqB,EAAE,KAAK,CAAC;CAC9B;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAkHtC,CAAC;AAmBX,eAAO,MAAM,YAAY,EAAE,SAAS,iBAAiB,EAoC3C,CAAC"}
@@ -0,0 +1,169 @@
1
+ export const AUDIO_SOURCES = [
2
+ {
3
+ id: "sonniss",
4
+ name: "Sonniss GDC Game Audio Bundles",
5
+ bestFor: "Professional weapons, impacts, explosions, ambience, vehicles, Foley, and cinematic effects",
6
+ kinds: ["sfx"],
7
+ browseUrls: ["https://gdc.sonniss.com/", "https://gdc.sonniss.com/gdc-game-audio-bundle/"],
8
+ licenseSummary: "Sonniss GDC bundle license; commercial projects allowed, no attribution required",
9
+ commercialUse: "Allowed in projects; review the current bundle license before use",
10
+ attribution: "Not required",
11
+ programmaticDownload: "curated-direct",
12
+ caution: "Raw files and bundles must not be redistributed as a competing asset library.",
13
+ },
14
+ {
15
+ id: "kenney",
16
+ name: "Kenney Audio",
17
+ bestFor: "UI, pickups, impacts, arcade/gameplay sounds, and jingles",
18
+ kinds: ["sfx", "music"],
19
+ browseUrls: ["https://kenney.nl/assets/category:Audio"],
20
+ licenseSummary: "CC0 (verify the individual pack page)",
21
+ commercialUse: "Allowed for CC0 packs",
22
+ attribution: "Not required for CC0 packs",
23
+ programmaticDownload: "curated-direct",
24
+ },
25
+ {
26
+ id: "tallbeard",
27
+ name: "Tallbeard Studios",
28
+ bestFor: "Large collections of seamless gameplay music loops",
29
+ kinds: ["music"],
30
+ browseUrls: ["https://tallbeard.itch.io/music-loop-bundle"],
31
+ licenseSummary: "CC0 on the Music Loop Bundle page; verify the selected download",
32
+ commercialUse: "Allowed for the CC0 bundle",
33
+ attribution: "Not required for CC0 material",
34
+ programmaticDownload: "provider-page",
35
+ },
36
+ {
37
+ id: "scott-buckley",
38
+ name: "Scott Buckley Music Library",
39
+ bestFor: "Cinematic, orchestral, atmospheric, and emotional music",
40
+ kinds: ["music"],
41
+ browseUrls: ["https://www.scottbuckley.com.au/library/"],
42
+ licenseSummary: "CC BY 4.0 for library tracks unless an individual track says otherwise",
43
+ commercialUse: "Allowed with license compliance",
44
+ attribution: "Required; retain track-specific credit details",
45
+ programmaticDownload: "provider-page",
46
+ },
47
+ {
48
+ id: "itch-io",
49
+ name: "itch.io Free Audio Assets",
50
+ bestFor: "Genre-specific FPS, RPG, horror, retro, UI, voice, and music packs",
51
+ kinds: ["sfx", "music", "mixed"],
52
+ browseUrls: ["https://itch.io/game-assets/free/tag-music", "https://itch.io/game-assets/free/tag-sound-effects"],
53
+ licenseSummary: "Per pack; no site-wide license",
54
+ commercialUse: "Varies per pack",
55
+ attribution: "Varies per pack",
56
+ programmaticDownload: "provider-page",
57
+ caution: "Read and retain the individual pack license before downloading or using it.",
58
+ },
59
+ {
60
+ id: "mixkit",
61
+ name: "Mixkit",
62
+ bestFor: "Quick individual sound effects and background tracks",
63
+ kinds: ["sfx", "music"],
64
+ browseUrls: ["https://mixkit.co/free-sound-effects/", "https://mixkit.co/free-stock-music/"],
65
+ licenseSummary: "Mixkit item license; verify the selected item and media type",
66
+ commercialUse: "Generally allowed under the applicable Mixkit license",
67
+ attribution: "Generally not required for SFX; verify the item",
68
+ programmaticDownload: "provider-page",
69
+ },
70
+ {
71
+ id: "pixabay",
72
+ name: "Pixabay Audio",
73
+ bestFor: "Fast searchable music and sound effects",
74
+ kinds: ["sfx", "music"],
75
+ browseUrls: ["https://pixabay.com/sound-effects/", "https://pixabay.com/music/"],
76
+ licenseSummary: "Pixabay Content License; verify the selected item",
77
+ commercialUse: "Allowed as part of a larger creative work, subject to the Content License",
78
+ attribution: "Generally not required",
79
+ programmaticDownload: "provider-page",
80
+ caution: "Some music is Content ID registered; retain download evidence and inspect track warnings.",
81
+ },
82
+ {
83
+ id: "freesound",
84
+ name: "Freesound",
85
+ bestFor: "Specific recordings and niche sounds missing from broad libraries",
86
+ kinds: ["sfx", "music"],
87
+ browseUrls: ["https://freesound.org/search/"],
88
+ licenseSummary: "Per asset; prefer CC0 or CC BY and avoid CC BY-NC for commercial use",
89
+ commercialUse: "Depends on the selected Creative Commons license",
90
+ attribution: "Required for CC BY; not required for CC0",
91
+ programmaticDownload: "provider-page",
92
+ },
93
+ {
94
+ id: "opengameart",
95
+ name: "OpenGameArt",
96
+ bestFor: "Game-ready loops, chiptunes, RPG music, and unusual effects",
97
+ kinds: ["sfx", "music", "mixed"],
98
+ browseUrls: ["https://opengameart.org/art-search?keys=music", "https://opengameart.org/art-search?keys=sound+effects"],
99
+ licenseSummary: "Per asset; prefer CC0 for the simplest reuse",
100
+ commercialUse: "Depends on the selected asset license",
101
+ attribution: "Depends on the selected asset license",
102
+ programmaticDownload: "provider-page",
103
+ },
104
+ {
105
+ id: "abstraction",
106
+ name: "Abstraction Music",
107
+ bestFor: "Loopable game music and free game-jam tracks",
108
+ kinds: ["music"],
109
+ browseUrls: ["https://abstractionmusic.com/"],
110
+ licenseSummary: "Per release; verify the selected track or collection",
111
+ commercialUse: "Depends on the selected release",
112
+ attribution: "Depends on the selected release",
113
+ programmaticDownload: "provider-page",
114
+ },
115
+ ];
116
+ const sonniss2026 = (part) => ({
117
+ id: `sonniss-gdc-2026-${part}-of-5`,
118
+ sourceId: "sonniss",
119
+ name: `Sonniss GDC 2026 Game Audio Bundle ${part} of 5`,
120
+ description: "One official archive from the five-part professional GDC 2026 sound-effects bundle.",
121
+ kind: "sfx",
122
+ tags: ["professional", "foley", "ambience", "weapons", "impacts", "cinematic", "gdc-2026"],
123
+ license: "Sonniss GDC Game Audio Bundle License",
124
+ commercialUse: true,
125
+ attributionRequired: false,
126
+ sourcePageUrl: "https://gdc.sonniss.com/",
127
+ downloadUrl: `https://downloads.sonniss.com/Sonniss.com-GDC2026-GameAudioBundle${part}of5.zip`,
128
+ fileName: `Sonniss.com-GDC2026-GameAudioBundle${part}of5.zip`,
129
+ directDownload: true,
130
+ redistributionAllowed: false,
131
+ });
132
+ export const AUDIO_ASSETS = [
133
+ {
134
+ id: "kenney-interface-sounds",
135
+ sourceId: "kenney",
136
+ name: "Kenney Interface Sounds",
137
+ description: "100 game interface sounds in a directly downloadable CC0 ZIP archive.",
138
+ kind: "sfx",
139
+ tags: ["ui", "interface", "click", "menu", "gameplay", "cc0"],
140
+ license: "CC0",
141
+ commercialUse: true,
142
+ attributionRequired: false,
143
+ sourcePageUrl: "https://kenney.nl/assets/interface-sounds",
144
+ downloadUrl: "https://kenney.nl/media/pages/assets/interface-sounds/fa43c1dd4d-1677589452/kenney_interface-sounds.zip",
145
+ fileName: "kenney_interface-sounds.zip",
146
+ sizeBytes: 834_536,
147
+ directDownload: true,
148
+ redistributionAllowed: false,
149
+ },
150
+ {
151
+ id: "kenney-music-jingles",
152
+ sourceId: "kenney",
153
+ name: "Kenney Music Jingles",
154
+ description: "85 short game music jingles in a directly downloadable CC0 ZIP archive.",
155
+ kind: "music",
156
+ tags: ["jingle", "ui", "success", "failure", "gameplay", "cc0"],
157
+ license: "CC0",
158
+ commercialUse: true,
159
+ attributionRequired: false,
160
+ sourcePageUrl: "https://kenney.nl/assets/music-jingles",
161
+ downloadUrl: "https://kenney.nl/media/pages/assets/music-jingles/f37e530b9e-1677590399/kenney_music-jingles.zip",
162
+ fileName: "kenney_music-jingles.zip",
163
+ sizeBytes: 1_239_525,
164
+ directDownload: true,
165
+ redistributionAllowed: false,
166
+ },
167
+ ...[1, 2, 3, 4, 5].map(sonniss2026),
168
+ ];
169
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/audio/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type AudioCatalogAsset, type AudioKind, type AudioSource, type AudioSourceId } from "./catalog.js";
2
+ export type AudioErrorCode = "AUDIO_ASSET_NOT_FOUND" | "AUDIO_DOWNLOAD_FAILED" | "AUDIO_DOWNLOAD_TOO_LARGE" | "AUDIO_UPSTREAM_DENIED" | "AUDIO_UNSAFE_REDIRECT";
3
+ export declare class AudioCatalogError extends Error {
4
+ readonly code: AudioErrorCode;
5
+ readonly retryable: boolean;
6
+ constructor(code: AudioErrorCode, message: string, retryable?: boolean);
7
+ }
8
+ export interface AudioDownloadResult {
9
+ assetId: string;
10
+ sourceId: AudioSourceId;
11
+ fileName: string;
12
+ path: string;
13
+ sizeBytes: number;
14
+ sha256: string;
15
+ alreadyExisted: boolean;
16
+ license: string;
17
+ attributionRequired: boolean;
18
+ attributionText?: string;
19
+ sourcePageUrl: string;
20
+ }
21
+ export interface AudioCatalogClientOptions {
22
+ fetch?: typeof globalThis.fetch;
23
+ downloadDir?: string;
24
+ maxDownloadBytes?: number;
25
+ downloadTimeoutMs?: number;
26
+ }
27
+ export declare class AudioCatalogClient {
28
+ private readonly fetch;
29
+ private readonly downloadDir;
30
+ private readonly maxDownloadBytes;
31
+ private readonly downloadTimeoutMs;
32
+ private readonly allowedDownloadHosts;
33
+ constructor(options?: AudioCatalogClientOptions);
34
+ listSources(): AudioSource[];
35
+ searchAssets(input: {
36
+ query?: string;
37
+ kind?: AudioKind | "all";
38
+ source?: AudioSourceId | "all";
39
+ }): AudioCatalogAsset[];
40
+ getAsset(assetId: string): AudioCatalogAsset;
41
+ downloadAsset(assetId: string): Promise<AudioDownloadResult>;
42
+ private ensureDirectory;
43
+ private fetchDownload;
44
+ private result;
45
+ }
46
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/audio/client.ts"],"names":[],"mappings":"AAeA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,cAAc,GACtB,uBAAuB,GACvB,uBAAuB,GACvB,0BAA0B,GAC1B,uBAAuB,GACvB,uBAAuB,CAAC;AAE5B,qBAAa,iBAAkB,SAAQ,KAAK;aAExB,IAAI,EAAE,cAAc;aAEpB,SAAS;IAH3B,YACkB,IAAI,EAAE,cAAc,EACpC,OAAO,EAAE,MAAM,EACC,SAAS,UAAQ,EAIlC;CACF;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AA4CD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAEnC;IAEF,YAAY,OAAO,GAAE,yBAA8B,EAqBlD;IAED,WAAW,IAAI,WAAW,EAAE,CAE3B;IAED,YAAY,CAAC,KAAK,EAAE;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;QACzB,MAAM,CAAC,EAAE,aAAa,GAAG,KAAK,CAAC;KAChC,GAAG,iBAAiB,EAAE,CAYtB;IAED,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAS3C;IAEK,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA4EjE;YAEa,eAAe;YAKf,aAAa;IA0C3B,OAAO,CAAC,MAAM;CAqBf"}