Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
cf26f00
improvement(trace-spans): rewrite trace span pipeline with per-iterat…
waleedlatif1 Apr 18, 2026
94a9d62
improvement(logs): add Trace tab with two-pane tree+detail view
waleedlatif1 Apr 18, 2026
205ed3e
feat(logs): retry failed runs + show workflow input in detail
waleedlatif1 Apr 18, 2026
2d2350b
fix(ui): use inverted popover scheme for usage-control popovers
waleedlatif1 Apr 18, 2026
71d1a2b
fix(logs): trace view chevron padding, section state leak, and tab-sc…
waleedlatif1 Apr 18, 2026
8ea3e87
fix(logs): align trace tree rows to 14px content grid
waleedlatif1 Apr 18, 2026
b742f7e
fix(logs): restore scroll in log-details panel
waleedlatif1 Apr 18, 2026
e43a9cf
fix(logs): hide inactive Overview tab panel
waleedlatif1 Apr 19, 2026
07a0ef5
fix(logs): trace view padding, section cutoff, keyboard visibility
waleedlatif1 Apr 19, 2026
60a79da
fix(logs): inline Workflow State row and lift search dropdown z-index
waleedlatif1 Apr 19, 2026
d0af5d9
fix(logs): use emcn Button for View Snapshot action
waleedlatif1 Apr 19, 2026
fcafc5b
minor improvements
waleedlatif1 Apr 19, 2026
42749ab
fix(logs): trace view resizable split, bar visibility, provider icons…
waleedlatif1 Apr 24, 2026
b442253
fix(ui): scroll guard, credentials UX, design token fixes, input padding
waleedlatif1 Apr 24, 2026
0dc06d0
chore(skills): add /ship command to claude, cursor, and agents
waleedlatif1 Apr 24, 2026
31843aa
fix(input): add scroll-pr-1 to keep caret visible when text overflows
waleedlatif1 Apr 25, 2026
220b27f
fix(logs): address PR review — iteration name guard, cost race, mothe…
waleedlatif1 Apr 28, 2026
2bed48a
improvement(logs): cleanup pass — remove anti-patterns, fix design to…
waleedlatif1 Apr 28, 2026
267d3ae
fix(trace-spans): extend final model segment by position not by stale…
waleedlatif1 Apr 28, 2026
5841ca0
fix(modal): restore sidebar-width padding on non-workflow pages
waleedlatif1 Apr 28, 2026
4870ef7
fix(secrets): eliminate slow save by parallelizing DB ops and fixing …
waleedlatif1 Apr 28, 2026
197260e
updated sap block
waleedlatif1 Apr 28, 2026
5b31df7
fix(sap): remove slash from S4HANA name, set white bgColor, regenerat…
waleedlatif1 Apr 28, 2026
6636e70
fix(logs): prevent log-row arrow navigation when trace tab is active
waleedlatif1 Apr 28, 2026
64fb611
fix(logs): aggregate cost onto workflow root span; stabilize onActive…
waleedlatif1 Apr 28, 2026
3bde902
improvement(logs): fix Gantt time bounds to walk full span tree; clea…
waleedlatif1 Apr 29, 2026
bb40841
fix(logs): reset detail panel tab to overview on log switch
waleedlatif1 Apr 29, 2026
bab34fa
chore(logs): remove extraneous comments
waleedlatif1 Apr 29, 2026
3aa372f
fix(logs): restore useEffect for async setActiveWorkflow and useMemo …
waleedlatif1 Apr 29, 2026
e978cb5
fix(queries): forward AbortSignal in mothership-admin query functions
waleedlatif1 Apr 29, 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
82 changes: 82 additions & 0 deletions .agents/skills/ship/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
---
name: ship
description: Commit, push, and open a PR to staging in one shot
---

# Ship Command

You help ship code by creating commits, pushing to the remote branch, and creating PRs in the user's voice.

## Your Task

When the user runs `/ship`:

1. **Check git status** - See what files have changed
2. **Generate a commit message** following this format: `type(scope): description`
- Types: `fix`, `feat`, `improvement`, `chore`
- Scope: short identifier (e.g., `undo-redo`, `api`, `ui`)
- Keep it concise

