Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
ecb8876
Add v3.9 schema for fleet models, RuntimeClass, and container extras.
emirhandurmus Sep 16, 2026
b28e0f1
Land empty databases on the v3.9 baseline schema.
emirhandurmus Sep 16, 2026
6608d8e
Expose linked models and RuntimeClasses on the agent API.
emirhandurmus Sep 16, 2026
c0220b4
Add fleet model CRUD, YAML, and per-fog linking.
emirhandurmus Sep 16, 2026
1f194df
Add RuntimeClass catalog with edgelet-only fog attach.
emirhandurmus Sep 16, 2026
c2e60b2
Extend registries with type, CA, and insecure, and keep image pulls O…
emirhandurmus Sep 16, 2026
c6f472c
Add microservice catalog PATCH and persist Edgelet container fields.
emirhandurmus Sep 16, 2026
44ba586
Add microservice templates with YAML and deploy overlay.
emirhandurmus Sep 16, 2026
d2b5112
Remove HAL and BLE provisioning while keeping Edge Guard.
emirhandurmus Sep 16, 2026
bef7762
Catalog models, RuntimeClasses, and microservice templates in RBAC an…
emirhandurmus Sep 16, 2026
b2f94a1
Cover fleet model and RuntimeClass flows and record the unreleased no…
emirhandurmus Sep 16, 2026
a785dda
bump container base image digest pins.
emirhandurmus Sep 16, 2026
eed2224
Parse microservice template YAML with placeholders and omit unspecifi…
emirhandurmus Sep 17, 2026
dc6165e
Keep application and agent placement in microservice templates and su…
emirhandurmus Sep 17, 2026
8f3fae6
Parse application template variable defaults without failing on missi…
emirhandurmus Sep 17, 2026
da3d0b0
Name the application template YAML upload field template.
emirhandurmus Sep 17, 2026
d351f92
Bump the embedded EdgeOps Console default to v1.1.0-rc.1.
emirhandurmus Sep 17, 2026
ea20843
Fix iofog PATCH after upgrade when FogPlatformSpecs retains removed H…
emirhandurmus Sep 17, 2026
425c2f3
Fix RuntimeClass link to require fog availableRuntimes.
emirhandurmus Sep 17, 2026
41e997c
Add last-crash columns on microservice status.
emirhandurmus Sep 18, 2026
ceb6ede
Normalize live meters and last-crash extras for microservice status.
emirhandurmus Sep 18, 2026
3e58eae
Stamp fog lastStatusTime on receipt and store honest microservice sna…
emirhandurmus Sep 18, 2026
5eda1f1
Show STOPPING with zero meters when an application is deactivated.
emirhandurmus Sep 18, 2026
c6f621c
Return live meters only while RUNNING and stop microservices as STOPP…
emirhandurmus Sep 18, 2026
1b25b52
Add a chunk size setting for fog status liveness.
emirhandurmus Sep 18, 2026
1974d9e
Select quiet fogs in small lastStatusTime batches.
emirhandurmus Sep 18, 2026
2f2d988
Mark quiet fogs UNKNOWN without deleting microservices.
emirhandurmus Sep 18, 2026
e89e53a
Force STOPPED with zero meters for leftover inactive workloads.
emirhandurmus Sep 18, 2026
2191f05
Cover fog liveness and stopped-app status jobs.
emirhandurmus Sep 18, 2026
582744a
Document receipt-time lastStatusTime, live-only meters, and last-cras…
emirhandurmus Sep 18, 2026
9087480
Bump the embedded EdgeOps Console default to v1.1.0-rc.2.
emirhandurmus Sep 18, 2026
59ee582
bump edgeops console version
emirhandurmus Sep 18, 2026
6b87e69
Add VolumeMappings.scope on 3.9.0 baseline and upgrade migrations.
emirhandurmus Sep 19, 2026
4117e0f
Validate volume mapping scope and hostDestination by mapping type.
emirhandurmus Sep 19, 2026
ae65308
Persist volume mapping scope on create, update, and register paths.
emirhandurmus Sep 19, 2026
22c2ea2
Add tests for volume mapping scope, bind path rules, and agent list o…
emirhandurmus Sep 19, 2026
784a943
Document volume mapping scope for v3.9.0-rc.4 in swagger and release …
emirhandurmus Sep 19, 2026
88ace0e
Bump the embedded EdgeOps Console default to v1.1.0-rc.3.
emirhandurmus Sep 19, 2026
4b6d8bf
Expand external OIDC client setup and add provider-specific guidance.
emirhandurmus Sep 19, 2026
543e484
Add Knowledge tables, fog links, and catalog rows on the 3.9.0 schema.
emirhandurmus Sep 21, 2026
757dd26
Return linked Knowledge to the agent and store knowledge status on fo…
emirhandurmus Sep 21, 2026
41cc95a
Add fleet Knowledge create, update, YAML, and per-fog link.
emirhandurmus Sep 21, 2026
430af08
Bind a knowledge catalog on user microservices and require items when…
emirhandurmus Sep 21, 2026
bcf7de0
Document fleet Knowledge in the API spec, access rules, and v3.9.0-rc…
emirhandurmus Sep 21, 2026
25038dc
Cover fleet Knowledge routes, catalogs, agent status, and access rules.
emirhandurmus Sep 21, 2026
956af64
Bump the embedded EdgeOps Console default to v1.1.0-rc.4.
emirhandurmus Sep 21, 2026
fddae8b
Return fog knowledgeStatus as a JSON string so it matches modelStatus…
emirhandurmus Sep 22, 2026
f702eec
bump embedded console version to v1.1.0-rc.5
emirhandurmus Sep 22, 2026
3b9c59c
Add fog columns for host capacity and OS identity.
emirhandurmus Sep 23, 2026
b6805bb
Persist host capacity and OS fields from agent status updates.
emirhandurmus Sep 23, 2026
e7efae3
Document fog host status fields and usage semantics in OpenAPI.
emirhandurmus Sep 23, 2026
9488025
Enforce cpuLimit between 5 and 400 percent on fog and agent config.
emirhandurmus Sep 23, 2026
3927256
Note host capacity and OS status in the v3.9.0-rc.8 changelog.
emirhandurmus Sep 23, 2026
d149955
Bump embedded EdgeOps Console default to v1.1.0-rc.6.
emirhandurmus Sep 23, 2026
b7b3824
changelog update
emirhandurmus Sep 23, 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
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ NODE_ENV=development

