Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
301 commits
Select commit Hold shift + click to select a range
5ea80a8
v0.6.70: legacy workflow sanitization
icecrasher321 May 7, 2026
3cc581e
v0.6.71: build error fix
icecrasher321 May 7, 2026
273e608
Merge pull request #4496 from simstudioai/staging
TheodoreSpeaks May 7, 2026
07b8f1b
v0.6.72: tables improvements, search and replace, logs with files, im…
waleedlatif1 May 9, 2026
dcaf3e9
v0.6.73: zustand v5 migration fix
icecrasher321 May 9, 2026
6aeb981
v0.6.74: security hardening, workers recycling, next-mdx-remote and o…
waleedlatif1 May 12, 2026
3e9849b
v0.6.75: scheduler claim-budget drain, helm chart hardening, mothersh…
TheodoreSpeaks May 12, 2026
64d855a
v0.6.76: helm updates, media centering, lazy loading, security hardening
waleedlatif1 May 13, 2026
ab156b5
v0.6.77: mothership improvements, trigger.dev telemetry
icecrasher321 May 14, 2026
c09a2c9
v0.6.78: file block get
Sg312 May 14, 2026
6a5eebc
v0.6.79: rate limits, tables checkboxes, drizzle config changes, bill…
waleedlatif1 May 14, 2026
4efe999
v0.6.80: security hardening, nextjs minor version bump, cloudwatch to…
waleedlatif1 May 15, 2026
f69a9a0
v0.6.81: files in agent block, file block update, mermaid version upd…
waleedlatif1 May 16, 2026
db7f1c1
v0.6.82: fix duplicate migration
Sg312 May 16, 2026
dbe8e51
v0.6.83: redis TLS SNI override for IP-based REDIS_URL, zod schema fixes
TheodoreSpeaks May 17, 2026
11bcb8f
v0.6.84: redis pub/sub SNI override, security hardening, copilot read…
TheodoreSpeaks May 17, 2026
d14af04
v0.6.85: mothership stream, resource column spacing, prospeo, findyma…
waleedlatif1 May 19, 2026
eeb1410
CONTRACTS
Sg312 May 19, 2026
6f83e4c
updates
Sg312 May 20, 2026
e6b3cce
v0.6.86: gemini 3.5 flash, wiza integration, CORS cleanup, railway an…
waleedlatif1 May 20, 2026
57a91e9
Prompt caching
Sg312 May 20, 2026
5308deb
Fix regression
Sg312 May 20, 2026
8e67558
updates to prompt caching
Sg312 May 20, 2026
160b2b8
Prompt caching trace
Sg312 May 21, 2026
97a609a
v0.6.86: CORS updates, OAuth MCP, navigation pinning dynamic pages, g…
waleedlatif1 May 21, 2026
2f4e80c
VFS updates
Sg312 May 21, 2026
c0b1657
Changelog and plan
Sg312 May 21, 2026
fde70e2
v0.6.87: performance improvements
icecrasher321 May 21, 2026
cec7b0e
VFS update
Sg312 May 22, 2026
e9ee351
v0.6.88: mutex lock on oauth refresh, files export fix, hubspot trigg…
waleedlatif1 May 22, 2026
b5b2d83
v0.6.89: connectors ui, perf improvements, mcp hardening, og image
waleedlatif1 May 23, 2026
f6c9998
v0.6.90: resource breadcrumb flash fix, dedupe external URL fetches, …
icecrasher321 May 23, 2026
e532e0a
v0.6.91: file zoom, Zoom KB connector, error classifications, LiteLLM…
waleedlatif1 May 26, 2026
fd19470
v0.6.92: enrichment table column type, table run fixes, scheduled jit…
TheodoreSpeaks May 27, 2026
856182b
v0.6.93: schedules/mcp performance improvements, integration bugfixes
icecrasher321 May 28, 2026
d550934
Improvement/mothership (#4775)
Sg312 May 28, 2026
b61089d
Fixes
Sg312 May 28, 2026
0695a8f
Add dynamic user info
Sg312 May 28, 2026
5a8e66b
Improve tool search
Sg312 May 29, 2026
6bf9e96
v0.6.94: 4.8 opus, better auth upgrade, zoominfo integration, copilot…
waleedlatif1 May 29, 2026
503432c
v0.6.95: data enrichment block, nullable workflow description fix
TheodoreSpeaks May 29, 2026
3109104
improvement(platform): workspace UI/UX overhaul + integrations catalog
emir-karabeg May 28, 2026
df5ad7d
refactor(platform): remove forms, templates, and creators features
emir-karabeg May 29, 2026
9ac1e33
New doc setup
Sg312 May 29, 2026
6a1af16
Merge origin/staging into improvement/platform
emir-karabeg May 29, 2026
0a2f745
Fixes
Sg312 May 29, 2026
186a49a
Fixes
Sg312 May 29, 2026
a8dcdd5
v0.6.96: pinned table columns, sequence number in copilot messages, t…
waleedlatif1 May 30, 2026
f34dbc4
Logs tools
Sg312 May 30, 2026
2f1f633
v0.6.97: migration fix for copilot_messages
icecrasher321 May 30, 2026
85265a6
test(workflows): update archiveWorkflow update count after forms removal
emir-karabeg May 30, 2026
e7233bb
Add finalization on error
Sg312 May 30, 2026
84f5377
Fixes
Sg312 May 30, 2026
0403765
Merge remote-tracking branch 'origin/staging' into dev
icecrasher321 May 30, 2026
5f42543
change dev CI to bun run db:push
icecrasher321 May 30, 2026
b58f591
Updates
Sg312 May 31, 2026
3f82429
Contrat update
Sg312 May 31, 2026
e32699d
v0.6.98: redundant index, security hardening, new copilot messages ta…
waleedlatif1 May 31, 2026
3b66dcf
improvement(nested): subagents
icecrasher321 May 31, 2026
569d222
updates
Sg312 Jun 1, 2026
6a7e734
upgrade
emir-karabeg Jun 1, 2026
6c05948
improvement(knowledge): polish tag filter dropdowns (#4816)
andresdjasso Jun 1, 2026
c23cb7e
merge(staging): merge origin/staging and add LinqBlockMeta
waleedlatif1 Jun 1, 2026
74a0be9
feat(blocks): add BlockMeta to Quiver and Linq; fix invalid block con…
waleedlatif1 Jun 1, 2026
f51b476
fix(integrations): fix category dropdown by defining missing LANDING_…
waleedlatif1 Jun 1, 2026
645a1d6
fix(sidebar): restore resize handle on all pages
waleedlatif1 Jun 1, 2026
23759bc
fix(sidebar): match staging onKeyDown and tabIndex on resize handle
waleedlatif1 Jun 1, 2026
a320dc7
feat(integrations): show connected credentials on integration detail …
waleedlatif1 Jun 1, 2026
a1b6124
fix(integrations): rename Add in chat to Add to Sim
waleedlatif1 Jun 1, 2026
0447e4a
fix(skills): rename Add button to Add to Sim
waleedlatif1 Jun 1, 2026
cca5054
fix(platform): restore M1/M2/M3 regressions and LazyMotion on landing…
waleedlatif1 Jun 1, 2026
86da193
fix(integrations): revert connected list to credential detail; remove…
waleedlatif1 Jun 1, 2026
90b92bb
feat(sidebar): restore workspace switcher search with updated styling
waleedlatif1 Jun 1, 2026
133959d
fix(sidebar): clean up workspace search — layout, memo, and effect guard
waleedlatif1 Jun 1, 2026
3d6aeb5
fix(sidebar): align workspace rename input selection style with workf…
waleedlatif1 Jun 1, 2026
639294f
perf(sidebar): eliminate React re-renders during sidebar drag resize
waleedlatif1 Jun 1, 2026
1bf4d52
perf(sidebar): add requestAnimationFrame throttle to resize mousemove…
waleedlatif1 Jun 1, 2026
ab6d1cc
fix(sidebar): fix drag-right lag caused by WorkspaceChrome overflow-h…
waleedlatif1 Jun 1, 2026
ea149b2
fix(icons): redesign Download icon to match Upload style; fix Upload/…
waleedlatif1 Jun 1, 2026
977d5de
fix(icons): replace Upload with Download on all remaining export/down…
waleedlatif1 Jun 1, 2026
e641dbb
fix(icons): fix remaining Upload→Download on download actions in file…
waleedlatif1 Jun 1, 2026
04e271a
updated block skills, settings pages, modals, buttons -> chips, block…
waleedlatif1 Jun 2, 2026
590250b
updated skill modal
waleedlatif1 Jun 2, 2026
12ada0c
v0.6.99: tables filter operators, copilot chat persistence consolidat…
waleedlatif1 Jun 2, 2026
9c4a5e1
Merge branch 'staging' into improvement/platform
icecrasher321 Jun 2, 2026
621d424
improvement(resource-header): refine breadcrumb truncation ux
andresdjasso Jun 2, 2026
64cbcab
Fixes
Sg312 Jun 2, 2026
8d0e9dc
improvement(resource): add floating overflow text tooltips
andresdjasso Jun 2, 2026
92da21e
wire up credits counter
icecrasher321 Jun 2, 2026
8c165bb
improvement(resource-header): mute path dropdown title
andresdjasso Jun 2, 2026
8da7e34
refactor(resource-header): share floating-tooltip engine, prune dead …
waleedlatif1 Jun 2, 2026
74705a7
refactor(emcn,resource-header): address PR #4844 review feedback
waleedlatif1 Jun 2, 2026
c190d2c
Merge branch 'improvement/platform' of github.com:simstudioai/sim int…
icecrasher321 Jun 2, 2026
797f91a
Prompt surface
Sg312 Jun 2, 2026
4f622d1
Regenerated contracts
Sg312 Jun 2, 2026
f94052c
upgrade table and styling upgrade
emir-karabeg Jun 2, 2026
8a8d77f
Merge branch 'improvement/platform' of github.com:simstudioai/sim int…
icecrasher321 Jun 2, 2026
72fd5e0
Merge branch 'staging' into improvement/platform
icecrasher321 Jun 2, 2026
b548483
Literalness gaps
Sg312 Jun 2, 2026
ff2f04f
Updates
Sg312 Jun 2, 2026
04ca645
Remove prefix for running code
Sg312 Jun 2, 2026
e8f09ae
v0.6.100: auth, mothership, scopes improvements, new apify tools
icecrasher321 Jun 2, 2026
f261cfe
Display names for reads
Sg312 Jun 2, 2026
cc87f61
Tool catalog
Sg312 Jun 2, 2026
2555137
fix schema to include integration
icecrasher321 Jun 2, 2026
350c5be
fix(files): align delete icon with tables view (Trash → Trash2)
waleedlatif1 Jun 2, 2026
21ecc58
fix(mothership): preserve blockType for integration contexts in sent …
waleedlatif1 Jun 2, 2026
13f2cc7
fix(mothership): allow 'integration' resource type in chat resources API
waleedlatif1 Jun 2, 2026
79907b1
fix(ui): Add "File" title next to file resource header
TheodoreSpeaks Jun 3, 2026
a0587a7
fix(ui): fix resource header columns being bolded
TheodoreSpeaks Jun 3, 2026
0f9ea0a
fix(resource): keep the floating tooltip from jumping on click
andresdjasso Jun 3, 2026
59197ad
perf(sidebar): eliminate unnecessary re-renders in workspace switcher…
waleedlatif1 Jun 3, 2026
ad6ced8
feat(search): context-aware cmd-k results on the integrations page
waleedlatif1 Jun 3, 2026
9c96fff
refactor(emcn): make the floating tooltip the one canonical Tooltip
andresdjasso Jun 3, 2026
7a30999
style(emcn): put tooltip text on the design scale (text-caption)
andresdjasso Jun 3, 2026
7049cec
Mship byok
Sg312 Jun 3, 2026
2df6d39
feat(sidebar): add empty task state and inline task creation
waleedlatif1 Jun 3, 2026
b448f77
invite, billing, home
emir-karabeg Jun 3, 2026
fe2bc50
Sandbox warning
Sg312 Jun 3, 2026
3ba8668
v0.6.101: 11 new knowledgebase connectors, slack scopes update, login…
waleedlatif1 Jun 3, 2026
7b32a85
improvement(seats): auto purchase seats on invitations into workspace…
icecrasher321 Jun 3, 2026
eaefa56
feat(knowledge): align connector UI with integrations page styling
waleedlatif1 Jun 3, 2026
b06f757
fix(icons): trim Folder SVG viewBox to remove right-side whitespace
waleedlatif1 Jun 3, 2026
3ad3710
fix(user-input): restore draft text synchronously to preserve context…
waleedlatif1 Jun 3, 2026
9c71774
fix(queue): render context chips in queued messages
waleedlatif1 Jun 3, 2026
c2c2738
fix(mothership): remove integrations from add-resource dropdown
waleedlatif1 Jun 3, 2026
f24ea25
fix(mothership): comment out integrations from add-resource dropdown
waleedlatif1 Jun 3, 2026
e540f5f
Merge branch 'improvement/platform' into dev
icecrasher321 Jun 3, 2026
58de276
File serializer
Sg312 Jun 3, 2026
2f58bb9
Skills
Sg312 Jun 3, 2026
598692b
chore(db): drop form, templates, template_creators, template_stars ta…
waleedlatif1 Jun 3, 2026
1a509c0
chore(db): add migration metadata for 0224 drop tables
waleedlatif1 Jun 3, 2026
b102d4f
block icons, sidebar, toolbar
emir-karabeg Jun 3, 2026
8f6a048
chore: remove remaining dead code for template-profile feature
waleedlatif1 Jun 3, 2026
e495979
fix(multi-select): preserve anchor on range selection for tasks and f…
waleedlatif1 Jun 3, 2026
53420ff
Update skills
Sg312 Jun 3, 2026
89b542f
Load skill tool
Sg312 Jun 3, 2026
1192e20
v0.6.102: support S3-compatible in object storage, GitLab code knowle…
waleedlatif1 Jun 3, 2026
de0a084
Fix vfs dynamic context encoding
Sg312 Jun 3, 2026
d009f5b
Media subagent
Sg312 Jun 3, 2026
b9cc9bc
feat(emcn): add SearchInput component and unify search bars platform-…
waleedlatif1 Jun 3, 2026
254af5c
fix(files,tables): restore new-file editor autofocus and CSV import e…
waleedlatif1 Jun 3, 2026
dc4b7fa
Move superagnet back into superagent
Sg312 Jun 3, 2026
107a98e
feat(home): score suggested actions by workspace signals
waleedlatif1 Jun 3, 2026
91bfc08
billing, teammates
emir-karabeg Jun 3, 2026
314dcb0
improvement(credentials): credentials invites, secrets tab wiring up …
icecrasher321 Jun 4, 2026
c501c53
refactor(ui): migrate settings & workspace UI to chip design system
waleedlatif1 Jun 4, 2026
1110db1
Update media
Sg312 Jun 4, 2026
52739a3
fix(mothership): restore integrations to useAvailableResources for @ …
waleedlatif1 Jun 4, 2026
c3189a7
refactor(settings): chip design-system consistency pass across all tabs
waleedlatif1 Jun 4, 2026
f6c1d3c
feat(settings): unify filter dropdowns on ChipSelect (integrations st…
waleedlatif1 Jun 4, 2026
a79b3f4
fix(mentions): require explicit @ for integration mentions; decorate …
waleedlatif1 Jun 4, 2026
b3b86c8
refactor(settings): section the API keys page like secrets
waleedlatif1 Jun 4, 2026
243d2a3
fix(settings): ChipSelect renders above modals + full-width form mode
waleedlatif1 Jun 4, 2026
fe770ee
fix(emcn): ChipSelect uses the emcn flat chevron, not lucide's square…
waleedlatif1 Jun 4, 2026
e5bf7ba
fix(emcn): ChipSelect trigger hugs its content (w-fit)
waleedlatif1 Jun 4, 2026
0dffb7d
fix(emcn): ChipSelect uses a square lucide chevron
waleedlatif1 Jun 4, 2026
c165f54
renamed tasks to chats
emir-karabeg Jun 4, 2026
469781f
rename and file change
emir-karabeg Jun 4, 2026
07e51ba
Wspace resource refs
Sg312 Jun 4, 2026
7c455ce
improvement(billing): wire up billing, org, teammates tabs + remove d…
icecrasher321 Jun 4, 2026
6090b3b
Vfs updates
Sg312 Jun 4, 2026
0b0f84e
chore(db): remove migration 0224 to regenerate on top of staging
icecrasher321 Jun 4, 2026
4b0a4c8
Merge remote-tracking branch 'origin/staging' into improvement/platform
icecrasher321 Jun 4, 2026
6d047b5
VFS updates and linter
Sg312 Jun 4, 2026
0187f81
fix type errors and regen migration?
icecrasher321 Jun 4, 2026
486f2f3
File block v5
Sg312 Jun 5, 2026
563938c
Remove docs
Sg312 Jun 5, 2026
34cf2af
Fix
Sg312 Jun 5, 2026
71b8b3f
Doccer image
Sg312 Jun 5, 2026
f7d315a
Nuke the dag
Sg312 Jun 5, 2026
fee1cd2
chore(db): drop branch migration 0226 ahead of staging merge; will re…
waleedlatif1 Jun 5, 2026
034f6dd
Merge remote-tracking branch 'origin/staging' into improvement/platform
waleedlatif1 Jun 5, 2026
6322544
chore(db): regenerate migration 0226 after staging merge
waleedlatif1 Jun 5, 2026
4d24abd
Fix lint
Sg312 Jun 5, 2026
4a6051f
externalize before compaction in fallback'
icecrasher321 Jun 5, 2026
9e5f989
Run workflow improvements
Sg312 Jun 5, 2026
fcd833f
Loosen run options validation
Sg312 Jun 5, 2026
1e99762
Lint
Sg312 Jun 5, 2026
cf96b80
fix save/discard chips to be consistent
icecrasher321 Jun 5, 2026
f76bc97
fix(ui): remove smodal tabs in favor of chip modal tabs
TheodoreSpeaks Jun 5, 2026
d63b2f0
Merge branch 'improvement/platform' into dev
icecrasher321 Jun 5, 2026
c223273
Merge branch 'improvement/platform' into dev
icecrasher321 Jun 5, 2026
fcd2e0d
update byok manager component
icecrasher321 Jun 5, 2026
a68a061
fix(ui): skip auto-scrolling on mouse highlight of workspace
TheodoreSpeaks Jun 5, 2026
f2cf09b
Add creds to wspace context
Sg312 Jun 5, 2026
965f39d
Wscontext
Sg312 Jun 5, 2026
1ce8e92
v0.6.103: readme updates, tables lifecycle improvements, new connecto…
waleedlatif1 Jun 6, 2026
000e109
fix(platform): restore settings redirects, forgot-password Enter subm…
waleedlatif1 Jun 6, 2026
68d0831
feat(usage-limits): org member specific limits (#4893)
icecrasher321 Jun 6, 2026
c78e614
pass ws id to route validations
icecrasher321 Jun 6, 2026
bbd7284
chore(db): remove migration 0226_third_spot before staging merge
waleedlatif1 Jun 6, 2026
b3cde30
Merge remote-tracking branch 'origin/staging' into improvement/platform
waleedlatif1 Jun 6, 2026
b0fb041
chore(db): regenerate migration as 0227 after staging merge
waleedlatif1 Jun 6, 2026
47c00de
Block
Sg312 Jun 6, 2026
8c86122
feat(telemetry): add posthog + audit coverage for new platform actions
waleedlatif1 Jun 6, 2026
c5d0e8f
feat(home): fill textarea on suggested prompt click instead of sending
emir-karabeg Jun 6, 2026
e48fcfa
fix(templates): name owning integration in featured block template pr…
emir-karabeg Jun 6, 2026
47044b1
fix(templates): rewrite fragment prompts so each names its integratio…
emir-karabeg Jun 6, 2026
446c989
fix(templates): name integration in remaining block template prompts
emir-karabeg Jun 6, 2026
3ade3e6
fix(icons): convert monochrome dark brand icons to currentColor for d…
emir-karabeg Jun 6, 2026
d8a3241
removed color, user input, sidebar, suggested actions, chips/emcn
emir-karabeg Jun 6, 2026
b7e38df
removed color migration
emir-karabeg Jun 6, 2026
6c2ba45
Table bump
Sg312 Jun 6, 2026
0b200e8
improve(blocks): audit block catalog metadata for accuracy and fill gaps
waleedlatif1 Jun 6, 2026
9f1e352
Merge branch 'improvement/platform' of https://github.com/simstudioai…
waleedlatif1 Jun 6, 2026
2924f0f
chore(telemetry): drop org_seat.drift_reconciled audit
waleedlatif1 Jun 6, 2026
8e69bf1
chore(db): consolidate branch migrations into single 0227
waleedlatif1 Jun 6, 2026
8e37545
fix(emcn): make ChipModal scroll internally when content exceeds view…
waleedlatif1 Jun 6, 2026
e6d2551
fix(emcn): don't close modal when dismissing a dropdown via outside c…
waleedlatif1 Jun 6, 2026
d4bac08
docs(skills): de-duplicate and correct agent docs; canonical styling …
waleedlatif1 Jun 6, 2026
10320a3
docs(skills): broaden boundary-raw-fetch scope note, sync cursor rule…
waleedlatif1 Jun 6, 2026
c7d1134
fix(emcn): harden modal popper guard and exempt caret-anchored dropdo…
waleedlatif1 Jun 6, 2026
ac7adb0
refactor(billing): drop unnecessary useCallback wrappers from event h…
waleedlatif1 Jun 6, 2026
16fd91e
fix(data-drains): complete chip migration of destination forms and fi…
waleedlatif1 Jun 6, 2026
92bbc7b
fix(emcn): broaden modal popper guard to onInteractOutside
waleedlatif1 Jun 6, 2026
a664841
fix
icecrasher321 Jun 6, 2026
ba822ee
Merge branch 'dev' of github.com:simstudioai/sim into dev
icecrasher321 Jun 6, 2026
92e3915
fix(emcn): harden modal outside interactions
waleedlatif1 Jun 6, 2026
42141c6
Remove migration 0227 to regenerate after merge
icecrasher321 Jun 6, 2026
0fd9214
Merge branch 'improvement/platform' into dev
icecrasher321 Jun 6, 2026
3d23fc4
Regenerate migration as 0228 after merging improvement/platform
icecrasher321 Jun 6, 2026
0c77453
Fix pre-existing type errors surfaced by post-merge type-check
icecrasher321 Jun 6, 2026
faed3c7
Slack trigger
Sg312 Jun 6, 2026
85b9bf2
fix tool mark complete bugs
icecrasher321 Jun 6, 2026
d080b11
Merge branch 'dev' of github.com:simstudioai/sim into dev
icecrasher321 Jun 6, 2026
991db6f
change thinking icon to just be blimp
icecrasher321 Jun 6, 2026
1b56990
Merge origin/staging into dev
icecrasher321 Jun 7, 2026
ad1d909
fix tests
icecrasher321 Jun 7, 2026
4bcdfd0
MCP fixes
Sg312 Jun 8, 2026
c7d0b97
Fix files
Sg312 Jun 8, 2026
0074fab
refactor use chat
icecrasher321 Jun 8, 2026
ed99f66
multiple fixes
icecrasher321 Jun 9, 2026
7f6438d
Fix deploys
Sg312 Jun 9, 2026
694cce6
fix billing, tracing, retry lifecycle issues
icecrasher321 Jun 9, 2026
212b67f
Merge branch 'dev' of github.com:simstudioai/sim into dev
icecrasher321 Jun 9, 2026
be7fe3e
remove stale generated migration
icecrasher321 Jun 9, 2026
e3579c7
merge staging and regenerate migration
icecrasher321 Jun 9, 2026
894d66b
merge staging in
icecrasher321 Jun 9, 2026
9b1ec8e
fix sockets err classification
icecrasher321 Jun 9, 2026
f498731
sockets invite flow fix
icecrasher321 Jun 9, 2026
a77fed8
remove stale generated migration 0229 before staging merge
icecrasher321 Jun 9, 2026
84b4274
Merge origin/staging into dev
icecrasher321 Jun 9, 2026
7f838d0
regen migration
icecrasher321 Jun 9, 2026
ff40a35
Merge branch 'staging' into dev
icecrasher321 Jun 9, 2026
5c79506
Update bun lock
Sg312 Jun 9, 2026
16e5622
Fix schema issues
Sg312 Jun 9, 2026
f2095ea
Fix lint
Sg312 Jun 9, 2026
8e58493
Fix build
Sg312 Jun 9, 2026
633c7bf
Fix merge conflict
Sg312 Jun 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,6 @@
# Client-side stream consumption, hydration, and reconnect.
/apps/sim/app/workspace/*/home/hooks/index.ts @simstudioai/mothership
/apps/sim/app/workspace/*/home/hooks/use-chat.ts @simstudioai/mothership
/apps/sim/app/workspace/*/home/hooks/use-file-preview-sessions.ts @simstudioai/mothership
/apps/sim/app/workspace/*/home/hooks/preview/ @simstudioai/mothership
/apps/sim/app/workspace/*/home/hooks/stream/ @simstudioai/mothership
/apps/sim/hooks/queries/tasks.ts @simstudioai/mothership
11 changes: 9 additions & 2 deletions .github/workflows/migrations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,15 @@ jobs:
- name: Install dependencies
run: bun install --frozen-lockfile

- name: Apply migrations
- name: Apply database schema changes
working-directory: ./packages/db
env:
DATABASE_URL: ${{ github.ref == 'refs/heads/main' && secrets.DATABASE_URL || github.ref == 'refs/heads/dev' && secrets.DEV_DATABASE_URL || secrets.STAGING_DATABASE_URL }}
run: bun run ./scripts/migrate.ts
run: |
if [ "${{ github.ref }}" = "refs/heads/dev" ]; then
echo "Dev environment detected — pushing schema with drizzle-kit (db:push)"
bun run db:push --force
else
echo "Applying versioned migrations (db:migrate)"
bun run ./scripts/migrate.ts
fi
1 change: 1 addition & 0 deletions apps/docs/components/ui/icon-mapping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
file: DocumentIcon,
file_v2: DocumentIcon,
file_v4: DocumentIcon,
file_v5: DocumentIcon,
findymail: FindymailIcon,
firecrawl: FirecrawlIcon,
fireflies: FirefliesIcon,
Expand Down
13 changes: 11 additions & 2 deletions apps/docs/content/docs/en/triggers/slack.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -32,21 +32,30 @@ Trigger workflow from Slack events like mentions, messages, and reactions
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `event` | object | Slack event data |
| ↳ `event_type` | string | Type of Slack event \(e.g., app_mention, message\) |
| ↳ `event_type` | string | Type of Slack payload: an Events API event \(e.g., app_mention, message\), an interactivity type \(e.g., block_actions\), or "slash_command" for slash commands |
| ↳ `subtype` | string | Message subtype \(e.g., channel_join, channel_leave, bot_message, file_share\). Null for regular user messages |
| ↳ `channel` | string | Slack channel ID where the event occurred |
| ↳ `channel_name` | string | Human-readable channel name |
| ↳ `channel_type` | string | Type of channel \(e.g., channel, group, im, mpim\). Useful for distinguishing DMs from public channels |
| ↳ `user` | string | User ID who triggered the event |
| ↳ `user_name` | string | Username who triggered the event |
| ↳ `bot_id` | string | Bot ID if the message was sent by a bot. Null for human users |
| ↳ `text` | string | Message text content |
| ↳ `text` | string | Message text content. For slash commands, the text after the command. For interactivity, the source message text \(falls back to the triggering action value\) |
| ↳ `timestamp` | string | Message timestamp from the triggering event |
| ↳ `thread_ts` | string | Parent thread timestamp \(if message is in a thread\) |
| ↳ `team_id` | string | Slack workspace/team ID |
| ↳ `event_id` | string | Unique event identifier |
| ↳ `reaction` | string | Emoji reaction name \(e.g., thumbsup\). Present for reaction_added/reaction_removed events |
| ↳ `item_user` | string | User ID of the original message author. Present for reaction_added/reaction_removed events |
| ↳ `command` | string | Slash command name including the leading slash \(e.g., /deploy\). Present for slash commands |
| ↳ `action_id` | string | action_id of the first interactive element triggered. Present for block_actions \(button/select clicks\) |
| ↳ `action_value` | string | Value carried by the first interactive element \(button value, selected option, date, etc.\). Present for block_actions |
| ↳ `actions` | json | Full array of interactive actions from the payload, preserving every element and its value. Present for block_actions |
| ↳ `response_url` | string | Temporary URL to post a response back to the originating message or command. Present for interactivity and slash commands |
| ↳ `trigger_id` | string | Short-lived trigger ID used to open a modal in response. Present for interactivity and slash commands |
| ↳ `callback_id` | string | Callback ID of the shortcut or view. Present for shortcuts and modal submissions |
| ↳ `api_app_id` | string | Slack app ID. Present for interactivity and slash commands |
| ↳ `message_ts` | string | Timestamp of the message the interaction originated from. Present for block_actions |
| ↳ `hasFiles` | boolean | Whether the message has file attachments |
| ↳ `files` | file[] | File attachments downloaded from the message \(if includeFiles is enabled and bot token is provided\) |

11 changes: 9 additions & 2 deletions apps/realtime/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,14 @@ async function main() {
hasRedis: !!env.REDIS_URL,
})

// Register the HTTP handler before Socket.IO attaches: engine.io captures
// pre-existing `request` listeners and forwards only non-`/socket.io/`
// requests to them, making it the single dispatcher for the shared port.
// The handler itself is assigned after the room manager exists, before listen().
// biome-ignore lint/style/useConst: must be declared before the request listener closure; assigned only after the room manager exists
let httpHandler: ReturnType<typeof createHttpHandler> | undefined
httpServer.on('request', (req, res) => httpHandler?.(req, res))

// Create Socket.IO server with Redis adapter if configured
const io = await createSocketIOServer(httpServer)

Expand All @@ -49,8 +57,7 @@ async function main() {
io.use(authenticateSocket)

// Set up HTTP handler for health checks and internal APIs
const httpHandler = createHttpHandler(roomManager, logger)
httpServer.on('request', httpHandler)
httpHandler = createHttpHandler(roomManager, logger)

// Global error handlers
process.on('uncaughtException', (error) => {
Expand Down
56 changes: 56 additions & 0 deletions apps/sim/app/api/admin/mothership/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,3 +172,59 @@ export const GET = withRouteHandler(async (req: NextRequest) => {
)
}
})

export const DELETE = withRouteHandler(async (req: NextRequest) => {
const userId = await getAuthorizedAdminUserId()
if (!userId) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
}

const adminKey = env.MOTHERSHIP_API_ADMIN_KEY
if (!adminKey) {
return NextResponse.json({ error: 'MOTHERSHIP_API_ADMIN_KEY not configured' }, { status: 500 })
}

const { searchParams } = new URL(req.url)
const queryValidation = adminMothershipQuerySchema.safeParse(searchParamsToObject(searchParams))
if (!queryValidation.success) return validationErrorResponse(queryValidation.error)
const { env: environment, endpoint } = queryValidation.data

if (!isValidEndpoint(endpoint)) {
return NextResponse.json({ error: 'invalid endpoint' }, { status: 400 })
}

const baseUrl = await getMothershipUrl(environment, userId)
if (!baseUrl) {
return NextResponse.json(
{ error: `No URL configured for environment: ${environment}` },
{ status: 400 }
)
}

const forwardParams = new URLSearchParams()
searchParams.forEach((value, key) => {
if (key !== 'env' && key !== 'endpoint') {
forwardParams.set(key, value)
}
})

const qs = forwardParams.toString()
const targetUrl = `${baseUrl}/api/admin/${endpoint}${qs ? `?${qs}` : ''}`

try {
const upstream = await fetch(targetUrl, {
method: 'DELETE',
headers: { 'x-api-key': adminKey },
})

const data = await upstream.json()
return NextResponse.json(data, { status: upstream.status })
} catch (error) {
return NextResponse.json(
{
error: `Failed to reach mothership (${environment}): ${getErrorMessage(error, 'Unknown error')}`,
},
{ status: 502 }
)
}
})
38 changes: 38 additions & 0 deletions apps/sim/app/api/billing/member-credits/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { type NextRequest, NextResponse } from 'next/server'
import { getMyMemberCreditsContract } from '@/lib/api/contracts/organization'
import { parseRequest } from '@/lib/api/server'
import { getSession } from '@/lib/auth'
import { checkOrgMemberUsageLimit } from '@/lib/billing/calculations/usage-monitor'
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'

/**
* GET /api/billing/member-credits?workspaceId=...
*
* Returns the caller's OWN per-member usage and cap inside the workspace's
* organization, in DOLLARS (the DB unit) so the client's `formatCredits` does the
* single dollars→credits conversion. Own-data only, so no admin gate (unlike the
* org/member admin route). Reuses {@link checkOrgMemberUsageLimit}, which yields a
* null limit — and the chip falls back to the plan-level view — whenever no
* per-member cap applies: non-hosted, the workspace isn't org-owned, or no cap is
* set for this member.
*/
export const GET = withRouteHandler(async (request: NextRequest) => {
const session = await getSession()
if (!session?.user?.id) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
}

const parsed = await parseRequest(getMyMemberCreditsContract, request, {})
if (!parsed.success) return parsed.response

const { workspaceId } = parsed.data.query
const { currentUsage, limit } = await checkOrgMemberUsageLimit(session.user.id, workspaceId)

return NextResponse.json({
success: true,
data: {
usedDollars: currentUsage,
limitDollars: limit,
},
})
})
134 changes: 134 additions & 0 deletions apps/sim/app/api/billing/update-cost/route.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
/**
* @vitest-environment node
*/
import { createMockRequest } from '@sim/testing'
import { beforeEach, describe, expect, it, vi } from 'vitest'

const {
mockCheckInternalApiKey,
mockRecordUsage,
mockRecordCumulativeUsage,
mockCheckAndBillOverageThreshold,
} = vi.hoisted(() => ({
mockCheckInternalApiKey: vi.fn(),
mockRecordUsage: vi.fn(),
mockRecordCumulativeUsage: vi.fn(),
mockCheckAndBillOverageThreshold: vi.fn(),
}))

vi.mock('@/lib/copilot/request/http', () => ({
checkInternalApiKey: mockCheckInternalApiKey,
}))

vi.mock('@/lib/copilot/request/otel', () => ({
withIncomingGoSpan: (
_headers: unknown,
_span: unknown,
_attrs: unknown,
fn: (span: { setAttribute: () => void; setAttributes: () => void }) => unknown
) => fn({ setAttribute: vi.fn(), setAttributes: vi.fn() }),
}))

vi.mock('@/lib/billing/core/usage-log', () => ({
recordUsage: mockRecordUsage,
recordCumulativeUsage: mockRecordCumulativeUsage,
}))

vi.mock('@/lib/billing/threshold-billing', () => ({
checkAndBillOverageThreshold: mockCheckAndBillOverageThreshold,
}))

vi.mock('@/lib/core/config/feature-flags', () => ({
isBillingEnabled: true,
}))

import { POST } from '@/app/api/billing/update-cost/route'

describe('POST /api/billing/update-cost — workspaceId attribution', () => {
beforeEach(() => {
vi.clearAllMocks()
mockCheckInternalApiKey.mockReturnValue({ success: true })
mockRecordUsage.mockResolvedValue(undefined)
mockRecordCumulativeUsage.mockResolvedValue({ billed: true, delta: 0.5, total: 0.5 })
mockCheckAndBillOverageThreshold.mockResolvedValue(undefined)
})

it('stamps workspaceId onto recorded usage when provided (no idempotency key)', async () => {
const res = await POST(
createMockRequest(
'POST',
{ userId: 'user-1', cost: 0.5, model: 'gpt', source: 'mcp_copilot', workspaceId: 'ws-1' },
{ 'x-api-key': 'internal' }
)
)
expect(res.status).toBe(200)
expect(mockRecordUsage).toHaveBeenCalledTimes(1)
expect(mockRecordUsage.mock.calls[0][0]).toMatchObject({
userId: 'user-1',
workspaceId: 'ws-1',
})
})

it('records cumulative cost via monotonic top-up when an idempotency key is present', async () => {
const res = await POST(
createMockRequest(
'POST',
{
userId: 'user-1',
cost: 0.4662453,
model: 'claude-opus-4.8',
source: 'workspace-chat',
workspaceId: 'ws-1',
idempotencyKey: 'msg-1-billing',
inputTokens: 461371,
outputTokens: 1686,
},
{ 'x-api-key': 'internal' }
)
)
expect(res.status).toBe(200)
expect(mockRecordUsage).not.toHaveBeenCalled()
expect(mockRecordCumulativeUsage).toHaveBeenCalledTimes(1)
expect(mockRecordCumulativeUsage.mock.calls[0][0]).toMatchObject({
userId: 'user-1',
workspaceId: 'ws-1',
source: 'workspace-chat',
model: 'claude-opus-4.8',
cost: 0.4662453,
eventKey: 'update-cost:msg-1-billing',
})
expect(mockCheckAndBillOverageThreshold).toHaveBeenCalledWith('user-1')
})

it('returns 409 and skips overage when the cumulative is not higher (duplicate flush)', async () => {
mockRecordCumulativeUsage.mockResolvedValue({ billed: false, delta: 0, total: 0.4662453 })
const res = await POST(
createMockRequest(
'POST',
{
userId: 'user-1',
cost: 0.4662453,
model: 'claude-opus-4.8',
source: 'workspace-chat',
workspaceId: 'ws-1',
idempotencyKey: 'msg-1-billing',
},
{ 'x-api-key': 'internal' }
)
)
expect(res.status).toBe(409)
expect(mockCheckAndBillOverageThreshold).not.toHaveBeenCalled()
})

it('rejects with 400 when workspaceId is omitted (contract-required, fail loud)', async () => {
const res = await POST(
createMockRequest(
'POST',
{ userId: 'user-1', cost: 0.5, model: 'gpt', source: 'copilot' },
{ 'x-api-key': 'internal' }
)
)
expect(res.status).toBe(400)
expect(mockRecordUsage).not.toHaveBeenCalled()
})
})
Loading
Loading