{"version":3,"sources":["../src/cli/commands/model-defaults/set.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport ora from \"ora\";\n\nimport {\n  type ModelDefaultScopeType,\n  ModelDefaultsApiService,\n} from \"@/client-sdk/services/model-defaults/model-defaults-api.service\";\n\nimport { checkApiKey } from \"../../utils/apiKey\";\nimport { failSpinner } from \"../../utils/spinnerError\";\n\ntype ScopeKind = \"project\" | \"team\" | \"organization\";\n\nexport interface SetModelDefaultOptions {\n  scope?: ScopeKind;\n  scopeId?: string;\n  format?: string;\n}\n\nfunction resolveScope(\n  options: SetModelDefaultOptions,\n  snapshotScope: {\n    projectId: string;\n    teamId: string | null;\n    organizationId: string | null;\n  },\n): { scopeType: ModelDefaultScopeType; scopeId: string } {\n  const kind: ScopeKind = options.scope ?? \"project\";\n\n  if (options.scopeId) {\n    return { scopeType: kind.toUpperCase() as ModelDefaultScopeType, scopeId: options.scopeId };\n  }\n\n  if (kind === \"project\") {\n    return { scopeType: \"PROJECT\", scopeId: snapshotScope.projectId };\n  }\n  if (kind === \"team\") {\n    if (!snapshotScope.teamId) {\n      throw new Error(\n        \"No team scope available for this API key. Pass --scope-id <teamId> explicitly.\",\n      );\n    }\n    return { scopeType: \"TEAM\", scopeId: snapshotScope.teamId };\n  }\n  if (!snapshotScope.organizationId) {\n    throw new Error(\n      \"No organization scope available for this API key. Pass --scope-id <organizationId> explicitly.\",\n    );\n  }\n  return { scopeType: \"ORGANIZATION\", scopeId: snapshotScope.organizationId };\n}\n\n/**\n * Set a default model at the chosen scope. Read-modify-write: looks up\n * the existing config attached to the target scope and merges the new\n * key, or creates a new config when nothing is attached. Mirrors the\n * server-side `setRoleAtScope` upsert so CLI and UI converge on the\n * same single-config-per-scope shape.\n */\nexport const setModelDefaultCommand = async (\n  key: string,\n  model: string,\n  options: SetModelDefaultOptions,\n): Promise<void> => {\n  checkApiKey();\n\n  const service = new ModelDefaultsApiService();\n  const spinner = ora(\n    `Setting ${chalk.cyan(key)} → ${chalk.green(model)}...`,\n  ).start();\n\n  try {\n    const snapshot = await service.getSnapshot();\n    const target = resolveScope(options, snapshot.scope);\n\n    const existing = snapshot.configs\n      .filter((c) =>\n        c.scopes.some(\n          (s) => s.type === target.scopeType && s.id === target.scopeId,\n        ),\n      )\n      .sort((a, b) => (a.createdAt > b.createdAt ? -1 : 1));\n\n    const current = existing[0];\n    if (current) {\n      const nextPayload: Record<string, string> = {\n        ...current.config,\n        [key]: model,\n      };\n      await service.updateConfig(current.id, { config: nextPayload });\n      spinner.succeed(\n        `Updated config ${chalk.green(current.id)} at ${target.scopeType.toLowerCase()}:${target.scopeId}`,\n      );\n      if (options.format === \"json\") {\n        console.log(\n          JSON.stringify(\n            { id: current.id, key, model, scope: target, created: false },\n            null,\n            2,\n          ),\n        );\n      }\n      return;\n    }\n\n    const created = await service.createConfig({\n      config: { [key]: model },\n      scopes: [target],\n    });\n    spinner.succeed(\n      `Created config ${chalk.green(created.id)} at ${target.scopeType.toLowerCase()}:${target.scopeId}`,\n    );\n    if (options.format === \"json\") {\n      console.log(\n        JSON.stringify(\n          { id: created.id, key, model, scope: target, created: true },\n          null,\n          2,\n        ),\n      );\n    }\n  } catch (error) {\n    failSpinner({ spinner, error, action: \"set default model\" });\n    process.exit(1);\n  }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,OAAO,WAAW;AAClB,OAAO,SAAS;AAkBhB,SAAS,aACP,SACA,eAKuD;AA1BzD;AA2BE,QAAM,QAAkB,aAAQ,UAAR,YAAiB;AAEzC,MAAI,QAAQ,SAAS;AACnB,WAAO,EAAE,WAAW,KAAK,YAAY,GAA4B,SAAS,QAAQ,QAAQ;AAAA,EAC5F;AAEA,MAAI,SAAS,WAAW;AACtB,WAAO,EAAE,WAAW,WAAW,SAAS,cAAc,UAAU;AAAA,EAClE;AACA,MAAI,SAAS,QAAQ;AACnB,QAAI,CAAC,cAAc,QAAQ;AACzB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,WAAW,QAAQ,SAAS,cAAc,OAAO;AAAA,EAC5D;AACA,MAAI,CAAC,cAAc,gBAAgB;AACjC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,WAAW,gBAAgB,SAAS,cAAc,eAAe;AAC5E;AASO,IAAM,yBAAyB,OACpC,KACA,OACA,YACkB;AAClB,cAAY;AAEZ,QAAM,UAAU,IAAI,wBAAwB;AAC5C,QAAM,UAAU;AAAA,IACd,WAAW,MAAM,KAAK,GAAG,CAAC,WAAM,MAAM,MAAM,KAAK,CAAC;AAAA,EACpD,EAAE,MAAM;AAER,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,YAAY;AAC3C,UAAM,SAAS,aAAa,SAAS,SAAS,KAAK;AAEnD,UAAM,WAAW,SAAS,QACvB;AAAA,MAAO,CAAC,MACP,EAAE,OAAO;AAAA,QACP,CAAC,MAAM,EAAE,SAAS,OAAO,aAAa,EAAE,OAAO,OAAO;AAAA,MACxD;AAAA,IACF,EACC,KAAK,CAAC,GAAG,MAAO,EAAE,YAAY,EAAE,YAAY,KAAK,CAAE;AAEtD,UAAM,UAAU,SAAS,CAAC;AAC1B,QAAI,SAAS;AACX,YAAM,cAAsC,iCACvC,QAAQ,SAD+B;AAAA,QAE1C,CAAC,GAAG,GAAG;AAAA,MACT;AACA,YAAM,QAAQ,aAAa,QAAQ,IAAI,EAAE,QAAQ,YAAY,CAAC;AAC9D,cAAQ;AAAA,QACN,kBAAkB,MAAM,MAAM,QAAQ,EAAE,CAAC,OAAO,OAAO,UAAU,YAAY,CAAC,IAAI,OAAO,OAAO;AAAA,MAClG;AACA,UAAI,QAAQ,WAAW,QAAQ;AAC7B,gBAAQ;AAAA,UACN,KAAK;AAAA,YACH,EAAE,IAAI,QAAQ,IAAI,KAAK,OAAO,OAAO,QAAQ,SAAS,MAAM;AAAA,YAC5D;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,QAAQ,aAAa;AAAA,MACzC,QAAQ,EAAE,CAAC,GAAG,GAAG,MAAM;AAAA,MACvB,QAAQ,CAAC,MAAM;AAAA,IACjB,CAAC;AACD,YAAQ;AAAA,MACN,kBAAkB,MAAM,MAAM,QAAQ,EAAE,CAAC,OAAO,OAAO,UAAU,YAAY,CAAC,IAAI,OAAO,OAAO;AAAA,IAClG;AACA,QAAI,QAAQ,WAAW,QAAQ;AAC7B,cAAQ;AAAA,QACN,KAAK;AAAA,UACH,EAAE,IAAI,QAAQ,IAAI,KAAK,OAAO,OAAO,QAAQ,SAAS,KAAK;AAAA,UAC3D;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,gBAAY,EAAE,SAAS,OAAO,QAAQ,oBAAoB,CAAC;AAC3D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;","names":[]}