# EdgeOps Console static embed (npm run build:console → dev/console/build)
EDGEOPS_CONSOLE_PATH=dev/console/build # must be absolute path
EDGEOPS_CONSOLE_VERSION=v1.0.13
EDGEOPS_CONSOLE_VERSION=v1.1.0-rc.6
# EDGEOPS_CONSOLE_REPO=https://github.com/Datasance/edgeops-console
# EDGEOPS_CONSOLE_FLAVOR=datasance

Expand Down
2 changes: 1 addition & 1 deletion .github/actions/set-build-env/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ runs:
shell: bash
run: |
VERSION="${{ env.EDGEOPS_CONSOLE_VERSION }}"
if [ -z "$VERSION" ]; then VERSION="1.0.13"; fi
if [ -z "$VERSION" ]; then VERSION="1.1.0-rc.6"; fi
echo "EDGEOPS_CONSOLE_VERSION=$VERSION" >> "${GITHUB_ENV}"

REPO="${{ env.EDGEOPS_CONSOLE_REPO }}"
Expand Down
124 changes: 124 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,129 @@
# Changelog

## [v3.9.0-rc.9]

### Added

- **Fog status (host capacity + OS)** — agent `PUT /api/v3/agent/status` accepts and persists `systemCpus`, `systemTotalMemory`, `systemAvailableMemory`, `systemTotalDisk`, `systemAvailableDisk`, `systemOs`, `systemOsVersion`, and `systemKernelVersion`. User `GET /api/v3/iofog` and list return the stored values. `systemTotalCpu` remains host CPU busy **0–100%**; `diskUsage` remains Edgelet data-directory usage in **GiB**, not host filesystem totals. Columns on 3.9.0 baseline and 3.8→3.9 upgrade (sqlite, mysql, postgres). Omitted keys leave prior values unchanged.

### Changed
- Embedded **EdgeOps Console** default version **v1.1.0-rc.5** → **v1.1.0-rc.6**

## [v3.9.0-rc.8]

### Changed
- Embedded **EdgeOps Console** default version **v1.1.0-rc.4** → **v1.1.0-rc.5**

## [v3.9.0-rc.7]

### Changed