3. **Run lint** - Run `bun run lint` from the repo root to fix formatting issues before staging

4. **Stage and commit** the changes with the generated message

5. **Push to origin** using the current branch name

6. **Create a PR** to staging with a description in the user's voice

## Commit Message Format

Based on the repo's commit history:
```
fix(scope): description for bug fixes
feat(scope): description for new features
improvement(scope): description for enhancements
chore(scope): description for maintenance
```

## PR Description Format

Use this exact template in the user's voice (concise, bullet points):

```markdown
## Summary
- bullet point describing what changed
- another bullet point if needed

## Type of Change
- [x] Bug fix (or appropriate type)

## Testing
Tested manually (or describe testing)

## Checklist
- [x] Code follows project style guidelines
- [x] Self-reviewed my changes
- [ ] Tests added/updated and passing
- [x] No new warnings introduced
- [x] I confirm that I have read and agree to the terms outlined in the [Contributor License Agreement (CLA)](./CONTRIBUTING.md#contributor-license-agreement-cla)
```

## PR Creation Command

Use this command structure:
```bash
gh pr create --base staging --title "COMMIT_MESSAGE" --body "PR_BODY"
```

## Important Notes

- Always confirm the commit message and PR description with the user before executing
- The PR should be created against `staging` branch
- Keep descriptions concise and in active voice
- Match the user's previous PR style: direct, no fluff, bullet points
- **DO NOT add "Co-Authored-By" lines to commits** - keep commit messages clean

## User's Voice Characteristics (based on previous PRs)

- Short, direct bullet points
- No unnecessary explanation
- "Tested manually" is acceptable for testing section
- Checkboxes filled in appropriately
- No screenshots section unless UI changes
Comment thread
waleedlatif1 marked this conversation as resolved.
82 changes: 82 additions & 0 deletions .claude/commands/ship.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
---
description: Commit, push, and open a PR to staging in one shot
argument-hint: [optional context or scope notes]
---

# Ship Command

You help ship code by creating commits, pushing to the remote branch, and creating PRs in the user's voice.

## Your Task

When the user runs `/ship`:

1. **Check git status** - See what files have changed
2. **Generate a commit message** following this format: `type(scope): description`
- Types: `fix`, `feat`, `improvement`, `chore`
- Scope: short identifier (e.g., `undo-redo`, `api`, `ui`)
- Keep it concise

3. **Run lint** - Run `bun run lint` from the repo root to fix formatting issues before staging

4. **Stage and commit** the changes with the generated message

5. **Push to origin** using the current branch name

6. **Create a PR** to staging with a description in the user's voice

## Commit Message Format

Based on the repo's commit history:
```
fix(scope): description for bug fixes
feat(scope): description for new features
improvement(scope): description for enhancements
chore(scope): description for maintenance
```

## PR Description Format

Use this exact template in the user's voice (concise, bullet points):

```markdown
## Summary
- bullet point describing what changed
- another bullet point if needed

## Type of Change
- [x] Bug fix (or appropriate type)

## Testing
Tested manually (or describe testing)

## Checklist
- [x] Code follows project style guidelines
- [x] Self-reviewed my changes
- [ ] Tests added/updated and passing
- [x] No new warnings introduced
- [x] I confirm that I have read and agree to the terms outlined in the [Contributor License Agreement (CLA)](./CONTRIBUTING.md#contributor-license-agreement-cla)
```

## PR Creation Command

Use this command structure:
```bash
gh pr create --base staging --title "COMMIT_MESSAGE" --body "PR_BODY"
```

## Important Notes

- Always confirm the commit message and PR description with the user before executing
- The PR should be created against `staging` branch
- Keep descriptions concise and in active voice
- Match the user's previous PR style: direct, no fluff, bullet points
- **DO NOT add "Co-Authored-By" lines to commits** - keep commit messages clean

## User's Voice Characteristics (based on previous PRs)

- Short, direct bullet points
- No unnecessary explanation
- "Tested manually" is acceptable for testing section
- Checkboxes filled in appropriately
- No screenshots section unless UI changes
77 changes: 77 additions & 0 deletions .cursor/commands/ship.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Ship Command

