agent-toolbelt 0.1.0 → 0.2.1

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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Official SDK for [Agent Toolbelt](https://agent-toolbelt-production.up.railway.app) — a suite of focused API tools for AI agents and developers.
4
4
 
5
- **Typed client + LangChain tool wrappers** for schema generation, text extraction, token counting, CSV conversion, Markdown conversion, URL metadata, regex building, cron expressions, address normalization, and color palette generation.
5
+ **Typed client + LangChain tool wrappers** for schema generation, text extraction, token counting, CSV conversion, Markdown conversion, URL metadata, regex building, cron expressions, address normalization, color palette generation, and brand kit creation.
6
6
 
7
7
  ## Install
8
8
 
@@ -118,6 +118,9 @@ await client.addressNormalizer({ address: "123 main st apt 4b, springfield, il 6
118
118
 
119
119
  // Generate color palettes from descriptions or hex colors
120
120
  await client.colorPalette({ description: "calm fintech blue", count: 5 });
121
+
122
+ // Generate a full brand kit — colors, typography, CSS/Tailwind tokens
123
+ await client.brandKit({ name: "Solaris Health", industry: "healthcare", vibe: ["modern", "trustworthy"], format: "full" });
121
124
  ```
122
125
 
123
126
  ---
@@ -159,6 +162,7 @@ const result = await agent.invoke({
159
162
  | `build_cron` | Convert schedule descriptions to cron expressions |
160
163
  | `normalize_address` | Normalize US addresses to USPS format |
161
164
  | `generate_color_palette` | Generate color palettes with WCAG scores and CSS variables |
165
+ | `generate_brand_kit` | Generate full brand kit — colors, typography, CSS/Tailwind tokens |
162
166
 
163
167
  ---
164
168
 
@@ -176,6 +180,7 @@ const result = await agent.invoke({
176
180
  | `cron-builder` | $0.0005 / call |
177
181
  | `address-normalizer` | $0.0005 / call |
178
182
  | `color-palette` | $0.0005 / call |
183
+ | `brand-kit` | $0.001 / call |
179
184
 
180
185
  ## License
181
186
 
package/dist/index.d.mts CHANGED
@@ -126,6 +126,89 @@ interface ColorPaletteResult {
126
126
  css: string;
127
127
  swatches: string;
128
128
  }
129
+ interface BrandKitColor {
130
+ name: string;
131
+ hex: string;
132
+ hsl: string;
133
+ rgb: string;
134
+ values: {
135
+ h: number;
136
+ s: number;
137
+ l: number;
138
+ };
139
+ }
140
+ interface BrandKitAccessibilityCheck {
141
+ ratio: number;
142
+ rating: string;
143
+ }
144
+ interface BrandKitResult {
145
+ brand: string;
146
+ industry?: string;
147
+ vibes?: string[];
148
+ palette?: {
149
+ primary: BrandKitColor;
150
+ secondary: BrandKitColor;
151
+ accent: BrandKitColor;
152
+ background: BrandKitColor;
153
+ surface: BrandKitColor;
154
+ text: BrandKitColor;
155
+ textMuted: BrandKitColor;
156
+ success: BrandKitColor;
157
+ warning: BrandKitColor;
158
+ error: BrandKitColor;
159
+ };
160
+ typography?: {
161
+ display: {
162
+ family: string;
163
+ weights: string[];
164
+ usage: string;
165
+ };
166
+ body: {
167
+ family: string;
168
+ weights: string[];
169
+ usage: string;
170
+ };
171
+ scale: Record<string, string>;
172
+ googleFontsUrl: string;
173
+ };
174
+ accessibility?: {
175
+ primaryOnBackground: BrandKitAccessibilityCheck;
176
+ textOnBackground: BrandKitAccessibilityCheck;
177
+ primaryOnWhite: BrandKitAccessibilityCheck;
178
+ };
179
+ tokens?: Record<string, unknown>;
180
+ css?: string;
181
+ tailwindConfig?: string;
182
+ fonts?: {
183
+ display: string;
184
+ body: string;
185
+ googleFontsUrl?: string;
186
+ };
187
+ }
188
+ interface ImageMetadataStripperResult {
189
+ image: string;
190
+ outputFormat: string;
191
+ original: {
192
+ sizeBytes: number;
193
+ format?: string;
194
+ width?: number;
195
+ height?: number;
196
+ channels?: number;
197
+ hasExif?: boolean;
198
+ hasIcc?: boolean;
199
+ hasIptc?: boolean;
200
+ hasXmp?: boolean;
201
+ orientation?: number;
202
+ density?: number;
203
+ };
204
+ output: {
205
+ sizeBytes: number;
206
+ reductionBytes: number;
207
+ reductionPercent: number;
208
+ };
209
+ metadataStripped: boolean;
210
+ strippedFields: string[];
211
+ }
129
212
  declare class AgentToolbelt {
130
213
  private apiKey;
131
214
  private baseUrl;
@@ -196,6 +279,20 @@ declare class AgentToolbelt {
196
279
  format?: "hex" | "rgb" | "hsl" | "all";
197
280
  includeShades?: boolean;
198
281
  }): Promise<ColorPaletteResult>;
282
+ /** Strip EXIF, GPS, ICC, IPTC, and XMP metadata from a base64-encoded image */
283
+ imageMetadataStripper(input: {
284
+ image: string;
285
+ format?: "jpeg" | "png" | "webp" | "preserve";
286
+ quality?: number;
287
+ }): Promise<ImageMetadataStripperResult>;
288
+ /** Generate a full brand kit — color palette, typography, CSS/Tailwind tokens */
289
+ brandKit(input: {
290
+ name: string;
291
+ industry?: string;
292
+ vibe?: string[];
293
+ targetAudience?: string;
294
+ format?: "full" | "tokens" | "css" | "tailwind";
295
+ }): Promise<BrandKitResult>;
199
296
  }
200
297
 
201
- export { type AddressNormalizerResult, AgentToolbelt, type AgentToolbeltOptions, type ColorPaletteResult, type CronBuilderResult, type CsvToJsonResult, type MarkdownConverterResult, type RegexBuilderResult, type SchemaGeneratorResult, type TextExtractorResult, type TokenCountResult, type UrlMetadataResult };
298
+ export { type AddressNormalizerResult, AgentToolbelt, type AgentToolbeltOptions, type BrandKitResult, type ColorPaletteResult, type CronBuilderResult, type CsvToJsonResult, type ImageMetadataStripperResult, type MarkdownConverterResult, type RegexBuilderResult, type SchemaGeneratorResult, type TextExtractorResult, type TokenCountResult, type UrlMetadataResult };
package/dist/index.d.ts CHANGED
@@ -126,6 +126,89 @@ interface ColorPaletteResult {
126
126
  css: string;
127
127
  swatches: string;
128
128
  }
129
+ interface BrandKitColor {
130
+ name: string;
131
+ hex: string;
132
+ hsl: string;
133
+ rgb: string;
134
+ values: {
135
+ h: number;
136
+ s: number;
137
+ l: number;
138
+ };
139
+ }
140
+ interface BrandKitAccessibilityCheck {
141
+ ratio: number;
142
+ rating: string;
143
+ }
144
+ interface BrandKitResult {
145
+ brand: string;
146
+ industry?: string;
147
+ vibes?: string[];
148
+ palette?: {
149
+ primary: BrandKitColor;
150
+ secondary: BrandKitColor;
151
+ accent: BrandKitColor;
152
+ background: BrandKitColor;
153
+ surface: BrandKitColor;
154
+ text: BrandKitColor;
155
+ textMuted: BrandKitColor;
156
+ success: BrandKitColor;
157
+ warning: BrandKitColor;
158
+ error: BrandKitColor;
159
+ };
160
+ typography?: {
161
+ display: {
162
+ family: string;
163
+ weights: string[];
164
+ usage: string;
165
+ };
166
+ body: {
167
+ family: string;
168
+ weights: string[];
169
+ usage: string;
170
+ };
171
+ scale: Record<string, string>;
172
+ googleFontsUrl: string;
173
+ };
174
+ accessibility?: {
175
+ primaryOnBackground: BrandKitAccessibilityCheck;
176
+ textOnBackground: BrandKitAccessibilityCheck;
177
+ primaryOnWhite: BrandKitAccessibilityCheck;
178
+ };
179
+ tokens?: Record<string, unknown>;
180
+ css?: string;
181
+ tailwindConfig?: string;
182
+ fonts?: {
183
+ display: string;
184
+ body: string;
185
+ googleFontsUrl?: string;
186
+ };
187
+ }
188
+ interface ImageMetadataStripperResult {
189
+ image: string;
190
+ outputFormat: string;
191
+ original: {
192
+ sizeBytes: number;
193
+ format?: string;
194
+ width?: number;
195
+ height?: number;
196
+ channels?: number;
197
+ hasExif?: boolean;
198
+ hasIcc?: boolean;
199
+ hasIptc?: boolean;
200
+ hasXmp?: boolean;
201
+ orientation?: number;
202
+ density?: number;
203
+ };
204
+ output: {
205
+ sizeBytes: number;
206
+ reductionBytes: number;
207
+ reductionPercent: number;
208
+ };
209
+ metadataStripped: boolean;
210
+ strippedFields: string[];
211
+ }
129
212
  declare class AgentToolbelt {
130
213
  private apiKey;
131
214
  private baseUrl;
@@ -196,6 +279,20 @@ declare class AgentToolbelt {
196
279
  format?: "hex" | "rgb" | "hsl" | "all";
197
280
  includeShades?: boolean;
198
281
  }): Promise<ColorPaletteResult>;
282
+ /** Strip EXIF, GPS, ICC, IPTC, and XMP metadata from a base64-encoded image */
283
+ imageMetadataStripper(input: {
284
+ image: string;
285
+ format?: "jpeg" | "png" | "webp" | "preserve";
286
+ quality?: number;
287
+ }): Promise<ImageMetadataStripperResult>;
288
+ /** Generate a full brand kit — color palette, typography, CSS/Tailwind tokens */
289
+ brandKit(input: {
290
+ name: string;
291
+ industry?: string;
292
+ vibe?: string[];
293
+ targetAudience?: string;
294
+ format?: "full" | "tokens" | "css" | "tailwind";
295
+ }): Promise<BrandKitResult>;
199
296
  }
200
297
 
201
- export { type AddressNormalizerResult, AgentToolbelt, type AgentToolbeltOptions, type ColorPaletteResult, type CronBuilderResult, type CsvToJsonResult, type MarkdownConverterResult, type RegexBuilderResult, type SchemaGeneratorResult, type TextExtractorResult, type TokenCountResult, type UrlMetadataResult };
298
+ export { type AddressNormalizerResult, AgentToolbelt, type AgentToolbeltOptions, type BrandKitResult, type ColorPaletteResult, type CronBuilderResult, type CsvToJsonResult, type ImageMetadataStripperResult, type MarkdownConverterResult, type RegexBuilderResult, type SchemaGeneratorResult, type TextExtractorResult, type TokenCountResult, type UrlMetadataResult };
package/dist/index.js CHANGED
@@ -90,6 +90,14 @@ var AgentToolbelt = class {
90
90
  colorPalette(input) {
91
91
  return this.call("color-palette", input);
92
92
  }
93
+ /** Strip EXIF, GPS, ICC, IPTC, and XMP metadata from a base64-encoded image */
94
+ imageMetadataStripper(input) {
95
+ return this.call("image-metadata-stripper", input);
96
+ }
97
+ /** Generate a full brand kit — color palette, typography, CSS/Tailwind tokens */
98
+ brandKit(input) {
99
+ return this.call("brand-kit", input);
100
+ }
93
101
  };
94
102
  // Annotate the CommonJS export names for ESM import in node:
95
103
  0 && (module.exports = {
package/dist/index.mjs CHANGED
@@ -64,6 +64,14 @@ var AgentToolbelt = class {
64
64
  colorPalette(input) {
65
65
  return this.call("color-palette", input);
66
66
  }
67
+ /** Strip EXIF, GPS, ICC, IPTC, and XMP metadata from a base64-encoded image */
68
+ imageMetadataStripper(input) {
69
+ return this.call("image-metadata-stripper", input);
70
+ }
71
+ /** Generate a full brand kit — color palette, typography, CSS/Tailwind tokens */
72
+ brandKit(input) {
73
+ return this.call("brand-kit", input);
74
+ }
67
75
  };
68
76
  export {
69
77
  AgentToolbelt
package/dist/langchain.js CHANGED
@@ -164,6 +164,36 @@ function createLangChainTools(client) {
164
164
  const result = await client.colorPalette({ description, count, format });
165
165
  return JSON.stringify(result);
166
166
  }
167
+ }),
168
+ // ---- Image Metadata Stripper ----
169
+ new import_tools.DynamicStructuredTool({
170
+ name: "strip_image_metadata",
171
+ description: "Strip EXIF, GPS location, IPTC, XMP, and ICC metadata from an image for privacy protection. Use this before uploading or sharing images to remove sensitive embedded data like GPS coordinates, camera model, timestamps, copyright notices, and editing history. Accepts base64-encoded JPEG, PNG, WebP, or TIFF images. Returns the cleaned image as base64 along with a report of what was removed and the file size reduction.",
172
+ schema: import_zod.z.object({
173
+ image: import_zod.z.string().describe("Base64-encoded image data (JPEG, PNG, WebP, or TIFF). Do not include the data URI prefix."),
174
+ format: import_zod.z.enum(["jpeg", "png", "webp", "preserve"]).default("preserve").describe("Output format. 'preserve' keeps the original format."),
175
+ quality: import_zod.z.number().int().min(1).max(100).default(90).describe("Output quality for lossy formats (1-100)")
176
+ }),
177
+ func: async ({ image, format, quality }) => {
178
+ const result = await client.imageMetadataStripper({ image, format, quality });
179
+ return JSON.stringify(result);
180
+ }
181
+ }),
182
+ // ---- Brand Kit ----
183
+ new import_tools.DynamicStructuredTool({
184
+ name: "generate_brand_kit",
185
+ description: "Generate a complete brand kit from a company name, industry, and aesthetic keywords. Use this when a user needs a full visual identity: color palette, typography pairings, and design tokens. Powered by color psychology \u2014 maps industries to appropriate hues (fintech\u2192blues, healthcare\u2192greens, etc.) and vibes to color adjustments (luxurious\u2192desaturated darks, playful\u2192saturated brights). Returns Google Fonts pairings, WCAG accessibility scores, and ready-to-paste CSS custom properties or Tailwind config.",
186
+ schema: import_zod.z.object({
187
+ name: import_zod.z.string().describe("Company or brand name (e.g. 'Solaris Health', 'Bolt Finance')"),
188
+ industry: import_zod.z.string().optional().describe("Industry or sector (e.g. 'fintech', 'healthcare', 'fashion', 'saas', 'food & beverage')"),
189
+ vibe: import_zod.z.array(import_zod.z.string()).optional().describe("Aesthetic keywords (e.g. ['modern', 'minimal'], ['bold', 'playful'], ['luxurious', 'elegant'])"),
190
+ targetAudience: import_zod.z.string().optional().describe("Who the brand is for (e.g. 'enterprise B2B', 'gen-z consumers')"),
191
+ format: import_zod.z.enum(["full", "tokens", "css", "tailwind"]).default("full").describe("Output format: full (everything), tokens (JSON), css (custom properties), tailwind (config)")
192
+ }),
193
+ func: async ({ name, industry, vibe, targetAudience, format }) => {
194
+ const result = await client.brandKit({ name, industry, vibe, targetAudience, format });
195
+ return JSON.stringify(result);
196
+ }
167
197
  })
168
198
  ];
169
199
  }
@@ -140,6 +140,36 @@ function createLangChainTools(client) {
140
140
  const result = await client.colorPalette({ description, count, format });
141
141
  return JSON.stringify(result);
142
142
  }
143
+ }),
144
+ // ---- Image Metadata Stripper ----
145
+ new DynamicStructuredTool({
146
+ name: "strip_image_metadata",
147
+ description: "Strip EXIF, GPS location, IPTC, XMP, and ICC metadata from an image for privacy protection. Use this before uploading or sharing images to remove sensitive embedded data like GPS coordinates, camera model, timestamps, copyright notices, and editing history. Accepts base64-encoded JPEG, PNG, WebP, or TIFF images. Returns the cleaned image as base64 along with a report of what was removed and the file size reduction.",
148
+ schema: z.object({
149
+ image: z.string().describe("Base64-encoded image data (JPEG, PNG, WebP, or TIFF). Do not include the data URI prefix."),
150
+ format: z.enum(["jpeg", "png", "webp", "preserve"]).default("preserve").describe("Output format. 'preserve' keeps the original format."),
151
+ quality: z.number().int().min(1).max(100).default(90).describe("Output quality for lossy formats (1-100)")
152
+ }),
153
+ func: async ({ image, format, quality }) => {
154
+ const result = await client.imageMetadataStripper({ image, format, quality });
155
+ return JSON.stringify(result);
156
+ }
157
+ }),
158
+ // ---- Brand Kit ----
159
+ new DynamicStructuredTool({
160
+ name: "generate_brand_kit",
161
+ description: "Generate a complete brand kit from a company name, industry, and aesthetic keywords. Use this when a user needs a full visual identity: color palette, typography pairings, and design tokens. Powered by color psychology \u2014 maps industries to appropriate hues (fintech\u2192blues, healthcare\u2192greens, etc.) and vibes to color adjustments (luxurious\u2192desaturated darks, playful\u2192saturated brights). Returns Google Fonts pairings, WCAG accessibility scores, and ready-to-paste CSS custom properties or Tailwind config.",
162
+ schema: z.object({
163
+ name: z.string().describe("Company or brand name (e.g. 'Solaris Health', 'Bolt Finance')"),
164
+ industry: z.string().optional().describe("Industry or sector (e.g. 'fintech', 'healthcare', 'fashion', 'saas', 'food & beverage')"),
165
+ vibe: z.array(z.string()).optional().describe("Aesthetic keywords (e.g. ['modern', 'minimal'], ['bold', 'playful'], ['luxurious', 'elegant'])"),
166
+ targetAudience: z.string().optional().describe("Who the brand is for (e.g. 'enterprise B2B', 'gen-z consumers')"),
167
+ format: z.enum(["full", "tokens", "css", "tailwind"]).default("full").describe("Output format: full (everything), tokens (JSON), css (custom properties), tailwind (config)")
168
+ }),
169
+ func: async ({ name, industry, vibe, targetAudience, format }) => {
170
+ const result = await client.brandKit({ name, industry, vibe, targetAudience, format });
171
+ return JSON.stringify(result);
172
+ }
143
173
  })
144
174
  ];
145
175
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-toolbelt",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Official SDK for Agent Toolbelt — typed API client and LangChain tool wrappers for schema generation, text extraction, token counting, CSV conversion, and more.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",