All checks were successful
Build and Release / Create Release (push) Has been skipped
Build and Release / Unit Tests (push) Successful in 6m49s
Build and Release / Integration Tests (PostgreSQL) (push) Successful in 7m6s
Build and Release / Lint (push) Successful in 7m15s
Build and Release / Build Binaries (amd64, windows, windows-latest) (push) Has been skipped
Build and Release / Build Binaries (amd64, darwin, macos) (push) Has been skipped
Build and Release / Build Binaries (amd64, linux, linux-latest) (push) Has been skipped
Build and Release / Build Binaries (arm64, darwin, macos) (push) Has been skipped
Build and Release / Build Binary (linux/arm64) (push) Has been skipped
Implement critical production readiness features for AI integration: per-request provider config, admin dashboard, workflow inspection, and plugin framework foundation. Per-Request Provider Config: - Add ProviderConfig struct to all AI request types - Update queue to resolve provider/model/API key from cascade (repo > org > system) - Pass resolved config to AI sidecar on every request - Fixes multi-tenant issue where all orgs shared sidecar's hardcoded config Admin AI Dashboard: - Add /admin/ai page with sidecar health status - Display global operation stats (total, 24h, success/fail/escalated counts) - Show operations by tier, top 5 repos, token usage - Recent operations table with repo, operation, status, duration - Add GetGlobalOperationStats model method Workflow Inspection: - Add InspectWorkflow client method and types - Implement workflow-inspect queue handler - Add notifier trigger on workflow file push - Analyzes YAML for syntax errors, security issues, best practices - Returns structured issues with line numbers and suggested fixes Plugin Framework (Phase 5 Foundation): - Add external plugin config loading from app.ini - Define ExternalPlugin interface and manager - Add plugin.proto contract (Initialize, Shutdown, HealthCheck, OnEvent, HandleHTTP) - Implement health monitoring with auto-restart for managed plugins - Add event routing to subscribed plugins - HTTP proxy support for plugin-served routes This completes Tasks 1-4 from the production readiness plan and establishes the foundation for managed plugin lifecycle.
98 lines
2.5 KiB
Protocol Buffer
98 lines
2.5 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
package plugin.v1;
|
|
|
|
option go_package = "code.gitcaddy.com/server/v3/modules/plugins/pluginv1";
|
|
|
|
import "google/protobuf/struct.proto";
|
|
import "google/protobuf/timestamp.proto";
|
|
|
|
// PluginService is the RPC interface that external plugins must implement.
|
|
// The server calls these methods to manage the plugin's lifecycle and dispatch events.
|
|
service PluginService {
|
|
// Initialize is called when the server starts or the plugin is loaded
|
|
rpc Initialize(InitializeRequest) returns (InitializeResponse);
|
|
// Shutdown is called when the server is shutting down
|
|
rpc Shutdown(ShutdownRequest) returns (ShutdownResponse);
|
|
// HealthCheck checks if the plugin is healthy
|
|
rpc HealthCheck(HealthCheckRequest) returns (HealthCheckResponse);
|
|
// GetManifest returns the plugin's manifest describing its capabilities
|
|
rpc GetManifest(GetManifestRequest) returns (PluginManifest);
|
|
// OnEvent is called when an event the plugin is subscribed to occurs
|
|
rpc OnEvent(PluginEvent) returns (EventResponse);
|
|
// HandleHTTP proxies an HTTP request to the plugin
|
|
rpc HandleHTTP(HTTPRequest) returns (HTTPResponse);
|
|
}
|
|
|
|
message InitializeRequest {
|
|
string server_version = 1;
|
|
map<string, string> config = 2;
|
|
}
|
|
|
|
message InitializeResponse {
|
|
bool success = 1;
|
|
string error = 2;
|
|
PluginManifest manifest = 3;
|
|
}
|
|
|
|
message ShutdownRequest {
|
|
string reason = 1;
|
|
}
|
|
|
|
message ShutdownResponse {
|
|
bool success = 1;
|
|
}
|
|
|
|
message HealthCheckRequest {}
|
|
|
|
message HealthCheckResponse {
|
|
bool healthy = 1;
|
|
string status = 2;
|
|
map<string, string> details = 3;
|
|
}
|
|
|
|
message GetManifestRequest {}
|
|
|
|
message PluginManifest {
|
|
string name = 1;
|
|
string version = 2;
|
|
string description = 3;
|
|
repeated string subscribed_events = 4;
|
|
repeated PluginRoute routes = 5;
|
|
repeated string required_permissions = 6;
|
|
string license_tier = 7;
|
|
}
|
|
|
|
message PluginRoute {
|
|
string method = 1;
|
|
string path = 2;
|
|
string description = 3;
|
|
}
|
|
|
|
message PluginEvent {
|
|
string event_type = 1;
|
|
google.protobuf.Struct payload = 2;
|
|
google.protobuf.Timestamp timestamp = 3;
|
|
int64 repo_id = 4;
|
|
int64 org_id = 5;
|
|
}
|
|
|
|
message EventResponse {
|
|
bool handled = 1;
|
|
string error = 2;
|
|
}
|
|
|
|
message HTTPRequest {
|
|
string method = 1;
|
|
string path = 2;
|
|
map<string, string> headers = 3;
|
|
bytes body = 4;
|
|
map<string, string> query_params = 5;
|
|
}
|
|
|
|
message HTTPResponse {
|
|
int32 status_code = 1;
|
|
map<string, string> headers = 2;
|
|
bytes body = 3;
|
|
}
|