@agent-native/toolkit 0.16.0 → 0.16.2

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.
Files changed (33) hide show
  1. package/dist/composer/ComposerPlusMenu.d.ts.map +1 -1
  2. package/dist/composer/ComposerPlusMenu.js +29 -19
  3. package/dist/composer/ComposerPlusMenu.js.map +1 -1
  4. package/dist/composer/PromptComposer.d.ts +4 -0
  5. package/dist/composer/PromptComposer.d.ts.map +1 -1
  6. package/dist/composer/PromptComposer.js +2 -2
  7. package/dist/composer/PromptComposer.js.map +1 -1
  8. package/dist/composer/TiptapComposer.d.ts +12 -1
  9. package/dist/composer/TiptapComposer.d.ts.map +1 -1
  10. package/dist/composer/TiptapComposer.js +249 -162
  11. package/dist/composer/TiptapComposer.js.map +1 -1
  12. package/dist/composer/TiptapComposer.spec.js +33 -1
  13. package/dist/composer/TiptapComposer.spec.js.map +1 -1
  14. package/dist/composer/index.d.ts +1 -0
  15. package/dist/composer/index.d.ts.map +1 -1
  16. package/dist/composer/index.js +1 -0
  17. package/dist/composer/index.js.map +1 -1
  18. package/dist/composer/model-selection.d.ts +12 -0
  19. package/dist/composer/model-selection.d.ts.map +1 -0
  20. package/dist/composer/model-selection.js +31 -0
  21. package/dist/composer/model-selection.js.map +1 -0
  22. package/dist/composer/model-selection.spec.d.ts +2 -0
  23. package/dist/composer/model-selection.spec.d.ts.map +1 -0
  24. package/dist/composer/model-selection.spec.js +38 -0
  25. package/dist/composer/model-selection.spec.js.map +1 -0
  26. package/package.json +1 -1
  27. package/src/composer/ComposerPlusMenu.tsx +122 -65
  28. package/src/composer/PromptComposer.tsx +8 -0
  29. package/src/composer/TiptapComposer.spec.ts +46 -0
  30. package/src/composer/TiptapComposer.tsx +678 -412
  31. package/src/composer/index.ts +6 -0
  32. package/src/composer/model-selection.spec.ts +45 -0
  33. package/src/composer/model-selection.ts +51 -0
@@ -17,6 +17,12 @@ export {
17
17
  type TiptapComposerProps,
18
18
  type TiptapComposerSubmitOptions,
19
19
  } from "./TiptapComposer.js";
20
+ export {
21
+ isClaudeCodeAgentId,
22
+ isLunaModel,
23
+ resolvePreferredAgentModel,
24
+ type ComposerModelGroupLike,
25
+ } from "./model-selection.js";
20
26
  export {
21
27
  PromptComposer,
22
28
  type PromptComposerProps,
@@ -0,0 +1,45 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import {
4
+ isClaudeCodeAgentId,
5
+ isLunaModel,
6
+ resolvePreferredAgentModel,
7
+ } from "./model-selection.js";
8
+
9
+ describe("composer agent model defaults", () => {
10
+ const groups = [
11
+ {
12
+ engine: "builder",
13
+ models: ["gpt-5-6-luna"],
14
+ configured: true,
15
+ },
16
+ {
17
+ engine: "builder",
18
+ models: ["claude-sonnet-5"],
19
+ configured: true,
20
+ },
21
+ ];
22
+
23
+ it("identifies Claude Code and Luna model ids", () => {
24
+ expect(isClaudeCodeAgentId("claude-code")).toBe(true);
25
+ expect(isClaudeCodeAgentId("claude-cli")).toBe(true);
26
+ expect(isClaudeCodeAgentId("codex")).toBe(false);
27
+ expect(isLunaModel("gpt-5.6-luna")).toBe(true);
28
+ expect(isLunaModel("openai/gpt-5.6-sol")).toBe(false);
29
+ });
30
+
31
+ it("defaults Claude Code to Sonnet and other agents to Luna", () => {
32
+ expect(resolvePreferredAgentModel("claude-code", groups)).toEqual({
33
+ engine: "builder",
34
+ model: "claude-sonnet-5",
35
+ });
36
+ expect(resolvePreferredAgentModel("codex", groups)).toEqual({
37
+ engine: "builder",
38
+ model: "gpt-5-6-luna",
39
+ });
40
+ expect(resolvePreferredAgentModel(undefined, groups)).toEqual({
41
+ engine: "builder",
42
+ model: "gpt-5-6-luna",
43
+ });
44
+ });
45
+ });
@@ -0,0 +1,51 @@
1
+ export interface ComposerModelGroupLike {
2
+ engine: string;
3
+ models: readonly string[];
4
+ configured?: boolean;
5
+ }
6
+
7
+ export function isClaudeCodeAgentId(agentId: string | undefined): boolean {
8
+ return agentId === "claude-code" || agentId === "claude-cli";
9
+ }
10
+
11
+ export function isLunaModel(model: string): boolean {
12
+ return model.toLowerCase().includes("luna");
13
+ }
14
+
15
+ export function resolvePreferredAgentModel(
16
+ agentId: string | undefined,
17
+ groups: readonly ComposerModelGroupLike[],
18
+ ): { model: string; engine: string } | undefined {
19
+ const candidates = groups.flatMap((group) =>
20
+ group.models
21
+ .filter((model) => model !== "auto")
22
+ .map((model) => ({
23
+ model,
24
+ engine: group.engine,
25
+ configured: group.configured !== false,
26
+ })),
27
+ );
28
+ const orderedCandidates = [
29
+ ...candidates.filter((candidate) => candidate.configured),
30
+ ...candidates.filter((candidate) => !candidate.configured),
31
+ ];
32
+
33
+ if (isClaudeCodeAgentId(agentId)) {
34
+ const preferred =
35
+ orderedCandidates.find(
36
+ (candidate) =>
37
+ candidate.model.toLowerCase().includes("sonnet") &&
38
+ !isLunaModel(candidate.model),
39
+ ) ?? orderedCandidates.find((candidate) => !isLunaModel(candidate.model));
40
+ return preferred
41
+ ? { model: preferred.model, engine: preferred.engine }
42
+ : undefined;
43
+ }
44
+
45
+ const preferred = orderedCandidates.find((candidate) =>
46
+ isLunaModel(candidate.model),
47
+ );
48
+ return preferred
49
+ ? { model: preferred.model, engine: preferred.engine }
50
+ : undefined;
51
+ }