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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ dist-electron/
# Local environment variables (machine-specific paths)
.env

# Personal multi-root workspace config (machine-specific sibling paths)
*.code-workspace

# Containers' shared folder
containers/shared-data/*

Expand Down
2 changes: 1 addition & 1 deletion .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
npm run lint
npm run check:electron
npx prettier . --write
npx lint-staged
12 changes: 9 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ See [docs/changelog-template.md](docs/changelog-template.md) for formatting your

### Canvas-graph

- [#209](https://github.com/2listic/dealiiX-platform/pull/209) The canvas now recognises the full set of CORAL node types. Non-void and `const` member functions (`method`, `const_method`) — previously unmapped and rendered as a broken generic node — now render and colour like the other methods. The coral-python `primitive` type is handled through the same unified node-type list.
- [#209](https://github.com/2listic/dealiiX-platform/pull/209) Loading a graph no longer drops edges whose target input is typed `any`: import validation now accepts an `any` target input, matching the live connection validation used while drawing edges.
- [#175](https://github.com/2listic/dealiiX-platform/issues/175) Per-level undo/redo history for the canvas. Each navigation level (root graph and each open subnetwork) keeps its own independent undo/redo stacks, capped at 50 entries. Undo (Ctrl/⌘+Z) and Redo (Ctrl/⌘+Shift+Z) are available as keyboard shortcuts and as items inside the Layout sidebar group button.

### UI/UX
Expand All @@ -15,18 +17,21 @@ See [docs/changelog-template.md](docs/changelog-template.md) for formatting your
- [#112](https://github.com/2listic/dealiiX-platform/issues/112) The Project button group is now disabled when the user is not logged in, in addition to when no remote server is configured.
- [#185](https://github.com/2listic/dealiiX-platform/pull/185) Parameter section duplicate logis is via a new duplicate button instead of via right-click. Duplicated sections can be deleted with a new delete button. Sections are set back to native `<details>`/`<summary>` elements for collapsible behaviour.
- [#185](https://github.com/2listic/dealiiX-platform/pull/185) The execution modal now includes an editable parameters file name field, letting users override the file path per run without changing the global settings.
- [#209](https://github.com/2listic/dealiiX-platform/pull/209) The local **Coral plugin path** setting is now a free-text field with a Browse button (previously a file picker only), so it accepts either a plugin file path or an arbitrary value passed to the backend's `-p` flag (e.g. a comma-separated list of modules). The local probe no longer requires the plugin path to be an existing file on disk.
- [#209](https://github.com/2listic/dealiiX-platform/pull/209) Nodes with `node_type: "primitive"` now render an editable literal field (a text box, or a checkbox for booleans) like elementary constructors, so registries that use the `primitive` node type are fully usable on the canvas. Numeric value validation is also null-safe, so it no longer errors when a value is empty.
- [#209](https://github.com/2listic/dealiiX-platform/pull/209) The **Download Graph** action moved from the Project group into the renamed **Import / Export** group, next to Import Graph. It no longer requires being logged in to a remote server, so the current graph can be exported to JSON while working locally.

### Electron-Backend

- [#185](https://github.com/2listic/dealiiX-platform/pull/185) `.prm` (deal.II text parameter) files are now supported alongside JSON as a parameter file format. Format is auto-detected from content; JSON is preferred when probing since it carries richer metadata (validation patterns, defaults, documentation). When probing, the app tries the JSON candidate first and falls back to `.prm` if absent or unparseable. "Merge from file" no longer overwrites the stored parameters file name.

### SSH communication

- Added support for connecting to CORAL + Slurm containers running on a real remote machine over SSH. SSH access into the container is enabled on port 2222 via public key authentication using a volume-mounted authorised key. The SSH public key path is configured via a gitignored `.env` file so the same `docker-compose.yml` works on any machine. A step-by-step setup guide is available at `docs/remote-setup.md`.
- [#187](https://github.com/2listic/dealiiX-platform/pull/187) Added support for connecting to CORAL + Slurm containers running on a real remote machine over SSH. SSH access into the container is enabled on port 2222 via public key authentication using a volume-mounted authorised key. The SSH public key path is configured via a gitignored `.env` file so the same `docker-compose.yml` works on any machine. A step-by-step setup guide is available at `docs/remote-setup.md`.

### Docker

- `coral-remote-server` is now included in the main `docker-compose.yml` alongside `coral-ssh-slurm` and `coral-visualizer`, so a single `docker compose up` starts the full stack. The database is persisted in `coral-remote-server/data/coral.db` via a directory volume mount.
- [#187](https://github.com/2listic/dealiiX-platform/pull/187) `coral-remote-server` is now included in the main `docker-compose.yml` alongside `coral-ssh-slurm` and `coral-visualizer`, so a single `docker compose up` starts the full stack. The database is persisted in `coral-remote-server/data/coral.db` via a directory volume mount.

### Settings

Expand All @@ -39,7 +44,8 @@ See [docs/changelog-template.md](docs/changelog-template.md) for formatting your

### Project-Structure

- The renderer is now fully strict TypeScript. `jsconfig.json` renamed to `tsconfig.json` with `"strict": true` enabled; all Svelte component `<script>` blocks use `lang="ts"`; all stores converted from `.svelte.js` to `.svelte.ts`; entry point renamed from `main.js` to `main.ts`. The codebase passes `svelte-check` with zero errors under strict mode.
- [#194](https://github.com/2listic/dealiiX-platform/pull/194) The renderer is now fully strict TypeScript. `jsconfig.json` renamed to `tsconfig.json` with `"strict": true` enabled; all Svelte component `<script>` blocks use `lang="ts"`; all stores converted from `.svelte.js` to `.svelte.ts`; entry point renamed from `main.js` to `main.ts`. The codebase passes `svelte-check` with zero errors under strict mode.
- [#209](https://github.com/2listic/dealiiX-platform/pull/209) The Husky pre-commit hook now runs Prettier through `lint-staged`, formatting only staged files and re-staging the result, so formatting changes land in the commit itself instead of being left as unstaged edits afterward.

## [1.4.0] - 2026-05-11

Expand Down
10 changes: 6 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,14 +104,16 @@ Stores use Svelte 5 runes (`.svelte.ts` files):

### Node Type System

Defined in `src/lib/types/nodeTypes.ts`. Node types from CORAL:
Defined in `src/lib/types/nodeTypes.ts`. A single `NodeType` enum covers every `node_type` string emitted by either backend (C++ coral and coral-python):

- `ELEMENTARY_CONSTRUCTOR` - Primitive types (int, double, string)
- `ELEMENTARY_CONSTRUCTOR` / `PRIMITIVE` - Literal-value leaf nodes holding a directly-entered value (int, double, string, bool). C++ coral emits `elementary_constructor`; coral-python emits `primitive`. Both render an editable literal input field.
- `CONSTRUCTOR` / `EMPTY_CONSTRUCTOR` - Class constructors
- `ABSTRACT` - Abstract base classes
- `VOID_METHOD` / `VOID_CONST_METHOD` / `VOID_FUNCTION` / `FUNCTION` - Operations
- `VOID_METHOD` / `VOID_CONST_METHOD` / `METHOD` / `CONST_METHOD` / `VOID_FUNCTION` / `FUNCTION` - Operations (member functions and free functions, void and non-void)
- `NETWORK` - Encapsulated computational graphs (see Network Nodes below)

`node_type` is only a rendering hint: it selects the canvas component (`FlowCanvas.svelte` `nodeTypes` map) and colour (`nodeColors` in `nodeTypes.ts`). Neither backend dispatches execution on it — nodes are identified by their `type` string. (coral-python's `primitive` vs C++ coral's `elementary_constructor` for the same literal-leaf concept is a known naming divergence; see `.ai/coral-python-integration/node-type-vocabulary-unification.md`.)

Connection validation (`src/lib/utils/connectionsValidation.ts`) enforces type compatibility between node outputs and inputs.

### How Nodes and Edges Work Together
Expand Down Expand Up @@ -316,7 +318,7 @@ cd /app && cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build
- **IPC channels**: `execute-ssh-with-key`, `export-graph-ssh`, `set-theme`, `open-external-url`, `upload-file-ssh`, `store:get`, `store:set`, `store:remove`
- **Electron storage keys** (`electron/utils/storage.ts`): `access_token`, `username`, `settings`, `colorMode` (default: `'light'`), `registered_nodes`, `registered_network_nodes`, `jobs`, `jobIdMap`
- **Electron TypeScript build**: `electron/**/*.ts` files are compiled by `tsc` (not Vite) to `dist-electron/`. The main process uses `tsconfig.electron.json` (ESM output); the preload uses `tsconfig.electron.preload.json` (CJS output, required by Electron's sandboxed preload context). `dist-electron/` is gitignored. Type declarations for `ssh2` (which ships no `.d.ts`) live in `electron/types/ssh2.d.ts`.
- **Git hooks (Husky)**: On commit — `npm run lint` and `npm run check:electron` (failures abort), then Prettier auto-formats.
- **Git hooks (Husky)**: On commit — `npm run lint` and `npm run check:electron` (failures abort), then `lint-staged` runs Prettier on staged files only and re-stages the formatted result, so formatting changes land in the same commit.
- **CI (GitHub Actions)**: All workflows run `npm run check` (svelte-check), `npm run check:electron` (electron tsc), and `npm test`. Workflow files: `.github/workflows/ci.yml`, `.github/workflows/release-linux.yml`, `.github/workflows/release-macos.yml`.
- **API requests**: All authenticated requests go through `src/lib/requests/api.js` which auto-attaches the Bearer token. Throws `ApiError` (with `.status` and `.data`) on non-2xx responses. Project CRUD ops are in `src/lib/requests/projects.js`.
- **Canvas node creation**: `createCanvasNode(template, position, options?)` in `src/lib/utils/canvasNodeUtils.ts` creates a new @xyflow Node from a registry template. `getOutputTypeAndName(sourceNode, sourceHandle)` resolves the type/name for a source handle during drag-to-connect.
Expand Down
10 changes: 0 additions & 10 deletions NOTE.md

This file was deleted.

6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,18 @@ Eslint is used for linting. Run the following to lint
Prettier is used for formatting. Run the following to format the code or use your IDE
`npm run format`

### Automatic checks with Husky
### Automatic checks with Husky/lint-staged

[Husky](https://typicode.github.io/husky/) runs automatic checks at commit time ([.husky/pre-commit](.husky/pre-commit)): ESLint and `check:electron` (Electron TypeScript type check) abort the commit on errors; Prettier then auto-formats (a new commit is needed to include those last changes).
[Husky](https://typicode.github.io/husky/) runs automatic checks at commit time ([.husky/pre-commit](.husky/pre-commit)): ESLint and `check:electron` (Electron TypeScript type check) abort the commit on errors; [lint-staged](https://github.com/lint-staged/lint-staged) then runs Prettier on the staged files only and re-stages the formatted result, so the formatting is included in the same commit.

## TypeScript

### Renderer (Frontend UI - Svelte)

In the renderer part (`src/`) the TypeScript code is transpiled to JavaScript and bundled into the `dist/` folder by Vite. Typechecking is done with `svelte-check` using [`tsconfig.json`](tsconfig.json), which enables `strict` mode. All Svelte component `<script>` blocks use `lang="ts"`.

Run `npm run check` for a type-check-only pass.

### Electron (Backend Main Process and Preload)

The Electron main process (`electron/`) is directly typechecked and compiled with `tsc`.
Expand Down
4 changes: 4 additions & 0 deletions docs/run-coral-local.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ Open **Settings** and set the following under **Execution Mode**:
| Coral binary path | `<repo>/coral/build/core/coral` |
| Coral plugin path | `<repo>/coral/build/backends/dealii/libcoral_backend_dealii.so` |

> The **Coral plugin path** field accepts a plugin file path (use **Browse**) or any free-text value
> passed to the backend's `-p` flag — for example a comma-separated list of module names. Type it
> directly when it isn't a file on disk.

Click **Save & Sync** to probe the binary, load the node registry into the sidebar, and confirm everything works.

## Manual testing
Expand Down
3 changes: 0 additions & 3 deletions electron/utils/executionProbe.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,6 @@ const fileMustExist = (filePath: string | undefined, label: string): void => {
const probeLocalPaths = (execution: ExecutionSettings): void => {
if (execution.backendKind === 'coral') {
fileMustExist(execution.local.coralBinaryPath, 'Coral binary')
if (execution.local.coralPluginPath) {
fileMustExist(execution.local.coralPluginPath, 'Coral plugin')
}
} else if (execution.backendKind === 'executable') {
fileMustExist(execution.local.executablePath, 'Executable')
}
Expand Down
Loading
Loading