Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 3 additions & 1 deletion .agents/skills/add-integration/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,15 @@ export interface {Service}{Action}Params {
optionalParam?: string
}

export interface {Service}Response extends ToolResponse {
export interface {Service}{Action}Response extends ToolResponse {
output: {
// Define output structure
}
}
```

Declare one response interface per tool, imported by that tool's `ToolConfig<Params, Response>` (or `InternalToolConfig` for in-process work). Never add an umbrella `{Service}Response` union: nothing imports it.

**Tool file pattern:** an external provider API uses `ToolConfig` with `request` (absolute `https://` URL, headers, body, `transformResponse`); same-process Sim work uses `InternalToolConfig` with `operation`. Both full templates, param visibility rules, and output typing live in `.agents/skills/add-tools/SKILL.md` — read it before writing the first tool.

### Critical Rules
Expand Down
2 changes: 2 additions & 0 deletions .agents/skills/add-tools/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,8 @@ export interface {Service}{Action}Response extends ToolResponse {
}
```

Each response interface is imported by its tool's config: `ToolConfig<Params, Response>` for an external API, `InternalToolConfig<Params, Response>` for in-process work. Never add an umbrella `{Service}Response` union of them: nothing imports it.

## Index.ts Barrel Export Pattern

```typescript
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ export function ChatResourcePanel({
setTableViewContext,
previewSession,
isSending,
genericResourceData,
} = chat
const {
isResourceCollapsed,
Expand Down Expand Up @@ -102,7 +101,6 @@ export function ChatResourcePanel({
isCollapsed={isResourceCollapsed}
previewSession={previewSession}
isAgentResponding={isSending}
genericResourceData={genericResourceData ?? undefined}
onSummarize={summarize}
onUserInteraction={handleResourceInteraction}
className={skipResourceTransition ? 'transition-none!' : undefined}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,73 +1,8 @@
'use client'

import { useEffect, useRef } from 'react'
import { PillsRing } from '@sim/emcn'
import { getToolStatusDisplayTitle } from '@/lib/mothership/tools/tool-display'
import type { GenericResourceData } from '@/app/workspace/[workspaceId]/home/types'

interface GenericResourceContentProps {
data: GenericResourceData
}

// TODO: Emir — replace with rich UI (status icons, collapsible result cards, copy-to-clipboard, etc.)
export function GenericResourceContent({ data }: GenericResourceContentProps) {
const bottomRef = useRef<HTMLDivElement>(null)

useEffect(() => {
const el = bottomRef.current
const container = el?.parentElement
if (container) {
container.scrollTop = container.scrollHeight
}
}, [data.entries.length])

if (data.entries.length === 0) {
return (
<div className='flex h-full items-center justify-center'>
<p className='text-[var(--text-muted)] text-small'>No results yet</p>
</div>
)
}

/** The panel for a `generic` resource, which carries no content of its own. */
export function GenericResourceContent() {
Comment thread
waleedlatif1 marked this conversation as resolved.
return (
<div className='flex h-full flex-col divide-y divide-[var(--border)] overflow-y-auto [scrollbar-gutter:stable]'>
{data.entries.map((entry) => (
<div key={entry.toolCallId} className='flex flex-col gap-2 px-4 py-3'>
<div className='flex items-center gap-2'>
{entry.status === 'executing' && (
<PillsRing className='size-[14px] shrink-0 text-[var(--text-tertiary)]' animate />
)}
<span className='text-[var(--text-primary)] text-small'>
{getToolStatusDisplayTitle(entry.displayTitle, entry.status, entry.toolName)}
</span>
{entry.status === 'error' && (
<span className='ml-auto text-[var(--text-error)] text-caption'>Error</span>
)}
{entry.status === 'skipped' && (
<span className='ml-auto text-[var(--text-muted)] text-caption'>Skipped</span>
)}
{entry.status === 'rejected' && (
<span className='ml-auto text-[var(--text-muted)] text-caption'>Rejected</span>
)}
</div>
{entry.streamingArgs && (
<pre className='overflow-x-auto whitespace-pre-wrap break-words font-mono text-[var(--text-body)] text-caption'>
{entry.streamingArgs}
</pre>
)}
{!entry.streamingArgs && entry.result?.output != null && (
<pre className='overflow-x-auto whitespace-pre-wrap break-words font-mono text-[var(--text-body)] text-caption'>
{typeof entry.result.output === 'string'
? entry.result.output
: JSON.stringify(entry.result.output, null, 2)}
</pre>
)}
{entry.result?.error && (
<p className='text-[var(--text-error)] text-caption'>{entry.result.error}</p>
)}
</div>
))}
<div ref={bottomRef} />
<div className='flex h-full items-center justify-center'>
<p className='text-[var(--text-muted)] text-small'>No results yet</p>
</div>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,7 @@ import { GenericResourceContent } from '@/app/workspace/[workspaceId]/home/compo
import { TerminalSession } from '@/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/components/terminal-session/terminal-session'
import { RESOURCE_TAB_ICON_CLASS } from '@/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-tabs/resource-tab-controls'
import { hasRenderableFilePreviewContent } from '@/app/workspace/[workspaceId]/home/hooks/preview'
import type {
GenericResourceData,
MothershipResource,
} from '@/app/workspace/[workspaceId]/home/types'
import type { MothershipResource } from '@/app/workspace/[workspaceId]/home/types'
import { KnowledgeBase } from '@/app/workspace/[workspaceId]/knowledge/[id]/base'
import { LogDetailsContent } from '@/app/workspace/[workspaceId]/logs/components'
import { useFeatureFlag } from '@/app/workspace/[workspaceId]/providers/feature-flags-provider'
Expand Down Expand Up @@ -113,7 +110,6 @@ interface ResourceContentProps {
previewMode?: PreviewMode
previewSession?: FilePreviewSession | null
isAgentResponding?: boolean
genericResourceData?: GenericResourceData
previewContextKey?: string
onNotFound?: (resourceId: string) => void
/**
Expand Down Expand Up @@ -187,7 +183,6 @@ export const ResourceContent = memo(function ResourceContent({
previewMode,
previewSession,
isAgentResponding,
genericResourceData,
previewContextKey,
onNotFound,
visible = true,
Expand Down Expand Up @@ -351,9 +346,7 @@ export const ResourceContent = memo(function ResourceContent({
)

case 'generic':
return (
<GenericResourceContent key={resource.id} data={genericResourceData ?? { entries: [] }} />
)
return <GenericResourceContent key={resource.id} />

case 'browser':
// One panel serves every browser tab of the chat: the desktop app
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import { TerminalSession } from '@/app/workspace/[workspaceId]/home/components/m
import { ResourceWorkspaceHost } from '@/app/workspace/[workspaceId]/home/components/resource-workspace-host'
import { hasRenderableFilePreviewContent } from '@/app/workspace/[workspaceId]/home/hooks/preview'
import type {
GenericResourceData,
MothershipResource,
MothershipResourceType,
} from '@/app/workspace/[workspaceId]/home/types'
Expand Down Expand Up @@ -105,7 +104,6 @@ interface MothershipViewProps {
previewSession?: FilePreviewSession | null
isAgentResponding?: boolean
onSummarize: (message: string, filters: WorkspaceSearchFilters) => void
genericResourceData?: GenericResourceData
/** Claims the current resource selection after direct panel interaction. */
onUserInteraction?: () => void
}
Expand All @@ -126,7 +124,6 @@ export const MothershipView = memo(
className,
previewSession,
isAgentResponding,
genericResourceData,
onSummarize,
onUserInteraction,
}: MothershipViewProps,
Expand Down Expand Up @@ -316,7 +313,6 @@ export const MothershipView = memo(
previewMode={isActivePreviewable ? previewMode : undefined}
previewSession={previewForActive}
isAgentResponding={isAgentResponding}
genericResourceData={active.type === 'generic' ? genericResourceData : undefined}
previewContextKey={chatId}
onNotFound={(resourceId) => removeResource('log', resourceId, active.workspaceId)}
/>
Expand Down Expand Up @@ -348,8 +344,7 @@ function ScopedResourceContent({
if (props.resource.type === 'search')
return <SearchResourceContent resource={props.resource} onSummarize={onSummarize} />
if (!workspaceId) {
if (props.resource.type === 'generic')
return <GenericResourceContent data={props.genericResourceData ?? { entries: [] }} />
if (props.resource.type === 'generic') return <GenericResourceContent />
if (props.resource.type === 'browser')
return (
<BrowserSession
Expand Down
3 changes: 0 additions & 3 deletions apps/sim/app/workspace/[workspaceId]/home/hooks/use-chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,6 @@ import type {
ChatRequestMode,
ContentBlock,
FileAttachmentForApi,
GenericResourceData,
MothershipResource,
MothershipResourceType,
QueuedMessage,
Expand Down Expand Up @@ -281,7 +280,6 @@ export interface UseChatReturn {
editingQueuedId: string | null
dispatchingHeadId: string | null
previewSession: FilePreviewSession | null
genericResourceData: GenericResourceData | null
getCurrentRequestId: () => string | undefined
}

Expand Down Expand Up @@ -4981,7 +4979,6 @@ export function useChat(
editingQueuedId,
dispatchingHeadId,
previewSession,
genericResourceData: null,
getCurrentRequestId,
}
}
14 changes: 0 additions & 14 deletions apps/sim/app/workspace/[workspaceId]/home/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,20 +55,6 @@ interface ToolCallResult {
error?: string
}

interface GenericResourceEntry {
toolCallId: string
toolName: string
displayTitle: string
status: ToolCallStatus
params?: Record<string, unknown>
streamingArgs?: string
result?: ToolCallResult
}

export interface GenericResourceData {
entries: GenericResourceEntry[]
}

export interface ToolCallData {
id: string
toolName: string
Expand Down
1 change: 0 additions & 1 deletion apps/sim/blocks/blocks/airtable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,6 @@ Return ONLY the valid JSON array of record ID strings - no explanations, no mark
typecast: { type: 'boolean', description: 'Auto-convert string values to field types' },
recordIds: { type: 'json', description: 'Record IDs to delete' }, // Required for delete
},
// Output structure depends on the operation, covered by AirtableResponse union type
outputs: {
bases: { type: 'json', description: 'List of accessible Airtable bases' },
tables: { type: 'json', description: 'Table schemas with fields and views' },
Expand Down
25 changes: 0 additions & 25 deletions apps/sim/tools/ahrefs/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -569,28 +569,3 @@ export interface AhrefsPaidPagesResponse extends ToolResponse {
paidPages: AhrefsPaidPage[]
}
}

export type AhrefsResponse =
| AhrefsDomainRatingResponse
| AhrefsBacklinksResponse
| AhrefsBacklinksStatsResponse
| AhrefsReferringDomainsResponse
| AhrefsOrganicKeywordsResponse
| AhrefsTopPagesResponse
| AhrefsKeywordOverviewResponse
| AhrefsBrokenBacklinksResponse
| AhrefsMetricsResponse
| AhrefsOrganicCompetitorsResponse
| AhrefsRankTrackerOverviewResponse
| AhrefsRankTrackerSerpOverviewResponse
| AhrefsRankTrackerCompetitorsOverviewResponse
| AhrefsRankTrackerCompetitorsStatsResponse
| AhrefsBatchAnalysisResponse
| AhrefsSiteAuditPageExplorerResponse
| AhrefsDomainRatingHistoryResponse
| AhrefsMetricsHistoryResponse
| AhrefsRefdomainsHistoryResponse
| AhrefsKeywordsHistoryResponse
| AhrefsRelatedTermsResponse
| AhrefsAnchorsResponse
| AhrefsPaidPagesResponse
13 changes: 0 additions & 13 deletions apps/sim/tools/airtable/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import type { AirtableGetBaseSchemaResponse } from '@/tools/airtable/get_base_schema'
import type { ToolResponse } from '@/tools/types'

// Common types
Expand Down Expand Up @@ -198,15 +197,3 @@ export interface AirtableUpsertResponse extends ToolResponse {
}
}
}

export type AirtableResponse =
| AirtableListBasesResponse
| AirtableListTablesResponse
| AirtableListResponse
| AirtableGetResponse
| AirtableCreateResponse
| AirtableUpdateResponse
| AirtableUpdateMultipleResponse
| AirtableDeleteResponse
| AirtableUpsertResponse
| AirtableGetBaseSchemaResponse
28 changes: 0 additions & 28 deletions apps/sim/tools/apollo/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -675,31 +675,3 @@ export interface ApolloSequenceSearchResponse extends ToolResponse {
total_entries: number
}
}

// Union type for all Apollo responses
export type ApolloResponse =
| ApolloPeopleSearchResponse
| ApolloPeopleEnrichResponse
| ApolloPeopleBulkEnrichResponse
| ApolloOrganizationSearchResponse
| ApolloOrganizationEnrichResponse
| ApolloOrganizationBulkEnrichResponse
| ApolloContactCreateResponse
| ApolloContactUpdateResponse
| ApolloContactBulkCreateResponse
| ApolloContactBulkUpdateResponse
| ApolloContactSearchResponse
| ApolloAccountCreateResponse
| ApolloAccountUpdateResponse
| ApolloAccountSearchResponse
| ApolloAccountBulkCreateResponse
| ApolloAccountBulkUpdateResponse
| ApolloSequenceAddContactsResponse
| ApolloTaskCreateResponse
| ApolloTaskSearchResponse
| ApolloEmailAccountsResponse
| ApolloSequenceSearchResponse
| ApolloOpportunityCreateResponse
| ApolloOpportunitySearchResponse
| ApolloOpportunityGetResponse
| ApolloOpportunityUpdateResponse
5 changes: 0 additions & 5 deletions apps/sim/tools/arxiv/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,3 @@ export interface ArxivGetAuthorPapersResponse extends ToolResponse {
authorName: string
}
}

export type ArxivResponse =
| ArxivSearchResponse
| ArxivGetPaperResponse
| ArxivGetAuthorPapersResponse
14 changes: 0 additions & 14 deletions apps/sim/tools/asana/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -285,17 +285,3 @@ export interface AsanaListSectionsResponse extends ToolResponse {
}>
}
}

export type AsanaResponse =
| AsanaGetTaskResponse
| AsanaCreateTaskResponse
| AsanaUpdateTaskResponse
| AsanaGetProjectsResponse
| AsanaSearchTasksResponse
| AsanaAddCommentResponse
| AsanaProjectRecordResponse
| AsanaListWorkspacesResponse
| AsanaDeleteTaskResponse
| AsanaAddFollowersResponse
| AsanaSectionResponse
| AsanaListSectionsResponse
Loading
Loading