mirror of
https://github.com/simstudioai/sim.git
synced 2026-09-24 15:45:35 +08:00
* perf(tools): generate serializable tool metadata artifacts
Adds `scripts/sync-tool-metadata.ts`, which projects the executable tool
registry down to the data half nobody needs a closure for, plus typed accessors
over the result. No consumer is rewired yet — that is the next PR.
`@/tools/registry` is a ~9,000-line barrel over 4,366 tools. Each `ToolConfig`
mixes plain data (`params`, `outputs`, `name`) with closures (`request.headers`,
`transformResponse`, `directExecution`, `postProcess`), and those closures reach
every integration's SDK client and parser — which is why reaching the barrel
costs ~4,700 modules. Every client-reachable caller was audited: none of them
need a closure. They need `outputs`, `params`, or an existence check.
Two artifacts, not one. `outputs` is ~4 MB of the ~8 MB and has a single
consumer, so it is emitted separately and exposed from its own module; callers
needing only params never load it.
The data is a JSON string parsed at runtime rather than an imported `.json` or
an object literal. That is not stylistic — with `resolveJsonModule` (enabled
repo-wide) a `.json` import makes TypeScript infer a literal type for all 4,366
entries:
tsc --noEmit, baseline 12.6s
tsc --noEmit, with `.json` imports 8m07s (38x)
tsc --noEmit, with string literals 12.0s
An ambient `declare module` does not short-circuit it (measured: 8m18s), and an
object literal is the same inference work. A single string literal is one cheap
token for the compiler and the bundler, and `JSON.parse` beats evaluating the
equivalent literal at runtime.
The generator refuses to emit any function value, so shipping executable config
to the client fails loudly instead of silently. `hosting` and `schemaEnrichment`
are excluded on those grounds — both hold functions and are server-only.
Also strips empty param entries: the registry has one (`stt_deepgram_v2`, an
`undefined`) which crashes callers that read `param.type` while iterating.
`JSON.stringify` drops `undefined` on its own, so the guard is there for an
explicit `null` — which serializes faithfully and would reach consumers — and to
warn either way.
Wires `tool-metadata:check` into CI alongside the other generated-contract
gates, and ignores the generated directory in biome (it exceeds the 1 MB limit
and was being skipped with a notice on every commit).
Adds a `tool-registry-boundary` skill covering which module to import, the three
non-obvious properties of the artifacts, and how to verify an edge is actually
cut — the canvas route reaches the registry through four redundant paths, so
cutting one alone moves the module count by ~1.
* fix(tools): harden the metadata accessors against inherited keys
Review found two real defects in the generated-metadata layer.
`JSON.parse` returns an object with the normal prototype, so a bare bracket
lookup resolved inherited members: `getToolMetadata('constructor')` returned a
*function* typed as `ToolMetadata`, and `getToolOutputsMetadata('toString')`
likewise — silently violating the accessors' documented "undefined if unknown"
contract. Guarded with `Object.hasOwn`, with a parameterised regression test
over `constructor`, `toString`, `valueOf`, `hasOwnProperty` and `__proto__`.
The generator's no-functions scan also gave up past ten levels of nesting. Param
and output schemas nest arbitrarily, so a deeper closure would have been dropped
silently by `JSON.stringify` while generation reported success — shipping an
incomplete schema and defeating the guarantee the scan exists to provide. The
depth cap is gone; a `WeakSet` handles the cycles that exposes.
* docs(tools): tell tool authors to regenerate the metadata artifacts
A new tool now has a second registration step. Client code reads `params` and
`outputs` from the generated artifacts rather than from the registry, so a tool
added without regenerating them is registered but invisible to the UI — and CI
fails on the stale artifacts.
`add-tools` and `add-integration` are where someone actually adds a tool, so the
step goes in both, next to the registry edit and in each checklist.
* docs(blocks): note when a block change needs tool-metadata regeneration
Adding a block alone needs no regeneration — it references existing tool IDs and
changes no tool's shape. But a change that touches a tool alongside the block
does, and this is where that is easy to miss: a block's `outputs` are authored
to match its tools' outputs, and the UI now reads those from the generated
metadata, so a stale artifact makes the block's declared outputs disagree with
what the panel renders (and fails CI).
Completes the tool-authoring surface alongside add-tools and add-integration.
* docs(tools): cover tool removal in the regeneration guidance
The three tool-authoring skills said to regenerate after adding or changing a
tool, but not after removing one. Removal is equally breaking and equally
guarded: deleting a tool from `tools/registry.ts` without regenerating fails
`tool-metadata:check` (verified — exit 1), so a contributor following the skill
literally would have hit a CI failure the skill never warned about.
122 lines
6.0 KiB
JSON
122 lines
6.0 KiB
JSON
{
|
|
"name": "simstudio",
|
|
"packageManager": "bun@1.3.13",
|
|
"version": "0.0.0",
|
|
"private": true,
|
|
"license": "Apache-2.0",
|
|
"workspaces": [
|
|
"apps/*",
|
|
"packages/*"
|
|
],
|
|
"bin": {
|
|
"sim": "./scripts/setup/index.ts"
|
|
},
|
|
"scripts": {
|
|
"build": "turbo run build",
|
|
"dev": "turbo run dev",
|
|
"dev:sockets": "cd apps/realtime && bun run dev",
|
|
"dev:full": "bunx concurrently -n \"App,Realtime\" -c \"cyan,magenta\" \"cd apps/sim && bun run dev\" \"cd apps/realtime && bun run dev\"",
|
|
"dev:full:minimal-registry": "bunx concurrently -n \"App,Realtime\" -c \"cyan,magenta\" \"cd apps/sim && bun run dev:minimal\" \"cd apps/realtime && bun run dev\"",
|
|
"dev:full:capped": "bunx concurrently -n \"App,Realtime\" -c \"cyan,magenta\" \"cd apps/sim && bun run dev:capped\" \"cd apps/realtime && bun run dev\"",
|
|
"test": "turbo run test",
|
|
"format": "turbo run format",
|
|
"format:check": "turbo run format:check",
|
|
"lint": "turbo run lint",
|
|
"lint:check": "turbo run lint:check",
|
|
"lint:helm": "helm lint ./helm/sim --strict --values ./helm/sim/test/values-lint.yaml",
|
|
"lint:all": "turbo run lint && bun run lint:helm",
|
|
"check": "turbo run format:check",
|
|
"check:boundaries": "bun run scripts/check-monorepo-boundaries.ts",
|
|
"check:api-validation": "bun run scripts/check-api-validation-contracts.ts --check",
|
|
"check:api-validation:strict": "bun run scripts/check-api-validation-contracts.ts --check --enforce-boundary-baseline",
|
|
"check:realtime-prune": "bun run scripts/check-realtime-prune-graph.ts",
|
|
"check:zustand-v5": "bun run scripts/check-zustand-v5-selectors.ts",
|
|
"check:react-query": "bun run scripts/check-react-query-patterns.ts --check",
|
|
"check:client-boundary": "bun run scripts/check-client-boundary-imports.ts --check",
|
|
"check:utils": "bun run scripts/check-utils-enforcement.ts",
|
|
"check:bare-icons": "bun run scripts/check-bare-icons.ts",
|
|
"check:icon-paths": "bun run scripts/check-icon-paths.ts",
|
|
"check:migrations": "bun run scripts/check-migrations-safety.ts",
|
|
"check:desktop-bridge": "bun run scripts/check-desktop-bridge-contract.ts --check",
|
|
"check:desktop-ipc": "bun run scripts/check-desktop-ipc-contract.ts",
|
|
"desktop-bridge-contract:update": "bun run scripts/check-desktop-bridge-contract.ts --update",
|
|
"mship-contracts:generate": "bun run scripts/sync-mothership-stream-contract.ts",
|
|
"mship-contracts:check": "bun run scripts/sync-mothership-stream-contract.ts --check",
|
|
"billing-protocol-contract:generate": "bun run scripts/sync-billing-protocol-contract.ts",
|
|
"billing-protocol-contract:check": "bun run scripts/sync-billing-protocol-contract.ts --check",
|
|
"tool-metadata:generate": "bun run scripts/sync-tool-metadata.ts",
|
|
"tool-metadata:check": "bun run scripts/sync-tool-metadata.ts --check",
|
|
"mship-tools:generate": "bun run scripts/sync-tool-catalog.ts",
|
|
"mship-tools:check": "bun run scripts/sync-tool-catalog.ts --check",
|
|
"trace-spans-contract:generate": "bun run scripts/sync-trace-spans-contract.ts",
|
|
"trace-spans-contract:check": "bun run scripts/sync-trace-spans-contract.ts --check",
|
|
"trace-attributes-contract:generate": "bun run scripts/sync-trace-attributes-contract.ts",
|
|
"trace-attributes-contract:check": "bun run scripts/sync-trace-attributes-contract.ts --check",
|
|
"trace-attribute-values-contract:generate": "bun run scripts/sync-trace-attribute-values-contract.ts",
|
|
"trace-attribute-values-contract:check": "bun run scripts/sync-trace-attribute-values-contract.ts --check",
|
|
"trace-events-contract:generate": "bun run scripts/sync-trace-events-contract.ts",
|
|
"trace-events-contract:check": "bun run scripts/sync-trace-events-contract.ts --check",
|
|
"metrics-contract:generate": "bun run scripts/sync-metrics-contract.ts",
|
|
"metrics-contract:check": "bun run scripts/sync-metrics-contract.ts --check",
|
|
"vfs-snapshot-contract:generate": "bun run scripts/sync-vfs-snapshot-contract.ts",
|
|
"vfs-snapshot-contract:check": "bun run scripts/sync-vfs-snapshot-contract.ts --check",
|
|
"mship:generate": "bun run scripts/generate-mship-contracts.ts",
|
|
"mship:check": "bun run scripts/generate-mship-contracts.ts --check",
|
|
"library:covers": "bun run scripts/generate-library-covers.tsx",
|
|
"library:covers:check": "bun run scripts/generate-library-covers.tsx --check",
|
|
"skills:sync": "bun run scripts/sync-skills.ts",
|
|
"skills:check": "bun run scripts/sync-skills.ts --check",
|
|
"setup": "bun install && bun run scripts/setup/index.ts setup",
|
|
"sim": "bun install && bun run scripts/setup/index.ts",
|
|
"doctor": "bun run scripts/setup/index.ts doctor",
|
|
"agent-stream-docs:generate": "bun run scripts/sync-agent-stream-docs.ts",
|
|
"agent-stream-docs:check": "bun run scripts/sync-agent-stream-docs.ts --check",
|
|
"prepare": "bun husky",
|
|
"type-check": "turbo run type-check",
|
|
"release": "bun run scripts/create-single-release.ts"
|
|
},
|
|
"overrides": {
|
|
"react": "19.2.4",
|
|
"react-dom": "19.2.4",
|
|
"next": "16.2.12",
|
|
"@next/env": "16.2.12",
|
|
"drizzle-orm": "^0.45.2",
|
|
"postgres": "^3.4.5",
|
|
"minimatch": "^10.2.5",
|
|
"mermaid": "11.15.0",
|
|
"zod": "4.3.6",
|
|
"e2b": "^2.36.1"
|
|
},
|
|
"optionalDependencies": {
|
|
"@next/swc-darwin-arm64": "16.2.12",
|
|
"@next/swc-darwin-x64": "16.2.12",
|
|
"@next/swc-linux-arm64-gnu": "16.2.12",
|
|
"@next/swc-linux-x64-gnu": "16.2.12"
|
|
},
|
|
"devDependencies": {
|
|
"@biomejs/biome": "2.0.0-beta.5",
|
|
"@clack/prompts": "1.7.0",
|
|
"@octokit/rest": "^21.0.0",
|
|
"@types/opentype.js": "1.3.10",
|
|
"@vercel/og": "0.6.8",
|
|
"chalk": "5.6.2",
|
|
"glob": "13.0.0",
|
|
"gray-matter": "4.0.3",
|
|
"husky": "9.1.7",
|
|
"json-schema-to-typescript": "15.0.4",
|
|
"lint-staged": "16.0.0",
|
|
"opentype.js": "1.3.4",
|
|
"sharp": "0.35.3",
|
|
"turbo": "2.9.14"
|
|
},
|
|
"lint-staged": {
|
|
"*.{js,jsx,ts,tsx,json,css,scss}": [
|
|
"biome check --write --no-errors-on-unmatched --files-ignore-unknown=true"
|
|
]
|
|
},
|
|
"trustedDependencies": [
|
|
"isolated-vm",
|
|
"sharp"
|
|
]
|
|
}
|