@adhd/agent-core-provider 2.1.0

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 (64) hide show
  1. package/drizzle/0000_providers_and_models.sql +23 -0
  2. package/drizzle/0001_model_platform_bindings.sql +8 -0
  3. package/drizzle/0002_provider_tool_formats.sql +10 -0
  4. package/drizzle/meta/0000_snapshot.json +149 -0
  5. package/drizzle/meta/0001_snapshot.json +190 -0
  6. package/drizzle/meta/0002_snapshot.json +245 -0
  7. package/drizzle/meta/_journal.json +27 -0
  8. package/package.json +53 -0
  9. package/src/adapter/provider-adapter.d.ts +21 -0
  10. package/src/adapter/provider-adapter.d.ts.map +1 -0
  11. package/src/adapter/provider-adapter.js +38 -0
  12. package/src/adapter/provider-adapter.js.map +1 -0
  13. package/src/db/client.d.ts +7 -0
  14. package/src/db/client.d.ts.map +1 -0
  15. package/src/db/client.js +19 -0
  16. package/src/db/client.js.map +1 -0
  17. package/src/db/migrate-runner.d.ts +30 -0
  18. package/src/db/migrate-runner.d.ts.map +1 -0
  19. package/src/db/migrate-runner.js +34 -0
  20. package/src/db/migrate-runner.js.map +1 -0
  21. package/src/db/migrate.d.ts +9 -0
  22. package/src/db/migrate.d.ts.map +1 -0
  23. package/src/db/migrate.js +13 -0
  24. package/src/db/migrate.js.map +1 -0
  25. package/src/db/schema.d.ts +475 -0
  26. package/src/db/schema.d.ts.map +1 -0
  27. package/src/db/schema.js +79 -0
  28. package/src/db/schema.js.map +1 -0
  29. package/src/index.d.ts +17 -0
  30. package/src/index.d.ts.map +1 -0
  31. package/src/index.js +15 -0
  32. package/src/index.js.map +1 -0
  33. package/src/runtime/emit-tools.d.ts +91 -0
  34. package/src/runtime/emit-tools.d.ts.map +1 -0
  35. package/src/runtime/emit-tools.js +98 -0
  36. package/src/runtime/emit-tools.js.map +1 -0
  37. package/src/seed/bindings.d.ts +16 -0
  38. package/src/seed/bindings.d.ts.map +1 -0
  39. package/src/seed/bindings.js +65 -0
  40. package/src/seed/bindings.js.map +1 -0
  41. package/src/seed/index.d.ts +13 -0
  42. package/src/seed/index.d.ts.map +1 -0
  43. package/src/seed/index.js +29 -0
  44. package/src/seed/index.js.map +1 -0
  45. package/src/seed/models.d.ts +22 -0
  46. package/src/seed/models.d.ts.map +1 -0
  47. package/src/seed/models.js +68 -0
  48. package/src/seed/models.js.map +1 -0
  49. package/src/seed/providers.d.ts +11 -0
  50. package/src/seed/providers.d.ts.map +1 -0
  51. package/src/seed/providers.js +65 -0
  52. package/src/seed/providers.js.map +1 -0
  53. package/src/store/model-store.d.ts +69 -0
  54. package/src/store/model-store.d.ts.map +1 -0
  55. package/src/store/model-store.js +130 -0
  56. package/src/store/model-store.js.map +1 -0
  57. package/src/store/provider-store.d.ts +39 -0
  58. package/src/store/provider-store.d.ts.map +1 -0
  59. package/src/store/provider-store.js +88 -0
  60. package/src/store/provider-store.js.map +1 -0
  61. package/src/store/tool-format-store.d.ts +58 -0
  62. package/src/store/tool-format-store.d.ts.map +1 -0
  63. package/src/store/tool-format-store.js +93 -0
  64. package/src/store/tool-format-store.js.map +1 -0
