Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Display names for reads
  • Loading branch information
Sg312 committed Jun 2, 2026
commit f261cfee33232754fe106440a591edefa49dbc21
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@ function subagentToolCall(
}
}

function mainText(content: string): ContentBlock {
return { type: 'text', content, timestamp: 1 }
}

function mainToolCall(id: string, name: string): ContentBlock {
return { type: 'tool_call', toolCall: { id, name, status: 'success' }, timestamp: 1 }
}

describe('parseBlocks span-identity tree', () => {
it('nests a deploy subagent inside the workflow subagent that spawned it', () => {
const blocks: ContentBlock[] = [
Expand Down Expand Up @@ -101,6 +109,61 @@ describe('parseBlocks span-identity tree', () => {
expect(segments[0].items.some((item) => item.type === 'tool')).toBe(true)
})

it('interleaves mothership tools with main text instead of clustering them at the top', () => {
const blocks: ContentBlock[] = [
mainText('Let me search.'),
mainToolCall('t1', 'grep'),
subagentStart('research', 'S1', 'main'),
{ type: 'subagent_text', content: 'looking', spanId: 'S1', timestamp: 2 },
{ type: 'subagent_end', spanId: 'S1', parentSpanId: 'main', timestamp: 3 },
mainText('Found it, now finding files.'),
mainToolCall('t2', 'glob'),
]

const segments = parseBlocks(blocks)

// Order is preserved chronologically: the second mothership tool stays below
// the research subagent and the trailing text rather than jumping back up
// into the first group.
const shape = segments.map((s) => (s.type === 'agent_group' ? s.agentName : s.type))
expect(shape).toEqual(['text', 'mothership', 'research', 'text', 'mothership'])

// The two mothership tools land in two distinct groups, one each.
const mothershipGroups = segments.filter(
(s) => s.type === 'agent_group' && s.agentName === 'mothership'
)
expect(mothershipGroups).toHaveLength(2)
const [first, second] = mothershipGroups
if (first.type !== 'agent_group' || second.type !== 'agent_group') {
throw new Error('expected mothership groups')
}
expect(first.items).toHaveLength(1)
expect(second.items).toHaveLength(1)
expect(first.items[0].type === 'tool' && first.items[0].data.toolName).toBe('grep')
expect(second.items[0].type === 'tool' && second.items[0].data.toolName).toBe('glob')
})

it('absorbs the dispatch tool of a nested file subagent from its parent span group', () => {
const blocks: ContentBlock[] = [
subagentStart('workflow', 'S1', 'main'),
subagentToolCall('t1', 'workspace_file', 'S1', 'workflow'),
{ type: 'subagent', content: 'file', spanId: 'S2', parentSpanId: 'S1', timestamp: 2 },
{ type: 'subagent_text', content: 'writing', spanId: 'S2', timestamp: 3 },
]

const segments = parseBlocks(blocks)
expect(segments).toHaveLength(1)
const workflow = segments[0]
if (workflow.type !== 'agent_group') throw new Error('expected workflow group')

// The workspace_file dispatch tool is absorbed (not shown as a sibling tool);
// only the nested file subagent remains under workflow.
expect(workflow.items.some((item) => item.type === 'tool')).toBe(false)
const nested = workflow.items.find((item) => item.type === 'agent_group')
if (!nested || nested.type !== 'agent_group') throw new Error('expected nested file group')
expect(nested.group.agentName).toBe('file')
})

it('falls back to legacy flat grouping when blocks have no span identity', () => {
const blocks: ContentBlock[] = [
{ type: 'subagent', content: 'workflow', parentToolCallId: 'tc-1', timestamp: 1 },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,14 +184,39 @@ function appendTextItem(group: AgentGroupSegment, content: string): void {
function parseBlocksWithSpanTree(blocks: ContentBlock[]): MessageSegment[] {
const segments: MessageSegment[] = []
const groupsBySpanId = new Map<string, AgentGroupSegment>()
let mothership: AgentGroupSegment | null = null

const tailMothershipGroup = (): AgentGroupSegment | null => {
const last = segments[segments.length - 1]
return last?.type === 'agent_group' && last.agentName === 'mothership' ? last : null
}

// Top-level (mothership) tool calls render in a collapsible group. Reuse that
// group only while it is still the most recent segment so consecutive tools
// stay together; once any other segment (main text, a spawned subagent,
// thinking, etc.) breaks the run, the next tool opens a fresh group below it
// instead of jumping back up into the original one. This keeps the mothership's
// tools and prose interleaved in the order they actually happened.
const ensureMothership = (): AgentGroupSegment => {
if (!mothership) {
mothership = createAgentGroupSegment('mothership', 'mothership', segments.length)
segments.push(mothership)
const existing = tailMothershipGroup()
if (existing) return existing
const group = createAgentGroupSegment('mothership', 'mothership', segments.length)
segments.push(group)
return group
}

// When a subagent spawns, drop the dispatch tool that triggered it (e.g.
// workspace_file -> file) from whichever container it landed in so it does not
// render as a separate entry beside the agent group.
const absorbDispatchTool = (toolName: string, parentSpanId: string | undefined): void => {
const container =
parentSpanId && parentSpanId !== SPAN_ROOT
? groupsBySpanId.get(parentSpanId)
: tailMothershipGroup()
if (!container) return
const last = container.items[container.items.length - 1]
if (last?.type === 'tool' && last.data.toolName === toolName) {
container.items.pop()
}
return mothership
}

const attachSpanGroup = (group: AgentGroupSegment, parentSpanId: string | undefined): void => {
Expand Down Expand Up @@ -283,14 +308,9 @@ function parseBlocksWithSpanTree(blocks: ContentBlock[]): MessageSegment[] {
if (block.type === 'subagent') {
if (!block.content || !block.spanId) continue
// Absorb a trailing dispatch tool (e.g. workspace_file -> file) so it does
// not render as a separate Mothership entry alongside the agent group.
// not render as a separate entry alongside the agent group.
const dispatchToolName = SUBAGENT_DISPATCH_TOOLS[block.content]
if (dispatchToolName && mothership) {
const last = mothership.items[mothership.items.length - 1]
if (last?.type === 'tool' && last.data.toolName === dispatchToolName) {
mothership.items.pop()
}
}
if (dispatchToolName) absorbDispatchTool(dispatchToolName, block.parentSpanId)
const g = ensureSpanGroup(block.content, block.spanId, block.parentSpanId, i)
// Show the working/delegating spinner from span open until the agent
// emits its first content or tool (or ends). The legacy path derived this
Expand Down
59 changes: 58 additions & 1 deletion apps/sim/lib/copilot/tools/client/store-utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,63 @@ describe('resolveToolDisplay', () => {
).toBe('Read RET XYZ')
})

it('decodes percent-encoded VFS path segments for display', () => {
expect(
resolveToolDisplay(ReadTool.id, ClientToolCallState.executing, {
path: 'files/My%20Report.txt',
})?.text
).toBe('Reading My Report.txt')

expect(
resolveToolDisplay(ReadTool.id, ClientToolCallState.success, {
path: 'workflows/My%20Workflow/meta.json',
})?.text
).toBe('Read My Workflow')

expect(
resolveToolDisplay(ReadTool.id, ClientToolCallState.executing, {
path: 'files/caf%C3%A9.txt',
})?.text
).toBe('Reading café.txt')

expect(
resolveToolDisplay(ReadTool.id, ClientToolCallState.success, {
path: 'files/Quarterly%20Report.docx/content',
})?.text
).toBe('Read Quarterly Report.docx')
})

it('shows only the file name for file reads, dropping the folder path and content qualifier', () => {
// Bare file leaf inside a folder → just the file name (with extension).
expect(
resolveToolDisplay(ReadTool.id, ClientToolCallState.success, {
path: 'files/Skills/Skill%20%E2%80%94%20PostHog%20Analytics.md',
})?.text
).toBe('Read Skill — PostHog Analytics.md')

// Explicit content facet → no "the content of", folder dropped too.
expect(
resolveToolDisplay(ReadTool.id, ClientToolCallState.success, {
path: 'files/Skills/Skill%20%E2%80%94%20PostHog%20Analytics.md/content',
})?.text
).toBe('Read Skill — PostHog Analytics.md')

// Non-content facets keep their descriptive label but still show only the name.
expect(
resolveToolDisplay(ReadTool.id, ClientToolCallState.executing, {
path: 'files/Reports/brief.docx/meta.json',
})?.text
).toBe('Reading metadata for brief.docx')
})

it('falls back to the raw segment when it is not valid percent-encoding', () => {
expect(
resolveToolDisplay(ReadTool.id, ClientToolCallState.executing, {
path: 'files/100%done.txt',
})?.text
).toBe('Reading 100%done.txt')
})

it('formats special workspace file reads as natural language', () => {
expect(
resolveToolDisplay(ReadTool.id, ClientToolCallState.error, {
Expand All @@ -48,7 +105,7 @@ describe('resolveToolDisplay', () => {
resolveToolDisplay(ReadTool.id, ClientToolCallState.success, {
path: 'files/Reports/brief.docx/content',
})?.text
).toBe('Read the content of Reports/brief.docx')
).toBe('Read brief.docx')

expect(
resolveToolDisplay(ReadTool.id, ClientToolCallState.executing, {
Expand Down
43 changes: 32 additions & 11 deletions apps/sim/lib/copilot/tools/client/store-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { Read as ReadTool } from '@/lib/copilot/generated/tool-catalog-v1'
import { VFS_DIR_TO_RESOURCE } from '@/lib/copilot/resources/types'
import { isToolHiddenInUi } from '@/lib/copilot/tools/client/hidden-tools'
import { ClientToolCallState } from '@/lib/copilot/tools/client/tool-call-state'
import { decodeVfsSegment } from '@/lib/copilot/vfs/path-utils'

/** Respond tools are internal handoff tools shown with a friendly generic label. */
const HIDDEN_TOOL_SUFFIX = '_respond'
Expand Down Expand Up @@ -80,13 +81,28 @@ function formatReadingLabel(target: string | undefined, state: ClientToolCallSta
}
}

/**
* VFS paths store each segment percent-encoded (see {@link encodeVfsSegment}), so
* a read on "My Report.txt" arrives as "files/My%20Report.txt". Decode for
* display so the user sees the real file name. Falls back to the raw segment when
* it is not valid encoding (e.g. a literal "%" that was never encoded).
*/
function decodeVfsSegmentSafe(segment: string): string {
try {
return decodeVfsSegment(segment)
} catch {
return segment
}
}

function describeReadTarget(path: string | undefined): string | undefined {
if (!path) return undefined

const segments = path
.split('/')
.map((segment) => segment.trim())
.filter(Boolean)
.map(decodeVfsSegmentSafe)

if (segments.length === 0) return undefined

Expand All @@ -107,25 +123,30 @@ function describeReadTarget(path: string | undefined): string | undefined {
return stripExtension(resourceName)
}

const FILE_SPECIAL_READ_TARGET_PREFIXES: Record<string, string> = {
content: 'the content of',
// A workspace file is addressed as a directory of facets in the VFS
// (files/{...path}/{name}/{facet}). `content` is the default facet — reading a
// file means reading its content — so it carries no qualifier, matching a bare
// `files/{...path}/{name}` read. The remaining facets are genuinely distinct, so
// they keep a descriptive label.
const FILE_FACET_LABELS: Record<string, string> = {
content: '',
'meta.json': 'metadata for',
style: 'style details for',
'compiled-check': 'the final file check for',
}

function describeFileReadTarget(segments: string[]): string {
const lastSegment = segments[segments.length - 1] || ''
const specialPrefix = FILE_SPECIAL_READ_TARGET_PREFIXES[lastSegment]
if (specialPrefix) {
return `${specialPrefix} ${describeSpecialFilePathSubject(segments)}`
const facetLabel = FILE_FACET_LABELS[lastSegment]
// Treat the suffix as a facet only when a real file name precedes it; otherwise
// the leaf is the file itself (e.g. a file literally named "content").
if (facetLabel !== undefined && segments.length > 2) {
const fileName = segments[segments.length - 2]
return facetLabel ? `${facetLabel} ${fileName}` : fileName
}

return segments.slice(1).join('/') || lastSegment
}

function describeSpecialFilePathSubject(segments: string[]): string {
return segments.slice(1, -1).join('/') || 'this file'
// Show just the file name, not the folder path — these are glanceable status
// lines, and the other resource types already render the leaf only.
return lastSegment
}

function getLeafResourceSegment(segments: string[]): string {
Expand Down
Loading