You help ship code by creating commits, pushing to the remote branch, and creating PRs in the user's voice.

## Your Task

When the user runs `/ship`:

1. **Check git status** - See what files have changed
2. **Generate a commit message** following this format: `type(scope): description`
- Types: `fix`, `feat`, `improvement`, `chore`
- Scope: short identifier (e.g., `undo-redo`, `api`, `ui`)
- Keep it concise

3. **Run lint** - Run `bun run lint` from the repo root to fix formatting issues before staging

4. **Stage and commit** the changes with the generated message

5. **Push to origin** using the current branch name

6. **Create a PR** to staging with a description in the user's voice

## Commit Message Format

Based on the repo's commit history:
```
fix(scope): description for bug fixes
feat(scope): description for new features
improvement(scope): description for enhancements
chore(scope): description for maintenance
```

## PR Description Format

Use this exact template in the user's voice (concise, bullet points):

```markdown
## Summary
- bullet point describing what changed
- another bullet point if needed

## Type of Change
- [x] Bug fix (or appropriate type)

## Testing
Tested manually (or describe testing)

## Checklist
- [x] Code follows project style guidelines
- [x] Self-reviewed my changes
- [ ] Tests added/updated and passing
- [x] No new warnings introduced
- [x] I confirm that I have read and agree to the terms outlined in the [Contributor License Agreement (CLA)](./CONTRIBUTING.md#contributor-license-agreement-cla)
```

## PR Creation Command

Use this command structure:
```bash
gh pr create --base staging --title "COMMIT_MESSAGE" --body "PR_BODY"
```

## Important Notes

- Always confirm the commit message and PR description with the user before executing
- The PR should be created against `staging` branch
- Keep descriptions concise and in active voice
- Match the user's previous PR style: direct, no fluff, bullet points
- **DO NOT add "Co-Authored-By" lines to commits** - keep commit messages clean

## User's Voice Characteristics (based on previous PRs)

- Short, direct bullet points
- No unnecessary explanation
- "Tested manually" is acceptable for testing section
- Checkboxes filled in appropriately
- No screenshots section unless UI changes
22 changes: 11 additions & 11 deletions apps/docs/content/docs/en/tools/sap_s4hana.mdx
Original file line number Diff line number Diff line change
@@ -1,42 +1,42 @@
---
title: SAP S/4HANA
description: Read and write SAP S/4HANA Cloud business data via OData
title: SAP S4HANA
description: Read and write SAP S4HANA Cloud business data via OData
---

import { BlockInfoCard } from "@/components/ui/block-info-card"

<BlockInfoCard
type="sap_s4hana"
color="#0A6ED1"
color="#FFFFFF"
/>

