@workerkit/core 0.3.12 → 0.3.14
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 +30 -7
- package/README.md +32 -9
- package/dist/descriptors/actions.js +48 -23
- package/dist/descriptors/actions.js.map +1 -1
- package/dist/descriptors/decision-authoring.js +2 -1
- package/dist/descriptors/decision-authoring.js.map +1 -1
- package/dist/descriptors/directory.js +4 -4
- package/dist/descriptors/directory.js.map +1 -1
- package/dist/descriptors/index.d.ts +1 -1
- package/dist/descriptors/index.js +1 -1
- package/dist/descriptors/index.js.map +1 -1
- package/dist/descriptors/manage.js +48 -23
- package/dist/descriptors/manage.js.map +1 -1
- package/dist/descriptors/support.d.ts +2 -0
- package/dist/descriptors/support.js +35 -0
- package/dist/descriptors/support.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/docs/hybrid-workers.md +7 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,29 @@ and the package adheres to [Semantic Versioning](https://semver.org/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.3.14] - 2026-10-09
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- `worker_timezone_set` sets a worker's own timezone, which its local dates, the local times in its app results and the times in its reports follow. It recomputes the daily schedules that follow the worker, leaves schedules that have their own timezone unchanged, and needs the `manageSchedules` scope.
|
|
14
|
+
- `kit_install`, `decision_worker_create` and `action_worker_create` take `timeZoneId` to set the new worker's timezone, and tell the agent to ask the worker's creator for it rather than guess it from connected calendars. Omitted, the worker uses UTC.
|
|
15
|
+
- `support_request_create` contacts WorkerKit support on the user's behalf about an error the agent cannot fix, a bug, an app WorkerKit does not offer yet, or a general question, and returns a `PE-XXXXXX` reference. It needs no scope, but the key must belong to an active user of the account, who receives the reply by email. WorkerKit keys and bearer tokens in the subject and message are redacted before the request leaves the process.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- `schedule_create` and `schedule_update` say that a schedule's own timezone only decides when it fires, and point to `worker_timezone_set` for the worker's timezone.
|
|
20
|
+
- `worker_permissions_get` says that no tool changes a worker's permissions: the agent tells the user what to switch on under the worker's Apps & access on the dashboard, then reads the permissions again to confirm.
|
|
21
|
+
|
|
22
|
+
## [0.3.13] - 2026-10-08
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- Tool descriptions cover Action workers wherever a worker's kind matters. `worker_get` and `workers_list` list all four `modelType` values (`language`, `decision`, `hybrid` and `none` for an Action worker), and `worker_get` names the `readiness.canInvoke` flag. `worker_run`, `worker_deploy`, `instruction_get`, `instruction_set`, `schedule_create`, `models_list`, `deployments_list`, `deployment_get`, `fleet_health` and `kit_install` say how an Action worker answers them, and `kits_search`, `kit_install_preview`, `kit_authoring_guide`, `kit_app_tools` and `workerkit_about` name the Action kind.
|
|
27
|
+
- The five Action tools describe every parameter, the shape of a call's answer, the refusals that come before the app is reached, and when a refused write is retried under a new key.
|
|
28
|
+
- `kit_validate`, `kit_publish` and `kit_replace` describe an Action kit's content: `modelType: "none"`, an `actionSpec` of 1-64 tools, and no model, schedules, triggers, category slots or `appCodes`.
|
|
29
|
+
- `app_connect` and `app_disconnect` point to `apps_list` for the current provider codes instead of listing them.
|
|
30
|
+
- The hybrid worker guide's notes on `models_list` and input validation are brought up to date.
|
|
31
|
+
|
|
9
32
|
## [0.3.12] - 2026-10-07
|
|
10
33
|
|
|
11
34
|
### Added
|
|
@@ -121,13 +144,13 @@ Adds worker_decision_set with strict classifier, answer and revision inputs. Hyb
|
|
|
121
144
|
|
|
122
145
|
- **`worker_run.preview`** and **`deployment_update.decisionMode`** — Preview
|
|
123
146
|
mode is gone from the platform: every decision run is live and its routing
|
|
124
|
-
table's actions execute
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
147
|
+
table's actions execute. The server ignores a `preview` sent by an older
|
|
148
|
+
client, so do not rely on it for a dry run; `instruction_get` no longer
|
|
149
|
+
reports a mode, the per-item rows say `executed` / `ok` on every run, and the
|
|
150
|
+
outcome line opens with "Judged" or "Ranked" rather than a mode word. The
|
|
151
|
+
descriptions that contrasted live with preview no longer do:
|
|
152
|
+
`kit_install_preview` and `worker_deploy` simply say the table acts from the
|
|
153
|
+
worker's first run.
|
|
131
154
|
|
|
132
155
|
## [0.3.4] - 2026-09-18
|
|
133
156
|
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
|
|
8
8
|
The shareable [WorkerKit](https://workerkit.ai) surface: an HTTP API client, the
|
|
9
|
-
declarative tool-descriptor registry (
|
|
9
|
+
declarative tool-descriptor registry (97 authenticated fleet-management tools +
|
|
10
10
|
9 anonymous kits-directory tools), and the single wire-execution path that turns
|
|
11
11
|
a descriptor plus parameters into one HTTP operation.
|
|
12
12
|
|
|
@@ -92,6 +92,16 @@ shows which types the saved bot read scopes allow. Message search needs a user
|
|
|
92
92
|
token with `search:read`; reading history needs the channel ID, the matching
|
|
93
93
|
history scopes and bot membership, and covers one conversation.
|
|
94
94
|
|
|
95
|
+
## Worker kinds
|
|
96
|
+
|
|
97
|
+
`worker_get` and `workers_list` report each worker's `modelType`, the same
|
|
98
|
+
vocabulary as a kit's: `language` runs an instruction on a model chosen at
|
|
99
|
+
deployment, `decision` runs a routing table on the decision model, `hybrid`
|
|
100
|
+
classifies and then hands the selected items to one language-model agent, and
|
|
101
|
+
`none` is an Action worker, described below. The kind decides which fields
|
|
102
|
+
`worker_run` and `instruction_set` accept, and whether a worker is deployed at
|
|
103
|
+
all.
|
|
104
|
+
|
|
95
105
|
## Classification followed by an agent task
|
|
96
106
|
|
|
97
107
|
A hybrid worker classifies a bounded source window and runs one language-model agent
|
|
@@ -112,13 +122,13 @@ there is no preview mode, and unsupported run controls, including those in
|
|
|
112
122
|
|
|
113
123
|
## Action workers
|
|
114
124
|
|
|
115
|
-
An Action worker
|
|
116
|
-
model or a hosted deployment.
|
|
117
|
-
reviewed MCP apps, their tool
|
|
118
|
-
|
|
119
|
-
an
|
|
120
|
-
|
|
121
|
-
catalog later must be selected by hand.
|
|
125
|
+
An Action worker exposes explicitly selected, typed app tools that a caller
|
|
126
|
+
invokes directly, without a reasoning model or a hosted deployment.
|
|
127
|
+
`action_worker_options` lists the native and reviewed MCP apps, their tool
|
|
128
|
+
schemas and the server's defaults. Creating one with `action_worker_create` and
|
|
129
|
+
an `app` copies that app's default tools once; an explicit `actionSpec` can
|
|
130
|
+
instead select up to 64 tools across apps. Omitting `app` selects Slack, and
|
|
131
|
+
tools added to the catalog later must be selected by hand.
|
|
122
132
|
|
|
123
133
|
Read a worker's tool schemas with `worker_tools` before calling one with
|
|
124
134
|
`worker_tool_call`, which takes `tokenId`, `toolName`, `arguments` and an
|
|
@@ -127,10 +137,23 @@ optional `contractVersion: 1` and `idempotencyKey`. The key travels in the
|
|
|
127
137
|
each intended write its own key and keep it for transport retries. Poll
|
|
128
138
|
`worker_tool_invocation` for pending results, and never automatically resend
|
|
129
139
|
an `outcome_unknown` call with a new key: the app may already have acted. A
|
|
130
|
-
|
|
140
|
+
refusal marked `retryable` can be tried again later under a new key. A call
|
|
141
|
+
cannot change the saved tool selection, connection or sender, and a
|
|
131
142
|
changed tool contract needs an explicit owner review and save. Generic write
|
|
132
143
|
receipts keep the confirmation without storing private app response bodies.
|
|
133
144
|
|
|
145
|
+
A call answers with `status` `succeeded`, `denied`, `failed`, `in_progress` or
|
|
146
|
+
`outcome_unknown`, plus `invocationId` on a write (reads leave no receipt).
|
|
147
|
+
Repeating a write's key with the same arguments returns the stored receipt
|
|
148
|
+
without calling the app again; the same key with different arguments is a 409
|
|
149
|
+
`idempotency_conflict`.
|
|
150
|
+
|
|
151
|
+
An Action worker reports `modelType: "none"` and `deployment: null`, and
|
|
152
|
+
`readiness.canInvoke` says whether its tools can be called now. It is never
|
|
153
|
+
deployed or run: `worker_run` and `worker_deploy` refuse it with
|
|
154
|
+
`400 action_worker_requires_invoke`, and it takes no instruction, schedule or
|
|
155
|
+
trigger.
|
|
156
|
+
|
|
134
157
|
Discovery needs `readWorkers`, creation needs `publishKits` and `installKits`,
|
|
135
158
|
and calls and receipts need `invokeActions`; existing manager keys may need
|
|
136
159
|
that scope granted explicitly.
|
|
@@ -1,31 +1,49 @@
|
|
|
1
1
|
import { z } from "../zod.js";
|
|
2
2
|
import { CREATE, READ_ONLY, TRIGGER } from "./types.js";
|
|
3
3
|
export const actionSpecSchema = z.object({
|
|
4
|
-
schemaVersion: z.literal(1),
|
|
4
|
+
schemaVersion: z.literal(1).describe("Always 1."),
|
|
5
5
|
tools: z.array(z.object({
|
|
6
|
-
ref: z.string().min(1).max(128).regex(/^[A-Za-z0-9_-]+$/)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
ref: z.string().min(1).max(128).regex(/^[A-Za-z0-9_-]+$/)
|
|
7
|
+
.describe("A tool name exactly as action_worker_options lists it in tools[].name, from any of its apps."),
|
|
8
|
+
version: z.literal(1).default(1).describe("Always 1."),
|
|
9
|
+
contractHash: z.string().regex(/^[A-Fa-f0-9]{64}$/).optional()
|
|
10
|
+
.describe("Optional pin, present when the selection is copied from a kit's actionSpec: creation is refused if that tool's contract changed since."),
|
|
11
|
+
}).strict()).min(1).max(64).describe("1-64 tools, each listed once."),
|
|
12
|
+
}).strict().describe("An explicit tool selection instead of the app's defaults: {schemaVersion: 1, tools: [{ref, version: 1}]}.");
|
|
13
|
+
// invokeActions is younger than most keys: the same snapshot rule as every newer scope.
|
|
14
|
+
const INVOKE_SCOPE_NOTE = " A key minted before invokeActions existed does not carry it (even one minted with \"all\"): a 403 here is fixed by an account admin re-scoping or re-minting the key at https://workerkit.ai, never by retrying — check key_info's scopes first.";
|
|
15
|
+
const worker = {
|
|
16
|
+
tokenId: z.number().int().positive()
|
|
17
|
+
.describe("The Action worker's numeric tokenId, as returned by workers_list or action_worker_create (modelType none on worker_get). 404 not_found = no such Action worker on this account."),
|
|
18
|
+
};
|
|
12
19
|
export const actionDescriptors = [
|
|
13
20
|
{
|
|
14
21
|
name: "action_worker_options", title: "Action Worker Setup", auth: "manager", method: "get",
|
|
15
22
|
path: "/api/manage/workers/action-options", strictInput: true,
|
|
16
|
-
description: "Get available apps, reviewed tool contracts, the selected app's default tools and any required connections for creating an Action worker. Connection IDs and sender identities are server-owned. Requires readWorkers; creates and executes nothing.",
|
|
17
|
-
schema: {
|
|
23
|
+
description: "Get available apps, reviewed tool contracts, the selected app's default tools and any required connections for creating an Action worker: a worker with no model, instruction or deployment, whose selected app tools a caller invokes directly with worker_tool_call (modelType none). Connection IDs and sender identities are server-owned. Requires readWorkers; creates and executes nothing.",
|
|
24
|
+
schema: {
|
|
25
|
+
operatorId: z.string().uuid().optional()
|
|
26
|
+
.describe("The operator (workspace) to read connections for, as a GUID from apps_list → operators[]. Omit for the account's default operator."),
|
|
27
|
+
app: z.string().min(1).max(128).optional()
|
|
28
|
+
.describe("The app whose tools and defaultTools to return, exactly as apps[].code lists it. Omit for Slack."),
|
|
29
|
+
},
|
|
30
|
+
annotations: READ_ONLY,
|
|
18
31
|
},
|
|
19
32
|
{
|
|
20
33
|
name: "action_worker_create", title: "Create Action Worker", auth: "manager", method: "post",
|
|
21
34
|
path: "/api/manage/workers/actions", strictInput: true,
|
|
22
|
-
description: "Create a private Action kit and worker for an app from action_worker_options. No model or deployment. The server copies that app's default tools once; optionally provide an explicit actionSpec of up to 64 tools across apps. Slack tools require a fixed bot connection. Only explicit owner edits change installed tools. Requires publishKits and installKits. Reuse requestId with the same body after a timeout; never create a second worker to recover a lost response.",
|
|
35
|
+
description: "Create a private Action kit and worker for an app from action_worker_options. No model or deployment. The server copies that app's default tools once; optionally provide an explicit actionSpec of up to 64 tools across apps. Slack tools require a fixed bot connection. Only explicit owner edits change installed tools. Requires publishKits and installKits. Reuse requestId with the same body after a timeout; never create a second worker to recover a lost response. Returns tokenId, workerId, kitSlug and modelType none, and no worker key. The worker is never deployed or run (worker_run and worker_deploy refuse it with 400 action_worker_requires_invoke): call worker_tools next, then worker_tool_call.",
|
|
23
36
|
schema: {
|
|
24
|
-
requestId: z.string().min(1).max(128)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
37
|
+
requestId: z.string().min(1).max(128)
|
|
38
|
+
.describe("Your idempotency key for this creation. Repeat it only with the identical body, to recover a timed-out call's result; a different body under the same requestId is 409 request_conflict."),
|
|
39
|
+
name: z.string().min(1).max(100).describe("Name for the new worker and its private kit."),
|
|
40
|
+
timeZoneId: z.string().trim().min(1).max(64).optional().describe("The worker's timezone, as an IANA id such as America/New_York. Ask the worker creator for it if it is not already known; never guess it from connected calendars or the server's clock. Omitted means UTC."),
|
|
41
|
+
app: z.string().min(1).max(128).optional()
|
|
42
|
+
.describe("The app whose default tools are copied when actionSpec is omitted, exactly as action_worker_options apps[].code lists it. Omit for Slack."),
|
|
43
|
+
slackConnectionId: z.number().int().positive().optional()
|
|
44
|
+
.describe("Slack tools only: the bot connection to pin, an id from action_worker_options connections[] (app slack). A sole usable connection is selected automatically."),
|
|
45
|
+
operatorId: z.string().uuid().optional()
|
|
46
|
+
.describe("The operator (workspace) to create the worker on, as a GUID from apps_list → operators[]. Omit for the account's default operator."),
|
|
29
47
|
actionSpec: actionSpecSchema.optional(),
|
|
30
48
|
},
|
|
31
49
|
annotations: { ...CREATE, idempotentHint: true },
|
|
@@ -33,19 +51,22 @@ export const actionDescriptors = [
|
|
|
33
51
|
{
|
|
34
52
|
name: "worker_tools", title: "List Action Worker Tools", auth: "manager", method: "get",
|
|
35
53
|
path: p => `/api/manage/workers/${p.tokenId}/tools`, paramFilter: () => ({}), strictInput: true,
|
|
36
|
-
description: "Discover the saved tools, exact input/output schemas, connection and sender of an Action worker. Requires readWorkers. Select a named tool and supply its declared inputs using worker_tool_call. Discovery does not grant execution permission; current policy is checked on each call.",
|
|
54
|
+
description: "Discover the saved tools, exact input/output schemas, connection and sender of an Action worker. Requires readWorkers. Select a named tool and supply its declared inputs using worker_tool_call. Discovery does not grant execution permission; current policy is checked on each call. Each tools[] entry carries name (the toolName), inputSchema, outputSchema, readOnly (false = a write, which needs an idempotencyKey) and available (false = not callable now: the tool left the catalog, its contract changed or, for a Slack tool, its bot connection is missing, until the owner reviews and re-saves the selection). availableTools are not callable until the owner selects them.",
|
|
37
55
|
schema: worker, annotations: READ_ONLY,
|
|
38
56
|
},
|
|
39
57
|
{
|
|
40
58
|
name: "worker_tool_call", title: "Call Action Worker Tool", auth: "manager", method: "post",
|
|
41
59
|
path: p => `/api/manage/workers/${p.tokenId}/tools/${encodeURIComponent(String(p.toolName))}/invoke`, strictInput: true,
|
|
42
|
-
description: "Execute exactly one saved Action worker tool with structured inputs, without a model. Discover worker_tools first. Requires invokeActions. Cannot change tools, connection, sender or permissions. Supply a unique idempotencyKey for each intended write and reuse it for transport retries. A repeated key never resends. For in_progress poll worker_tool_invocation. outcome_unknown means the app may have completed the action: do not automatically retry or issue a new key. Generic write receipts retain confirmation but not private app response content. Never resend to recover a lost response body.",
|
|
60
|
+
description: "Execute exactly one saved Action worker tool with structured inputs, without a model. Discover worker_tools first. Requires invokeActions. Cannot change tools, connection, sender or permissions. Supply a unique idempotencyKey for each intended write and reuse it for transport retries. A repeated key never resends: it replays the first answer, so a refusal with error.retryable true is retried later under a new key. For in_progress poll worker_tool_invocation. outcome_unknown means the app may have completed the action: do not automatically retry or issue a new key. Generic write receipts retain confirmation but not private app response content. Never resend to recover a lost response body. The answer is {invocationId, tool, status, result, error, replayed, contractVersion} with status succeeded | denied | failed | in_progress | outcome_unknown; invocationId is set on writes only (reads leave no receipt). Refusals before the app is reached use the {error, message, code} envelope: 403 tool_not_exposed, 409 tool_contract_changed (the owner must re-save the selection), 409 idempotency_conflict (same key, different arguments), 400 invalid_request (arguments that do not match inputSchema)." + INVOKE_SCOPE_NOTE,
|
|
43
61
|
schema: {
|
|
44
62
|
...worker,
|
|
45
|
-
toolName: z.string().min(1).max(128)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
63
|
+
toolName: z.string().min(1).max(128)
|
|
64
|
+
.describe("A tools[].name from worker_tools for this worker, exactly."),
|
|
65
|
+
contractVersion: z.literal(1).default(1).describe("Always 1."),
|
|
66
|
+
arguments: z.record(z.unknown())
|
|
67
|
+
.describe("The tool's inputs, exactly as its inputSchema in worker_tools declares them, with their JSON types. Send {} for a tool that takes none."),
|
|
68
|
+
idempotencyKey: z.string().min(1).max(128).regex(/^[!-~]+$/).optional()
|
|
69
|
+
.describe("Required on a write tool (readOnly false in worker_tools): 1-128 printable characters, one per intended write. The same key with the same arguments returns the stored receipt without calling the app again; with different arguments it is 409 idempotency_conflict. Reads need none."),
|
|
49
70
|
},
|
|
50
71
|
bodyBuilder: p => ({ contractVersion: p.contractVersion, arguments: p.arguments }),
|
|
51
72
|
headerBuilder: (p) => p.idempotencyKey ? { "Idempotency-Key": String(p.idempotencyKey) } : {},
|
|
@@ -54,8 +75,12 @@ export const actionDescriptors = [
|
|
|
54
75
|
{
|
|
55
76
|
name: "worker_tool_invocation", title: "Read Action Invocation", auth: "manager", method: "get",
|
|
56
77
|
path: p => `/api/manage/workers/${p.tokenId}/tool-invocations/${p.invocationId}`, paramFilter: () => ({}), strictInput: true,
|
|
57
|
-
description: "Read an Action invocation's status and effect references. Requires invokeActions. Does not execute or retry anything. Unknown outcomes must not be automatically resent.",
|
|
58
|
-
schema: {
|
|
78
|
+
description: "Read an Action invocation's status and effect references. Requires invokeActions. Does not execute or retry anything. Unknown outcomes must not be automatically resent. A write still in_progress after two minutes reads as outcome_unknown: check the app itself before deciding anything." + INVOKE_SCOPE_NOTE,
|
|
79
|
+
schema: {
|
|
80
|
+
...worker,
|
|
81
|
+
invocationId: z.string().uuid().describe("The invocationId a worker_tool_call answer carried for a write."),
|
|
82
|
+
},
|
|
83
|
+
annotations: READ_ONLY,
|
|
59
84
|
},
|
|
60
85
|
];
|
|
61
86
|
//# sourceMappingURL=actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/descriptors/actions.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"../zod.js\";\nimport { CREATE, READ_ONLY, TRIGGER, type ToolDescriptor } from \"./types.js\";\n\nexport const actionSpecSchema = z.object({\n schemaVersion: z.literal(1),\n tools: z.array(z.object({\n ref: z.string().min(1).max(128).regex(/^[A-Za-z0-9_-]+$/),\n version: z.literal(1).default(1),\n contractHash: z.string().regex(/^[A-Fa-f0-9]{64}$/).optional(),\n }).strict()).min(1).max(64),\n}).strict();\nconst worker = { tokenId: z.number().int().positive() };\n\nexport const actionDescriptors: readonly ToolDescriptor[] = [\n {\n name: \"action_worker_options\", title: \"Action Worker Setup\", auth: \"manager\", method: \"get\",\n path: \"/api/manage/workers/action-options\", strictInput: true,\n description: \"Get available apps, reviewed tool contracts, the selected app's default tools and any required connections for creating an Action worker. Connection IDs and sender identities are server-owned. Requires readWorkers; creates and executes nothing.\",\n schema: { operatorId: z.string().uuid().optional(), app: z.string().min(1).max(128).optional() }, annotations: READ_ONLY,\n },\n {\n name: \"action_worker_create\", title: \"Create Action Worker\", auth: \"manager\", method: \"post\",\n path: \"/api/manage/workers/actions\", strictInput: true,\n description: \"Create a private Action kit and worker for an app from action_worker_options. No model or deployment. The server copies that app's default tools once; optionally provide an explicit actionSpec of up to 64 tools across apps. Slack tools require a fixed bot connection. Only explicit owner edits change installed tools. Requires publishKits and installKits. Reuse requestId with the same body after a timeout; never create a second worker to recover a lost response.\",\n schema: {\n requestId: z.string().min(1).max(128),\n name: z.string().min(1).max(100),\n app: z.string().min(1).max(128).optional(),\n slackConnectionId: z.number().int().positive().optional(),\n operatorId: z.string().uuid().optional(),\n actionSpec: actionSpecSchema.optional(),\n },\n annotations: { ...CREATE, idempotentHint: true },\n },\n {\n name: \"worker_tools\", title: \"List Action Worker Tools\", auth: \"manager\", method: \"get\",\n path: p => `/api/manage/workers/${p.tokenId}/tools`, paramFilter: () => ({}), strictInput: true,\n description: \"Discover the saved tools, exact input/output schemas, connection and sender of an Action worker. Requires readWorkers. Select a named tool and supply its declared inputs using worker_tool_call. Discovery does not grant execution permission; current policy is checked on each call.\",\n schema: worker, annotations: READ_ONLY,\n },\n {\n name: \"worker_tool_call\", title: \"Call Action Worker Tool\", auth: \"manager\", method: \"post\",\n path: p => `/api/manage/workers/${p.tokenId}/tools/${encodeURIComponent(String(p.toolName))}/invoke`, strictInput: true,\n description: \"Execute exactly one saved Action worker tool with structured inputs, without a model. Discover worker_tools first. Requires invokeActions. Cannot change tools, connection, sender or permissions. Supply a unique idempotencyKey for each intended write and reuse it for transport retries. A repeated key never resends. For in_progress poll worker_tool_invocation. outcome_unknown means the app may have completed the action: do not automatically retry or issue a new key. Generic write receipts retain confirmation but not private app response content. Never resend to recover a lost response body.\",\n schema: {\n ...worker,\n toolName: z.string().min(1).max(128),\n contractVersion: z.literal(1).default(1),\n arguments: z.record(z.unknown()),\n idempotencyKey: z.string().min(1).max(128).regex(/^[!-~]+$/).optional(),\n },\n bodyBuilder: p => ({ contractVersion: p.contractVersion, arguments: p.arguments }),\n headerBuilder: (p): Record<string, string> => p.idempotencyKey ? { \"Idempotency-Key\": String(p.idempotencyKey) } : {},\n requestTimeoutMs: () => 90_000, annotations: { ...TRIGGER, idempotentHint: false },\n },\n {\n name: \"worker_tool_invocation\", title: \"Read Action Invocation\", auth: \"manager\", method: \"get\",\n path: p => `/api/manage/workers/${p.tokenId}/tool-invocations/${p.invocationId}`, paramFilter: () => ({}), strictInput: true,\n description: \"Read an Action invocation's status and effect references. Requires invokeActions. Does not execute or retry anything. Unknown outcomes must not be automatically resent.\",\n schema: { ...worker, invocationId: z.string().uuid() }, annotations: READ_ONLY,\n },\n];\n"]}
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/descriptors/actions.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"../zod.js\";\nimport { CREATE, READ_ONLY, TRIGGER, type ToolDescriptor } from \"./types.js\";\n\nexport const actionSpecSchema = z.object({\n schemaVersion: z.literal(1).describe(\"Always 1.\"),\n tools: z.array(z.object({\n ref: z.string().min(1).max(128).regex(/^[A-Za-z0-9_-]+$/)\n .describe(\"A tool name exactly as action_worker_options lists it in tools[].name, from any of its apps.\"),\n version: z.literal(1).default(1).describe(\"Always 1.\"),\n contractHash: z.string().regex(/^[A-Fa-f0-9]{64}$/).optional()\n .describe(\"Optional pin, present when the selection is copied from a kit's actionSpec: creation is refused if that tool's contract changed since.\"),\n }).strict()).min(1).max(64).describe(\"1-64 tools, each listed once.\"),\n}).strict().describe(\"An explicit tool selection instead of the app's defaults: {schemaVersion: 1, tools: [{ref, version: 1}]}.\");\n\n// invokeActions is younger than most keys: the same snapshot rule as every newer scope.\nconst INVOKE_SCOPE_NOTE =\n \" A key minted before invokeActions existed does not carry it (even one minted with \\\"all\\\"): a 403 here is fixed by an account admin re-scoping or re-minting the key at https://workerkit.ai, never by retrying — check key_info's scopes first.\";\n\nconst worker = {\n tokenId: z.number().int().positive()\n .describe(\"The Action worker's numeric tokenId, as returned by workers_list or action_worker_create (modelType none on worker_get). 404 not_found = no such Action worker on this account.\"),\n};\n\nexport const actionDescriptors: readonly ToolDescriptor[] = [\n {\n name: \"action_worker_options\", title: \"Action Worker Setup\", auth: \"manager\", method: \"get\",\n path: \"/api/manage/workers/action-options\", strictInput: true,\n description: \"Get available apps, reviewed tool contracts, the selected app's default tools and any required connections for creating an Action worker: a worker with no model, instruction or deployment, whose selected app tools a caller invokes directly with worker_tool_call (modelType none). Connection IDs and sender identities are server-owned. Requires readWorkers; creates and executes nothing.\",\n schema: {\n operatorId: z.string().uuid().optional()\n .describe(\"The operator (workspace) to read connections for, as a GUID from apps_list → operators[]. Omit for the account's default operator.\"),\n app: z.string().min(1).max(128).optional()\n .describe(\"The app whose tools and defaultTools to return, exactly as apps[].code lists it. Omit for Slack.\"),\n },\n annotations: READ_ONLY,\n },\n {\n name: \"action_worker_create\", title: \"Create Action Worker\", auth: \"manager\", method: \"post\",\n path: \"/api/manage/workers/actions\", strictInput: true,\n description: \"Create a private Action kit and worker for an app from action_worker_options. No model or deployment. The server copies that app's default tools once; optionally provide an explicit actionSpec of up to 64 tools across apps. Slack tools require a fixed bot connection. Only explicit owner edits change installed tools. Requires publishKits and installKits. Reuse requestId with the same body after a timeout; never create a second worker to recover a lost response. Returns tokenId, workerId, kitSlug and modelType none, and no worker key. The worker is never deployed or run (worker_run and worker_deploy refuse it with 400 action_worker_requires_invoke): call worker_tools next, then worker_tool_call.\",\n schema: {\n requestId: z.string().min(1).max(128)\n .describe(\"Your idempotency key for this creation. Repeat it only with the identical body, to recover a timed-out call's result; a different body under the same requestId is 409 request_conflict.\"),\n name: z.string().min(1).max(100).describe(\"Name for the new worker and its private kit.\"),\n timeZoneId: z.string().trim().min(1).max(64).optional().describe(\"The worker's timezone, as an IANA id such as America/New_York. Ask the worker creator for it if it is not already known; never guess it from connected calendars or the server's clock. Omitted means UTC.\"),\n app: z.string().min(1).max(128).optional()\n .describe(\"The app whose default tools are copied when actionSpec is omitted, exactly as action_worker_options apps[].code lists it. Omit for Slack.\"),\n slackConnectionId: z.number().int().positive().optional()\n .describe(\"Slack tools only: the bot connection to pin, an id from action_worker_options connections[] (app slack). A sole usable connection is selected automatically.\"),\n operatorId: z.string().uuid().optional()\n .describe(\"The operator (workspace) to create the worker on, as a GUID from apps_list → operators[]. Omit for the account's default operator.\"),\n actionSpec: actionSpecSchema.optional(),\n },\n annotations: { ...CREATE, idempotentHint: true },\n },\n {\n name: \"worker_tools\", title: \"List Action Worker Tools\", auth: \"manager\", method: \"get\",\n path: p => `/api/manage/workers/${p.tokenId}/tools`, paramFilter: () => ({}), strictInput: true,\n description: \"Discover the saved tools, exact input/output schemas, connection and sender of an Action worker. Requires readWorkers. Select a named tool and supply its declared inputs using worker_tool_call. Discovery does not grant execution permission; current policy is checked on each call. Each tools[] entry carries name (the toolName), inputSchema, outputSchema, readOnly (false = a write, which needs an idempotencyKey) and available (false = not callable now: the tool left the catalog, its contract changed or, for a Slack tool, its bot connection is missing, until the owner reviews and re-saves the selection). availableTools are not callable until the owner selects them.\",\n schema: worker, annotations: READ_ONLY,\n },\n {\n name: \"worker_tool_call\", title: \"Call Action Worker Tool\", auth: \"manager\", method: \"post\",\n path: p => `/api/manage/workers/${p.tokenId}/tools/${encodeURIComponent(String(p.toolName))}/invoke`, strictInput: true,\n description: \"Execute exactly one saved Action worker tool with structured inputs, without a model. Discover worker_tools first. Requires invokeActions. Cannot change tools, connection, sender or permissions. Supply a unique idempotencyKey for each intended write and reuse it for transport retries. A repeated key never resends: it replays the first answer, so a refusal with error.retryable true is retried later under a new key. For in_progress poll worker_tool_invocation. outcome_unknown means the app may have completed the action: do not automatically retry or issue a new key. Generic write receipts retain confirmation but not private app response content. Never resend to recover a lost response body. The answer is {invocationId, tool, status, result, error, replayed, contractVersion} with status succeeded | denied | failed | in_progress | outcome_unknown; invocationId is set on writes only (reads leave no receipt). Refusals before the app is reached use the {error, message, code} envelope: 403 tool_not_exposed, 409 tool_contract_changed (the owner must re-save the selection), 409 idempotency_conflict (same key, different arguments), 400 invalid_request (arguments that do not match inputSchema).\" + INVOKE_SCOPE_NOTE,\n schema: {\n ...worker,\n toolName: z.string().min(1).max(128)\n .describe(\"A tools[].name from worker_tools for this worker, exactly.\"),\n contractVersion: z.literal(1).default(1).describe(\"Always 1.\"),\n arguments: z.record(z.unknown())\n .describe(\"The tool's inputs, exactly as its inputSchema in worker_tools declares them, with their JSON types. Send {} for a tool that takes none.\"),\n idempotencyKey: z.string().min(1).max(128).regex(/^[!-~]+$/).optional()\n .describe(\"Required on a write tool (readOnly false in worker_tools): 1-128 printable characters, one per intended write. The same key with the same arguments returns the stored receipt without calling the app again; with different arguments it is 409 idempotency_conflict. Reads need none.\"),\n },\n bodyBuilder: p => ({ contractVersion: p.contractVersion, arguments: p.arguments }),\n headerBuilder: (p): Record<string, string> => p.idempotencyKey ? { \"Idempotency-Key\": String(p.idempotencyKey) } : {},\n requestTimeoutMs: () => 90_000, annotations: { ...TRIGGER, idempotentHint: false },\n },\n {\n name: \"worker_tool_invocation\", title: \"Read Action Invocation\", auth: \"manager\", method: \"get\",\n path: p => `/api/manage/workers/${p.tokenId}/tool-invocations/${p.invocationId}`, paramFilter: () => ({}), strictInput: true,\n description: \"Read an Action invocation's status and effect references. Requires invokeActions. Does not execute or retry anything. Unknown outcomes must not be automatically resent. A write still in_progress after two minutes reads as outcome_unknown: check the app itself before deciding anything.\" + INVOKE_SCOPE_NOTE,\n schema: {\n ...worker,\n invocationId: z.string().uuid().describe(\"The invocationId a worker_tool_call answer carried for a write.\"),\n },\n annotations: READ_ONLY,\n },\n];\n"]}
|
|
@@ -13,12 +13,13 @@ export const decisionQuestion = z.discriminatedUnion("type", [
|
|
|
13
13
|
export const createDecisionWorker = {
|
|
14
14
|
name: "decision_worker_create",
|
|
15
15
|
title: "Create Decision Worker",
|
|
16
|
-
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
|
|
16
|
+
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 decision sources or routed actions use kit_validate → kit_publish(private) → kit_install.",
|
|
17
17
|
auth: "manager", method: "post", path: "/api/manage/decision-workers",
|
|
18
18
|
strictInput: true,
|
|
19
19
|
schema: {
|
|
20
20
|
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."),
|
|
21
21
|
name: z.string().min(1).max(100),
|
|
22
|
+
timeZoneId: z.string().trim().min(1).max(64).optional().describe("The worker's timezone, as an IANA id such as America/New_York. Ask the worker creator for it if it is not already known; never guess it from connected calendars or the server's clock. Omitted means UTC."),
|
|
22
23
|
source: z.object({
|
|
23
24
|
recipe: z.enum(["email-previews", "calendar-events", "sheets-rows"]),
|
|
24
25
|
args: z.record(z.unknown()).optional().describe("Arguments from the discovered recipe's argsSchema. No placeholders. Sheets requires fileId, range and columns."),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-authoring.js","sourceRoot":"","sources":["../../src/descriptors/decision-authoring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,WAAW,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAuB,MAAM,YAAY,CAAC;AAEzD,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;AAC5E,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC3D,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YACjH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;QACnM,CAAC,EAAE,uHAAuH,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;IACvI,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;IACpH,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;CACnJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,IAAI,EAAE,wBAAwB;IAC9B,KAAK,EAAE,wBAAwB;IAC/B,WAAW,EAAE,
|
|
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 decision sources or routed 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 timeZoneId: z.string().trim().min(1).max(64).optional().describe(\"The worker's timezone, as an IANA id such as America/New_York. Ask the worker creator for it if it is not already known; never guess it from connected calendars or the server's clock. Omitted means UTC.\"),\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"]}
|
|
@@ -125,7 +125,7 @@ const directoryOverview = {
|
|
|
125
125
|
const searchKits = {
|
|
126
126
|
name: "kits_search",
|
|
127
127
|
title: "Search Kits",
|
|
128
|
-
description: "Search and browse the public WorkerKit kits directory. A kit is a pre-built AI worker template — a job instruction plus exact, pre-scoped app permissions (and often schedules) — that a human installs as a working AI worker in one click. All filters AND together; every value is optional (omit everything to browse the whole catalog). Returns {items, totalCount, page, pageSize}; each card: slug (the key for kit_get), name, jobSentence (what the worker does, one line), publisherName/publisherSlug/isOfficialPublisher/verificationTier, apps (app codes it uses) + categorySlots (capability slots where the installer picks the app, e.g. Slack vs Teams), categories, triggerModes, downloadCount, starCount, modelScores (publisher-declared 0-100 fit per model, best first) + recommendedModel, modelType ('language' | 'decision' — see the filter), isProtected (publisher withholds the instruction TEXT; the kit still fully works — not a red flag), isFeatured, publishedAt. An empty result is not an error — see the footer it returns; valid category/app/appCategory/model filter values come from directory_overview. Kit page for humans: https://workerkit.ai/kit/{slug}." +
|
|
128
|
+
description: "Search and browse the public WorkerKit kits directory. A kit is a pre-built AI worker template — a job instruction (on a decision kit, a routing table; on an Action kit, selected app tools and no model) plus exact, pre-scoped app permissions (and often schedules) — that a human installs as a working AI worker in one click. All filters AND together; every value is optional (omit everything to browse the whole catalog). Returns {items, totalCount, page, pageSize}; each card: slug (the key for kit_get), name, jobSentence (what the worker does, one line), publisherName/publisherSlug/isOfficialPublisher/verificationTier, apps (app codes it uses) + categorySlots (capability slots where the installer picks the app, e.g. Slack vs Teams), categories, triggerModes, downloadCount, starCount, modelScores (publisher-declared 0-100 fit per model, best first) + recommendedModel, modelType ('language' | 'decision' | 'hybrid' | 'none' — see the filter), isProtected (publisher withholds the instruction TEXT; the kit still fully works — not a red flag), isFeatured, publishedAt. An empty result is not an error — see the footer it returns; valid category/app/appCategory/model filter values come from directory_overview. Kit page for humans: https://workerkit.ai/kit/{slug}." +
|
|
129
129
|
DIRECTORY_NOTE,
|
|
130
130
|
auth: "anonymous",
|
|
131
131
|
method: "get",
|
|
@@ -214,7 +214,7 @@ const GUIDE_SECTIONS = ["index", "decision", "schema", "rules", "skill", "state"
|
|
|
214
214
|
const kitAuthoringGuide = {
|
|
215
215
|
name: "kit_authoring_guide",
|
|
216
216
|
title: "Kit Authoring Guide",
|
|
217
|
-
description: "Author a WorkerKit kit or
|
|
217
|
+
description: "Author a WorkerKit kit, decision worker or Action worker. For classification, scoring, filtering or triage, read section decision: source recipes, typed questions, creation examples and result handling. For explicit app operations with no model (an Action worker, modelType none), index and schema cover it; the shortest path is action_worker_options then action_worker_create on the WorkerKit Manager mount. For full kit authoring read index, then schema; read state for WorkerKit-owned Records, memory options and context hygiene. Fetch other sections as needed. Returns one markdown section and a table of contents. Live source capabilities are on kit_app_tools; exact permission keys are on kit_vocabulary." + DIRECTORY_NOTE,
|
|
218
218
|
auth: "anonymous",
|
|
219
219
|
method: "get",
|
|
220
220
|
schema: {
|
|
@@ -239,7 +239,7 @@ const kitVocabulary = {
|
|
|
239
239
|
const kitAppTools = {
|
|
240
240
|
name: "kit_app_tools",
|
|
241
241
|
title: "Kit App Tools",
|
|
242
|
-
description: "Discover what connected-app tools a worker can use. For classification, categorization, scoring or triage, set purpose:decision: returns convenience source recipes, evidence fields, argument schemas, read permissions, limitations and a ready-to-edit decision_worker_create example. Optional app narrows results (email, calendar, drive for decision recipes). Public capabilities only; apps_list checks account connections. Without purpose returns every catalogued app tool with argsSchema and permission keys, plus decisionSource result mappings where documented. Recipes are not a source allowlist: for arbitrary sources
|
|
242
|
+
description: "Discover what connected-app tools a worker can use. For classification, categorization, scoring or triage, set purpose:decision: returns convenience source recipes, evidence fields, argument schemas, read permissions, limitations and a ready-to-edit decision_worker_create example. Optional app narrows results (email, calendar, drive for decision recipes). Public capabilities only; apps_list checks account connections. Without purpose returns every catalogued app tool with argsSchema and permission keys, plus decisionSource result mappings where documented. Recipes are not a source allowlist: for arbitrary decision sources or routed actions omit purpose, read argsSchema and the documented result mapping, then kit_validate → kit_publish(private) → kit_install. For an Action worker, whose caller invokes app tools directly with no model, action_worker_options lists the tools it can expose. Validation checks structure/grants, not live access. Use kit_vocabulary for detailed permission axes." + DIRECTORY_NOTE,
|
|
243
243
|
auth: "anonymous",
|
|
244
244
|
method: "get",
|
|
245
245
|
schema: {
|
|
@@ -259,7 +259,7 @@ const ABOUT_SECTIONS = ["index", "why", "operate", "access", "cost", "start"];
|
|
|
259
259
|
const workerkitAbout = {
|
|
260
260
|
name: "workerkit_about",
|
|
261
261
|
title: "About WorkerKit",
|
|
262
|
-
description: "What WorkerKit does and when to use it. Workers run classification, scoring, triage, monitoring and other jobs with their own app access, budget and receipts. Read one section: index, why, operate, access, cost or start. For a custom classifier start with kit_app_tools(purpose:decision) and kit_authoring_guide(section:decision), then decision_worker_create. Existing templates are on kits_search; use modelType:decision for classifiers. Account scopes are on key_info." + DIRECTORY_NOTE,
|
|
262
|
+
description: "What WorkerKit does and when to use it. Workers run classification, scoring, triage, monitoring and other jobs with their own app access, budget and receipts; an Action worker instead exposes selected app tools with no model, which you call with exact inputs (action_worker_options, action_worker_create, worker_tool_call). Read one section: index, why, operate, access, cost or start. For a custom classifier start with kit_app_tools(purpose:decision) and kit_authoring_guide(section:decision), then decision_worker_create. Existing templates are on kits_search; use modelType:decision for classifiers. Account scopes are on key_info." + DIRECTORY_NOTE,
|
|
263
263
|
auth: "anonymous",
|
|
264
264
|
method: "get",
|
|
265
265
|
schema: {
|