@locusai/sdk 0.13.2 → 0.13.3

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.
@@ -558,6 +558,12 @@ var init_src = __esm(() => {
558
558
  });
559
559
 
560
560
  // src/core/config.ts
561
+ function isValidModelForProvider(provider, model) {
562
+ return PROVIDER_MODELS[provider].includes(model);
563
+ }
564
+ function getModelsForProvider(provider) {
565
+ return PROVIDER_MODELS[provider];
566
+ }
561
567
  function getLocusPath(projectPath, fileName) {
562
568
  return import_node_path.join(projectPath, LOCUS_CONFIG.dir, LOCUS_CONFIG[fileName]);
563
569
  }
@@ -565,16 +571,36 @@ function getAgentArtifactsPath(projectPath, agentId) {
565
571
  const shortId = agentId.slice(-8);
566
572
  return import_node_path.join(projectPath, LOCUS_CONFIG.dir, LOCUS_CONFIG.artifactsDir, shortId);
567
573
  }
568
- var import_node_path, PROVIDER, DEFAULT_MODEL, LOCUS_SCHEMA_BASE_URL = "https://locusai.dev/schemas", LOCUS_SCHEMAS, LOCUS_CONFIG, LOCUS_GITIGNORE_PATTERNS;
574
+ var import_node_path, PROVIDER, CLAUDE_MODELS, CODEX_MODELS, PROVIDER_MODELS, DEFAULT_MODEL, LOCUS_SCHEMA_BASE_URL = "https://locusai.dev/schemas", LOCUS_SCHEMAS, LOCUS_CONFIG, LOCUS_GITIGNORE_PATTERNS;
569
575
  var init_config = __esm(() => {
570
576
  import_node_path = require("node:path");
571
577
  PROVIDER = {
572
578
  CLAUDE: "claude",
573
579
  CODEX: "codex"
574
580
  };
581
+ CLAUDE_MODELS = {
582
+ OPUS: "opus",
583
+ SONNET: "sonnet",
584
+ HAIKU: "haiku",
585
+ OPUS_PLAN: "opusplan",
586
+ CLAUDE_OPUS_4_6: "claude-opus-4-6",
587
+ CLAUDE_SONNET_4_5: "claude-sonnet-4-5-20250929",
588
+ CLAUDE_SONNET_4_6: "claude-sonnet-4-6",
589
+ CLAUDE_HAIKU_4_5: "claude-haiku-4-5-20251001"
590
+ };
591
+ CODEX_MODELS = {
592
+ GPT_5_3_CODEX: "gpt-5.3-codex",
593
+ GPT_5_3_CODEX_SPARK: "gpt-5.3-codex-spark",
594
+ GPT_5_CODEX_MINI: "gpt-5-codex-mini",
595
+ GPT_5_2_CODEX: "gpt-5.2-codex"
596
+ };
597
+ PROVIDER_MODELS = {
598
+ [PROVIDER.CLAUDE]: Object.values(CLAUDE_MODELS),
599
+ [PROVIDER.CODEX]: Object.values(CODEX_MODELS)
600
+ };
575
601
  DEFAULT_MODEL = {
576
- [PROVIDER.CLAUDE]: "opus",
577
- [PROVIDER.CODEX]: "gpt-5.3-codex"
602
+ [PROVIDER.CLAUDE]: CLAUDE_MODELS.OPUS,
603
+ [PROVIDER.CODEX]: CODEX_MODELS.GPT_5_3_CODEX
578
604
  };
579
605
  LOCUS_SCHEMAS = {
580
606
  config: `${LOCUS_SCHEMA_BASE_URL}/config.schema.json`,
@@ -1558,6 +1584,10 @@ var init_codex_runner = __esm(() => {
1558
1584
  function createAiRunner(provider, config) {
1559
1585
  const resolvedProvider = provider ?? PROVIDER.CLAUDE;
1560
1586
  const model = config.model ?? DEFAULT_MODEL[resolvedProvider];
1587
+ if (!isValidModelForProvider(resolvedProvider, model)) {
1588
+ const validModels = getModelsForProvider(resolvedProvider);
1589
+ throw new Error(`Model "${model}" is not valid for provider "${resolvedProvider}". ` + `Valid models: ${validModels.join(", ")}`);
1590
+ }
1561
1591
  switch (resolvedProvider) {
1562
1592
  case PROVIDER.CODEX:
1563
1593
  return new CodexRunner(config.projectPath, model, config.log, config.reasoningEffort ?? "high", config.timeoutMs);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=factory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.test.d.ts","sourceRoot":"","sources":["../../../src/ai/__tests__/factory.test.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/ai/factory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,MAAM,KAAK,GAAG,CAClB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,KAC1C,IAAI,CAAC;AAEV,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,MAAM,EAAE,cAAc,GACrB,QAAQ,CAqBV"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/ai/factory.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,MAAM,KAAK,GAAG,CAClB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,KAC1C,IAAI,CAAC;AAEV,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,MAAM,EAAE,cAAc,GACrB,QAAQ,CA8BV"}
@@ -3,7 +3,29 @@ export declare const PROVIDER: {
3
3
  readonly CODEX: "codex";
4
4
  };
5
5
  export type Provider = (typeof PROVIDER)[keyof typeof PROVIDER];
6
- export declare const DEFAULT_MODEL: Record<Provider, string>;
6
+ export declare const CLAUDE_MODELS: {
7
+ readonly OPUS: "opus";
8
+ readonly SONNET: "sonnet";
9
+ readonly HAIKU: "haiku";
10
+ readonly OPUS_PLAN: "opusplan";
11
+ readonly CLAUDE_OPUS_4_6: "claude-opus-4-6";
12
+ readonly CLAUDE_SONNET_4_5: "claude-sonnet-4-5-20250929";
13
+ readonly CLAUDE_SONNET_4_6: "claude-sonnet-4-6";
14
+ readonly CLAUDE_HAIKU_4_5: "claude-haiku-4-5-20251001";
15
+ };
16
+ export type ClaudeModel = (typeof CLAUDE_MODELS)[keyof typeof CLAUDE_MODELS];
17
+ export declare const CODEX_MODELS: {
18
+ readonly GPT_5_3_CODEX: "gpt-5.3-codex";
19
+ readonly GPT_5_3_CODEX_SPARK: "gpt-5.3-codex-spark";
20
+ readonly GPT_5_CODEX_MINI: "gpt-5-codex-mini";
21
+ readonly GPT_5_2_CODEX: "gpt-5.2-codex";
22
+ };
23
+ export type CodexModel = (typeof CODEX_MODELS)[keyof typeof CODEX_MODELS];
24
+ export type ModelId = ClaudeModel | CodexModel;
25
+ export declare const PROVIDER_MODELS: Record<Provider, readonly ModelId[]>;
26
+ export declare const DEFAULT_MODEL: Record<Provider, ModelId>;
27
+ export declare function isValidModelForProvider(provider: Provider, model: string): boolean;
28
+ export declare function getModelsForProvider(provider: Provider): readonly ModelId[];
7
29
  export declare const LOCUS_SCHEMA_BASE_URL = "https://locusai.dev/schemas";
8
30
  export declare const LOCUS_SCHEMAS: {
9
31
  readonly config: "https://locusai.dev/schemas/config.schema.json";
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ;;;CAGX,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAEhE,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAGlD,CAAC;AAEF,eAAO,MAAM,qBAAqB,gCAAgC,CAAC;AAEnE,eAAO,MAAM,aAAa;;;CAGhB,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;;;;CAaxB,CAAC;AAIF,eAAO,MAAM,wBAAwB,gkBAqB3B,CAAC;AAEX,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,OAAO,YAAY,GAClC,MAAM,CAER;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,MAAM,CASR"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ;;;CAGX,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAEhE,eAAO,MAAM,aAAa;;;;;;;;;CAShB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAE7E,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AACX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE1E,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC;AAE/C,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAGvD,CAAC;AAEX,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,CAGnD,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAET;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,OAAO,EAAE,CAE3E;AAED,eAAO,MAAM,qBAAqB,gCAAgC,CAAC;AAEnE,eAAO,MAAM,aAAa;;;CAGhB,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;;;;CAaxB,CAAC;AAIF,eAAO,MAAM,wBAAwB,gkBAqB3B,CAAC;AAEX,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,OAAO,YAAY,GAClC,MAAM,CAER;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,MAAM,CASR"}
@@ -1,4 +1,4 @@
1
- export { DEFAULT_MODEL, getAgentArtifactsPath, getLocusPath, LOCUS_CONFIG, LOCUS_GITIGNORE_PATTERNS, LOCUS_SCHEMA_BASE_URL, LOCUS_SCHEMAS, PROVIDER, type Provider, } from "./config.js";
1
+ export { CLAUDE_MODELS, type ClaudeModel, CODEX_MODELS, type CodexModel, DEFAULT_MODEL, getAgentArtifactsPath, getLocusPath, getModelsForProvider, isValidModelForProvider, LOCUS_CONFIG, LOCUS_GITIGNORE_PATTERNS, LOCUS_SCHEMA_BASE_URL, LOCUS_SCHEMAS, type ModelId, PROVIDER, PROVIDER_MODELS, type Provider, } from "./config.js";
2
2
  export { type CodebaseIndex, CodebaseIndexer } from "./indexer.js";
3
3
  export { PromptBuilder } from "./prompt-builder.js";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,wBAAwB,EACxB,qBAAqB,EACrB,aAAa,EACb,QAAQ,EACR,KAAK,QAAQ,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,KAAK,WAAW,EAChB,YAAY,EACZ,KAAK,UAAU,EACf,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,oBAAoB,EACpB,uBAAuB,EACvB,YAAY,EACZ,wBAAwB,EACxB,qBAAqB,EACrB,aAAa,EACb,KAAK,OAAO,EACZ,QAAQ,EACR,eAAe,EACf,KAAK,QAAQ,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -558,6 +558,12 @@ var init_src = __esm(() => {
558
558
  });
559
559
 
560
560
  // src/core/config.ts
561
+ function isValidModelForProvider(provider, model) {
562
+ return PROVIDER_MODELS[provider].includes(model);
563
+ }
564
+ function getModelsForProvider(provider) {
565
+ return PROVIDER_MODELS[provider];
566
+ }
561
567
  function getLocusPath(projectPath, fileName) {
562
568
  return import_node_path.join(projectPath, LOCUS_CONFIG.dir, LOCUS_CONFIG[fileName]);
563
569
  }
@@ -565,16 +571,36 @@ function getAgentArtifactsPath(projectPath, agentId) {
565
571
  const shortId = agentId.slice(-8);
566
572
  return import_node_path.join(projectPath, LOCUS_CONFIG.dir, LOCUS_CONFIG.artifactsDir, shortId);
567
573
  }
568
- var import_node_path, PROVIDER, DEFAULT_MODEL, LOCUS_SCHEMA_BASE_URL = "https://locusai.dev/schemas", LOCUS_SCHEMAS, LOCUS_CONFIG, LOCUS_GITIGNORE_PATTERNS;
574
+ var import_node_path, PROVIDER, CLAUDE_MODELS, CODEX_MODELS, PROVIDER_MODELS, DEFAULT_MODEL, LOCUS_SCHEMA_BASE_URL = "https://locusai.dev/schemas", LOCUS_SCHEMAS, LOCUS_CONFIG, LOCUS_GITIGNORE_PATTERNS;
569
575
  var init_config = __esm(() => {
570
576
  import_node_path = require("node:path");
571
577
  PROVIDER = {
572
578
  CLAUDE: "claude",
573
579
  CODEX: "codex"
574
580
  };
581
+ CLAUDE_MODELS = {
582
+ OPUS: "opus",
583
+ SONNET: "sonnet",
584
+ HAIKU: "haiku",
585
+ OPUS_PLAN: "opusplan",
586
+ CLAUDE_OPUS_4_6: "claude-opus-4-6",
587
+ CLAUDE_SONNET_4_5: "claude-sonnet-4-5-20250929",
588
+ CLAUDE_SONNET_4_6: "claude-sonnet-4-6",
589
+ CLAUDE_HAIKU_4_5: "claude-haiku-4-5-20251001"
590
+ };
591
+ CODEX_MODELS = {
592
+ GPT_5_3_CODEX: "gpt-5.3-codex",
593
+ GPT_5_3_CODEX_SPARK: "gpt-5.3-codex-spark",
594
+ GPT_5_CODEX_MINI: "gpt-5-codex-mini",
595
+ GPT_5_2_CODEX: "gpt-5.2-codex"
596
+ };
597
+ PROVIDER_MODELS = {
598
+ [PROVIDER.CLAUDE]: Object.values(CLAUDE_MODELS),
599
+ [PROVIDER.CODEX]: Object.values(CODEX_MODELS)
600
+ };
575
601
  DEFAULT_MODEL = {
576
- [PROVIDER.CLAUDE]: "opus",
577
- [PROVIDER.CODEX]: "gpt-5.3-codex"
602
+ [PROVIDER.CLAUDE]: CLAUDE_MODELS.OPUS,
603
+ [PROVIDER.CODEX]: CODEX_MODELS.GPT_5_3_CODEX
578
604
  };
579
605
  LOCUS_SCHEMAS = {
580
606
  config: `${LOCUS_SCHEMA_BASE_URL}/config.schema.json`,
@@ -1558,6 +1584,10 @@ var init_codex_runner = __esm(() => {
1558
1584
  function createAiRunner(provider, config) {
1559
1585
  const resolvedProvider = provider ?? PROVIDER.CLAUDE;
1560
1586
  const model = config.model ?? DEFAULT_MODEL[resolvedProvider];
1587
+ if (!isValidModelForProvider(resolvedProvider, model)) {
1588
+ const validModels = getModelsForProvider(resolvedProvider);
1589
+ throw new Error(`Model "${model}" is not valid for provider "${resolvedProvider}". ` + `Valid models: ${validModels.join(", ")}`);
1590
+ }
1561
1591
  switch (resolvedProvider) {
1562
1592
  case PROVIDER.CODEX:
1563
1593
  return new CodexRunner(config.projectPath, model, config.log, config.reasoningEffort ?? "high", config.timeoutMs);
@@ -2746,7 +2776,9 @@ __export(exports_index_node, {
2746
2776
  plannedTasksToCreatePayloads: () => plannedTasksToCreatePayloads,
2747
2777
  parseSprintPlanFromAI: () => parseSprintPlanFromAI,
2748
2778
  parseJsonWithSchema: () => parseJsonWithSchema,
2779
+ isValidModelForProvider: () => isValidModelForProvider,
2749
2780
  getRemoteUrl: () => getRemoteUrl,
2781
+ getModelsForProvider: () => getModelsForProvider,
2750
2782
  getLocusPath: () => getLocusPath,
2751
2783
  getDefaultBranch: () => getDefaultBranch,
2752
2784
  getCurrentBranch: () => getCurrentBranch,
@@ -2767,6 +2799,7 @@ __export(exports_index_node, {
2767
2799
  PrService: () => PrService,
2768
2800
  PlanningMeeting: () => PlanningMeeting,
2769
2801
  PlanManager: () => PlanManager,
2802
+ PROVIDER_MODELS: () => PROVIDER_MODELS,
2770
2803
  PROVIDER: () => PROVIDER,
2771
2804
  OrganizationsModule: () => OrganizationsModule,
2772
2805
  LocusEvent: () => LocusEvent,
@@ -2796,6 +2829,8 @@ __export(exports_index_node, {
2796
2829
  CodebaseIndexer: () => CodebaseIndexer,
2797
2830
  ClaudeRunner: () => ClaudeRunner,
2798
2831
  CiModule: () => CiModule,
2832
+ CODEX_MODELS: () => CODEX_MODELS,
2833
+ CLAUDE_MODELS: () => CLAUDE_MODELS,
2799
2834
  AuthModule: () => AuthModule,
2800
2835
  AgentWorker: () => AgentWorker,
2801
2836
  AgentOrchestrator: () => AgentOrchestrator
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@locusai/sdk",
3
- "version": "0.13.2",
3
+ "version": "0.13.3",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -26,11 +26,12 @@
26
26
  "build": "bun build ./src/index.ts ./src/index-node.ts ./src/agent/worker.ts --outdir ./dist --target node --format cjs --external axios --external events --external globby --external @locusai/shared --external zod && tsc -p tsconfig.build.json --emitDeclarationOnly",
27
27
  "dev": "tsc --watch",
28
28
  "lint": "biome lint .",
29
+ "test": "bun test",
29
30
  "typecheck": "tsc --noEmit",
30
31
  "clean": "rm -rf node_modules"
31
32
  },
32
33
  "dependencies": {
33
- "@locusai/shared": "^0.13.2",
34
+ "@locusai/shared": "^0.13.3",
34
35
  "axios": "^1.13.2",
35
36
  "events": "^3.3.0",
36
37
  "globby": "^14.0.2",