{/* MANUAL-CONTENT-START:intro */}
[SAP S/4HANA](https://www.sap.com/products/erp/s4hana.html) is SAP's flagship intelligent ERP suite, running on the in-memory HANA database. It powers finance, supply chain, procurement, sales, and manufacturing for organizations of every size, and exposes its business data through a broad catalog of OData services on SAP Business Technology Platform (BTP).
[SAP S4HANA](https://www.sap.com/products/erp/s4hana.html) is SAP's flagship intelligent ERP suite, running on the in-memory HANA database. It powers finance, supply chain, procurement, sales, and manufacturing for organizations of every size, and exposes its business data through a broad catalog of OData services on SAP Business Technology Platform (BTP).

With SAP S/4HANA, you can:
With SAP S4HANA, you can:

- **Run core business processes**: Manage finance, procurement, sales, logistics, inventory, and manufacturing on a single source of truth.
- **Model master data at scale**: Maintain business partners, customers, suppliers, products, and organizational structures across multiple company codes, sales organizations, and plants.
- **Execute transactional flows end to end**: Create and update sales orders, purchase requisitions, purchase orders, deliveries, billing documents, supplier invoices, and stock movements with full audit trails.
- **Govern access cleanly**: Use Communication Arrangements, Communication Systems, and Communication Scopes to scope OAuth client credentials to exactly the services each integration needs.
- **Integrate via standard OData**: Every entity supported here speaks OData v2 with consistent paging, filtering, expansion, and ETag-based optimistic concurrency.

In Sim, the SAP S/4HANA integration lets your agents read and write directly against your tenant's OData services using per-tenant OAuth 2.0 client credentials. Agents can list and fetch master data, create and update transactional documents, run stock and material document queries, and execute arbitrary OData v2 calls against any whitelisted Communication Scenario — all routed through a single internal proxy that handles token acquisition, CSRF fetch-and-retry, and OData error normalization. Use it to automate order-to-cash, procure-to-pay, and inventory workflows, keep SAP in sync with the rest of your stack, or trigger downstream agent logic from SAP business events.
In Sim, the SAP S4HANA integration lets your agents read and write directly against your tenant's OData services using per-tenant OAuth 2.0 client credentials. Agents can list and fetch master data, create and update transactional documents, run stock and material document queries, and execute arbitrary OData v2 calls against any whitelisted Communication Scenario — all routed through a single internal proxy that handles token acquisition, CSRF fetch-and-retry, and OData error normalization. Use it to automate order-to-cash, procure-to-pay, and inventory workflows, keep SAP in sync with the rest of your stack, or trigger downstream agent logic from SAP business events.
{/* MANUAL-CONTENT-END */}


## Usage Instructions

{/* MANUAL-CONTENT-START:usage */}
Connect any SAP S/4HANA tenant — **Cloud Public Edition**, **Cloud Private Edition (RISE)**, or **on-premise** — and read or write business data through the official OData v2 services. Each tool routes through a single internal proxy that handles token acquisition, CSRF fetch-and-retry for write operations, and OData error normalization.
Connect any SAP S4HANA tenant — **Cloud Public Edition**, **Cloud Private Edition (RISE)**, or **on-premise** — and read or write business data through the official OData v2 services. Each tool routes through a single internal proxy that handles token acquisition, CSRF fetch-and-retry for write operations, and OData error normalization.

### Deployment modes

Pick the deployment that matches your tenant in the **Deployment** dropdown:

- **S/4HANA Cloud Public Edition** — provide your **BTP subaccount subdomain** and **region** (e.g., `eu10`, `us10`). The host is derived automatically as `{subdomain}-api.s4hana.ondemand.com`, and OAuth tokens are fetched from the matching BTP UAA endpoint. Authentication is OAuth 2.0 client credentials configured in a Communication Arrangement.
- **S/4HANA Cloud Private Edition (RISE)** — provide your **OData Base URL** (e.g., `https://my-tenant.s4hana.cloud.sap`). Authenticate with **OAuth 2.0 client credentials** (provide the tenant's UAA `tokenUrl`, `clientId`, `clientSecret`) or **HTTP Basic** with a Communication User (`username`, `password`).
- **On-premise S/4HANA** — provide your **OData Base URL** (e.g., `https://sap.internal.company.com:44300`). Authenticate with **OAuth 2.0 client credentials** issued by your on-prem identity provider, or **HTTP Basic** with a service user.
- **S4HANA Cloud Public Edition** — provide your **BTP subaccount subdomain** and **region** (e.g., `eu10`, `us10`). The host is derived automatically as `{subdomain}-api.s4hana.ondemand.com`, and OAuth tokens are fetched from the matching BTP UAA endpoint. Authentication is OAuth 2.0 client credentials configured in a Communication Arrangement.
- **S4HANA Cloud Private Edition (RISE)** — provide your **OData Base URL** (e.g., `https://my-tenant.s4hana.cloud.sap`). Authenticate with **OAuth 2.0 client credentials** (provide the tenant's UAA `tokenUrl`, `clientId`, `clientSecret`) or **HTTP Basic** with a Communication User (`username`, `password`).
- **On-premise S4HANA** — provide your **OData Base URL** (e.g., `https://sap.internal.company.com:44300`). Authenticate with **OAuth 2.0 client credentials** issued by your on-prem identity provider, or **HTTP Basic** with a service user.

### What you can do

Expand All @@ -48,7 +48,7 @@ All update tools accept an optional `ifMatch` ETag. When omitted, `If-Match` def
{/* MANUAL-CONTENT-END */}


Connect SAP S/4HANA Cloud Public Edition with per-tenant OAuth 2.0 client credentials configured in your Communication Arrangements. Read and create business partners, customers, suppliers, sales orders, deliveries (inbound/outbound), billing documents, products, stock and material documents, purchase requisitions, purchase orders, and supplier invoices, or run arbitrary OData v2 queries against any whitelisted Communication Scenario.
Connect SAP S4HANA Cloud Public Edition with per-tenant OAuth 2.0 client credentials configured in your Communication Arrangements. Read and create business partners, customers, suppliers, sales orders, deliveries (inbound/outbound), billing documents, products, stock and material documents, purchase requisitions, purchase orders, and supplier invoices, or run arbitrary OData v2 queries against any whitelisted Communication Scenario.



Expand Down
6 changes: 1 addition & 5 deletions apps/sim/app/(auth)/signup/signup-form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -98,11 +98,7 @@ function SignupFormContent({ githubAvailable, googleAvailable, isProduction }: S
const [showEmailValidationError, setShowEmailValidationError] = useState(false)
const [formError, setFormError] = useState<string | null>(null)
const turnstileRef = useRef<TurnstileInstance>(null)
const [turnstileSiteKey, setTurnstileSiteKey] = useState<string | undefined>()

useEffect(() => {
setTurnstileSiteKey(getEnv('NEXT_PUBLIC_TURNSTILE_SITE_KEY'))
}, [])
const [turnstileSiteKey] = useState(() => getEnv('NEXT_PUBLIC_TURNSTILE_SITE_KEY'))
const rawRedirectUrl = searchParams.get('redirect') || searchParams.get('callbackUrl') || ''
const isValidRedirectUrl = rawRedirectUrl ? validateCallbackUrl(rawRedirectUrl) : false
const invalidCallbackRef = useRef(false)
Expand Down
43 changes: 20 additions & 23 deletions apps/sim/app/(landing)/components/auth-modal/auth-modal.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use client'

import { useCallback, useEffect, useMemo, useState } from 'react'
import { useEffect, useMemo, useState } from 'react'
import { createLogger } from '@sim/logger'
import { Loader2, X } from 'lucide-react'
import Image from 'next/image'
Expand Down Expand Up @@ -88,24 +88,21 @@ export function AuthModal({ children, defaultView = 'login', source }: AuthModal
}
}, [open, providerStatus, hasModalContent, defaultView, router, view])

const handleOpenChange = useCallback(
(nextOpen: boolean) => {
if (nextOpen && providerStatus && !hasModalContent) {
router.push(defaultView === 'login' ? '/login' : '/signup')
return
}
setOpen(nextOpen)
if (nextOpen) {
const initialView =
defaultView === 'signup' && providerStatus?.registrationDisabled ? 'login' : defaultView
setView(initialView)
captureClientEvent('auth_modal_opened', { view: initialView, source })
}
},
[defaultView, hasModalContent, providerStatus, router, source]
)
function handleOpenChange(nextOpen: boolean) {
if (nextOpen && providerStatus && !hasModalContent) {
router.push(defaultView === 'login' ? '/login' : '/signup')
return
}
setOpen(nextOpen)
if (nextOpen) {
const initialView =
defaultView === 'signup' && providerStatus?.registrationDisabled ? 'login' : defaultView
setView(initialView)
captureClientEvent('auth_modal_opened', { view: initialView, source })
}
}

const handleSocialLogin = useCallback(async (provider: 'github' | 'google') => {
async function handleSocialLogin(provider: 'github' | 'google') {
setSocialLoading(provider)
try {
await client.signIn.social({ provider, callbackURL: '/workspace' })
Expand All @@ -114,17 +111,17 @@ export function AuthModal({ children, defaultView = 'login', source }: AuthModal
} finally {
setSocialLoading(null)
}
}, [])
}

const handleSSOLogin = useCallback(() => {
function handleSSOLogin() {
setOpen(false)
router.push('/sso')
}, [router])
}

const handleEmailContinue = useCallback(() => {
function handleEmailContinue() {
setOpen(false)
router.push(view === 'login' ? '/login' : '/signup')
}, [router, view])
}

return (
<Modal open={open} onOpenChange={handleOpenChange}>
Expand Down
Loading
Loading