Generated bindings for the schema_version 3 / ModuleField
proto addition in fai_platform commit f8b364e. Studio's
flow editor can now ask the hub for declared inputs and
outputs per module, with i18n descriptions, instead of
parsing references out of the flow YAML.
Bumps fai_client_sdk to 0.18.0.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Studio + pilot apps can now trigger a hub-side TokenStore
swap without restarting the daemon:
await client.reloadAuth(); // returns new token count
Throws when the new config is invalid; the existing store
stays in place server-side so a botched rotation can't lock
the operator out.
Bindings regenerated for the new
HubAdmin.ReloadAuth + ReloadAuthResponse + LoggedEvent
.caller_name proto additions.
dart analyze clean; dart test green (4 tests).
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Two coupled majors that have been blocking the rest of the
Dart-side dependency lift in Studio (the constraint solver
pins meta/characters/etc. through these). Picked up:
- grpc 5.1.0 (was 4.2.0)
- protobuf 6.0.0 (was 4.2.0)
- analyzer 13.0.0, _fe_analyzer_shared 100.0.0
- google_cloud 0.5.0, googleapis_auth 2.3.1 (transitive)
The bindings now live in `lib/src/generated/fai/v1/` only —
the well-known-types `lib/src/generated/google/protobuf/`
copy has been deleted. protobuf 6 ships its own bundled
`well_known_types/google/protobuf/empty.pb.dart` and the
`HubAdminClient` API expects the *packaged* Empty type;
emitting a local copy created two distinct Empty types and
broke every `_admin.<rpc>(Empty())` call site.
`tools/generate.sh` now skips the WKT generation pass and
wipes `lib/src/generated/google/` on every run so the
duplicate-types breakage can't regress silently. The
import in `hub_client.dart` switches from the local copy to
`package:protobuf/well_known_types/google/protobuf/empty.pb
.dart`.
Smoke-verified: dart analyze clean, dart test green
(4 tests). Bumped to 0.17.0 — Studio absorbs in the next
commit.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Adopts the three SDK families convention from
fai/platform/docs/architecture/sdks.md — base name carries
the family, language suffix on dir + repo only:
fai_dart_sdk (pkg) → fai_client_sdk
fai_dart_sdk (dir) → fai_client_sdk_dart
fai/dart-sdk (repo) → fai/client-sdk-dart
Internal lib/test/example file renames track the package
name. Old git.flemming.ws URL also retired here.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
`pb.FlowSummary.requiredCapabilities` flows through the
existing typedef untouched, so callers see the new field
without a wrapper change.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Surface the new platform RPC `GetFlowDefinition` as a typed
Dart method so Studio (and other GUI clients) can render an
input form before calling `runSavedFlow`. Each declared input
arrives as a `FlowInputDef` with the verbatim type tag from
the flow YAML — usually `text`, `bytes`, `json`, or `file`.
Regenerated proto bindings to pick up the new
`GetFlowDefinitionRequest`, `FlowDefinition`, and
`FlowInputSpec` message types.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Studio's Flows tab couldn't run any sample flow with a
binary input (extract / extract-summarize / …) because
runSavedFlow only knew how to wrap textInputs as text
Payloads. Operators saw the hub return
"step references missing value '\$inputs.document'" because
the document key never made it into the request.
`runSavedFlow` is now mixed-mode:
Future<SubmitResponse> runSavedFlow({
required String name,
Map<String, String> textInputs = const {},
Map<String, Uint8List> fileInputs = const {},
})
Both maps default to empty so existing text-only callers
keep working without code changes — the previous required
`textInputs:` parameter is now optional with a default. File
entries get wrapped as `Bytes` Payloads with
`application/octet-stream` MIME — good enough for the
text.extract / text.summarize chain that the bundled flows
exercise. Per-file MIME-type override is a follow-up if any
operator workflow ever needs it.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Sister of the MCP-client surface — four new HubAdmin RPCs
(`ListN8nEndpoints`, `RefreshN8nEndpoints`, `AddN8nEndpoint`,
`RemoveN8nEndpoint`) plus the matching typedefs so callers
read configuration off `N8nEndpointStatus` without importing
generated/.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Picks up the four new HubAdmin RPCs that drive Studio's
MCP-clients editor:
- `listMcpClients()` — config + last-discovery snapshot.
- `refreshMcpClients()` — re-run discovery against the live
daemon.
- `addMcpClient(name, endpoint, apiKeyEnv?, description?)` —
persist + refresh in one round-trip.
- `removeMcpClient(name)` — drop persisted entry and live
synthetic capabilities.
Typedefs for `ListMcpClientsResponse`, `McpClientStatus`,
`McpClientConfigEntry` so callers don't import generated/.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Picks up the three new optional fields on the StoreEntry
proto. No new client method — fields are plumbed through
SearchStore. Studio reads them off the entry directly.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Picks up the new `featured: bool` field in the StoreEntry
proto. No new client method — the flag is plumbed through
SearchStore. Studio reads it directly off the entry.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Picks up HubAdmin.FetchModuleDocs. HubClient exposes it as
fetchModuleDocs(name) returning the FetchModuleDocsResponse
verbatim — Studio maps the error_kind to friendly copy.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Picks up cache-related additions in HubAdmin:
- AskAi gains `forceFresh` request flag and `cached` /
`cachedAt` / `cacheHits` response fields.
- New ClearSystemLlmCache + ForgetCachedExplanation RPCs.
- SystemAiStatus carries `cacheCount` so the UI can render
"Cache: N cached explanations".
HubClient exposes `clearSystemLlmCache()` returning the
purged count and `forgetCachedExplanation(prompt)` for the
Regenerate flow.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Picks up the new HubAdmin.ClearEventLog RPC. Exposed as
HubClient.clearEventLog(reviewer:, reason:) returning the
purged count + active channel for the caller to confirm.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Regenerated protos pick up the two new HubAdmin RPCs. HubClient
exposes them as hardwareInfo() and listSystemAiCuratedModels(),
with HardwareInfoResponse, ListSystemAiCuratedModelsResponse,
CuratedModel re-exported as typedefs so callers don't import
the generated/ directory directly.
Studio uses the pair to colour-code models in the System-AI
editor against the operator's actual hardware.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
`testSystemAi` now takes optional provider/endpoint/model/
apiKeyEnv/privacyMode params; the editor passes form values so
Test Connection works before Save. New `listSystemAiModels`
fetches the provider's `/v1/models` listing, `pullSystemAiModel`
calls Ollama's `/api/pull` synchronously.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
`HubClient.updateSystemAi(...)` persists a new System-AI config
to ~/.fai/config.yaml AND hot-reloads the live hub state in one
round-trip; returns the resulting SystemAiStatus so the UI
refreshes without a second call.
`HubClient.testSystemAi()` probes the configured provider with
a tiny ping and returns the same error-kind taxonomy as askAi.
Studio's "Test connection" button uses this.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
`HubClient.systemAiStatus()` reports whether the hub-internal LLM
hook is configured and which provider / privacy mode is active.
`HubClient.askAi(prompt)` issues a one-shot prompt and returns
the answer or a structured error kind so the UI can map each
failure to its inline-fix copy.
LoggedEvent gains `detail` upstream (no SDK change required).
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Catches the Dart bindings up to the platform's gRPC additions:
* `searchStore({query, category, tag, status, limit})` — wraps
HubAdmin.SearchStore so Studio can build a Store browser
page.
* `installModule({source, expectedSha256})` — wraps
HubAdmin.InstallModule so the operator can one-click install
a `.fai` bundle from the UI.
* `channelStatus()` — new HubAdmin.ChannelStatus RPC. Returns
active channel name + per-channel running flag + endpoint.
Re-exports the new proto types (StoreEntry,
StoreSearchResponse, InstallModuleResponse, ChannelStatusResponse,
ChannelEntry) so callers don't import protobuf directly.
LoggedEvent gains a `detail` field (free-form JSON string)
upstream; the regenerated bindings expose it without further
work — Studio's audit drill-down renders it pretty-printed.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Adds `checkUpdate()` to HubClient and re-exports
`CheckUpdateResponse` so callers (Studio Doctor page) can render
update + offline states without importing protobuf directly.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Proto codegen wired in. tools/generate.sh wraps protoc against
../fai_platform/proto/, including the well-known types (Empty,
Struct, Timestamp) so they are generated alongside fai's own
messages — protobuf 4.x doesn't ship them as importable Dart
types, so we have to generate them ourselves.
HubClient now exposes typed methods backed by real RPCs:
- healthy() — Hub.Health probe (returns false on connect refused).
- listCapabilities() — HubAdmin.ListCapabilities.
- eventLog() — HubAdmin.EventLog with type filter.
- listApprovals() — HubAdmin.ListApprovals (status filter).
- approve() / reject() — HubAdmin.DecideApproval.
Generated bindings under lib/src/generated/ are excluded from
analyze (out of our style control). protoc_plugin pinned to
22.2.0 in tools/generate.sh comment because newer plugins
generate code against protobuf 6.x, while grpc 4.x still
constrains us to protobuf 4.x.
Bumps fai_dart_sdk 0.1.0 -> 0.2.0.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
Dart package skeleton for the F∆I gRPC client. Used by F∆I
Studio (Tier-2) and Tier-3 domain apps (DigiScout / J∆I /
Scout). Public surface — HubClient, HubEndpoint — is committed
as a typed stub so downstream apps can compile against it
immediately. Generated proto bindings land in a follow-up
commit once the codegen step (planned: tools/generate.sh
wrapping protoc-gen-dart against ../fai_platform/proto) is
wired in.
Future Forgejo path: fai/dart-sdk.
dart analyze: clean. dart test: 4/4.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>