Skip to content

Commit e1d5978

Browse files
v0.8.16: aws lambda, dynamics 365, actorless run fixes, usage chart
v0.8.16: aws lambda, dynamics 365, actorless run fixes, usage chart
2 parents 336ec07 + 3077553 commit e1d5978

617 files changed

Lines changed: 38611 additions & 5370 deletions

File tree

Some content is hidden

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

.agents/skills/add-block/SKILL.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ When the user asks you to create a block:
1919

2020
Blocks depend on tool outputs. If the underlying tool response schema is not documented or live-verified, you MUST tell the user instead of guessing block outputs.
2121

22+
When block work changes tool execution, same-process work must use a registered
23+
`InternalToolConfig.operation`. Never add a Sim `/api/...` self-hop or the retired
24+
`directExecution` property.
25+
2226
- Do NOT invent block outputs for undocumented tool responses
2327
- Do NOT describe unknown JSON shapes as if they were confirmed
2428
- Do NOT wire fields into the block just because they seem likely to exist

.agents/skills/add-integration/SKILL.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ Choose the tool boundary before writing the declaration:
6868
- Use `ToolConfig.request` only for an absolute external HTTP(S) provider endpoint.
6969

7070
Never point a tool at `/api/...`, construct an absolute URL back to Sim, declare
71-
`request.internal`, or add an API route merely to reuse code, normalize files, or authorize
71+
`request.internal`, add the retired `directExecution` property, or add an API route merely to reuse code, normalize files, or authorize
7272
resources. A real external/browser route and an in-process tool may share the same operation, but
7373
neither calls the other. Follow the full transport and handler rules in the `add-tools` skill.
7474

@@ -171,7 +171,7 @@ Hard rules:
171171
- Never substitute secret plaintext into source or serialize plaintext provenance.
172172
- Never hand-roll private provenance headers/envelopes; the shared `executeTool` boundary owns
173173
transport and strips private metadata from functional results.
174-
- Never attach private provenance to an external URL or to `directExecution`. Project proven
174+
- Never attach private provenance to an external URL. Project proven
175175
model-visible external fields with `request.modelInput`; otherwise preserve ordinary request
176176
semantics. Use a registered in-process operation when encrypted provenance must cross the
177177
boundary.
@@ -606,8 +606,8 @@ If creating V2 versions (API-aligned outputs):
606606
- [ ] Created tool file for each operation
607607
- [ ] Chose exactly one boundary per tool: registered `InternalToolConfig.operation` or absolute
608608
external HTTP(S) `ToolConfig.request`
609-
- [ ] No tool points to `/api/...`, constructs a URL back to Sim, declares `request.internal`, or
610-
has an HTTP fallback for an in-process operation
609+
- [ ] No tool points to `/api/...`, constructs a URL back to Sim, declares `request.internal` or the
610+
retired `directExecution` property, or has an HTTP fallback for an in-process operation
611611
- [ ] All params have correct visibility
612612
- [ ] All nullable fields use `?? null`
613613
- [ ] All optional outputs have `optional: true`

.agents/skills/add-tools/SKILL.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ Every tool must use exactly one of these configurations:
5454
HTTP(S) provider endpoint.
5555

