@vibesdotdev/integrations-mlx 0.0.0-stage → 1.0.0-rc.4

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 (67) hide show
  1. package/LICENSE +126 -0
  2. package/README.md +20 -2
  3. package/dist/ai/index.d.ts +5 -0
  4. package/dist/ai/index.d.ts.map +1 -0
  5. package/dist/ai/index.js +5 -0
  6. package/dist/ai/index.js.map +1 -0
  7. package/dist/ai/provider.consumer.plugin.d.ts +6 -0
  8. package/dist/ai/provider.consumer.plugin.d.ts.map +1 -0
  9. package/dist/ai/provider.consumer.plugin.js +96 -0
  10. package/dist/ai/provider.consumer.plugin.js.map +1 -0
  11. package/dist/ai/provider.plugin.d.ts +2 -0
  12. package/dist/ai/provider.plugin.d.ts.map +1 -0
  13. package/dist/ai/provider.plugin.js +2 -0
  14. package/dist/ai/provider.plugin.js.map +1 -0
  15. package/dist/ai/providers/local/image/mlx/config/config.mlx.descriptor.d.ts +4206 -0
  16. package/dist/ai/providers/local/image/mlx/config/config.mlx.descriptor.d.ts.map +1 -0
  17. package/dist/ai/providers/local/image/mlx/config/config.mlx.descriptor.js +53 -0
  18. package/dist/ai/providers/local/image/mlx/config/config.mlx.descriptor.js.map +1 -0
  19. package/dist/ai/providers/local/image/mlx/config/schemas/index.d.ts +21 -0
  20. package/dist/ai/providers/local/image/mlx/config/schemas/index.d.ts.map +1 -0
  21. package/dist/ai/providers/local/image/mlx/config/schemas/index.js +11 -0
  22. package/dist/ai/providers/local/image/mlx/config/schemas/index.js.map +1 -0
  23. package/dist/ai/providers/local/image/mlx/index.d.ts +5 -0
  24. package/dist/ai/providers/local/image/mlx/index.d.ts.map +1 -0
  25. package/dist/ai/providers/local/image/mlx/index.js +4 -0
  26. package/dist/ai/providers/local/image/mlx/index.js.map +1 -0
  27. package/dist/ai/providers/local/image/mlx/provider.mlx.descriptor.d.ts +183 -0
  28. package/dist/ai/providers/local/image/mlx/provider.mlx.descriptor.d.ts.map +1 -0
  29. package/dist/ai/providers/local/image/mlx/provider.mlx.descriptor.js +55 -0
  30. package/dist/ai/providers/local/image/mlx/provider.mlx.descriptor.js.map +1 -0
  31. package/dist/ai/providers/mlx/detection/mlx-system-detection.impl.consumer.d.ts +14 -0
  32. package/dist/ai/providers/mlx/detection/mlx-system-detection.impl.consumer.d.ts.map +1 -0
  33. package/dist/ai/providers/mlx/detection/mlx-system-detection.impl.consumer.js +33 -0
  34. package/dist/ai/providers/mlx/detection/mlx-system-detection.impl.consumer.js.map +1 -0
  35. package/dist/ai/providers/mlx/docs/ai.providers.mlx.docs.descriptor.d.ts +4 -0
  36. package/dist/ai/providers/mlx/docs/ai.providers.mlx.docs.descriptor.d.ts.map +1 -0
  37. package/dist/ai/providers/mlx/docs/ai.providers.mlx.docs.descriptor.js +25 -0
  38. package/dist/ai/providers/mlx/docs/ai.providers.mlx.docs.descriptor.js.map +1 -0
  39. package/dist/ai/providers/mlx/index.d.ts +5 -0
  40. package/dist/ai/providers/mlx/index.d.ts.map +1 -0
  41. package/dist/ai/providers/mlx/index.js +5 -0
  42. package/dist/ai/providers/mlx/index.js.map +1 -0
  43. package/dist/ai/providers/mlx/mlx.provider.impl.consumer.d.ts +29 -0
  44. package/dist/ai/providers/mlx/mlx.provider.impl.consumer.d.ts.map +1 -0
  45. package/dist/ai/providers/mlx/mlx.provider.impl.consumer.js +114 -0
  46. package/dist/ai/providers/mlx/mlx.provider.impl.consumer.js.map +1 -0
  47. package/dist/ai/providers/mlx/process.consumer.d.ts +7 -0
  48. package/dist/ai/providers/mlx/process.consumer.d.ts.map +1 -0
  49. package/dist/ai/providers/mlx/process.consumer.js +22 -0
  50. package/dist/ai/providers/mlx/process.consumer.js.map +1 -0
  51. package/dist/ai/providers/mlx/recommendations.d.ts +21 -0
  52. package/dist/ai/providers/mlx/recommendations.d.ts.map +1 -0
  53. package/dist/ai/providers/mlx/recommendations.js +58 -0
  54. package/dist/ai/providers/mlx/recommendations.js.map +1 -0
  55. package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.descriptor.d.ts +36 -0
  56. package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.descriptor.d.ts.map +1 -0
  57. package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.descriptor.js +33 -0
  58. package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.descriptor.js.map +1 -0
  59. package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.impl.d.ts +41 -0
  60. package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.impl.d.ts.map +1 -0
  61. package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.impl.js +109 -0
  62. package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.impl.js.map +1 -0
  63. package/dist/index.d.ts +2 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +2 -0
  66. package/dist/index.js.map +1 -0
  67. package/package.json +108 -4
