← Files TokenXARCHIVED FILE

scripts/session-start.mjs

1.76 KB · Oct 2, 2026 · 00:29 UTC

↓ Download file

import {
  isStoredConfigError,
  loadConfig,
} from "./lib/config.mjs";
import { additionalContextResult } from "./lib/hook-io.mjs";
import { runHook } from "./lib/hook-runtime.mjs";
import {
  BUNDLED_MODEL_CATALOG,
  validateLiveConfiguredModels,
} from "./lib/model-catalog.mjs";
import { removeSessionState } from "./lib/state.mjs";

await runHook("SessionStart", async ({ input, pluginData, env }) => {
  try {
    if (input.source !== "compact") {
      await removeSessionState({
        pluginData,
        sessionId: input.session_id,
        includeModelPin:
          input.source === "startup" || input.source === "clear",
      });
    }
    let config;
    try {
      config = await loadConfig({ pluginData, env });
    } catch (error) {
      if (!isStoredConfigError(error)) {
        throw error;
      }
      await removeSessionState({
        pluginData,
        sessionId: input.session_id,
      });
      return additionalContextResult(
        "SessionStart",
        "TokenX: parent only; stored configuration is incompatible; run tokenx update.",
      );
    }
    let catalog;
    try {
      catalog = await validateLiveConfiguredModels(config, {
        homeDir: env.HOME,
      });
    } catch {
      return additionalContextResult(
        "SessionStart",
        "TokenX routing unavailable: configured Codex models could not be verified; parent stays in control.",
      );
    }
    if (catalog === BUNDLED_MODEL_CATALOG) {
      return additionalContextResult(
        "SessionStart",
        "TokenX: using bundled model catalog because the live Codex catalog is unavailable; run tokenx doctor.",
      );
    }
    return null;
  } catch (error) {
    await removeSessionState({
      pluginData,
      sessionId: input.session_id,
    });
    throw error;
  }
});

SHA-256: 91223d0e93eb5648f0e29f5af3023f19d8844b76b42fccaf2f71514c62d154ba