- **Fog status** — user GET and list return `knowledgeStatus` as the stored JSON string, matching `modelStatus`. Callers parse it.
- Dockerfile runtime base image digest pin refreshed for **`ubi9/nodejs-24-minimal`**.

## [v3.9.0-rc.6]

Fleet Knowledge artifacts: curated documents, datasets, and vector indexes distributed like Models, with a separate name namespace and Hub dataset pulls.

### Added

- **Fleet Knowledge API** — `GET/POST/PATCH/DELETE /api/v3/knowledge`, YAML create/upsert (`kind: Knowledge`), and volumeMount-style `GET/POST/DELETE …/knowledge/:name/link`; server-generated uuid; agent `GET /api/v3/agent/knowledge` returns linked rows only (`{ "knowledge": [ … ] }`).
- **`PATCH /api/v3/microservices/:uuid/knowledge`** — user microservices only; `microserviceKnowledge` change flag and rebuild rules for bind path / permissions / empty↔non-empty catalog transitions.
- **Fog status** — `knowledgeStatus` (JSON string), `activeKnowledge` (managed count), `knowledgeLastUpdate` (Unix ms).
- **v3.9.0 schema** — `Knowledge`, `FogKnowledge`, catalog tables, change-tracking flags, fog status columns on baseline and 3.8→3.9 upgrade.

### Changed

- **`modelLastUpdate`** — documented as Unix milliseconds (same clock as `knowledgeLastUpdate`).
- **MS catalog validation** — `knowledge.bindPath` must not collide with volumes, tmpfs, or the models catalog path. A non-empty `bindPath` on a models or knowledge catalog requires at least one item.
- **RBAC + swagger** — resource `knowledge`; viewer get/list; SRE/developer/admin full + link.
- Dockerfile base image digest pins refreshed for **`node:24-bookworm`** (console-builder and builder stages)
- Embedded **EdgeOps Console** default version **v1.1.0-rc.3** → **v1.1.0-rc.4**

### Notes

- Knowledge names are a separate namespace from Models. HF Knowledge uses the Hub dataset API; there is no `repoType` field.
- `format` is a soft hint. Known values persist; anything else stores `unknown`. Unknown format is not a 400.
- `getChanges.prune` still does not delete volumes. Unused **local** Knowledge prune is agent-side on the same flag. `system prune` does not drop Knowledge trees.

## [v3.9.0-rc.5]

Additive microservice `VOLUME` mapping `scope` for Edgelet private vs node-global shared claims. Reclaim stays on-node (`edgelet volume`); no new Controller prune flag.

### Added

- **`volumeMappings[].scope`** — `private` (default) or `shared`. Meaningful only when `type` is `volume`. Omit, null, or empty → `private`. Unknown values on `type: volume` are **400**. Other mapping types always store `private`.
- **`VolumeMappings.scope`** column on 3.9.0 baseline and 3.8→3.9 upgrade (sqlite, mysql, postgres).

### Changed

- **Agent microservice list** includes `scope` on each volume mapping (lowercase).
- **Volume-mapping create/delete** sets microservice `rebuild` and `microserviceCommon` so the agent applies the change.
- **`type: volume` `hostDestination`** charset matches Edgelet: `[a-zA-Z0-9][a-zA-Z0-9_.-]*`.
- Embedded **EdgeOps Console** default version **v1.1.0-rc.2** → **v1.1.0-rc.3**

### Notes

- Shared names are node-global. Controller does not unique-check names or `runAsUser` across consumers (local workloads exist). Use distinct names (`nodered-config`).
- Controller and system microservices always persist `private`. Explicit `scope: shared` on those workloads is **400**.
- `deleteWithCleanup` remains unused; operators reclaim with `edgelet volume` / `deprovision --purge-volumes`.
- Switching private → shared does not copy existing UUID directories. Older agents ignore `scope` (every `VOLUME` stays per-UUID) with no merge after upgrade.

## [v3.9.0-rc.3]

Observed microservice status and fog liveness: live CPU/memory only while a microservice is RUNNING, and node quietness judged by when Controller last received a status PUT.

### Fixed

- **Stopped/inactive microservices** no longer keep the last CPU/memory sample after stop, deactivate, or a non-RUNNING agent report.
- **Fog liveness** uses Controller receipt time (`lastStatusTime`), not the agent's clock, so clock skew no longer flaps nodes UNKNOWN.
- **Status jobs** walk the fleet in small transactions and no longer delete microservices from the liveness cleaner.

