solfaces 2.0.0 → 2.1.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.
- package/README.md +134 -14
- package/SKILL.md +171 -0
- package/dist/agent/index.cjs +14 -13
- package/dist/agent/index.js +4 -3
- package/dist/agent/mcp-server.cjs +2240 -10
- package/dist/{chunk-TTGJZEPV.js → chunk-77SPWQU5.js} +43 -12
- package/dist/chunk-77SPWQU5.js.map +1 -0
- package/dist/{chunk-JS527VKL.js → chunk-CQWXUU7P.js} +6 -5
- package/dist/chunk-CQWXUU7P.js.map +1 -0
- package/dist/{chunk-46ZEFA6R.cjs → chunk-CXRVPOTI.cjs} +10 -9
- package/dist/chunk-CXRVPOTI.cjs.map +1 -0
- package/dist/{chunk-23XJ5VDX.cjs → chunk-F244Q4KC.cjs} +47 -16
- package/dist/chunk-F244Q4KC.cjs.map +1 -0
- package/dist/{chunk-6UWILY7E.cjs → chunk-HVPGR6G5.cjs} +2 -2
- package/dist/{chunk-6UWILY7E.cjs.map → chunk-HVPGR6G5.cjs.map} +1 -1
- package/dist/{chunk-LRHYF5QN.js → chunk-MGP7F65H.js} +3 -3
- package/dist/{chunk-LRHYF5QN.js.map → chunk-MGP7F65H.js.map} +1 -1
- package/dist/chunk-R3MC2AJZ.cjs +2247 -0
- package/dist/chunk-R3MC2AJZ.cjs.map +1 -0
- package/dist/{chunk-HCEE4K4T.js → chunk-SWML743U.js} +2 -2
- package/dist/{chunk-HCEE4K4T.js.map → chunk-SWML743U.js.map} +1 -1
- package/dist/chunk-SX3FQDKM.js +2238 -0
- package/dist/chunk-SX3FQDKM.js.map +1 -0
- package/dist/{chunk-546TBMAR.cjs → chunk-WTCXTXTV.cjs} +6 -6
- package/dist/{chunk-546TBMAR.cjs.map → chunk-WTCXTXTV.cjs.map} +1 -1
- package/dist/constants-Bi5uTRp5.d.cts +17 -0
- package/dist/constants-Bi5uTRp5.d.ts +17 -0
- package/dist/core/index.cjs +31 -31
- package/dist/core/index.js +3 -3
- package/dist/index.cjs +63 -34
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +5 -4
- package/dist/names/index.cjs +40 -0
- package/dist/names/index.cjs.map +1 -0
- package/dist/names/index.d.cts +36 -0
- package/dist/names/index.d.ts +36 -0
- package/dist/names/index.js +3 -0
- package/dist/names/index.js.map +1 -0
- package/dist/react/index.cjs +45 -22
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +15 -2
- package/dist/react/index.d.ts +15 -2
- package/dist/react/index.js +30 -8
- package/dist/react/index.js.map +1 -1
- package/dist/solfaces.cdn.global.js +2 -2
- package/dist/solfaces.cdn.global.js.map +1 -1
- package/dist/vanilla/index.cjs +5 -5
- package/dist/vanilla/index.js +2 -2
- package/package.json +22 -5
- package/python/solfaces.py +274 -3
- package/reference/integrations.md +166 -0
- package/reference/react.md +108 -0
- package/reference/themes.md +124 -0
- package/dist/chunk-23XJ5VDX.cjs.map +0 -1
- package/dist/chunk-46ZEFA6R.cjs.map +0 -1
- package/dist/chunk-JS527VKL.js.map +0 -1
- package/dist/chunk-TTGJZEPV.js.map +0 -1
- package/skill.md +0 -608
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# React Component Reference
|
|
2
|
+
|
|
3
|
+
## Basic Usage
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
import { SolFace } from "solfaces/react";
|
|
7
|
+
|
|
8
|
+
<SolFace walletAddress="7xKXtg..." size={48} />
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## All Props
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
interface SolFaceProps {
|
|
15
|
+
walletAddress: string; // Required
|
|
16
|
+
size?: number; // Default: 64
|
|
17
|
+
enableBlink?: boolean | { // Blink animation
|
|
18
|
+
duration?: number; // Cycle in seconds (default: 4)
|
|
19
|
+
delay?: number; // Initial delay (default: 0)
|
|
20
|
+
};
|
|
21
|
+
theme?: SolFaceTheme; // Theme object
|
|
22
|
+
detail?: "full" | "simplified" | "auto";
|
|
23
|
+
traitOverrides?: Partial<SolFaceTraits>;
|
|
24
|
+
colorOverrides?: { // Per-instance color overrides
|
|
25
|
+
skin?: string;
|
|
26
|
+
eyes?: string;
|
|
27
|
+
hair?: string;
|
|
28
|
+
bg?: string;
|
|
29
|
+
mouth?: string;
|
|
30
|
+
eyebrow?: string;
|
|
31
|
+
accessory?: string;
|
|
32
|
+
nose?: string;
|
|
33
|
+
eyeWhite?: string;
|
|
34
|
+
};
|
|
35
|
+
showName?: boolean; // Show derived name (default: false)
|
|
36
|
+
namePosition?: "below" | "above"; // Name position (default: "below")
|
|
37
|
+
nameFormat?: NameFormat; // "short" | "display" | "tag" | "full"
|
|
38
|
+
className?: string;
|
|
39
|
+
style?: React.CSSProperties;
|
|
40
|
+
// ...all standard SVG element props (onClick, aria-*, data-*, etc.)
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Rendering Modes
|
|
45
|
+
|
|
46
|
+
### With theme
|
|
47
|
+
```tsx
|
|
48
|
+
import { darkTheme } from "solfaces/themes";
|
|
49
|
+
<SolFace walletAddress="7xKXtg..." size={48} theme={darkTheme} />
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Pixel art
|
|
53
|
+
```tsx
|
|
54
|
+
import { pixelTheme, pixelRetroTheme, pixelCleanTheme } from "solfaces/themes";
|
|
55
|
+
<SolFace walletAddress="7xKXtg..." size={64} theme={pixelTheme} />
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Liquid glass
|
|
59
|
+
```tsx
|
|
60
|
+
import { glassTheme, glassDarkTheme } from "solfaces/themes";
|
|
61
|
+
<SolFace walletAddress="7xKXtg..." size={64} theme={glassTheme} />
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Flat mode
|
|
65
|
+
```tsx
|
|
66
|
+
import { flatTheme } from "solfaces/themes";
|
|
67
|
+
<SolFace walletAddress="7xKXtg..." theme={flatTheme} />
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Detail level override
|
|
71
|
+
```tsx
|
|
72
|
+
<SolFace walletAddress="7xKXtg..." size={32} detail="full" />
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Blink animation
|
|
76
|
+
```tsx
|
|
77
|
+
<SolFace walletAddress="7xKXtg..." enableBlink />
|
|
78
|
+
<SolFace walletAddress="7xKXtg..." enableBlink={{ duration: 3, delay: 1 }} />
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Color overrides
|
|
82
|
+
```tsx
|
|
83
|
+
<SolFace walletAddress="7xKXtg..." colorOverrides={{ hair: "#ff0000", bg: "#000" }} />
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Trait overrides
|
|
87
|
+
```tsx
|
|
88
|
+
<SolFace walletAddress="7xKXtg..." traitOverrides={{ hairStyle: 0 }} />
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## useSolName Hook
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
import { useSolName } from "solfaces/react";
|
|
95
|
+
|
|
96
|
+
function Profile({ wallet }) {
|
|
97
|
+
const name = useSolName(wallet, "display"); // returns string
|
|
98
|
+
const identity = useSolName(wallet); // returns SolNameIdentity
|
|
99
|
+
return <span>{name}</span>;
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Show Name with Avatar
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
<SolFace walletAddress="7xKXtg..." showName />
|
|
107
|
+
<SolFace walletAddress="7xKXtg..." showName namePosition="above" nameFormat="tag" />
|
|
108
|
+
```
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Theme Reference
|
|
2
|
+
|
|
3
|
+
## Available Presets
|
|
4
|
+
|
|
5
|
+
| Theme | Description | Works In |
|
|
6
|
+
|-------|-------------|----------|
|
|
7
|
+
| `default` | Gradient-rich rendering | All |
|
|
8
|
+
| `dark` | Dark backgrounds, muted tones | All |
|
|
9
|
+
| `light` | Soft pastel backgrounds | All |
|
|
10
|
+
| `mono` | Full grayscale | All |
|
|
11
|
+
| `flat` | No gradients, flat colors only | All |
|
|
12
|
+
| `transparent` | Transparent background | All |
|
|
13
|
+
| `glass` | Liquid glass effect | React only |
|
|
14
|
+
| `glassDark` | Dark liquid glass | React only |
|
|
15
|
+
| `pixel` | 16px density pixel art | React only |
|
|
16
|
+
| `pixelRetro` | 12px + scanlines + shadow | React only |
|
|
17
|
+
| `pixelClean` | 24px clean pixel art | React only |
|
|
18
|
+
|
|
19
|
+
## Using Themes
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { renderSolFaceSVG } from "solfaces";
|
|
23
|
+
import { darkTheme } from "solfaces/themes";
|
|
24
|
+
const svg = renderSolFaceSVG(wallet, { theme: darkTheme });
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Extending Presets
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { getPresetTheme } from "solfaces/themes";
|
|
31
|
+
const myTheme = getPresetTheme("dark", {
|
|
32
|
+
bgRadius: 999,
|
|
33
|
+
border: { color: "#14F195", width: 2 },
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Custom Theme
|
|
38
|
+
|
|
39
|
+
All fields optional. Only override what you need.
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
const brandTheme: SolFaceTheme = {
|
|
43
|
+
skinColors: ["#fce4d4", "#f5d0b0", "#e8b88a", "#d4956a", "#b5724a", "#8d5524", "#6b3f1d", "#4a2c17", "#3a1f10", "#2a1008"],
|
|
44
|
+
eyeColors: ["#333", "#4a80c4", "#5a9a5a", "#c89430", "#8a8a8a"],
|
|
45
|
+
hairColors: ["#1a1a1a", "#4a3728", "#8b6b4a", "#c44a20", "#d4a844", "#6090e0", "#14F195", "#e040c0", "#ff6b6b", "#4ecdc4"],
|
|
46
|
+
bgColors: ["#14F195", "#4a90e2", "#9945FF", "#f0e68c", "#e06070", "#ff8c42", "#5bc0be", "#8338ec", "#ff006e", "#3a86ff"],
|
|
47
|
+
mouthColor: "#e06070",
|
|
48
|
+
eyebrowColor: "#aaa",
|
|
49
|
+
accessoryColor: "#888",
|
|
50
|
+
eyeWhiteColor: "#e0e0e0",
|
|
51
|
+
flat: false,
|
|
52
|
+
cheekEnabled: true,
|
|
53
|
+
shadowEnabled: true,
|
|
54
|
+
bgOpacity: 1,
|
|
55
|
+
bgRadius: 14,
|
|
56
|
+
border: { color: "#14F195", width: 2 },
|
|
57
|
+
};
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Theme Field Reference
|
|
61
|
+
|
|
62
|
+
### Color palettes (arrays)
|
|
63
|
+
|
|
64
|
+
| Field | Type | Controls |
|
|
65
|
+
|-------|------|---------|
|
|
66
|
+
| `skinColors` | `string[]` | 10 skin tone colors |
|
|
67
|
+
| `eyeColors` | `string[]` | 5 iris/pupil colors |
|
|
68
|
+
| `hairColors` | `string[]` | 10 hair fill colors |
|
|
69
|
+
| `bgColors` | `string[]` | 10 background fill colors |
|
|
70
|
+
|
|
71
|
+
### Individual color overrides
|
|
72
|
+
|
|
73
|
+
| Field | Type | Controls |
|
|
74
|
+
|-------|------|---------|
|
|
75
|
+
| `mouthColor` | `string` | Mouth stroke/fill |
|
|
76
|
+
| `eyebrowColor` | `string` | Eyebrow stroke |
|
|
77
|
+
| `accessoryColor` | `string` | Default accessory color |
|
|
78
|
+
| `eyeWhiteColor` | `string` | Sclera + teeth (set for dark themes) |
|
|
79
|
+
| `noseColor` | `string` | Nose color |
|
|
80
|
+
| `glassesColor` | `string` | Glasses frame (overrides accessoryColor) |
|
|
81
|
+
| `earringColor` | `string` | Earring (overrides accessoryColor) |
|
|
82
|
+
| `headbandColor` | `string` | Headband (overrides accessoryColor) |
|
|
83
|
+
|
|
84
|
+
### Rendering control
|
|
85
|
+
|
|
86
|
+
| Field | Type | Controls |
|
|
87
|
+
|-------|------|---------|
|
|
88
|
+
| `flat` | `boolean` | Disable all gradients |
|
|
89
|
+
| `cheekEnabled` | `boolean` | Cheek blush |
|
|
90
|
+
| `cheekColor` | `string` | Custom cheek color |
|
|
91
|
+
| `cheekOpacity` | `number` | Cheek opacity (0-1) |
|
|
92
|
+
| `skinOpacity` | `number` | Skin fill opacity (0-1) |
|
|
93
|
+
| `shadowEnabled` | `boolean` | Chin shadow and face overlays |
|
|
94
|
+
|
|
95
|
+
### Layout
|
|
96
|
+
|
|
97
|
+
| Field | Type | Controls |
|
|
98
|
+
|-------|------|---------|
|
|
99
|
+
| `bgOpacity` | `number` | Background opacity (0-1) |
|
|
100
|
+
| `bgRadius` | `number` | Border radius (999 = circle) |
|
|
101
|
+
| `border` | `{ color, width }` | Optional border |
|
|
102
|
+
|
|
103
|
+
### Pixel art (React only)
|
|
104
|
+
|
|
105
|
+
Set `_pixel: true` to enable. Key fields: `_pixelDensity` (default 16), `_pixelRounded`, `_pixelOutline`, `_pixelOutlineColor`, `_pixelOutlineWidth`, `_pixelContrast`, `_pixelSaturation`, `_pixelBrightness`, `_pixelScanlines`, `_pixelScanlineOpacity`, `_pixelScanlineSpacing`, `_pixelGrid`, `_pixelGridOpacity`, `_pixelGridColor`, `_pixelShadow`, `_pixelShadowColor`, `_pixelShadowOffset`.
|
|
106
|
+
|
|
107
|
+
### Liquid glass (React only)
|
|
108
|
+
|
|
109
|
+
Set `_glass: true` to enable. Key fields: `_blurRadius` (default 12), `_saturate`, `_tintColor`, `_tintOpacity`, `_borderColor`, `_borderWidth`, `_borderOpacity`, `_specularColor`, `_specularOpacity`, `_specularEnd`, `_lightAngle`, `_rimIntensity`, `_shadow`.
|
|
110
|
+
|
|
111
|
+
## Theme Recommendations
|
|
112
|
+
|
|
113
|
+
| Context | Theme | Why |
|
|
114
|
+
|---------|-------|-----|
|
|
115
|
+
| Default | `default` | Gradient-rich, no overrides |
|
|
116
|
+
| Dark UI | `dark` | Dark backgrounds, subtle border |
|
|
117
|
+
| Light UI | `light` | Soft pastel backgrounds |
|
|
118
|
+
| Minimal | `mono` | Full grayscale |
|
|
119
|
+
| Print / email | `flat` | Flat colors only |
|
|
120
|
+
| Overlay | `transparent` | Transparent BG |
|
|
121
|
+
| Modern glass (React) | `glass` | Backdrop blur, specular |
|
|
122
|
+
| Dark glass (React) | `glassDark` | Deeper blur |
|
|
123
|
+
| Retro / gaming (React) | `pixel` / `pixelRetro` | Pixelated rendering |
|
|
124
|
+
| Clean pixel (React) | `pixelClean` | Higher density |
|
|
@@ -1 +0,0 @@
|
|
|
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-23XJ5VDX.cjs","sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — 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 with gradient-rich rendering, skin-luminance-driven colors, and 10 accessory types. The same wallet always produces the same face. ~2.56 billion unique combinations.\",\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. Sizes >= 48 use full detail (gradients, specular highlights, cheek blush).\",\n },\n theme: {\n type: \"string\",\n description:\n \"Preset theme name. 'flat' and 'transparent' work everywhere. 'glass', 'glassDark', 'pixel', 'pixelRetro', 'pixelClean' are React-only.\",\n enum: [\"default\", \"dark\", \"light\", \"mono\", \"flat\", \"transparent\", \"glass\", \"glassDark\", \"pixel\", \"pixelRetro\", \"pixelClean\"],\n },\n enableBlink: {\n type: \"boolean\",\n description: \"Enable CSS blink animation on the eyes. Default: false\",\n },\n detail: {\n type: \"string\",\n description: \"Detail level: 'full' (gradients, cheeks, specular), 'simplified' (flat shapes), 'auto' (full if size >= 48). Default: auto\",\n enum: [\"full\", \"simplified\", \"auto\"],\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 detail = (params.detail as \"full\" | \"simplified\" | \"auto\") ?? \"auto\";\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, detail });\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. Describes squircle face, skin tone, eye style/color, hair, accessories, and expression.\",\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 default: \"Base look with gradient-rich rendering — no overrides\",\n dark: \"Dark backgrounds with muted tones and subtle border\",\n light: \"Soft pastel backgrounds with rounded corners\",\n mono: \"Full grayscale — all colors replaced with grays\",\n flat: \"Disables all gradients — uses flat fill colors only\",\n transparent: \"Transparent background with flat rendering\",\n glass: \"Liquid glass effect with backdrop blur and specular highlights (React-only)\",\n glassDark: \"Dark variant of liquid glass with deeper blur (React-only)\",\n pixel: \"Pixel art mode at 16px density with rounded corners (React-only)\",\n pixelRetro: \"Retro pixel art with scanlines and drop shadow (React-only)\",\n pixelClean: \"Clean pixel art at 24px density (React-only)\",\n};\n\nconst listSolfaceThemes: SolFaceTool = {\n name: \"list_solface_themes\",\n description:\n \"List all available SolFace preset themes with descriptions. Themes control colors, gradients, borders, and rendering modes. Some themes (glass, pixel) are React-only.\",\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 reactOnly: name.startsWith(\"glass\") || name.startsWith(\"pixel\"),\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/describe.ts"],"names":["generateTraits","effectiveAccessory"],"mappings":"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","file":"chunk-46ZEFA6R.cjs","sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — AI Agent Description Generator\n// Produces natural language descriptions of a wallet's SolFace\n// for use in system prompts, bios, and self-reference.\n// ═══════════════════════════════════════════════════════════════\n\nimport { generateTraits, effectiveAccessory, type SolFaceTraits } from \"./traits\";\n\n// ─── Vocabulary Maps ─────────────────────────────────────────\n\nconst SKIN_TONES: Record<number, string> = {\n 0: \"porcelain\",\n 1: \"ivory\",\n 2: \"fair\",\n 3: \"light\",\n 4: \"sand\",\n 5: \"golden\",\n 6: \"warm\",\n 7: \"caramel\",\n 8: \"brown\",\n 9: \"deep\",\n};\n\nconst EYE_STYLES: Record<number, string> = {\n 0: \"round, wide-open\",\n 1: \"small and minimal\",\n 2: \"almond-shaped\",\n 3: \"wide and expressive\",\n 4: \"relaxed, half-lidded\",\n 5: \"joyful, crescent-shaped\",\n 6: \"bright and sparkling\",\n 7: \"gentle and narrow\",\n};\n\nconst EYE_COLORS_DESC: Record<number, string> = {\n 0: \"dark brown\",\n 1: \"blue\",\n 2: \"green\",\n 3: \"hazel\",\n 4: \"gray\",\n};\n\nconst EYEBROW_STYLES: Record<number, string> = {\n 0: \"wispy\",\n 1: \"straight\",\n 2: \"natural\",\n 3: \"elegantly arched\",\n 4: \"sharply angled\",\n};\n\nconst NOSE_STYLES: Record<number, string> = {\n 0: \"a subtle shadow nose\",\n 1: \"a small button nose\",\n 2: \"a soft curved nose\",\n 3: \"a button nose with visible nostrils\",\n};\n\nconst MOUTH_STYLES: Record<number, string> = {\n 0: \"a gentle smile\",\n 1: \"a calm, neutral expression\",\n 2: \"a happy grin\",\n 3: \"a surprised O-shaped mouth\",\n 4: \"a confident smirk\",\n 5: \"a wide, toothy grin\",\n 6: \"a flat, straight expression\",\n 7: \"a soft pout\",\n};\n\nconst HAIR_STYLES: Record<number, string> = {\n 0: \"bald, with no hair\",\n 1: \"short, neatly cropped hair\",\n 2: \"bouncy, curly hair\",\n 3: \"side-swept hair\",\n 4: \"a voluminous puff\",\n 5: \"long hair that falls past the shoulders\",\n 6: \"a clean bob cut\",\n 7: \"a close buzz cut\",\n 8: \"flowing, wavy hair\",\n 9: \"a neat topknot\",\n};\n\nconst HAIR_COLORS_DESC: Record<number, string> = {\n 0: \"jet black\",\n 1: \"espresso brown\",\n 2: \"walnut\",\n 3: \"honey blonde\",\n 4: \"copper red\",\n 5: \"silver\",\n 6: \"charcoal\",\n 7: \"burgundy\",\n 8: \"strawberry\",\n 9: \"ginger\",\n};\n\nconst ACCESSORY_DESC: Record<number, string> = {\n 0: \"\",\n 1: \"a beauty mark\",\n 2: \"round glasses\",\n 3: \"rectangular glasses\",\n 4: \"a dangling earring\",\n 5: \"a headband\",\n 6: \"freckles\",\n 7: \"stud earrings\",\n 8: \"aviator sunglasses\",\n 9: \"a band-aid\",\n};\n\nconst BG_COLORS_DESC: Record<number, string> = {\n 0: \"rose\",\n 1: \"olive\",\n 2: \"sage\",\n 3: \"fern\",\n 4: \"mint\",\n 5: \"ocean\",\n 6: \"sky\",\n 7: \"lavender\",\n 8: \"orchid\",\n 9: \"blush\",\n};\n\n// ─── Description Builder ─────────────────────────────────────\n\nexport interface DescribeOptions {\n includeBackground?: boolean;\n format?: \"paragraph\" | \"structured\" | \"compact\";\n perspective?: \"first\" | \"third\";\n name?: string;\n}\n\nexport function describeAppearance(\n walletAddress: string,\n options?: DescribeOptions,\n): string {\n const traits = generateTraits(walletAddress);\n const {\n includeBackground = true,\n format = \"paragraph\",\n perspective = \"third\",\n name,\n } = options ?? {};\n\n if (format === \"structured\") return buildStructured(traits, includeBackground);\n if (format === \"compact\") return buildCompact(traits);\n return buildParagraph(traits, perspective, name, includeBackground);\n}\n\nexport function describeTraits(\n traits: SolFaceTraits,\n options?: DescribeOptions,\n): string {\n const {\n includeBackground = true,\n format = \"paragraph\",\n perspective = \"third\",\n name,\n } = options ?? {};\n\n if (format === \"structured\") return buildStructured(traits, includeBackground);\n if (format === \"compact\") return buildCompact(traits);\n return buildParagraph(traits, perspective, name, includeBackground);\n}\n\n// ─── Builders ────────────────────────────────────────────────\n\nfunction buildParagraph(\n t: SolFaceTraits,\n perspective: \"first\" | \"third\",\n name?: string,\n includeBg?: boolean,\n): string {\n const parts: string[] = [];\n const ai = effectiveAccessory(t);\n\n const subject = perspective === \"first\"\n ? (name ? `I'm ${name}. I have` : \"I have\")\n : (name ? `${name} has` : \"This SolFace has\");\n\n const im = perspective === \"first\" ? \"I'm\" : \"They're\";\n\n // Face + skin (all squircle now)\n parts.push(`${subject} a squircle face with ${SKIN_TONES[t.skinColor] ?? \"warm\"} skin`);\n\n // Eyes\n const eyeStyle = EYE_STYLES[t.eyeStyle] ?? \"round\";\n const eyeColor = EYE_COLORS_DESC[t.eyeColor] ?? \"dark\";\n parts.push(`${eyeStyle} ${eyeColor} eyes`);\n\n // Eyebrows\n const brows = EYEBROW_STYLES[t.eyebrows];\n if (brows) parts.push(`${brows} eyebrows`);\n\n // Hair\n const hairStyle = HAIR_STYLES[t.hairStyle] ?? \"\";\n const hairColor = HAIR_COLORS_DESC[t.hairColor] ?? \"\";\n if (t.hairStyle === 0) {\n parts.push(\"and is bald\");\n } else if (hairStyle.startsWith(\"a \")) {\n parts.push(`and a ${hairColor} ${hairStyle.slice(2)}`);\n } else {\n parts.push(`and ${hairColor} ${hairStyle}`);\n }\n\n // Build main sentence\n let desc = parts[0];\n if (parts.length > 2) {\n desc += \", \" + parts.slice(1, -1).join(\", \") + \", \" + parts[parts.length - 1];\n } else if (parts.length === 2) {\n desc += \" and \" + parts[1];\n }\n desc += \".\";\n\n // Nose\n const nose = NOSE_STYLES[t.nose];\n if (nose) {\n const noseSubject = perspective === \"first\"\n ? \"I have\"\n : (name ?? \"They\") + (name ? \" has\" : \" have\");\n desc += ` ${noseSubject} ${nose}.`;\n }\n\n // Accessory\n const acc = ACCESSORY_DESC[ai];\n if (acc) {\n desc += ` ${im} wearing ${acc}.`;\n }\n\n // Mouth\n const mouth = MOUTH_STYLES[t.mouth] ?? \"a smile\";\n const mouthVerb = perspective === \"first\"\n ? \"I have\"\n : (name ?? \"They\") + (name ? \" has\" : \" have\");\n desc += ` ${mouthVerb} ${mouth}.`;\n\n // Background\n if (includeBg) {\n const bg = BG_COLORS_DESC[t.bgColor] ?? \"colorful\";\n desc += ` The background is ${bg}.`;\n }\n\n return desc;\n}\n\nfunction buildStructured(t: SolFaceTraits, includeBg: boolean): string {\n const ai = effectiveAccessory(t);\n const lines: string[] = [\n `Face: squircle`,\n `Skin: ${SKIN_TONES[t.skinColor] ?? \"warm\"}`,\n `Eyes: ${EYE_STYLES[t.eyeStyle] ?? \"round\"}, ${EYE_COLORS_DESC[t.eyeColor] ?? \"dark\"}`,\n `Eyebrows: ${EYEBROW_STYLES[t.eyebrows] ?? \"wispy\"}`,\n ];\n\n const nose = NOSE_STYLES[t.nose];\n if (nose) lines.push(`Nose: ${nose.replace(/^a /, \"\")}`);\n\n lines.push(`Mouth: ${MOUTH_STYLES[t.mouth] ?? \"smile\"}`);\n\n if (t.hairStyle === 0) {\n lines.push(\"Hair: bald\");\n } else {\n const hs = HAIR_STYLES[t.hairStyle] ?? \"\";\n const hc = HAIR_COLORS_DESC[t.hairColor] ?? \"\";\n lines.push(`Hair: ${hc} ${hs.startsWith(\"a \") ? hs.slice(2) : hs}`);\n }\n\n const acc = ACCESSORY_DESC[ai];\n if (acc) lines.push(`Accessory: ${acc}`);\n\n if (includeBg) {\n lines.push(`Background: ${BG_COLORS_DESC[t.bgColor] ?? \"colorful\"}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildCompact(t: SolFaceTraits): string {\n const ai = effectiveAccessory(t);\n const parts: string[] = [];\n\n parts.push(`squircle face`);\n parts.push(`${SKIN_TONES[t.skinColor] ?? \"warm\"} skin`);\n parts.push(`${EYE_COLORS_DESC[t.eyeColor] ?? \"dark\"} ${EYE_STYLES[t.eyeStyle] ?? \"round\"} eyes`);\n\n if (t.hairStyle === 0) {\n parts.push(\"bald\");\n } else {\n const hs = (HAIR_STYLES[t.hairStyle] ?? \"hair\").replace(/,.*/, \"\");\n const hc = HAIR_COLORS_DESC[t.hairColor] ?? \"\";\n parts.push(`${hc} ${hs.startsWith(\"a \") ? hs.slice(2) : hs}`);\n }\n\n const acc = ACCESSORY_DESC[ai];\n if (acc) parts.push(acc);\n\n parts.push((MOUTH_STYLES[t.mouth] ?? \"smiling\").replace(/^a /, \"\"));\n\n return parts.join(\", \");\n}\n\n// ─── Alt Text Helper ─────────────────────────────────────────\n\nexport function solFaceAltText(walletAddress: string): string {\n return `SolFace avatar: ${describeAppearance(walletAddress, { format: \"compact\", includeBackground: false })}`;\n}\n\n// ─── System Prompt Helper ────────────────────────────────────\n\nexport function agentAppearancePrompt(\n walletAddress: string,\n agentName?: string,\n): string {\n const desc = describeAppearance(walletAddress, {\n perspective: \"first\",\n name: agentName,\n includeBackground: false,\n format: \"paragraph\",\n });\n\n const hash = (djb2Simple(walletAddress) >>> 0).toString(16).padStart(8, \"0\");\n\n return `My visual identity is a SolFace avatar (ID: ${hash}) derived from my wallet address. ${desc} This appearance is deterministic — anyone who looks up my wallet will see the same face.`;\n}\n\n// Inline djb2 to avoid circular dependency\nfunction djb2Simple(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/describe.ts"],"names":[],"mappings":"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","file":"chunk-JS527VKL.js","sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — AI Agent Description Generator\n// Produces natural language descriptions of a wallet's SolFace\n// for use in system prompts, bios, and self-reference.\n// ═══════════════════════════════════════════════════════════════\n\nimport { generateTraits, effectiveAccessory, type SolFaceTraits } from \"./traits\";\n\n// ─── Vocabulary Maps ─────────────────────────────────────────\n\nconst SKIN_TONES: Record<number, string> = {\n 0: \"porcelain\",\n 1: \"ivory\",\n 2: \"fair\",\n 3: \"light\",\n 4: \"sand\",\n 5: \"golden\",\n 6: \"warm\",\n 7: \"caramel\",\n 8: \"brown\",\n 9: \"deep\",\n};\n\nconst EYE_STYLES: Record<number, string> = {\n 0: \"round, wide-open\",\n 1: \"small and minimal\",\n 2: \"almond-shaped\",\n 3: \"wide and expressive\",\n 4: \"relaxed, half-lidded\",\n 5: \"joyful, crescent-shaped\",\n 6: \"bright and sparkling\",\n 7: \"gentle and narrow\",\n};\n\nconst EYE_COLORS_DESC: Record<number, string> = {\n 0: \"dark brown\",\n 1: \"blue\",\n 2: \"green\",\n 3: \"hazel\",\n 4: \"gray\",\n};\n\nconst EYEBROW_STYLES: Record<number, string> = {\n 0: \"wispy\",\n 1: \"straight\",\n 2: \"natural\",\n 3: \"elegantly arched\",\n 4: \"sharply angled\",\n};\n\nconst NOSE_STYLES: Record<number, string> = {\n 0: \"a subtle shadow nose\",\n 1: \"a small button nose\",\n 2: \"a soft curved nose\",\n 3: \"a button nose with visible nostrils\",\n};\n\nconst MOUTH_STYLES: Record<number, string> = {\n 0: \"a gentle smile\",\n 1: \"a calm, neutral expression\",\n 2: \"a happy grin\",\n 3: \"a surprised O-shaped mouth\",\n 4: \"a confident smirk\",\n 5: \"a wide, toothy grin\",\n 6: \"a flat, straight expression\",\n 7: \"a soft pout\",\n};\n\nconst HAIR_STYLES: Record<number, string> = {\n 0: \"bald, with no hair\",\n 1: \"short, neatly cropped hair\",\n 2: \"bouncy, curly hair\",\n 3: \"side-swept hair\",\n 4: \"a voluminous puff\",\n 5: \"long hair that falls past the shoulders\",\n 6: \"a clean bob cut\",\n 7: \"a close buzz cut\",\n 8: \"flowing, wavy hair\",\n 9: \"a neat topknot\",\n};\n\nconst HAIR_COLORS_DESC: Record<number, string> = {\n 0: \"jet black\",\n 1: \"espresso brown\",\n 2: \"walnut\",\n 3: \"honey blonde\",\n 4: \"copper red\",\n 5: \"silver\",\n 6: \"charcoal\",\n 7: \"burgundy\",\n 8: \"strawberry\",\n 9: \"ginger\",\n};\n\nconst ACCESSORY_DESC: Record<number, string> = {\n 0: \"\",\n 1: \"a beauty mark\",\n 2: \"round glasses\",\n 3: \"rectangular glasses\",\n 4: \"a dangling earring\",\n 5: \"a headband\",\n 6: \"freckles\",\n 7: \"stud earrings\",\n 8: \"aviator sunglasses\",\n 9: \"a band-aid\",\n};\n\nconst BG_COLORS_DESC: Record<number, string> = {\n 0: \"rose\",\n 1: \"olive\",\n 2: \"sage\",\n 3: \"fern\",\n 4: \"mint\",\n 5: \"ocean\",\n 6: \"sky\",\n 7: \"lavender\",\n 8: \"orchid\",\n 9: \"blush\",\n};\n\n// ─── Description Builder ─────────────────────────────────────\n\nexport interface DescribeOptions {\n includeBackground?: boolean;\n format?: \"paragraph\" | \"structured\" | \"compact\";\n perspective?: \"first\" | \"third\";\n name?: string;\n}\n\nexport function describeAppearance(\n walletAddress: string,\n options?: DescribeOptions,\n): string {\n const traits = generateTraits(walletAddress);\n const {\n includeBackground = true,\n format = \"paragraph\",\n perspective = \"third\",\n name,\n } = options ?? {};\n\n if (format === \"structured\") return buildStructured(traits, includeBackground);\n if (format === \"compact\") return buildCompact(traits);\n return buildParagraph(traits, perspective, name, includeBackground);\n}\n\nexport function describeTraits(\n traits: SolFaceTraits,\n options?: DescribeOptions,\n): string {\n const {\n includeBackground = true,\n format = \"paragraph\",\n perspective = \"third\",\n name,\n } = options ?? {};\n\n if (format === \"structured\") return buildStructured(traits, includeBackground);\n if (format === \"compact\") return buildCompact(traits);\n return buildParagraph(traits, perspective, name, includeBackground);\n}\n\n// ─── Builders ────────────────────────────────────────────────\n\nfunction buildParagraph(\n t: SolFaceTraits,\n perspective: \"first\" | \"third\",\n name?: string,\n includeBg?: boolean,\n): string {\n const parts: string[] = [];\n const ai = effectiveAccessory(t);\n\n const subject = perspective === \"first\"\n ? (name ? `I'm ${name}. I have` : \"I have\")\n : (name ? `${name} has` : \"This SolFace has\");\n\n const im = perspective === \"first\" ? \"I'm\" : \"They're\";\n\n // Face + skin (all squircle now)\n parts.push(`${subject} a squircle face with ${SKIN_TONES[t.skinColor] ?? \"warm\"} skin`);\n\n // Eyes\n const eyeStyle = EYE_STYLES[t.eyeStyle] ?? \"round\";\n const eyeColor = EYE_COLORS_DESC[t.eyeColor] ?? \"dark\";\n parts.push(`${eyeStyle} ${eyeColor} eyes`);\n\n // Eyebrows\n const brows = EYEBROW_STYLES[t.eyebrows];\n if (brows) parts.push(`${brows} eyebrows`);\n\n // Hair\n const hairStyle = HAIR_STYLES[t.hairStyle] ?? \"\";\n const hairColor = HAIR_COLORS_DESC[t.hairColor] ?? \"\";\n if (t.hairStyle === 0) {\n parts.push(\"and is bald\");\n } else if (hairStyle.startsWith(\"a \")) {\n parts.push(`and a ${hairColor} ${hairStyle.slice(2)}`);\n } else {\n parts.push(`and ${hairColor} ${hairStyle}`);\n }\n\n // Build main sentence\n let desc = parts[0];\n if (parts.length > 2) {\n desc += \", \" + parts.slice(1, -1).join(\", \") + \", \" + parts[parts.length - 1];\n } else if (parts.length === 2) {\n desc += \" and \" + parts[1];\n }\n desc += \".\";\n\n // Nose\n const nose = NOSE_STYLES[t.nose];\n if (nose) {\n const noseSubject = perspective === \"first\"\n ? \"I have\"\n : (name ?? \"They\") + (name ? \" has\" : \" have\");\n desc += ` ${noseSubject} ${nose}.`;\n }\n\n // Accessory\n const acc = ACCESSORY_DESC[ai];\n if (acc) {\n desc += ` ${im} wearing ${acc}.`;\n }\n\n // Mouth\n const mouth = MOUTH_STYLES[t.mouth] ?? \"a smile\";\n const mouthVerb = perspective === \"first\"\n ? \"I have\"\n : (name ?? \"They\") + (name ? \" has\" : \" have\");\n desc += ` ${mouthVerb} ${mouth}.`;\n\n // Background\n if (includeBg) {\n const bg = BG_COLORS_DESC[t.bgColor] ?? \"colorful\";\n desc += ` The background is ${bg}.`;\n }\n\n return desc;\n}\n\nfunction buildStructured(t: SolFaceTraits, includeBg: boolean): string {\n const ai = effectiveAccessory(t);\n const lines: string[] = [\n `Face: squircle`,\n `Skin: ${SKIN_TONES[t.skinColor] ?? \"warm\"}`,\n `Eyes: ${EYE_STYLES[t.eyeStyle] ?? \"round\"}, ${EYE_COLORS_DESC[t.eyeColor] ?? \"dark\"}`,\n `Eyebrows: ${EYEBROW_STYLES[t.eyebrows] ?? \"wispy\"}`,\n ];\n\n const nose = NOSE_STYLES[t.nose];\n if (nose) lines.push(`Nose: ${nose.replace(/^a /, \"\")}`);\n\n lines.push(`Mouth: ${MOUTH_STYLES[t.mouth] ?? \"smile\"}`);\n\n if (t.hairStyle === 0) {\n lines.push(\"Hair: bald\");\n } else {\n const hs = HAIR_STYLES[t.hairStyle] ?? \"\";\n const hc = HAIR_COLORS_DESC[t.hairColor] ?? \"\";\n lines.push(`Hair: ${hc} ${hs.startsWith(\"a \") ? hs.slice(2) : hs}`);\n }\n\n const acc = ACCESSORY_DESC[ai];\n if (acc) lines.push(`Accessory: ${acc}`);\n\n if (includeBg) {\n lines.push(`Background: ${BG_COLORS_DESC[t.bgColor] ?? \"colorful\"}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildCompact(t: SolFaceTraits): string {\n const ai = effectiveAccessory(t);\n const parts: string[] = [];\n\n parts.push(`squircle face`);\n parts.push(`${SKIN_TONES[t.skinColor] ?? \"warm\"} skin`);\n parts.push(`${EYE_COLORS_DESC[t.eyeColor] ?? \"dark\"} ${EYE_STYLES[t.eyeStyle] ?? \"round\"} eyes`);\n\n if (t.hairStyle === 0) {\n parts.push(\"bald\");\n } else {\n const hs = (HAIR_STYLES[t.hairStyle] ?? \"hair\").replace(/,.*/, \"\");\n const hc = HAIR_COLORS_DESC[t.hairColor] ?? \"\";\n parts.push(`${hc} ${hs.startsWith(\"a \") ? hs.slice(2) : hs}`);\n }\n\n const acc = ACCESSORY_DESC[ai];\n if (acc) parts.push(acc);\n\n parts.push((MOUTH_STYLES[t.mouth] ?? \"smiling\").replace(/^a /, \"\"));\n\n return parts.join(\", \");\n}\n\n// ─── Alt Text Helper ─────────────────────────────────────────\n\nexport function solFaceAltText(walletAddress: string): string {\n return `SolFace avatar: ${describeAppearance(walletAddress, { format: \"compact\", includeBackground: false })}`;\n}\n\n// ─── System Prompt Helper ────────────────────────────────────\n\nexport function agentAppearancePrompt(\n walletAddress: string,\n agentName?: string,\n): string {\n const desc = describeAppearance(walletAddress, {\n perspective: \"first\",\n name: agentName,\n includeBackground: false,\n format: \"paragraph\",\n });\n\n const hash = (djb2Simple(walletAddress) >>> 0).toString(16).padStart(8, \"0\");\n\n return `My visual identity is a SolFace avatar (ID: ${hash}) derived from my wallet address. ${desc} This appearance is deterministic — anyone who looks up my wallet will see the same face.`;\n}\n\n// Inline djb2 to avoid circular dependency\nfunction djb2Simple(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent/tools.ts","../src/agent/index.ts"],"names":[],"mappings":";;;;;AAoCA,IAAM,kBAAA,GAAkC;AAAA,EACtC,IAAA,EAAM,sBAAA;AAAA,EACN,WAAA,EACE,8PAAA;AAAA,EACF,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE,wIAAA;AAAA,QACF,IAAA,EAAM,CAAC,SAAA,EAAW,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,aAAA,EAAe,OAAA,EAAS,WAAA,EAAa,OAAA,EAAS,YAAA,EAAc,YAAY;AAAA,OAC7H;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,4HAAA;AAAA,QACb,IAAA,EAAM,CAAC,MAAA,EAAQ,YAAA,EAAc,MAAM;AAAA;AACrC,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAQ;AAAA,GACrB;AAAA,EACA,QAAQ,MAAA,EAAQ;AACd,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,IAAA,MAAM,IAAA,GAAQ,OAAO,IAAA,IAAmB,EAAA;AACxC,IAAA,MAAM,WAAA,GAAe,OAAO,WAAA,IAA2B,KAAA;AACvD,IAAA,MAAM,MAAA,GAAU,OAAO,MAAA,IAA6C,MAAA;AACpE,IAAA,MAAM,YAAY,MAAA,CAAO,KAAA;AACzB,IAAA,MAAM,KAAA,GAAkC,SAAA,GACpC,cAAA,CAAe,SAAS,CAAA,GACxB,MAAA;AAEJ,IAAA,OAAO,iBAAiB,MAAA,EAAQ,EAAE,MAAM,KAAA,EAAO,WAAA,EAAa,QAAQ,CAAA;AAAA,EACtE;AACF,CAAA;AAIA,IAAM,eAAA,GAA+B;AAAA,EACnC,IAAA,EAAM,kBAAA;AAAA,EACN,WAAA,EACE,qOAAA;AAAA,EACF,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE,0HAAA;AAAA,QACF,IAAA,EAAM,CAAC,WAAA,EAAa,YAAA,EAAc,SAAS;AAAA,OAC7C;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE,iIAAA;AAAA,QACF,IAAA,EAAM,CAAC,OAAA,EAAS,OAAO;AAAA,OACzB;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE;AAAA;AACJ,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAQ;AAAA,GACrB;AAAA,EACA,QAAQ,MAAA,EAAQ;AACd,IAAA,OAAO,kBAAA,CAAmB,OAAO,MAAA,EAAkB;AAAA,MACjD,MAAA,EAAS,OAAO,MAAA,IAAqD,WAAA;AAAA,MACrE,WAAA,EAAc,OAAO,WAAA,IAAqC,OAAA;AAAA,MAC1D,MAAM,MAAA,CAAO;AAAA,KACd,CAAA;AAAA,EACH;AACF,CAAA;AAIA,IAAM,gBAAA,GAAgC;AAAA,EACpC,IAAA,EAAM,oBAAA;AAAA,EACN,WAAA,EACE,4LAAA;AAAA,EACF,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAQ;AAAA,GACrB;AAAA,EACA,QAAQ,MAAA,EAAQ;AACd,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,IAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA;AACpC,IAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,UAAU,MAAM,CAAA;AAC7B,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAK;AAAA,EAChC;AACF,CAAA;AAIA,IAAM,gBAAA,GAAgC;AAAA,EACpC,IAAA,EAAM,oBAAA;AAAA,EACN,WAAA,EACE,8NAAA;AAAA,EACF,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAQ;AAAA,GACrB;AAAA,EACA,QAAQ,MAAA,EAAQ;AACd,IAAA,OAAO,qBAAA;AAAA,MACL,MAAA,CAAO,MAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAAA,EACF;AACF,CAAA;AAIA,IAAM,kBAAA,GAA6C;AAAA,EACjD,OAAA,EAAS,4DAAA;AAAA,EACT,IAAA,EAAM,qDAAA;AAAA,EACN,KAAA,EAAO,8CAAA;AAAA,EACP,IAAA,EAAM,sDAAA;AAAA,EACN,IAAA,EAAM,0DAAA;AAAA,EACN,WAAA,EAAa,4CAAA;AAAA,EACb,KAAA,EAAO,6EAAA;AAAA,EACP,SAAA,EAAW,4DAAA;AAAA,EACX,KAAA,EAAO,kEAAA;AAAA,EACP,UAAA,EAAY,6DAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,iBAAA,GAAiC;AAAA,EACrC,IAAA,EAAM,qBAAA;AAAA,EACN,WAAA,EACE,wKAAA;AAAA,EACF,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,YAAY;AAAC,GACf;AAAA,EACA,OAAA,GAAU;AACR,IAAA,OAAO,OAAO,IAAA,CAAK,aAAa,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC/C,IAAA;AAAA,MACA,WAAA,EAAa,kBAAA,CAAmB,IAAI,CAAA,IAAK,EAAA;AAAA,MACzC,WAAW,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,IAAK,IAAA,CAAK,WAAW,OAAO;AAAA,KAChE,CAAE,CAAA;AAAA,EACJ;AACF,CAAA;AAIO,IAAM,aAAA,GAA+B;AAAA,EAC1C,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF;;;ACnMA,eAAsB,cAAA,CACpB,MACA,MAAA,EACkB;AAClB,EAAA,MAAM,OAAO,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACtD,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAI,iBAAiB,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9G;AACA,EAAA,OAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAC5B;AAWO,SAAS,MAAM,IAAA,EAA4B;AAChD,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,aAAa,IAAA,CAAK;AAAA,GACpB;AACF;AAEO,SAAS,WAAA,GAAyB;AACvC,EAAA,OAAO,aAAA,CAAc,IAAI,KAAK,CAAA;AAChC;AAcO,SAAS,SAAS,IAAA,EAA+B;AACtD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,YAAY,IAAA,CAAK;AAAA;AACnB,GACF;AACF;AAEO,SAAS,cAAA,GAA+B;AAC7C,EAAA,OAAO,aAAA,CAAc,IAAI,QAAQ,CAAA;AACnC;AAWO,SAAS,YAAY,IAAA,EAAkC;AAC5D,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,cAAc,IAAA,CAAK;AAAA,GACrB;AACF;AAEO,SAAS,iBAAA,GAAqC;AACnD,EAAA,OAAO,aAAA,CAAc,IAAI,WAAW,CAAA;AACtC;AAWO,SAAS,WAAW,IAAA,EAAiC;AAC1D,EAAA,OAAO;AAAA,IACL,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,OAAA,EAAS,OAAO,MAAA,KAAW,IAAA,CAAK,QAAQ,MAAM;AAAA,GAChD;AACF;AAEO,SAAS,gBAAA,GAAiD;AAC/D,EAAA,MAAM,SAAuC,EAAC;AAC9C,EAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,IAAA,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,UAAA,CAAW,IAAI,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,MAAA;AACT","file":"chunk-TTGJZEPV.js","sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// SOLFACES v2 — 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 with gradient-rich rendering, skin-luminance-driven colors, and 10 accessory types. The same wallet always produces the same face. ~2.56 billion unique combinations.\",\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. Sizes >= 48 use full detail (gradients, specular highlights, cheek blush).\",\n },\n theme: {\n type: \"string\",\n description:\n \"Preset theme name. 'flat' and 'transparent' work everywhere. 'glass', 'glassDark', 'pixel', 'pixelRetro', 'pixelClean' are React-only.\",\n enum: [\"default\", \"dark\", \"light\", \"mono\", \"flat\", \"transparent\", \"glass\", \"glassDark\", \"pixel\", \"pixelRetro\", \"pixelClean\"],\n },\n enableBlink: {\n type: \"boolean\",\n description: \"Enable CSS blink animation on the eyes. Default: false\",\n },\n detail: {\n type: \"string\",\n description: \"Detail level: 'full' (gradients, cheeks, specular), 'simplified' (flat shapes), 'auto' (full if size >= 48). Default: auto\",\n enum: [\"full\", \"simplified\", \"auto\"],\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 detail = (params.detail as \"full\" | \"simplified\" | \"auto\") ?? \"auto\";\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, detail });\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. Describes squircle face, skin tone, eye style/color, hair, accessories, and expression.\",\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 default: \"Base look with gradient-rich rendering — no overrides\",\n dark: \"Dark backgrounds with muted tones and subtle border\",\n light: \"Soft pastel backgrounds with rounded corners\",\n mono: \"Full grayscale — all colors replaced with grays\",\n flat: \"Disables all gradients — uses flat fill colors only\",\n transparent: \"Transparent background with flat rendering\",\n glass: \"Liquid glass effect with backdrop blur and specular highlights (React-only)\",\n glassDark: \"Dark variant of liquid glass with deeper blur (React-only)\",\n pixel: \"Pixel art mode at 16px density with rounded corners (React-only)\",\n pixelRetro: \"Retro pixel art with scanlines and drop shadow (React-only)\",\n pixelClean: \"Clean pixel art at 24px density (React-only)\",\n};\n\nconst listSolfaceThemes: SolFaceTool = {\n name: \"list_solface_themes\",\n description:\n \"List all available SolFace preset themes with descriptions. Themes control colors, gradients, borders, and rendering modes. Some themes (glass, pixel) are React-only.\",\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 reactOnly: name.startsWith(\"glass\") || name.startsWith(\"pixel\"),\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"]}
|