@@ -0,0 +1,114 @@
1
+ import { ImageGenerationRequestSchema } from '@vibesdotdev/ai-schemas/generation/modality-requests';
2
+ import { GenerationExecutionOptionsSchema } from '@vibesdotdev/ai-schemas/generation/contracts';
3
+ import { CapabilityError } from '@vibesdotdev/kernel';
4
+ import { observeMlxProcess } from "./process.consumer.js";
5
+ import { mlxConnectionSchema, DEFAULT_MLX_TIMEOUT_MS } from "../local/image/mlx/config/schemas/index.js";
6
+ import { detectMlxSystem } from "./detection/mlx-system-detection.impl.consumer.js";
7
+ export class MlxProviderType {
8
+ descriptor;
9
+ context;
10
+ constructor(descriptor, context) {
11
+ this.descriptor = descriptor;
12
+ this.context = context;
13
+ }
14
+ async generate(provider, model, request, options) {
15
+ const parsed = ImageGenerationRequestSchema.safeParse({ ...request, provider, model });
16
+ if (!parsed.success) {
17
+ throw new CapabilityError('MLX supports image generation requests', 'INVALID_INPUT', {
18
+ reason: 'mlx-unsupported-request'
19
+ });
20
+ }
21
+ const query = this.context.runtime.query('ai/generation');
22
+ const executor = await (options?.generationMethod ? query.withId(options.generationMethod) : query).resolve();
23
+ const response = await executor.execute(parsed.data, GenerationExecutionOptionsSchema.parse({
24
+ ...options,
25
+ signal: request.signal,
26
+ metadata: { ...options?.metadata, scope: options?.scope, specId: options?.specId, capability: options?.capability }
27
+ }));
28
+ return { response, adapterId: 'spec:mlx-image-cli/transport:process', generationMethod: executor.descriptor.id };
29
+ }
30
+ async detectInstalled() {
31
+ const detected = await detectMlxSystem(this.context.runtime);
32
+ return detected ? [{ name: detected.name, source: 'system', config: detected.configuration ?? {} }] : [];
33
+ }
34
+ async recommendModels(useCase) {
35
+ if (useCase !== 'images' && useCase !== 'image')
36
+ return [];
37
+ return [
38
+ {
39
+ modelId: 'dev',
40
+ modelName: 'FLUX.1 dev',
41
+ score: 92,
42
+ reason: 'Default mflux model for consumer Apple Silicon image generation',
43
+ capabilities: ['image_generation'],
44
+ useCaseFit: 92
45
+ },
46
+ {
47
+ modelId: 'schnell',
48
+ modelName: 'FLUX.1 schnell',
49
+ score: 88,
50
+ reason: 'Faster consumer-friendly FLUX variant for local mflux',
51
+ capabilities: ['image_generation'],
52
+ useCaseFit: 88
53
+ }
54
+ ];
55
+ }
56
+ async checkHealth(config, options) {
57
+ const start = Date.now();
58
+ const parsed = mlxConnectionSchema.safeParse(config);
59
+ if (!parsed.success) {
60
+ return {
61
+ healthy: false,
62
+ latencyMs: Date.now() - start,
63
+ error: { code: 'INVALID_CONFIG', message: parsed.error.message },
64
+ checkedAt: new Date()
65
+ };
66
+ }
67
+ const { executable, modelsDir } = parsed.data;
68
+ const resolved = (await observeMlxProcess(this.context.runtime, 'sh', ['-c', 'command -v "$1"', 'vibes-command-probe', executable])).stdout.trim() || executable;
69
+ const { ok } = await observeMlxProcess(this.context.runtime, resolved, ['--help'], options?.timeout);
70
+ if (!ok) {
71
+ return {
72
+ healthy: false,
73
+ latencyMs: Date.now() - start,
74
+ message: 'mflux-generate is not available',
75
+ error: {
76
+ code: 'BINARY_NOT_FOUND',
77
+ message: `${executable} did not respond to --help`
78
+ },
79
+ checkedAt: new Date()
80
+ };
81
+ }
82
+ if (modelsDir && modelsDir.trim().length > 0) {
83
+ if (!(await observeMlxProcess(this.context.runtime, 'sh', ['-c', 'test -r "$1"', 'vibes-path-probe', modelsDir])).ok) {
84
+ return {
85
+ healthy: false,
86
+ latencyMs: Date.now() - start,
87
+ message: 'Configured MLX models directory is not readable',
88
+ error: { code: 'MODEL_PATH_NOT_FOUND', message: modelsDir },
89
+ checkedAt: new Date()
90
+ };
91
+ }
92
+ }
93
+ return {
94
+ healthy: true,
95
+ latencyMs: Date.now() - start,
96
+ message: 'mflux-generate is available on this consumer Apple Silicon host',
97
+ availableModalities: ['image'],
98
+ checkedAt: new Date()
99
+ };
100
+ }
101
+ async validateConnection(config) {
102
+ const parsed = mlxConnectionSchema.safeParse(config);
103
+ if (!parsed.success) {
104
+ return { valid: false, errors: parsed.error.issues.map((issue) => issue.message) };
105
+ }
106
+ return {
107
+ valid: true,
108
+ warnings: parsed.data.timeout < 10_000 ? ['Timeout is short for local image generation'] : undefined
109
+ };
110
+ }
111
+ async dispose() { }
112
+ }
113
+ export { DEFAULT_MLX_TIMEOUT_MS };
114
+ //# sourceMappingURL=mlx.provider.impl.consumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mlx.provider.impl.consumer.js","sourceRoot":"","sources":["../../../../src/ai/providers/mlx/mlx.provider.impl.consumer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type VibesRuntime } from '@vibesdotdev/kernel';
2
+ /** One process observation path for detection and health; the transport owns host I/O. */
3
+ export declare function observeMlxProcess(runtime: VibesRuntime, executable: string, args: string[], timeoutMs?: number): Promise<{
4
+ ok: boolean;
5
+ stdout: string;
6
+ }>;
7
+ //# sourceMappingURL=process.consumer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.consumer.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/mlx/process.consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIhE,0FAA0F;AAC1F,wBAAsB,iBAAiB,CACtC,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,SAAO,GACd,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB1C"}
@@ -0,0 +1,22 @@
1
+ import { settle } from '@vibesdotdev/kernel';
2
+ /** One process observation path for detection and health; the transport owns host I/O. */
3
+ export async function observeMlxProcess(runtime, executable, args, timeoutMs = 3000) {
4
+ const transport = await runtime.query('ai/transport')
5
+ .withId('process').resolve();
6
+ let ok = true;
7
+ let stdout = '';
8
+ const decoder = new TextDecoder();
9
+ const outcome = await settle(() => runtime.lifecycle.wait(async (signal) => {
10
+ for await (const chunk of transport.send({
11
+ method: 'POST', path: '', headers: {}, body: { args }, streaming: false
12
+ }, { endpointBase: executable, runtime, timeoutMs, signal, framing: 'none' })) {
13
+ if (chunk.kind === 'error')
14
+ ok = false;
15
+ if (chunk.kind === 'bytes')
16
+ stdout += decoder.decode(chunk.data, { stream: true });
17
+ }
18
+ stdout += decoder.decode();
19
+ }, { timeoutMs, reason: 'MLX process observation' }));
20
+ return { ok: ok && outcome.ok, stdout };
21
+ }
22
+ //# sourceMappingURL=process.consumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.consumer.js","sourceRoot":"","sources":["../../../../src/ai/providers/mlx/process.consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,qBAAqB,CAAC;AAIhE,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,OAAqB,EACrB,UAAkB,EAClB,IAAc,EACd,SAAS,GAAG,IAAI;IAEhB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,CAA8C,cAAc,CAAC;SAChG,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9B,IAAI,EAAE,GAAG,IAAI,CAAC;IACd,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAC1E,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC;YACxC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK;SACvE,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAC/E,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBAAE,EAAE,GAAG,KAAK,CAAC;YACvC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBAAE,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC;IACtD,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { ProviderRecommendation, type ModelAdapter } from '@vibesdotdev/ai/recommendations/base';
2
+ import type { ModelRecommendation, RecommendationContext, SetupMethod, SetupStep, UseCase } from '@vibesdotdev/ai/recommendations/schemas';
3
+ export declare class MlxRecommendation extends ProviderRecommendation {
4
+ readonly providerType = "mlx";
5
+ readonly displayName = "Apple MLX";
6
+ getUseCaseScore(useCase: UseCase): number;
7
+ getRequiredEnvironmentVariables(): string[];
8
+ getReason(): string;
9
+ getStrengths(): string[];
10
+ getWeaknesses(): string[];
11
+ getSupportedSetupMethods(): SetupMethod[];
12
+ getSetupSteps(_method: SetupMethod): Promise<SetupStep[]>;
13
+ recommendModels(_adapter: ModelAdapter | null, context: RecommendationContext): Promise<ModelRecommendation[]>;
14
+ getExecutionContext(): {
15
+ recommendModels: "client";
16
+ getSetupSteps: "client";
17
+ };
18
+ supportsLocal(): boolean;
19
+ requiresGPU(): boolean;
20
+ }
21
+ //# sourceMappingURL=recommendations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommendations.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/mlx/recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,KAAK,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACjG,OAAO,KAAK,EACX,mBAAmB,EACnB,qBAAqB,EACrB,WAAW,EACX,SAAS,EACT,OAAO,EACP,MAAM,yCAAyC,CAAC;AAEjD,qBAAa,iBAAkB,SAAQ,sBAAsB;IAC5D,QAAQ,CAAC,YAAY,SAAS;IAC9B,QAAQ,CAAC,WAAW,eAAe;IACnC,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IAKzC,+BAA+B,IAAI,MAAM,EAAE;IAG3C,SAAS,IAAI,MAAM;IAGnB,YAAY,IAAI,MAAM,EAAE;IAGxB,aAAa,IAAI,MAAM,EAAE;IAGzB,wBAAwB,IAAI,WAAW,EAAE;IAGnC,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IASzD,eAAe,CACpB,QAAQ,EAAE,YAAY,GAAG,IAAI,EAC7B,OAAO,EAAE,qBAAqB,GAC5B,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAejC,mBAAmB;;;;IAGnB,aAAa,IAAI,OAAO;IAGxB,WAAW,IAAI,OAAO;CAGtB"}
@@ -0,0 +1,58 @@
1
+ import { ProviderRecommendation } from '@vibesdotdev/ai/recommendations/base';
2
+ export class MlxRecommendation extends ProviderRecommendation {
3
+ providerType = 'mlx';
4
+ displayName = 'Apple MLX';
5
+ getUseCaseScore(useCase) {
6
+ return { chat: 5, development: 10, research: 20, images: 90, video: 0, audio: 0, organization: 0 }[useCase];
7
+ }
8
+ getRequiredEnvironmentVariables() {
9
+ return [];
10
+ }
11
+ getReason() {
12
+ return 'Local FLUX image generation on Apple Silicon through the mflux CLI';
13
+ }
14
+ getStrengths() {
15
+ return ['Consumer Apple Silicon GPU', 'Offline image generation', 'No hosted API credential'];
16
+ }
17
+ getWeaknesses() {
18
+ return ['Requires Apple Silicon and the mflux CLI', 'Image generation only'];
19
+ }
20
+ getSupportedSetupMethods() {
21
+ return ['local_scan'];
22
+ }
23
+ async getSetupSteps(_method) {
24
+ return [
25
+ {
26
+ step: 'Install mflux',
27
+ description: 'Install the mflux CLI on Apple Silicon so mflux-generate is on PATH.',
28
+ action: 'https://github.com/filipstrand/mflux'
29
+ }
30
+ ];
31
+ }
32
+ async recommendModels(_adapter, context) {
33
+ if (context.useCase !== 'images')
34
+ return [];
35
+ return [
36
+ {
37
+ modelId: 'dev',
38
+ modelName: 'FLUX.1 dev',
39
+ score: 92,
40
+ reason: 'Default mflux model for consumer Apple Silicon image generation',
41
+ capabilities: ['image_generation'],
42
+ isAvailable: true,
43
+ requiresUpgrade: false,
44
+ useCaseFit: 92
45
+ }
46
+ ];
47
+ }
48
+ getExecutionContext() {
49
+ return { recommendModels: 'client', getSetupSteps: 'client' };
50
+ }
51
+ supportsLocal() {
52
+ return true;
53
+ }
54
+ requiresGPU() {
55
+ return true;
56
+ }
57
+ }
58
+ //# sourceMappingURL=recommendations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommendations.js","sourceRoot":"","sources":["../../../../src/ai/providers/mlx/recommendations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAqB,MAAM,sCAAsC,CAAC;AASjG,MAAM,OAAO,iBAAkB,SAAQ,sBAAsB;IACnD,YAAY,GAAG,KAAK,CAAC;IACrB,WAAW,GAAG,WAAW,CAAC;IACnC,eAAe,CAAC,OAAgB;QAC/B,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CACjG,OAAO,CACP,CAAC;IACH,CAAC;IACD,+BAA+B;QAC9B,OAAO,EAAE,CAAC;IACX,CAAC;IACD,SAAS;QACR,OAAO,oEAAoE,CAAC;IAC7E,CAAC;IACD,YAAY;QACX,OAAO,CAAC,4BAA4B,EAAE,0BAA0B,EAAE,0BAA0B,CAAC,CAAC;IAC/F,CAAC;IACD,aAAa;QACZ,OAAO,CAAC,0CAA0C,EAAE,uBAAuB,CAAC,CAAC;IAC9E,CAAC;IACD,wBAAwB;QACvB,OAAO,CAAC,YAAY,CAAC,CAAC;IACvB,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,OAAoB;QACvC,OAAO;YACN;gBACC,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,sEAAsE;gBACnF,MAAM,EAAE,sCAAsC;aAC9C;SACD,CAAC;IACH,CAAC;IACD,KAAK,CAAC,eAAe,CACpB,QAA6B,EAC7B,OAA8B;QAE9B,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAC5C,OAAO;YACN;gBACC,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,YAAY;gBACvB,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,iEAAiE;gBACzE,YAAY,EAAE,CAAC,kBAAkB,CAAC;gBAClC,WAAW,EAAE,IAAI;gBACjB,eAAe,EAAE,KAAK;gBACtB,UAAU,EAAE,EAAE;aACd;SACD,CAAC;IACH,CAAC;IACD,mBAAmB;QAClB,OAAO,EAAE,eAAe,EAAE,QAAiB,EAAE,aAAa,EAAE,QAAiB,EAAE,CAAC;IACjF,CAAC;IACD,aAAa;QACZ,OAAO,IAAI,CAAC;IACb,CAAC;IACD,WAAW;QACV,OAAO,IAAI,CAAC;IACb,CAAC;CACD"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * `spec-mlx-image-cli` — MLX/mflux image generation via local binary.
3
+ *
4
+ * Spawns the `mflux-generate` binary with `--prompt`, `--width`,
5
+ * `--height`, `--steps`, `--guidance`, `--seed`, and `--output {output}`.
6
+ * transport-process allocates the output path, reads the PNG bytes
7
+ * after exit, and the decoder base64-encodes them into
8
+ * `ImageGenerationResponse.images`.
9
+ *
10
+ * Consumer scope only — relies on mlx + an Apple Silicon GPU.
11
+ */
12
+ declare const _default: {
13
+ id: string;
14
+ kind: "ai/spec";
15
+ name: string;
16
+ description: string;
17
+ modalities: ("image" | "text" | "audio" | "video" | "embedding" | "transcription" | "evaluation" | "speech" | "ocr")[];
18
+ streamFraming: "none" | "sse" | "sse-named" | "ndjson" | "binary-chunked" | "ws-frame";
19
+ toolCallEnvelope: string;
20
+ transports: string[];
21
+ external: boolean;
22
+ priority: number;
23
+ enabled: boolean;
24
+ capabilities?: ("streaming" | "json_mode" | "text_generation" | "chat_completion" | "function_calling" | "embedding_generation" | "image_generation_text_to_image" | "image_generation_image_to_image" | "image_generation_inpainting" | "image_generation_outpainting" | "image_upscaling" | "image_editing_via_instructions" | "audio_generation_text_to_speech" | "audio_generation_voice_cloning" | "audio_generation_music" | "audio_generation_sound_effects" | "audio_transcription" | "audio_transcription_realtime" | "video_generation_text_to_video" | "workflow_execution" | "code_generation" | "image_understanding" | "structured_evaluation")[] | undefined;
25
+ imageControls?: {
26
+ steps: boolean;
27
+ cfg: boolean;
28
+ sampler: boolean;
29
+ scheduler: boolean;
30
+ negativePrompt: boolean;
31
+ seed: boolean;
32
+ } | undefined;
33
+ tags?: string[] | undefined;
34
+ };
35
+ export default _default;
36
+ //# sourceMappingURL=mlx-image-cli.spec.descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mlx-image-cli.spec.descriptor.d.ts","sourceRoot":"","sources":["../../../../src/ai/specs/mlx-image-cli/mlx-image-cli.spec.descriptor.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;AACH,wBAoBG"}
@@ -0,0 +1,33 @@
1
+ import { createAISpecDescriptor } from '@vibesdotdev/ai/specs/schemas/descriptor';
2
+ /**
3
+ * `spec-mlx-image-cli` — MLX/mflux image generation via local binary.
4
+ *
5
+ * Spawns the `mflux-generate` binary with `--prompt`, `--width`,
6
+ * `--height`, `--steps`, `--guidance`, `--seed`, and `--output {output}`.
7
+ * transport-process allocates the output path, reads the PNG bytes
8
+ * after exit, and the decoder base64-encodes them into
9
+ * `ImageGenerationResponse.images`.
10
+ *
11
+ * Consumer scope only — relies on mlx + an Apple Silicon GPU.
12
+ */
13
+ export default createAISpecDescriptor({
14
+ id: 'mlx-image-cli',
15
+ name: 'MLX Image (mflux)',
16
+ description: 'Local image generation via the mflux CLI on Apple Silicon. PNG written to a temp file and read back as bytes.',
17
+ modalities: ['image'],
18
+ streamFraming: 'binary-chunked',
19
+ toolCallEnvelope: 'none',
20
+ transports: ['process'],
21
+ capabilities: ['image_generation_text_to_image'],
22
+ imageControls: {
23
+ steps: true,
24
+ cfg: true,
25
+ sampler: false,
26
+ scheduler: false,
27
+ negativePrompt: false,
28
+ seed: true
29
+ },
30
+ priority: 100,
31
+ tags: ['mlx', 'mflux', 'apple-silicon', 'consumer-only']
32
+ });
33
+ //# sourceMappingURL=mlx-image-cli.spec.descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mlx-image-cli.spec.descriptor.js","sourceRoot":"","sources":["../../../../src/ai/specs/mlx-image-cli/mlx-image-cli.spec.descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAElF;;;;;;;;;;GAUG;AACH,eAAe,sBAAsB,CAAC;IACrC,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACV,+GAA+G;IAChH,UAAU,EAAE,CAAC,OAAO,CAAC;IACrB,aAAa,EAAE,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM;IACxB,UAAU,EAAE,CAAC,SAAS,CAAC;IACvB,YAAY,EAAE,CAAC,gCAAgC,CAAC;IAChD,aAAa,EAAE;QACd,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,IAAI;QACT,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,KAAK;QAChB,cAAc,EAAE,KAAK;QACrB,IAAI,EAAE,IAAI;KACV;IACD,QAAQ,EAAE,GAAG;IACb,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC;CACxD,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * `spec-mlx-image-cli` impl.
3
+ *
4
+ * Encodes an `ImageGenerationRequest` to mflux argv. Uses
5
+ * transport-process' `outputFiles: ['output']` placeholder mechanism
6
+ * so the binary writes its PNG to a transport-allocated temp file,
7
+ * and the transport returns the PNG bytes after exit. The decoder
8
+ * converts those bytes to a `data:image/png;base64,...` URI.
9
+ */
10
+ import type { AISpecInterface, DecodedEvent, SpecCallContext, WireRequest, WireResponseChunk } from '@vibesdotdev/ai/specs/interfaces';
11
+ import type { GenerationRequest } from '@vibesdotdev/ai/interfaces';
12
+ import type { Modality } from '@vibesdotdev/ai/models/schemas';
13
+ export declare class MlxImageCliSpec implements AISpecInterface {
14
+ readonly descriptor: {
15
+ id: string;
16
+ kind: "ai/spec";
17
+ name: string;
18
+ description: string;
19
+ modalities: ("image" | "text" | "audio" | "video" | "embedding" | "transcription" | "evaluation" | "speech" | "ocr")[];
20
+ streamFraming: "none" | "sse" | "sse-named" | "ndjson" | "binary-chunked" | "ws-frame";
21
+ toolCallEnvelope: string;
22
+ transports: string[];
23
+ external: boolean;
24
+ priority: number;
25
+ enabled: boolean;
26
+ capabilities?: ("streaming" | "json_mode" | "text_generation" | "chat_completion" | "function_calling" | "embedding_generation" | "image_generation_text_to_image" | "image_generation_image_to_image" | "image_generation_inpainting" | "image_generation_outpainting" | "image_upscaling" | "image_editing_via_instructions" | "audio_generation_text_to_speech" | "audio_generation_voice_cloning" | "audio_generation_music" | "audio_generation_sound_effects" | "audio_transcription" | "audio_transcription_realtime" | "video_generation_text_to_video" | "workflow_execution" | "code_generation" | "image_understanding" | "structured_evaluation")[] | undefined;
27
+ imageControls?: {
28
+ steps: boolean;
29
+ cfg: boolean;
30
+ sampler: boolean;
31
+ scheduler: boolean;
32
+ negativePrompt: boolean;
33
+ seed: boolean;
34
+ } | undefined;
35
+ tags?: string[] | undefined;
36
+ };
37
+ encodeRequest<M extends Modality>(request: GenerationRequest<M>, context: SpecCallContext): WireRequest;
38
+ decodeResponse<M extends Modality>(chunks: AsyncIterable<WireResponseChunk>, _request: GenerationRequest<M>, context: SpecCallContext): AsyncIterable<DecodedEvent<M>>;
39
+ }
40
+ export default MlxImageCliSpec;
41
+ //# sourceMappingURL=mlx-image-cli.spec.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mlx-image-cli.spec.impl.d.ts","sourceRoot":"","sources":["../../../../src/ai/specs/mlx-image-cli/mlx-image-cli.spec.impl.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACX,eAAe,EACf,YAAY,EACZ,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EACX,iBAAiB,EAGjB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAG/D,qBAAa,eAAgB,YAAW,eAAe;IACtD,QAAQ,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;MAAc;IAEjC,aAAa,CAAC,CAAC,SAAS,QAAQ,EAC/B,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,eAAe,GACtB,WAAW;IAgCP,cAAc,CAAC,CAAC,SAAS,QAAQ,EACvC,MAAM,EAAE,aAAa,CAAC,iBAAiB,CAAC,EACxC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC9B,OAAO,EAAE,eAAe,GACtB,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;CAkCjC;AA4BD,eAAe,eAAe,CAAC"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * `spec-mlx-image-cli` impl.
3
+ *
4
+ * Encodes an `ImageGenerationRequest` to mflux argv. Uses
5
+ * transport-process' `outputFiles: ['output']` placeholder mechanism
6
+ * so the binary writes its PNG to a transport-allocated temp file,
7
+ * and the transport returns the PNG bytes after exit. The decoder
8
+ * converts those bytes to a `data:image/png;base64,...` URI.
9
+ */
10
+ import { CapabilityError } from '@vibesdotdev/kernel';
11
+ import { ImageGenerationRequestSchema } from '@vibesdotdev/ai-schemas/generation/modality-requests';
12
+ import descriptor from "./mlx-image-cli.spec.descriptor.js";
13
+ export class MlxImageCliSpec {
14
+ descriptor = descriptor;
15
+ encodeRequest(request, context) {
16
+ const image = parseImageRequest(request);
17
+ const args = [
18
+ '--model',
19
+ context.wireModelId || 'dev',
20
+ '--prompt',
21
+ image.prompt,
22
+ '--width',
23
+ String(image.width ?? 1024),
24
+ '--height',
25
+ String(image.height ?? 1024),
26
+ '--output',
27
+ '{output}.png'
28
+ ];
29
+ if (image.steps !== undefined)
30
+ args.push('--steps', String(image.steps));
31
+ if (image.guidanceScale !== undefined) {
32
+ args.push('--guidance', String(image.guidanceScale));
33
+ }
34
+ const seed = image.seed ?? Math.floor(Math.random() * 1_000_000_000);
35
+ args.push('--seed', String(seed));
36
+ return {
37
+ method: 'POST',
38
+ path: '',
39
+ headers: {},
40
+ body: {
41
+ args,
42
+ outputFiles: ['output']
43
+ },
44
+ streaming: false
45
+ };
46
+ }
47
+ async *decodeResponse(chunks, _request, context) {
48
+ parseImageRequest(_request);
49
+ const collected = [];
50
+ let totalLen = 0;
51
+ for await (const chunk of chunks) {
52
+ if (chunk.kind === 'bytes') {
53
+ collected.push(chunk.data);
54
+ totalLen += chunk.data.length;
55
+ }
56
+ else if (chunk.kind === 'error') {
57
+ yield { kind: 'error', error: chunk.error };
58
+ return;
59
+ }
60
+ else if (chunk.kind === 'end') {
61
+ if (totalLen === 0) {
62
+ yield {
63
+ kind: 'error',
64
+ error: new CapabilityError('mlx-image-cli: empty output file from mflux', 'UNAVAILABLE', { reason: 'mlx-empty-output', retryable: false })
65
+ };
66
+ return;
67
+ }
68
+ const merged = mergeBytes(collected, totalLen);
69
+ const dataUri = `data:image/png;base64,${base64Encode(merged)}`;
70
+ const result = {
71
+ id: `${context.providerId}.${context.variantId}.${Date.now()}`,
72
+ timestamp: new Date(),
73
+ images: [dataUri],
74
+ metadata: { modelVersion: context.wireModelId, byteLength: totalLen }
75
+ };
76
+ const event = { kind: 'result', result };
77
+ // SAFETY: parseImageRequest above validated this exchange as image modality.
78
+ yield event;
79
+ return;
80
+ }
81
+ }
82
+ }
83
+ }
84
+ function mergeBytes(chunks, totalLen) {
85
+ const out = new Uint8Array(totalLen);
86
+ let offset = 0;
87
+ for (const c of chunks) {
88
+ out.set(c, offset);
89
+ offset += c.length;
90
+ }
91
+ return out;
92
+ }
93
+ function base64Encode(bytes) {
94
+ let binary = '';
95
+ for (let i = 0; i < bytes.length; i++)
96
+ binary += String.fromCharCode(bytes[i]);
97
+ return btoa(binary);
98
+ }
99
+ function parseImageRequest(request) {
100
+ const parsed = ImageGenerationRequestSchema.safeParse(request);
101
+ if (!parsed.success) {
102
+ throw new CapabilityError('MLX requires a valid image request.', 'INVALID_INPUT', {
103
+ reason: 'mlx-unsupported-request', retryable: false
104
+ });
105
+ }
106
+ return parsed.data;
107
+ }
108
+ export default MlxImageCliSpec;
109
+ //# sourceMappingURL=mlx-image-cli.spec.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mlx-image-cli.spec.impl.js","sourceRoot":"","sources":["../../../../src/ai/specs/mlx-image-cli/mlx-image-cli.spec.impl.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,sDAAsD,CAAC;AAEpG,OAAO,UAAU,MAAM,oCAAoC,CAAC;AAE5D,MAAM,OAAO,eAAe;IAClB,UAAU,GAAG,UAAU,CAAC;IAEjC,aAAa,CACZ,OAA6B,EAC7B,OAAwB;QAExB,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,IAAI,GAAa;YACtB,SAAS;YACT,OAAO,CAAC,WAAW,IAAI,KAAK;YAC5B,UAAU;YACV,KAAK,CAAC,MAAM;YACZ,SAAS;YACT,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC;YAC3B,UAAU;YACV,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;YAC5B,UAAU;YACV,cAAc;SACd,CAAC;QACF,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACzE,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAClC,OAAO;YACN,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE;YACX,IAAI,EAAE;gBACL,IAAI;gBACJ,WAAW,EAAE,CAAC,QAAQ,CAAC;aACvB;YACD,SAAS,EAAE,KAAK;SAChB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,cAAc,CACpB,MAAwC,EACxC,QAA8B,EAC9B,OAAwB;QAExB,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC5B,MAAM,SAAS,GAAiB,EAAE,CAAC;QACnC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC5B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;YAC/B,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACnC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC5C,OAAO;YACR,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBACjC,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACpB,MAAM;wBACL,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,IAAI,eAAe,CAAC,6CAA6C,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;qBAC1I,CAAC;oBACF,OAAO;gBACR,CAAC;gBACD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAC/C,MAAM,OAAO,GAAG,yBAAyB,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChE,MAAM,MAAM,GAA4B;oBACvC,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;oBAC9D,SAAS,EAAE,IAAI,IAAI,EAAE;oBACrB,MAAM,EAAE,CAAC,OAAO,CAAC;oBACjB,QAAQ,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE;iBACrE,CAAC;gBACF,MAAM,KAAK,GAA0B,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;gBAChE,6EAA6E;gBAC7E,MAAM,KAAwB,CAAC;gBAC/B,OAAO;YACR,CAAC;QACF,CAAC;IACF,CAAC;CACD;AAED,SAAS,UAAU,CAAC,MAAoB,EAAE,QAAgB;IACzD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACxB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACnB,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,KAAiB;IACtC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAoC;IAC9D,MAAM,MAAM,GAAG,4BAA4B,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,eAAe,CAAC,qCAAqC,EAAE,eAAe,EAAE;YACjF,MAAM,EAAE,yBAAyB,EAAE,SAAS,EAAE,KAAK;SACnD,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACpB,CAAC;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './ai/index.ts';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./ai/index.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,110 @@
1
1
  {
2
2
  "name": "@vibesdotdev/integrations-mlx",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0-rc.4",
4
+ "dependencies": {
5
+ "@vibesdotdev/ai": "^1.0.0-rc.0",
6
+ "@vibesdotdev/docs-contracts": "^1.0.0-rc.0",
7
+ "@vibesdotdev/kernel": "^1.0.0-rc.0",
8
+ "zod": "^4.6.7",
9
+ "@vibesdotdev/ai-schemas": "^1.0.0-rc.0"
10
+ },
11
+ "gitHead": "319e9e534fac11da0c374ab44efeed6c9722d3ec",
12
+ "_vibes_source": {
13
+ "repo": "ssh://git@git.vibes.dev/vibesdotdev/integrations.git",
14
+ "sha": "319e9e534fac11da0c374ab44efeed6c9722d3ec",
15
+ "workspaceDigest": "sha256:c4abb10120a3f46ab2b645a2e1156b23bb94b8d347e04b5fa7fefff9bb65a37b"
16
+ },
17
+ "main": "./dist/index.js",
18
+ "exports": {
19
+ ".": {
20
+ "bun": "./dist/index.js",
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js",
23
+ "default": "./dist/index.js"
24
+ },
25
+ "./ai": {
26
+ "bun": "./dist/ai/index.js",
27
+ "types": "./dist/ai/index.d.ts",
28
+ "import": "./dist/ai/index.js",
29
+ "default": "./dist/ai/index.js"
30
+ },
31
+ "./ai/*": {
32
+ "bun": "./dist/ai/*.js",
33
+ "types": "./dist/ai/*.d.ts",
34
+ "import": "./dist/ai/*.js",
35
+ "default": "./dist/ai/*.js"
36
+ },
37
+ "./ai/plugin": {
38
+ "bun": "./dist/ai/provider.plugin.js",
39
+ "types": "./dist/ai/provider.plugin.d.ts",
40
+ "import": "./dist/ai/provider.plugin.js",
41
+ "default": "./dist/ai/provider.plugin.js"
42
+ },
43
+ "./ai/consumer.plugin": {
44
+ "bun": "./dist/ai/provider.consumer.plugin.js",
45
+ "types": "./dist/ai/provider.consumer.plugin.d.ts",
46
+ "import": "./dist/ai/provider.consumer.plugin.js",
47
+ "default": "./dist/ai/provider.consumer.plugin.js"
48
+ }
49
+ },
50
+ "files": [
51
+ "dist",
52
+ "README.md",
53
+ "LICENSE",
54
+ "!**/.turbo/**",
55
+ "!**/.svelte-kit/**",
56
+ "!**/.vibes/**",
57
+ "!**/__tests__/**",
58
+ "!**/__stubs__/**",
59
+ "!**/*.test.js",
60
+ "!**/*.test.mjs",
61
+ "!**/*.test.cjs",
62
+ "!**/*.test.jsx",
63
+ "!**/*.test.ts",
64
+ "!**/*.test.mts",
65
+ "!**/*.test.cts",
66
+ "!**/*.test.tsx",
67
+ "!**/*.spec.js",
68
+ "!**/*.spec.mjs",
69
+ "!**/*.spec.cjs",
70
+ "!**/*.spec.jsx",
71
+ "!**/*.spec.ts",
72
+ "!**/*.spec.mts",
73
+ "!**/*.spec.cts",
74
+ "!**/*.spec.tsx",
75
+ "!**/SPEC.md",
76
+ "!**/tsconfig.json",
77
+ "!**/tsconfig.*.json",
78
+ "!**/*.tsbuildinfo",
79
+ "!**/.build-ok.json",
80
+ "!**/*.tgz"
81
+ ],
82
+ "scripts": {
83
+ "lint": "node ../../node_modules/@vibesdotdev/internal-oxlint-toolchain/ratchet.mjs .",
84
+ "check": "bun --bun tsc -p tsconfig.json --noEmit",
85
+ "test": "bun test src",
86
+ "build": "tsc -p tsconfig.build.json"
87
+ },
88
+ "repository": {
89
+ "type": "git",
90
+ "url": "ssh://git@git.vibes.dev/vibesdotdev/integrations.git",
91
+ "directory": "integrations/mlx"
92
+ },
93
+ "publishConfig": {
94
+ "registry": "https://packages.vibes.dev",
95
+ "access": "public"
96
+ },
97
+ "vibes": {
98
+ "visibility": "public",
99
+ "registry": {
100
+ "repositoryId": "70be51c9-5ab7-4d7e-9f47-801cb17720d8",
101
+ "directory": "integrations/mlx"
102
+ },
103
+ "compositionRoots": [
104
+ "src/ai/__tests__/runtime.ts"
105
+ ]
106
+ },
107
+ "type": "module",
108
+ "types": "./dist/index.d.ts",
109
+ "license": "BUSL-1.1"
110
+ }