### Added

- **Microservice last-crash columns** — `last_error`, `last_error_at`, `restart_count` on `MicroserviceStatuses` (baseline 3.9.0 and 3.8→3.9 upgrade).

### Changed

- **GET microservice meters** — `status.cpuUsage` and `status.memoryUsage` are 0 unless observed `status` is `RUNNING`.
- **Operator stop / application deactivate** — GET shows `STOPPING` and zero meters immediately, before the next agent PUT.
- **Microservice last crash** — GET `status` always includes `lastError`, `lastErrorAt`, and `restartCount`. `errorMessage` is the current failure (cleared by the agent after 30s RUNNING); last crash is kept after recovery.
- Embedded **EdgeOps Console** default version **v1.1.0-rc.1** → **v1.1.0-rc.2**

## [v3.9.0-rc.2]

### Fixed

- **`PATCH /api/v3/iofog/{uuid}` after Controller upgrade** — stale `bluetoothEnabled` / `abstractedHardwareEnabled` keys in `"FogPlatformSpecs".spec_json` (written before HAL removal) caused validation failure with misleading `Invalid fog platform spec field 'instance'`. Platform spec merge and upsert now whitelist allowed fields only; validation errors name the rejected field.
- **`POST /api/v3/runtimeClasses/{name}/link`** — refused link when the RuntimeClass name is not in the target fog `availableRuntimes` (same rule as microservice deploy runtime validation).


## [v3.9.0-rc.1]

Fleet models, RuntimeClass, registry extensions, microservice catalog PATCH, MicroserviceTemplate, and HAL/BLE removal for Edgelet v1.1+ handoff. Targets **v3.9.0** schema (user tags).

### Added

- **Fleet models API** — `GET/POST/PATCH/DELETE /api/v3/models`, YAML create/upsert, and volumeMount-style `GET/POST/DELETE …/models/:name/link`; server-generated uuid; agent `GET /api/v3/agent/models` returns linked rows only.
- **RuntimeClass API** — `GET/POST/PATCH/DELETE /api/v3/runtimeClasses`, YAML, link endpoints (edgelet fogs only), and agent `GET /api/v3/agent/runtimeClasses`.
- **Registry `type` / `ca` / `insecure`** — Hub system registry by Hugging Face url+`hf`; MS and catalog image pulls remain **oci-only**.
- **`PATCH /api/v3/microservices/:uuid/models`** — `microserviceModels` change flag and rebuild rules for bind path / permissions / empty↔non-empty catalog transitions.
- **Microservice container fields** — commands/cmd alias, CDI devices, capabilities, health check, and related agent wire fields.
- **MicroserviceTemplate** — CRUD + YAML; deploy overlay via `POST /microservices` + `template`.
- **Agent status ingest** — `modelStatus`, `activeModels`, `modelLastUpdate`, `runtimeClasses`, `availableCdiDevices`, `podId`; getChanges flags `models`, `runtimeClasses`, `microserviceModels`.
- **v3.9.0 schema** — `Models`, `RuntimeClasses`, link tables, registry columns, template tables. Fresh install uses baseline 3.9.0 migrate+seed; upgrade from 3.8.0 applies incremental 3.9.0 only.

### Changed

- **MS deploy** — auto-links referenced fleet models and RuntimeClass on edgelet agents; validates runtime against `availableRuntimes`.
- **RBAC + swagger** — models, runtimeClasses, microserviceTemplates, and agent model/runtime routes documented and catalogued.
- Embedded **EdgeOps Console** default version **v1.0.13** → **v1.1.0-rc.1**

### Removed

- **HAL/BLE provisioning** — user HAL/USB routes, RESTBlue/HAL system catalog items, fog `bluetooth`/`hal` flags, and `deviceScanFrequency` from agent config wire (Edge Guard retained).
- **Agent HAL routes** — hardware inventory PUT/GET paths under `/api/v3/agent/hal/*`.


## [v3.8.3-rc.3] - September 2026

Expand Down
10 changes: 5 additions & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
# ioFog overrides: EDGEOPS_CONSOLE_REPO=https://github.com/eclipse-iofog/edgeops-console
# EDGEOPS_CONSOLE_FLAVOR=iofog
# node:24-bookworm — pin manifest list digest for reproducible multi-arch builds
FROM node:24-bookworm@sha256:be23f54a88d34e8824c741b19b91064094f92c1c97b194144bfc8b50d67258e2 AS console-builder
FROM node:24-bookworm@sha256:64af3819f9275802414d7cdc38c27e9d82bd564dec4d4da87d008255d36c63b4 AS console-builder

