solfaces 1.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.
Files changed (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +518 -0
  3. package/dist/agent/index.cjs +51 -0
  4. package/dist/agent/index.cjs.map +1 -0
  5. package/dist/agent/index.d.cts +65 -0
  6. package/dist/agent/index.d.ts +65 -0
  7. package/dist/agent/index.js +6 -0
  8. package/dist/agent/index.js.map +1 -0
  9. package/dist/agent/mcp-server.cjs +836 -0
  10. package/dist/chunk-2DIKGLXZ.cjs +126 -0
  11. package/dist/chunk-2DIKGLXZ.cjs.map +1 -0
  12. package/dist/chunk-A6N3RPEA.cjs +111 -0
  13. package/dist/chunk-A6N3RPEA.cjs.map +1 -0
  14. package/dist/chunk-CVFO7YHY.cjs +97 -0
  15. package/dist/chunk-CVFO7YHY.cjs.map +1 -0
  16. package/dist/chunk-H3SK3MNX.cjs +409 -0
  17. package/dist/chunk-H3SK3MNX.cjs.map +1 -0
  18. package/dist/chunk-KSGFMW33.js +401 -0
  19. package/dist/chunk-KSGFMW33.js.map +1 -0
  20. package/dist/chunk-LQWJRHGC.js +86 -0
  21. package/dist/chunk-LQWJRHGC.js.map +1 -0
  22. package/dist/chunk-RX6D5FGH.js +211 -0
  23. package/dist/chunk-RX6D5FGH.js.map +1 -0
  24. package/dist/chunk-SNJABBAT.js +107 -0
  25. package/dist/chunk-SNJABBAT.js.map +1 -0
  26. package/dist/chunk-VMNATBH3.cjs +222 -0
  27. package/dist/chunk-VMNATBH3.cjs.map +1 -0
  28. package/dist/chunk-WURY4QGH.js +117 -0
  29. package/dist/chunk-WURY4QGH.js.map +1 -0
  30. package/dist/core/index.cjs +82 -0
  31. package/dist/core/index.cjs.map +1 -0
  32. package/dist/core/index.d.cts +104 -0
  33. package/dist/core/index.d.ts +104 -0
  34. package/dist/core/index.js +5 -0
  35. package/dist/core/index.js.map +1 -0
  36. package/dist/index.cjs +100 -0
  37. package/dist/index.cjs.map +1 -0
  38. package/dist/index.d.cts +4 -0
  39. package/dist/index.d.ts +4 -0
  40. package/dist/index.js +7 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/react/index.cjs +543 -0
  43. package/dist/react/index.cjs.map +1 -0
  44. package/dist/react/index.d.cts +28 -0
  45. package/dist/react/index.d.ts +28 -0
  46. package/dist/react/index.js +541 -0
  47. package/dist/react/index.js.map +1 -0
  48. package/dist/solfaces.cdn.global.js +3 -0
  49. package/dist/solfaces.cdn.global.js.map +1 -0
  50. package/dist/themes/index.cjs +48 -0
  51. package/dist/themes/index.cjs.map +1 -0
  52. package/dist/themes/index.d.cts +14 -0
  53. package/dist/themes/index.d.ts +14 -0
  54. package/dist/themes/index.js +3 -0
  55. package/dist/themes/index.js.map +1 -0
  56. package/dist/traits-DAFZnXeS.d.cts +61 -0
  57. package/dist/traits-DAFZnXeS.d.ts +61 -0
  58. package/dist/vanilla/index.cjs +43 -0
  59. package/dist/vanilla/index.cjs.map +1 -0
  60. package/dist/vanilla/index.d.cts +7 -0
  61. package/dist/vanilla/index.d.ts +7 -0
  62. package/dist/vanilla/index.js +39 -0
  63. package/dist/vanilla/index.js.map +1 -0
  64. package/package.json +100 -0
  65. package/python/solfaces.py +475 -0
  66. package/skill.md +463 -0
@@ -0,0 +1,211 @@
1
+ import { renderSolFaceSVG, describeAppearance, agentAppearancePrompt } from './chunk-KSGFMW33.js';
2
+ import { generateTraits, getTraitLabels, traitHash } from './chunk-WURY4QGH.js';
3
+ import { getPresetTheme, PRESET_THEMES } from './chunk-LQWJRHGC.js';
4
+
5
+ // src/agent/tools.ts
6
+ var generateSolfaceSvg = {
7
+ name: "generate_solface_svg",
8
+ description: "Generate a deterministic SVG avatar for a Solana wallet address. Returns an SVG string that can be embedded in HTML, saved as a file, or converted to a data URI. The same wallet always produces the same face.",
9
+ parameters: {
10
+ type: "object",
11
+ properties: {
12
+ wallet: {
13
+ type: "string",
14
+ description: "Solana wallet address (base58 public key)"
15
+ },
16
+ size: {
17
+ type: "number",
18
+ description: "SVG width/height in pixels. Default: 64"
19
+ },
20
+ theme: {
21
+ type: "string",
22
+ description: "Preset theme name: solana, dark, light, mono, neon, jupiter, phantom, circle",
23
+ enum: ["solana", "dark", "light", "mono", "neon", "jupiter", "phantom", "circle"]
24
+ },
25
+ enableBlink: {
26
+ type: "boolean",
27
+ description: "Enable CSS blink animation on the eyes. Default: false"
28
+ }
29
+ },
30
+ required: ["wallet"]
31
+ },
32
+ handler(params) {
33
+ const wallet = params.wallet;
34
+ const size = params.size ?? 64;
35
+ const enableBlink = params.enableBlink ?? false;
36
+ const themeName = params.theme;
37
+ const theme = themeName ? getPresetTheme(themeName) : void 0;
38
+ return renderSolFaceSVG(wallet, { size, theme, enableBlink });
39
+ }
40
+ };
41
+ var describeSolface = {
42
+ name: "describe_solface",
43
+ description: "Generate a natural language description of a wallet's SolFace avatar. Useful for alt text, profile bios, system prompts, and accessibility.",
44
+ parameters: {
45
+ type: "object",
46
+ properties: {
47
+ wallet: {
48
+ type: "string",
49
+ description: "Solana wallet address (base58 public key)"
50
+ },
51
+ format: {
52
+ type: "string",
53
+ description: "Output format: paragraph (flowing text), structured (labeled lines), compact (short comma-separated). Default: paragraph",
54
+ enum: ["paragraph", "structured", "compact"]
55
+ },
56
+ perspective: {
57
+ type: "string",
58
+ description: 'Narrative perspective: "first" for self-description ("I have..."), "third" for external ("This SolFace has..."). Default: third',
59
+ enum: ["first", "third"]
60
+ },
61
+ name: {
62
+ type: "string",
63
+ description: 'Optional name to use instead of "This SolFace" or "I". E.g. "Atlas"'
64
+ }
65
+ },
66
+ required: ["wallet"]
67
+ },
68
+ handler(params) {
69
+ return describeAppearance(params.wallet, {
70
+ format: params.format ?? "paragraph",
71
+ perspective: params.perspective ?? "third",
72
+ name: params.name
73
+ });
74
+ }
75
+ };
76
+ var getSolfaceTraits = {
77
+ name: "get_solface_traits",
78
+ description: "Get the raw numeric trait values, human-readable labels, and deterministic hash for a wallet's SolFace avatar. Returns structured data useful for programmatic decisions about appearance.",
79
+ parameters: {
80
+ type: "object",
81
+ properties: {
82
+ wallet: {
83
+ type: "string",
84
+ description: "Solana wallet address (base58 public key)"
85
+ }
86
+ },
87
+ required: ["wallet"]
88
+ },
89
+ handler(params) {
90
+ const wallet = params.wallet;
91
+ const traits = generateTraits(wallet);
92
+ const labels = getTraitLabels(traits);
93
+ const hash = traitHash(wallet);
94
+ return { traits, labels, hash };
95
+ }
96
+ };
97
+ var getAgentIdentity = {
98
+ name: "get_agent_identity",
99
+ description: "Generate a system prompt snippet that gives an AI agent a visual identity based on its Solana wallet. The snippet describes the agent's appearance in first person and explains the deterministic nature of SolFace avatars.",
100
+ parameters: {
101
+ type: "object",
102
+ properties: {
103
+ wallet: {
104
+ type: "string",
105
+ description: "The agent's Solana wallet address (base58 public key)"
106
+ },
107
+ agentName: {
108
+ type: "string",
109
+ description: 'Optional agent name to personalize the description. E.g. "Atlas"'
110
+ }
111
+ },
112
+ required: ["wallet"]
113
+ },
114
+ handler(params) {
115
+ return agentAppearancePrompt(
116
+ params.wallet,
117
+ params.agentName
118
+ );
119
+ }
120
+ };
121
+ var THEME_DESCRIPTIONS = {
122
+ solana: "Vibrant Solana brand colors (#14F195, #9945FF)",
123
+ dark: "Dark backgrounds with muted tones",
124
+ light: "Soft pastel backgrounds",
125
+ mono: "Full grayscale \u2014 all colors replaced with grays",
126
+ neon: "Cyberpunk high-contrast with neon accents and green border",
127
+ jupiter: "Jupiter aggregator dark blue palette with subtle border",
128
+ phantom: "Phantom wallet purple tones with subtle border",
129
+ circle: "Full circular border-radius (999px) for round avatars"
130
+ };
131
+ var listSolfaceThemes = {
132
+ name: "list_solface_themes",
133
+ description: "List all available SolFace preset themes with descriptions. Themes control colors, borders, backgrounds, and border-radius of generated avatars.",
134
+ parameters: {
135
+ type: "object",
136
+ properties: {}
137
+ },
138
+ handler() {
139
+ return Object.keys(PRESET_THEMES).map((name) => ({
140
+ name,
141
+ description: THEME_DESCRIPTIONS[name] ?? ""
142
+ }));
143
+ }
144
+ };
145
+ var SOLFACE_TOOLS = [
146
+ generateSolfaceSvg,
147
+ describeSolface,
148
+ getSolfaceTraits,
149
+ getAgentIdentity,
150
+ listSolfaceThemes
151
+ ];
152
+
153
+ // src/agent/index.ts
154
+ async function handleToolCall(name, params) {
155
+ const tool = SOLFACE_TOOLS.find((t) => t.name === name);
156
+ if (!tool) {
157
+ throw new Error(`Unknown SolFace tool: "${name}". Available: ${SOLFACE_TOOLS.map((t) => t.name).join(", ")}`);
158
+ }
159
+ return tool.handler(params);
160
+ }
161
+ function toMCP(tool) {
162
+ return {
163
+ name: tool.name,
164
+ description: tool.description,
165
+ inputSchema: tool.parameters
166
+ };
167
+ }
168
+ function allToolsMCP() {
169
+ return SOLFACE_TOOLS.map(toMCP);
170
+ }
171
+ function toOpenAI(tool) {
172
+ return {
173
+ type: "function",
174
+ function: {
175
+ name: tool.name,
176
+ description: tool.description,
177
+ parameters: tool.parameters
178
+ }
179
+ };
180
+ }
181
+ function allToolsOpenAI() {
182
+ return SOLFACE_TOOLS.map(toOpenAI);
183
+ }
184
+ function toAnthropic(tool) {
185
+ return {
186
+ name: tool.name,
187
+ description: tool.description,
188
+ input_schema: tool.parameters
189
+ };
190
+ }
191
+ function allToolsAnthropic() {
192
+ return SOLFACE_TOOLS.map(toAnthropic);
193
+ }
194
+ function toVercelAI(tool) {
195
+ return {
196
+ description: tool.description,
197
+ parameters: tool.parameters,
198
+ execute: async (params) => tool.handler(params)
199
+ };
200
+ }
201
+ function allToolsVercelAI() {
202
+ const result = {};
203
+ for (const tool of SOLFACE_TOOLS) {
204
+ result[tool.name] = toVercelAI(tool);
205
+ }
206
+ return result;
207
+ }
208
+
209
+ export { SOLFACE_TOOLS, allToolsAnthropic, allToolsMCP, allToolsOpenAI, allToolsVercelAI, handleToolCall, toAnthropic, toMCP, toOpenAI, toVercelAI };
210
+ //# sourceMappingURL=chunk-RX6D5FGH.js.map
211
+ //# sourceMappingURL=chunk-RX6D5FGH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent/tools.ts","../src/agent/index.ts"],"names":[],"mappings":"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","file":"chunk-RX6D5FGH.js","sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// SOLFACES — AI Agent Tool Definitions\n// Canonical, framework-agnostic tool schemas with handlers.\n// ═══════════════════════════════════════════════════════════════\n\nimport { renderSolFaceSVG } from \"../core/renderer\";\nimport { describeAppearance, agentAppearancePrompt } from \"../core/describe\";\nimport {\n generateTraits,\n getTraitLabels,\n traitHash,\n} from \"../core/traits\";\nimport { PRESET_THEMES, getPresetTheme } from \"../themes/presets\";\nimport type { SolFaceTheme } from \"../core/traits\";\n\n// ─── Types ───────────────────────────────────────\n\nexport interface JSONSchema {\n type: string;\n properties?: Record<string, JSONSchema & { description?: string; enum?: string[] }>;\n required?: string[];\n items?: JSONSchema;\n description?: string;\n enum?: string[];\n default?: unknown;\n}\n\nexport interface SolFaceTool {\n name: string;\n description: string;\n parameters: JSONSchema;\n handler: (params: Record<string, unknown>) => unknown;\n}\n\n// ─── Tool: generate_solface_svg ──────────────────\n\nconst generateSolfaceSvg: SolFaceTool = {\n name: \"generate_solface_svg\",\n description:\n \"Generate a deterministic SVG avatar for a Solana wallet address. Returns an SVG string that can be embedded in HTML, saved as a file, or converted to a data URI. The same wallet always produces the same face.\",\n parameters: {\n type: \"object\",\n properties: {\n wallet: {\n type: \"string\",\n description: \"Solana wallet address (base58 public key)\",\n },\n size: {\n type: \"number\",\n description: \"SVG width/height in pixels. Default: 64\",\n },\n theme: {\n type: \"string\",\n description:\n \"Preset theme name: solana, dark, light, mono, neon, jupiter, phantom, circle\",\n enum: [\"solana\", \"dark\", \"light\", \"mono\", \"neon\", \"jupiter\", \"phantom\", \"circle\"],\n },\n enableBlink: {\n type: \"boolean\",\n description: \"Enable CSS blink animation on the eyes. Default: false\",\n },\n },\n required: [\"wallet\"],\n },\n handler(params) {\n const wallet = params.wallet as string;\n const size = (params.size as number) ?? 64;\n const enableBlink = (params.enableBlink as boolean) ?? false;\n const themeName = params.theme as string | undefined;\n const theme: SolFaceTheme | undefined = themeName\n ? getPresetTheme(themeName)\n : undefined;\n\n return renderSolFaceSVG(wallet, { size, theme, enableBlink });\n },\n};\n\n// ─── Tool: describe_solface ──────────────────────\n\nconst describeSolface: SolFaceTool = {\n name: \"describe_solface\",\n description:\n \"Generate a natural language description of a wallet's SolFace avatar. Useful for alt text, profile bios, system prompts, and accessibility.\",\n parameters: {\n type: \"object\",\n properties: {\n wallet: {\n type: \"string\",\n description: \"Solana wallet address (base58 public key)\",\n },\n format: {\n type: \"string\",\n description:\n \"Output format: paragraph (flowing text), structured (labeled lines), compact (short comma-separated). Default: paragraph\",\n enum: [\"paragraph\", \"structured\", \"compact\"],\n },\n perspective: {\n type: \"string\",\n description:\n 'Narrative perspective: \"first\" for self-description (\"I have...\"), \"third\" for external (\"This SolFace has...\"). Default: third',\n enum: [\"first\", \"third\"],\n },\n name: {\n type: \"string\",\n description:\n 'Optional name to use instead of \"This SolFace\" or \"I\". E.g. \"Atlas\"',\n },\n },\n required: [\"wallet\"],\n },\n handler(params) {\n return describeAppearance(params.wallet as string, {\n format: (params.format as \"paragraph\" | \"structured\" | \"compact\") ?? \"paragraph\",\n perspective: (params.perspective as \"first\" | \"third\") ?? \"third\",\n name: params.name as string | undefined,\n });\n },\n};\n\n// ─── Tool: get_solface_traits ────────────────────\n\nconst getSolfaceTraits: SolFaceTool = {\n name: \"get_solface_traits\",\n description:\n \"Get the raw numeric trait values, human-readable labels, and deterministic hash for a wallet's SolFace avatar. Returns structured data useful for programmatic decisions about appearance.\",\n parameters: {\n type: \"object\",\n properties: {\n wallet: {\n type: \"string\",\n description: \"Solana wallet address (base58 public key)\",\n },\n },\n required: [\"wallet\"],\n },\n handler(params) {\n const wallet = params.wallet as string;\n const traits = generateTraits(wallet);\n const labels = getTraitLabels(traits);\n const hash = traitHash(wallet);\n return { traits, labels, hash };\n },\n};\n\n// ─── Tool: get_agent_identity ────────────────────\n\nconst getAgentIdentity: SolFaceTool = {\n name: \"get_agent_identity\",\n description:\n \"Generate a system prompt snippet that gives an AI agent a visual identity based on its Solana wallet. The snippet describes the agent's appearance in first person and explains the deterministic nature of SolFace avatars.\",\n parameters: {\n type: \"object\",\n properties: {\n wallet: {\n type: \"string\",\n description: \"The agent's Solana wallet address (base58 public key)\",\n },\n agentName: {\n type: \"string\",\n description: 'Optional agent name to personalize the description. E.g. \"Atlas\"',\n },\n },\n required: [\"wallet\"],\n },\n handler(params) {\n return agentAppearancePrompt(\n params.wallet as string,\n params.agentName as string | undefined,\n );\n },\n};\n\n// ─── Tool: list_solface_themes ───────────────────\n\nconst THEME_DESCRIPTIONS: Record<string, string> = {\n solana: \"Vibrant Solana brand colors (#14F195, #9945FF)\",\n dark: \"Dark backgrounds with muted tones\",\n light: \"Soft pastel backgrounds\",\n mono: \"Full grayscale — all colors replaced with grays\",\n neon: \"Cyberpunk high-contrast with neon accents and green border\",\n jupiter: \"Jupiter aggregator dark blue palette with subtle border\",\n phantom: \"Phantom wallet purple tones with subtle border\",\n circle: \"Full circular border-radius (999px) for round avatars\",\n};\n\nconst listSolfaceThemes: SolFaceTool = {\n name: \"list_solface_themes\",\n description:\n \"List all available SolFace preset themes with descriptions. Themes control colors, borders, backgrounds, and border-radius of generated avatars.\",\n parameters: {\n type: \"object\",\n properties: {},\n },\n handler() {\n return Object.keys(PRESET_THEMES).map((name) => ({\n name,\n description: THEME_DESCRIPTIONS[name] ?? \"\",\n }));\n },\n};\n\n// ─── Export All Tools ────────────────────────────\n\nexport const SOLFACE_TOOLS: SolFaceTool[] = [\n generateSolfaceSvg,\n describeSolface,\n getSolfaceTraits,\n getAgentIdentity,\n listSolfaceThemes,\n];\n","// ═══════════════════════════════════════════════════════════════\n// SOLFACES — Agent Integration Barrel + Format Adapters\n// Convert SolFace tools to any AI agent framework format.\n// ═══════════════════════════════════════════════════════════════\n\nexport { SOLFACE_TOOLS } from \"./tools\";\nexport type { SolFaceTool, JSONSchema } from \"./tools\";\n\nimport { SOLFACE_TOOLS } from \"./tools\";\nimport type { SolFaceTool, JSONSchema } from \"./tools\";\n\n// ─── Unified Dispatcher ─────────────────────────\n\n/**\n * Handle a tool call by name. Works as a universal dispatcher for\n * any framework — just pass the tool name and parameters.\n *\n * @example\n * ```ts\n * const svg = await handleToolCall(\"generate_solface_svg\", {\n * wallet: \"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU\"\n * });\n * ```\n */\nexport async function handleToolCall(\n name: string,\n params: Record<string, unknown>,\n): Promise<unknown> {\n const tool = SOLFACE_TOOLS.find((t) => t.name === name);\n if (!tool) {\n throw new Error(`Unknown SolFace tool: \"${name}\". Available: ${SOLFACE_TOOLS.map((t) => t.name).join(\", \")}`);\n }\n return tool.handler(params);\n}\n\n// ─── MCP Format ─────────────────────────────────\n// Model Context Protocol (Claude Code, Cursor, Windsurf)\n\nexport interface MCPTool {\n name: string;\n description: string;\n inputSchema: JSONSchema;\n}\n\nexport function toMCP(tool: SolFaceTool): MCPTool {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.parameters,\n };\n}\n\nexport function allToolsMCP(): MCPTool[] {\n return SOLFACE_TOOLS.map(toMCP);\n}\n\n// ─── OpenAI Format ──────────────────────────────\n// OpenAI function calling / GPT Actions\n\nexport interface OpenAITool {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: JSONSchema;\n };\n}\n\nexport function toOpenAI(tool: SolFaceTool): OpenAITool {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n };\n}\n\nexport function allToolsOpenAI(): OpenAITool[] {\n return SOLFACE_TOOLS.map(toOpenAI);\n}\n\n// ─── Anthropic Format ───────────────────────────\n// Anthropic tool use (Claude API)\n\nexport interface AnthropicTool {\n name: string;\n description: string;\n input_schema: JSONSchema;\n}\n\nexport function toAnthropic(tool: SolFaceTool): AnthropicTool {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.parameters,\n };\n}\n\nexport function allToolsAnthropic(): AnthropicTool[] {\n return SOLFACE_TOOLS.map(toAnthropic);\n}\n\n// ─── Vercel AI SDK Format ───────────────────────\n// For use with Vercel AI SDK's `tool()` helper\n\nexport interface VercelAITool {\n description: string;\n parameters: JSONSchema;\n execute: (params: Record<string, unknown>) => Promise<unknown>;\n}\n\nexport function toVercelAI(tool: SolFaceTool): VercelAITool {\n return {\n description: tool.description,\n parameters: tool.parameters,\n execute: async (params) => tool.handler(params),\n };\n}\n\nexport function allToolsVercelAI(): Record<string, VercelAITool> {\n const result: Record<string, VercelAITool> = {};\n for (const tool of SOLFACE_TOOLS) {\n result[tool.name] = toVercelAI(tool);\n }\n return result;\n}\n"]}
@@ -0,0 +1,107 @@
1
+ import { renderSolFaceSVG } from './chunk-KSGFMW33.js';
2
+
3
+ // src/core/rasterize.ts
4
+ async function renderSolFacePNG(walletAddress, options) {
5
+ const { pngSize = 256, ...renderOpts } = options ?? {};
6
+ const svg = renderSolFaceSVG(walletAddress, {
7
+ ...renderOpts,
8
+ size: pngSize
9
+ });
10
+ const svgBuffer = Buffer.from(svg);
11
+ try {
12
+ const sharp = await import('sharp');
13
+ return await sharp.default(svgBuffer).resize(pngSize, pngSize).png().toBuffer();
14
+ } catch {
15
+ }
16
+ try {
17
+ const { Resvg } = await import('@resvg/resvg-js');
18
+ const resvg = new Resvg(svg, {
19
+ fitTo: { mode: "width", value: pngSize }
20
+ });
21
+ const pngData = resvg.render();
22
+ return Buffer.from(pngData.asPng());
23
+ } catch {
24
+ }
25
+ throw new Error(
26
+ "[SolFaces] PNG rasterization requires either `sharp` or `@resvg/resvg-js`. Install one: npm install sharp OR npm install @resvg/resvg-js"
27
+ );
28
+ }
29
+ async function renderSolFacePNGBrowser(walletAddress, options) {
30
+ const { pngSize = 256, ...renderOpts } = options ?? {};
31
+ const svg = renderSolFaceSVG(walletAddress, {
32
+ ...renderOpts,
33
+ size: pngSize
34
+ });
35
+ const svgBlob = new Blob([svg], { type: "image/svg+xml;charset=utf-8" });
36
+ const url = URL.createObjectURL(svgBlob);
37
+ return new Promise((resolve, reject) => {
38
+ const img = new Image();
39
+ img.onload = () => {
40
+ let canvas;
41
+ let ctx;
42
+ if (typeof OffscreenCanvas !== "undefined") {
43
+ canvas = new OffscreenCanvas(pngSize, pngSize);
44
+ ctx = canvas.getContext("2d");
45
+ } else {
46
+ canvas = document.createElement("canvas");
47
+ canvas.width = pngSize;
48
+ canvas.height = pngSize;
49
+ ctx = canvas.getContext("2d");
50
+ }
51
+ if (!ctx) {
52
+ URL.revokeObjectURL(url);
53
+ reject(new Error("[SolFaces] Could not get canvas context"));
54
+ return;
55
+ }
56
+ ctx.drawImage(img, 0, 0, pngSize, pngSize);
57
+ URL.revokeObjectURL(url);
58
+ if (canvas instanceof OffscreenCanvas) {
59
+ canvas.convertToBlob({ type: "image/png" }).then(resolve).catch(reject);
60
+ } else {
61
+ canvas.toBlob((blob) => {
62
+ if (blob) resolve(blob);
63
+ else reject(new Error("[SolFaces] Canvas toBlob failed"));
64
+ }, "image/png");
65
+ }
66
+ };
67
+ img.onerror = () => {
68
+ URL.revokeObjectURL(url);
69
+ reject(new Error("[SolFaces] Failed to load SVG into image"));
70
+ };
71
+ img.src = url;
72
+ });
73
+ }
74
+ async function renderSolFacePNGDataURL(walletAddress, options) {
75
+ const { pngSize = 256, ...renderOpts } = options ?? {};
76
+ const svg = renderSolFaceSVG(walletAddress, {
77
+ ...renderOpts,
78
+ size: pngSize
79
+ });
80
+ const svgBlob = new Blob([svg], { type: "image/svg+xml;charset=utf-8" });
81
+ const url = URL.createObjectURL(svgBlob);
82
+ return new Promise((resolve, reject) => {
83
+ const img = new Image();
84
+ img.onload = () => {
85
+ const canvas = document.createElement("canvas");
86
+ canvas.width = pngSize;
87
+ canvas.height = pngSize;
88
+ const ctx = canvas.getContext("2d");
89
+ if (!ctx) {
90
+ reject(new Error("[SolFaces] No canvas context"));
91
+ return;
92
+ }
93
+ ctx.drawImage(img, 0, 0, pngSize, pngSize);
94
+ URL.revokeObjectURL(url);
95
+ resolve(canvas.toDataURL("image/png"));
96
+ };
97
+ img.onerror = () => {
98
+ URL.revokeObjectURL(url);
99
+ reject(new Error("[SolFaces] SVG load failed"));
100
+ };
101
+ img.src = url;
102
+ });
103
+ }
104
+
105
+ export { renderSolFacePNG, renderSolFacePNGBrowser, renderSolFacePNGDataURL };
106
+ //# sourceMappingURL=chunk-SNJABBAT.js.map
107
+ //# sourceMappingURL=chunk-SNJABBAT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/rasterize.ts"],"names":[],"mappings":"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","file":"chunk-SNJABBAT.js","sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// SOLFACES — PNG Rasterizer\n// Converts SolFace SVGs to PNG buffers for use in bots, APIs,\n// Discord embeds, Telegram, emails, and non-SVG contexts.\n//\n// Works in:\n// - Node.js (via sharp or canvas fallback)\n// - Browser (via OffscreenCanvas or <canvas>)\n// - Edge functions (via resvg-wasm)\n// ═══════════════════════════════════════════════════════════════\n\nimport { renderSolFaceSVG, type RenderOptions } from \"./renderer\";\n\nexport interface PNGOptions extends RenderOptions {\n /** Output pixel size (both width and height). Default: 256 */\n pngSize?: number;\n /** PNG quality (0-1, only affects some renderers). Default: 1 */\n quality?: number;\n}\n\n// ─── Node.js Rasterization ───────────────────────────────────\n\n/**\n * Render a SolFace as a PNG Buffer using `sharp`.\n * Requires: `npm install sharp`\n *\n * @returns PNG buffer\n *\n * @example\n * ```ts\n * import { renderSolFacePNG } from \"solfaces/core/rasterize\";\n *\n * const png = await renderSolFacePNG(\"7xKXq...\", { pngSize: 256 });\n * fs.writeFileSync(\"avatar.png\", png);\n * ```\n */\nexport async function renderSolFacePNG(\n walletAddress: string,\n options?: PNGOptions\n): Promise<Buffer> {\n const { pngSize = 256, ...renderOpts } = options ?? {};\n\n // Generate SVG at the target resolution\n const svg = renderSolFaceSVG(walletAddress, {\n ...renderOpts,\n size: pngSize,\n });\n const svgBuffer = Buffer.from(svg);\n\n // Try sharp first (best quality, most common in Node)\n try {\n const sharp = await import(\"sharp\");\n return await sharp\n .default(svgBuffer)\n .resize(pngSize, pngSize)\n .png()\n .toBuffer();\n } catch {\n // sharp not installed — fall through\n }\n\n // Try @resvg/resvg-js (good for edge/serverless)\n try {\n const { Resvg } = await import(\"@resvg/resvg-js\");\n const resvg = new Resvg(svg, {\n fitTo: { mode: \"width\", value: pngSize },\n });\n const pngData = resvg.render();\n return Buffer.from(pngData.asPng());\n } catch {\n // resvg not installed\n }\n\n throw new Error(\n \"[SolFaces] PNG rasterization requires either `sharp` or `@resvg/resvg-js`. \" +\n \"Install one: npm install sharp OR npm install @resvg/resvg-js\"\n );\n}\n\n// ─── Browser Rasterization ───────────────────────────────────\n\n/**\n * Render a SolFace as a PNG Blob in the browser.\n * Uses Canvas API — works in all modern browsers.\n *\n * @returns PNG Blob\n *\n * @example\n * ```ts\n * const blob = await renderSolFacePNGBrowser(\"7xKXq...\", { pngSize: 256 });\n * const url = URL.createObjectURL(blob);\n * img.src = url;\n * ```\n */\nexport async function renderSolFacePNGBrowser(\n walletAddress: string,\n options?: PNGOptions\n): Promise<Blob> {\n const { pngSize = 256, ...renderOpts } = options ?? {};\n\n const svg = renderSolFaceSVG(walletAddress, {\n ...renderOpts,\n size: pngSize,\n });\n\n // Create image from SVG data URI\n const svgBlob = new Blob([svg], { type: \"image/svg+xml;charset=utf-8\" });\n const url = URL.createObjectURL(svgBlob);\n\n return new Promise<Blob>((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n // Use OffscreenCanvas if available (better perf)\n let canvas: HTMLCanvasElement | OffscreenCanvas;\n let ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n\n if (typeof OffscreenCanvas !== \"undefined\") {\n canvas = new OffscreenCanvas(pngSize, pngSize);\n ctx = canvas.getContext(\"2d\");\n } else {\n canvas = document.createElement(\"canvas\");\n canvas.width = pngSize;\n canvas.height = pngSize;\n ctx = canvas.getContext(\"2d\");\n }\n\n if (!ctx) {\n URL.revokeObjectURL(url);\n reject(new Error(\"[SolFaces] Could not get canvas context\"));\n return;\n }\n\n ctx.drawImage(img, 0, 0, pngSize, pngSize);\n URL.revokeObjectURL(url);\n\n if (canvas instanceof OffscreenCanvas) {\n canvas.convertToBlob({ type: \"image/png\" }).then(resolve).catch(reject);\n } else {\n canvas.toBlob((blob) => {\n if (blob) resolve(blob);\n else reject(new Error(\"[SolFaces] Canvas toBlob failed\"));\n }, \"image/png\");\n }\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error(\"[SolFaces] Failed to load SVG into image\"));\n };\n\n img.src = url;\n });\n}\n\n/**\n * Render a SolFace as a PNG data URL in the browser.\n * Convenient for directly setting img.src without blob URLs.\n */\nexport async function renderSolFacePNGDataURL(\n walletAddress: string,\n options?: PNGOptions\n): Promise<string> {\n const { pngSize = 256, ...renderOpts } = options ?? {};\n\n const svg = renderSolFaceSVG(walletAddress, {\n ...renderOpts,\n size: pngSize,\n });\n\n const svgBlob = new Blob([svg], { type: \"image/svg+xml;charset=utf-8\" });\n const url = URL.createObjectURL(svgBlob);\n\n return new Promise<string>((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = pngSize;\n canvas.height = pngSize;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n reject(new Error(\"[SolFaces] No canvas context\"));\n return;\n }\n ctx.drawImage(img, 0, 0, pngSize, pngSize);\n URL.revokeObjectURL(url);\n resolve(canvas.toDataURL(\"image/png\"));\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error(\"[SolFaces] SVG load failed\"));\n };\n img.src = url;\n });\n}\n"]}
@@ -0,0 +1,222 @@
1
+ 'use strict';
2
+
3
+ var chunkH3SK3MNX_cjs = require('./chunk-H3SK3MNX.cjs');
4
+ var chunk2DIKGLXZ_cjs = require('./chunk-2DIKGLXZ.cjs');
5
+ var chunkCVFO7YHY_cjs = require('./chunk-CVFO7YHY.cjs');
6
+
7
+ // src/agent/tools.ts
8
+ var generateSolfaceSvg = {
9
+ name: "generate_solface_svg",
10
+ description: "Generate a deterministic SVG avatar for a Solana wallet address. Returns an SVG string that can be embedded in HTML, saved as a file, or converted to a data URI. The same wallet always produces the same face.",
11
+ parameters: {
12
+ type: "object",
13
+ properties: {
14
+ wallet: {
15
+ type: "string",
16
+ description: "Solana wallet address (base58 public key)"
17
+ },
18
+ size: {
19
+ type: "number",
20
+ description: "SVG width/height in pixels. Default: 64"
21
+ },
22
+ theme: {
23
+ type: "string",
24
+ description: "Preset theme name: solana, dark, light, mono, neon, jupiter, phantom, circle",
25
+ enum: ["solana", "dark", "light", "mono", "neon", "jupiter", "phantom", "circle"]
26
+ },
27
+ enableBlink: {
28
+ type: "boolean",
29
+ description: "Enable CSS blink animation on the eyes. Default: false"
30
+ }
31
+ },
32
+ required: ["wallet"]
33
+ },
34
+ handler(params) {
35
+ const wallet = params.wallet;
36
+ const size = params.size ?? 64;
37
+ const enableBlink = params.enableBlink ?? false;
38
+ const themeName = params.theme;
39
+ const theme = themeName ? chunkCVFO7YHY_cjs.getPresetTheme(themeName) : void 0;
40
+ return chunkH3SK3MNX_cjs.renderSolFaceSVG(wallet, { size, theme, enableBlink });
41
+ }
42
+ };
43
+ var describeSolface = {
44
+ name: "describe_solface",
45
+ description: "Generate a natural language description of a wallet's SolFace avatar. Useful for alt text, profile bios, system prompts, and accessibility.",
46
+ parameters: {
47
+ type: "object",
48
+ properties: {
49
+ wallet: {
50
+ type: "string",
51
+ description: "Solana wallet address (base58 public key)"
52
+ },
53
+ format: {
54
+ type: "string",
55
+ description: "Output format: paragraph (flowing text), structured (labeled lines), compact (short comma-separated). Default: paragraph",
56
+ enum: ["paragraph", "structured", "compact"]
57
+ },
58
+ perspective: {
59
+ type: "string",
60
+ description: 'Narrative perspective: "first" for self-description ("I have..."), "third" for external ("This SolFace has..."). Default: third',
61
+ enum: ["first", "third"]
62
+ },
63
+ name: {
64
+ type: "string",
65
+ description: 'Optional name to use instead of "This SolFace" or "I". E.g. "Atlas"'
66
+ }
67
+ },
68
+ required: ["wallet"]
69
+ },
70
+ handler(params) {
71
+ return chunkH3SK3MNX_cjs.describeAppearance(params.wallet, {
72
+ format: params.format ?? "paragraph",
73
+ perspective: params.perspective ?? "third",
74
+ name: params.name
75
+ });
76
+ }
77
+ };
78
+ var getSolfaceTraits = {
79
+ name: "get_solface_traits",
80
+ description: "Get the raw numeric trait values, human-readable labels, and deterministic hash for a wallet's SolFace avatar. Returns structured data useful for programmatic decisions about appearance.",
81
+ parameters: {
82
+ type: "object",
83
+ properties: {
84
+ wallet: {
85
+ type: "string",
86
+ description: "Solana wallet address (base58 public key)"
87
+ }
88
+ },
89
+ required: ["wallet"]
90
+ },
91
+ handler(params) {
92
+ const wallet = params.wallet;
93
+ const traits = chunk2DIKGLXZ_cjs.generateTraits(wallet);
94
+ const labels = chunk2DIKGLXZ_cjs.getTraitLabels(traits);
95
+ const hash = chunk2DIKGLXZ_cjs.traitHash(wallet);
96
+ return { traits, labels, hash };
97
+ }
98
+ };
99
+ var getAgentIdentity = {
100
+ name: "get_agent_identity",
101
+ description: "Generate a system prompt snippet that gives an AI agent a visual identity based on its Solana wallet. The snippet describes the agent's appearance in first person and explains the deterministic nature of SolFace avatars.",
102
+ parameters: {
103
+ type: "object",
104
+ properties: {
105
+ wallet: {
106
+ type: "string",
107
+ description: "The agent's Solana wallet address (base58 public key)"
108
+ },
109
+ agentName: {
110
+ type: "string",
111
+ description: 'Optional agent name to personalize the description. E.g. "Atlas"'
112
+ }
113
+ },
114
+ required: ["wallet"]
115
+ },
116
+ handler(params) {
117
+ return chunkH3SK3MNX_cjs.agentAppearancePrompt(
118
+ params.wallet,
119
+ params.agentName
120
+ );
121
+ }
122
+ };
123
+ var THEME_DESCRIPTIONS = {
124
+ solana: "Vibrant Solana brand colors (#14F195, #9945FF)",
125
+ dark: "Dark backgrounds with muted tones",
126
+ light: "Soft pastel backgrounds",
127
+ mono: "Full grayscale \u2014 all colors replaced with grays",
128
+ neon: "Cyberpunk high-contrast with neon accents and green border",
129
+ jupiter: "Jupiter aggregator dark blue palette with subtle border",
130
+ phantom: "Phantom wallet purple tones with subtle border",
131
+ circle: "Full circular border-radius (999px) for round avatars"
132
+ };
133
+ var listSolfaceThemes = {
134
+ name: "list_solface_themes",
135
+ description: "List all available SolFace preset themes with descriptions. Themes control colors, borders, backgrounds, and border-radius of generated avatars.",
136
+ parameters: {
137
+ type: "object",
138
+ properties: {}
139
+ },
140
+ handler() {
141
+ return Object.keys(chunkCVFO7YHY_cjs.PRESET_THEMES).map((name) => ({
142
+ name,
143
+ description: THEME_DESCRIPTIONS[name] ?? ""
144
+ }));
145
+ }
146
+ };
147
+ var SOLFACE_TOOLS = [
148
+ generateSolfaceSvg,
149
+ describeSolface,
150
+ getSolfaceTraits,
151
+ getAgentIdentity,
152
+ listSolfaceThemes
153
+ ];
154
+
155
+ // src/agent/index.ts
156
+ async function handleToolCall(name, params) {
157
+ const tool = SOLFACE_TOOLS.find((t) => t.name === name);
158
+ if (!tool) {
159
+ throw new Error(`Unknown SolFace tool: "${name}". Available: ${SOLFACE_TOOLS.map((t) => t.name).join(", ")}`);
160
+ }
161
+ return tool.handler(params);
162
+ }
163
+ function toMCP(tool) {
164
+ return {
165
+ name: tool.name,
166
+ description: tool.description,
167
+ inputSchema: tool.parameters
168
+ };
169
+ }
170
+ function allToolsMCP() {
171
+ return SOLFACE_TOOLS.map(toMCP);
172
+ }
173
+ function toOpenAI(tool) {
174
+ return {
175
+ type: "function",
176
+ function: {
177
+ name: tool.name,
178
+ description: tool.description,
179
+ parameters: tool.parameters
180
+ }
181
+ };
182
+ }
183
+ function allToolsOpenAI() {
184
+ return SOLFACE_TOOLS.map(toOpenAI);
185
+ }
186
+ function toAnthropic(tool) {
187
+ return {
188
+ name: tool.name,
189
+ description: tool.description,
190
+ input_schema: tool.parameters
191
+ };
192
+ }
193
+ function allToolsAnthropic() {
194
+ return SOLFACE_TOOLS.map(toAnthropic);
195
+ }
196
+ function toVercelAI(tool) {
197
+ return {
198
+ description: tool.description,
199
+ parameters: tool.parameters,
200
+ execute: async (params) => tool.handler(params)
201
+ };
202
+ }
203
+ function allToolsVercelAI() {
204
+ const result = {};
205
+ for (const tool of SOLFACE_TOOLS) {
206
+ result[tool.name] = toVercelAI(tool);
207
+ }
208
+ return result;
209
+ }
210
+
211
+ exports.SOLFACE_TOOLS = SOLFACE_TOOLS;
212
+ exports.allToolsAnthropic = allToolsAnthropic;
213
+ exports.allToolsMCP = allToolsMCP;
214
+ exports.allToolsOpenAI = allToolsOpenAI;
215
+ exports.allToolsVercelAI = allToolsVercelAI;
216
+ exports.handleToolCall = handleToolCall;
217
+ exports.toAnthropic = toAnthropic;
218
+ exports.toMCP = toMCP;
219
+ exports.toOpenAI = toOpenAI;
220
+ exports.toVercelAI = toVercelAI;
221
+ //# sourceMappingURL=chunk-VMNATBH3.cjs.map
222
+ //# sourceMappingURL=chunk-VMNATBH3.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent/tools.ts","../src/agent/index.ts"],"names":["getPresetTheme","renderSolFaceSVG","describeAppearance","generateTraits","getTraitLabels","traitHash","agentAppearancePrompt","PRESET_THEMES"],"mappings":"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","file":"chunk-VMNATBH3.cjs","sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// SOLFACES — AI Agent Tool Definitions\n// Canonical, framework-agnostic tool schemas with handlers.\n// ═══════════════════════════════════════════════════════════════\n\nimport { renderSolFaceSVG } from \"../core/renderer\";\nimport { describeAppearance, agentAppearancePrompt } from \"../core/describe\";\nimport {\n generateTraits,\n getTraitLabels,\n traitHash,\n} from \"../core/traits\";\nimport { PRESET_THEMES, getPresetTheme } from \"../themes/presets\";\nimport type { SolFaceTheme } from \"../core/traits\";\n\n// ─── Types ───────────────────────────────────────\n\nexport interface JSONSchema {\n type: string;\n properties?: Record<string, JSONSchema & { description?: string; enum?: string[] }>;\n required?: string[];\n items?: JSONSchema;\n description?: string;\n enum?: string[];\n default?: unknown;\n}\n\nexport interface SolFaceTool {\n name: string;\n description: string;\n parameters: JSONSchema;\n handler: (params: Record<string, unknown>) => unknown;\n}\n\n// ─── Tool: generate_solface_svg ──────────────────\n\nconst generateSolfaceSvg: SolFaceTool = {\n name: \"generate_solface_svg\",\n description:\n \"Generate a deterministic SVG avatar for a Solana wallet address. Returns an SVG string that can be embedded in HTML, saved as a file, or converted to a data URI. The same wallet always produces the same face.\",\n parameters: {\n type: \"object\",\n properties: {\n wallet: {\n type: \"string\",\n description: \"Solana wallet address (base58 public key)\",\n },\n size: {\n type: \"number\",\n description: \"SVG width/height in pixels. Default: 64\",\n },\n theme: {\n type: \"string\",\n description:\n \"Preset theme name: solana, dark, light, mono, neon, jupiter, phantom, circle\",\n enum: [\"solana\", \"dark\", \"light\", \"mono\", \"neon\", \"jupiter\", \"phantom\", \"circle\"],\n },\n enableBlink: {\n type: \"boolean\",\n description: \"Enable CSS blink animation on the eyes. Default: false\",\n },\n },\n required: [\"wallet\"],\n },\n handler(params) {\n const wallet = params.wallet as string;\n const size = (params.size as number) ?? 64;\n const enableBlink = (params.enableBlink as boolean) ?? false;\n const themeName = params.theme as string | undefined;\n const theme: SolFaceTheme | undefined = themeName\n ? getPresetTheme(themeName)\n : undefined;\n\n return renderSolFaceSVG(wallet, { size, theme, enableBlink });\n },\n};\n\n// ─── Tool: describe_solface ──────────────────────\n\nconst describeSolface: SolFaceTool = {\n name: \"describe_solface\",\n description:\n \"Generate a natural language description of a wallet's SolFace avatar. Useful for alt text, profile bios, system prompts, and accessibility.\",\n parameters: {\n type: \"object\",\n properties: {\n wallet: {\n type: \"string\",\n description: \"Solana wallet address (base58 public key)\",\n },\n format: {\n type: \"string\",\n description:\n \"Output format: paragraph (flowing text), structured (labeled lines), compact (short comma-separated). Default: paragraph\",\n enum: [\"paragraph\", \"structured\", \"compact\"],\n },\n perspective: {\n type: \"string\",\n description:\n 'Narrative perspective: \"first\" for self-description (\"I have...\"), \"third\" for external (\"This SolFace has...\"). Default: third',\n enum: [\"first\", \"third\"],\n },\n name: {\n type: \"string\",\n description:\n 'Optional name to use instead of \"This SolFace\" or \"I\". E.g. \"Atlas\"',\n },\n },\n required: [\"wallet\"],\n },\n handler(params) {\n return describeAppearance(params.wallet as string, {\n format: (params.format as \"paragraph\" | \"structured\" | \"compact\") ?? \"paragraph\",\n perspective: (params.perspective as \"first\" | \"third\") ?? \"third\",\n name: params.name as string | undefined,\n });\n },\n};\n\n// ─── Tool: get_solface_traits ────────────────────\n\nconst getSolfaceTraits: SolFaceTool = {\n name: \"get_solface_traits\",\n description:\n \"Get the raw numeric trait values, human-readable labels, and deterministic hash for a wallet's SolFace avatar. Returns structured data useful for programmatic decisions about appearance.\",\n parameters: {\n type: \"object\",\n properties: {\n wallet: {\n type: \"string\",\n description: \"Solana wallet address (base58 public key)\",\n },\n },\n required: [\"wallet\"],\n },\n handler(params) {\n const wallet = params.wallet as string;\n const traits = generateTraits(wallet);\n const labels = getTraitLabels(traits);\n const hash = traitHash(wallet);\n return { traits, labels, hash };\n },\n};\n\n// ─── Tool: get_agent_identity ────────────────────\n\nconst getAgentIdentity: SolFaceTool = {\n name: \"get_agent_identity\",\n description:\n \"Generate a system prompt snippet that gives an AI agent a visual identity based on its Solana wallet. The snippet describes the agent's appearance in first person and explains the deterministic nature of SolFace avatars.\",\n parameters: {\n type: \"object\",\n properties: {\n wallet: {\n type: \"string\",\n description: \"The agent's Solana wallet address (base58 public key)\",\n },\n agentName: {\n type: \"string\",\n description: 'Optional agent name to personalize the description. E.g. \"Atlas\"',\n },\n },\n required: [\"wallet\"],\n },\n handler(params) {\n return agentAppearancePrompt(\n params.wallet as string,\n params.agentName as string | undefined,\n );\n },\n};\n\n// ─── Tool: list_solface_themes ───────────────────\n\nconst THEME_DESCRIPTIONS: Record<string, string> = {\n solana: \"Vibrant Solana brand colors (#14F195, #9945FF)\",\n dark: \"Dark backgrounds with muted tones\",\n light: \"Soft pastel backgrounds\",\n mono: \"Full grayscale — all colors replaced with grays\",\n neon: \"Cyberpunk high-contrast with neon accents and green border\",\n jupiter: \"Jupiter aggregator dark blue palette with subtle border\",\n phantom: \"Phantom wallet purple tones with subtle border\",\n circle: \"Full circular border-radius (999px) for round avatars\",\n};\n\nconst listSolfaceThemes: SolFaceTool = {\n name: \"list_solface_themes\",\n description:\n \"List all available SolFace preset themes with descriptions. Themes control colors, borders, backgrounds, and border-radius of generated avatars.\",\n parameters: {\n type: \"object\",\n properties: {},\n },\n handler() {\n return Object.keys(PRESET_THEMES).map((name) => ({\n name,\n description: THEME_DESCRIPTIONS[name] ?? \"\",\n }));\n },\n};\n\n// ─── Export All Tools ────────────────────────────\n\nexport const SOLFACE_TOOLS: SolFaceTool[] = [\n generateSolfaceSvg,\n describeSolface,\n getSolfaceTraits,\n getAgentIdentity,\n listSolfaceThemes,\n];\n","// ═══════════════════════════════════════════════════════════════\n// SOLFACES — Agent Integration Barrel + Format Adapters\n// Convert SolFace tools to any AI agent framework format.\n// ═══════════════════════════════════════════════════════════════\n\nexport { SOLFACE_TOOLS } from \"./tools\";\nexport type { SolFaceTool, JSONSchema } from \"./tools\";\n\nimport { SOLFACE_TOOLS } from \"./tools\";\nimport type { SolFaceTool, JSONSchema } from \"./tools\";\n\n// ─── Unified Dispatcher ─────────────────────────\n\n/**\n * Handle a tool call by name. Works as a universal dispatcher for\n * any framework — just pass the tool name and parameters.\n *\n * @example\n * ```ts\n * const svg = await handleToolCall(\"generate_solface_svg\", {\n * wallet: \"7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU\"\n * });\n * ```\n */\nexport async function handleToolCall(\n name: string,\n params: Record<string, unknown>,\n): Promise<unknown> {\n const tool = SOLFACE_TOOLS.find((t) => t.name === name);\n if (!tool) {\n throw new Error(`Unknown SolFace tool: \"${name}\". Available: ${SOLFACE_TOOLS.map((t) => t.name).join(\", \")}`);\n }\n return tool.handler(params);\n}\n\n// ─── MCP Format ─────────────────────────────────\n// Model Context Protocol (Claude Code, Cursor, Windsurf)\n\nexport interface MCPTool {\n name: string;\n description: string;\n inputSchema: JSONSchema;\n}\n\nexport function toMCP(tool: SolFaceTool): MCPTool {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.parameters,\n };\n}\n\nexport function allToolsMCP(): MCPTool[] {\n return SOLFACE_TOOLS.map(toMCP);\n}\n\n// ─── OpenAI Format ──────────────────────────────\n// OpenAI function calling / GPT Actions\n\nexport interface OpenAITool {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: JSONSchema;\n };\n}\n\nexport function toOpenAI(tool: SolFaceTool): OpenAITool {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n };\n}\n\nexport function allToolsOpenAI(): OpenAITool[] {\n return SOLFACE_TOOLS.map(toOpenAI);\n}\n\n// ─── Anthropic Format ───────────────────────────\n// Anthropic tool use (Claude API)\n\nexport interface AnthropicTool {\n name: string;\n description: string;\n input_schema: JSONSchema;\n}\n\nexport function toAnthropic(tool: SolFaceTool): AnthropicTool {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.parameters,\n };\n}\n\nexport function allToolsAnthropic(): AnthropicTool[] {\n return SOLFACE_TOOLS.map(toAnthropic);\n}\n\n// ─── Vercel AI SDK Format ───────────────────────\n// For use with Vercel AI SDK's `tool()` helper\n\nexport interface VercelAITool {\n description: string;\n parameters: JSONSchema;\n execute: (params: Record<string, unknown>) => Promise<unknown>;\n}\n\nexport function toVercelAI(tool: SolFaceTool): VercelAITool {\n return {\n description: tool.description,\n parameters: tool.parameters,\n execute: async (params) => tool.handler(params),\n };\n}\n\nexport function allToolsVercelAI(): Record<string, VercelAITool> {\n const result: Record<string, VercelAITool> = {};\n for (const tool of SOLFACE_TOOLS) {\n result[tool.name] = toVercelAI(tool);\n }\n return result;\n}\n"]}