Date: 2026-01-31
Branch: research/plugin-pulse-integration
Status: ✅ Complete, builds successfully, backward compatible
Phase 1 adds the protocol foundation for plugins to register async handlers with Pulse, without changing any runtime behavior. All changes are backward compatible.
File: plugin/grpc/protocol/domain.proto
Changed Initialize RPC return type:
- rpc Initialize(InitializeRequest) returns (Empty);
+ rpc Initialize(InitializeRequest) returns (InitializeResponse);
Added InitializeResponse message:
message InitializeResponse {
// Handler names this plugin can execute
// Examples: ["python.script", "python.webhook", "ixgest.git"]
// Empty list means plugin provides no async handlers (backward compatible)
repeated string handler_names = 1;
}
Added ExecuteJob RPC:
rpc ExecuteJob(ExecuteJobRequest) returns (ExecuteJobResponse);
Added job execution messages:
message ExecuteJobRequest {
string job_id = 1;
string handler_name = 2;
bytes payload = 3;
int64 timeout_secs = 4;
}
message ExecuteJobResponse {
bool success = 1;
string error = 2;
bytes result = 3;
int32 progress_current = 4;
int32 progress_total = 5;
double cost_actual = 6;
}
File: plugin/grpc/client.go
handlerNames []string field to ExternalDomainProxyInitialize() to capture and store handler names from responseGetHandlerNames() method to expose handler namesFile: plugin/grpc/server.go
Initialize() to return InitializeResponse instead of EmptyExecuteJob() stub that returns unimplemented errorFile: qntx-python/src/service.rs
initialize() to return InitializeResponse instead of EmptyInitializeResponse, ExecuteJobRequest, ExecuteJobResponseexecute_job() stub that returns unimplemented errormake protobuild.rs)✅ No breaking changes:
ExecuteJob is never called (no handlers to route to)✅ All builds pass:
go build ./cmd/qntx - Successmake cli - Successcargo build --manifest-path=qntx-python/Cargo.toml - Success (2 warnings, no errors)See docs/architecture/plugin-pulse-integration.md for full roadmap.
Phase 2 objectives:
execute_job() with actual script execution["python.script", "python.webhook"]pulse/async/plugin_proxy_handler.go in GoDuring implementation, discussed architectural principle:
Protobuf as single source of truth for type definitions
Currently QNTX has multiple sources of truth:
Proposal: Use protobuf as the single source, generate:
This would eliminate typegen and ensure consistency across all languages.
Example: Attestation message could be defined once in protobuf, used everywhere.
Benefits:
Consideration for future work.
modified: plugin/grpc/protocol/domain.proto
modified: plugin/grpc/protocol/domain.pb.go (generated)
modified: plugin/grpc/protocol/domain_grpc.pb.go (generated)
modified: plugin/grpc/client.go
modified: plugin/grpc/server.go
modified: qntx-python/src/service.rs
modified: Cargo.lock
243ca16 - Research: Plugin-Pulse integration architecture5a11e6f - Phase 1: Add plugin async handler protocol (backward compatible)