ARG EDGEOPS_CONSOLE_REPO=https://github.com/Datasance/edgeops-console
ARG EDGEOPS_CONSOLE_VERSION=v1.0.13
ARG EDGEOPS_CONSOLE_VERSION=v1.1.0-rc.6
ARG EDGEOPS_CONSOLE_FLAVOR=datasance

RUN apt-get update \
Expand All @@ -28,7 +28,7 @@ RUN test -f build/index.html \
&& cp -a build /tmp/console/build


FROM node:24-bookworm@sha256:be23f54a88d34e8824c741b19b91064094f92c1c97b194144bfc8b50d67258e2 AS builder
FROM node:24-bookworm@sha256:64af3819f9275802414d7cdc38c27e9d82bd564dec4d4da87d008255d36c63b4 AS builder

ARG PKG_VERSION

Expand All @@ -48,9 +48,9 @@ RUN npm pack


# ubi9/nodejs-24-minimal:latest — pin manifest list digest for reproducible multi-arch builds
FROM registry.access.redhat.com/ubi9/nodejs-24-minimal@sha256:c7b8cb436feace96ca0b43eab7326394893e0ac9c2c6b46895727e3b9202fb9d
FROM registry.access.redhat.com/ubi9/nodejs-24-minimal@sha256:e3392c129520d2ebce748c3d0048343d0ec60be560cf220b60a7ba5d2bd2484a

ARG EDGEOPS_CONSOLE_VERSION=v1.0.13
ARG EDGEOPS_CONSOLE_VERSION=v1.1.0-rc.6
ARG IMAGE_REGISTRY
ARG OCI_SOURCE_REPO
ARG CONTROLLER_DISTRIBUTION=iofog
Expand Down
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Local Docker build — mirrors CI/release build-args (see .github/actions/set-build-env).
# Override any variable: make build FLAVOR=iofog EDGEOPS_CONSOLE_VERSION=v1.0.13
# Override any variable: make build FLAVOR=iofog EDGEOPS_CONSOLE_VERSION=v1.1.0-rc.6

FLAVOR ?= datasance
IMAGE_NAME ?= controller
Expand All @@ -25,7 +25,7 @@ else
$(error FLAVOR must be "datasance" or "iofog", got "$(FLAVOR)")
endif

EDGEOPS_CONSOLE_VERSION ?= v1.0.13
EDGEOPS_CONSOLE_VERSION ?= v1.1.0-rc.6

IMAGE_REF = $(IMAGE_REGISTRY)/$(IMAGE_NAME):$(DOCKER_TAG)

Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,9 @@ API: `http://localhost:51121` · Console (embedded or split): set `CONSOLE_URL`
|-------|-----|
| Architecture | [docs/architecture.md](docs/architecture.md) |
| RBAC | [docs/rbac-reference.md](docs/rbac-reference.md) |
| External OIDC | [docs/external-oidc-client-setup.md](docs/external-oidc-client-setup.md) |
| OIDC (embedded and external) | [docs/oidc-configuration.md](docs/oidc-configuration.md) |
| External OIDC client | [docs/external-oidc-client-setup.md](docs/external-oidc-client-setup.md) |
| External OIDC providers | [docs/external-oidc-providers.md](docs/external-oidc-providers.md) |

## License

Expand Down
13 changes: 10 additions & 3 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ Used by EdgeOps Console, `potctl`, `iofogctl`, and automation.
| Certificates | `/api/v3/certificate` | PKI operations |
| WebSocket | `ws` routes in `src/routes/` | Exec and logs (Bearer token) |

Browser login uses the OAuth BFF (`GET /api/v3/user/oauth/authorize`); CLI uses `POST /api/v3/user/login`. See [oidc-configuration.md](oidc-configuration.md), [external-oidc-client-setup.md](external-oidc-client-setup.md), and [rbac-reference.md](rbac-reference.md).
Browser login uses the OAuth BFF (`GET /api/v3/user/oauth/authorize`); CLI uses `POST /api/v3/user/login`. See [oidc-configuration.md](oidc-configuration.md), [external-oidc-client-setup.md](external-oidc-client-setup.md), [external-oidc-providers.md](external-oidc-providers.md), and [rbac-reference.md](rbac-reference.md).

