Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
e0d9417
Porta feature AI Agent para o production2 (identidade visual B4a)
charles-ramos Aug 22, 2026
d4019f7
Alinha core-js para 3.28.0 (dep + devDep) — corrige dev server
charles-ramos Aug 22, 2026
4a1be8b
Adiciona override do tslib 2.6.2 — corrige tela branca (__spreadArray)
charles-ramos Aug 22, 2026
bcfde11
Agent: tema escuro (fundo #0f1c32) para casar com o dashboard do prod…
charles-ramos Aug 22, 2026
8cd9944
Filtros: adiciona matches (regex), onOrBefore e onOrAfter no production2
charles-ramos Aug 22, 2026
40e65d2
Fix seleção múltipla de células no production2 (shift-click sem desta…
charles-ramos Aug 22, 2026
8114c22
Data Browser: copia do intervalo (Cmd+C) + cor de selecao pro tema es…
charles-ramos Aug 22, 2026
3f37946
Data Browser: tecla espaço seleciona/deseleciona a linha atual (case 32)
charles-ramos Aug 22, 2026
c269227
Data Browser: checkbox de linha controlado (!! em selection) para o c…
charles-ramos Aug 22, 2026
ca15eb0
Data Browser: seleção de múltiplas linhas por arrasto nos checkboxes …
charles-ramos Aug 22, 2026
1623623
Agent: salva a apiKey na env var do app (Cloud Code), fora do localSt…
charles-ramos Aug 22, 2026
093fee6
Sidebar: corrige item Agent (icone b4a-agent + sem bloco vazio)
charles-ramos Aug 22, 2026
cd1a033
Agent: Configure com multiplos modelos (add/edit/delete), chave compa…
charles-ramos Aug 22, 2026
1c7b77c
Agent: icones do toolbar no padrao B4a
charles-ramos Aug 22, 2026
090c931
Agent: fix icone da sidebar ao ativar + botao "+" no topo pra add modelo
charles-ramos Aug 22, 2026
8910d39
Agent: alinha layout ao production2 + tooltips descritivos no toolbar
charles-ramos Aug 22, 2026
f927a92
Agent: toolbar com "+" (configurar) e "Clear" separados, sem menu "Ch…
charles-ramos Aug 22, 2026
dbd16f1
Agent: icone de Clear conversation vira refresh (mais intuitivo que l…
charles-ramos Aug 22, 2026
0f713e8
Agent: Clear vira 'New conversation' com icone de compor (edit-outline)
charles-ramos Aug 22, 2026
f0cd198
Agent: botao Clear vira texto (icones confundiam: lixeira/refresh/lapis)
charles-ramos Aug 22, 2026
03310ae
Apps: remove o banner "Upgrade to the latest version... Data Graphs"
charles-ramos Aug 22, 2026
18874a2
Agent: mostra modelo ativo no toolbar + seleção de modelo por-app
charles-ramos Aug 22, 2026
1ef6d98
Agent: reseta modelo/config/chat ao trocar de app (evita vazamento en…
charles-ramos Aug 24, 2026
d6d4f15
Agent: guarda a lista de modelos como env var (AGENT_MODELS), não loc…
charles-ramos Aug 24, 2026
8dcd29b
Agent: nome do modelo opcional (sem "My model" default) + opção de de…
charles-ramos Aug 24, 2026
fa0ba81
Agent: chama o endpoint server-side da API (chave nunca sai do backend)
charles-ramos Aug 24, 2026
55e3644
Agent: modelo vira dropdown híbrido (lista curada + "Custom…")
charles-ramos Aug 24, 2026
f868a12
Agent: roda no container do app (Cloud Code) + provisiona ao salvar
charles-ramos Aug 24, 2026
4b3fd00
Agent(cloud): drop deprecated Parse.Cloud.httpRequest; use https modu…
charles-ramos Aug 24, 2026
e61828b
Agent(cloud): inject real app context; stop master-key/hallucination …
charles-ramos Aug 24, 2026
0c42867
Agent: encode Cloud Code as base64 data URI (matches deploy format)
charles-ramos Aug 24, 2026
363b086
Agent: store AGENT_MODELS env var as base64 (JSON was mangled in cont…
charles-ramos Aug 24, 2026
a8beef1
Agent: remove model label from toolbar; fix chat layout + Shift+Enter
charles-ramos Aug 24, 2026
c683ef7
Agent: fix code block styling in chat (neutralize PrismJS/line-numbers)
charles-ramos Aug 24, 2026
984f66e
Agent: render code blocks with the Monaco editor (read-only)
charles-ramos Aug 24, 2026
7cef718
Agent(cloud): scope MCP suggestions to deploy/cloud-code cases only
charles-ramos Aug 24, 2026
40f660a
Agent(cloud): include the Back4App MCP URL (back4app.com/mcp) in sugg…
charles-ramos Aug 24, 2026
02b92b7
Agent V3: chat via @back4app2/sdk, scoped to the current Parse app
charles-ramos Aug 24, 2026
61677c8
Agent V3: fix ts-invariant resolution for homolog build
charles-ramos Aug 24, 2026
6c7aca8
Agent V3: render inside dashboard chrome, fix app context, add Create…
charles-ramos Aug 24, 2026
77134e4
Restore NavbarWrapper (was committed commented-out by mistake)
charles-ramos Aug 24, 2026
3e6950d
Agent V3: parse progress events into a task indicator; add delete agent
charles-ramos Aug 24, 2026
3c0b639
Agent V3: keep the chat input visible after creating an agent
charles-ramos Aug 25, 2026
fb2e04a
Agent: parameterize backend flavor (AGENT_FLAVOR) for the 'v4' direction
charles-ramos Aug 25, 2026
810c581
Agent: switch AGENT_FLAVOR to 'V4' (v4 backend is deployed)
charles-ramos Aug 25, 2026
cf4b370
Agent: BYOK dialog — set your own OpenAI/Anthropic key for the app's …
charles-ramos Aug 25, 2026
7732004
Bump @back4app2/sdk to 1.0.0-beta.440.173 (v4 flavor + BYOK)
charles-ramos Aug 25, 2026
8b64ae8
Agent(v4): ask for the LLM key at creation, not after
charles-ramos Aug 25, 2026
247e377
Agent(v4): show a "starting the agent" state during container cold-start
charles-ramos Aug 25, 2026
45c4dc5
Agent(v4): replace in-place key edit with New agent + Clear key
charles-ramos Aug 25, 2026
de90c13
Agent(v4): one provider per agent — pick OpenAI OR Anthropic
charles-ramos Aug 26, 2026
bfcb318
Agent(v4): use a Dropdown for provider choice instead of a Toggle
charles-ramos Aug 26, 2026
aceb1dc
Agent(v4): replace window.confirm with B4aModal (Cloud Code style)
charles-ramos Aug 26, 2026
126b1ec
Agent(v4): BYOK is mandatory — require the client's own key
charles-ramos Aug 26, 2026
a8c7449
Agent(v4): icon buttons + tooltips for New agent / Delete agent
charles-ramos Aug 26, 2026
5c0ae1c
Agent(v4): show only the exception message, not the whole traceback
charles-ramos Aug 26, 2026
995affd
Agent(v4): gate the chat until the agent is READY
charles-ramos Aug 26, 2026
e51b000
Agent(v4): keep input focused after sending
charles-ramos Aug 26, 2026
16d422b
Agent(v4): trim the agent-creation modal subtitle
charles-ramos Aug 26, 2026
9f25c79
Agent(v4): border on the Send button when it's actionable
charles-ramos Aug 26, 2026
4d86bcc
Agent(v4): Send button border uses $agentBorder (match message cards)
charles-ramos Aug 26, 2026
2c0f328
Agent: rename V3 -> V4 nomenclature in the dashboard
charles-ramos Aug 26, 2026
3098cf9
Agent: rename V3 -> V4 class/import/comments (dashboard is the V4 fla…
charles-ramos Aug 26, 2026
b396e52
Agent(v4): let the client pick the LLM model in the create dialog
charles-ramos Aug 27, 2026
c4bf4a3
Bump @back4app2/sdk to 1.0.0-beta.440.174 (client-chosen model)
charles-ramos Aug 27, 2026
8bb4664
Point the Agent V4 client at b4aSettings instead of hardcoded homolog
charles-ramos Aug 28, 2026
d4795f4
Keep a sidebar section badge right-aligned when the section is active
charles-ramos Aug 28, 2026
f3ce68e
Name the dashboard agent "Backend Agent", with an AI icon and a NEW b…
charles-ramos Aug 28, 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
865 changes: 865 additions & 0 deletions Parse-Dashboard/app.js

Large diffs are not rendered by default.

9 changes: 7 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
"@babel/runtime-corejs3": "7.20.13",
"@back4app/back4app-settings": "1.6.5",
"@back4app2/react-components": "1.0.0-beta.440.130",
"@back4app2/sdk": "^1.0.0-beta.440.174",
"@monaco-editor/react": "4.7.0",
"@paddle/paddle-js": "1.4.2",
"@sentry/react": "8.52.0",
Expand Down Expand Up @@ -101,6 +102,7 @@
"semver": "7.5.2",
"sweetalert2": "11.10.5",
"sweetalert2-react-content": "1.0.1",
"ts-invariant": "^0.10.3",
"typescript": "4.8.3",
"util": "^0.12.5",
"yup": "1.3.2"
Expand All @@ -125,7 +127,7 @@
"babel-eslint": "10.1.0",
"babel-loader": "9.1.2",
"babel-plugin-transform-object-rest-spread": "6.26.0",
"core-js": "3.6.5",
"core-js": "3.28.0",
"cross-env": "7.0.2",
"css-loader": "6.7.3",
"eslint": "8.24.0",
Expand Down Expand Up @@ -219,5 +221,8 @@
"*.css",
"*.scss",
"./src/components/B4ACodeTree/B4ACodeTree.react.js"
]
],
"overrides": {
"tslib": "2.6.2"
}
}
66 changes: 66 additions & 0 deletions src/components/BrowserCell/B4aBrowserCell.scss
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,72 @@
}
}

// Multi-cell (shift-click) selection highlight. The B4a BrowserCell references
// these classes; without them the selection had no visual feedback.
.selected {
background-color: rgba(22, 105, 252, 0.3);
}

.leftBorder {
position: relative;

&:after {
position: absolute;
pointer-events: none;
content: '';
border-left: 2px solid #1669fc;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
}

.rightBorder {
position: relative;

&:after {
position: absolute;
pointer-events: none;
content: '';
border-right: 2px solid #1669fc;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
}

.topBorder {
position: relative;

&:after {
position: absolute;
pointer-events: none;
content: '';
border-top: 2px solid #1669fc;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
}

.bottomBorder {
position: relative;

&:after {
position: absolute;
pointer-events: none;
content: '';
border-bottom: 2px solid #1669fc;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
}

// .readonly {
// color: #353446;
// opacity: .9;
Expand Down
10 changes: 8 additions & 2 deletions src/components/BrowserRow/BrowserRow.react.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ export default class BrowserRow extends Component {
rowWidth,
selection,
selectRow,
onMouseDownRowCheckBox,
onMouseOverRowCheckBox,
setCopyableValue,
setCurrent,
setEditing,
Expand Down Expand Up @@ -66,12 +68,16 @@ export default class BrowserRow extends Component {
}
return (
<div className={styles.tableRow} style={{ minWidth: rowWidth + 34 }}> { /** 34 -> extra padding to cover up last column */}
<span className={styles.checkCell}>
<span
className={styles.checkCell}
onMouseOver={() => onMouseOverRowCheckBox && onMouseOverRowCheckBox(obj.id)}
>
<input
disabled={row < 0}
type='checkbox'
checked={selection['*'] || selection[obj.id]}
checked={!!selection['*'] || !!selection[obj.id]}
onChange={e => selectRow(obj.id, e.target.checked)}
onMouseDown={e => onMouseDownRowCheckBox && onMouseDownRowCheckBox(e.target.checked)}
/>
</span>
{order.map(({ name, width, visible }, j) => {
Expand Down
16 changes: 16 additions & 0 deletions src/components/Sidebar/B4aSidebar.scss
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,22 @@ $aiToolsOpenHeight: 110px;
& svg {
fill: currentColor;
}

// B4aBadge positions itself with `float: right`, which works in the default
// (block) header but is ignored here: this active header is a flex
// container, and floats do not apply to flex items — the badge would end up
// flush against the label. `margin-left: auto` is the flex equivalent.
//
// Matches the last span ONLY when it is not the only one, i.e. exactly when
// a badge follows the label. With no badge (or a collapsed sidebar, where
// the label span is not rendered) nothing matches, so the label is never
// pushed right.
> span:last-of-type:not(:only-of-type) {
margin-left: auto;
// The badge's 5px top offset compensates for the block layout; here
// align-items: center already handles it.
margin-top: 0;
}
}
}

Expand Down
4 changes: 4 additions & 0 deletions src/components/Sidebar/B4aSidebarSection.react.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,10 @@ const getIconContent = (icon) => {
<LazyB4aLogsIcon />
</Suspense>
);
case 'b4a-ai':
// No dedicated colored active-state component; keep the sprite icon so it
// does not disappear when the Agent section is active.
return <Icon width={20} height={20} name="b4a-ai" fill="#ffffff" />;
default:
return null;
}
Expand Down
17 changes: 2 additions & 15 deletions src/dashboard/Apps/AppsIndex.react.js
Original file line number Diff line number Diff line change
Expand Up @@ -196,21 +196,8 @@ class AppsIndex extends React.Component {
</div>
);
}
let upgradePrompt = null;
if (this.props.newFeaturesInLatestVersion.length > 0) {
const newFeaturesNodes = this.props.newFeaturesInLatestVersion.map(feature => (
<strong>{feature}</strong>
));
upgradePrompt = (
<FlowFooter>
Upgrade to the{' '}
<a href="https://www.npmjs.com/package/parse-dashboard" target="_blank">
latest version
</a>{' '}
of Backend Dashboard to get access to: {joinWithFinal('', newFeaturesNodes, ', ', ' and ')}.
</FlowFooter>
);
}
// Upgrade prompt banner removed (was shown when newFeaturesInLatestVersion was set).
const upgradePrompt = null;
return (
<div className={styles.index}>
<div className={styles.header}>
Expand Down
2 changes: 2 additions & 0 deletions src/dashboard/Dashboard.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import AppData from './AppData.react';
import AppsIndex from './Apps/AppsIndex.react';
import AppsManager from 'lib/AppsManager';
import Browser from './Data/Browser/Browser.react';
import Agent from './Data/Agent/AgentV4.react';
// import CloudCode from './Data/CloudCode/B4ACloudCode.react';
import AppOverview from './Data/AppOverview/AppOverview.react';
import Config from './Data/Config/Config.react';
Expand Down Expand Up @@ -424,6 +425,7 @@ class Dashboard extends React.Component {
<Route path="browser" element={<BrowserRoute />} />

<Route path="cloud_code" element={<LazyComponentWrapper><LazyCloudCode /></LazyComponentWrapper>} />
<Route path="agent" element={<Agent />} />
<Route path="webhooks" element={<Webhooks />} />

<Route path="jobs">{JobsRoute}</Route>
Expand Down
7 changes: 7 additions & 0 deletions src/dashboard/DashboardView.react.js
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,13 @@ export default class DashboardView extends React.Component {
subsections: apiSubSections
});

appSidebarSections.push({
name: 'Backend Agent',
icon: 'b4a-ai',
link: '/agent',
badgeParams: { label: 'NEW', color: 'green' },
});

const notificationSubSections = [
{
name: 'Email',
Expand Down
Loading
Loading