wunderland 0.46.0 → 0.48.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,20 @@
1
+ /**
2
+ * Detects the project's package manager by checking for lockfiles.
3
+ * Priority: pnpm > yarn > bun > npm (fallback).
4
+ */
5
+ export declare function detectPackageManager(cwd?: string): 'pnpm' | 'yarn' | 'bun' | 'npm';
6
+ /**
7
+ * Installs an npm package using the detected package manager.
8
+ * Returns true on success, false on failure (logs stderr).
9
+ */
10
+ export declare function installExtension(packageName: string, opts?: {
11
+ cwd?: string;
12
+ dev?: boolean;
13
+ }): Promise<boolean>;
14
+ /**
15
+ * Uninstalls an npm package.
16
+ */
17
+ export declare function uninstallExtension(packageName: string, opts?: {
18
+ cwd?: string;
19
+ }): Promise<boolean>;
20
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../../src/cli/extensions/installer.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAMlF;AAgBD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACtB,OAAO,CAAC,OAAO,CAAC,CAclB"}
@@ -0,0 +1,71 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { execSync } from 'node:child_process';
3
+ import { join } from 'node:path';
4
+ /**
5
+ * Detects the project's package manager by checking for lockfiles.
6
+ * Priority: pnpm > yarn > bun > npm (fallback).
7
+ */
8
+ export function detectPackageManager(cwd) {
9
+ const dir = cwd ?? process.cwd();
10
+ if (existsSync(join(dir, 'pnpm-lock.yaml')))
11
+ return 'pnpm';
12
+ if (existsSync(join(dir, 'yarn.lock')))
13
+ return 'yarn';
14
+ if (existsSync(join(dir, 'bun.lockb')))
15
+ return 'bun';
16
+ return 'npm';
17
+ }
18
+ const ADD_CMD = {
19
+ pnpm: 'pnpm add',
20
+ yarn: 'yarn add',
21
+ bun: 'bun add',
22
+ npm: 'npm install',
23
+ };
24
+ const REMOVE_CMD = {
25
+ pnpm: 'pnpm remove',
26
+ yarn: 'yarn remove',
27
+ bun: 'bun remove',
28
+ npm: 'npm uninstall',
29
+ };
30
+ /**
31
+ * Installs an npm package using the detected package manager.
32
+ * Returns true on success, false on failure (logs stderr).
33
+ */
34
+ export async function installExtension(packageName, opts) {
35
+ const pm = detectPackageManager(opts?.cwd);
36
+ const devFlag = opts?.dev ? ' -D' : '';
37
+ const cmd = `${ADD_CMD[pm]}${devFlag} ${packageName}`;
38
+ try {
39
+ execSync(cmd, {
40
+ cwd: opts?.cwd ?? process.cwd(),
41
+ stdio: ['ignore', 'pipe', 'pipe'],
42
+ timeout: 120_000,
43
+ });
44
+ return true;
45
+ }
46
+ catch (err) {
47
+ const stderr = err?.stderr?.toString() ?? err?.message ?? 'Unknown error';
48
+ console.error(`Failed to install ${packageName}: ${stderr}`);
49
+ return false;
50
+ }
51
+ }
52
+ /**
53
+ * Uninstalls an npm package.
54
+ */
55
+ export async function uninstallExtension(packageName, opts) {
56
+ const pm = detectPackageManager(opts?.cwd);
57
+ const cmd = `${REMOVE_CMD[pm]} ${packageName}`;
58
+ try {
59
+ execSync(cmd, {
60
+ cwd: opts?.cwd ?? process.cwd(),
61
+ stdio: ['ignore', 'pipe', 'pipe'],
62
+ timeout: 60_000,
63
+ });
64
+ return true;
65
+ }
66
+ catch (err) {
67
+ console.error(`Failed to uninstall ${packageName}: ${err?.message}`);
68
+ return false;
69
+ }
70
+ }
71
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../../src/cli/extensions/installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,MAAM,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACjC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3D,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACtD,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,OAAO,GAA2B;IACtC,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,aAAa;CACnB,CAAC;AAEF,MAAM,UAAU,GAA2B;IACzC,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE,aAAa;IACnB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,eAAe;CACrB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,IAAsC;IAEtC,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,GAAG,OAAO,IAAI,WAAW,EAAE,CAAC;IACtD,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,EAAE;YACZ,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;YAC/B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,OAAO,IAAI,eAAe,CAAC;QAC1E,OAAO,CAAC,KAAK,CAAC,qBAAqB,WAAW,KAAK,MAAM,EAAE,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAmB,EACnB,IAAuB;IAEvB,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;IAC/C,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,EAAE;YACZ,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;YAC/B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,uBAAuB,WAAW,KAAK,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ export interface ExtensionRecommendation {
2
+ extensionId: string;
3
+ packageName: string;
4
+ reason: 'credential_detected' | 'skill_requires' | 'preset_default';
5
+ displayName: string;
6
+ envVar?: string;
7
+ }
8
+ /**
9
+ * Scans environment for known API keys and recommends matching extensions.
10
+ * Skips extensions that are already enabled.
11
+ */
12
+ export declare function getRecommendations(opts: {
13
+ env?: Record<string, string | undefined>;
14
+ enabledExtensions?: string[];
15
+ }): Promise<ExtensionRecommendation[]>;
16
+ /**
17
+ * Formats recommendations as a CLI-friendly table.
18
+ */
19
+ export declare function formatRecommendations(recs: ExtensionRecommendation[]): string;
20
+ //# sourceMappingURL=recommender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommender.d.ts","sourceRoot":"","sources":["../../../src/cli/extensions/recommender.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,qBAAqB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA8ED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAwBrC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,uBAAuB,EAAE,GAAG,MAAM,CAQ7E"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Credential-to-extension mapping.
3
+ * Each entry maps one or more env vars to an extension that should be suggested.
4
+ */
5
+ const CREDENTIAL_MAP = [
6
+ {
7
+ envVars: ['NEWSAPI_API_KEY'],
8
+ allRequired: false,
9
+ extensionId: 'news-search',
10
+ packageName: '@framers/agentos-ext-news-search',
11
+ displayName: 'News Search (NewsAPI)',
12
+ },
13
+ {
14
+ envVars: ['SERPER_API_KEY'],
15
+ allRequired: false,
16
+ extensionId: 'web-search',
17
+ packageName: '@framers/agentos-ext-web-search',
18
+ displayName: 'Web Search (Serper)',
19
+ },
20
+ {
21
+ envVars: ['GIPHY_API_KEY'],
22
+ allRequired: false,
23
+ extensionId: 'giphy',
24
+ packageName: '@framers/agentos-ext-giphy',
25
+ displayName: 'Giphy',
26
+ },
27
+ {
28
+ envVars: ['ELEVENLABS_API_KEY'],
29
+ allRequired: false,
30
+ extensionId: 'voice-synthesis',
31
+ packageName: '@framers/agentos-ext-voice-synthesis',
32
+ displayName: 'Voice Synthesis (ElevenLabs)',
33
+ },
34
+ {
35
+ envVars: ['GITHUB_TOKEN'],
36
+ allRequired: false,
37
+ extensionId: 'github',
38
+ packageName: '@framers/agentos-ext-github',
39
+ displayName: 'GitHub',
40
+ },
41
+ {
42
+ envVars: ['TELEGRAM_BOT_TOKEN'],
43
+ allRequired: false,
44
+ extensionId: 'telegram',
45
+ packageName: '@framers/agentos-ext-telegram',
46
+ displayName: 'Telegram',
47
+ },
48
+ {
49
+ envVars: ['DISCORD_BOT_TOKEN'],
50
+ allRequired: false,
51
+ extensionId: 'discord',
52
+ packageName: '@framers/agentos-ext-discord',
53
+ displayName: 'Discord',
54
+ },
55
+ {
56
+ envVars: ['GOOGLE_CLIENT_ID', 'GOOGLE_CLIENT_SECRET', 'GOOGLE_REFRESH_TOKEN'],
57
+ allRequired: true,
58
+ extensionId: 'email-gmail',
59
+ packageName: '@framers/agentos-ext-email-gmail',
60
+ displayName: 'Gmail',
61
+ },
62
+ {
63
+ envVars: ['GOOGLE_CLIENT_ID', 'GOOGLE_CLIENT_SECRET', 'GOOGLE_REFRESH_TOKEN'],
64
+ allRequired: true,
65
+ extensionId: 'calendar-google',
66
+ packageName: '@framers/agentos-ext-calendar-google',
67
+ displayName: 'Google Calendar',
68
+ },
69
+ ];
70
+ /**
71
+ * Scans environment for known API keys and recommends matching extensions.
72
+ * Skips extensions that are already enabled.
73
+ */
74
+ export async function getRecommendations(opts) {
75
+ const env = opts.env ?? process.env;
76
+ const enabled = new Set(opts.enabledExtensions ?? []);
77
+ const recs = [];
78
+ for (const mapping of CREDENTIAL_MAP) {
79
+ if (enabled.has(mapping.extensionId))
80
+ continue;
81
+ const hasCredentials = mapping.allRequired
82
+ ? mapping.envVars.every((v) => !!env[v])
83
+ : mapping.envVars.some((v) => !!env[v]);
84
+ if (!hasCredentials)
85
+ continue;
86
+ recs.push({
87
+ extensionId: mapping.extensionId,
88
+ packageName: mapping.packageName,
89
+ reason: 'credential_detected',
90
+ displayName: mapping.displayName,
91
+ envVar: mapping.envVars[0],
92
+ });
93
+ }
94
+ return recs;
95
+ }
96
+ /**
97
+ * Formats recommendations as a CLI-friendly table.
98
+ */
99
+ export function formatRecommendations(recs) {
100
+ if (recs.length === 0)
101
+ return '';
102
+ const lines = ['', ' Recommended extensions (credentials detected):', ''];
103
+ for (const r of recs) {
104
+ lines.push(` ${r.displayName} (${r.extensionId}) — ${r.envVar} found`);
105
+ }
106
+ lines.push('');
107
+ return lines.join('\n');
108
+ }
109
+ //# sourceMappingURL=recommender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommender.js","sourceRoot":"","sources":["../../../src/cli/extensions/recommender.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface SecretPromptResult {
2
+ key: string;
3
+ envVar: string;
4
+ value: string;
5
+ persisted: boolean;
6
+ }
7
+ interface SecretRequirement {
8
+ id: string;
9
+ envVar: string;
10
+ signupUrl?: string;
11
+ freeTier?: string;
12
+ }
13
+ /**
14
+ * Prompts user for missing API keys required by an extension.
15
+ * Persists entered values to .env in the project root.
16
+ */
17
+ export declare function promptForMissingSecrets(secrets: SecretRequirement[], opts?: {
18
+ cwd?: string;
19
+ nonInteractive?: boolean;
20
+ }): Promise<SecretPromptResult[]>;
21
+ export {};
22
+ //# sourceMappingURL=secret-prompter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-prompter.d.ts","sourceRoot":"","sources":["../../../src/cli/extensions/secret-prompter.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,iBAAiB,EAAE,EAC5B,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAChD,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAqC/B"}
@@ -0,0 +1,67 @@
1
+ import { readFileSync, appendFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { createInterface } from 'node:readline';
4
+ /**
5
+ * Prompts user for missing API keys required by an extension.
6
+ * Persists entered values to .env in the project root.
7
+ */
8
+ export async function promptForMissingSecrets(secrets, opts) {
9
+ const results = [];
10
+ const envPath = join(opts?.cwd ?? process.cwd(), '.env');
11
+ // Parse existing .env to avoid duplicates
12
+ const existing = parseEnvFile(envPath);
13
+ for (const secret of secrets) {
14
+ // Skip if already in environment or .env
15
+ if (process.env[secret.envVar] || existing[secret.envVar])
16
+ continue;
17
+ if (opts?.nonInteractive) {
18
+ console.log(` ⚠ ${secret.envVar} required — set it in .env or environment`);
19
+ continue;
20
+ }
21
+ console.log(`\n ${secret.id} requires ${secret.envVar}`);
22
+ if (secret.signupUrl)
23
+ console.log(` Sign up: ${secret.signupUrl}`);
24
+ if (secret.freeTier)
25
+ console.log(` Free tier: ${secret.freeTier}`);
26
+ const value = await askLine(` Enter ${secret.envVar} (or press Enter to skip): `);
27
+ if (!value)
28
+ continue;
29
+ // Append to .env
30
+ const line = `\n# Added by wunderland marketplace install\n${secret.envVar}=${value}\n`;
31
+ appendFileSync(envPath, line, 'utf8');
32
+ process.env[secret.envVar] = value;
33
+ results.push({
34
+ key: secret.id,
35
+ envVar: secret.envVar,
36
+ value,
37
+ persisted: true,
38
+ });
39
+ }
40
+ return results;
41
+ }
42
+ function parseEnvFile(path) {
43
+ if (!existsSync(path))
44
+ return {};
45
+ const content = readFileSync(path, 'utf8');
46
+ const vars = {};
47
+ for (const line of content.split('\n')) {
48
+ const trimmed = line.trim();
49
+ if (!trimmed || trimmed.startsWith('#'))
50
+ continue;
51
+ const eqIdx = trimmed.indexOf('=');
52
+ if (eqIdx > 0) {
53
+ vars[trimmed.slice(0, eqIdx).trim()] = trimmed.slice(eqIdx + 1).trim();
54
+ }
55
+ }
56
+ return vars;
57
+ }
58
+ function askLine(prompt) {
59
+ return new Promise((resolve) => {
60
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
61
+ rl.question(prompt, (answer) => {
62
+ rl.close();
63
+ resolve(answer.trim());
64
+ });
65
+ });
66
+ }
67
+ //# sourceMappingURL=secret-prompter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-prompter.js","sourceRoot":"","sources":["../../../src/cli/extensions/secret-prompter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @fileoverview Agent configuration loading, validation, and resolution.
3
+ *
4
+ * Provides the full config pipeline: load from disk or object, validate against
5
+ * the Wunderland agent-config schema, merge with presets and personas, and
6
+ * resolve the effective runtime configuration including LLM credentials.
7
+ *
8
+ * @module wunderland/config
9
+ */
10
+ export { loadAgentConfig, resolveLlmConfig, resolveProviderId } from './load.js';
11
+ export type { ResolvedLlmConfig } from './load.js';
12
+ export { validateWunderlandAgentConfig } from './schema.js';
13
+ export { WunderlandConfigError } from './errors.js';
14
+ export type { WunderlandConfigIssue } from './errors.js';
15
+ export { resolveEffectiveAgentConfig, buildDiscoveryOptionsFromAgentConfig, } from './effective-agent-config.js';
16
+ export type { EffectiveAgentConfigResult } from './effective-agent-config.js';
17
+ export { resolveConfiguredPersonas, resolveSelectedPersonaId, summarizePersona, extractSystemPromptFromPersona, extractHexacoTraitsFromPersona, buildRagConfigFromPersona, } from './persona-registry.js';
18
+ export type { ResolvedPersonaEntry, PersonaSummary, ResolvedPersonaCatalog, } from './persona-registry.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACjF,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGnD,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD,OAAO,EACL,2BAA2B,EAC3B,oCAAoC,GACrC,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAG9E,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,EAChB,8BAA8B,EAC9B,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,oBAAoB,EACpB,cAAc,EACd,sBAAsB,GACvB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @fileoverview Agent configuration loading, validation, and resolution.
3
+ *
4
+ * Provides the full config pipeline: load from disk or object, validate against
5
+ * the Wunderland agent-config schema, merge with presets and personas, and
6
+ * resolve the effective runtime configuration including LLM credentials.
7
+ *
8
+ * @module wunderland/config
9
+ */
10
+ // ── Config loading & LLM resolution ────────────────────────────────────────
11
+ export { loadAgentConfig, resolveLlmConfig, resolveProviderId } from './load.js';
12
+ // ── Schema validation ──────────────────────────────────────────────────────
13
+ export { validateWunderlandAgentConfig } from './schema.js';
14
+ // ── Error types ────────────────────────────────────────────────────────────
15
+ export { WunderlandConfigError } from './errors.js';
16
+ // ── Effective agent config (preset + persona merge) ────────────────────────
17
+ export { resolveEffectiveAgentConfig, buildDiscoveryOptionsFromAgentConfig, } from './effective-agent-config.js';
18
+ // ── Persona registry ───────────────────────────────────────────────────────
19
+ export { resolveConfiguredPersonas, resolveSelectedPersonaId, summarizePersona, extractSystemPromptFromPersona, extractHexacoTraitsFromPersona, buildRagConfigFromPersona, } from './persona-registry.js';
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,8EAA8E;AAC9E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGjF,8EAA8E;AAC9E,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAE5D,8EAA8E;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD,8EAA8E;AAC9E,OAAO,EACL,2BAA2B,EAC3B,oCAAoC,GACrC,MAAM,6BAA6B,CAAC;AAGrC,8EAA8E;AAC9E,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,EAChB,8BAA8B,EAC9B,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @fileoverview Content guardrails for agent safety.
3
+ *
4
+ * Provides the {@link CitizenModeGuardrail} which enforces the "no prompting"
5
+ * policy when an agent operates in Public (Citizen) mode on Wonderland.
6
+ *
7
+ * @module wunderland/guardrails
8
+ */
9
+ export { CitizenModeGuardrail, type CitizenGuardrailAction, type CitizenGuardrailResult, } from './CitizenModeGuardrail.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,oBAAoB,EACpB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,GAC5B,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @fileoverview Content guardrails for agent safety.
3
+ *
4
+ * Provides the {@link CitizenModeGuardrail} which enforces the "no prompting"
5
+ * policy when an agent operates in Public (Citizen) mode on Wonderland.
6
+ *
7
+ * @module wunderland/guardrails
8
+ */
9
+ export { CitizenModeGuardrail, } from './CitizenModeGuardrail.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,oBAAoB,GAGrB,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @fileoverview Voice and speech subsystem barrel exports.
3
+ *
4
+ * Re-exports the speech provider catalog utilities (TTS/STT provider lookup,
5
+ * configuration helpers, environment overrides) and the telephony call-client
6
+ * primitives (CallManager, codec conversion, SpeechRuntime).
7
+ *
8
+ * @module wunderland/voice
9
+ */
10
+ export { DEFAULT_VOICE_EXTENSIONS, getDefaultVoiceExtensions, getSpeechProviders, getSpeechProviderEntry, isSpeechProviderConfigured, normalizePreferredSpeechProviderId, createSpeechExtensionEnvOverrides, getPreferredRuntimeTtsProviderId, fileExtensionForSpeechMimeType, } from './speech-catalog.js';
11
+ export type { SpeechProviderDefaults } from './speech-catalog.js';
12
+ export { CallManager, convertPcmToMulaw8k, convertMulawToPcm16, escapeXml, validateE164, BuiltInAdaptiveVadProvider, ElevenLabsTextToSpeechProvider, OpenAITextToSpeechProvider, OpenAIWhisperSpeechToTextProvider, SpeechProviderRegistry, SpeechRuntime, SpeechSession, createSpeechRuntime, createSpeechRuntimeFromEnv, findSpeechProviderCatalogEntry, getDefaultSpeechProviderId, getSpeechProviderCatalog, getSpeechProviderKinds, } from './call-client.js';
13
+ export type { IVoiceCallProvider, InitiateCallInput, InitiateCallResult, HangupCallInput, PlayTtsInput, StartListeningInput, StopListeningInput, CallManagerEventType, CallManagerEvent, CallManagerEventHandler, SpeechAudioInput, SpeechProviderCatalogEntry, SpeechProviderKind, SpeechRuntimeConfig, SpeechRuntimeSessionConfig, SpeechSessionConfig, SpeechSessionState, SpeechSynthesisOptions, SpeechSynthesisResult, SpeechToTextProvider, SpeechTranscriptionOptions, SpeechTranscriptionResult, SpeechVadProvider, TextToSpeechProvider, WakeWordProvider, } from './call-client.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voice/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,sBAAsB,EACtB,0BAA0B,EAC1B,kCAAkC,EAClC,iCAAiC,EACjC,gCAAgC,EAChC,8BAA8B,GAC/B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAGlE,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,SAAS,EACT,YAAY,EACZ,0BAA0B,EAC1B,8BAA8B,EAC9B,0BAA0B,EAC1B,iCAAiC,EACjC,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,0BAA0B,EAC1B,8BAA8B,EAC9B,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,EAChB,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @fileoverview Voice and speech subsystem barrel exports.
3
+ *
4
+ * Re-exports the speech provider catalog utilities (TTS/STT provider lookup,
5
+ * configuration helpers, environment overrides) and the telephony call-client
6
+ * primitives (CallManager, codec conversion, SpeechRuntime).
7
+ *
8
+ * @module wunderland/voice
9
+ */
10
+ // ── Speech catalog (TTS/STT provider utilities) ───────────────────────────
11
+ export { DEFAULT_VOICE_EXTENSIONS, getDefaultVoiceExtensions, getSpeechProviders, getSpeechProviderEntry, isSpeechProviderConfigured, normalizePreferredSpeechProviderId, createSpeechExtensionEnvOverrides, getPreferredRuntimeTtsProviderId, fileExtensionForSpeechMimeType, } from './speech-catalog.js';
12
+ // ── Call client (telephony + speech runtime re-exports) ───────────────────
13
+ export { CallManager, convertPcmToMulaw8k, convertMulawToPcm16, escapeXml, validateE164, BuiltInAdaptiveVadProvider, ElevenLabsTextToSpeechProvider, OpenAITextToSpeechProvider, OpenAIWhisperSpeechToTextProvider, SpeechProviderRegistry, SpeechRuntime, SpeechSession, createSpeechRuntime, createSpeechRuntimeFromEnv, findSpeechProviderCatalogEntry, getDefaultSpeechProviderId, getSpeechProviderCatalog, getSpeechProviderKinds, } from './call-client.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/voice/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,6EAA6E;AAC7E,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,sBAAsB,EACtB,0BAA0B,EAC1B,kCAAkC,EAClC,iCAAiC,EACjC,gCAAgC,EAChC,8BAA8B,GAC/B,MAAM,qBAAqB,CAAC;AAG7B,6EAA6E;AAC7E,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,SAAS,EACT,YAAY,EACZ,0BAA0B,EAC1B,8BAA8B,EAC9B,0BAA0B,EAC1B,iCAAiC,EACjC,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,0BAA0B,EAC1B,8BAA8B,EAC9B,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wunderland",
3
- "version": "0.46.0",
3
+ "version": "0.48.0",
4
4
  "description": "Autonomous AI agent framework with cognitive memory, infinite-context graph-based RAG, and HEXACO personality modeling — built on OpenClaw with 5-tier prompt-injection defense, adaptive HyDE retrieval, observational memory with Ebbinghaus decay, 37 channel integrations, and a zero-config CLI",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -26,6 +26,30 @@
26
26
  "import": "./dist/advanced/*.js",
27
27
  "types": "./dist/advanced/*.d.ts"
28
28
  },
29
+ "./config": {
30
+ "import": "./dist/config/index.js",
31
+ "types": "./dist/config/index.d.ts"
32
+ },
33
+ "./security": {
34
+ "import": "./dist/security/index.js",
35
+ "types": "./dist/security/index.d.ts"
36
+ },
37
+ "./runtime": {
38
+ "import": "./dist/runtime/index.js",
39
+ "types": "./dist/runtime/index.d.ts"
40
+ },
41
+ "./storage": {
42
+ "import": "./dist/storage/index.js",
43
+ "types": "./dist/storage/index.d.ts"
44
+ },
45
+ "./guardrails": {
46
+ "import": "./dist/guardrails/index.js",
47
+ "types": "./dist/guardrails/index.d.ts"
48
+ },
49
+ "./voice": {
50
+ "import": "./dist/voice/index.js",
51
+ "types": "./dist/voice/index.d.ts"
52
+ },
29
53
  "./discovery": {
30
54
  "import": "./dist/discovery/index.js",
31
55
  "types": "./dist/discovery/index.d.ts"