### Agent API (fog token — no OIDC)

Expand All @@ -131,15 +131,15 @@ Full request/response shapes: **`docs/swagger.yaml`** (agent paths).

| Job | File | Role |
|-----|------|------|
| Fog status | `fog-status-job.js` | Mark agents offline when status pings lapse |
| Fog status | `fog-status-job.js` | Liveness cleaner: chunked transactions mark quiet fogs UNKNOWN using Controller receipt time (`lastStatusTime`). Desired-active microservices become UNKNOWN with CPU/memory 0. Desired-inactive STOPPED workloads are left alone. Does not delete microservices. Overlapping runs on the same process are skipped. |
| Controller heartbeat | `controller-heartbeat-job.js` | Control-plane liveness |
| Fog token cleanup | `fog-token-cleanup-job.js` | Expire stale agent tokens |
| Controller cleanup | `controller-cleanup-job.js` | Orphaned controller MS housekeeping |
| Event cleanup | `event-cleanup-job.js` | Audit event retention |
| NATS reconcile | `nats-reconcile-worker-job.js` | NATS operator sync |
| Platform reconcile | `platform-reconcile-worker-job.js` | Fog + service platform claim/reconcile (one job, two queues) |
| Fog platform sweep | `fog-platform-sweep-job.js` | Drift detection; re-enqueue stale fog/service tasks |
| Stopped app status | `stopped-app-status-job.js` | Application state maintenance |
| Stopped app status | `stopped-app-status-job.js` | Desired-inactive safety net: leftover RUNNING, STOPPING, DELETED, or DELETING observed status is rewritten to STOPPED with CPU/memory 0. Overlapping runs on the same process are skipped. |

### Platform reconcile (fog + service + resolver)

Expand Down Expand Up @@ -356,6 +356,12 @@ Controller v3.8 and Edgelet share a **frozen field-agent REST contract** on `/ap

**Volume mounts** — `GET volumeMounts` returns bind/volume shapes plus system-injected immutable `serviceAccount` entries.

**Volume mapping scope** — microservice `volumeMappings[]` may include `scope` (`private` default / `shared`). Meaningful only when `type` is `volume`. Shared names are node-global on that fog. Reclaim is on-node (`edgelet volume` / `deprovision --purge-volumes`); Controller does not prune volumes. `deleteWithCleanup` remains unused.

**Fleet models** — weight artifacts at `/api/v3/models`, linked per fog. Agent `GET /api/v3/agent/models` returns linked rows only. User microservices bind them with a `models` catalog (`bindPath`, `permissions`, `items[].name`).

**Fleet Knowledge** — documents, datasets, and vector indexes, same distribution shape as models and a separate name namespace. Operator CRUD, YAML (`kind: Knowledge`), and per-fog link live at `/api/v3/knowledge`. User microservices bind a `knowledge` catalog and can change it with `PATCH /api/v3/microservices/:uuid/knowledge`. Agent `GET /api/v3/agent/knowledge` returns linked rows only. `format` is a soft hint. Hugging Face pulls use the dataset API. Fog `modelLastUpdate` and `knowledgeLastUpdate` are Unix milliseconds.

**Service account RBAC** — microservice roles use apiGroup **`edgelet.iofog.org/v1`**; SA/role changes trigger `microserviceList` change tracking.

For the full bilateral contract (including ControlPlane env vars and verification references), see Edgelet documentation:
Expand Down Expand Up @@ -466,6 +472,7 @@ Agent routes and WebSocket exec/logs for agents are **outside** OIDC — see [rb
| [pki.md](pki.md) | Central CAs, cert renewal, NATS operator rotation |
| [oidc-configuration.md](oidc-configuration.md) | Embedded/external auth modes and env vars |
| [external-oidc-client-setup.md](external-oidc-client-setup.md) | External IdP client configuration |
| [external-oidc-providers.md](external-oidc-providers.md) | Default groups/roles and IdP recipes |
| [operations/database-transactions.md](operations/database-transactions.md) | Transaction runner, OTEL metrics, SQLITE_BUSY runbook |
| [operations/sizing.md](operations/sizing.md) | Hardware sizing by fog count (K8s and Remote CP) |
| [CONTRIBUTING](../CONTRIBUTING) | Dual-mirror CI and development |
Loading