5656
Never set a tool URL to `/api/...`, construct an absolute URL back to Sim, declare
57-
`request.internal`, import a route module, or create an API route merely to normalize files,
57+
`request.internal`, add the retired `directExecution` property, import a route module, or create an API route merely to normalize files,
5858
authorize access, or reuse server code. A real browser/API route may remain as a thin adapter, but
5959
the route and the tool must call the same operation directly. A true cross-process/capability
6060
boundary uses an explicit server client and is not disguised as a tool self-hop.
@@ -524,6 +524,7 @@ All tool IDs MUST use `snake_case`: `{service}_{action}` (e.g., `x_create_tweet`
524524
HTTP(S) `ToolConfig.request`
525525
- [ ] No tool request points to `/api/...`, constructs a URL back to Sim, or declares
526526
`request.internal`
527+
- [ ] No tool declares `directExecution`; in-process work uses a registered operation
527528
- [ ] All params have explicit `required: true` or `required: false`
528529
- [ ] All params have appropriate `visibility`
529530
- [ ] All nullable response fields use `?? null`

.agents/skills/add-trigger/SKILL.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,8 @@ Two rules the checks enforce:
508508
Webhook and polling routes are legitimate external ingress boundaries. They must not call this
509509
Sim app's own API routes to reuse provider or business logic. Extract the shared provider operation
510510
or authorized application use case and call it directly from the trigger handler and any other
511-
server adapter. HTTP is reserved for an actual cross-process/capability boundary.
511+
server adapter. HTTP is reserved for an actual cross-process/capability boundary. Tool work uses a
512+
registered `InternalToolConfig.operation`; the retired `directExecution` property must not return.
512513

513514
### Trigger Definition
514515
- [ ] Created `utils.ts` with options, instructions, extra fields, and output builders

.agents/skills/tool-registry-boundary/SKILL.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ You keep the 4,300-tool executable registry out of module graphs that don't exec
1111

1212
> Client-reachable code reads tool **metadata**. Only code that actually executes a tool imports the **registry**.
1313
14-
`@/tools/registry` is a ~9,000-line barrel importing every tool. Each `ToolConfig` mixes plain data (`params`, `outputs`, `name`) with closures — `request.url`, `request.headers`, `transformResponse`, `directExecution`, `postProcess`. Those closures reach the SDK clients, API helpers and parsers each integration needs, and that is what makes the barrel expensive: reaching it costs ~4,700 additional modules.
14+
`@/tools/registry` is a ~9,000-line barrel importing every tool. External `ToolConfig` entries mix
15+
plain data (`params`, `outputs`, `name`) with request/response closures, while
16+
`InternalToolConfig` entries contain semantic input projection and load their server implementation
17+
through `lib/internal/tool-operations/registry.server.ts`. Request closures can still reach SDK
18+
clients, API helpers, and parsers, which is what makes the executable barrel expensive: reaching it
19+
costs ~4,700 additional modules.
1520

1621
`getTool()` returns the whole `ToolConfig`, so a single `getTool` import anywhere in a client-reachable file drags all of it in.
1722

@@ -95,4 +100,5 @@ The canvas route reached the registry through **four** redundant edges — `prov
95100

96101
Ask what the caller does with the config. If it reads `params`, `outputs`, `name`, `description` or just checks existence, it belongs on `@/tools/metadata` — no exceptions, even on a path you believe is server-only today, because a future client import will silently re-attach the registry to the graph.
97102

98-
If it genuinely executes — builds a request, transforms a response, runs `directExecution` — use `getTool`, and keep that file off client-reachable paths.
103+
If it genuinely executes — builds an external request, transforms a response, or dispatches a
104+
registered internal operation — use `getTool`, and keep that file off client-reachable paths.

.agents/skills/validate-integration/SKILL.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,9 @@ search, extraction, or "AI-powered" marketing terminology.
159159
- [ ] Sim-owned durable writes and internal execution handoffs that can enter workflows/models use
160160
field-scoped `request.secretProvenance`; authenticated receivers validate the exact selection
161161
and scope, strip private metadata, and persist, import, or propagate it at the owning boundary
162-
- [ ] Private provenance is never attached to external URLs or `directExecution`; proven
163-
model-visible external fields use projection, while other external inputs remain unchanged
162+
- [ ] Private provenance is never attached to external URLs; registered in-process operations
163+
preserve it through `operation.modelInput` / `operation.secretProvenance`, while proven
164+
model-visible external fields use request projection and other external inputs remain unchanged
164165
- [ ] No tool performs raw secret plaintext/source substitution or serializes plaintext provenance
165166
- [ ] No `transformResponse` or tool-local helper blanket-sanitizes ordinary third-party results;
166167
only execution-scoped, activated Sim provenance is projected at shared model/log boundaries

.claude/rules/emcn-components.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ The menu surface intentionally diverges from the pill: `dropdown-menu.tsx` items
3232
- **`ChipDatePicker`** — chip-styled date field.
3333
- **`ChipTimePicker`** — minute-granular time sibling of `ChipDatePicker`, a `ChipInput` that leniently parses typed input (`9:47`, `947`, `2:05pm`, `14:30`), commits on Enter/blur, and re-renders the canonical `9:47 AM` label.
3434
- **`DropdownMenu`** — the canonical context/action menu (Radix-backed). Not a chip, but the standard menu for command/action lists; reach for it instead of a hand-rolled popover. Its surface intentionally diverges from the chip pill (`text-small`, `gap-2`) — keep them distinct. For a pill that opens a value picker, use `ChipDropdown`/`ChipSelect` instead.
35-
- **`OverflowText`** — the canonical single-line overflow treatment for read-only human labels and titles. It owns `min-w-0`, single-line clipping, the conditional 18px edge fade, and the full-value floating tooltip; consumers pass only layout/typography through `className`. Never combine the fade with `truncate`, which paints an ellipsis beneath the mask. Keep ordinary `truncate` for editable or mirrored input values, code/log/path content, dense or virtualized grids, and composite rows where masking the container would also fade icons or actions. Multiline copy uses an intentional `line-clamp-*` treatment instead. A non-editable `Combobox` visual overlay passes its plain value through `overlayLabel`; render its visible `OverflowText` as a constrained block with `tooltipEnabled={false}` so the interactive trigger owns the single accessible tooltip.
35+
- **`OverflowText`** — the canonical single-line overflow treatment for read-only human labels and titles. It owns `min-w-0`, fade-only clipping (never an ellipsis), the conditional 18px edge mask, and the full-value floating tooltip; consumers pass only layout/typography through `className`. `overflowTextClipClass` and `overflowTextFadeClass` are the complete base/faded treatments for the rare component that must own measurement itself; never pair either with `truncate`, `text-ellipsis`, or hover-time mask removal. Use `DropdownMenuItemLabel` for a menu label beside icons, checks, or actions. A non-editable `Combobox` passes the full visual value through `overlayLabel`; the combobox owns the visual overlay's fade and keeps its one accessible tooltip on the interactive layer. Keep ordinary `truncate` only for editable values, code/log/path content, dense or virtualized grids, and rich composite content that cannot supply a plain tooltip label. Multiline copy uses an intentional `line-clamp-*` treatment instead.
3636

3737
## Modal keyboard defaults
3838

.claude/rules/sim-styling.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,11 @@ Icons default `size-[14px]`. Equal h/w → `size-*` (`size-[14px]`, `size-4`), n
5252

5353
## Text Overflow
5454

55-
Use `OverflowText` from `@sim/emcn` for a constrained, single-line, read-only human label or title. It owns `min-w-0`, single-line clipping, the conditional edge fade, and the full-value floating tooltip; pass only layout and typography through `className`. Never combine a fade or hand-written `mask-image` with `truncate`, which leaves an ellipsis beneath the mask. Pass the full label to this component instead of shortening it in JavaScript first.
55+
Use `OverflowText` from `@sim/emcn` for a constrained, single-line, read-only human label or title. It owns `min-w-0`, fade-only clipping, the conditional edge mask, and the full-value floating tooltip; pass only layout and typography through `className`. Never combine a fade or hand-written `mask-image` with `truncate`/`text-ellipsis`, and never remove the mask on hover to reveal an ellipsis. Pass the full label instead of shortening it in JavaScript first. Components that must measure a label externally use the complete `overflowTextClipClass` + conditional `overflowTextFadeClass` pair.
5656

57-
For a non-editable `Combobox` visual overlay, pass the same plain value as `overlayLabel` and render the visible `OverflowText` with `block w-full` (or `block flex-1` beside an icon) plus `tooltipEnabled={false}`. The transparent interactive layer then owns the one reachable full-value tooltip while the visual layer owns the measured fade.
57+
For a non-editable `Combobox` visual overlay, pass the same full plain value as `overlayLabel`. The combobox owns the visible overlay's fade and keeps the one reachable full-value tooltip on its interactive layer; consumers provide only the overlay's decorated content.
58+
59+
Use `DropdownMenuItemLabel` for a human label beside menu icons, checks, shortcuts, or actions. Bare string children are wrapped automatically; a direct rich `<span>` is only a hard-clipped escape hatch and must not be used for an ordinary text label.
5860

5961
Do not apply the fade universally to editable or mirrored input values, code, logs, paths, filenames that use intentional middle truncation, dense or virtualized grids, or a composite container that also holds icons/actions. Those keep their purpose-built overflow behavior. Multiline copy uses an intentional `line-clamp-*` treatment.
6062

@@ -92,7 +94,7 @@ Draw a line with a real `border-*` utility. Never hand-roll one as `shadow-[inse
9294

9395
### What className MAY carry
9496

95-
Layout/sizing ONLY: `flex-1`, `w-full`, `w-[Npx]`, `min-w-0`, `max-w-*`, margins, `truncate`. Example: `<ChipInput icon={Search} className='min-w-0 flex-1' .../>` (`app/workspace/[workspaceId]/integrations/integrations.tsx:257`). NEVER re-specify canonical chrome — the component already applies it.
97+
Layout/sizing ONLY: `flex-1`, `w-full`, `w-[Npx]`, `min-w-0`, `max-w-*`, margins. `truncate` is allowed only for the explicit overflow exceptions above, never as a general layout class. Example: `<ChipInput icon={Search} className='min-w-0 flex-1' .../>` (`app/workspace/[workspaceId]/integrations/integrations.tsx:257`). NEVER re-specify canonical chrome — the component already applies it.
9698

9799
### Form / chip-modal layout rhythm
98100

.cursor/rules/sim-styling.mdc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,11 @@ Icons default `size-[14px]`. Equal h/w → `size-*` (`size-[14px]`, `size-4`), n
4646

4747
## Text Overflow
4848

49-
Use `OverflowText` from `@sim/emcn` for a constrained, single-line, read-only human label or title. It owns `min-w-0`, single-line clipping, the conditional edge fade, and the full-value floating tooltip; pass only layout and typography through `className`. Never combine a fade or hand-written `mask-image` with `truncate`, which leaves an ellipsis beneath the mask. Pass the full label to this component instead of shortening it in JavaScript first.
49+
Use `OverflowText` from `@sim/emcn` for a constrained, single-line, read-only human label or title. It owns `min-w-0`, fade-only clipping, the conditional edge mask, and the full-value floating tooltip; pass only layout and typography through `className`. Never combine a fade or hand-written `mask-image` with `truncate`/`text-ellipsis`, and never remove the mask on hover to reveal an ellipsis. Pass the full label instead of shortening it in JavaScript first. Components that must measure a label externally use the complete `overflowTextClipClass` + conditional `overflowTextFadeClass` pair.
5050

51-
For a non-editable `Combobox` visual overlay, pass the same plain value as `overlayLabel` and render the visible `OverflowText` with `block w-full` (or `block flex-1` beside an icon) plus `tooltipEnabled={false}`. The transparent interactive layer then owns the one reachable full-value tooltip while the visual layer owns the measured fade.
51+
For a non-editable `Combobox` visual overlay, pass the same full plain value as `overlayLabel`. The combobox owns the visible overlay's fade and keeps the one reachable full-value tooltip on its interactive layer; consumers provide only the overlay's decorated content.
52+
53+
Use `DropdownMenuItemLabel` for a human label beside menu icons, checks, shortcuts, or actions. Bare string children are wrapped automatically; a direct rich `<span>` is only a hard-clipped escape hatch and must not be used for an ordinary text label.
5254

5355
Do not apply the fade universally to editable or mirrored input values, code, logs, paths, filenames that use intentional middle truncation, dense or virtualized grids, or a composite container that also holds icons/actions. Those keep their purpose-built overflow behavior. Multiline copy uses an intentional `line-clamp-*` treatment.
5456

@@ -70,7 +72,7 @@ Value text `--text-body`; muted/placeholder/labels `--text-muted`; icons `--text
7072

7173
### What className MAY carry
7274

73-
Layout/sizing ONLY: `flex-1`, `w-full`, `w-[Npx]`, `min-w-0`, `max-w-*`, margins, `truncate`. Example: `<ChipInput icon={Search} className='min-w-0 flex-1' .../>` (`app/workspace/[workspaceId]/integrations/integrations.tsx:257`). NEVER re-specify canonical chrome — the component already applies it.
75+
Layout/sizing ONLY: `flex-1`, `w-full`, `w-[Npx]`, `min-w-0`, `max-w-*`, margins. `truncate` is allowed only for the explicit overflow exceptions above, never as a general layout class. Example: `<ChipInput icon={Search} className='min-w-0 flex-1' .../>` (`app/workspace/[workspaceId]/integrations/integrations.tsx:257`). NEVER re-specify canonical chrome — the component already applies it.
7476

7577
### Form / chip-modal layout rhythm
7678

apps/docs/components/icons.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6843,6 +6843,32 @@ export function CloudFormationIcon(props: SVGProps<SVGSVGElement>) {
68436843
)
68446844
}
68456845

6846+
export function LambdaIcon(props: SVGProps<SVGSVGElement>) {
6847+
return (
6848+
<svg
6849+
{...props}
6850+
viewBox='5 5 70 70'
6851+
version='1.1'
6852+
xmlns='http://www.w3.org/2000/svg'
6853+
xmlnsXlink='http://www.w3.org/1999/xlink'
6854+
>
6855+
<g
6856+
id='Icon-Architecture/64/Arch_AWS-Lambda_64'
6857+
stroke='none'
6858+
strokeWidth='1'
6859+
fill='none'
6860+
fillRule='evenodd'
6861+
>
6862+
<path
6863+
d='M28.008,66 L15.591,66 L29.324,37.296 L35.546,50.106 L28.008,66 Z M30.22,34.553 C30.051,34.208 29.7,33.989 29.318,33.989 L29.315,33.989 C28.929,33.99 28.578,34.211 28.412,34.558 L13.098,66.569 C12.95,66.879 12.971,67.243 13.155,67.534 C13.337,67.824 13.658,68 14.002,68 L28.642,68 C29.03,68 29.382,67.777 29.548,67.428 L37.564,50.528 C37.693,50.254 37.692,49.937 37.559,49.665 L30.22,34.553 Z M64.995,66 L52.659,66 L32.867,24.57 C32.701,24.222 32.349,24 31.962,24 L23.89,24 L23.899,14 L39.72,14 L59.42,55.429 C59.586,55.777 59.939,56 60.326,56 L64.995,56 L64.995,66 Z M65.998,54 L60.96,54 L41.259,12.571 C41.094,12.223 40.741,12 40.353,12 L22.898,12 C22.345,12 21.896,12.447 21.895,12.999 L21.884,24.999 C21.884,25.265 21.989,25.519 22.178,25.707 C22.365,25.895 22.62,26 22.887,26 L31.329,26 L51.122,67.43 C51.289,67.778 51.639,68 52.026,68 L65.998,68 C66.552,68 67,67.552 67,67 L67,55 C67,54.448 66.552,54 65.998,54 L65.998,54 Z'
6864+
id='AWS-Lambda_Icon_64_Squid'
6865+
fill='currentColor'
6866+
/>
6867+
</g>
6868+
</svg>
6869+
)
6870+
}
6871+
68466872
export function AthenaIcon(props: SVGProps<SVGSVGElement>) {
68476873
return (
68486874
<svg

0 commit comments

Comments
 (0)