@get-bb/plugin-sdk 0.4.22 → 0.4.27
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/bundled-types/bb-plugin-sdk-app.d.ts +6 -7
- package/bundled-types/bb-plugin-sdk-internal-host-policy.d.ts +0 -25
- package/bundled-types/bb-plugin-sdk-provider-bridge-acp.d.ts +0 -200
- package/bundled-types/bb-plugin-sdk-provider-bridge-testing.d.ts +0 -440
- package/bundled-types/bb-plugin-sdk-provider-bridge.d.ts +0 -665
- package/bundled-types/bb-plugin-sdk-testing.d.ts +0 -16
- package/bundled-types/bb-plugin-sdk.d.ts +31 -284
- package/dist/ai-services.js +5 -1
- package/dist/internal/host-policy.js +95 -108
- package/dist/provider-bridge-acp.js +113 -623
- package/dist/provider-bridge-testing.js +175 -580
- package/dist/provider-bridge-worker-entry.mjs +15 -9
- package/dist/provider-bridge.js +62 -557
- package/dist/testing/index.js +133 -114
- package/package.json +1 -1
package/dist/ai-services.js
CHANGED
|
@@ -55,7 +55,11 @@ var experimental_aiInferenceCompleteInputSchema = z2.object({
|
|
|
55
55
|
timeoutMs: z2.number().int().positive()
|
|
56
56
|
}).strict();
|
|
57
57
|
var experimental_aiInferenceCompleteOutputSchema = z2.union([
|
|
58
|
-
z2.object({
|
|
58
|
+
z2.object({
|
|
59
|
+
ok: z2.literal(true),
|
|
60
|
+
model: z2.string().min(1),
|
|
61
|
+
value: jsonObjectSchema
|
|
62
|
+
}).strict(),
|
|
59
63
|
failureSchema
|
|
60
64
|
]);
|
|
61
65
|
var experimental_aiVoiceTranscribeInputSchema = z2.object({
|
|
@@ -511,9 +511,7 @@ function normalizeProviderBridgeOptions(providerId, value, label = "experimental
|
|
|
511
511
|
return current;
|
|
512
512
|
}
|
|
513
513
|
if (typeof current !== "object") {
|
|
514
|
-
throw new Error(
|
|
515
|
-
`provider "${providerId}" ${label}${path} must be JSON`
|
|
516
|
-
);
|
|
514
|
+
throw new Error(`provider "${providerId}" ${label}${path} must be JSON`);
|
|
517
515
|
}
|
|
518
516
|
if (active.has(current)) {
|
|
519
517
|
throw new Error(
|
|
@@ -549,9 +547,7 @@ function normalizeProviderBridgeOptions(providerId, value, label = "experimental
|
|
|
549
547
|
}
|
|
550
548
|
const normalized = visit(value, "");
|
|
551
549
|
if (normalized === null || Array.isArray(normalized) || typeof normalized !== "object") {
|
|
552
|
-
throw new Error(
|
|
553
|
-
`provider "${providerId}" ${label} must be an object`
|
|
554
|
-
);
|
|
550
|
+
throw new Error(`provider "${providerId}" ${label} must be an object`);
|
|
555
551
|
}
|
|
556
552
|
if (Buffer.byteLength(JSON.stringify(normalized), "utf8") > PLUGIN_PROVIDER_BRIDGE_OPTIONS_MAX_BYTES) {
|
|
557
553
|
throw new Error(
|
|
@@ -574,9 +570,7 @@ function requireNonBlankString(args) {
|
|
|
574
570
|
}
|
|
575
571
|
function validateProviderStrings(providerId, value) {
|
|
576
572
|
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
577
|
-
throw new Error(
|
|
578
|
-
`provider "${providerId}" strings must be an object`
|
|
579
|
-
);
|
|
573
|
+
throw new Error(`provider "${providerId}" strings must be an object`);
|
|
580
574
|
}
|
|
581
575
|
const record = Object.fromEntries(
|
|
582
576
|
Object.entries(value)
|
|
@@ -778,7 +772,9 @@ function validateProviderNativeRoots(providerId, field, value) {
|
|
|
778
772
|
}
|
|
779
773
|
return Object.freeze({
|
|
780
774
|
user: Object.freeze(wire.data.user.map((root) => Object.freeze(root))),
|
|
781
|
-
project: Object.freeze(
|
|
775
|
+
project: Object.freeze(
|
|
776
|
+
wire.data.project.map((root) => Object.freeze(root))
|
|
777
|
+
)
|
|
782
778
|
});
|
|
783
779
|
}
|
|
784
780
|
var PROVIDER_MODEL_CATALOG_SCOPES = [
|
|
@@ -798,9 +794,7 @@ function validateProviderModelCatalogScope(providerId, value) {
|
|
|
798
794
|
}
|
|
799
795
|
function validateProviderFallbackModels(providerId, value) {
|
|
800
796
|
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
801
|
-
throw new Error(
|
|
802
|
-
`provider "${providerId}" models must be an object`
|
|
803
|
-
);
|
|
797
|
+
throw new Error(`provider "${providerId}" models must be an object`);
|
|
804
798
|
}
|
|
805
799
|
const fallback = Reflect.get(value, "fallback");
|
|
806
800
|
if (fallback === void 0) {
|
|
@@ -818,95 +812,95 @@ function validateProviderFallbackModels(providerId, value) {
|
|
|
818
812
|
}
|
|
819
813
|
const seen = /* @__PURE__ */ new Set();
|
|
820
814
|
let defaults = 0;
|
|
821
|
-
const normalized = fallback.map(
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
const record = Object.fromEntries(
|
|
827
|
-
Object.entries(entry)
|
|
828
|
-
);
|
|
829
|
-
const id = requireNonBlankString({
|
|
830
|
-
providerId,
|
|
831
|
-
field: `${field}.id`,
|
|
832
|
-
value: record.id
|
|
833
|
-
});
|
|
834
|
-
if (seen.has(id)) {
|
|
835
|
-
throw new Error(
|
|
836
|
-
`provider "${providerId}" models.fallback id ${JSON.stringify(id)} is duplicated`
|
|
837
|
-
);
|
|
838
|
-
}
|
|
839
|
-
seen.add(id);
|
|
840
|
-
const displayName = requireNonBlankString({
|
|
841
|
-
providerId,
|
|
842
|
-
field: `${field}.displayName`,
|
|
843
|
-
value: record.displayName
|
|
844
|
-
});
|
|
845
|
-
const description = requireNonBlankString({
|
|
846
|
-
providerId,
|
|
847
|
-
field: `${field}.description`,
|
|
848
|
-
value: record.description
|
|
849
|
-
});
|
|
850
|
-
const efforts = record.supportedReasoningEfforts;
|
|
851
|
-
if (!Array.isArray(efforts) || efforts.length === 0) {
|
|
852
|
-
throw new Error(
|
|
853
|
-
`provider "${providerId}" ${field}.supportedReasoningEfforts must be a non-empty array`
|
|
854
|
-
);
|
|
855
|
-
}
|
|
856
|
-
const levels = /* @__PURE__ */ new Set();
|
|
857
|
-
const supportedReasoningEfforts = efforts.map(
|
|
858
|
-
(effort, effortIndex) => {
|
|
859
|
-
if (typeof effort !== "object" || effort === null || Array.isArray(effort)) {
|
|
860
|
-
throw new Error(
|
|
861
|
-
`provider "${providerId}" ${field}.supportedReasoningEfforts[${effortIndex}] must be { reasoningEffort, description }`
|
|
862
|
-
);
|
|
863
|
-
}
|
|
864
|
-
const reasoningEffort = Reflect.get(effort, "reasoningEffort");
|
|
865
|
-
if (typeof reasoningEffort !== "string" || !PLUGIN_PROVIDER_REASONING_LEVEL_VALUES.includes(
|
|
866
|
-
reasoningEffort
|
|
867
|
-
)) {
|
|
868
|
-
throw new Error(
|
|
869
|
-
`provider "${providerId}" ${field}.supportedReasoningEfforts[${effortIndex}].reasoningEffort must be one of ${PLUGIN_PROVIDER_REASONING_LEVEL_VALUES.join(", ")}`
|
|
870
|
-
);
|
|
871
|
-
}
|
|
872
|
-
const level = reasoningEffort;
|
|
873
|
-
if (levels.has(level)) {
|
|
874
|
-
throw new Error(
|
|
875
|
-
`provider "${providerId}" ${field}.supportedReasoningEfforts repeats ${JSON.stringify(level)}`
|
|
876
|
-
);
|
|
877
|
-
}
|
|
878
|
-
levels.add(level);
|
|
879
|
-
return Object.freeze({
|
|
880
|
-
reasoningEffort: level,
|
|
881
|
-
description: requireNonBlankString({
|
|
882
|
-
providerId,
|
|
883
|
-
field: `${field}.supportedReasoningEfforts[${effortIndex}].description`,
|
|
884
|
-
value: Reflect.get(effort, "description")
|
|
885
|
-
})
|
|
886
|
-
});
|
|
815
|
+
const normalized = fallback.map(
|
|
816
|
+
(entry, index) => {
|
|
817
|
+
const field = `models.fallback[${index}]`;
|
|
818
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
|
|
819
|
+
throw new Error(`provider "${providerId}" ${field} must be an object`);
|
|
887
820
|
}
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
if (typeof defaultReasoningEffort !== "string" || !levels.has(defaultReasoningEffort)) {
|
|
891
|
-
throw new Error(
|
|
892
|
-
`provider "${providerId}" ${field}.defaultReasoningEffort must be one of its supportedReasoningEfforts`
|
|
821
|
+
const record = Object.fromEntries(
|
|
822
|
+
Object.entries(entry)
|
|
893
823
|
);
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
824
|
+
const id = requireNonBlankString({
|
|
825
|
+
providerId,
|
|
826
|
+
field: `${field}.id`,
|
|
827
|
+
value: record.id
|
|
828
|
+
});
|
|
829
|
+
if (seen.has(id)) {
|
|
830
|
+
throw new Error(
|
|
831
|
+
`provider "${providerId}" models.fallback id ${JSON.stringify(id)} is duplicated`
|
|
832
|
+
);
|
|
833
|
+
}
|
|
834
|
+
seen.add(id);
|
|
835
|
+
const displayName = requireNonBlankString({
|
|
836
|
+
providerId,
|
|
837
|
+
field: `${field}.displayName`,
|
|
838
|
+
value: record.displayName
|
|
839
|
+
});
|
|
840
|
+
const description = requireNonBlankString({
|
|
841
|
+
providerId,
|
|
842
|
+
field: `${field}.description`,
|
|
843
|
+
value: record.description
|
|
844
|
+
});
|
|
845
|
+
const efforts = record.supportedReasoningEfforts;
|
|
846
|
+
if (!Array.isArray(efforts) || efforts.length === 0) {
|
|
847
|
+
throw new Error(
|
|
848
|
+
`provider "${providerId}" ${field}.supportedReasoningEfforts must be a non-empty array`
|
|
849
|
+
);
|
|
850
|
+
}
|
|
851
|
+
const levels = /* @__PURE__ */ new Set();
|
|
852
|
+
const supportedReasoningEfforts = efforts.map(
|
|
853
|
+
(effort, effortIndex) => {
|
|
854
|
+
if (typeof effort !== "object" || effort === null || Array.isArray(effort)) {
|
|
855
|
+
throw new Error(
|
|
856
|
+
`provider "${providerId}" ${field}.supportedReasoningEfforts[${effortIndex}] must be { reasoningEffort, description }`
|
|
857
|
+
);
|
|
858
|
+
}
|
|
859
|
+
const reasoningEffort = Reflect.get(effort, "reasoningEffort");
|
|
860
|
+
if (typeof reasoningEffort !== "string" || !PLUGIN_PROVIDER_REASONING_LEVEL_VALUES.includes(reasoningEffort)) {
|
|
861
|
+
throw new Error(
|
|
862
|
+
`provider "${providerId}" ${field}.supportedReasoningEfforts[${effortIndex}].reasoningEffort must be one of ${PLUGIN_PROVIDER_REASONING_LEVEL_VALUES.join(", ")}`
|
|
863
|
+
);
|
|
864
|
+
}
|
|
865
|
+
const level = reasoningEffort;
|
|
866
|
+
if (levels.has(level)) {
|
|
867
|
+
throw new Error(
|
|
868
|
+
`provider "${providerId}" ${field}.supportedReasoningEfforts repeats ${JSON.stringify(level)}`
|
|
869
|
+
);
|
|
870
|
+
}
|
|
871
|
+
levels.add(level);
|
|
872
|
+
return Object.freeze({
|
|
873
|
+
reasoningEffort: level,
|
|
874
|
+
description: requireNonBlankString({
|
|
875
|
+
providerId,
|
|
876
|
+
field: `${field}.supportedReasoningEfforts[${effortIndex}].description`,
|
|
877
|
+
value: Reflect.get(effort, "description")
|
|
878
|
+
})
|
|
879
|
+
});
|
|
880
|
+
}
|
|
898
881
|
);
|
|
882
|
+
const defaultReasoningEffort = record.defaultReasoningEffort;
|
|
883
|
+
if (typeof defaultReasoningEffort !== "string" || !levels.has(defaultReasoningEffort)) {
|
|
884
|
+
throw new Error(
|
|
885
|
+
`provider "${providerId}" ${field}.defaultReasoningEffort must be one of its supportedReasoningEfforts`
|
|
886
|
+
);
|
|
887
|
+
}
|
|
888
|
+
if (typeof record.isDefault !== "boolean") {
|
|
889
|
+
throw new Error(
|
|
890
|
+
`provider "${providerId}" ${field}.isDefault must be a boolean`
|
|
891
|
+
);
|
|
892
|
+
}
|
|
893
|
+
if (record.isDefault) defaults += 1;
|
|
894
|
+
return Object.freeze({
|
|
895
|
+
id,
|
|
896
|
+
displayName,
|
|
897
|
+
description,
|
|
898
|
+
supportedReasoningEfforts: Object.freeze(supportedReasoningEfforts),
|
|
899
|
+
defaultReasoningEffort,
|
|
900
|
+
isDefault: record.isDefault
|
|
901
|
+
});
|
|
899
902
|
}
|
|
900
|
-
|
|
901
|
-
return Object.freeze({
|
|
902
|
-
id,
|
|
903
|
-
displayName,
|
|
904
|
-
description,
|
|
905
|
-
supportedReasoningEfforts: Object.freeze(supportedReasoningEfforts),
|
|
906
|
-
defaultReasoningEffort,
|
|
907
|
-
isDefault: record.isDefault
|
|
908
|
-
});
|
|
909
|
-
});
|
|
903
|
+
);
|
|
910
904
|
if (normalized.length > 0 && defaults !== 1) {
|
|
911
905
|
throw new Error(
|
|
912
906
|
`provider "${providerId}" models.fallback must mark exactly one model isDefault (found ${defaults})`
|
|
@@ -968,9 +962,7 @@ function validatePluginAiServiceDeclaration(declaration) {
|
|
|
968
962
|
}
|
|
969
963
|
const displayName = typeof declaration.displayName === "string" ? declaration.displayName.trim() : "";
|
|
970
964
|
if (displayName.length === 0 || displayName.length > 64) {
|
|
971
|
-
throw new Error(
|
|
972
|
-
`AI service "${id}" displayName must be 1-64 characters`
|
|
973
|
-
);
|
|
965
|
+
throw new Error(`AI service "${id}" displayName must be 1-64 characters`);
|
|
974
966
|
}
|
|
975
967
|
const kinds = declaration.kinds;
|
|
976
968
|
if (!Array.isArray(kinds) || kinds.length === 0) {
|
|
@@ -1206,10 +1198,7 @@ function validatePluginProviderDeclaration(declaration) {
|
|
|
1206
1198
|
field: "reasoningLevels",
|
|
1207
1199
|
value: declaration.reasoningLevels
|
|
1208
1200
|
});
|
|
1209
|
-
const extensionKinds = declaration.extensionKinds === void 0 ? void 0 : validateProviderExtensionKinds(
|
|
1210
|
-
id,
|
|
1211
|
-
declaration.extensionKinds
|
|
1212
|
-
);
|
|
1201
|
+
const extensionKinds = declaration.extensionKinds === void 0 ? void 0 : validateProviderExtensionKinds(id, declaration.extensionKinds);
|
|
1213
1202
|
const fallbackModels = declaration.models === void 0 ? void 0 : validateProviderFallbackModels(id, declaration.models);
|
|
1214
1203
|
const modelCatalogScope = validateProviderModelCatalogScope(
|
|
1215
1204
|
id,
|
|
@@ -1470,9 +1459,7 @@ function parsePluginAgentToolPresentation(toolName, value) {
|
|
|
1470
1459
|
return null;
|
|
1471
1460
|
}
|
|
1472
1461
|
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
1473
|
-
throw new Error(
|
|
1474
|
-
`tool "${toolName}" presentation must be an object`
|
|
1475
|
-
);
|
|
1462
|
+
throw new Error(`tool "${toolName}" presentation must be an object`);
|
|
1476
1463
|
}
|
|
1477
1464
|
const declared = value;
|
|
1478
1465
|
const presentation = {};
|