@ai-rpg-engine/soundpack-core 2.0.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.
@@ -0,0 +1,4 @@
1
+ import type { SoundPackManifest } from './types.js';
2
+ /** Core sound pack with voice-soundboard procedural effect mappings. */
3
+ export declare const CORE_SOUND_PACK: SoundPackManifest;
4
+ //# sourceMappingURL=core-pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-pack.d.ts","sourceRoot":"","sources":["../src/core-pack.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,wEAAwE;AACxE,eAAO,MAAM,eAAe,EAAE,iBAuK7B,CAAC"}
@@ -0,0 +1,171 @@
1
+ // Built-in core sound pack mapping voice-soundboard procedural effects
2
+ /** Core sound pack with voice-soundboard procedural effect mappings. */
3
+ export const CORE_SOUND_PACK = {
4
+ name: 'core',
5
+ version: '1.0.0',
6
+ description: 'Built-in sound effects mapped to voice-soundboard procedural generation',
7
+ author: 'ai-rpg-engine',
8
+ entries: [
9
+ // UI chimes
10
+ {
11
+ id: 'ui_notification',
12
+ tags: ['ui', 'alert'],
13
+ domain: 'sfx',
14
+ intensity: 'low',
15
+ mood: ['neutral'],
16
+ durationClass: 'oneshot',
17
+ cooldownMs: 1000,
18
+ variants: [],
19
+ source: 'voice-soundboard',
20
+ voiceSoundboardEffect: 'chime_notification',
21
+ },
22
+ {
23
+ id: 'ui_success',
24
+ tags: ['ui', 'positive'],
25
+ domain: 'sfx',
26
+ intensity: 'low',
27
+ mood: ['positive', 'triumph'],
28
+ durationClass: 'oneshot',
29
+ cooldownMs: 1000,
30
+ variants: [],
31
+ source: 'voice-soundboard',
32
+ voiceSoundboardEffect: 'chime_success',
33
+ },
34
+ {
35
+ id: 'ui_error',
36
+ tags: ['ui', 'negative'],
37
+ domain: 'sfx',
38
+ intensity: 'low',
39
+ mood: ['negative', 'failure'],
40
+ durationClass: 'oneshot',
41
+ cooldownMs: 1000,
42
+ variants: [],
43
+ source: 'voice-soundboard',
44
+ voiceSoundboardEffect: 'chime_error',
45
+ },
46
+ {
47
+ id: 'ui_attention',
48
+ tags: ['ui', 'alert'],
49
+ domain: 'sfx',
50
+ intensity: 'medium',
51
+ mood: ['neutral'],
52
+ durationClass: 'oneshot',
53
+ cooldownMs: 2000,
54
+ variants: [],
55
+ source: 'voice-soundboard',
56
+ voiceSoundboardEffect: 'chime_attention',
57
+ },
58
+ // UI interaction sounds
59
+ {
60
+ id: 'ui_click',
61
+ tags: ['ui', 'input'],
62
+ domain: 'sfx',
63
+ intensity: 'low',
64
+ mood: ['neutral'],
65
+ durationClass: 'oneshot',
66
+ cooldownMs: 200,
67
+ variants: [],
68
+ source: 'voice-soundboard',
69
+ voiceSoundboardEffect: 'click',
70
+ },
71
+ {
72
+ id: 'ui_pop',
73
+ tags: ['ui', 'light'],
74
+ domain: 'sfx',
75
+ intensity: 'low',
76
+ mood: ['neutral', 'positive'],
77
+ durationClass: 'oneshot',
78
+ cooldownMs: 300,
79
+ variants: [],
80
+ source: 'voice-soundboard',
81
+ voiceSoundboardEffect: 'pop',
82
+ },
83
+ {
84
+ id: 'ui_whoosh',
85
+ tags: ['ui', 'transition'],
86
+ domain: 'sfx',
87
+ intensity: 'low',
88
+ mood: ['neutral'],
89
+ durationClass: 'oneshot',
90
+ cooldownMs: 500,
91
+ variants: [],
92
+ source: 'voice-soundboard',
93
+ voiceSoundboardEffect: 'whoosh',
94
+ },
95
+ // Alerts
96
+ {
97
+ id: 'alert_warning',
98
+ tags: ['alert', 'caution'],
99
+ domain: 'sfx',
100
+ intensity: 'medium',
101
+ mood: ['tense', 'caution'],
102
+ durationClass: 'oneshot',
103
+ cooldownMs: 3000,
104
+ variants: [],
105
+ source: 'voice-soundboard',
106
+ voiceSoundboardEffect: 'warning',
107
+ },
108
+ {
109
+ id: 'alert_critical',
110
+ tags: ['alert', 'danger'],
111
+ domain: 'sfx',
112
+ intensity: 'high',
113
+ mood: ['dread', 'danger'],
114
+ durationClass: 'oneshot',
115
+ cooldownMs: 5000,
116
+ variants: [],
117
+ source: 'voice-soundboard',
118
+ voiceSoundboardEffect: 'critical',
119
+ },
120
+ {
121
+ id: 'alert_info',
122
+ tags: ['alert', 'info'],
123
+ domain: 'sfx',
124
+ intensity: 'low',
125
+ mood: ['neutral', 'calm'],
126
+ durationClass: 'oneshot',
127
+ cooldownMs: 1000,
128
+ variants: [],
129
+ source: 'voice-soundboard',
130
+ voiceSoundboardEffect: 'info',
131
+ },
132
+ // Ambient layers
133
+ {
134
+ id: 'ambient_rain',
135
+ tags: ['weather', 'calm'],
136
+ domain: 'ambient',
137
+ intensity: 'low',
138
+ mood: ['calm', 'melancholy'],
139
+ durationClass: 'long-loop',
140
+ cooldownMs: 0,
141
+ variants: [],
142
+ source: 'voice-soundboard',
143
+ voiceSoundboardEffect: 'rain',
144
+ },
145
+ {
146
+ id: 'ambient_white_noise',
147
+ tags: ['background'],
148
+ domain: 'ambient',
149
+ intensity: 'low',
150
+ mood: ['neutral'],
151
+ durationClass: 'long-loop',
152
+ cooldownMs: 0,
153
+ variants: [],
154
+ source: 'voice-soundboard',
155
+ voiceSoundboardEffect: 'white_noise',
156
+ },
157
+ {
158
+ id: 'ambient_drone',
159
+ tags: ['dark', 'tension'],
160
+ domain: 'ambient',
161
+ intensity: 'medium',
162
+ mood: ['dread', 'tension'],
163
+ durationClass: 'long-loop',
164
+ cooldownMs: 0,
165
+ variants: [],
166
+ source: 'voice-soundboard',
167
+ voiceSoundboardEffect: 'drone',
168
+ },
169
+ ],
170
+ };
171
+ //# sourceMappingURL=core-pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-pack.js","sourceRoot":"","sources":["../src/core-pack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type { SoundPackManifest, SoundEntry, SoundDomain, SoundIntensity, DurationClass, SoundSource, SoundQuery, } from './types.js';
2
+ export { SoundRegistry } from './registry.js';
3
+ export { CORE_SOUND_PACK } from './core-pack.js';
4
+ export { validateManifest, isValidManifest, type ManifestError, } from './validate.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { SoundRegistry } from './registry.js';
2
+ export { CORE_SOUND_PACK } from './core-pack.js';
3
+ export { validateManifest, isValidManifest, } from './validate.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EACL,gBAAgB,EAChB,eAAe,GAEhB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { SoundEntry, SoundPackManifest, SoundQuery } from './types.js';
2
+ /** Registry of sound entries from loaded packs. */
3
+ export declare class SoundRegistry {
4
+ private entries;
5
+ /** Load a sound pack manifest into the registry. */
6
+ load(manifest: SoundPackManifest): void;
7
+ /** Query entries by tags, domain, mood, or intensity. */
8
+ query(q: SoundQuery): SoundEntry[];
9
+ /** Get a specific entry by ID. */
10
+ get(id: string): SoundEntry | undefined;
11
+ /** Pick a random variant filename for an entry. */
12
+ pickVariant(id: string): string | undefined;
13
+ /** Get all loaded entry IDs. */
14
+ getIds(): string[];
15
+ /** Get total number of entries. */
16
+ get size(): number;
17
+ }
18
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5E,mDAAmD;AACnD,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAiC;IAEhD,oDAAoD;IACpD,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAMvC,yDAAyD;IACzD,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE;IAkBlC,kCAAkC;IAClC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvC,mDAAmD;IACnD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAO3C,gCAAgC;IAChC,MAAM,IAAI,MAAM,EAAE;IAIlB,mCAAmC;IACnC,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,54 @@
1
+ // Content-addressable sound registry
2
+ /** Registry of sound entries from loaded packs. */
3
+ export class SoundRegistry {
4
+ entries = new Map();
5
+ /** Load a sound pack manifest into the registry. */
6
+ load(manifest) {
7
+ for (const entry of manifest.entries) {
8
+ this.entries.set(entry.id, entry);
9
+ }
10
+ }
11
+ /** Query entries by tags, domain, mood, or intensity. */
12
+ query(q) {
13
+ const results = [];
14
+ for (const entry of this.entries.values()) {
15
+ if (q.domain && entry.domain !== q.domain)
16
+ continue;
17
+ if (q.intensity && entry.intensity !== q.intensity)
18
+ continue;
19
+ if (q.tags && q.tags.length > 0) {
20
+ const hasTag = q.tags.some((t) => entry.tags.includes(t));
21
+ if (!hasTag)
22
+ continue;
23
+ }
24
+ if (q.mood && q.mood.length > 0) {
25
+ const hasMood = q.mood.some((m) => entry.mood.includes(m));
26
+ if (!hasMood)
27
+ continue;
28
+ }
29
+ results.push(entry);
30
+ }
31
+ return results;
32
+ }
33
+ /** Get a specific entry by ID. */
34
+ get(id) {
35
+ return this.entries.get(id);
36
+ }
37
+ /** Pick a random variant filename for an entry. */
38
+ pickVariant(id) {
39
+ const entry = this.entries.get(id);
40
+ if (!entry || entry.variants.length === 0)
41
+ return undefined;
42
+ const idx = Math.floor(Math.random() * entry.variants.length);
43
+ return entry.variants[idx];
44
+ }
45
+ /** Get all loaded entry IDs. */
46
+ getIds() {
47
+ return [...this.entries.keys()];
48
+ }
49
+ /** Get total number of entries. */
50
+ get size() {
51
+ return this.entries.size;
52
+ }
53
+ }
54
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAIrC,mDAAmD;AACnD,MAAM,OAAO,aAAa;IAChB,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEhD,oDAAoD;IACpD,IAAI,CAAC,QAA2B;QAC9B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,CAAa;QACjB,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;gBAAE,SAAS;YACpD,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;gBAAE,SAAS;YAC7D,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1D,IAAI,CAAC,MAAM;oBAAE,SAAS;YACxB,CAAC;YACD,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,OAAO;oBAAE,SAAS;YACzB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,kCAAkC;IAClC,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,mDAAmD;IACnD,WAAW,CAAC,EAAU;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9D,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,gCAAgC;IAChC,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,mCAAmC;IACnC,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ /** A loadable collection of sound assets. */
2
+ export type SoundPackManifest = {
3
+ name: string;
4
+ version: string;
5
+ description: string;
6
+ author: string;
7
+ entries: SoundEntry[];
8
+ };
9
+ /** A single sound asset in the registry. */
10
+ export type SoundEntry = {
11
+ id: string;
12
+ tags: string[];
13
+ domain: SoundDomain;
14
+ intensity: SoundIntensity;
15
+ mood: string[];
16
+ durationClass: DurationClass;
17
+ cooldownMs: number;
18
+ variants: string[];
19
+ source: SoundSource;
20
+ /** Maps to a voice-soundboard procedural effect name. */
21
+ voiceSoundboardEffect?: string;
22
+ };
23
+ export type SoundDomain = 'sfx' | 'ambient' | 'music' | 'voice';
24
+ export type SoundIntensity = 'low' | 'medium' | 'high';
25
+ export type DurationClass = 'oneshot' | 'short-loop' | 'long-loop';
26
+ export type SoundSource = 'file' | 'procedural' | 'voice-soundboard';
27
+ /** Query for finding sounds in the registry. */
28
+ export type SoundQuery = {
29
+ tags?: string[];
30
+ domain?: SoundDomain;
31
+ intensity?: SoundIntensity;
32
+ mood?: string[];
33
+ };
34
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,6CAA6C;AAC7C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB,CAAC;AAEF,4CAA4C;AAC5C,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,yDAAyD;IACzD,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAChE,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AACvD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,CAAC;AACnE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,YAAY,GAAG,kBAAkB,CAAC;AAErE,gDAAgD;AAChD,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // Sound pack manifest and registry types
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,yCAAyC"}
@@ -0,0 +1,9 @@
1
+ import type { SoundPackManifest } from './types.js';
2
+ export type ManifestError = {
3
+ field: string;
4
+ message: string;
5
+ };
6
+ /** Validate a SoundPackManifest. */
7
+ export declare function validateManifest(manifest: unknown): ManifestError[];
8
+ export declare function isValidManifest(manifest: unknown): manifest is SoundPackManifest;
9
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAA2D,MAAM,YAAY,CAAC;AAO7G,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,oCAAoC;AACpC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,aAAa,EAAE,CAiDnE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,iBAAiB,CAEhF"}
@@ -0,0 +1,54 @@
1
+ // Validate a SoundPackManifest
2
+ const VALID_DOMAINS = ['sfx', 'ambient', 'music', 'voice'];
3
+ const VALID_INTENSITIES = ['low', 'medium', 'high'];
4
+ const VALID_DURATIONS = ['oneshot', 'short-loop', 'long-loop'];
5
+ const VALID_SOURCES = ['file', 'procedural', 'voice-soundboard'];
6
+ /** Validate a SoundPackManifest. */
7
+ export function validateManifest(manifest) {
8
+ const errors = [];
9
+ if (!manifest || typeof manifest !== 'object') {
10
+ return [{ field: 'root', message: 'manifest must be an object' }];
11
+ }
12
+ const m = manifest;
13
+ if (typeof m.name !== 'string' || m.name.length === 0) {
14
+ errors.push({ field: 'name', message: 'name must be a non-empty string' });
15
+ }
16
+ if (typeof m.version !== 'string') {
17
+ errors.push({ field: 'version', message: 'version must be a string' });
18
+ }
19
+ if (!Array.isArray(m.entries)) {
20
+ errors.push({ field: 'entries', message: 'entries must be an array' });
21
+ return errors;
22
+ }
23
+ const seenIds = new Set();
24
+ for (let i = 0; i < m.entries.length; i++) {
25
+ const e = m.entries[i];
26
+ const prefix = `entries[${i}]`;
27
+ if (typeof e.id !== 'string' || e.id.length === 0) {
28
+ errors.push({ field: `${prefix}.id`, message: 'id must be a non-empty string' });
29
+ }
30
+ else if (seenIds.has(e.id)) {
31
+ errors.push({ field: `${prefix}.id`, message: `duplicate id: ${e.id}` });
32
+ }
33
+ else {
34
+ seenIds.add(e.id);
35
+ }
36
+ if (!VALID_DOMAINS.includes(e.domain)) {
37
+ errors.push({ field: `${prefix}.domain`, message: `domain must be one of: ${VALID_DOMAINS.join(', ')}` });
38
+ }
39
+ if (!VALID_INTENSITIES.includes(e.intensity)) {
40
+ errors.push({ field: `${prefix}.intensity`, message: `intensity must be one of: ${VALID_INTENSITIES.join(', ')}` });
41
+ }
42
+ if (!VALID_DURATIONS.includes(e.durationClass)) {
43
+ errors.push({ field: `${prefix}.durationClass`, message: `durationClass must be one of: ${VALID_DURATIONS.join(', ')}` });
44
+ }
45
+ if (!VALID_SOURCES.includes(e.source)) {
46
+ errors.push({ field: `${prefix}.source`, message: `source must be one of: ${VALID_SOURCES.join(', ')}` });
47
+ }
48
+ }
49
+ return errors;
50
+ }
51
+ export function isValidManifest(manifest) {
52
+ return validateManifest(manifest).length === 0;
53
+ }
54
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAI/B,MAAM,aAAa,GAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1E,MAAM,iBAAiB,GAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AACtE,MAAM,eAAe,GAAoB,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;AAChF,MAAM,aAAa,GAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;AAOhF,oCAAoC;AACpC,MAAM,UAAU,gBAAgB,CAAC,QAAiB;IAChD,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,GAAG,QAAmC,CAAC;IAE9C,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACvE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAA4B,CAAC;QAClD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC;QAE/B,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,KAAK,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,CAAC;QACnF,CAAC;aAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,KAAK,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAqB,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,SAAS,EAAE,OAAO,EAAE,0BAA0B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5G,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAA2B,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,YAAY,EAAE,OAAO,EAAE,6BAA6B,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACtH,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,aAA8B,CAAC,EAAE,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,gBAAgB,EAAE,OAAO,EAAE,iCAAiC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5H,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAqB,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,SAAS,EAAE,OAAO,EAAE,0BAA0B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAiB;IAC/C,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AACjD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@ai-rpg-engine/soundpack-core",
3
+ "version": "2.0.0",
4
+ "description": "Sound pack manifest schema and content-addressable audio registry for AI RPG Engine",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": ["dist"],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "test": "vitest run"
18
+ },
19
+ "license": "MIT",
20
+ "author": "mcp-tool-shop",
21
+ "homepage": "https://mcp-tool-shop-org.github.io/ai-rpg-engine/",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/mcp-tool-shop-org/ai-rpg-engine.git",
25
+ "directory": "packages/soundpack-core"
26
+ },
27
+ "keywords": ["rpg", "soundpack", "audio", "registry", "sfx", "ambient", "game-engine"],
28
+ "bugs": {
29
+ "url": "https://github.com/mcp-tool-shop-org/ai-rpg-engine/issues"
30
+ },
31
+ "engines": {
32
+ "node": ">=20"
33
+ }
34
+ }