API reference
Import types from @logit/core for editor help. These are the shapes as of the
current release.
Manifest
type PluginManifest = {
id: string;
family: "exercise-pack" | "progression-algorithm" | "mobility-progression"
| "mobility-pack" | "muscle-group-insight" | "analytics"
| "nutrition-algorithm" | "nutrition-analytics" | "widget";
name: string;
description: string;
version: string; // semver, bump every change
author?: string;
integrity?: string; // sha256-<base64> of the artifact — required to publish
minAppVersion?: string;
homepageUrl?: string;
distribution:
| { origin: "url"; manifestUrl: string; bundleUrl: string }
| { origin: "inline"; data: unknown }; // exercise-pack only
capabilities: Array<{ family: string /* = manifest.family */; [idField]: string /* = manifest.id */ }>;
}; Capability id field by family: exercisePackId, mobilityPackId, algorithmId (progression, mobility-progression, muscle-group-insight & nutrition), analyticsId (analytics & nutrition-analytics), widgetId.
Bundle descriptor
Every code bundle exports this:
export const pluginBundle = {
formatVersion: 1,
pluginId: string, // = manifest.id
family: string, // = manifest.family
entryExport: string, // name of the export below, e.g. "algorithm"
} as const; A bundle is one file, no import statements — build with esbuild --bundle --format=esm.
Entry exports
| Family | Export shape |
|---|---|
progression-algorithm | { id, name, description, defaultState, defaultPreferences?, preferencesSchema?, suggest(input) } |
mobility-progression | { id, name, description, defaultState, defaultPreferences?, preferencesSchema?, suggest(input) } |
muscle-group-insight | { id, name, description, defaultState, defaultPreferences?, preferencesSchema?, analyze(input) } |
analytics | { id, name, description, metricDefinitions, compute(input) } |
nutrition-algorithm | { id, name, description, defaultPreferences?, preferencesSchema?, computeTargets(input) } |
nutrition-analytics | { id, name, description, metricDefinitions, compute(input) } |
widget | { id, name, description, needs: string[], compute(input) } |
Input / output types
- Progression —
@logit/core/domain/progression:ProgressionInput,ProgressionOutput - Mobility progression —
@logit/core/domain/mobilityProgression:MobilityProgressionInput,MobilityProgressionOutput - Muscle group insight —
@logit/core/domain/muscleGroupInsight:MuscleGroupInsightInput,MuscleGroupInsightOutput - Analytics —
@logit/core/domain/analytics:AnalyticsInput,AnalyticsOutput - Nutrition algorithm —
@logit/core/domain/nutritionAlgorithm - Nutrition analytics —
@logit/core/domain/nutritionAnalytics - Widget —
@logit/core/plugins/widgetView:WidgetInput,WidgetView,WidgetNode,WidgetAction - Reasoning —
@logit/core/domain/reasoning:Reasoning,ReasoningConfidence— the optional “show your work” shape a progression algorithm can attach (required for muscle group insight); see progression algorithms.
Sandbox limits
- ~300 ms wall-clock deadline per call
- 32 MB memory
- no DOM /
fetch/ storage / timers - fresh VM per call — persist nothing in module scope
- input and output must be JSON-serialisable