@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.
- package/LICENSE +126 -0
- package/README.md +20 -2
- package/dist/ai/index.d.ts +5 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +5 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/provider.consumer.plugin.d.ts +6 -0
- package/dist/ai/provider.consumer.plugin.d.ts.map +1 -0
- package/dist/ai/provider.consumer.plugin.js +96 -0
- package/dist/ai/provider.consumer.plugin.js.map +1 -0
- package/dist/ai/provider.plugin.d.ts +2 -0
- package/dist/ai/provider.plugin.d.ts.map +1 -0
- package/dist/ai/provider.plugin.js +2 -0
- package/dist/ai/provider.plugin.js.map +1 -0
- package/dist/ai/providers/local/image/mlx/config/config.mlx.descriptor.d.ts +4206 -0
- package/dist/ai/providers/local/image/mlx/config/config.mlx.descriptor.d.ts.map +1 -0
- package/dist/ai/providers/local/image/mlx/config/config.mlx.descriptor.js +53 -0
- package/dist/ai/providers/local/image/mlx/config/config.mlx.descriptor.js.map +1 -0
- package/dist/ai/providers/local/image/mlx/config/schemas/index.d.ts +21 -0
- package/dist/ai/providers/local/image/mlx/config/schemas/index.d.ts.map +1 -0
- package/dist/ai/providers/local/image/mlx/config/schemas/index.js +11 -0
- package/dist/ai/providers/local/image/mlx/config/schemas/index.js.map +1 -0
- package/dist/ai/providers/local/image/mlx/index.d.ts +5 -0
- package/dist/ai/providers/local/image/mlx/index.d.ts.map +1 -0
- package/dist/ai/providers/local/image/mlx/index.js +4 -0
- package/dist/ai/providers/local/image/mlx/index.js.map +1 -0
- package/dist/ai/providers/local/image/mlx/provider.mlx.descriptor.d.ts +183 -0
- package/dist/ai/providers/local/image/mlx/provider.mlx.descriptor.d.ts.map +1 -0
- package/dist/ai/providers/local/image/mlx/provider.mlx.descriptor.js +55 -0
- package/dist/ai/providers/local/image/mlx/provider.mlx.descriptor.js.map +1 -0
- package/dist/ai/providers/mlx/detection/mlx-system-detection.impl.consumer.d.ts +14 -0
- package/dist/ai/providers/mlx/detection/mlx-system-detection.impl.consumer.d.ts.map +1 -0
- package/dist/ai/providers/mlx/detection/mlx-system-detection.impl.consumer.js +33 -0
- package/dist/ai/providers/mlx/detection/mlx-system-detection.impl.consumer.js.map +1 -0
- package/dist/ai/providers/mlx/docs/ai.providers.mlx.docs.descriptor.d.ts +4 -0
- package/dist/ai/providers/mlx/docs/ai.providers.mlx.docs.descriptor.d.ts.map +1 -0
- package/dist/ai/providers/mlx/docs/ai.providers.mlx.docs.descriptor.js +25 -0
- package/dist/ai/providers/mlx/docs/ai.providers.mlx.docs.descriptor.js.map +1 -0
- package/dist/ai/providers/mlx/index.d.ts +5 -0
- package/dist/ai/providers/mlx/index.d.ts.map +1 -0
- package/dist/ai/providers/mlx/index.js +5 -0
- package/dist/ai/providers/mlx/index.js.map +1 -0
- package/dist/ai/providers/mlx/mlx.provider.impl.consumer.d.ts +29 -0
- package/dist/ai/providers/mlx/mlx.provider.impl.consumer.d.ts.map +1 -0
- package/dist/ai/providers/mlx/mlx.provider.impl.consumer.js +114 -0
- package/dist/ai/providers/mlx/mlx.provider.impl.consumer.js.map +1 -0
- package/dist/ai/providers/mlx/process.consumer.d.ts +7 -0
- package/dist/ai/providers/mlx/process.consumer.d.ts.map +1 -0
- package/dist/ai/providers/mlx/process.consumer.js +22 -0
- package/dist/ai/providers/mlx/process.consumer.js.map +1 -0
- package/dist/ai/providers/mlx/recommendations.d.ts +21 -0
- package/dist/ai/providers/mlx/recommendations.d.ts.map +1 -0
- package/dist/ai/providers/mlx/recommendations.js +58 -0
- package/dist/ai/providers/mlx/recommendations.js.map +1 -0
- package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.descriptor.d.ts +36 -0
- package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.descriptor.d.ts.map +1 -0
- package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.descriptor.js +33 -0
- package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.descriptor.js.map +1 -0
- package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.impl.d.ts +41 -0
- package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.impl.d.ts.map +1 -0
- package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.impl.js +109 -0
- package/dist/ai/specs/mlx-image-cli/mlx-image-cli.spec.impl.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- 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":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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": "
|
|
4
|
-
"
|
|
5
|
-
|
|
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
|
+
}
|