wunderland 0.47.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":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAgBhD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAA4B,EAC5B,IAAiD;IAEjD,MAAM,OAAO,GAAyB,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IAEzD,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAEvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,yCAAyC;QACzC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,SAAS;QAEpE,IAAI,IAAI,EAAE,cAAc,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,2CAA2C,CAAC,CAAC;YAC7E,SAAS;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,EAAE,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,WAAW,MAAM,CAAC,MAAM,6BAA6B,CAAC,CAAC;QACnF,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,iBAAiB;QACjB,MAAM,IAAI,GAAG,gDAAgD,MAAM,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC;QACxF,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;QAEnC,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,MAAM,CAAC,EAAE;YACd,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK;YACL,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,MAAc;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAC7B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wunderland",
3
- "version": "0.47.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",