@workerkit/core 0.3.10 → 0.3.11
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/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,17 @@ and the package adheres to [Semantic Versioning](https://semver.org/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.3.11] - 2026-10-06
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- `decisionProfileId` chooses the classifier a decision or hybrid worker uses, independently of its language model: as a kit default (`kit_validate`, `kit_publish`, `kit_update`, `kit_replace`), on `decision_worker_create`, `worker_deploy` and `deployment_update`, and for a single run on `worker_run` or `run_bulk`. Omitted, the configured classifier applies (Jev by default).
|
|
14
|
+
- `run_bulk` accepts `sourceArgs`, `answers` and `maxItems` per worker, as `worker_run` does.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- `models_list` documents its `decisionProfiles` list: the enabled classifiers, such as Jev and OpenAI Decisions, with their prices and capabilities.
|
|
19
|
+
|
|
9
20
|
## [0.3.10] - 2026-10-06
|
|
10
21
|
|
|
11
22
|
### Added
|
|
@@ -28,6 +28,7 @@ export const createDecisionWorker = {
|
|
|
28
28
|
maxItems: z.number().int().min(1).max(50).default(20),
|
|
29
29
|
operatorId: z.string().uuid().optional(),
|
|
30
30
|
deploy: z.boolean().default(false).describe("Create a hosted deployment too. Does not execute a run."),
|
|
31
|
+
decisionProfileId: z.string().min(1).max(64).optional().describe("Default classifier for the kit and worker: a profileId from models_list.decisionProfiles. Omit for Jev. Independent of deployment and spend settings."),
|
|
31
32
|
maxUsdPerRun: z.number().min(0.01).max(1000).optional(),
|
|
32
33
|
maxUsdPerDay: z.number().min(0.01).max(10000).optional(),
|
|
33
34
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-authoring.js","sourceRoot":"","sources":["../../src/descriptors/decision-authoring.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"../zod.js\";\nimport { CREATE, type ToolDescriptor } from \"./types.js\";\n\nconst key = z.string().regex(/^(?=.{1,40}$)[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/);\nconst base = { key, instructions: z.string().min(1).max(4000) };\nexport const decisionQuestion = z.discriminatedUnion(\"type\", [\n z.object({ ...base, type: z.literal(\"choice\"), options: z.record(key, z.string().min(1).max(200)).refine(options => {\n const entries = Object.entries(options);\n return entries.length >= 1 && entries.length <= 20 && entries.every(([name, description]) => name !== \"unclear\" && description.trim().length > 0 && name.length + 3 + description.length <= 200);\n }, \"Provide 1–20 options excluding unclear; each name and description must fit in 200 characters including the separator.\") }).strict(),\n z.object({ ...base, type: z.literal(\"score\"), levels: z.array(z.string().min(1).max(200)).min(2).max(10) }).strict(),\n z.object({ ...base, type: z.literal(\"noul\"), trueMeaning: z.string().max(200).optional(), falseMeaning: z.string().max(200).optional() }).strict(),\n]);\n\nexport const createDecisionWorker: ToolDescriptor = {\n name: \"decision_worker_create\",\n title: \"Create Decision Worker\",\n description: \"Create a reusable classifier to categorize, score, filter or triage connected data. First discover source recipes with kit_app_tools(purpose:'decision'); kit_authoring_guide(section:'decision') has examples. Creates a private kit and worker atomically; optionally deploys, never runs. Questions and source mappings compile deterministically into the ordinary decision specification. Source filters do not narrow the recipe's read permissions. Requires publishKits + installKits, plus manageDeployments when deploy:true. Reuse requestId and the identical body to recover the original receipt after a timeout; changed body returns 409. Returns tokenId for lifecycle commands, stable workerId, kitSlug, readiness, deployment/error and exact nextCall arguments. Follow nextCall, then worker_run/run_get. A deployment error means the worker already exists. Choice adds unclear automatically; setup answers adjust categories/levels later. Creation returns no worker API secret. For arbitrary sources/actions use kit_validate → kit_publish(private) → kit_install.\",\n auth: \"manager\", method: \"post\", path: \"/api/manage/decision-workers\",\n strictInput: true,\n schema: {\n requestId: z.string().min(1).max(128).regex(/^[!-~]+$/).describe(\"Unique creation id. Reuse with the same body on retries; new id creates a new worker.\"),\n name: z.string().min(1).max(100),\n source: z.object({\n recipe: z.enum([\"email-previews\", \"calendar-events\", \"sheets-rows\"]),\n args: z.record(z.unknown()).optional().describe(\"Arguments from the discovered recipe's argsSchema. No placeholders. Sheets requires fileId, range and columns.\"),\n }).strict(),\n questions: z.array(decisionQuestion).min(1).max(8).describe(\"Independent questions with unique keys. Choice: 1–20 options, excluding reserved unclear; name + description ≤200 chars. Score: ordered levels, lowest first. Noul: probability of a statement.\"),\n confidenceFloor: z.number().min(0).max(1).describe(\"Required confidence threshold; uncertain choices/scores are flagged, not omitted. Not an accuracy guarantee.\"),\n maxItems: z.number().int().min(1).max(50).default(20),\n operatorId: z.string().uuid().optional(),\n deploy: z.boolean().default(false).describe(\"Create a hosted deployment too. Does not execute a run.\"),\n maxUsdPerRun: z.number().min(0.01).max(1000).optional(),\n maxUsdPerDay: z.number().min(0.01).max(10000).optional(),\n },\n outputSchema: {\n tokenId: z.number().int().positive().describe(\"Use with existing worker tools and CLI commands.\"),\n workerId: z.string().uuid(), kitSlug: z.string(), modelType: z.literal(\"decision\"), workerUrl: z.string(),\n readiness: z.record(z.unknown()).nullable(), deployment: z.record(z.unknown()).nullable(),\n deploymentError: z.record(z.unknown()).nullable(), warnings: z.array(z.string()),\n nextCall: z.object({ tool: z.string(), arguments: z.record(z.unknown()) }),\n },\n annotations: { ...CREATE, idempotentHint: true },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"decision-authoring.js","sourceRoot":"","sources":["../../src/descriptors/decision-authoring.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"../zod.js\";\nimport { CREATE, type ToolDescriptor } from \"./types.js\";\n\nconst key = z.string().regex(/^(?=.{1,40}$)[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/);\nconst base = { key, instructions: z.string().min(1).max(4000) };\nexport const decisionQuestion = z.discriminatedUnion(\"type\", [\n z.object({ ...base, type: z.literal(\"choice\"), options: z.record(key, z.string().min(1).max(200)).refine(options => {\n const entries = Object.entries(options);\n return entries.length >= 1 && entries.length <= 20 && entries.every(([name, description]) => name !== \"unclear\" && description.trim().length > 0 && name.length + 3 + description.length <= 200);\n }, \"Provide 1–20 options excluding unclear; each name and description must fit in 200 characters including the separator.\") }).strict(),\n z.object({ ...base, type: z.literal(\"score\"), levels: z.array(z.string().min(1).max(200)).min(2).max(10) }).strict(),\n z.object({ ...base, type: z.literal(\"noul\"), trueMeaning: z.string().max(200).optional(), falseMeaning: z.string().max(200).optional() }).strict(),\n]);\n\nexport const createDecisionWorker: ToolDescriptor = {\n name: \"decision_worker_create\",\n title: \"Create Decision Worker\",\n description: \"Create a reusable classifier to categorize, score, filter or triage connected data. First discover source recipes with kit_app_tools(purpose:'decision'); kit_authoring_guide(section:'decision') has examples. Creates a private kit and worker atomically; optionally deploys, never runs. Questions and source mappings compile deterministically into the ordinary decision specification. Source filters do not narrow the recipe's read permissions. Requires publishKits + installKits, plus manageDeployments when deploy:true. Reuse requestId and the identical body to recover the original receipt after a timeout; changed body returns 409. Returns tokenId for lifecycle commands, stable workerId, kitSlug, readiness, deployment/error and exact nextCall arguments. Follow nextCall, then worker_run/run_get. A deployment error means the worker already exists. Choice adds unclear automatically; setup answers adjust categories/levels later. Creation returns no worker API secret. For arbitrary sources/actions use kit_validate → kit_publish(private) → kit_install.\",\n auth: \"manager\", method: \"post\", path: \"/api/manage/decision-workers\",\n strictInput: true,\n schema: {\n requestId: z.string().min(1).max(128).regex(/^[!-~]+$/).describe(\"Unique creation id. Reuse with the same body on retries; new id creates a new worker.\"),\n name: z.string().min(1).max(100),\n source: z.object({\n recipe: z.enum([\"email-previews\", \"calendar-events\", \"sheets-rows\"]),\n args: z.record(z.unknown()).optional().describe(\"Arguments from the discovered recipe's argsSchema. No placeholders. Sheets requires fileId, range and columns.\"),\n }).strict(),\n questions: z.array(decisionQuestion).min(1).max(8).describe(\"Independent questions with unique keys. Choice: 1–20 options, excluding reserved unclear; name + description ≤200 chars. Score: ordered levels, lowest first. Noul: probability of a statement.\"),\n confidenceFloor: z.number().min(0).max(1).describe(\"Required confidence threshold; uncertain choices/scores are flagged, not omitted. Not an accuracy guarantee.\"),\n maxItems: z.number().int().min(1).max(50).default(20),\n operatorId: z.string().uuid().optional(),\n deploy: z.boolean().default(false).describe(\"Create a hosted deployment too. Does not execute a run.\"),\n decisionProfileId: z.string().min(1).max(64).optional().describe(\"Default classifier for the kit and worker: a profileId from models_list.decisionProfiles. Omit for Jev. Independent of deployment and spend settings.\"),\n maxUsdPerRun: z.number().min(0.01).max(1000).optional(),\n maxUsdPerDay: z.number().min(0.01).max(10000).optional(),\n },\n outputSchema: {\n tokenId: z.number().int().positive().describe(\"Use with existing worker tools and CLI commands.\"),\n workerId: z.string().uuid(), kitSlug: z.string(), modelType: z.literal(\"decision\"), workerUrl: z.string(),\n readiness: z.record(z.unknown()).nullable(), deployment: z.record(z.unknown()).nullable(),\n deploymentError: z.record(z.unknown()).nullable(), warnings: z.array(z.string()),\n nextCall: z.object({ tool: z.string(), arguments: z.record(z.unknown()) }),\n },\n annotations: { ...CREATE, idempotentHint: true },\n};\n"]}
|
|
@@ -16,6 +16,7 @@ const API = "/api/manage/workers";
|
|
|
16
16
|
// ─── Shared phrasing ────────────────────────────────────────────────────────
|
|
17
17
|
const TOKEN_ID_HINT = "The worker's numeric tokenId, as returned by workers_list. 404 not_found = no such worker on this account (another account's is indistinguishable by design).";
|
|
18
18
|
const RUN_ID_HINT = "The run's UUID, as returned by worker_run (runId), workers_list (currentRunId / lastRun.runId), or worker_runs.";
|
|
19
|
+
const DECISION_PROFILE_HINT = "Classifier choice: a profileId from models_list.decisionProfiles, independent of the language model. Platform-funded for decision and hybrid workers. Review sample results and confidence thresholds when changing providers. Omit to keep the configured classifier (Jev by default).";
|
|
19
20
|
// The whole runs family shares this degradation mode; teach it once per tool so
|
|
20
21
|
// agents never retry-loop a 422.
|
|
21
22
|
const RUNTIME_NOTE = " 422 RUNTIME_NOT_ENABLED = hosted runs are switched off in this environment — a capability, not a transient error: do not retry; every non-run tool keeps working.";
|
|
@@ -105,6 +106,7 @@ const runWorker = {
|
|
|
105
106
|
schema: {
|
|
106
107
|
tokenId: z.number().int().min(1).describe(TOKEN_ID_HINT),
|
|
107
108
|
prompt: z.string().max(8000).optional().describe("Language and hybrid workers: what to do on THIS run (≤8000 chars). Omit to run the worker's standing instructions unchanged."),
|
|
109
|
+
decisionProfileId: z.string().min(1).max(64).optional().describe(DECISION_PROFILE_HINT),
|
|
108
110
|
modelSlug: z.string().max(64).optional().describe("Language and hybrid workers: one-off model override for this run (≤64 chars). Omit to use the worker's configured model."),
|
|
109
111
|
sourceArgs: z.record(z.string(), z.unknown()).optional().describe("Workers with classification: narrow what is decided about — values merged over the spec's source arguments for THIS run only (a ticket id, a query, a status, a window such as after: \"-14d\" or endDate: \"+48h\" — relative bounds are resolved by the platform when the read runs, so never compute a date). A plain object, no placeholders; the read still runs under the worker's own permissions, so it can only see what the worker can."),
|
|
110
112
|
answers: z.record(z.string(), z.string()).optional().describe("Workers with classification: answers to the worker's install questions for THIS run only, laid over its stored answers per key and never saved — how a caller names a searcher kit's target ({ \"target-name\": \"Acme Corp\" }) without touching the worker's setup, so two callers on one worker never see each other's. Validated against the kit's own form like instruction_set and bound the way the run will bind them, so a row that cannot bind (a category clashing with a built-in option, a ladder outside 2–10 levels) is a 400 naming it here, never a failed run. A list question takes a JSON array string or ';'-separated rows; a question not named keeps its stored answer or the kit's default."),
|
|
@@ -115,6 +117,7 @@ const runWorker = {
|
|
|
115
117
|
bodyBuilder: (params) => ({
|
|
116
118
|
prompt: params.prompt,
|
|
117
119
|
modelSlug: params.modelSlug,
|
|
120
|
+
decisionProfileId: params.decisionProfileId,
|
|
118
121
|
sourceArgs: params.sourceArgs,
|
|
119
122
|
answers: params.answers,
|
|
120
123
|
maxItems: params.maxItems,
|
|
@@ -125,7 +128,7 @@ const runWorker = {
|
|
|
125
128
|
const runWorkersBulk = {
|
|
126
129
|
name: "run_bulk",
|
|
127
130
|
title: "Run Workers in Bulk",
|
|
128
|
-
description: "Run several workers now in ONE call — a prompt fanned out across a fleet without spending the single trigger's 30/min budget one worker at a time. Up to 20 workers per call, each named by workerId (preferred) or its deprecated tokenId (the GUID wins when both are sent), each with its own optional prompt and
|
|
131
|
+
description: "Run several workers now in ONE call — a prompt fanned out across a fleet without spending the single trigger's 30/min budget one worker at a time. Up to 20 workers per call, each named by workerId (preferred) or its deprecated tokenId (the GUID wins when both are sent), each with its own optional prompt, modelSlug, decisionProfileId, sourceArgs, answers and maxItems. IT IS NOT ATOMIC AND IT DOES NOT STOP: every worker passes the mint gauntlet on its own, so an unknown id, a missing deployment or a cap already hit is reported on THAT item (success false, errorCode, error) and the loop goes on to the next — a stale id in a fan-out never discards the nineteen runs that were fine. A SKIPPED RECEIPT IS A SUCCESS HERE: a run was minted and its status/skipReason say why it did not start, so read items[] and never the status code or minted alone. Each successful item carries runId, status, skipReason and errorCode; run_events and run_get take the runId from there. Recorded as API-triggered runs, attributed to the manager key's minter. Own window: 2 calls per minute and 20 per hour per ACCOUNT, on top of the surface windows. Requires the runWorkers scope." +
|
|
129
132
|
RUNTIME_NOTE,
|
|
130
133
|
auth: "manager",
|
|
131
134
|
method: "post",
|
|
@@ -136,6 +139,10 @@ const runWorkersBulk = {
|
|
|
136
139
|
tokenId: z.number().int().min(1).optional().describe("The worker's deprecated numeric token ID. workerId wins when both are sent."),
|
|
137
140
|
prompt: z.string().max(8000).optional().describe("What THIS worker should do on this run (≤8000 chars). Omit to run its standing instructions unchanged."),
|
|
138
141
|
modelSlug: z.string().max(64).optional().describe("One-off model override for this worker's run (≤64 chars). Omit to use its configured model."),
|
|
142
|
+
decisionProfileId: runWorker.schema.decisionProfileId,
|
|
143
|
+
sourceArgs: runWorker.schema.sourceArgs,
|
|
144
|
+
answers: runWorker.schema.answers,
|
|
145
|
+
maxItems: runWorker.schema.maxItems,
|
|
139
146
|
}))
|
|
140
147
|
.min(1)
|
|
141
148
|
.max(20)
|
|
@@ -1047,7 +1054,7 @@ const DEPLOYMENT_NOTE = " A worker with NO DEPLOYMENT is configuration only: its
|
|
|
1047
1054
|
const listModels = {
|
|
1048
1055
|
name: "models_list",
|
|
1049
1056
|
title: "List Deployable Models",
|
|
1050
|
-
description: "The models this ACCOUNT may deploy a worker on, priced per million tokens — the picker for worker_deploy's modelSlug. Each row carries slug (the value deployment calls take), displayName, provider, inputUsdPerMTok / outputUsdPerMTok / cachedInputUsdPerMTok / cacheWriteInputUsdPerMTok, contextWindowK, minTier, recommended, and the reasoning vocabulary. A MODEL ABSENT FROM THIS LIST IS NOT DEPLOYABLE HERE — either the account's tier does not reach it or no live provider serves it — so never pass a slug you read somewhere else; that is a 400 one call later. reasoningStyle says what the deployment's thinking field accepts FOR THAT MODEL: 'budget' takes a per-turn token count AS A STRING ('1024', between thinkingBudgetMin and thinkingBudgetMax), 'effort' takes one of reasoningEffortOptions ('high'), 'none' takes only 'default' or 'off'. Sending the wrong kind is 400 invalid_thinking. byokProviders lists the providers this account holds its own API key for (model_keys_list) — a run on a model from one of those bills the account's key plus a platform fee instead of the wallet. Pass kitSlug to have the kit's own recommendation marked recommended:true; without it nothing is marked. Language and hybrid workers: a DECISION worker (worker_get modelType 'decision') runs the decision model and takes no modelSlug. Requires readWorkers." +
|
|
1057
|
+
description: "The models this ACCOUNT may deploy a worker on, priced per million tokens — the picker for worker_deploy's modelSlug. Each row carries slug (the value deployment calls take), displayName, provider, inputUsdPerMTok / outputUsdPerMTok / cachedInputUsdPerMTok / cacheWriteInputUsdPerMTok, contextWindowK, minTier, recommended, and the reasoning vocabulary. A MODEL ABSENT FROM THIS LIST IS NOT DEPLOYABLE HERE — either the account's tier does not reach it or no live provider serves it — so never pass a slug you read somewhere else; that is a 400 one call later. reasoningStyle says what the deployment's thinking field accepts FOR THAT MODEL: 'budget' takes a per-turn token count AS A STRING ('1024', between thinkingBudgetMin and thinkingBudgetMax), 'effort' takes one of reasoningEffortOptions ('high'), 'none' takes only 'default' or 'off'. Sending the wrong kind is 400 invalid_thinking. byokProviders lists the providers this account holds its own API key for (model_keys_list) — a run on a model from one of those bills the account's key plus a platform fee instead of the wallet. Pass kitSlug to have the kit's own recommendation marked recommended:true; without it nothing is marked. The separate decisionProfiles list contains enabled classifiers, their prices and supported capabilities; pass a row's profileId as decisionProfileId to decision_worker_create, worker_deploy, deployment_update, worker_run or run_bulk, or as a kit's default. Language and hybrid workers: a DECISION worker (worker_get modelType 'decision') runs the decision model and takes no modelSlug. Requires readWorkers." +
|
|
1051
1058
|
RUNTIME_NOTE,
|
|
1052
1059
|
auth: "manager",
|
|
1053
1060
|
method: "get",
|
|
@@ -1093,6 +1100,7 @@ const deployWorker = {
|
|
|
1093
1100
|
method: "post",
|
|
1094
1101
|
schema: {
|
|
1095
1102
|
tokenId: z.number().int().min(1).describe(TOKEN_ID_HINT),
|
|
1103
|
+
decisionProfileId: z.string().min(1).max(64).optional().describe(DECISION_PROFILE_HINT),
|
|
1096
1104
|
modelSlug: z.string().max(64).optional().describe("Model to run on, from models_list (its slug field). Omit to take the kit's recommended model — 400 model_required when the kit named none."),
|
|
1097
1105
|
maxUsdPerRun: z.number().min(0.01).max(1000).optional().describe("Hard per-run ceiling in USD, 0.01-1000 — also the amount reserved from the wallet at dispatch, so it is what a run must be able to AFFORD to start. Omit for the platform default."),
|
|
1098
1106
|
maxUsdPerDay: z.number().min(0.01).max(10000).optional().describe("Ceiling on this worker's RESERVED spend per day, 0.01-10000. Must be at least maxUsdPerRun. Omit for the platform default."),
|
|
@@ -1102,6 +1110,7 @@ const deployWorker = {
|
|
|
1102
1110
|
path: (params) => `${API}/${params.tokenId}/deployment`,
|
|
1103
1111
|
bodyBuilder: (params) => ({
|
|
1104
1112
|
modelSlug: params.modelSlug,
|
|
1113
|
+
decisionProfileId: params.decisionProfileId,
|
|
1105
1114
|
maxUsdPerRun: params.maxUsdPerRun,
|
|
1106
1115
|
maxUsdPerDay: params.maxUsdPerDay,
|
|
1107
1116
|
thinking: params.thinking,
|
|
@@ -1120,6 +1129,7 @@ const updateDeployment = {
|
|
|
1120
1129
|
method: "patch",
|
|
1121
1130
|
schema: {
|
|
1122
1131
|
tokenId: z.number().int().min(1).describe(TOKEN_ID_HINT),
|
|
1132
|
+
decisionProfileId: z.string().min(1).max(64).optional().describe(DECISION_PROFILE_HINT),
|
|
1123
1133
|
modelSlug: z.string().max(64).optional().describe("New model, from models_list. Omit to keep. Read the thinking interplay in the description before changing it."),
|
|
1124
1134
|
maxUsdPerRun: z.number().min(0.01).max(1000).optional().describe("New per-run ceiling in USD, 0.01-1000. Must stay at or below maxUsdPerDay. Omit to keep."),
|
|
1125
1135
|
maxUsdPerDay: z.number().min(0.01).max(10000).optional().describe("New per-day reserved-spend ceiling, 0.01-10000. Must be at least maxUsdPerRun. Omit to keep."),
|
|
@@ -1130,6 +1140,7 @@ const updateDeployment = {
|
|
|
1130
1140
|
path: (params) => `${API}/${params.tokenId}/deployment`,
|
|
1131
1141
|
bodyBuilder: (params) => ({
|
|
1132
1142
|
modelSlug: params.modelSlug,
|
|
1143
|
+
decisionProfileId: params.decisionProfileId,
|
|
1133
1144
|
maxUsdPerRun: params.maxUsdPerRun,
|
|
1134
1145
|
maxUsdPerDay: params.maxUsdPerDay,
|
|
1135
1146
|
thinking: params.thinking,
|
|
@@ -1193,6 +1204,7 @@ const LISTING_SCHEMA = {
|
|
|
1193
1204
|
publisherName: z.string().min(3).max(80).optional().describe("Required on this account's FIRST publish only (creates the publisher profile; globally unique, 409 if taken). Ignored afterwards — rename with publisher_set."),
|
|
1194
1205
|
appDescriptions: z.array(z.record(z.unknown())).optional().describe("Per PINNED app: {code, description ≤600, tools:[{key, description ≤300}]} — every key must be an operation the kit grants; describing a slot member is a rejection. Shape: kit_authoring_guide section 'schema'."),
|
|
1195
1206
|
recommendedClients: z.array(z.string().max(40)).max(10).optional().describe("≤10 client names, ≤40 chars each, e.g. claude, chatgpt, cursor."),
|
|
1207
|
+
decisionProfileId: z.string().min(1).max(64).optional().describe("Default classifier for new workers: jev-default (Jev, the default) or openai-luna. Decision and hybrid kits only; owners may override it on their worker or for one run."),
|
|
1196
1208
|
recommendedModel: z.string().max(80).optional().describe("Display-only recommended model name (≤80)."),
|
|
1197
1209
|
declaredModelFloor: z.string().max(80).optional().describe("Display-only minimum model (≤80)."),
|
|
1198
1210
|
modelScores: z.array(z.record(z.unknown())).max(10).optional().describe("≤10 of {model, score 0-100, notes ≤300} — only for models the kit was actually run on."),
|
|
@@ -1293,6 +1305,7 @@ const updateKit = {
|
|
|
1293
1305
|
appDescriptions: LISTING_SCHEMA.appDescriptions,
|
|
1294
1306
|
recommendedClients: LISTING_SCHEMA.recommendedClients,
|
|
1295
1307
|
recommendedModel: LISTING_SCHEMA.recommendedModel,
|
|
1308
|
+
decisionProfileId: LISTING_SCHEMA.decisionProfileId,
|
|
1296
1309
|
declaredModelFloor: LISTING_SCHEMA.declaredModelFloor,
|
|
1297
1310
|
modelScores: LISTING_SCHEMA.modelScores,
|
|
1298
1311
|
isProtected: LISTING_SCHEMA.isProtected,
|