@agent-native/core 0.119.4 → 0.119.5
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.
- package/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +8 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/engine/index.ts +2 -0
- package/corpus/core/src/agent/engine/registry.ts +95 -2
- package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +8 -0
- package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +5 -1
- package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +9 -1
- package/corpus/templates/slides/actions/patch-deck.ts +2 -1
- package/corpus/templates/slides/changelog/2026-07-23-opening-or-refining-a-deck-no-longer-crashes-with-a-blank-er.md +6 -0
- package/corpus/templates/slides/shared/aspect-ratios.ts +4 -1
- package/corpus/templates/tasks/.oxfmtrc.json +8 -0
- package/corpus/templates/tasks/AGENTS.md +34 -41
- package/corpus/templates/tasks/README.md +13 -6
- package/corpus/templates/tasks/actions/bulk-delete-inbox-items.ts +10 -8
- package/corpus/templates/tasks/actions/bulk-delete-tasks.ts +10 -8
- package/corpus/templates/tasks/actions/bulk-mark-inbox-items-ready.ts +1 -1
- package/corpus/templates/tasks/actions/bulk-update-tasks.ts +12 -10
- package/corpus/templates/tasks/actions/create-inbox-item.ts +7 -4
- package/corpus/templates/tasks/actions/create-task.ts +2 -1
- package/corpus/templates/tasks/actions/delete-inbox-item.ts +6 -4
- package/corpus/templates/tasks/actions/delete-task.ts +1 -1
- package/corpus/templates/tasks/actions/list-inbox-items.ts +4 -2
- package/corpus/templates/tasks/actions/list-visible-task-fields.ts +3 -1
- package/corpus/templates/tasks/actions/mark-inbox-item-ready.ts +6 -4
- package/corpus/templates/tasks/actions/navigate.ts +16 -14
- package/corpus/templates/tasks/actions/reorder-inbox-items.ts +9 -7
- package/corpus/templates/tasks/actions/update-inbox-item.ts +6 -4
- package/corpus/templates/tasks/actions/update-task.ts +12 -9
- package/corpus/templates/tasks/actions/update-visible-task-fields.ts +10 -8
- package/corpus/templates/tasks/actions/view-screen.ts +1 -1
- package/corpus/templates/tasks/app/components/tasks/fields/TaskFieldsSidebar.tsx +15 -0
- package/corpus/templates/tasks/changelog/2026-07-23-task-detail-extensions.md +6 -0
- package/corpus/templates/tasks/drizzle.config.ts +3 -0
- package/corpus/templates/tasks/package.json +4 -1
- package/corpus/templates/tasks/server/db/schema.ts +0 -10
- package/corpus/templates/tasks/server/db/test-tasks-table.ts +0 -5
- package/corpus/templates/tasks/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/tasks/server/plugins/db.ts +43 -10
- package/corpus/templates/tasks/server/user-config/store.ts +42 -81
- package/corpus/templates/tasks/tsconfig.json +1 -2
- package/corpus/templates/tasks/vitest.config.ts +10 -1
- package/dist/agent/engine/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +32 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +75 -3
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +8 -2
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js +5 -2
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.d.ts.map +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js +9 -2
- package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/package.json +1 -1
- package/src/agent/engine/index.ts +2 -0
- package/src/agent/engine/registry.ts +95 -2
- package/src/scripts/agent-engines/list-agent-engines.ts +8 -0
- package/src/scripts/agent-engines/manage-agent-engine.ts +5 -1
- package/src/scripts/agent-engines/set-agent-engine.ts +9 -1
- package/corpus/templates/tasks/.prettierrc +0 -5
|
@@ -5,12 +5,14 @@ import { z } from "zod";
|
|
|
5
5
|
import { markInboxItemReady, requireUserEmail } from "../server/inbox/store.js";
|
|
6
6
|
import type { Task } from "../server/tasks/store.js";
|
|
7
7
|
|
|
8
|
+
export const markInboxItemReadySchema = z.object({
|
|
9
|
+
inboxItemId: z.string().describe("Inbox item id"),
|
|
10
|
+
});
|
|
11
|
+
|
|
8
12
|
export default defineAction({
|
|
9
13
|
description:
|
|
10
|
-
"
|
|
11
|
-
schema:
|
|
12
|
-
inboxItemId: z.string().describe("Inbox item id"),
|
|
13
|
-
}),
|
|
14
|
+
"Promote one inbox item to an incomplete task, preserving its id. Use bulk-mark-inbox-items-ready for multiple items.",
|
|
15
|
+
schema: markInboxItemReadySchema,
|
|
14
16
|
run: async (args, ctx) => {
|
|
15
17
|
const ownerEmail = requireUserEmail(ctx?.userEmail);
|
|
16
18
|
return markInboxItemReady({ ownerEmail, id: args.inboxItemId });
|
|
@@ -21,22 +21,24 @@ import { optionalBooleanQueryParam } from "./lib/boolean-query-param.js";
|
|
|
21
21
|
|
|
22
22
|
const viewSchema = z.enum(NAV_VIEW_INPUTS);
|
|
23
23
|
|
|
24
|
+
export const navigateSchema = z.object({
|
|
25
|
+
view: viewSchema.describe(
|
|
26
|
+
"View name to navigate to; home and ask are aliases for tasks",
|
|
27
|
+
),
|
|
28
|
+
taskId: z.string().optional().describe("Selected task id on /tasks"),
|
|
29
|
+
fieldId: z
|
|
30
|
+
.string()
|
|
31
|
+
.optional()
|
|
32
|
+
.describe("Selected custom field id on /fields"),
|
|
33
|
+
includeDone: optionalBooleanQueryParam().describe(
|
|
34
|
+
"When true, show completed tasks on /tasks",
|
|
35
|
+
),
|
|
36
|
+
});
|
|
37
|
+
|
|
24
38
|
export default defineAction({
|
|
25
39
|
description:
|
|
26
|
-
"Navigate the UI to a
|
|
27
|
-
schema:
|
|
28
|
-
view: viewSchema.describe(
|
|
29
|
-
"View name to navigate to; home and ask are aliases for tasks",
|
|
30
|
-
),
|
|
31
|
-
taskId: z.string().optional().describe("Selected task id on /tasks"),
|
|
32
|
-
fieldId: z
|
|
33
|
-
.string()
|
|
34
|
-
.optional()
|
|
35
|
-
.describe("Selected custom field id on /fields"),
|
|
36
|
-
includeDone: optionalBooleanQueryParam().describe(
|
|
37
|
-
"When true, show completed tasks on /tasks",
|
|
38
|
-
),
|
|
39
|
-
}),
|
|
40
|
+
"Navigate the Tasks UI to a view, optionally selecting a task or custom field.",
|
|
41
|
+
schema: navigateSchema,
|
|
40
42
|
http: false,
|
|
41
43
|
run: async (args) => {
|
|
42
44
|
const view = resolveNavView(args.view);
|
|
@@ -4,16 +4,18 @@ import { z } from "zod";
|
|
|
4
4
|
import { reorderInboxItems, requireUserEmail } from "../server/inbox/store.js";
|
|
5
5
|
import { BULK_ID_LIMIT } from "../shared/bulk-limits.js";
|
|
6
6
|
|
|
7
|
+
export const reorderInboxItemsSchema = z.object({
|
|
8
|
+
inboxItemIds: z
|
|
9
|
+
.array(z.string())
|
|
10
|
+
.min(1)
|
|
11
|
+
.max(BULK_ID_LIMIT)
|
|
12
|
+
.describe("Inbox item ids in the desired order from top to bottom."),
|
|
13
|
+
});
|
|
14
|
+
|
|
7
15
|
export default defineAction({
|
|
8
16
|
description:
|
|
9
17
|
"Reorder the inbox list by passing inbox item ids top-to-bottom.",
|
|
10
|
-
schema:
|
|
11
|
-
inboxItemIds: z
|
|
12
|
-
.array(z.string())
|
|
13
|
-
.min(1)
|
|
14
|
-
.max(BULK_ID_LIMIT)
|
|
15
|
-
.describe("Inbox item ids in the desired order from top to bottom."),
|
|
16
|
-
}),
|
|
18
|
+
schema: reorderInboxItemsSchema,
|
|
17
19
|
run: async (args, ctx) => {
|
|
18
20
|
const ownerEmail = requireUserEmail(ctx?.userEmail);
|
|
19
21
|
return reorderInboxItems({
|
|
@@ -4,12 +4,14 @@ import { z } from "zod";
|
|
|
4
4
|
import { UserInputError } from "../server/errors.js";
|
|
5
5
|
import { requireUserEmail, updateInboxItem } from "../server/inbox/store.js";
|
|
6
6
|
|
|
7
|
+
export const updateInboxItemSchema = z.object({
|
|
8
|
+
inboxItemId: z.string().describe("Inbox item id"),
|
|
9
|
+
title: z.string().min(1).optional().describe("New inbox item title"),
|
|
10
|
+
});
|
|
11
|
+
|
|
7
12
|
export default defineAction({
|
|
8
13
|
description: "Update an inbox item title.",
|
|
9
|
-
schema:
|
|
10
|
-
inboxItemId: z.string().describe("Inbox item id"),
|
|
11
|
-
title: z.string().min(1).optional().describe("New inbox item title"),
|
|
12
|
-
}),
|
|
14
|
+
schema: updateInboxItemSchema,
|
|
13
15
|
run: async (args, ctx) => {
|
|
14
16
|
const ownerEmail = requireUserEmail(ctx?.userEmail);
|
|
15
17
|
if (args.title === undefined) {
|
|
@@ -25,16 +25,19 @@ const fieldValuesSchema: z.ZodType<FieldValuePatch[]> = z.preprocess(
|
|
|
25
25
|
z.array(fieldValuePatchSchema),
|
|
26
26
|
);
|
|
27
27
|
|
|
28
|
+
export const updateTaskSchema = z.object({
|
|
29
|
+
taskId: z.string().describe("Task id"),
|
|
30
|
+
title: z.string().min(1).optional().describe("New task title"),
|
|
31
|
+
done: z.boolean().optional().describe("Completion state"),
|
|
32
|
+
fieldValues: fieldValuesSchema
|
|
33
|
+
.optional()
|
|
34
|
+
.describe("Custom field values to set or clear for this task"),
|
|
35
|
+
});
|
|
36
|
+
|
|
28
37
|
export default defineAction({
|
|
29
|
-
description:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
title: z.string().min(1).optional().describe("New task title"),
|
|
33
|
-
done: z.boolean().optional().describe("Completion state"),
|
|
34
|
-
fieldValues: fieldValuesSchema
|
|
35
|
-
.optional()
|
|
36
|
-
.describe("Custom field values to set or clear for this task"),
|
|
37
|
-
}),
|
|
38
|
+
description:
|
|
39
|
+
"Update one task's title, completion state, and/or custom fields. Use bulk-update-tasks to apply the same title or completion state to multiple tasks.",
|
|
40
|
+
schema: updateTaskSchema,
|
|
38
41
|
run: async (args, ctx) => {
|
|
39
42
|
const ownerEmail = requireUserEmail(ctx?.userEmail);
|
|
40
43
|
if (
|
|
@@ -5,17 +5,19 @@ import { requireUserEmail } from "../server/custom-fields/store.js";
|
|
|
5
5
|
import { setTaskCardFieldIds } from "../server/user-config/store.js";
|
|
6
6
|
import { TASK_CARD_FIELD_LIMIT } from "../shared/visible-task-fields.js";
|
|
7
7
|
|
|
8
|
+
export const updateVisibleTaskFieldsSchema = z.object({
|
|
9
|
+
fieldIds: z
|
|
10
|
+
.array(z.string())
|
|
11
|
+
.max(TASK_CARD_FIELD_LIMIT)
|
|
12
|
+
.describe(
|
|
13
|
+
`Field ids to show on task cards, top-to-bottom. Max ${TASK_CARD_FIELD_LIMIT}.`,
|
|
14
|
+
),
|
|
15
|
+
});
|
|
16
|
+
|
|
8
17
|
export default defineAction({
|
|
9
18
|
description:
|
|
10
19
|
"Replace the custom fields shown on task cards for the current user.",
|
|
11
|
-
schema:
|
|
12
|
-
fieldIds: z
|
|
13
|
-
.array(z.string())
|
|
14
|
-
.max(TASK_CARD_FIELD_LIMIT)
|
|
15
|
-
.describe(
|
|
16
|
-
`Field ids to show on task cards, top-to-bottom. Max ${TASK_CARD_FIELD_LIMIT}.`,
|
|
17
|
-
),
|
|
18
|
-
}),
|
|
20
|
+
schema: updateVisibleTaskFieldsSchema,
|
|
19
21
|
run: async (args, ctx) => {
|
|
20
22
|
const ownerEmail = requireUserEmail(ctx?.userEmail);
|
|
21
23
|
const fieldIds = await setTaskCardFieldIds({
|
|
@@ -89,7 +89,7 @@ async function readParsedAppState<T>(
|
|
|
89
89
|
|
|
90
90
|
export default defineAction({
|
|
91
91
|
description:
|
|
92
|
-
"
|
|
92
|
+
"Inspect the current Tasks screen. Returns navigation, visible items, the selected item, and active bulk selection.",
|
|
93
93
|
schema: z.object({}),
|
|
94
94
|
http: false,
|
|
95
95
|
readOnly: true,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ExtensionSlot } from "@agent-native/core/client/extensions";
|
|
1
2
|
import { useT } from "@agent-native/core/client/i18n";
|
|
2
3
|
import { useCallback } from "react";
|
|
3
4
|
import { toast } from "sonner";
|
|
@@ -76,6 +77,20 @@ function TaskFieldsSidebarPanel({ task }: { task: TaskWithFields }) {
|
|
|
76
77
|
/>
|
|
77
78
|
))
|
|
78
79
|
)}
|
|
80
|
+
|
|
81
|
+
{/* Stable extension contract: changing this slot id or context requires a migration. */}
|
|
82
|
+
<ExtensionSlot
|
|
83
|
+
id="tasks.task-detail.bottom"
|
|
84
|
+
context={{
|
|
85
|
+
taskId: task.id,
|
|
86
|
+
title: task.title,
|
|
87
|
+
done: task.done,
|
|
88
|
+
fieldValues: fields.map((field) => ({
|
|
89
|
+
fieldId: field.id,
|
|
90
|
+
value: field.value ?? null,
|
|
91
|
+
})),
|
|
92
|
+
}}
|
|
93
|
+
/>
|
|
79
94
|
</div>
|
|
80
95
|
);
|
|
81
96
|
}
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
"typecheck": "agent-native typecheck",
|
|
13
13
|
"action": "agent-native action",
|
|
14
14
|
"script": "agent-native script",
|
|
15
|
+
"db:push": "drizzle-kit push",
|
|
16
|
+
"db:generate": "drizzle-kit generate",
|
|
15
17
|
"test": "vitest --run --config vitest.config.ts",
|
|
16
18
|
"test:e2e": "playwright test",
|
|
17
19
|
"test:e2e:install": "playwright install chromium",
|
|
@@ -26,6 +28,7 @@
|
|
|
26
28
|
"@fontsource-variable/inter": "^5.2.8",
|
|
27
29
|
"@libsql/client": "^0.15.8",
|
|
28
30
|
"@tabler/icons-react": "catalog:",
|
|
31
|
+
"drizzle-orm": "^0.45.2",
|
|
29
32
|
"h3": "^2.0.1-rc.20",
|
|
30
33
|
"isbot": "^5",
|
|
31
34
|
"node-pty": "^1.1.0",
|
|
@@ -78,7 +81,7 @@
|
|
|
78
81
|
"class-variance-authority": "^0.7.1",
|
|
79
82
|
"clsx": "^2.1.1",
|
|
80
83
|
"cmdk": "^1.1.1",
|
|
81
|
-
"drizzle-
|
|
84
|
+
"drizzle-kit": "^0.31.10",
|
|
82
85
|
"embla-carousel-react": "^8.6.0",
|
|
83
86
|
"input-otp": "^1.4.2",
|
|
84
87
|
"next-themes": "^0.4.6",
|
|
@@ -51,17 +51,7 @@ export const customFieldValues = table(
|
|
|
51
51
|
}),
|
|
52
52
|
);
|
|
53
53
|
|
|
54
|
-
export const userConfig = table("user_config", {
|
|
55
|
-
ownerEmail: text("owner_email").primaryKey(),
|
|
56
|
-
taskCardFieldIdsJson: text("task_card_field_ids_json")
|
|
57
|
-
.notNull()
|
|
58
|
-
.default("[]"),
|
|
59
|
-
updatedAt: text("updated_at").notNull().default(now()),
|
|
60
|
-
});
|
|
61
|
-
|
|
62
54
|
export type StoredCustomField = typeof customFields.$inferSelect;
|
|
63
55
|
export type NewCustomField = typeof customFields.$inferInsert;
|
|
64
56
|
export type StoredCustomFieldValue = typeof customFieldValues.$inferSelect;
|
|
65
57
|
export type NewCustomFieldValue = typeof customFieldValues.$inferInsert;
|
|
66
|
-
export type StoredUserConfig = typeof userConfig.$inferSelect;
|
|
67
|
-
export type NewUserConfig = typeof userConfig.$inferInsert;
|
|
@@ -51,11 +51,6 @@ CREATE INDEX IF NOT EXISTS idx_custom_field_values_owner_task
|
|
|
51
51
|
ON custom_field_values (owner_email, task_id);
|
|
52
52
|
CREATE INDEX IF NOT EXISTS idx_custom_field_values_owner_field
|
|
53
53
|
ON custom_field_values (owner_email, field_id);
|
|
54
|
-
CREATE TABLE IF NOT EXISTS user_config (
|
|
55
|
-
owner_email TEXT PRIMARY KEY,
|
|
56
|
-
task_card_field_ids_json TEXT NOT NULL DEFAULT '[]',
|
|
57
|
-
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
58
|
-
);
|
|
59
54
|
`;
|
|
60
55
|
|
|
61
56
|
// libsql, not better-sqlite3: its sync driver lets `.run()`/`.all()`/`.get()` pass here and fail in production.
|
|
@@ -43,6 +43,6 @@ When the user asks to see, review, or manage the task list, check the current-sc
|
|
|
43
43
|
When view-screen returns selection, treat selectedItems as the user's current UI multi-select on /tasks or /inbox.
|
|
44
44
|
Prefer bulk-update-tasks and bulk-delete-tasks when the user clearly means multiple tasks (e.g. "mark these done", "delete the selected ones", or several titles at once). Use single-task actions for one task or when bulk selection is not in play.
|
|
45
45
|
Prefer bulk-delete-inbox-items when the user clearly means multiple inbox items.
|
|
46
|
-
Ask for confirmation before
|
|
46
|
+
Ask for confirmation before deleting tasks, inbox items, or custom fields.
|
|
47
47
|
Do not use db-query for normal task or inbox operations.`,
|
|
48
48
|
});
|
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ensureAdditiveColumns,
|
|
3
|
+
getDbExec,
|
|
4
|
+
runMigrations,
|
|
5
|
+
} from "@agent-native/core/db";
|
|
2
6
|
|
|
3
|
-
|
|
7
|
+
import * as schema from "../db/schema.js";
|
|
8
|
+
|
|
9
|
+
// Keep historical entries unnamed for legacy-ledger compatibility; every new
|
|
10
|
+
// migration must add a stable, unique `name` slug.
|
|
11
|
+
const runTasksMigrations = runMigrations(
|
|
4
12
|
[
|
|
5
13
|
{
|
|
6
14
|
version: 1,
|
|
@@ -77,14 +85,39 @@ export default runMigrations(
|
|
|
77
85
|
CREATE INDEX IF NOT EXISTS idx_custom_field_values_owner_field
|
|
78
86
|
ON custom_field_values (owner_email, field_id)`,
|
|
79
87
|
},
|
|
80
|
-
{
|
|
81
|
-
version: 8,
|
|
82
|
-
sql: `CREATE TABLE IF NOT EXISTS user_config (
|
|
83
|
-
owner_email TEXT PRIMARY KEY,
|
|
84
|
-
task_card_field_ids_json TEXT NOT NULL DEFAULT '[]',
|
|
85
|
-
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
86
|
-
)`,
|
|
87
|
-
},
|
|
88
88
|
],
|
|
89
89
|
{ table: "tasks_migrations" },
|
|
90
90
|
);
|
|
91
|
+
|
|
92
|
+
function isDrizzleTable(value: unknown): value is object {
|
|
93
|
+
return (
|
|
94
|
+
!!value &&
|
|
95
|
+
typeof value === "object" &&
|
|
96
|
+
Object.getOwnPropertySymbols(value).some((s) =>
|
|
97
|
+
s.toString().includes("drizzle"),
|
|
98
|
+
)
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const schemaTables = Object.values(schema).filter(isDrizzleTable);
|
|
103
|
+
|
|
104
|
+
export default async (nitroApp: any): Promise<void> => {
|
|
105
|
+
await runTasksMigrations(nitroApp);
|
|
106
|
+
try {
|
|
107
|
+
const summary = await ensureAdditiveColumns({
|
|
108
|
+
db: getDbExec(),
|
|
109
|
+
tables: schemaTables,
|
|
110
|
+
});
|
|
111
|
+
if (summary.errors.length > 0) {
|
|
112
|
+
console.warn(
|
|
113
|
+
"[db] ensureAdditiveColumns completed with errors:",
|
|
114
|
+
summary.errors,
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
} catch (err) {
|
|
118
|
+
console.warn(
|
|
119
|
+
"[db] ensureAdditiveColumns failed (non-fatal):",
|
|
120
|
+
err instanceof Error ? err.message : err,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getUserSetting, putUserSetting } from "@agent-native/core/settings";
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
DEFAULT_TASK_CARD_FIELD_NAMES,
|
|
5
5
|
TASK_CARD_FIELD_LIMIT,
|
|
6
6
|
} from "../../shared/visible-task-fields.js";
|
|
7
7
|
import { listCustomFields } from "../custom-fields/store.js";
|
|
8
|
-
import { getDb } from "../db/index.js";
|
|
9
|
-
import { timestamp } from "../db/record-utils.js";
|
|
10
|
-
import { userConfig } from "../db/schema.js";
|
|
11
|
-
import type { DbHandle } from "../db/transaction.js";
|
|
12
8
|
import { UserInputError } from "../errors.js";
|
|
13
9
|
|
|
14
10
|
export { DEFAULT_TASK_CARD_FIELD_NAMES, TASK_CARD_FIELD_LIMIT };
|
|
15
11
|
|
|
12
|
+
const VISIBLE_TASK_FIELDS_SETTING_KEY = "visible-task-fields";
|
|
13
|
+
|
|
16
14
|
function fieldIdsForNames(
|
|
17
15
|
fieldNames: readonly string[],
|
|
18
16
|
fields: readonly { id: string; title: string }[],
|
|
@@ -26,16 +24,11 @@ function fieldIdsForNames(
|
|
|
26
24
|
.slice(0, TASK_CARD_FIELD_LIMIT);
|
|
27
25
|
}
|
|
28
26
|
|
|
29
|
-
function
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
.filter((value): value is string => typeof value === "string")
|
|
35
|
-
.slice(0, TASK_CARD_FIELD_LIMIT);
|
|
36
|
-
} catch {
|
|
37
|
-
return [];
|
|
38
|
-
}
|
|
27
|
+
function parseFieldIdsValue(value: unknown): string[] {
|
|
28
|
+
if (!Array.isArray(value)) return [];
|
|
29
|
+
return value
|
|
30
|
+
.filter((entry): entry is string => typeof entry === "string")
|
|
31
|
+
.slice(0, TASK_CARD_FIELD_LIMIT);
|
|
39
32
|
}
|
|
40
33
|
|
|
41
34
|
function dedupeFieldIds(fieldIds: readonly string[]) {
|
|
@@ -49,39 +42,34 @@ function filterKnownFieldIds(
|
|
|
49
42
|
return fieldIds.filter((fieldId) => knownIds.has(fieldId));
|
|
50
43
|
}
|
|
51
44
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
45
|
+
async function readStoredFieldIds(
|
|
46
|
+
ownerEmail: string,
|
|
47
|
+
): Promise<string[] | null> {
|
|
48
|
+
const setting = await getUserSetting(
|
|
49
|
+
ownerEmail,
|
|
50
|
+
VISIBLE_TASK_FIELDS_SETTING_KEY,
|
|
51
|
+
);
|
|
52
|
+
return setting ? parseFieldIdsValue(setting.fieldIds) : null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export async function getTaskCardFieldIds(input: {
|
|
56
|
+
ownerEmail: string;
|
|
57
|
+
}): Promise<string[]> {
|
|
58
58
|
const { fields } = await listCustomFields({ ownerEmail: input.ownerEmail });
|
|
59
59
|
const knownIds = new Set(fields.map((field) => field.id));
|
|
60
60
|
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
.from(userConfig)
|
|
64
|
-
.where(eq(userConfig.ownerEmail, input.ownerEmail))
|
|
65
|
-
.limit(1);
|
|
66
|
-
|
|
67
|
-
if (!row) {
|
|
61
|
+
const stored = await readStoredFieldIds(input.ownerEmail);
|
|
62
|
+
if (stored === null) {
|
|
68
63
|
return fieldIdsForNames(DEFAULT_TASK_CARD_FIELD_NAMES, fields);
|
|
69
64
|
}
|
|
70
65
|
|
|
71
|
-
return filterKnownFieldIds(
|
|
72
|
-
parseStoredFieldIds(row.taskCardFieldIdsJson),
|
|
73
|
-
knownIds,
|
|
74
|
-
);
|
|
66
|
+
return filterKnownFieldIds(stored, knownIds);
|
|
75
67
|
}
|
|
76
68
|
|
|
77
|
-
export async function setTaskCardFieldIds(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
now?: string;
|
|
82
|
-
},
|
|
83
|
-
db: DbHandle = getDb(),
|
|
84
|
-
): Promise<string[]> {
|
|
69
|
+
export async function setTaskCardFieldIds(input: {
|
|
70
|
+
ownerEmail: string;
|
|
71
|
+
fieldIds: readonly string[];
|
|
72
|
+
}): Promise<string[]> {
|
|
85
73
|
const { fields } = await listCustomFields({ ownerEmail: input.ownerEmail });
|
|
86
74
|
const knownIds = new Set(fields.map((field) => field.id));
|
|
87
75
|
const next = dedupeFieldIds(input.fieldIds);
|
|
@@ -90,49 +78,22 @@ export async function setTaskCardFieldIds(
|
|
|
90
78
|
throw new UserInputError("fieldIds must reference existing custom fields.");
|
|
91
79
|
}
|
|
92
80
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
await db
|
|
97
|
-
.insert(userConfig)
|
|
98
|
-
.values({
|
|
99
|
-
ownerEmail: input.ownerEmail,
|
|
100
|
-
taskCardFieldIdsJson,
|
|
101
|
-
updatedAt,
|
|
102
|
-
})
|
|
103
|
-
.onConflictDoUpdate({
|
|
104
|
-
target: userConfig.ownerEmail,
|
|
105
|
-
set: { taskCardFieldIdsJson, updatedAt },
|
|
106
|
-
});
|
|
81
|
+
await putUserSetting(input.ownerEmail, VISIBLE_TASK_FIELDS_SETTING_KEY, {
|
|
82
|
+
fieldIds: next,
|
|
83
|
+
});
|
|
107
84
|
|
|
108
85
|
return next;
|
|
109
86
|
}
|
|
110
87
|
|
|
111
|
-
export async function removeTaskCardFieldId(
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
)
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
.where(eq(userConfig.ownerEmail, input.ownerEmail))
|
|
123
|
-
.limit(1);
|
|
124
|
-
|
|
125
|
-
if (!row) return;
|
|
126
|
-
|
|
127
|
-
const next = parseStoredFieldIds(row.taskCardFieldIdsJson).filter(
|
|
128
|
-
(fieldId) => fieldId !== input.fieldId,
|
|
129
|
-
);
|
|
130
|
-
|
|
131
|
-
await db
|
|
132
|
-
.update(userConfig)
|
|
133
|
-
.set({
|
|
134
|
-
taskCardFieldIdsJson: JSON.stringify(next),
|
|
135
|
-
updatedAt: timestamp(input.now),
|
|
136
|
-
})
|
|
137
|
-
.where(eq(userConfig.ownerEmail, input.ownerEmail));
|
|
88
|
+
export async function removeTaskCardFieldId(input: {
|
|
89
|
+
ownerEmail: string;
|
|
90
|
+
fieldId: string;
|
|
91
|
+
}): Promise<void> {
|
|
92
|
+
const stored = await readStoredFieldIds(input.ownerEmail);
|
|
93
|
+
if (stored === null) return;
|
|
94
|
+
|
|
95
|
+
const next = stored.filter((fieldId) => fieldId !== input.fieldId);
|
|
96
|
+
await putUserSetting(input.ownerEmail, VISIBLE_TASK_FIELDS_SETTING_KEY, {
|
|
97
|
+
fieldIds: next,
|
|
98
|
+
});
|
|
138
99
|
}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
|
|
1
3
|
import { defineConfig } from "vitest/config";
|
|
2
4
|
|
|
3
5
|
export default defineConfig({
|
|
6
|
+
resolve: {
|
|
7
|
+
alias: {
|
|
8
|
+
"@": path.resolve(__dirname, "./app"),
|
|
9
|
+
"@shared": path.resolve(__dirname, "./shared"),
|
|
10
|
+
},
|
|
11
|
+
},
|
|
4
12
|
test: {
|
|
5
|
-
include: ["**/*.test
|
|
13
|
+
include: ["**/*.{test,spec}.?(c|m)[jt]s?(x)"],
|
|
14
|
+
exclude: ["**/node_modules/**", "**/.git/**", "**/dist/**", "**/e2e/**"],
|
|
6
15
|
environment: "node",
|
|
7
16
|
},
|
|
8
17
|
});
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Public exports for the pluggable agent engine system.
|
|
3
3
|
*/
|
|
4
4
|
export type { AgentEngine, EngineCapabilities, EngineTool, EngineMessage, EngineContentPart, EngineTextPart, EngineImagePart, EngineToolCallPart, EngineToolResultPart, EngineThinkingPart, EngineEvent, EngineStreamOptions, } from "./types.js";
|
|
5
|
-
export { registerAgentEngine, getAgentEngineEntry, listAgentEngines, resolveEngine, getConfiguredEngineNameForRequest, getStoredModelForEngine, normalizeModelForEngine, detectEngineFromEnv, detectEngineFromEnvForRequest, detectEngineFromUserSecrets, isAgentEngineSettingConfigured, isAgentEnginePackageInstalled, isStoredEngineUsable, isStoredEngineUsableForRequest, isResolvedEngineUsableForRequest, type AgentEngineEntry, type ResolveEngineConfig, } from "./registry.js";
|
|
5
|
+
export { registerAgentEngine, getAgentEngineEntry, listAgentEngines, resolveEngine, getConfiguredEngineNameForRequest, getStoredModelForEngine, normalizeModelForEngine, resolveEnginePreservesCustomModels, type NormalizeModelOptions, detectEngineFromEnv, detectEngineFromEnvForRequest, detectEngineFromUserSecrets, isAgentEngineSettingConfigured, isAgentEnginePackageInstalled, isStoredEngineUsable, isStoredEngineUsableForRequest, isResolvedEngineUsableForRequest, type AgentEngineEntry, type ResolveEngineConfig, } from "./registry.js";
|
|
6
6
|
export { createBuilderEngine, BUILDER_DEFAULT_MODEL, BUILDER_SUPPORTED_MODELS, BUILDER_CAPABILITIES, } from "./builder-engine.js";
|
|
7
7
|
export { createAnthropicEngine, ANTHROPIC_DEFAULT_MODEL, ANTHROPIC_SUPPORTED_MODELS, ANTHROPIC_CAPABILITIES, } from "./anthropic-engine.js";
|
|
8
8
|
export { createAISDKEngine, type AISDKProvider } from "./ai-sdk-engine.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,iCAAiC,EACjC,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,6BAA6B,EAC7B,2BAA2B,EAC3B,8BAA8B,EAC9B,6BAA6B,EAC7B,oBAAoB,EACpB,8BAA8B,EAC9B,gCAAgC,EAChC,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,iCAAiC,EACjC,uBAAuB,EACvB,uBAAuB,EACvB,kCAAkC,EAClC,KAAK,qBAAqB,EAC1B,mBAAmB,EACnB,6BAA6B,EAC7B,2BAA2B,EAC3B,8BAA8B,EAC9B,6BAA6B,EAC7B,oBAAoB,EACpB,8BAA8B,EAC9B,gCAAgC,EAChC,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Public exports for the pluggable agent engine system.
|
|
3
3
|
*/
|
|
4
|
-
export { registerAgentEngine, getAgentEngineEntry, listAgentEngines, resolveEngine, getConfiguredEngineNameForRequest, getStoredModelForEngine, normalizeModelForEngine, detectEngineFromEnv, detectEngineFromEnvForRequest, detectEngineFromUserSecrets, isAgentEngineSettingConfigured, isAgentEnginePackageInstalled, isStoredEngineUsable, isStoredEngineUsableForRequest, isResolvedEngineUsableForRequest, } from "./registry.js";
|
|
4
|
+
export { registerAgentEngine, getAgentEngineEntry, listAgentEngines, resolveEngine, getConfiguredEngineNameForRequest, getStoredModelForEngine, normalizeModelForEngine, resolveEnginePreservesCustomModels, detectEngineFromEnv, detectEngineFromEnvForRequest, detectEngineFromUserSecrets, isAgentEngineSettingConfigured, isAgentEnginePackageInstalled, isStoredEngineUsable, isStoredEngineUsableForRequest, isResolvedEngineUsableForRequest, } from "./registry.js";
|
|
5
5
|
export { createBuilderEngine, BUILDER_DEFAULT_MODEL, BUILDER_SUPPORTED_MODELS, BUILDER_CAPABILITIES, } from "./builder-engine.js";
|
|
6
6
|
export { createAnthropicEngine, ANTHROPIC_DEFAULT_MODEL, ANTHROPIC_SUPPORTED_MODELS, ANTHROPIC_CAPABILITIES, } from "./anthropic-engine.js";
|
|
7
7
|
export { createAISDKEngine } from "./ai-sdk-engine.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,iCAAiC,EACjC,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,6BAA6B,EAC7B,2BAA2B,EAC3B,8BAA8B,EAC9B,6BAA6B,EAC7B,oBAAoB,EACpB,8BAA8B,EAC9B,gCAAgC,GAGjC,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAsB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Public exports for the pluggable agent engine system.\n */\n\nexport type {\n AgentEngine,\n EngineCapabilities,\n EngineTool,\n EngineMessage,\n EngineContentPart,\n EngineTextPart,\n EngineImagePart,\n EngineToolCallPart,\n EngineToolResultPart,\n EngineThinkingPart,\n EngineEvent,\n EngineStreamOptions,\n} from \"./types.js\";\n\nexport {\n registerAgentEngine,\n getAgentEngineEntry,\n listAgentEngines,\n resolveEngine,\n getConfiguredEngineNameForRequest,\n getStoredModelForEngine,\n normalizeModelForEngine,\n detectEngineFromEnv,\n detectEngineFromEnvForRequest,\n detectEngineFromUserSecrets,\n isAgentEngineSettingConfigured,\n isAgentEnginePackageInstalled,\n isStoredEngineUsable,\n isStoredEngineUsableForRequest,\n isResolvedEngineUsableForRequest,\n type AgentEngineEntry,\n type ResolveEngineConfig,\n} from \"./registry.js\";\n\nexport {\n createBuilderEngine,\n BUILDER_DEFAULT_MODEL,\n BUILDER_SUPPORTED_MODELS,\n BUILDER_CAPABILITIES,\n} from \"./builder-engine.js\";\n\nexport {\n createAnthropicEngine,\n ANTHROPIC_DEFAULT_MODEL,\n ANTHROPIC_SUPPORTED_MODELS,\n ANTHROPIC_CAPABILITIES,\n} from \"./anthropic-engine.js\";\nexport { createAISDKEngine, type AISDKProvider } from \"./ai-sdk-engine.js\";\nexport { registerBuiltinEngines } from \"./builtin.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,iCAAiC,EACjC,uBAAuB,EACvB,uBAAuB,EACvB,kCAAkC,EAElC,mBAAmB,EACnB,6BAA6B,EAC7B,2BAA2B,EAC3B,8BAA8B,EAC9B,6BAA6B,EAC7B,oBAAoB,EACpB,8BAA8B,EAC9B,gCAAgC,GAGjC,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAsB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Public exports for the pluggable agent engine system.\n */\n\nexport type {\n AgentEngine,\n EngineCapabilities,\n EngineTool,\n EngineMessage,\n EngineContentPart,\n EngineTextPart,\n EngineImagePart,\n EngineToolCallPart,\n EngineToolResultPart,\n EngineThinkingPart,\n EngineEvent,\n EngineStreamOptions,\n} from \"./types.js\";\n\nexport {\n registerAgentEngine,\n getAgentEngineEntry,\n listAgentEngines,\n resolveEngine,\n getConfiguredEngineNameForRequest,\n getStoredModelForEngine,\n normalizeModelForEngine,\n resolveEnginePreservesCustomModels,\n type NormalizeModelOptions,\n detectEngineFromEnv,\n detectEngineFromEnvForRequest,\n detectEngineFromUserSecrets,\n isAgentEngineSettingConfigured,\n isAgentEnginePackageInstalled,\n isStoredEngineUsable,\n isStoredEngineUsableForRequest,\n isResolvedEngineUsableForRequest,\n type AgentEngineEntry,\n type ResolveEngineConfig,\n} from \"./registry.js\";\n\nexport {\n createBuilderEngine,\n BUILDER_DEFAULT_MODEL,\n BUILDER_SUPPORTED_MODELS,\n BUILDER_CAPABILITIES,\n} from \"./builder-engine.js\";\n\nexport {\n createAnthropicEngine,\n ANTHROPIC_DEFAULT_MODEL,\n ANTHROPIC_SUPPORTED_MODELS,\n ANTHROPIC_CAPABILITIES,\n} from \"./anthropic-engine.js\";\nexport { createAISDKEngine, type AISDKProvider } from \"./ai-sdk-engine.js\";\nexport { registerBuiltinEngines } from \"./builtin.js\";\n"]}
|
|
@@ -38,7 +38,38 @@ export declare function getAgentEngineEntry(name: string): AgentEngineEntry | un
|
|
|
38
38
|
/** List all registered engine entries */
|
|
39
39
|
export declare function listAgentEngines(): AgentEngineEntry[];
|
|
40
40
|
export declare function isAgentEnginePackageInstalled(entry: AgentEngineEntry): boolean;
|
|
41
|
-
export
|
|
41
|
+
export interface NormalizeModelOptions {
|
|
42
|
+
/**
|
|
43
|
+
* Force unrecognized (custom) model IDs to be kept verbatim, as if
|
|
44
|
+
* `engine.preserveCustomModels` were set on a live engine instance.
|
|
45
|
+
*
|
|
46
|
+
* The settings actions call `normalizeModelForEngine` with a static registry
|
|
47
|
+
* ENTRY, which never carries the runtime `preserveCustomModels` flag — that
|
|
48
|
+
* is only set on the engine INSTANCE created with an OpenAI-compatible
|
|
49
|
+
* `baseUrl`. They resolve the capability with
|
|
50
|
+
* {@link resolveEnginePreservesCustomModels} and pass it here so a gateway
|
|
51
|
+
* model (e.g. an Ollama `gemma4`) is not rewritten to the OpenAI default on
|
|
52
|
+
* save/read. First-party OpenAI (no gateway) leaves this unset, so an unknown
|
|
53
|
+
* or invalid model still normalizes to a supported one.
|
|
54
|
+
*/
|
|
55
|
+
preserveCustomModels?: boolean;
|
|
56
|
+
}
|
|
57
|
+
export declare function normalizeModelForEngine(engine: Pick<AgentEngine, "name" | "defaultModel" | "supportedModels" | "preserveCustomModels">, model: string | null | undefined, options?: NormalizeModelOptions): string;
|
|
58
|
+
/**
|
|
59
|
+
* Whether models saved or read for this engine ENTRY should be preserved
|
|
60
|
+
* verbatim instead of normalized against the built-in catalog.
|
|
61
|
+
*
|
|
62
|
+
* `normalizeModelForEngine` honors a live engine's `preserveCustomModels`, but
|
|
63
|
+
* that flag is only set on an AI SDK engine INSTANCE when the OpenAI provider
|
|
64
|
+
* is pointed at an OpenAI-compatible gateway (a custom base URL — e.g. Ollama
|
|
65
|
+
* Cloud or LiteLLM), whose model IDs are not in the built-in OpenAI catalog.
|
|
66
|
+
* The static registry entry the settings actions pass to
|
|
67
|
+
* `normalizeModelForEngine` cannot carry that runtime flag, so this async
|
|
68
|
+
* helper reproduces the same decision — `ai-sdk:openai` AND a resolved base URL
|
|
69
|
+
* — from the request's stored/deploy config. First-party OpenAI (no gateway)
|
|
70
|
+
* returns false so an unknown/invalid model still normalizes to a supported one.
|
|
71
|
+
*/
|
|
72
|
+
export declare function resolveEnginePreservesCustomModels(entry: Pick<AgentEngineEntry, "name">): Promise<boolean>;
|
|
42
73
|
/**
|
|
43
74
|
* First registered engine whose requiredEnvVars are all set. Registration
|
|
44
75
|
* order controls priority — the Builder gateway is registered first so it
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIlE,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0BAA0B;IAC1B,YAAY,EAAE,kBAAkB,CAAC;IACjC,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,6DAA6D;IAC7D,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,4CAA4C;IAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC;CACtD;AAKD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAajE;AAED,uEAAuE;AACvE,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GACX,gBAAgB,GAAG,SAAS,CAE9B;AAED,yCAAyC;AACzC,wBAAgB,gBAAgB,IAAI,gBAAgB,EAAE,CAErD;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/registry.ts"],"names":[],"mappings":"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"}
|