@@ -0,0 +1,130 @@
1
+ import { and, eq } from 'drizzle-orm';
2
+ import { modelPlatformBindings, models } from '../db/schema.js';
3
+ export class ModelStoreError extends Error {
4
+ code;
5
+ constructor(code, message) {
6
+ super(message);
7
+ this.name = 'ModelStoreError';
8
+ this.code = code;
9
+ }
10
+ }
11
+ // ──────────────────────────────────────────────
12
+ // Store
13
+ // Thin Drizzle queries, typed errors — mirrors agent-mcp AgentStore pattern.
14
+ // Capability flags (vision/promptCaching/extendedThinking) are stored as
15
+ // SQLite integers but Drizzle's integer({mode:"boolean"}) deserialises them
16
+ // as JS booleans on read — the reopen test asserts this.
17
+ // ──────────────────────────────────────────────
18
+ export class ModelStore {
19
+ db;
20
+ constructor(db) {
21
+ this.db = db;
22
+ }
23
+ /**
24
+ * Insert a new model row.
25
+ * Throws MODEL_ALREADY_EXISTS if the id is taken.
26
+ */
27
+ create(input) {
28
+ const now = new Date().toISOString();
29
+ const existing = this.db
30
+ .select()
31
+ .from(models)
32
+ .where(eq(models.id, input.id))
33
+ .get();
34
+ if (existing) {
35
+ throw new ModelStoreError('MODEL_ALREADY_EXISTS', `Model '${input.id}' already exists`);
36
+ }
37
+ this.db
38
+ .insert(models)
39
+ .values({
40
+ id: input.id,
41
+ contextWindow: input.contextWindow,
42
+ outputLimit: input.outputLimit,
43
+ vision: input.vision ?? false,
44
+ promptCaching: input.promptCaching ?? false,
45
+ extendedThinking: input.extendedThinking ?? false,
46
+ pricingTier: input.pricingTier,
47
+ createdAt: now,
48
+ updatedAt: now,
49
+ })
50
+ .run();
51
+ return this.read(input.id);
52
+ }
53
+ /**
54
+ * Read a model by id.
55
+ * Throws MODEL_NOT_FOUND if missing.
56
+ */
57
+ read(id) {
58
+ const row = this.db.select().from(models).where(eq(models.id, id)).get();
59
+ if (!row) {
60
+ throw new ModelStoreError('MODEL_NOT_FOUND', `Model '${id}' not found`);
61
+ }
62
+ return this._rowToModel(row);
63
+ }
64
+ /** Return all model rows. */
65
+ list() {
66
+ return this.db
67
+ .select()
68
+ .from(models)
69
+ .all()
70
+ .map((row) => this._rowToModel(row));
71
+ }
72
+ _rowToModel(row) {
73
+ return {
74
+ id: row.id,
75
+ contextWindow: row.contextWindow,
76
+ outputLimit: row.outputLimit,
77
+ // Drizzle deserialises integer({mode:"boolean"}) as booleans —
78
+ // coerce here to ensure JS boolean regardless of DB driver version.
79
+ vision: Boolean(row.vision),
80
+ promptCaching: Boolean(row.promptCaching),
81
+ extendedThinking: Boolean(row.extendedThinking),
82
+ pricingTier: row.pricingTier,
83
+ createdAt: row.createdAt,
84
+ updatedAt: row.updatedAt,
85
+ };
86
+ }
87
+ // ──────────────────────────────────────────────
88
+ // Platform binding methods
89
+ // ──────────────────────────────────────────────
90
+ /**
91
+ * Insert a model-platform binding row.
92
+ * model_id is a logical key (no SQL FK — seeding order flexibility).
93
+ */
94
+ createBinding(input) {
95
+ this.db
96
+ .insert(modelPlatformBindings)
97
+ .values({
98
+ modelId: input.modelId,
99
+ platform: input.platform,
100
+ platformModelId: input.platformModelId,
101
+ })
102
+ .run();
103
+ return {
104
+ modelId: input.modelId,
105
+ platform: input.platform,
106
+ platformModelId: input.platformModelId,
107
+ };
108
+ }
109
+ /**
110
+ * Resolve a canonical model id + platform to the provider-specific string.
111
+ *
112
+ * The `WHERE platform = ?` clause is the single gating filter that makes the
113
+ * negative-control test bite: removing it collapses both platforms to the
114
+ * first binding row — keep the filter here and nowhere else.
115
+ *
116
+ * Throws MODEL_BINDING_NOT_FOUND if no row exists for (canonicalId, platform).
117
+ */
118
+ resolveModelId(canonicalId, platform) {
119
+ const row = this.db
120
+ .select()
121
+ .from(modelPlatformBindings)
122
+ .where(and(eq(modelPlatformBindings.modelId, canonicalId), eq(modelPlatformBindings.platform, platform)))
123
+ .get();
124
+ if (!row) {
125
+ throw new ModelStoreError('MODEL_BINDING_NOT_FOUND', `No binding for model '${canonicalId}' on platform '${platform}'`);
126
+ }
127
+ return row.platformModelId;
128
+ }
129
+ }
130
+ //# sourceMappingURL=model-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-store.js","sourceRoot":"","sources":["../../../../../../packages/agent/agent-core-provider/src/store/model-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';
2
+ export interface Provider {
3
+ id: string;
4
+ transport: string;
5
+ authPattern: string;
6
+ baseUrl: string | null;
7
+ endpointTemplate: string | null;
8
+ createdAt: string;
9
+ updatedAt: string;
10
+ }
11
+ export interface ProviderCreateInput {
12
+ id: string;
13
+ transport: string;
14
+ authPattern: string;
15
+ baseUrl?: string | null;
16
+ endpointTemplate?: string | null;
17
+ }
18
+ export type ProviderErrorCode = 'PROVIDER_ALREADY_EXISTS' | 'PROVIDER_NOT_FOUND';
19
+ export declare class ProviderStoreError extends Error {
20
+ readonly code: ProviderErrorCode;
21
+ constructor(code: ProviderErrorCode, message: string);
22
+ }
23
+ export declare class ProviderStore {
24
+ private readonly db;
25
+ constructor(db: BetterSQLite3Database<Record<string, never>>);
26
+ /**
27
+ * Insert a new provider row.
28
+ * Throws PROVIDER_ALREADY_EXISTS if the id is taken.
29
+ */
30
+ create(input: ProviderCreateInput): Provider;
31
+ /**
32
+ * Read a provider by id.
33
+ * Throws PROVIDER_NOT_FOUND if missing.
34
+ */
35
+ read(id: string): Provider;
36
+ /** Return all provider rows ordered by id. */
37
+ list(): Provider[];
38
+ }
39
+ //# sourceMappingURL=provider-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-store.d.ts","sourceRoot":"","sources":["../../../../../../packages/agent/agent-core-provider/src/store/provider-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAQxE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAMD,MAAM,MAAM,iBAAiB,GACzB,yBAAyB,GACzB,oBAAoB,CAAC;AAEzB,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;gBAErB,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM;CAKrD;AAOD,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAGnE;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,QAAQ;IAgC5C;;;OAGG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ;IAyB1B,8CAA8C;IAC9C,IAAI,IAAI,QAAQ,EAAE;CAenB"}
@@ -0,0 +1,88 @@
1
+ import { eq } from 'drizzle-orm';
2
+ import { providers } from '../db/schema.js';
3
+ export class ProviderStoreError extends Error {
4
+ code;
5
+ constructor(code, message) {
6
+ super(message);
7
+ this.name = 'ProviderStoreError';
8
+ this.code = code;
9
+ }
10
+ }
11
+ // ──────────────────────────────────────────────
12
+ // Store
13
+ // Thin Drizzle queries, typed errors — mirrors agent-mcp AgentStore pattern.
14
+ // ──────────────────────────────────────────────
15
+ export class ProviderStore {
16
+ db;
17
+ constructor(db) {
18
+ this.db = db;
19
+ }
20
+ /**
21
+ * Insert a new provider row.
22
+ * Throws PROVIDER_ALREADY_EXISTS if the id is taken.
23
+ */
24
+ create(input) {
25
+ const now = new Date().toISOString();
26
+ const existing = this.db
27
+ .select()
28
+ .from(providers)
29
+ .where(eq(providers.id, input.id))
30
+ .get();
31
+ if (existing) {
32
+ throw new ProviderStoreError('PROVIDER_ALREADY_EXISTS', `Provider '${input.id}' already exists`);
33
+ }
34
+ this.db
35
+ .insert(providers)
36
+ .values({
37
+ id: input.id,
38
+ transport: input.transport,
39
+ authPattern: input.authPattern,
40
+ baseUrl: input.baseUrl ?? null,
41
+ endpointTemplate: input.endpointTemplate ?? null,
42
+ createdAt: now,
43
+ updatedAt: now,
44
+ })
45
+ .run();
46
+ return this.read(input.id);
47
+ }
48
+ /**
49
+ * Read a provider by id.
50
+ * Throws PROVIDER_NOT_FOUND if missing.
51
+ */
52
+ read(id) {
53
+ const row = this.db
54
+ .select()
55
+ .from(providers)
56
+ .where(eq(providers.id, id))
57
+ .get();
58
+ if (!row) {
59
+ throw new ProviderStoreError('PROVIDER_NOT_FOUND', `Provider '${id}' not found`);
60
+ }
61
+ return {
62
+ id: row.id,
63
+ transport: row.transport,
64
+ authPattern: row.authPattern,
65
+ baseUrl: row.baseUrl,
66
+ endpointTemplate: row.endpointTemplate,
67
+ createdAt: row.createdAt,
68
+ updatedAt: row.updatedAt,
69
+ };
70
+ }
71
+ /** Return all provider rows ordered by id. */
72
+ list() {
73
+ return this.db
74
+ .select()
75
+ .from(providers)
76
+ .all()
77
+ .map((row) => ({
78
+ id: row.id,
79
+ transport: row.transport,
80
+ authPattern: row.authPattern,
81
+ baseUrl: row.baseUrl,
82
+ endpointTemplate: row.endpointTemplate,
83
+ createdAt: row.createdAt,
84
+ updatedAt: row.updatedAt,
85
+ }));
86
+ }
87
+ }
88
+ //# sourceMappingURL=provider-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-store.js","sourceRoot":"","sources":["../../../../../../packages/agent/agent-core-provider/src/store/provider-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';
2
+ /** Controlled-vocab values for emit_shape ([inv:lookup-not-enum]). */
3
+ export type EmitShape = 'custom' | 'server_side' | 'unsupported';
4
+ export interface ToolFormat {
5
+ providerId: string;
6
+ canonicalTool: string;
7
+ /** "custom" | "server_side" | "unsupported" */
8
+ emitShape: EmitShape;
9
+ /**
10
+ * Versioned type-tagged string for server_side rows only.
11
+ * e.g. "web_search_20250305". Null for custom/unsupported.
12
+ * ([def:server-side-tool])
13
+ */
14
+ typeTag: string | null;
15
+ /**
16
+ * Actionable message for unsupported rows only.
17
+ * e.g. "Anthropic bash requires a local execution loop; not supported".
18
+ * Null for custom/server_side.
19
+ * ([def:unsupported-native])
20
+ */
21
+ note: string | null;
22
+ }
23
+ export interface ToolFormatCreateInput {
24
+ providerId: string;
25
+ canonicalTool: string;
26
+ emitShape: EmitShape;
27
+ typeTag?: string | null;
28
+ note?: string | null;
29
+ }
30
+ export type ToolFormatErrorCode = 'TOOL_FORMAT_ALREADY_EXISTS' | 'TOOL_FORMAT_NOT_FOUND';
31
+ export declare class ToolFormatStoreError extends Error {
32
+ readonly code: ToolFormatErrorCode;
33
+ constructor(code: ToolFormatErrorCode, message: string);
34
+ }
35
+ export declare class ToolFormatStore {
36
+ private readonly db;
37
+ constructor(db: BetterSQLite3Database<Record<string, never>>);
38
+ /**
39
+ * Insert a new provider_tool_formats row.
40
+ * Throws TOOL_FORMAT_ALREADY_EXISTS if (providerId, canonicalTool) is taken.
41
+ */
42
+ create(input: ToolFormatCreateInput): ToolFormat;
43
+ /**
44
+ * Read a tool format row by (providerId, canonicalTool).
45
+ * Throws TOOL_FORMAT_NOT_FOUND if missing.
46
+ */
47
+ read(providerId: string, canonicalTool: string): ToolFormat;
48
+ /**
49
+ * Convenience helper used by the runtime emitter to branch on emit_shape.
50
+ * Returns the full ToolFormat row for (providerId, canonicalTool), or null
51
+ * if no row exists (i.e. the tool is treated as a plain custom function def).
52
+ */
53
+ getShape(providerId: string, canonicalTool: string): ToolFormat | null;
54
+ /** Return all tool format rows for a given provider, ordered by canonical_tool. */
55
+ listByProvider(providerId: string): ToolFormat[];
56
+ private _rowToToolFormat;
57
+ }
58
+ //# sourceMappingURL=tool-format-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-format-store.d.ts","sourceRoot":"","sources":["../../../../../../packages/agent/agent-core-provider/src/store/tool-format-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAQxE,sEAAsE;AACtE,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,aAAa,GAAG,aAAa,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,SAAS,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;;;OAKG;IACH,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAMD,MAAM,MAAM,mBAAmB,GAC3B,4BAA4B,GAC5B,uBAAuB,CAAC;AAE5B,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;gBAEvB,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM;CAKvD;AAQD,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAGnE;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,UAAU;IAiChD;;;OAGG;IACH,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,UAAU;IAsB3D;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAetE,mFAAmF;IACnF,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE;IAShD,OAAO,CAAC,gBAAgB;CAWzB"}
@@ -0,0 +1,93 @@
1
+ import { and, eq } from 'drizzle-orm';
2
+ import { providerToolFormats } from '../db/schema.js';
3
+ export class ToolFormatStoreError extends Error {
4
+ code;
5
+ constructor(code, message) {
6
+ super(message);
7
+ this.name = 'ToolFormatStoreError';
8
+ this.code = code;
9
+ }
10
+ }
11
+ // ──────────────────────────────────────────────
12
+ // Store
13
+ // Thin Drizzle queries, typed errors — mirrors agent-mcp AgentStore pattern.
14
+ // ([ref:store-class])
15
+ // ──────────────────────────────────────────────
16
+ export class ToolFormatStore {
17
+ db;
18
+ constructor(db) {
19
+ this.db = db;
20
+ }
21
+ /**
22
+ * Insert a new provider_tool_formats row.
23
+ * Throws TOOL_FORMAT_ALREADY_EXISTS if (providerId, canonicalTool) is taken.
24
+ */
25
+ create(input) {
26
+ const existing = this.db
27
+ .select()
28
+ .from(providerToolFormats)
29
+ .where(and(eq(providerToolFormats.providerId, input.providerId), eq(providerToolFormats.canonicalTool, input.canonicalTool)))
30
+ .get();
31
+ if (existing) {
32
+ throw new ToolFormatStoreError('TOOL_FORMAT_ALREADY_EXISTS', `Tool format for '${input.canonicalTool}' on provider '${input.providerId}' already exists`);
33
+ }
34
+ this.db
35
+ .insert(providerToolFormats)
36
+ .values({
37
+ providerId: input.providerId,
38
+ canonicalTool: input.canonicalTool,
39
+ emitShape: input.emitShape,
40
+ typeTag: input.typeTag ?? null,
41
+ note: input.note ?? null,
42
+ })
43
+ .run();
44
+ return this.read(input.providerId, input.canonicalTool);
45
+ }
46
+ /**
47
+ * Read a tool format row by (providerId, canonicalTool).
48
+ * Throws TOOL_FORMAT_NOT_FOUND if missing.
49
+ */
50
+ read(providerId, canonicalTool) {
51
+ const row = this.db
52
+ .select()
53
+ .from(providerToolFormats)
54
+ .where(and(eq(providerToolFormats.providerId, providerId), eq(providerToolFormats.canonicalTool, canonicalTool)))
55
+ .get();
56
+ if (!row) {
57
+ throw new ToolFormatStoreError('TOOL_FORMAT_NOT_FOUND', `Tool format for '${canonicalTool}' on provider '${providerId}' not found`);
58
+ }
59
+ return this._rowToToolFormat(row);
60
+ }
61
+ /**
62
+ * Convenience helper used by the runtime emitter to branch on emit_shape.
63
+ * Returns the full ToolFormat row for (providerId, canonicalTool), or null
64
+ * if no row exists (i.e. the tool is treated as a plain custom function def).
65
+ */
66
+ getShape(providerId, canonicalTool) {
67
+ const row = this.db
68
+ .select()
69
+ .from(providerToolFormats)
70
+ .where(and(eq(providerToolFormats.providerId, providerId), eq(providerToolFormats.canonicalTool, canonicalTool)))
71
+ .get();
72
+ return row ? this._rowToToolFormat(row) : null;
73
+ }
74
+ /** Return all tool format rows for a given provider, ordered by canonical_tool. */
75
+ listByProvider(providerId) {
76
+ return this.db
77
+ .select()
78
+ .from(providerToolFormats)
79
+ .where(eq(providerToolFormats.providerId, providerId))
80
+ .all()
81
+ .map((row) => this._rowToToolFormat(row));
82
+ }
83
+ _rowToToolFormat(row) {
84
+ return {
85
+ providerId: row.providerId,
86
+ canonicalTool: row.canonicalTool,
87
+ emitShape: row.emitShape,
88
+ typeTag: row.typeTag,
89
+ note: row.note,
90
+ };
91
+ }
92
+ }
93
+ //# sourceMappingURL=tool-format-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-format-store.js","sourceRoot":"","sources":["../../../../../../packages/agent/agent-core-provider/src/store/tool-format-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AA6CtD,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACpC,IAAI,CAAsB;IAEnC,YAAY,IAAyB,EAAE,OAAe;QACpD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,iDAAiD;AACjD,QAAQ;AACR,6EAA6E;AAC7E,sBAAsB;AACtB,iDAAiD;AAEjD,MAAM,OAAO,eAAe;IAEP;IADnB,YACmB,EAAgD;QAAhD,OAAE,GAAF,EAAE,CAA8C;IAChE,CAAC;IAEJ;;;OAGG;IACH,MAAM,CAAC,KAA4B;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE;aACrB,MAAM,EAAE;aACR,IAAI,CAAC,mBAAmB,CAAC;aACzB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,EACpD,EAAE,CAAC,mBAAmB,CAAC,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,CAC3D,CACF;aACA,GAAG,EAAE,CAAC;QAET,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,oBAAoB,CAC5B,4BAA4B,EAC5B,oBAAoB,KAAK,CAAC,aAAa,kBAAkB,KAAK,CAAC,UAAU,kBAAkB,CAC5F,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,EAAE;aACJ,MAAM,CAAC,mBAAmB,CAAC;aAC3B,MAAM,CAAC;YACN,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;YAC9B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;SACzB,CAAC;aACD,GAAG,EAAE,CAAC;QAET,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,UAAkB,EAAE,aAAqB;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,MAAM,EAAE;aACR,IAAI,CAAC,mBAAmB,CAAC;aACzB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9C,EAAE,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,CACrD,CACF;aACA,GAAG,EAAE,CAAC;QAET,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,oBAAoB,CAC5B,uBAAuB,EACvB,oBAAoB,aAAa,kBAAkB,UAAU,aAAa,CAC3E,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,UAAkB,EAAE,aAAqB;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,MAAM,EAAE;aACR,IAAI,CAAC,mBAAmB,CAAC;aACzB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9C,EAAE,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,CACrD,CACF;aACA,GAAG,EAAE,CAAC;QAET,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IAED,mFAAmF;IACnF,cAAc,CAAC,UAAkB;QAC/B,OAAO,IAAI,CAAC,EAAE;aACX,MAAM,EAAE;aACR,IAAI,CAAC,mBAAmB,CAAC;aACzB,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;aACrD,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAEO,gBAAgB,CACtB,GAA4C;QAE5C,OAAO;YACL,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,SAAS,EAAE,GAAG,CAAC,SAAsB;YACrC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC;IACJ,CAAC;CACF"}