Skip to content

Commit 9a748c3

Browse files
committed
null-safe block.error, strict start-trigger coercion, lint checks reference paths against output schemas; logs stats segments; requiredWhen and model ids in the agent catalog; live tag usage; one row-filter grammar; minted service-account credential ids; webhook delivery URLs on deployment status; mv semantics for folder moves
Executor: <block.error> resolves empty on a block that succeeded so a shared error collector is writable; a number input given a non-numeric string fails the run at start naming the field; a regression test pins that failure traces carry child spans. Lint: a reference whose first path segment is not on the block's effective outputs (or its responseFormat schema) is an unknown-field finding. API: logs stats honours segmentCount and omits empty buckets unless includeEmpty; block detail publishes requiredWhen instead of flattening conditional requirements and always lists model options with hosted marks; knowledge tag usage counts through the document slot; every table rows filter accepts a bare condition; service-account credentials mint their id; deployment status lists each webhook's delivery URL; a folder move into an existing folder moves it inside. OpenAPI and CLI generated types regenerated.
1 parent 556c781 commit 9a748c3

46 files changed

Lines changed: 2100 additions & 366 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/docs/openapi-v2-logs.json

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@
421421
"get": {
422422
"operationId": "getLogStats",
423423
"summary": "Get Log Statistics",
424-
"description": "Bucketed run counts, success rate, error count, and mean latency for a workspace and for each of its workflows — the aggregate a caller would otherwise have to page every run to compute. The window spans `startDate` through `endDate` when both are supplied; an omitted edge falls back to the oldest matching run on the left and to the later of the newest matching run and now on the right. With no matching runs the right edge falls back to now and the left to 24 hours before that right edge — the trailing 24 hours when neither edge was supplied, and the 24 hours preceding `endDate` when only `endDate` was supplied. A supplied `startDate` is still used verbatim, so a `startDate` without an `endDate` yields `[startDate, now]`, which can be any width. The window is divided into exactly `segmentCount` equal buckets whose width is `max(60000, floor(windowMs / segmentCount))` milliseconds. The one-minute floor is a floor on bucket width, not on the window: when it applies, the series runs past `timeBounds.end` and the trailing buckets are empty rather than the window being compressed. A folder path covers its whole subtree. Per-workflow series are capped and `workflowsTruncated` reports whether the cap applied; the workspace totals are always computed from every workflow. Runs are hard-deleted once they pass the payer's log retention window, so an older run is simply absent rather than reported as removed. The window is 30 days from run start on the free plan, unbounded on Pro and Team, and set per organization on Enterprise with an optional per-workspace override. A workspace folder tree over 10,000 folders is a `413`.",
424+
"description": "Bucketed run counts, success rate, error count, and mean latency for a workspace and for each of its workflows — the aggregate a caller would otherwise have to page every run to compute. The window spans `startDate` through `endDate` when both are supplied; an omitted edge falls back to the oldest matching run on the left and to the later of the newest matching run and now on the right. With no matching runs the right edge falls back to now and the left to 24 hours before that right edge — the trailing 24 hours when neither edge was supplied, and the 24 hours preceding `endDate` when only `endDate` was supplied. A supplied `startDate` is still used verbatim, so a `startDate` without an `endDate` yields `[startDate, now]`, which can be any width. The window is divided into `segmentCount` equal buckets whose width is `max(60000, floor(windowMs / segmentCount))` milliseconds. Each series carries only the buckets that hold at least one run unless `includeEmpty` is set, in which case exactly `segmentCount` buckets are returned. The one-minute floor is a floor on bucket width, not on the window: when it applies, the series runs past `timeBounds.end` and the trailing buckets are empty rather than the window being compressed. A folder path covers its whole subtree. Per-workflow series are capped and `workflowsTruncated` reports whether the cap applied; the workspace totals are always computed from every workflow. Runs are hard-deleted once they pass the payer's log retention window, so an older run is simply absent rather than reported as removed. The window is 30 days from run start on the free plan, unbounded on Pro and Team, and set per organization on Enterprise with an optional per-workspace override. A workspace folder tree over 10,000 folders is a `413`.",
425425
"tags": ["Logs"],
426426
"parameters": [
427427
{
@@ -505,14 +505,39 @@
505505
"name": "segmentCount",
506506
"in": "query",
507507
"required": false,
508-
"description": "Number of equal time buckets to divide the window into, from 1 to 500. Exactly this many buckets are always returned. Buckets are never narrower than one minute, so on a short window the series extends past the end of the window rather than being compressed, and the trailing buckets are empty.",
508+
"description": "Number of equal time buckets to divide the window into, from 1 to 500. It is the ceiling on how many buckets a series carries: with `includeEmpty=true` exactly this many are returned, otherwise only the buckets holding at least one run. Buckets are never narrower than one minute, so on a short window the series extends past the end of the window rather than being compressed, and the trailing buckets are empty.",
509509
"schema": {
510510
"default": 72,
511-
"description": "Number of equal time buckets to divide the window into, from 1 to 500. Exactly this many buckets are always returned. Buckets are never narrower than one minute, so on a short window the series extends past the end of the window rather than being compressed, and the trailing buckets are empty.",
511+
"description": "Number of equal time buckets to divide the window into, from 1 to 500. It is the ceiling on how many buckets a series carries: with `includeEmpty=true` exactly this many are returned, otherwise only the buckets holding at least one run. Buckets are never narrower than one minute, so on a short window the series extends past the end of the window rather than being compressed, and the trailing buckets are empty.",
512512
"type": "integer",
513513
"minimum": 1,
514514
"maximum": 500
515515
}
516+
},
517+
{
518+
"name": "includeEmpty",
519+
"in": "query",
520+
"required": false,
521+
"description": "Whether buckets with no runs are included in every series. Off by default, so each series carries only the buckets that hold at least one run; set it to publish exactly `segmentCount` buckets per series, empty ones included. The listed spellings are the whole accepted vocabulary and are case-sensitive; any other value is rejected.",
522+
"schema": {
523+
"default": false,
524+
"description": "Whether buckets with no runs are included in every series. Off by default, so each series carries only the buckets that hold at least one run; set it to publish exactly `segmentCount` buckets per series, empty ones included. The listed spellings are the whole accepted vocabulary and are case-sensitive; any other value is rejected.",
525+
"enum": [
526+
"true",
527+
"1",
528+
"yes",
529+
"on",
530+
"y",
531+
"enabled",
532+
"false",
533+
"0",
534+
"no",
535+
"off",
536+
"n",
537+
"disabled"
538+
],
539+
"type": "string"
540+
}
516541
}
517542
],
518543
"responses": {
@@ -1690,7 +1715,7 @@
16901715
"items": {
16911716
"$ref": "#/components/schemas/V2LogStatsSegment"
16921717
},
1693-
"description": "One entry per bucket, in order, including buckets with no runs."
1718+
"description": "Buckets in time order. Only the buckets with at least one run unless `includeEmpty` was set, in which case every bucket appears, empty ones included."
16941719
},
16951720
"totalExecutions": {
16961721
"type": "number",
@@ -1763,7 +1788,7 @@
17631788
"items": {
17641789
"$ref": "#/components/schemas/V2LogStatsSegment"
17651790
},
1766-
"description": "Workspace-wide totals per bucket, in the same order as each workflow series."
1791+
"description": "Workspace-wide totals per bucket, in time order. Subject to the same `includeEmpty` rule as each workflow series: empty buckets are omitted unless asked for."
17671792
},
17681793
"totalRuns": {
17691794
"type": "number",

apps/docs/openapi-v2-resources.json

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6538,7 +6538,7 @@
65386538
},
65396539
"requiresClientGeneratedCredentialId": {
65406540
"type": "boolean",
6541-
"description": "Whether the caller must generate and submit the credential ID before setup."
6541+
"description": "Whether the caller must generate and submit the credential ID before setup. False for every provider: credential creation mints an ID when none is supplied, and a Slack custom bot may still send one to configure its Request URL ahead of time."
65426542
},
65436543
"fields": {
65446544
"minItems": 1,
@@ -6795,7 +6795,7 @@
67956795
"maxLength": 500
67966796
},
67976797
"id": {
6798-
"description": "Required only when provider discovery requests a client-generated ID.",
6798+
"description": "Optional client-generated credential ID. The server mints one when it is omitted, so no provider requires it. A `slack-custom-bot` credential may supply one so its Slack Request URL, which embeds the ID, can be configured before the credential exists; every other provider ignores it.",
67996799
"type": "string",
68006800
"format": "uuid",
68016801
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
@@ -8321,7 +8321,7 @@
83218321
"type": "string"
83228322
},
83238323
"required": {
8324-
"description": "Whether a value must be supplied. A conditionally required field reports `true` and carries `requiredWhen`.",
8324+
"description": "Whether a value must always be supplied. A field required only under some configuration reports `false` and carries `requiredWhen`.",
83258325
"type": "boolean"
83268326
},
83278327
"requiredWhen": {
@@ -8349,7 +8349,7 @@
83498349
"$ref": "#/components/schemas/V2CatalogCondition"
83508350
},
83518351
"options": {
8352-
"description": "Selectable options. Absent on fields whose options are fetched per workspace at edit time.",
8352+
"description": "Selectable options. Absent on fields whose options are fetched per workspace at edit time. A `model` field always carries its options, with `hosted` marking the models a hosted deployment runs without an author-supplied key.",
83538353
"type": "array",
83548354
"items": {
83558355
"type": "object",
@@ -8365,6 +8365,10 @@
83658365
"hasIcon": {
83668366
"description": "Whether the option renders with an icon. The icon itself is not published.",
83678367
"type": "boolean"
8368+
},
8369+
"hosted": {
8370+
"description": "Model options only: whether Sim runs the model with its own key on a hosted deployment, so no provider API key is needed for it.",
8371+
"type": "boolean"
83688372
}
83698373
},
83708374
"required": ["id"],

0 commit comments

Comments
 (0)