@passioncode-ai/fabric-agent-adapter 0.72.0 → 0.74.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.
- package/CHANGELOG.md +154 -0
- package/README.md +4 -3
- package/SECURITY.md +17 -0
- package/package.json +1 -1
- package/plugins/fabric-agent-adapter/.claude-plugin/plugin.json +1 -1
- package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/SKILL.md +3 -3
- package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/references/dashboard-links.md +6 -2
- package/plugins/fabric-agent-adapter/skills/adapting-projects-to-fabric/scripts/adapt_project.py +2 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/SKILL.md +15 -16
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/recipes/support-agent/README.md +2 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/board.md +4 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/connectors.md +2 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/dashboard-links.md +6 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/delegation.md +3 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/interop.md +4 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/kit-modules.md +4 -1
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/lifecycle.md +10 -4
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/protocol.md +36 -6
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/references/surfaces-and-auth.md +6 -4
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_dashboard_layout.mjs +19 -2
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service.py +54 -3
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service_channel_agent.py +841 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service_channel_agent_schema.py +496 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/check_service_rules.py +38 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-http.mjs +53 -3
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-hub.mjs +16 -5
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-peer-owner.mjs +545 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric-supervisors.mjs +43 -7
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_http.py +29 -4
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_hub.py +13 -4
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_peer_owner.py +845 -0
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/fabric_supervisors.py +35 -5
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/kit.json +212 -9
- package/plugins/fabric-agent-adapter/skills/building-fabric-services/scripts/service-channel-agent-extension.schema.json +700 -0
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/SKILL.md +3 -3
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/dashboard-links.md +6 -2
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/models-and-providers.md +21 -8
- package/plugins/fabric-agent-adapter/skills/creating-fabric-agents/references/practices.md +15 -6
- package/plugins/fabric-agent-adapter/skills/working-with-fabric/SKILL.md +1 -1
- package/plugins/fabric-agent-adapter/skills/working-with-fabric/scripts/fabric_session_env.py +1 -1
|
@@ -0,0 +1,700 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://fabric.passioncode.ai/agent-contract/0.1.0/schemas/service-channel-agent-extension.schema.json",
|
|
4
|
+
"title": "extensions/channel-agent/0.1: what an agent that answers people on a channel declares, one entry per project it serves (channel-agent-standard/1, DEC-0150)",
|
|
5
|
+
"description": "The value of the channel-agent extension key https://fabric.passioncode.ai/agent-contract/extensions/channel-agent/0.1, under provider.extensions of a service's fabric-agent.json, or, for a service with no manifest, under extensions of its /.well-known/fabric-service answer: the standard's version and, for each project the agent serves, its side, taxonomy, tiers, question route, gap registry, channels, sources, hand-off queues, evals and budgets, ticket outbox, token slot and recorded decisions. Ids, names and ages only: no secret value, no person's address, no private path. A checker reports a misplaced or invalid value as FAC-SEM-162, a repeated id or a missing decision as FAC-SEM-163, a channel, queue or budget obligation as FAC-SEM-164 and a credential-shaped name or value as FAC-SEM-165. docs/specification/channel-agent.md.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"standard",
|
|
9
|
+
"projects"
|
|
10
|
+
],
|
|
11
|
+
"additionalProperties": false,
|
|
12
|
+
"properties": {
|
|
13
|
+
"standard": {
|
|
14
|
+
"const": "channel-agent-standard/1",
|
|
15
|
+
"description": "The version of the standard the agent follows."
|
|
16
|
+
},
|
|
17
|
+
"projects": {
|
|
18
|
+
"type": "array",
|
|
19
|
+
"minItems": 1,
|
|
20
|
+
"maxItems": 64,
|
|
21
|
+
"items": {
|
|
22
|
+
"$ref": "#/$defs/project"
|
|
23
|
+
},
|
|
24
|
+
"description": "One entry per project the agent serves; a project once (FAC-SEM-163)."
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"$defs": {
|
|
28
|
+
"ref": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"pattern": "^(?![A-Za-z0-9._:-]*[0-9]{7})[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$",
|
|
31
|
+
"description": "An opaque id or name: a letter or digit, then up to 127 of letters, digits and . _ : -, with no run of 7 or more digits (a phone or account number, as support-ticket/1's id_looks_personal refuses). No @, slash, backslash or space, so no person's address and no path fits."
|
|
32
|
+
},
|
|
33
|
+
"relativeRef": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"minLength": 1,
|
|
36
|
+
"maxLength": 256,
|
|
37
|
+
"pattern": "^(?![/~])(?![A-Za-z][A-Za-z0-9+.-]*:)(?!(?:[^/]*/)*\\.\\.(?:/|$))[A-Za-z0-9._:/-]+$",
|
|
38
|
+
"description": "A table name or a path relative to the agent's repository: letters, digits and . _ : / -, never starting with / or ~ or a scheme (a drive letter is one), and no .. segment, so no private path fits."
|
|
39
|
+
},
|
|
40
|
+
"duration": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"pattern": "^P(?=[0-9T])(?!(0+D)?(T(0+H)?(0+M)?(0+S)?)?$)([0-9]{1,5}D)?(T(?=[0-9])([0-9]{1,5}H)?([0-9]{1,5}M)?([0-9]{1,5}S)?)?$",
|
|
43
|
+
"description": "An ISO 8601 duration in days, hours, minutes and seconds (P7D, PT1H, PT10M, P1DT12H), above zero: no years, months or weeks, whose length depends on the calendar, and no all-zero duration (P0D, PT0S). A wall-clock duration: a working-time limit's calendar is not declared."
|
|
44
|
+
},
|
|
45
|
+
"date": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"format": "date",
|
|
48
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
|
|
49
|
+
"description": "A calendar date, YYYY-MM-DD."
|
|
50
|
+
},
|
|
51
|
+
"none": {
|
|
52
|
+
"type": "object",
|
|
53
|
+
"required": [
|
|
54
|
+
"none"
|
|
55
|
+
],
|
|
56
|
+
"additionalProperties": false,
|
|
57
|
+
"properties": {
|
|
58
|
+
"none": {
|
|
59
|
+
"enum": [
|
|
60
|
+
"not_yet",
|
|
61
|
+
"not_used"
|
|
62
|
+
],
|
|
63
|
+
"description": "not_yet: the project does not have it yet and names the date by which it will; not_used: the project does not use it."
|
|
64
|
+
},
|
|
65
|
+
"until": {
|
|
66
|
+
"$ref": "#/$defs/date",
|
|
67
|
+
"description": "With not_yet only: the date by which the member is declared."
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"if": {
|
|
71
|
+
"properties": {
|
|
72
|
+
"none": {
|
|
73
|
+
"const": "not_yet"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"then": {
|
|
78
|
+
"required": [
|
|
79
|
+
"until"
|
|
80
|
+
],
|
|
81
|
+
"properties": {
|
|
82
|
+
"until": true
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"else": {
|
|
86
|
+
"not": {
|
|
87
|
+
"required": [
|
|
88
|
+
"until"
|
|
89
|
+
],
|
|
90
|
+
"properties": {
|
|
91
|
+
"until": true
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"description": "The standard's form for a required member a project does not have (channel-agent-standard/1, section 13.6 as its owner's round 4 gives it): {\"none\": \"not_yet\", \"until\": \"YYYY-MM-DD\"} or {\"none\": \"not_used\"}. Closed; until is a full date and only with not_yet. Taken at four members only: question_route, gap_registry, tickets.pd_check and a channel's texts.final."
|
|
96
|
+
},
|
|
97
|
+
"usd": {
|
|
98
|
+
"type": "number",
|
|
99
|
+
"minimum": 0,
|
|
100
|
+
"description": "An amount in US dollars, a number like the usage report's limits (service-usage.schema.json limitUsd, DEC-0027), except that 0 is allowed here and means no budget; a budget above 0 is spent under the usage-report limit spend_record names."
|
|
101
|
+
},
|
|
102
|
+
"texts": {
|
|
103
|
+
"type": "object",
|
|
104
|
+
"minProperties": 1,
|
|
105
|
+
"maxProperties": 64,
|
|
106
|
+
"propertyNames": {
|
|
107
|
+
"maxLength": 35,
|
|
108
|
+
"pattern": "^[A-Za-z]{2,8}(-[A-Za-z0-9]{1,8})*$",
|
|
109
|
+
"not": {
|
|
110
|
+
"const": "none"
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
"additionalProperties": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"minLength": 1,
|
|
116
|
+
"maxLength": 4096
|
|
117
|
+
},
|
|
118
|
+
"description": "One text per language, keyed by a BCP 47 tag; each at most 4096 characters counted in Unicode code points (as JSON Schema's maxLength counts them), one Telegram message. Not blank and no em dash (FAC-SEM-164); an empty text is refused here (FAC-SEM-162). A language is never named none, so the none form cannot pass for a text where the schema does not take it."
|
|
119
|
+
},
|
|
120
|
+
"project": {
|
|
121
|
+
"type": "object",
|
|
122
|
+
"required": [
|
|
123
|
+
"project",
|
|
124
|
+
"side",
|
|
125
|
+
"lead_agent",
|
|
126
|
+
"adopted_at",
|
|
127
|
+
"taxonomy",
|
|
128
|
+
"question_route",
|
|
129
|
+
"gap_registry",
|
|
130
|
+
"channels",
|
|
131
|
+
"sources",
|
|
132
|
+
"handoff_queues",
|
|
133
|
+
"evals",
|
|
134
|
+
"tickets"
|
|
135
|
+
],
|
|
136
|
+
"additionalProperties": false,
|
|
137
|
+
"properties": {
|
|
138
|
+
"project": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"pattern": "^project:[a-z0-9][a-z0-9._-]{0,127}$",
|
|
141
|
+
"description": "The project's id in the project registry, project:<slug>, the registry alias pattern unchanged (the registry's name, not an id the agent invents): an alias of the Fabric Project, compared as written (docs/specification/identifiers.md); question_route.target is the canonical Fabric Project id."
|
|
142
|
+
},
|
|
143
|
+
"side": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"pattern": "^(?![a-z0-9-]*[0-9]{7})[a-z0-9-]{1,32}$",
|
|
146
|
+
"description": "The side the agent expects the project to be on, the standard's ^[a-z0-9-]{1,32}$ with no run of 7 or more digits; the signal server refuses a write whose side differs (side_mismatch). Side codes live in the server's data, so the contract checks the pattern only."
|
|
147
|
+
},
|
|
148
|
+
"lead_agent": {
|
|
149
|
+
"$ref": "#/$defs/ref",
|
|
150
|
+
"description": "The project's lead agent."
|
|
151
|
+
},
|
|
152
|
+
"adopted_at": {
|
|
153
|
+
"$ref": "#/$defs/date",
|
|
154
|
+
"description": "The day the agent adopted the standard for this project; the observed checks report without failing for 30 days from it."
|
|
155
|
+
},
|
|
156
|
+
"taxonomy": {
|
|
157
|
+
"type": "object",
|
|
158
|
+
"required": [
|
|
159
|
+
"version",
|
|
160
|
+
"codes"
|
|
161
|
+
],
|
|
162
|
+
"additionalProperties": false,
|
|
163
|
+
"properties": {
|
|
164
|
+
"version": {
|
|
165
|
+
"type": "string",
|
|
166
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$",
|
|
167
|
+
"description": "The taxonomy's version."
|
|
168
|
+
},
|
|
169
|
+
"codes": {
|
|
170
|
+
"type": "array",
|
|
171
|
+
"minItems": 1,
|
|
172
|
+
"maxItems": 512,
|
|
173
|
+
"items": {
|
|
174
|
+
"type": "object",
|
|
175
|
+
"required": [
|
|
176
|
+
"code",
|
|
177
|
+
"label"
|
|
178
|
+
],
|
|
179
|
+
"additionalProperties": false,
|
|
180
|
+
"properties": {
|
|
181
|
+
"code": {
|
|
182
|
+
"type": "string",
|
|
183
|
+
"pattern": "^(?![a-z0-9_.]*[0-9]{7})[a-z0-9_.]{1,64}$",
|
|
184
|
+
"description": "A ticket's category code, as support-ticket/1's category (^[a-z0-9_.]{1,64}$) with no run of 7 or more digits; once in the list (FAC-SEM-163)."
|
|
185
|
+
},
|
|
186
|
+
"label": {
|
|
187
|
+
"type": "string",
|
|
188
|
+
"minLength": 1,
|
|
189
|
+
"maxLength": 120,
|
|
190
|
+
"description": "What the category means, for a person."
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
"description": "The ticket taxonomy: its version and its category codes."
|
|
197
|
+
},
|
|
198
|
+
"tiers": {
|
|
199
|
+
"type": "array",
|
|
200
|
+
"maxItems": 16,
|
|
201
|
+
"items": {
|
|
202
|
+
"type": "object",
|
|
203
|
+
"required": [
|
|
204
|
+
"code",
|
|
205
|
+
"label",
|
|
206
|
+
"rule",
|
|
207
|
+
"escalate"
|
|
208
|
+
],
|
|
209
|
+
"additionalProperties": false,
|
|
210
|
+
"properties": {
|
|
211
|
+
"code": {
|
|
212
|
+
"type": "string",
|
|
213
|
+
"pattern": "^(?![a-z0-9_]*[0-9]{7})[a-z0-9_]{1,32}$",
|
|
214
|
+
"description": "The tier's code, which travels to the signal server; once in the list (FAC-SEM-163)."
|
|
215
|
+
},
|
|
216
|
+
"label": {
|
|
217
|
+
"type": "string",
|
|
218
|
+
"minLength": 1,
|
|
219
|
+
"maxLength": 40,
|
|
220
|
+
"description": "The badge a person sees, and the status the agent may tell the customer."
|
|
221
|
+
},
|
|
222
|
+
"rule": {
|
|
223
|
+
"type": "string",
|
|
224
|
+
"pattern": "^[a-z][a-z0-9_]{0,63} >=? (0|[1-9][0-9]{0,14})$",
|
|
225
|
+
"description": "<fact> > <integer> or <fact> >= <integer>, the fact a customer fact the project declares (open_orders, paid_total_usd), one space on each side of the operator, the integer at most 15 digits."
|
|
226
|
+
},
|
|
227
|
+
"escalate": {
|
|
228
|
+
"enum": [
|
|
229
|
+
"at_once",
|
|
230
|
+
"ladder"
|
|
231
|
+
],
|
|
232
|
+
"description": "at_once: a question the agent cannot resolve goes to a person at once and ahead of the queue; ladder: it climbs the question ladder."
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
"description": "The customer tiers the project declares, if any."
|
|
237
|
+
},
|
|
238
|
+
"question_route": {
|
|
239
|
+
"if": {
|
|
240
|
+
"type": "object",
|
|
241
|
+
"required": [
|
|
242
|
+
"none"
|
|
243
|
+
],
|
|
244
|
+
"properties": {
|
|
245
|
+
"none": true
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
"then": {
|
|
249
|
+
"$ref": "#/$defs/none"
|
|
250
|
+
},
|
|
251
|
+
"else": {
|
|
252
|
+
"$ref": "#/$defs/questionRoute"
|
|
253
|
+
},
|
|
254
|
+
"description": "How a question the knowledge cannot answer reaches a person. Or the none form ($defs/none)."
|
|
255
|
+
},
|
|
256
|
+
"gap_registry": {
|
|
257
|
+
"if": {
|
|
258
|
+
"type": "object",
|
|
259
|
+
"required": [
|
|
260
|
+
"none"
|
|
261
|
+
],
|
|
262
|
+
"properties": {
|
|
263
|
+
"none": true
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
"then": {
|
|
267
|
+
"$ref": "#/$defs/none"
|
|
268
|
+
},
|
|
269
|
+
"else": {
|
|
270
|
+
"$ref": "#/$defs/gapRegistry"
|
|
271
|
+
},
|
|
272
|
+
"description": "The project's one gap registry. Or the none form ($defs/none)."
|
|
273
|
+
},
|
|
274
|
+
"channels": {
|
|
275
|
+
"type": "array",
|
|
276
|
+
"minItems": 1,
|
|
277
|
+
"maxItems": 32,
|
|
278
|
+
"items": {
|
|
279
|
+
"$ref": "#/$defs/channel"
|
|
280
|
+
},
|
|
281
|
+
"description": "Each channel the agent answers on for this project."
|
|
282
|
+
},
|
|
283
|
+
"sources": {
|
|
284
|
+
"type": "array",
|
|
285
|
+
"minItems": 1,
|
|
286
|
+
"maxItems": 64,
|
|
287
|
+
"items": {
|
|
288
|
+
"type": "object",
|
|
289
|
+
"required": [
|
|
290
|
+
"id",
|
|
291
|
+
"owner",
|
|
292
|
+
"read",
|
|
293
|
+
"cadence",
|
|
294
|
+
"max_age"
|
|
295
|
+
],
|
|
296
|
+
"additionalProperties": false,
|
|
297
|
+
"properties": {
|
|
298
|
+
"id": {
|
|
299
|
+
"$ref": "#/$defs/ref",
|
|
300
|
+
"description": "The source's id, once among the sources and the declined sources (FAC-SEM-163)."
|
|
301
|
+
},
|
|
302
|
+
"owner": {
|
|
303
|
+
"$ref": "#/$defs/ref",
|
|
304
|
+
"description": "Who owns the source."
|
|
305
|
+
},
|
|
306
|
+
"read": {
|
|
307
|
+
"type": "string",
|
|
308
|
+
"pattern": "^[a-z][a-z0-9_-]{0,31}$",
|
|
309
|
+
"description": "How the source is read (url, api, capability, export, file), a word, not its address."
|
|
310
|
+
},
|
|
311
|
+
"cadence": {
|
|
312
|
+
"$ref": "#/$defs/durationOrZero",
|
|
313
|
+
"description": "How often it is read or rebuilt; zero means on every question."
|
|
314
|
+
},
|
|
315
|
+
"max_age": {
|
|
316
|
+
"$ref": "#/$defs/duration",
|
|
317
|
+
"description": "The age past which the source opens an alert episode, above zero: the signal server reports a source's age against it, so zero would read as always stale. The age runs from the source's last successful read (a sync that finished), not from the last change of its content (the standard's section 7.1)."
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
"description": "Every source the agent reads, with its owner and maximum age."
|
|
322
|
+
},
|
|
323
|
+
"declined_sources": {
|
|
324
|
+
"type": "array",
|
|
325
|
+
"maxItems": 64,
|
|
326
|
+
"items": {
|
|
327
|
+
"type": "object",
|
|
328
|
+
"required": [
|
|
329
|
+
"id",
|
|
330
|
+
"decision"
|
|
331
|
+
],
|
|
332
|
+
"additionalProperties": false,
|
|
333
|
+
"properties": {
|
|
334
|
+
"id": {
|
|
335
|
+
"$ref": "#/$defs/ref",
|
|
336
|
+
"description": "The source that was declined."
|
|
337
|
+
},
|
|
338
|
+
"decision": {
|
|
339
|
+
"$ref": "#/$defs/ref",
|
|
340
|
+
"description": "The decision that declined it."
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
},
|
|
344
|
+
"description": "Sources recommended and declined, each with its decision."
|
|
345
|
+
},
|
|
346
|
+
"handoff_queues": {
|
|
347
|
+
"type": "array",
|
|
348
|
+
"maxItems": 32,
|
|
349
|
+
"items": {
|
|
350
|
+
"type": "object",
|
|
351
|
+
"required": [
|
|
352
|
+
"id",
|
|
353
|
+
"owner",
|
|
354
|
+
"limit",
|
|
355
|
+
"answered_signal"
|
|
356
|
+
],
|
|
357
|
+
"additionalProperties": false,
|
|
358
|
+
"properties": {
|
|
359
|
+
"id": {
|
|
360
|
+
"$ref": "#/$defs/ref",
|
|
361
|
+
"description": "The queue's id, once in the list (FAC-SEM-163)."
|
|
362
|
+
},
|
|
363
|
+
"owner": {
|
|
364
|
+
"$ref": "#/$defs/ref",
|
|
365
|
+
"description": "Who owns the queue."
|
|
366
|
+
},
|
|
367
|
+
"limit": {
|
|
368
|
+
"$ref": "#/$defs/duration",
|
|
369
|
+
"description": "How long a hand-off may wait in the queue."
|
|
370
|
+
},
|
|
371
|
+
"answered_signal": {
|
|
372
|
+
"$ref": "#/$defs/ref",
|
|
373
|
+
"description": "The signal that a hand-off was answered, or none."
|
|
374
|
+
},
|
|
375
|
+
"recommendation": {
|
|
376
|
+
"type": "string",
|
|
377
|
+
"pattern": "^[A-Za-z0-9_-]{8,128}$",
|
|
378
|
+
"description": "The board thread of the recommendation to the queue's owner, an opaque id as the board writes it (comms-common opaqueId); present when answered_signal is none (FAC-SEM-164)."
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
},
|
|
382
|
+
"description": "Each queue a hand-off to a person goes to."
|
|
383
|
+
},
|
|
384
|
+
"evals": {
|
|
385
|
+
"type": "object",
|
|
386
|
+
"required": [
|
|
387
|
+
"suite",
|
|
388
|
+
"judge_budget_usd",
|
|
389
|
+
"replay_budget_usd"
|
|
390
|
+
],
|
|
391
|
+
"additionalProperties": false,
|
|
392
|
+
"properties": {
|
|
393
|
+
"suite": {
|
|
394
|
+
"$ref": "#/$defs/relativeRef",
|
|
395
|
+
"description": "The eval suite, by its path in the agent's repository or its name."
|
|
396
|
+
},
|
|
397
|
+
"judge_budget_usd": {
|
|
398
|
+
"$ref": "#/$defs/usd",
|
|
399
|
+
"description": "The daily judge's budget in USD; 0 means none."
|
|
400
|
+
},
|
|
401
|
+
"replay_budget_usd": {
|
|
402
|
+
"$ref": "#/$defs/usd",
|
|
403
|
+
"description": "The replays' budget per month in USD; 0 means none."
|
|
404
|
+
},
|
|
405
|
+
"spend_record": {
|
|
406
|
+
"oneOf": [
|
|
407
|
+
{
|
|
408
|
+
"type": "string",
|
|
409
|
+
"pattern": "^[a-z0-9][a-z0-9._:-]{0,63}$"
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
"type": "null"
|
|
413
|
+
}
|
|
414
|
+
],
|
|
415
|
+
"description": "The id of the limit in the agent's usage report (service-usage limit id) the budgets are spent under; a budget above 0 names one (FAC-SEM-164), and a budget without one reads 0."
|
|
416
|
+
}
|
|
417
|
+
},
|
|
418
|
+
"description": "The eval suite and the budgets of the judge and the replays."
|
|
419
|
+
},
|
|
420
|
+
"tickets": {
|
|
421
|
+
"type": "object",
|
|
422
|
+
"required": [
|
|
423
|
+
"outbox",
|
|
424
|
+
"token_slot",
|
|
425
|
+
"pd_check"
|
|
426
|
+
],
|
|
427
|
+
"additionalProperties": false,
|
|
428
|
+
"properties": {
|
|
429
|
+
"outbox": {
|
|
430
|
+
"$ref": "#/$defs/relativeRef",
|
|
431
|
+
"description": "Where unsent ticket writes wait: a table name or a path in the agent's repository."
|
|
432
|
+
},
|
|
433
|
+
"token_slot": {
|
|
434
|
+
"type": "string",
|
|
435
|
+
"pattern": "^[a-z0-9][a-z0-9._-]{0,127}/[a-z][a-z0-9-]{0,31}/[A-Z][A-Z0-9_]{0,63}$",
|
|
436
|
+
"description": "The vault slot of the (agent, project) token, by name: <project>/<env>/<NAME>, where <project> is the vault project's name (^[a-z0-9][a-z0-9._-]{0,127}$, not the declaration's project:<slug>), <env> ^[a-z][a-z0-9-]{0,31}$ and NAME ^[A-Z][A-Z0-9_]{0,63}$. Never its value."
|
|
437
|
+
},
|
|
438
|
+
"pd_check": {
|
|
439
|
+
"if": {
|
|
440
|
+
"type": "object",
|
|
441
|
+
"required": [
|
|
442
|
+
"none"
|
|
443
|
+
],
|
|
444
|
+
"properties": {
|
|
445
|
+
"none": true
|
|
446
|
+
}
|
|
447
|
+
},
|
|
448
|
+
"then": {
|
|
449
|
+
"$ref": "#/$defs/none"
|
|
450
|
+
},
|
|
451
|
+
"else": {
|
|
452
|
+
"$ref": "#/$defs/pdCheck"
|
|
453
|
+
},
|
|
454
|
+
"description": "The personal-data check run inside the side, as <name>@<version>. Or the none form ($defs/none)."
|
|
455
|
+
}
|
|
456
|
+
},
|
|
457
|
+
"description": "The ticket outbox, the token's slot and the personal-data check."
|
|
458
|
+
},
|
|
459
|
+
"recorded_decisions": {
|
|
460
|
+
"type": "array",
|
|
461
|
+
"maxItems": 64,
|
|
462
|
+
"items": {
|
|
463
|
+
"type": "object",
|
|
464
|
+
"required": [
|
|
465
|
+
"id",
|
|
466
|
+
"date",
|
|
467
|
+
"effect"
|
|
468
|
+
],
|
|
469
|
+
"additionalProperties": false,
|
|
470
|
+
"properties": {
|
|
471
|
+
"id": {
|
|
472
|
+
"$ref": "#/$defs/ref",
|
|
473
|
+
"description": "The decision's id, once in the list (FAC-SEM-163)."
|
|
474
|
+
},
|
|
475
|
+
"date": {
|
|
476
|
+
"$ref": "#/$defs/date",
|
|
477
|
+
"description": "The day it was recorded."
|
|
478
|
+
},
|
|
479
|
+
"effect": {
|
|
480
|
+
"type": "string",
|
|
481
|
+
"pattern": "^[a-z][a-z0-9_]{0,63}$",
|
|
482
|
+
"description": "What it does, as a word (replies_off)."
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
},
|
|
486
|
+
"description": "The recorded decisions the agent follows; every channel held by one names it (FAC-SEM-163)."
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
},
|
|
490
|
+
"channel": {
|
|
491
|
+
"type": "object",
|
|
492
|
+
"required": [
|
|
493
|
+
"id",
|
|
494
|
+
"kind",
|
|
495
|
+
"replies_enabled",
|
|
496
|
+
"decision",
|
|
497
|
+
"final_limit",
|
|
498
|
+
"first_reply_limit",
|
|
499
|
+
"holding_reply",
|
|
500
|
+
"clarifying_question",
|
|
501
|
+
"items_seen_unit",
|
|
502
|
+
"texts"
|
|
503
|
+
],
|
|
504
|
+
"additionalProperties": false,
|
|
505
|
+
"properties": {
|
|
506
|
+
"id": {
|
|
507
|
+
"type": "string",
|
|
508
|
+
"pattern": "^(?![a-z0-9_-]*[0-9]{7})[a-z0-9][a-z0-9_-]{0,63}$",
|
|
509
|
+
"description": "The channel's id, as support-ticket/1's channel: this contract's grammar (the standard gives none), lower case, with no run of 7 or more digits; once in the project (FAC-SEM-163)."
|
|
510
|
+
},
|
|
511
|
+
"kind": {
|
|
512
|
+
"enum": [
|
|
513
|
+
"telegram_dm",
|
|
514
|
+
"telegram_group",
|
|
515
|
+
"mail",
|
|
516
|
+
"store_review",
|
|
517
|
+
"public_comment",
|
|
518
|
+
"team_chat",
|
|
519
|
+
"account"
|
|
520
|
+
],
|
|
521
|
+
"description": "The kind of channel."
|
|
522
|
+
},
|
|
523
|
+
"replies_enabled": {
|
|
524
|
+
"type": "boolean",
|
|
525
|
+
"description": "Whether the agent replies; false only by a recorded decision (FAC-SEM-163)."
|
|
526
|
+
},
|
|
527
|
+
"decision": {
|
|
528
|
+
"oneOf": [
|
|
529
|
+
{
|
|
530
|
+
"$ref": "#/$defs/ref"
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
"type": "null"
|
|
534
|
+
}
|
|
535
|
+
],
|
|
536
|
+
"description": "The recorded decision that holds the channel, or null."
|
|
537
|
+
},
|
|
538
|
+
"final_limit": {
|
|
539
|
+
"$ref": "#/$defs/duration",
|
|
540
|
+
"description": "The age at which a ticket gets its final reply and ends."
|
|
541
|
+
},
|
|
542
|
+
"first_reply_limit": {
|
|
543
|
+
"$ref": "#/$defs/duration",
|
|
544
|
+
"description": "The age by which the first reply is due."
|
|
545
|
+
},
|
|
546
|
+
"holding_reply": {
|
|
547
|
+
"type": "boolean",
|
|
548
|
+
"description": "Whether a held question gets a holding reply; true needs a holding text (FAC-SEM-164)."
|
|
549
|
+
},
|
|
550
|
+
"clarifying_question": {
|
|
551
|
+
"type": "boolean",
|
|
552
|
+
"description": "Whether the agent may ask one clarifying question; never on a store review (FAC-SEM-164)."
|
|
553
|
+
},
|
|
554
|
+
"quiet_window": {
|
|
555
|
+
"oneOf": [
|
|
556
|
+
{
|
|
557
|
+
"$ref": "#/$defs/duration"
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
"type": "null"
|
|
561
|
+
}
|
|
562
|
+
],
|
|
563
|
+
"description": "How long the agent waits while staff is answering in a group, or null."
|
|
564
|
+
},
|
|
565
|
+
"late_answer_window": {
|
|
566
|
+
"oneOf": [
|
|
567
|
+
{
|
|
568
|
+
"$ref": "#/$defs/duration"
|
|
569
|
+
},
|
|
570
|
+
{
|
|
571
|
+
"type": "null"
|
|
572
|
+
}
|
|
573
|
+
],
|
|
574
|
+
"description": "How late an answer may still come, or null."
|
|
575
|
+
},
|
|
576
|
+
"items_seen_unit": {
|
|
577
|
+
"enum": [
|
|
578
|
+
"mails",
|
|
579
|
+
"updates",
|
|
580
|
+
"messages",
|
|
581
|
+
"reviews"
|
|
582
|
+
],
|
|
583
|
+
"description": "What the channel's own API counts as arrived, the unit of the daily note's items_seen."
|
|
584
|
+
},
|
|
585
|
+
"texts": {
|
|
586
|
+
"type": "object",
|
|
587
|
+
"additionalProperties": false,
|
|
588
|
+
"properties": {
|
|
589
|
+
"holding": {
|
|
590
|
+
"$ref": "#/$defs/texts",
|
|
591
|
+
"description": "The holding reply, per language."
|
|
592
|
+
},
|
|
593
|
+
"final": {
|
|
594
|
+
"if": {
|
|
595
|
+
"type": "object",
|
|
596
|
+
"required": [
|
|
597
|
+
"none"
|
|
598
|
+
],
|
|
599
|
+
"properties": {
|
|
600
|
+
"none": true
|
|
601
|
+
}
|
|
602
|
+
},
|
|
603
|
+
"then": {
|
|
604
|
+
"$ref": "#/$defs/none"
|
|
605
|
+
},
|
|
606
|
+
"else": {
|
|
607
|
+
"$ref": "#/$defs/texts"
|
|
608
|
+
},
|
|
609
|
+
"description": "The final reply, per language; present when replies are on (FAC-SEM-164). Or the none form ($defs/none): a replying channel with {\"none\": ...} owes no finding."
|
|
610
|
+
}
|
|
611
|
+
},
|
|
612
|
+
"description": "The holding and final texts the channel sends."
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
},
|
|
616
|
+
"durationOrZero": {
|
|
617
|
+
"type": "string",
|
|
618
|
+
"pattern": "^P(?=[0-9T])([0-9]{1,5}D)?(T(?=[0-9])([0-9]{1,5}H)?([0-9]{1,5}M)?([0-9]{1,5}S)?)?$",
|
|
619
|
+
"description": "An ISO 8601 duration in days, hours, minutes and seconds, as duration, where zero (P0D, PT0S) is allowed: a source's cadence, read on every question."
|
|
620
|
+
},
|
|
621
|
+
"questionRoute": {
|
|
622
|
+
"type": "object",
|
|
623
|
+
"required": [
|
|
624
|
+
"capability",
|
|
625
|
+
"target",
|
|
626
|
+
"daily_cap",
|
|
627
|
+
"days",
|
|
628
|
+
"tz",
|
|
629
|
+
"send_at",
|
|
630
|
+
"expires"
|
|
631
|
+
],
|
|
632
|
+
"additionalProperties": false,
|
|
633
|
+
"properties": {
|
|
634
|
+
"capability": {
|
|
635
|
+
"enum": [
|
|
636
|
+
"team.ask",
|
|
637
|
+
"operator.ask"
|
|
638
|
+
],
|
|
639
|
+
"description": "team.ask for a product team's side, operator.ask for the operator's; which side is which is the signal server's data."
|
|
640
|
+
},
|
|
641
|
+
"target": {
|
|
642
|
+
"type": "string",
|
|
643
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,191}$",
|
|
644
|
+
"description": "The desk's Fabric project id, as com.submit addresses it (comms-common projectId)."
|
|
645
|
+
},
|
|
646
|
+
"daily_cap": {
|
|
647
|
+
"type": "integer",
|
|
648
|
+
"minimum": 1,
|
|
649
|
+
"maximum": 1000,
|
|
650
|
+
"description": "The agent's cap for this project's questions a day; the desk's side-wide cap of section 6.4 still binds. This reading is to be confirmed with the standard's owner on thread b6820b97."
|
|
651
|
+
},
|
|
652
|
+
"days": {
|
|
653
|
+
"type": "string",
|
|
654
|
+
"pattern": "^(mon|tue|wed|thu|fri|sat|sun)(-(mon|tue|wed|thu|fri|sat|sun))?(,(mon|tue|wed|thu|fri|sat|sun)(-(mon|tue|wed|thu|fri|sat|sun))?)*$",
|
|
655
|
+
"description": "The desk's working days: days and ranges, comma separated (mon-fri, mon,wed,fri)."
|
|
656
|
+
},
|
|
657
|
+
"tz": {
|
|
658
|
+
"type": "string",
|
|
659
|
+
"pattern": "^[A-Za-z][A-Za-z0-9_+-]{0,30}(/[A-Za-z0-9_+-]{1,30}){0,2}$",
|
|
660
|
+
"description": "The time zone of days and send_at: an IANA name, one segment (UTC, GMT, CET) or Area/Location (Europe/Warsaw, Etc/UTC, America/Argentina/Buenos_Aires)."
|
|
661
|
+
},
|
|
662
|
+
"send_at": {
|
|
663
|
+
"type": "string",
|
|
664
|
+
"pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
|
|
665
|
+
"description": "The desk's send time, HH:MM in tz."
|
|
666
|
+
},
|
|
667
|
+
"expires": {
|
|
668
|
+
"$ref": "#/$defs/duration",
|
|
669
|
+
"description": "How long a question waits for its answer (its deadline)."
|
|
670
|
+
}
|
|
671
|
+
},
|
|
672
|
+
"description": "How a question the knowledge cannot answer reaches a person."
|
|
673
|
+
},
|
|
674
|
+
"gapRegistry": {
|
|
675
|
+
"type": "object",
|
|
676
|
+
"required": [
|
|
677
|
+
"owner",
|
|
678
|
+
"capability"
|
|
679
|
+
],
|
|
680
|
+
"additionalProperties": false,
|
|
681
|
+
"properties": {
|
|
682
|
+
"owner": {
|
|
683
|
+
"$ref": "#/$defs/ref",
|
|
684
|
+
"description": "The agent that keeps the project's gap registry."
|
|
685
|
+
},
|
|
686
|
+
"capability": {
|
|
687
|
+
"type": "string",
|
|
688
|
+
"pattern": "^[a-z][a-z0-9._-]{1,127}$",
|
|
689
|
+
"description": "The capability the registry is reached by (common capabilityName)."
|
|
690
|
+
}
|
|
691
|
+
},
|
|
692
|
+
"description": "The project's one gap registry."
|
|
693
|
+
},
|
|
694
|
+
"pdCheck": {
|
|
695
|
+
"type": "string",
|
|
696
|
+
"pattern": "^[a-z0-9][a-z0-9._-]{0,63}@[0-9A-Za-z][0-9A-Za-z.+-]{0,31}$",
|
|
697
|
+
"description": "The personal-data check run inside the side, as <name>@<version>."
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
}
|