LogIt

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

FamilyExport 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