diff --git a/apps/backend/internal/backendapp/services.go b/apps/backend/internal/backendapp/services.go index d16d298da6..f557b0a2db 100644 --- a/apps/backend/internal/backendapp/services.go +++ b/apps/backend/internal/backendapp/services.go @@ -232,6 +232,12 @@ func provideServices(cfg *config.Config, log *logger.Logger, repos *Repositories // build passes "dev", which the service treats as "don't enforce". pluginsSvc.SetKandevVersion(version) pluginsSvc.SetDataSources(taskSvc, taskSvc, workflowSvc, agentSettingsController, analyticsservice.New(repos.Analytics), taskSvc, taskSvc, pluginsTaskWriterAdapter{svc: taskSvc}) + // Separate from SetDataSources: githubSvc is optional (nil when github + // is unconfigured), and a nil source leaves tasks with no PullRequests + // rather than failing every task read. + if githubSvc != nil { + pluginsSvc.SetTaskPRSource(githubSvc) + } } gitCredentialBroker := newGitCredentialBroker(githubSvc, pluginsSvc, repos.Task, cfg.GitHubCredentialBroker.ReissueSigningKey) if pluginsSvc != nil { diff --git a/apps/backend/internal/plugins/host.go b/apps/backend/internal/plugins/host.go index 323f6417ff..23eee787b1 100644 --- a/apps/backend/internal/plugins/host.go +++ b/apps/backend/internal/plugins/host.go @@ -68,6 +68,10 @@ type pluginHost struct { sessionCodeStats sessionCodeStatsSource messageData messageDataSource interactionData interactionDataSource + taskPRs taskPRSource + // taskPRsDep resolves the source at read time so a host created before + // SetTaskPRSource still observes the late wiring. + taskPRsDep func() taskPRSource // taskWriter backs the CreateTask/UpdateTask write RPCs (ADR 0043 // phase 2, capability api_write:tasks). Wired via SetDataSources like the diff --git a/apps/backend/internal/plugins/host_data.go b/apps/backend/internal/plugins/host_data.go index 57a0b3787c..8105f96175 100644 --- a/apps/backend/internal/plugins/host_data.go +++ b/apps/backend/internal/plugins/host_data.go @@ -28,6 +28,7 @@ import ( analyticsmodels "github.com/kandev/kandev/internal/analytics/models" "github.com/kandev/kandev/internal/task/repository/repoerrors" + githubsvc "github.com/kandev/kandev/internal/github" taskmodels "github.com/kandev/kandev/internal/task/models" wfmodels "github.com/kandev/kandev/internal/workflow/models" "github.com/kandev/kandev/pkg/pluginsdk" @@ -164,6 +165,19 @@ type agentProfileDataSource interface { ListAgents(ctx context.Context) (*agentsettingsdto.ListAgentsResponse, error) } +// taskPRSource is the narrow slice of internal/github.Service the Tasks reader +// needs to populate Task.PullRequests. +// +// SEPARATE FROM taskDataSource ON PURPOSE. A task's pull requests live in +// github_task_prs, owned by internal/github, not on the task row — so the link +// is not derivable from anything taskDataSource returns. It is wired separately +// (SetTaskPRSource) because GitHub is optional and may be available after a +// host is created; a nil source simply yields tasks with no PullRequests rather +// than failing the read. +type taskPRSource interface { + ListTaskPRsByTaskIDs(ctx context.Context, taskIDs []string) (map[string][]*githubsvc.TaskPR, error) +} + // sessionCodeStatsSource is the narrow slice of // internal/analytics/service.Service the Sessions().CodeStats RPC needs. type sessionCodeStatsSource interface { @@ -339,16 +353,49 @@ func (r taskReader) List(ctx context.Context, filter pluginsdk.TaskFilter, page if err != nil { return nil, nil, err } - tasks, err := r.host.fetchTasksForWorkspaces(ctx, workspaceIDs, filter.IncludeEphemeral, false) + tasks, err := r.host.fetchTasksForWorkspaces(ctx, workspaceIDs, filter.IncludeEphemeral, filter.IncludeArchived) if err != nil { return nil, nil, err } tasks = filterTasks(tasks, filter) sortTasksNewestFirst(tasks) items, info := paginate(tasksToDTOs(tasks), page) + // Attached AFTER pagination so the PR lookup covers one page, not the whole + // workspace: a campaign-sized read would otherwise fan out over every task + // kandev holds to fill a list the caller already bounded. + r.host.attachPullRequests(ctx, items) return items, info, nil } +// attachPullRequests fills Task.PullRequests in place. A missing source or a +// failed lookup leaves them empty and logs nothing: pull requests are +// supplementary to a task read, and refusing the whole list over them would +// take away more than it protects. +func (h *pluginHost) attachPullRequests(ctx context.Context, tasks []pluginsdk.Task) { + source := h.taskPRs + if h.taskPRsDep != nil { + source = h.taskPRsDep() + } + if source == nil || len(tasks) == 0 { + return + } + ids := make([]string, 0, len(tasks)) + for i := range tasks { + ids = append(ids, tasks[i].ID) + } + byTask, err := source.ListTaskPRsByTaskIDs(ctx, ids) + if err != nil { + return + } + for i := range tasks { + prs := byTask[tasks[i].ID] + if len(prs) == 0 { + continue + } + tasks[i].PullRequests = taskPRsToDTOs(prs) + } +} + // Get returns a gRPC NotFound error (not a (nil, nil) success) when id // doesn't resolve to a task, so the in-process contract matches exactly what // a real plugin observes over the wire via grpcHostServer.GetTask. @@ -366,8 +413,9 @@ func (r taskReader) Get(ctx context.Context, id string) (*pluginsdk.Task, error) } return nil, err } - dto := taskModelToDTO(task) - return &dto, nil + items := []pluginsdk.Task{taskModelToDTO(task)} + r.host.attachPullRequests(ctx, items) + return &items[0], nil } type sessionReader struct{ host *pluginHost } diff --git a/apps/backend/internal/plugins/host_data_mappers.go b/apps/backend/internal/plugins/host_data_mappers.go index 92600a179d..525904bd20 100644 --- a/apps/backend/internal/plugins/host_data_mappers.go +++ b/apps/backend/internal/plugins/host_data_mappers.go @@ -2,11 +2,15 @@ package plugins import ( "context" + "encoding/json" "net/url" + "sort" + "strings" "time" agentsettingsdto "github.com/kandev/kandev/internal/agent/settings/dto" analyticsmodels "github.com/kandev/kandev/internal/analytics/models" + githubsvc "github.com/kandev/kandev/internal/github" "github.com/kandev/kandev/internal/sysprompt" taskmodels "github.com/kandev/kandev/internal/task/models" wfmodels "github.com/kandev/kandev/internal/workflow/models" @@ -79,14 +83,6 @@ func sessionSnapshotModel(snapshot map[string]any) string { return "" } -func timePtrToRFC3339(t *time.Time) *string { - if t == nil { - return nil - } - s := t.UTC().Format(time.RFC3339) - return &s -} - func stringPtrOrNil(s string) *string { if s == "" { return nil @@ -128,9 +124,92 @@ func taskModelToDTO(t *taskmodels.Task) pluginsdk.Task { IsEphemeral: t.IsEphemeral, Repositories: repos, Metadata: t.Metadata, + + ArchivedAt: timePtrToRFC3339(t.ArchivedAt), + WorkflowStepID: t.WorkflowStepID, + Position: int32(t.Position), + AssigneeAgentProfileID: t.AssigneeAgentProfileID, + Labels: decodeTaskLabels(t.Labels), + Autopilot: t.Autopilot, + WIPAdmitted: t.WIPAdmitted, + QueuedForStepID: t.QueuedForStepID, + QueuedAt: timePtrToRFC3339(t.QueuedAt), + ProjectID: t.ProjectID, + ExternalID: t.ExternalID, } } +func timePtrToRFC3339(t *time.Time) *string { + if t == nil { + return nil + } + s := t.UTC().Format(time.RFC3339) + return &s +} + +// decodeTaskLabels turns the model's JSON-array-string into a real slice. +// +// A MALFORMED VALUE YIELDS NO LABELS, NOT AN ERROR. Labels are decoration on a +// read that must not fail because one row holds something unparseable; the +// alternative is a whole task list refused over a cosmetic field. +func decodeTaskLabels(raw string) []string { + raw = strings.TrimSpace(raw) + if raw == "" || raw == "[]" { + return nil + } + var out []string + if err := json.Unmarshal([]byte(raw), &out); err != nil { + return nil + } + return out +} + +// taskPRsToDTOs maps kandev's own PR rows onto the plugin contract. Review and +// check state come along because kandev's PR watcher already syncs them: a +// plugin asking "what can merge" would otherwise re-query the forge per pull +// request, which is slower and rate-limited. +func taskPRsToDTOs(prs []*githubsvc.TaskPR) []pluginsdk.TaskPullRequest { + ordered := make([]*githubsvc.TaskPR, 0, len(prs)) + for _, pr := range prs { + if pr != nil { + ordered = append(ordered, pr) + } + } + sort.SliceStable(ordered, func(i, j int) bool { + return ordered[i].CreatedAt.After(ordered[j].CreatedAt) + }) + + out := make([]pluginsdk.TaskPullRequest, 0, len(ordered)) + for _, pr := range ordered { + out = append(out, pluginsdk.TaskPullRequest{ + Number: int64(pr.PRNumber), + URL: pr.PRURL, + Title: pr.PRTitle, + State: pr.State, + HeadBranch: pr.HeadBranch, + BaseBranch: pr.BaseBranch, + // IsDraft is nullable on the row (unknown before the first sync); + // nil reads as not-draft, matching how kandev's own UI treats it. + IsDraft: pr.IsDraft != nil && *pr.IsDraft, + // Only github writes these rows today; the field exists so a future + // gitlab-backed row is distinguishable rather than mislabelled. + Provider: "github", + MergedAt: timePtrToRFC3339(pr.MergedAt), + ClosedAt: timePtrToRFC3339(pr.ClosedAt), + ReviewState: pr.ReviewState, + ChecksState: pr.ChecksState, + MergeableState: pr.MergeableState, + UnresolvedReviewThreads: int32(pr.UnresolvedReviewThreads), + ChecksTotal: int32(pr.ChecksTotal), + ChecksPassing: int32(pr.ChecksPassing), + Additions: int32(pr.Additions), + Deletions: int32(pr.Deletions), + AuthorLogin: pr.AuthorLogin, + }) + } + return out +} + func workspaceModelToDTO(w *taskmodels.Workspace) pluginsdk.Workspace { return pluginsdk.Workspace{ ID: w.ID, @@ -158,11 +237,15 @@ func workflowModelToDTO(w *taskmodels.Workflow) pluginsdk.Workflow { func workflowStepModelToDTO(s *wfmodels.WorkflowStep) pluginsdk.WorkflowStep { return pluginsdk.WorkflowStep{ - ID: s.ID, - WorkflowID: s.WorkflowID, - Name: s.Name, - Position: int32(s.Position), - StageType: string(s.StageType), + ID: s.ID, + WorkflowID: s.WorkflowID, + Name: s.Name, + Position: int32(s.Position), + StageType: string(s.StageType), + Color: s.Color, + IsStartStep: s.IsStartStep, + WIPLimit: int32(s.WIPLimit), + AgentProfileID: s.AgentProfileID, } } diff --git a/apps/backend/internal/plugins/host_data_task_fields_test.go b/apps/backend/internal/plugins/host_data_task_fields_test.go new file mode 100644 index 0000000000..dfc88ebcc5 --- /dev/null +++ b/apps/backend/internal/plugins/host_data_task_fields_test.go @@ -0,0 +1,240 @@ +package plugins + +import ( + "context" + "testing" + "time" + + githubsvc "github.com/kandev/kandev/internal/github" + "github.com/kandev/kandev/internal/plugins/manifest" + taskmodels "github.com/kandev/kandev/internal/task/models" + wfmodels "github.com/kandev/kandev/internal/workflow/models" + "github.com/kandev/kandev/pkg/pluginsdk" + "github.com/stretchr/testify/require" +) + +// The step a task stands on, its labels, and whether it is archived were all +// unreadable from a plugin before this. A plugin could see a task's State +// (created / in progress / review / completed) but not WHERE on the board it +// was, so it could not render or group by a workflow at all. +func TestTaskModelToDTOCarriesBoardAndPlanningFields(t *testing.T) { + archived := time.Date(2026, 8, 20, 10, 0, 0, 0, time.UTC) + queued := time.Date(2026, 8, 19, 9, 0, 0, 0, time.UTC) + task := &taskmodels.Task{ + ID: "t1", + WorkflowStepID: "step-pr-review", + Position: 3, + AssigneeAgentProfileID: "agent-opus", + Labels: `["office","unblock"]`, + Autopilot: true, + WIPAdmitted: true, + QueuedForStepID: "step-build", + QueuedAt: &queued, + ProjectID: "proj-1", + ExternalID: "WO-101", + ArchivedAt: &archived, + } + + dto := taskModelToDTO(task) + + require.Equal(t, "step-pr-review", dto.WorkflowStepID) + require.Equal(t, int32(3), dto.Position) + require.Equal(t, "agent-opus", dto.AssigneeAgentProfileID) + require.Equal(t, []string{"office", "unblock"}, dto.Labels) + require.True(t, dto.Autopilot) + require.True(t, dto.WIPAdmitted) + require.Equal(t, "step-build", dto.QueuedForStepID) + require.NotNil(t, dto.QueuedAt) + require.Equal(t, "2026-08-19T09:00:00Z", *dto.QueuedAt) + require.Equal(t, "proj-1", dto.ProjectID) + require.Equal(t, "WO-101", dto.ExternalID) + require.NotNil(t, dto.ArchivedAt) + require.Equal(t, "2026-08-20T10:00:00Z", *dto.ArchivedAt) +} + +// A live task must report no archive timestamp at all, not a zero time — the +// difference is exactly how a plugin tells delivered work from in-flight work. +func TestTaskModelToDTOLeavesArchivedAtNilForALiveTask(t *testing.T) { + dto := taskModelToDTO(&taskmodels.Task{ID: "t1"}) + require.Nil(t, dto.ArchivedAt) + require.Nil(t, dto.QueuedAt) +} + +// Labels are a JSON-array string on the model. A row holding something +// unparseable must cost that row its labels, never the whole task read. +func TestDecodeTaskLabelsToleratesEmptyAndMalformedValues(t *testing.T) { + require.Equal(t, []string{"a", "b"}, decodeTaskLabels(`["a","b"]`)) + require.Nil(t, decodeTaskLabels("")) + require.Nil(t, decodeTaskLabels("[]")) + require.Nil(t, decodeTaskLabels(" ")) + require.Nil(t, decodeTaskLabels("not json")) + require.Nil(t, decodeTaskLabels(`{"a":1}`)) +} + +// Review and check state ride along because kandev's PR watcher already syncs +// them; a plugin asking "what can merge" would otherwise re-query the forge +// once per pull request. +func TestTaskPRsToDTOsCarriesReadinessNotJustIdentity(t *testing.T) { + merged := time.Date(2026, 8, 21, 12, 0, 0, 0, time.UTC) + draft := true + prs := []*githubsvc.TaskPR{{ + PRNumber: 3019, PRURL: "https://example/3019", PRTitle: "expose comments", + State: "open", HeadBranch: "feature/x", BaseBranch: "main", + IsDraft: &draft, AuthorLogin: "nova28", + ReviewState: "changes_requested", ChecksState: "failure", MergeableState: "blocked", + UnresolvedReviewThreads: 3, ChecksTotal: 12, ChecksPassing: 10, + Additions: 400, Deletions: 25, MergedAt: &merged, + }} + + out := taskPRsToDTOs(prs) + + require.Len(t, out, 1) + require.Equal(t, int64(3019), out[0].Number) + require.Equal(t, "github", out[0].Provider) + require.True(t, out[0].IsDraft) + require.Equal(t, "changes_requested", out[0].ReviewState) + require.Equal(t, "failure", out[0].ChecksState) + require.Equal(t, int32(3), out[0].UnresolvedReviewThreads) + require.Equal(t, int32(10), out[0].ChecksPassing) + require.NotNil(t, out[0].MergedAt) + require.Equal(t, "2026-08-21T12:00:00Z", *out[0].MergedAt) +} + +func TestTaskPRsToDTOsReturnsNewestFirst(t *testing.T) { + prs := []*githubsvc.TaskPR{ + {PRNumber: 100, PRTitle: "older", CreatedAt: time.Date(2026, 8, 20, 0, 0, 0, 0, time.UTC)}, + {PRNumber: 200, PRTitle: "newer", CreatedAt: time.Date(2026, 8, 21, 0, 0, 0, 0, time.UTC)}, + } + + out := taskPRsToDTOs(prs) + + require.Len(t, out, 2) + require.Equal(t, int64(200), out[0].Number) + require.Equal(t, "newer", out[0].Title) + require.Equal(t, int64(100), out[1].Number) +} + +// IsDraft is nullable on the row: unknown before the first sync. Nil must read +// as not-draft rather than panicking the whole task list. +func TestTaskPRsToDTOsTreatsAnUnknownDraftFlagAsNotDraft(t *testing.T) { + out := taskPRsToDTOs([]*githubsvc.TaskPR{{PRNumber: 1}, nil}) + require.Len(t, out, 1, "a nil row is skipped, not mapped") + require.False(t, out[0].IsDraft) +} + +type stubPRSource struct { + byTask map[string][]*githubsvc.TaskPR + err error + calls int +} + +func (s *stubPRSource) ListTaskPRsByTaskIDs(_ context.Context, ids []string) (map[string][]*githubsvc.TaskPR, error) { + s.calls++ + if s.err != nil { + return nil, s.err + } + return s.byTask, nil +} + +func TestAttachPullRequestsFillsOnlyTheTasksThatHaveThem(t *testing.T) { + src := &stubPRSource{byTask: map[string][]*githubsvc.TaskPR{ + "t1": {{PRNumber: 2907, State: "open"}}, + }} + h := &pluginHost{taskPRs: src} + tasks := []pluginsdk.Task{{ID: "t1"}, {ID: "t2"}} + + h.attachPullRequests(context.Background(), tasks) + + require.Len(t, tasks[0].PullRequests, 1) + require.Equal(t, int64(2907), tasks[0].PullRequests[0].Number) + require.Empty(t, tasks[1].PullRequests) + require.Equal(t, 1, src.calls, "one batched lookup, not one per task") +} + +// Pull requests are supplementary to a task read. Refusing the whole list when +// the lookup fails would take away more than it protects. +func TestAttachPullRequestsIsSilentWhenTheSourceIsMissingOrFailing(t *testing.T) { + tasks := []pluginsdk.Task{{ID: "t1"}} + + (&pluginHost{}).attachPullRequests(context.Background(), tasks) + require.Empty(t, tasks[0].PullRequests) + + failing := &stubPRSource{err: context.DeadlineExceeded} + (&pluginHost{taskPRs: failing}).attachPullRequests(context.Background(), tasks) + require.Empty(t, tasks[0].PullRequests) + require.Equal(t, 1, failing.calls) +} + +func TestTaskReaderGetAttachesPullRequests(t *testing.T) { + d := newTestDataHost(manifest.Capabilities{APIRead: []string{"tasks"}}) + task := &taskmodels.Task{ID: "task-1", Title: "with a PR"} + d.tasks.tasksByID = map[string]*taskmodels.Task{"task-1": task} + src := &stubPRSource{byTask: map[string][]*githubsvc.TaskPR{ + "task-1": {{PRNumber: 42, PRTitle: "fix"}}, + }} + d.host.taskPRs = src + + got, err := d.host.Tasks().Get(context.Background(), "task-1") + + require.NoError(t, err) + require.Len(t, got.PullRequests, 1) + require.Equal(t, int64(42), got.PullRequests[0].Number) +} + +func TestAttachPullRequestsUsesSourceWiredAfterHostCreation(t *testing.T) { + var source taskPRSource + h := &pluginHost{taskPRsDep: func() taskPRSource { return source }} + tasks := []pluginsdk.Task{{ID: "task-1"}} + + h.attachPullRequests(context.Background(), tasks) + require.Empty(t, tasks[0].PullRequests) + + source = &stubPRSource{byTask: map[string][]*githubsvc.TaskPR{ + "task-1": {{PRNumber: 99}}, + }} + h.attachPullRequests(context.Background(), tasks) + + require.Len(t, tasks[0].PullRequests, 1) + require.Equal(t, int64(99), tasks[0].PullRequests[0].Number) +} + +// A board plugin reads the step's own colour rather than inventing a palette, +// so its columns match what the operator already sees in kandev. +func TestWorkflowStepModelToDTOCarriesPresentationAndCapacity(t *testing.T) { + step := wfmodels.WorkflowStep{ + ID: "s1", Name: "PR Review", Position: 8, Color: "bg-indigo-500", + IsStartStep: true, WIPLimit: 3, AgentProfileID: "agent-1", + } + dto := workflowStepModelToDTO(&step) + require.Equal(t, "bg-indigo-500", dto.Color) + require.True(t, dto.IsStartStep) + require.Equal(t, int32(3), dto.WIPLimit) + require.Equal(t, "agent-1", dto.AgentProfileID) +} + +// Archived tasks were unreachable from a plugin: the fetch hardcoded +// includeArchived=false and TaskFilter had no way to ask. A plugin reporting on +// delivery needs them — an archived task is usually a delivered one, so leaving +// them out makes finished work look like it never happened. +func TestTasksListHonoursIncludeArchivedFromTheFilter(t *testing.T) { + d := newTestDataHost(manifest.Capabilities{APIRead: []string{"tasks"}}) + d.tasks.workspaces = []*taskmodels.Workspace{{ID: "ws-1"}} + d.tasks.tasksByWorkspace = map[string][]*taskmodels.Task{"ws-1": {{ID: "task-1", WorkspaceID: "ws-1"}}} + + _, _, err := d.host.Tasks().List(context.Background(), + pluginsdk.TaskFilter{IncludeArchived: true}, pluginsdk.Page{}) + require.NoError(t, err) + require.Equal(t, []bool{true}, d.tasks.gotIncludeArchived) +} + +// Not asking still means live tasks only, so a plugin written before the field +// existed keeps exactly the visibility it had. +func TestTasksListDefaultsToLiveTasksOnly(t *testing.T) { + d := newTestDataHost(manifest.Capabilities{APIRead: []string{"tasks"}}) + d.tasks.workspaces = []*taskmodels.Workspace{{ID: "ws-1"}} + d.tasks.tasksByWorkspace = map[string][]*taskmodels.Task{"ws-1": {{ID: "task-1", WorkspaceID: "ws-1"}}} + + _, _, err := d.host.Tasks().List(context.Background(), pluginsdk.TaskFilter{}, pluginsdk.Page{}) + require.NoError(t, err) + require.Equal(t, []bool{false}, d.tasks.gotIncludeArchived) +} diff --git a/apps/backend/internal/plugins/host_write.go b/apps/backend/internal/plugins/host_write.go index 3185348400..21321c59e1 100644 --- a/apps/backend/internal/plugins/host_write.go +++ b/apps/backend/internal/plugins/host_write.go @@ -213,8 +213,9 @@ func (r taskReader) Update(ctx context.Context, in pluginsdk.UpdateTaskInput) (* } return nil, err } - dto := taskModelToDTO(updated) - return &dto, nil + items := []pluginsdk.Task{taskModelToDTO(updated)} + r.host.attachPullRequests(ctx, items) + return &items[0], nil } // resolveCreatePlacement fills the workspace and workflow a created task lands @@ -446,7 +447,9 @@ func (m pluginOwnedTaskTreeManager) Preview(ctx context.Context, rootTaskID stri if err != nil { return nil, err } - return tasksToDTOs(tasks), nil + dtos := tasksToDTOs(tasks) + m.host.attachPullRequests(ctx, dtos) + return dtos, nil } func (m pluginOwnedTaskTreeManager) Delete(ctx context.Context, rootTaskID string) ([]string, error) { diff --git a/apps/backend/internal/plugins/host_write_test.go b/apps/backend/internal/plugins/host_write_test.go index 41125e453e..7ebaa59779 100644 --- a/apps/backend/internal/plugins/host_write_test.go +++ b/apps/backend/internal/plugins/host_write_test.go @@ -6,6 +6,7 @@ import ( "testing" agentsettingsdto "github.com/kandev/kandev/internal/agent/settings/dto" + githubsvc "github.com/kandev/kandev/internal/github" "github.com/kandev/kandev/internal/plugins/manifest" taskmodels "github.com/kandev/kandev/internal/task/models" "github.com/kandev/kandev/internal/task/repository/repoerrors" @@ -14,6 +15,23 @@ import ( "google.golang.org/grpc/status" ) +func TestPluginHost_Tasks_UpdateAttachesPullRequests(t *testing.T) { + d := newTestDataHost(manifest.Capabilities{APIWrite: []string{"tasks"}}) + d.taskWriter.updated = &taskmodels.Task{ID: "task-1", Title: "updated"} + d.host.taskPRs = &stubPRSource{byTask: map[string][]*githubsvc.TaskPR{ + "task-1": {{PRNumber: 43}}, + }} + + got, err := d.host.Tasks().Update(context.Background(), pluginsdk.UpdateTaskInput{ID: "task-1"}) + + if err != nil { + t.Fatalf("Update() unexpected error: %v", err) + } + if len(got.PullRequests) != 1 || got.PullRequests[0].Number != 43 { + t.Fatalf("Update() pull requests = %+v, want PR #43", got.PullRequests) + } +} + // ── Write gating: denied without api_write: ─────────────────── func TestPluginHost_Tasks_CreateDeniedWithoutWriteCapability(t *testing.T) { @@ -287,6 +305,28 @@ func TestPluginHost_PluginOwnedTaskTreeRejectsUserOwnedRoot(t *testing.T) { } } +func TestPluginHost_PluginOwnedTaskTreePreviewAttachesPullRequests(t *testing.T) { + d := newTestDataHost(manifest.Capabilities{APIWrite: []string{"tasks"}}) + root := &taskmodels.Task{ + ID: "root", WorkspaceID: "ws-1", + Metadata: map[string]any{taskSourceMetadataKey: "plugin:p1"}, + } + d.tasks.tasksByID = map[string]*taskmodels.Task{"root": root} + d.tasks.tasksByWorkspace = map[string][]*taskmodels.Task{"ws-1": {root}} + d.host.taskPRs = &stubPRSource{byTask: map[string][]*githubsvc.TaskPR{ + "root": {{PRNumber: 44}}, + }} + + preview, err := d.host.PluginOwnedTaskTrees().Preview(context.Background(), "root") + + if err != nil { + t.Fatalf("Preview() unexpected error: %v", err) + } + if len(preview) != 1 || len(preview[0].PullRequests) != 1 || preview[0].PullRequests[0].Number != 44 { + t.Fatalf("Preview() pull requests = %+v, want PR #44", preview) + } +} + func TestPluginHost_PluginOwnedTaskTreeDeleteIsIdempotentAfterRootDeletion(t *testing.T) { d := newTestDataHost(manifest.Capabilities{APIWrite: []string{"tasks"}}) d.tasks.tasksByID = map[string]*taskmodels.Task{} diff --git a/apps/backend/internal/plugins/service.go b/apps/backend/internal/plugins/service.go index 533a226d31..0b922963e1 100644 --- a/apps/backend/internal/plugins/service.go +++ b/apps/backend/internal/plugins/service.go @@ -123,7 +123,10 @@ type Service struct { sessionCodeStats sessionCodeStatsSource messageData messageDataSource interactionData interactionDataSource - taskWriter taskWriter + // taskPRs is guarded by mu and read through taskPRSourceDep, because hosts can + // outlive the late SetTaskPRSource wiring. + taskPRs taskPRSource + taskWriter taskWriter // Utility agent invocation (ADR 0048), wired via SetUtilityAgent. utilityAgents utilityAgentSource @@ -428,6 +431,24 @@ func (s *Service) SetDataSources( // StartActivePlugins has spawned boot-active plugins — so hosts read it live // via interactionResponderDep rather than snapshotting it. A nil responder // leaves the write RPCs returning Unimplemented; the reads are unaffected. +// SetTaskPRSource wires the optional pull-request lookup behind +// Task.PullRequests. It is separate from SetDataSources because GitHub is an +// optional service; nil leaves tasks with no PullRequests rather than failing +// the read. +func (s *Service) SetTaskPRSource(src taskPRSource) { + s.mu.Lock() + defer s.mu.Unlock() + s.taskPRs = src +} + +// taskPRSourceDep returns the currently wired pull-request source. Hosts call +// this accessor at read time so late wiring reaches already-running plugins. +func (s *Service) taskPRSourceDep() taskPRSource { + s.mu.Lock() + defer s.mu.Unlock() + return s.taskPRs +} + func (s *Service) SetInteractionResponder(responder interactionResponder) { s.mu.Lock() defer s.mu.Unlock() @@ -630,6 +651,7 @@ func (s *Service) hostForPlugin(pluginID string) pluginsdk.Host { sessionCodeStats: s.sessionCodeStats, messageData: s.messageData, interactionData: s.interactionData, + taskPRsDep: s.taskPRSourceDep, taskWriter: s.taskWriter, utilityDeps: s.utilityAgentDeps, writeDeps: s.writeDependencies, diff --git a/apps/backend/pkg/pluginsdk/data_types.go b/apps/backend/pkg/pluginsdk/data_types.go index 9d519aa10f..76d9188306 100644 --- a/apps/backend/pkg/pluginsdk/data_types.go +++ b/apps/backend/pkg/pluginsdk/data_types.go @@ -110,6 +110,78 @@ type Task struct { IsEphemeral bool Repositories []TaskRepository Metadata map[string]any + // ArchivedAt is nil for a live task. Only ever populated when the read asked + // for archived tasks (TaskFilter.IncludeArchived). + ArchivedAt *string + // PullRequests are the changes opened for this task, newest first. The link + // is not derivable from any other field on Task: CheckoutBranch is the BASE + // branch, and a PR title is rewritten to conventional-commit form. + PullRequests []TaskPullRequest + // WorkflowStepID is where on the board the task stands. State says how it is + // going; this says where it is. + WorkflowStepID string + Position int32 + AssigneeAgentProfileID string + Labels []string + Autopilot bool + WIPAdmitted bool + QueuedForStepID string + QueuedAt *string + ProjectID string + ExternalID string +} + +// TaskPullRequest is one change opened for a task. Provider-neutral by design: +// review metadata specific to one forge stays out of the plugin contract. +type TaskPullRequest struct { + Number int64 + URL string + Title string + State string // "open" | "closed" | "merged" + HeadBranch string + BaseBranch string + IsDraft bool + Provider string // "github" | "gitlab" + MergedAt *string + ClosedAt *string + // Readiness, already synced by kandev's PR watcher. Carried so a plugin + // asking "what can merge" does not re-fetch all of it from the forge. + ReviewState string + ChecksState string + MergeableState string + UnresolvedReviewThreads int32 + ChecksTotal int32 + ChecksPassing int32 + Additions int32 + Deletions int32 + AuthorLogin string +} + +func (r TaskPullRequest) toProto() *pluginv1.TaskPullRequest { + return &pluginv1.TaskPullRequest{ + Number: r.Number, Url: r.URL, Title: r.Title, State: r.State, + HeadBranch: r.HeadBranch, BaseBranch: r.BaseBranch, IsDraft: r.IsDraft, + Provider: r.Provider, MergedAt: r.MergedAt, ClosedAt: r.ClosedAt, + ReviewState: r.ReviewState, ChecksState: r.ChecksState, + MergeableState: r.MergeableState, UnresolvedReviewThreads: r.UnresolvedReviewThreads, + ChecksTotal: r.ChecksTotal, ChecksPassing: r.ChecksPassing, + Additions: r.Additions, Deletions: r.Deletions, AuthorLogin: r.AuthorLogin, + } +} + +func taskPullRequestFromProto(p *pluginv1.TaskPullRequest) TaskPullRequest { + if p == nil { + return TaskPullRequest{} + } + return TaskPullRequest{ + Number: p.GetNumber(), URL: p.GetUrl(), Title: p.GetTitle(), State: p.GetState(), + HeadBranch: p.GetHeadBranch(), BaseBranch: p.GetBaseBranch(), IsDraft: p.GetIsDraft(), + Provider: p.GetProvider(), MergedAt: p.MergedAt, ClosedAt: p.ClosedAt, + ReviewState: p.GetReviewState(), ChecksState: p.GetChecksState(), + MergeableState: p.GetMergeableState(), UnresolvedReviewThreads: p.GetUnresolvedReviewThreads(), + ChecksTotal: p.GetChecksTotal(), ChecksPassing: p.GetChecksPassing(), + Additions: p.GetAdditions(), Deletions: p.GetDeletions(), AuthorLogin: p.GetAuthorLogin(), + } } func (t Task) toProto() (*pluginv1.Task, error) { @@ -142,9 +214,44 @@ func (t Task) toProto() (*pluginv1.Task, error) { IsEphemeral: t.IsEphemeral, Repositories: repos, Metadata: metadata, + + ArchivedAt: t.ArchivedAt, + PullRequests: taskPullRequestsToProto(t.PullRequests), + WorkflowStepId: t.WorkflowStepID, + Position: t.Position, + AssigneeAgentProfileId: t.AssigneeAgentProfileID, + Labels: t.Labels, + Autopilot: t.Autopilot, + WipAdmitted: t.WIPAdmitted, + QueuedForStepId: t.QueuedForStepID, + QueuedAt: t.QueuedAt, + ProjectId: t.ProjectID, + ExternalId: t.ExternalID, }, nil } +func taskPullRequestsToProto(in []TaskPullRequest) []*pluginv1.TaskPullRequest { + if len(in) == 0 { + return nil + } + out := make([]*pluginv1.TaskPullRequest, len(in)) + for i := range in { + out[i] = in[i].toProto() + } + return out +} + +func taskPullRequestsFromProto(in []*pluginv1.TaskPullRequest) []TaskPullRequest { + if len(in) == 0 { + return nil + } + out := make([]TaskPullRequest, len(in)) + for i, r := range in { + out[i] = taskPullRequestFromProto(r) + } + return out +} + func taskFromProto(p *pluginv1.Task) (Task, error) { if p == nil { return Task{}, nil @@ -178,6 +285,19 @@ func taskFromProto(p *pluginv1.Task) (Task, error) { IsEphemeral: p.GetIsEphemeral(), Repositories: repos, Metadata: metadata, + + ArchivedAt: p.ArchivedAt, + PullRequests: taskPullRequestsFromProto(p.GetPullRequests()), + WorkflowStepID: p.GetWorkflowStepId(), + Position: p.GetPosition(), + AssigneeAgentProfileID: p.GetAssigneeAgentProfileId(), + Labels: p.GetLabels(), + Autopilot: p.GetAutopilot(), + WIPAdmitted: p.GetWipAdmitted(), + QueuedForStepID: p.GetQueuedForStepId(), + QueuedAt: p.QueuedAt, + ProjectID: p.GetProjectId(), + ExternalID: p.GetExternalId(), }, nil } @@ -218,6 +338,12 @@ type TaskFilter struct { States []string ParentID *string IncludeEphemeral bool + // IncludeArchived defaults false, matching the behaviour before this field + // existed: a plugin that does not ask still sees only live tasks. A plugin + // reporting on delivery needs true — an archived task is usually a + // delivered one, and omitting it makes finished work look like it never + // happened. + IncludeArchived bool } func (f TaskFilter) toProto() *pluginv1.TaskFilter { @@ -227,6 +353,7 @@ func (f TaskFilter) toProto() *pluginv1.TaskFilter { States: f.States, ParentId: f.ParentID, IncludeEphemeral: f.IncludeEphemeral, + IncludeArchived: f.IncludeArchived, } } @@ -240,6 +367,7 @@ func taskFilterFromProto(p *pluginv1.TaskFilter) TaskFilter { States: p.GetStates(), ParentID: p.ParentId, IncludeEphemeral: p.GetIncludeEphemeral(), + IncludeArchived: p.GetIncludeArchived(), } } @@ -373,15 +501,26 @@ type WorkflowStep struct { Name string Position int32 StageType string + // Color is the step's own presentation colour. A plugin rendering a board + // reads it rather than inventing a palette, so its columns match the ones + // the operator already sees in kandev. + Color string + IsStartStep bool + WIPLimit int32 // 0 means unlimited + AgentProfileID string } func (s WorkflowStep) toProto() *pluginv1.WorkflowStep { return &pluginv1.WorkflowStep{ - Id: s.ID, - WorkflowId: s.WorkflowID, - Name: s.Name, - Position: s.Position, - StageType: s.StageType, + Id: s.ID, + WorkflowId: s.WorkflowID, + Name: s.Name, + Position: s.Position, + StageType: s.StageType, + Color: s.Color, + IsStartStep: s.IsStartStep, + WipLimit: s.WIPLimit, + AgentProfileId: s.AgentProfileID, } } @@ -390,11 +529,15 @@ func workflowStepFromProto(p *pluginv1.WorkflowStep) WorkflowStep { return WorkflowStep{} } return WorkflowStep{ - ID: p.GetId(), - WorkflowID: p.GetWorkflowId(), - Name: p.GetName(), - Position: p.GetPosition(), - StageType: p.GetStageType(), + ID: p.GetId(), + WorkflowID: p.GetWorkflowId(), + Name: p.GetName(), + Position: p.GetPosition(), + StageType: p.GetStageType(), + Color: p.GetColor(), + IsStartStep: p.GetIsStartStep(), + WIPLimit: p.GetWipLimit(), + AgentProfileID: p.GetAgentProfileId(), } } diff --git a/apps/backend/pkg/pluginsdk/data_types_test.go b/apps/backend/pkg/pluginsdk/data_types_test.go index f0b69569fb..7f7a09f5dc 100644 --- a/apps/backend/pkg/pluginsdk/data_types_test.go +++ b/apps/backend/pkg/pluginsdk/data_types_test.go @@ -50,7 +50,20 @@ func TestTaskProtoRoundTrip(t *testing.T) { {ID: "tr-1", RepositoryID: "repo-1", BaseBranch: "main", Position: 0, CheckoutBranch: "feature/fix"}, {ID: "tr-2", RepositoryID: "repo-2", BaseBranch: "develop", Position: 1}, }, - Metadata: map[string]any{"source": "plugin:agent-stats", "count": float64(3)}, + Metadata: map[string]any{"source": "plugin:agent-stats", "count": float64(3)}, + ArchivedAt: strPtr("2026-07-16T12:00:00Z"), + PullRequests: []TaskPullRequest{{ + Number: 42, URL: "https://example.test/pulls/42", Title: "Fix the bug", + State: "open", HeadBranch: "feature/fix", BaseBranch: "main", IsDraft: true, + Provider: "github", MergedAt: strPtr("2026-07-16T11:00:00Z"), + ClosedAt: strPtr("2026-07-16T11:30:00Z"), ReviewState: "approved", + ChecksState: "success", MergeableState: "clean", UnresolvedReviewThreads: 1, + ChecksTotal: 5, ChecksPassing: 5, Additions: 12, Deletions: 3, AuthorLogin: "nova28", + }}, + WorkflowStepID: "step-review", Position: 4, AssigneeAgentProfileID: "agent-1", + Labels: []string{"plugin", "ready"}, Autopilot: true, WIPAdmitted: true, + QueuedForStepID: "step-build", QueuedAt: strPtr("2026-07-16T10:00:00Z"), + ProjectID: "project-1", ExternalID: "external-1", } proto, err := task.toProto() @@ -60,6 +73,10 @@ func TestTaskProtoRoundTrip(t *testing.T) { require.Nil(t, proto.CompletedAt) require.Equal(t, "feature/fix", proto.GetRepositories()[0].GetCheckoutBranch()) require.Empty(t, proto.GetRepositories()[1].GetCheckoutBranch(), "empty checkout branches remain wire-compatible") + require.Equal(t, "step-review", proto.GetWorkflowStepId()) + require.True(t, proto.GetAutopilot()) + require.Len(t, proto.GetPullRequests(), 1) + require.Equal(t, int64(42), proto.GetPullRequests()[0].GetNumber()) back, err := taskFromProto(proto) require.NoError(t, err) @@ -82,6 +99,21 @@ func TestTaskProtoRoundTrip_NilOptionalsAndEmptyMetadata(t *testing.T) { require.Equal(t, task, back) } +func TestTaskPullRequestProtoRoundTrip(t *testing.T) { + pr := TaskPullRequest{ + Number: 42, URL: "https://example.test/pulls/42", Title: "Fix the bug", + State: "merged", HeadBranch: "feature/fix", BaseBranch: "main", IsDraft: false, + Provider: "github", MergedAt: strPtr("2026-07-16T11:00:00Z"), ClosedAt: nil, + ReviewState: "approved", ChecksState: "success", MergeableState: "clean", + UnresolvedReviewThreads: 0, ChecksTotal: 5, ChecksPassing: 5, + Additions: 12, Deletions: 3, AuthorLogin: "nova28", + } + + proto := pr.toProto() + require.Equal(t, pr, taskPullRequestFromProto(proto)) + require.Nil(t, proto.ClosedAt) +} + func TestTaskFilterProtoRoundTrip(t *testing.T) { filter := TaskFilter{ WorkspaceIDs: []string{"ws-1", "ws-2"}, @@ -89,6 +121,7 @@ func TestTaskFilterProtoRoundTrip(t *testing.T) { States: []string{"todo", "in_progress"}, ParentID: strPtr("task-0"), IncludeEphemeral: true, + IncludeArchived: true, } proto := filter.toProto() require.Equal(t, filter, taskFilterFromProto(proto)) @@ -129,11 +162,15 @@ func TestWorkflowProtoRoundTrip(t *testing.T) { func TestWorkflowStepProtoRoundTrip(t *testing.T) { step := WorkflowStep{ - ID: "step-1", - WorkflowID: "wf-1", - Name: "Review", - Position: 1, - StageType: "review", + ID: "step-1", + WorkflowID: "wf-1", + Name: "Review", + Position: 1, + StageType: "review", + Color: "bg-indigo-500", + IsStartStep: true, + WIPLimit: 3, + AgentProfileID: "agent-1", } proto := step.toProto() require.Equal(t, step, workflowStepFromProto(proto)) diff --git a/apps/backend/proto/kandev/plugin/v1/plugin.pb.go b/apps/backend/proto/kandev/plugin/v1/plugin.pb.go index b6c11038a9..b7ab626752 100644 --- a/apps/backend/proto/kandev/plugin/v1/plugin.pb.go +++ b/apps/backend/proto/kandev/plugin/v1/plugin.pb.go @@ -2366,24 +2366,57 @@ func (x *PageInfo) GetHasMore() bool { // ── Task ──────────────────────────────────────────────────────────────────── type Task struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - WorkspaceId string `protobuf:"bytes,2,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` - WorkflowId string `protobuf:"bytes,3,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` - Title string `protobuf:"bytes,4,opt,name=title,proto3" json:"title,omitempty"` - Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` - State string `protobuf:"bytes,6,opt,name=state,proto3" json:"state,omitempty"` // TaskState enum value as a string, stable - Priority string `protobuf:"bytes,7,opt,name=priority,proto3" json:"priority,omitempty"` - CreatedBy string `protobuf:"bytes,8,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"` - CreatedAt string `protobuf:"bytes,9,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` // RFC3339 - UpdatedAt string `protobuf:"bytes,10,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - StartedAt *string `protobuf:"bytes,11,opt,name=started_at,json=startedAt,proto3,oneof" json:"started_at,omitempty"` - CompletedAt *string `protobuf:"bytes,12,opt,name=completed_at,json=completedAt,proto3,oneof" json:"completed_at,omitempty"` - ParentId *string `protobuf:"bytes,13,opt,name=parent_id,json=parentId,proto3,oneof" json:"parent_id,omitempty"` - Identifier string `protobuf:"bytes,14,opt,name=identifier,proto3" json:"identifier,omitempty"` - IsEphemeral bool `protobuf:"varint,15,opt,name=is_ephemeral,json=isEphemeral,proto3" json:"is_ephemeral,omitempty"` - Repositories []*TaskRepository `protobuf:"bytes,16,rep,name=repositories,proto3" json:"repositories,omitempty"` - Metadata *structpb.Struct `protobuf:"bytes,17,opt,name=metadata,proto3" json:"metadata,omitempty"` // free-form; plugin-tolerant + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + WorkspaceId string `protobuf:"bytes,2,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` + WorkflowId string `protobuf:"bytes,3,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` + Title string `protobuf:"bytes,4,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + State string `protobuf:"bytes,6,opt,name=state,proto3" json:"state,omitempty"` // TaskState enum value as a string, stable + Priority string `protobuf:"bytes,7,opt,name=priority,proto3" json:"priority,omitempty"` + CreatedBy string `protobuf:"bytes,8,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"` + CreatedAt string `protobuf:"bytes,9,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` // RFC3339 + UpdatedAt string `protobuf:"bytes,10,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + StartedAt *string `protobuf:"bytes,11,opt,name=started_at,json=startedAt,proto3,oneof" json:"started_at,omitempty"` + CompletedAt *string `protobuf:"bytes,12,opt,name=completed_at,json=completedAt,proto3,oneof" json:"completed_at,omitempty"` + ParentId *string `protobuf:"bytes,13,opt,name=parent_id,json=parentId,proto3,oneof" json:"parent_id,omitempty"` + Identifier string `protobuf:"bytes,14,opt,name=identifier,proto3" json:"identifier,omitempty"` + IsEphemeral bool `protobuf:"varint,15,opt,name=is_ephemeral,json=isEphemeral,proto3" json:"is_ephemeral,omitempty"` + Repositories []*TaskRepository `protobuf:"bytes,16,rep,name=repositories,proto3" json:"repositories,omitempty"` + Metadata *structpb.Struct `protobuf:"bytes,17,opt,name=metadata,proto3" json:"metadata,omitempty"` // free-form; plugin-tolerant + // RFC3339, set only when the task is archived. Present so a plugin reading + // with include_archived can tell a live task from a retired one; absent is + // the normal case, not an unknown. + ArchivedAt *string `protobuf:"bytes,18,opt,name=archived_at,json=archivedAt,proto3,oneof" json:"archived_at,omitempty"` + // Pull requests opened for this task, newest first. A plugin that reports on + // delivery cannot otherwise get from a task to its change: the link lives in + // github_task_prs, and neither the checkout branch (which is the BASE branch) + // nor the title (rewritten to conventional-commit form on the PR) matches. + PullRequests []*TaskPullRequest `protobuf:"bytes,19,rep,name=pull_requests,json=pullRequests,proto3" json:"pull_requests,omitempty"` + // The step the task currently stands on, and its order within that step. + // Without these a plugin can read a task's State (created/in progress/review/ + // completed) but not WHERE on the board it is, so it cannot render, group by, + // or reason about a workflow at all. + WorkflowStepId string `protobuf:"bytes,20,opt,name=workflow_step_id,json=workflowStepId,proto3" json:"workflow_step_id,omitempty"` + Position int32 `protobuf:"varint,21,opt,name=position,proto3" json:"position,omitempty"` + // The agent profile running this task, empty when unassigned. Canonically a + // `runner` row in workflow_step_participants (ADR 0005 Wave F); this is the + // same read-time projection kandev's own callers consume. + AssigneeAgentProfileId string `protobuf:"bytes,22,opt,name=assignee_agent_profile_id,json=assigneeAgentProfileId,proto3" json:"assignee_agent_profile_id,omitempty"` + // Task labels. Stored as a JSON array string on the model; carried here as a + // real repeated field so a plugin does not have to re-parse it. + Labels []string `protobuf:"bytes,23,rep,name=labels,proto3" json:"labels,omitempty"` + Autopilot bool `protobuf:"varint,24,opt,name=autopilot,proto3" json:"autopilot,omitempty"` + // Whether the task consumes a slot in its current step's WIP capacity. A + // queued task stays visible but admits nothing, so a capacity report that + // counted rows rather than this would over-count. + WipAdmitted bool `protobuf:"varint,25,opt,name=wip_admitted,json=wipAdmitted,proto3" json:"wip_admitted,omitempty"` + QueuedForStepId string `protobuf:"bytes,26,opt,name=queued_for_step_id,json=queuedForStepId,proto3" json:"queued_for_step_id,omitempty"` + QueuedAt *string `protobuf:"bytes,27,opt,name=queued_at,json=queuedAt,proto3,oneof" json:"queued_at,omitempty"` // RFC3339 + // Office project this task belongs to, empty for kanban-board tasks. + ProjectId string `protobuf:"bytes,28,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` + // Caller-supplied create-idempotency key, empty when the task holds none. + ExternalId string `protobuf:"bytes,29,opt,name=external_id,json=externalId,proto3" json:"external_id,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -2537,6 +2570,90 @@ func (x *Task) GetMetadata() *structpb.Struct { return nil } +func (x *Task) GetArchivedAt() string { + if x != nil && x.ArchivedAt != nil { + return *x.ArchivedAt + } + return "" +} + +func (x *Task) GetPullRequests() []*TaskPullRequest { + if x != nil { + return x.PullRequests + } + return nil +} + +func (x *Task) GetWorkflowStepId() string { + if x != nil { + return x.WorkflowStepId + } + return "" +} + +func (x *Task) GetPosition() int32 { + if x != nil { + return x.Position + } + return 0 +} + +func (x *Task) GetAssigneeAgentProfileId() string { + if x != nil { + return x.AssigneeAgentProfileId + } + return "" +} + +func (x *Task) GetLabels() []string { + if x != nil { + return x.Labels + } + return nil +} + +func (x *Task) GetAutopilot() bool { + if x != nil { + return x.Autopilot + } + return false +} + +func (x *Task) GetWipAdmitted() bool { + if x != nil { + return x.WipAdmitted + } + return false +} + +func (x *Task) GetQueuedForStepId() string { + if x != nil { + return x.QueuedForStepId + } + return "" +} + +func (x *Task) GetQueuedAt() string { + if x != nil && x.QueuedAt != nil { + return *x.QueuedAt + } + return "" +} + +func (x *Task) GetProjectId() string { + if x != nil { + return x.ProjectId + } + return "" +} + +func (x *Task) GetExternalId() string { + if x != nil { + return x.ExternalId + } + return "" +} + type TaskRepository struct { state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` @@ -2613,6 +2730,200 @@ func (x *TaskRepository) GetCheckoutBranch() string { return "" } +// TaskPullRequest is the read-side view of a task's linked pull request. It +// carries provider-neutral fields only; provider-specific review metadata stays +// out of the plugin contract. +type TaskPullRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Number int64 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"` + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` // "open" | "closed" | "merged" + HeadBranch string `protobuf:"bytes,5,opt,name=head_branch,json=headBranch,proto3" json:"head_branch,omitempty"` + BaseBranch string `protobuf:"bytes,6,opt,name=base_branch,json=baseBranch,proto3" json:"base_branch,omitempty"` + IsDraft bool `protobuf:"varint,7,opt,name=is_draft,json=isDraft,proto3" json:"is_draft,omitempty"` + Provider string `protobuf:"bytes,8,opt,name=provider,proto3" json:"provider,omitempty"` // "github" | "gitlab" + MergedAt *string `protobuf:"bytes,9,opt,name=merged_at,json=mergedAt,proto3,oneof" json:"merged_at,omitempty"` // RFC3339 + // Readiness, already synced by kandev's own PR watcher. A plugin reporting on + // what can merge would otherwise re-fetch every one of these from the forge + // per pull request, which is both slower and rate-limited. + ReviewState string `protobuf:"bytes,10,opt,name=review_state,json=reviewState,proto3" json:"review_state,omitempty"` // approved | changes_requested | pending | "" + ChecksState string `protobuf:"bytes,11,opt,name=checks_state,json=checksState,proto3" json:"checks_state,omitempty"` // success | failure | pending | "" + MergeableState string `protobuf:"bytes,12,opt,name=mergeable_state,json=mergeableState,proto3" json:"mergeable_state,omitempty"` // clean | blocked | behind | dirty | unstable | draft | unknown | "" + UnresolvedReviewThreads int32 `protobuf:"varint,13,opt,name=unresolved_review_threads,json=unresolvedReviewThreads,proto3" json:"unresolved_review_threads,omitempty"` + ChecksTotal int32 `protobuf:"varint,14,opt,name=checks_total,json=checksTotal,proto3" json:"checks_total,omitempty"` + ChecksPassing int32 `protobuf:"varint,15,opt,name=checks_passing,json=checksPassing,proto3" json:"checks_passing,omitempty"` + Additions int32 `protobuf:"varint,16,opt,name=additions,proto3" json:"additions,omitempty"` + Deletions int32 `protobuf:"varint,17,opt,name=deletions,proto3" json:"deletions,omitempty"` + AuthorLogin string `protobuf:"bytes,18,opt,name=author_login,json=authorLogin,proto3" json:"author_login,omitempty"` + ClosedAt *string `protobuf:"bytes,19,opt,name=closed_at,json=closedAt,proto3,oneof" json:"closed_at,omitempty"` // RFC3339 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TaskPullRequest) Reset() { + *x = TaskPullRequest{} + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TaskPullRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskPullRequest) ProtoMessage() {} + +func (x *TaskPullRequest) ProtoReflect() protoreflect.Message { + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[44] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TaskPullRequest.ProtoReflect.Descriptor instead. +func (*TaskPullRequest) Descriptor() ([]byte, []int) { + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{44} +} + +func (x *TaskPullRequest) GetNumber() int64 { + if x != nil { + return x.Number + } + return 0 +} + +func (x *TaskPullRequest) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *TaskPullRequest) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *TaskPullRequest) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *TaskPullRequest) GetHeadBranch() string { + if x != nil { + return x.HeadBranch + } + return "" +} + +func (x *TaskPullRequest) GetBaseBranch() string { + if x != nil { + return x.BaseBranch + } + return "" +} + +func (x *TaskPullRequest) GetIsDraft() bool { + if x != nil { + return x.IsDraft + } + return false +} + +func (x *TaskPullRequest) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +func (x *TaskPullRequest) GetMergedAt() string { + if x != nil && x.MergedAt != nil { + return *x.MergedAt + } + return "" +} + +func (x *TaskPullRequest) GetReviewState() string { + if x != nil { + return x.ReviewState + } + return "" +} + +func (x *TaskPullRequest) GetChecksState() string { + if x != nil { + return x.ChecksState + } + return "" +} + +func (x *TaskPullRequest) GetMergeableState() string { + if x != nil { + return x.MergeableState + } + return "" +} + +func (x *TaskPullRequest) GetUnresolvedReviewThreads() int32 { + if x != nil { + return x.UnresolvedReviewThreads + } + return 0 +} + +func (x *TaskPullRequest) GetChecksTotal() int32 { + if x != nil { + return x.ChecksTotal + } + return 0 +} + +func (x *TaskPullRequest) GetChecksPassing() int32 { + if x != nil { + return x.ChecksPassing + } + return 0 +} + +func (x *TaskPullRequest) GetAdditions() int32 { + if x != nil { + return x.Additions + } + return 0 +} + +func (x *TaskPullRequest) GetDeletions() int32 { + if x != nil { + return x.Deletions + } + return 0 +} + +func (x *TaskPullRequest) GetAuthorLogin() string { + if x != nil { + return x.AuthorLogin + } + return "" +} + +func (x *TaskPullRequest) GetClosedAt() string { + if x != nil && x.ClosedAt != nil { + return *x.ClosedAt + } + return "" +} + type TaskFilter struct { state protoimpl.MessageState `protogen:"open.v1"` WorkspaceIds []string `protobuf:"bytes,1,rep,name=workspace_ids,json=workspaceIds,proto3" json:"workspace_ids,omitempty"` // empty → all the plugin may see @@ -2620,13 +2931,16 @@ type TaskFilter struct { States []string `protobuf:"bytes,3,rep,name=states,proto3" json:"states,omitempty"` ParentId *string `protobuf:"bytes,4,opt,name=parent_id,json=parentId,proto3,oneof" json:"parent_id,omitempty"` IncludeEphemeral bool `protobuf:"varint,5,opt,name=include_ephemeral,json=includeEphemeral,proto3" json:"include_ephemeral,omitempty"` // default false (kanban-visible only) - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // default false, matching the previous hardcoded behaviour: a plugin that + // does not ask still sees only live tasks. + IncludeArchived bool `protobuf:"varint,6,opt,name=include_archived,json=includeArchived,proto3" json:"include_archived,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TaskFilter) Reset() { *x = TaskFilter{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[44] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2638,7 +2952,7 @@ func (x *TaskFilter) String() string { func (*TaskFilter) ProtoMessage() {} func (x *TaskFilter) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[44] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2651,7 +2965,7 @@ func (x *TaskFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskFilter.ProtoReflect.Descriptor instead. func (*TaskFilter) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{44} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{45} } func (x *TaskFilter) GetWorkspaceIds() []string { @@ -2689,6 +3003,13 @@ func (x *TaskFilter) GetIncludeEphemeral() bool { return false } +func (x *TaskFilter) GetIncludeArchived() bool { + if x != nil { + return x.IncludeArchived + } + return false +} + type ListTasksRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Filter *TaskFilter `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` @@ -2699,7 +3020,7 @@ type ListTasksRequest struct { func (x *ListTasksRequest) Reset() { *x = ListTasksRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[45] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2711,7 +3032,7 @@ func (x *ListTasksRequest) String() string { func (*ListTasksRequest) ProtoMessage() {} func (x *ListTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[45] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2724,7 +3045,7 @@ func (x *ListTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTasksRequest.ProtoReflect.Descriptor instead. func (*ListTasksRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{45} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{46} } func (x *ListTasksRequest) GetFilter() *TaskFilter { @@ -2751,7 +3072,7 @@ type ListTasksResponse struct { func (x *ListTasksResponse) Reset() { *x = ListTasksResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[46] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2763,7 +3084,7 @@ func (x *ListTasksResponse) String() string { func (*ListTasksResponse) ProtoMessage() {} func (x *ListTasksResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[46] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2776,7 +3097,7 @@ func (x *ListTasksResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTasksResponse.ProtoReflect.Descriptor instead. func (*ListTasksResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{46} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{47} } func (x *ListTasksResponse) GetTasks() []*Task { @@ -2802,7 +3123,7 @@ type GetTaskRequest struct { func (x *GetTaskRequest) Reset() { *x = GetTaskRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[47] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2814,7 +3135,7 @@ func (x *GetTaskRequest) String() string { func (*GetTaskRequest) ProtoMessage() {} func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[47] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2827,7 +3148,7 @@ func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{47} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{48} } func (x *GetTaskRequest) GetId() string { @@ -2846,7 +3167,7 @@ type GetTaskResponse struct { func (x *GetTaskResponse) Reset() { *x = GetTaskResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[48] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2858,7 +3179,7 @@ func (x *GetTaskResponse) String() string { func (*GetTaskResponse) ProtoMessage() {} func (x *GetTaskResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[48] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2871,7 +3192,7 @@ func (x *GetTaskResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskResponse.ProtoReflect.Descriptor instead. func (*GetTaskResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{48} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{49} } func (x *GetTaskResponse) GetTask() *Task { @@ -2898,7 +3219,7 @@ type Workspace struct { func (x *Workspace) Reset() { *x = Workspace{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[49] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2910,7 +3231,7 @@ func (x *Workspace) String() string { func (*Workspace) ProtoMessage() {} func (x *Workspace) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[49] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2923,7 +3244,7 @@ func (x *Workspace) ProtoReflect() protoreflect.Message { // Deprecated: Use Workspace.ProtoReflect.Descriptor instead. func (*Workspace) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{49} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{50} } func (x *Workspace) GetId() string { @@ -2991,7 +3312,7 @@ type ListWorkspacesRequest struct { func (x *ListWorkspacesRequest) Reset() { *x = ListWorkspacesRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[50] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3003,7 +3324,7 @@ func (x *ListWorkspacesRequest) String() string { func (*ListWorkspacesRequest) ProtoMessage() {} func (x *ListWorkspacesRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[50] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3016,7 +3337,7 @@ func (x *ListWorkspacesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkspacesRequest.ProtoReflect.Descriptor instead. func (*ListWorkspacesRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{50} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{51} } func (x *ListWorkspacesRequest) GetPage() *Page { @@ -3036,7 +3357,7 @@ type ListWorkspacesResponse struct { func (x *ListWorkspacesResponse) Reset() { *x = ListWorkspacesResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[51] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3048,7 +3369,7 @@ func (x *ListWorkspacesResponse) String() string { func (*ListWorkspacesResponse) ProtoMessage() {} func (x *ListWorkspacesResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[51] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3061,7 +3382,7 @@ func (x *ListWorkspacesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkspacesResponse.ProtoReflect.Descriptor instead. func (*ListWorkspacesResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{51} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{52} } func (x *ListWorkspacesResponse) GetWorkspaces() []*Workspace { @@ -3093,7 +3414,7 @@ type Workflow struct { func (x *Workflow) Reset() { *x = Workflow{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[52] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3105,7 +3426,7 @@ func (x *Workflow) String() string { func (*Workflow) ProtoMessage() {} func (x *Workflow) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[52] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3118,7 +3439,7 @@ func (x *Workflow) ProtoReflect() protoreflect.Message { // Deprecated: Use Workflow.ProtoReflect.Descriptor instead. func (*Workflow) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{52} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{53} } func (x *Workflow) GetId() string { @@ -3180,7 +3501,7 @@ type ListWorkflowsRequest struct { func (x *ListWorkflowsRequest) Reset() { *x = ListWorkflowsRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[53] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3192,7 +3513,7 @@ func (x *ListWorkflowsRequest) String() string { func (*ListWorkflowsRequest) ProtoMessage() {} func (x *ListWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[53] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3205,7 +3526,7 @@ func (x *ListWorkflowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsRequest.ProtoReflect.Descriptor instead. func (*ListWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{53} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{54} } func (x *ListWorkflowsRequest) GetWorkspaceId() string { @@ -3232,7 +3553,7 @@ type ListWorkflowsResponse struct { func (x *ListWorkflowsResponse) Reset() { *x = ListWorkflowsResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[54] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3244,7 +3565,7 @@ func (x *ListWorkflowsResponse) String() string { func (*ListWorkflowsResponse) ProtoMessage() {} func (x *ListWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[54] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3257,7 +3578,7 @@ func (x *ListWorkflowsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsResponse.ProtoReflect.Descriptor instead. func (*ListWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{54} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{55} } func (x *ListWorkflowsResponse) GetWorkflows() []*Workflow { @@ -3275,19 +3596,27 @@ func (x *ListWorkflowsResponse) GetPageInfo() *PageInfo { } type WorkflowStep struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - WorkflowId string `protobuf:"bytes,2,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Position int32 `protobuf:"varint,4,opt,name=position,proto3" json:"position,omitempty"` - StageType string `protobuf:"bytes,5,opt,name=stage_type,json=stageType,proto3" json:"stage_type,omitempty"` // work | review | approval | custom - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + WorkflowId string `protobuf:"bytes,2,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Position int32 `protobuf:"varint,4,opt,name=position,proto3" json:"position,omitempty"` + StageType string `protobuf:"bytes,5,opt,name=stage_type,json=stageType,proto3" json:"stage_type,omitempty"` // work | review | approval | custom + // Presentation and capacity, so a plugin rendering a board reads the same + // step colour the operator already sees rather than inventing its own, and + // can report a step against its own WIP limit. + Color string `protobuf:"bytes,6,opt,name=color,proto3" json:"color,omitempty"` + IsStartStep bool `protobuf:"varint,7,opt,name=is_start_step,json=isStartStep,proto3" json:"is_start_step,omitempty"` + WipLimit int32 `protobuf:"varint,8,opt,name=wip_limit,json=wipLimit,proto3" json:"wip_limit,omitempty"` // 0 means unlimited + // The agent profile this step runs work under, empty when it inherits. + AgentProfileId string `protobuf:"bytes,9,opt,name=agent_profile_id,json=agentProfileId,proto3" json:"agent_profile_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WorkflowStep) Reset() { *x = WorkflowStep{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[55] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3299,7 +3628,7 @@ func (x *WorkflowStep) String() string { func (*WorkflowStep) ProtoMessage() {} func (x *WorkflowStep) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[55] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3312,7 +3641,7 @@ func (x *WorkflowStep) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowStep.ProtoReflect.Descriptor instead. func (*WorkflowStep) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{55} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{56} } func (x *WorkflowStep) GetId() string { @@ -3350,6 +3679,34 @@ func (x *WorkflowStep) GetStageType() string { return "" } +func (x *WorkflowStep) GetColor() string { + if x != nil { + return x.Color + } + return "" +} + +func (x *WorkflowStep) GetIsStartStep() bool { + if x != nil { + return x.IsStartStep + } + return false +} + +func (x *WorkflowStep) GetWipLimit() int32 { + if x != nil { + return x.WipLimit + } + return 0 +} + +func (x *WorkflowStep) GetAgentProfileId() string { + if x != nil { + return x.AgentProfileId + } + return "" +} + type ListWorkflowStepsRequest struct { state protoimpl.MessageState `protogen:"open.v1"` WorkflowId string `protobuf:"bytes,1,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` @@ -3359,7 +3716,7 @@ type ListWorkflowStepsRequest struct { func (x *ListWorkflowStepsRequest) Reset() { *x = ListWorkflowStepsRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[56] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3371,7 +3728,7 @@ func (x *ListWorkflowStepsRequest) String() string { func (*ListWorkflowStepsRequest) ProtoMessage() {} func (x *ListWorkflowStepsRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[56] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3384,7 +3741,7 @@ func (x *ListWorkflowStepsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowStepsRequest.ProtoReflect.Descriptor instead. func (*ListWorkflowStepsRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{56} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{57} } func (x *ListWorkflowStepsRequest) GetWorkflowId() string { @@ -3403,7 +3760,7 @@ type ListWorkflowStepsResponse struct { func (x *ListWorkflowStepsResponse) Reset() { *x = ListWorkflowStepsResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[57] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3415,7 +3772,7 @@ func (x *ListWorkflowStepsResponse) String() string { func (*ListWorkflowStepsResponse) ProtoMessage() {} func (x *ListWorkflowStepsResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[57] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3428,7 +3785,7 @@ func (x *ListWorkflowStepsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowStepsResponse.ProtoReflect.Descriptor instead. func (*ListWorkflowStepsResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{57} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{58} } func (x *ListWorkflowStepsResponse) GetSteps() []*WorkflowStep { @@ -3453,7 +3810,7 @@ type AgentProfile struct { func (x *AgentProfile) Reset() { *x = AgentProfile{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[58] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3465,7 +3822,7 @@ func (x *AgentProfile) String() string { func (*AgentProfile) ProtoMessage() {} func (x *AgentProfile) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[58] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3478,7 +3835,7 @@ func (x *AgentProfile) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentProfile.ProtoReflect.Descriptor instead. func (*AgentProfile) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{58} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{59} } func (x *AgentProfile) GetId() string { @@ -3532,7 +3889,7 @@ type ListAgentProfilesRequest struct { func (x *ListAgentProfilesRequest) Reset() { *x = ListAgentProfilesRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[59] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3544,7 +3901,7 @@ func (x *ListAgentProfilesRequest) String() string { func (*ListAgentProfilesRequest) ProtoMessage() {} func (x *ListAgentProfilesRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[59] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3557,7 +3914,7 @@ func (x *ListAgentProfilesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAgentProfilesRequest.ProtoReflect.Descriptor instead. func (*ListAgentProfilesRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{59} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{60} } func (x *ListAgentProfilesRequest) GetPage() *Page { @@ -3577,7 +3934,7 @@ type ListAgentProfilesResponse struct { func (x *ListAgentProfilesResponse) Reset() { *x = ListAgentProfilesResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[60] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3589,7 +3946,7 @@ func (x *ListAgentProfilesResponse) String() string { func (*ListAgentProfilesResponse) ProtoMessage() {} func (x *ListAgentProfilesResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[60] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3602,7 +3959,7 @@ func (x *ListAgentProfilesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAgentProfilesResponse.ProtoReflect.Descriptor instead. func (*ListAgentProfilesResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{60} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{61} } func (x *ListAgentProfilesResponse) GetProfiles() []*AgentProfile { @@ -3630,7 +3987,7 @@ type ExecutorProfile struct { func (x *ExecutorProfile) Reset() { *x = ExecutorProfile{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[61] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3642,7 +3999,7 @@ func (x *ExecutorProfile) String() string { func (*ExecutorProfile) ProtoMessage() {} func (x *ExecutorProfile) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[61] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3655,7 +4012,7 @@ func (x *ExecutorProfile) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecutorProfile.ProtoReflect.Descriptor instead. func (*ExecutorProfile) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{61} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{62} } func (x *ExecutorProfile) GetId() string { @@ -3688,7 +4045,7 @@ type ListExecutorProfilesRequest struct { func (x *ListExecutorProfilesRequest) Reset() { *x = ListExecutorProfilesRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[62] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3700,7 +4057,7 @@ func (x *ListExecutorProfilesRequest) String() string { func (*ListExecutorProfilesRequest) ProtoMessage() {} func (x *ListExecutorProfilesRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[62] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3713,7 +4070,7 @@ func (x *ListExecutorProfilesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListExecutorProfilesRequest.ProtoReflect.Descriptor instead. func (*ListExecutorProfilesRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{62} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{63} } func (x *ListExecutorProfilesRequest) GetPage() *Page { @@ -3733,7 +4090,7 @@ type ListExecutorProfilesResponse struct { func (x *ListExecutorProfilesResponse) Reset() { *x = ListExecutorProfilesResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[63] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3745,7 +4102,7 @@ func (x *ListExecutorProfilesResponse) String() string { func (*ListExecutorProfilesResponse) ProtoMessage() {} func (x *ListExecutorProfilesResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[63] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3758,7 +4115,7 @@ func (x *ListExecutorProfilesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListExecutorProfilesResponse.ProtoReflect.Descriptor instead. func (*ListExecutorProfilesResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{63} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{64} } func (x *ListExecutorProfilesResponse) GetProfiles() []*ExecutorProfile { @@ -3800,7 +4157,7 @@ type Repository struct { func (x *Repository) Reset() { *x = Repository{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[64] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3812,7 +4169,7 @@ func (x *Repository) String() string { func (*Repository) ProtoMessage() {} func (x *Repository) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[64] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3825,7 +4182,7 @@ func (x *Repository) ProtoReflect() protoreflect.Message { // Deprecated: Use Repository.ProtoReflect.Descriptor instead. func (*Repository) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{64} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{65} } func (x *Repository) GetId() string { @@ -3922,7 +4279,7 @@ type ListRepositoriesRequest struct { func (x *ListRepositoriesRequest) Reset() { *x = ListRepositoriesRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[65] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3934,7 +4291,7 @@ func (x *ListRepositoriesRequest) String() string { func (*ListRepositoriesRequest) ProtoMessage() {} func (x *ListRepositoriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[65] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3947,7 +4304,7 @@ func (x *ListRepositoriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRepositoriesRequest.ProtoReflect.Descriptor instead. func (*ListRepositoriesRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{65} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{66} } func (x *ListRepositoriesRequest) GetWorkspaceId() string { @@ -3974,7 +4331,7 @@ type ListRepositoriesResponse struct { func (x *ListRepositoriesResponse) Reset() { *x = ListRepositoriesResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[66] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3986,7 +4343,7 @@ func (x *ListRepositoriesResponse) String() string { func (*ListRepositoriesResponse) ProtoMessage() {} func (x *ListRepositoriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[66] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3999,7 +4356,7 @@ func (x *ListRepositoriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRepositoriesResponse.ProtoReflect.Descriptor instead. func (*ListRepositoriesResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{66} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{67} } func (x *ListRepositoriesResponse) GetRepositories() []*Repository { @@ -4044,7 +4401,7 @@ type Session struct { func (x *Session) Reset() { *x = Session{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[67] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4056,7 +4413,7 @@ func (x *Session) String() string { func (*Session) ProtoMessage() {} func (x *Session) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[67] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4069,7 +4426,7 @@ func (x *Session) ProtoReflect() protoreflect.Message { // Deprecated: Use Session.ProtoReflect.Descriptor instead. func (*Session) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{67} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{68} } func (x *Session) GetId() string { @@ -4153,7 +4510,7 @@ type SessionFilter struct { func (x *SessionFilter) Reset() { *x = SessionFilter{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[68] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4165,7 +4522,7 @@ func (x *SessionFilter) String() string { func (*SessionFilter) ProtoMessage() {} func (x *SessionFilter) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[68] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4178,7 +4535,7 @@ func (x *SessionFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use SessionFilter.ProtoReflect.Descriptor instead. func (*SessionFilter) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{68} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{69} } func (x *SessionFilter) GetTaskIds() []string { @@ -4212,7 +4569,7 @@ type ListSessionsRequest struct { func (x *ListSessionsRequest) Reset() { *x = ListSessionsRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[69] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4224,7 +4581,7 @@ func (x *ListSessionsRequest) String() string { func (*ListSessionsRequest) ProtoMessage() {} func (x *ListSessionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[69] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4237,7 +4594,7 @@ func (x *ListSessionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSessionsRequest.ProtoReflect.Descriptor instead. func (*ListSessionsRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{69} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{70} } func (x *ListSessionsRequest) GetFilter() *SessionFilter { @@ -4264,7 +4621,7 @@ type ListSessionsResponse struct { func (x *ListSessionsResponse) Reset() { *x = ListSessionsResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[70] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4276,7 +4633,7 @@ func (x *ListSessionsResponse) String() string { func (*ListSessionsResponse) ProtoMessage() {} func (x *ListSessionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[70] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4289,7 +4646,7 @@ func (x *ListSessionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSessionsResponse.ProtoReflect.Descriptor instead. func (*ListSessionsResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{70} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{71} } func (x *ListSessionsResponse) GetSessions() []*Session { @@ -4333,7 +4690,7 @@ type SessionCodeStats struct { func (x *SessionCodeStats) Reset() { *x = SessionCodeStats{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[71] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4345,7 +4702,7 @@ func (x *SessionCodeStats) String() string { func (*SessionCodeStats) ProtoMessage() {} func (x *SessionCodeStats) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[71] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4358,7 +4715,7 @@ func (x *SessionCodeStats) ProtoReflect() protoreflect.Message { // Deprecated: Use SessionCodeStats.ProtoReflect.Descriptor instead. func (*SessionCodeStats) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{71} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{72} } func (x *SessionCodeStats) GetSessionId() string { @@ -4413,7 +4770,7 @@ type ListSessionCodeStatsRequest struct { func (x *ListSessionCodeStatsRequest) Reset() { *x = ListSessionCodeStatsRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[72] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4425,7 +4782,7 @@ func (x *ListSessionCodeStatsRequest) String() string { func (*ListSessionCodeStatsRequest) ProtoMessage() {} func (x *ListSessionCodeStatsRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[72] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4438,7 +4795,7 @@ func (x *ListSessionCodeStatsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSessionCodeStatsRequest.ProtoReflect.Descriptor instead. func (*ListSessionCodeStatsRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{72} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{73} } func (x *ListSessionCodeStatsRequest) GetFilter() *SessionFilter { @@ -4465,7 +4822,7 @@ type ListSessionCodeStatsResponse struct { func (x *ListSessionCodeStatsResponse) Reset() { *x = ListSessionCodeStatsResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[73] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4477,7 +4834,7 @@ func (x *ListSessionCodeStatsResponse) String() string { func (*ListSessionCodeStatsResponse) ProtoMessage() {} func (x *ListSessionCodeStatsResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[73] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4490,7 +4847,7 @@ func (x *ListSessionCodeStatsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSessionCodeStatsResponse.ProtoReflect.Descriptor instead. func (*ListSessionCodeStatsResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{73} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{74} } func (x *ListSessionCodeStatsResponse) GetStats() []*SessionCodeStats { @@ -4529,7 +4886,7 @@ type Message struct { func (x *Message) Reset() { *x = Message{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[74] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4541,7 +4898,7 @@ func (x *Message) String() string { func (*Message) ProtoMessage() {} func (x *Message) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[74] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4554,7 +4911,7 @@ func (x *Message) ProtoReflect() protoreflect.Message { // Deprecated: Use Message.ProtoReflect.Descriptor instead. func (*Message) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{74} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{75} } func (x *Message) GetId() string { @@ -4626,7 +4983,7 @@ type MessageFilter struct { func (x *MessageFilter) Reset() { *x = MessageFilter{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[75] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4638,7 +4995,7 @@ func (x *MessageFilter) String() string { func (*MessageFilter) ProtoMessage() {} func (x *MessageFilter) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[75] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4651,7 +5008,7 @@ func (x *MessageFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use MessageFilter.ProtoReflect.Descriptor instead. func (*MessageFilter) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{75} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{76} } func (x *MessageFilter) GetSessionIds() []string { @@ -4699,7 +5056,7 @@ type ListMessagesRequest struct { func (x *ListMessagesRequest) Reset() { *x = ListMessagesRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[76] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4711,7 +5068,7 @@ func (x *ListMessagesRequest) String() string { func (*ListMessagesRequest) ProtoMessage() {} func (x *ListMessagesRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[76] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4724,7 +5081,7 @@ func (x *ListMessagesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMessagesRequest.ProtoReflect.Descriptor instead. func (*ListMessagesRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{76} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{77} } func (x *ListMessagesRequest) GetFilter() *MessageFilter { @@ -4751,7 +5108,7 @@ type ListMessagesResponse struct { func (x *ListMessagesResponse) Reset() { *x = ListMessagesResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[77] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4763,7 +5120,7 @@ func (x *ListMessagesResponse) String() string { func (*ListMessagesResponse) ProtoMessage() {} func (x *ListMessagesResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[77] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4776,7 +5133,7 @@ func (x *ListMessagesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMessagesResponse.ProtoReflect.Descriptor instead. func (*ListMessagesResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{77} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{78} } func (x *ListMessagesResponse) GetMessages() []*Message { @@ -4817,7 +5174,7 @@ type InteractionOption struct { func (x *InteractionOption) Reset() { *x = InteractionOption{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[78] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4829,7 +5186,7 @@ func (x *InteractionOption) String() string { func (*InteractionOption) ProtoMessage() {} func (x *InteractionOption) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[78] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4842,7 +5199,7 @@ func (x *InteractionOption) ProtoReflect() protoreflect.Message { // Deprecated: Use InteractionOption.ProtoReflect.Descriptor instead. func (*InteractionOption) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{78} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{79} } func (x *InteractionOption) GetOptionId() string { @@ -4885,7 +5242,7 @@ type InteractionQuestion struct { func (x *InteractionQuestion) Reset() { *x = InteractionQuestion{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[79] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4897,7 +5254,7 @@ func (x *InteractionQuestion) String() string { func (*InteractionQuestion) ProtoMessage() {} func (x *InteractionQuestion) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[79] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4910,7 +5267,7 @@ func (x *InteractionQuestion) ProtoReflect() protoreflect.Message { // Deprecated: Use InteractionQuestion.ProtoReflect.Descriptor instead. func (*InteractionQuestion) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{79} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{80} } func (x *InteractionQuestion) GetId() string { @@ -4970,7 +5327,7 @@ type Interaction struct { func (x *Interaction) Reset() { *x = Interaction{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[80] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4982,7 +5339,7 @@ func (x *Interaction) String() string { func (*Interaction) ProtoMessage() {} func (x *Interaction) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[80] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4995,7 +5352,7 @@ func (x *Interaction) ProtoReflect() protoreflect.Message { // Deprecated: Use Interaction.ProtoReflect.Descriptor instead. func (*Interaction) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{80} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{81} } func (x *Interaction) GetId() string { @@ -5114,7 +5471,7 @@ type InteractionFilter struct { func (x *InteractionFilter) Reset() { *x = InteractionFilter{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[81] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5126,7 +5483,7 @@ func (x *InteractionFilter) String() string { func (*InteractionFilter) ProtoMessage() {} func (x *InteractionFilter) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[81] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5139,7 +5496,7 @@ func (x *InteractionFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use InteractionFilter.ProtoReflect.Descriptor instead. func (*InteractionFilter) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{81} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{82} } func (x *InteractionFilter) GetSessionIds() []string { @@ -5173,7 +5530,7 @@ type ListPendingInteractionsRequest struct { func (x *ListPendingInteractionsRequest) Reset() { *x = ListPendingInteractionsRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[82] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5185,7 +5542,7 @@ func (x *ListPendingInteractionsRequest) String() string { func (*ListPendingInteractionsRequest) ProtoMessage() {} func (x *ListPendingInteractionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[82] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5198,7 +5555,7 @@ func (x *ListPendingInteractionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPendingInteractionsRequest.ProtoReflect.Descriptor instead. func (*ListPendingInteractionsRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{82} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{83} } func (x *ListPendingInteractionsRequest) GetFilter() *InteractionFilter { @@ -5225,7 +5582,7 @@ type ListPendingInteractionsResponse struct { func (x *ListPendingInteractionsResponse) Reset() { *x = ListPendingInteractionsResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[83] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5237,7 +5594,7 @@ func (x *ListPendingInteractionsResponse) String() string { func (*ListPendingInteractionsResponse) ProtoMessage() {} func (x *ListPendingInteractionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[83] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5250,7 +5607,7 @@ func (x *ListPendingInteractionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPendingInteractionsResponse.ProtoReflect.Descriptor instead. func (*ListPendingInteractionsResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{83} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{84} } func (x *ListPendingInteractionsResponse) GetInteractions() []*Interaction { @@ -5276,7 +5633,7 @@ type GetInteractionRequest struct { func (x *GetInteractionRequest) Reset() { *x = GetInteractionRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[84] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5288,7 +5645,7 @@ func (x *GetInteractionRequest) String() string { func (*GetInteractionRequest) ProtoMessage() {} func (x *GetInteractionRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[84] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5301,7 +5658,7 @@ func (x *GetInteractionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetInteractionRequest.ProtoReflect.Descriptor instead. func (*GetInteractionRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{84} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{85} } func (x *GetInteractionRequest) GetId() string { @@ -5320,7 +5677,7 @@ type GetInteractionResponse struct { func (x *GetInteractionResponse) Reset() { *x = GetInteractionResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[85] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5332,7 +5689,7 @@ func (x *GetInteractionResponse) String() string { func (*GetInteractionResponse) ProtoMessage() {} func (x *GetInteractionResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[85] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[86] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5345,7 +5702,7 @@ func (x *GetInteractionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetInteractionResponse.ProtoReflect.Descriptor instead. func (*GetInteractionResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{85} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{86} } func (x *GetInteractionResponse) GetInteraction() *Interaction { @@ -5372,7 +5729,7 @@ type RespondToPermissionRequest struct { func (x *RespondToPermissionRequest) Reset() { *x = RespondToPermissionRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[86] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5384,7 +5741,7 @@ func (x *RespondToPermissionRequest) String() string { func (*RespondToPermissionRequest) ProtoMessage() {} func (x *RespondToPermissionRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[86] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[87] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5397,7 +5754,7 @@ func (x *RespondToPermissionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RespondToPermissionRequest.ProtoReflect.Descriptor instead. func (*RespondToPermissionRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{86} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{87} } func (x *RespondToPermissionRequest) GetId() string { @@ -5430,7 +5787,7 @@ type RespondToPermissionResponse struct { func (x *RespondToPermissionResponse) Reset() { *x = RespondToPermissionResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[87] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5442,7 +5799,7 @@ func (x *RespondToPermissionResponse) String() string { func (*RespondToPermissionResponse) ProtoMessage() {} func (x *RespondToPermissionResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[87] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[88] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5455,7 +5812,7 @@ func (x *RespondToPermissionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RespondToPermissionResponse.ProtoReflect.Descriptor instead. func (*RespondToPermissionResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{87} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{88} } func (x *RespondToPermissionResponse) GetInteraction() *Interaction { @@ -5476,7 +5833,7 @@ type ClarificationAnswer struct { func (x *ClarificationAnswer) Reset() { *x = ClarificationAnswer{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[88] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5488,7 +5845,7 @@ func (x *ClarificationAnswer) String() string { func (*ClarificationAnswer) ProtoMessage() {} func (x *ClarificationAnswer) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[88] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[89] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5501,7 +5858,7 @@ func (x *ClarificationAnswer) ProtoReflect() protoreflect.Message { // Deprecated: Use ClarificationAnswer.ProtoReflect.Descriptor instead. func (*ClarificationAnswer) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{88} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{89} } func (x *ClarificationAnswer) GetQuestionId() string { @@ -5537,7 +5894,7 @@ type AnswerClarificationRequest struct { func (x *AnswerClarificationRequest) Reset() { *x = AnswerClarificationRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[89] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5549,7 +5906,7 @@ func (x *AnswerClarificationRequest) String() string { func (*AnswerClarificationRequest) ProtoMessage() {} func (x *AnswerClarificationRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[89] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[90] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5562,7 +5919,7 @@ func (x *AnswerClarificationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AnswerClarificationRequest.ProtoReflect.Descriptor instead. func (*AnswerClarificationRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{89} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{90} } func (x *AnswerClarificationRequest) GetId() string { @@ -5588,7 +5945,7 @@ type AnswerClarificationResponse struct { func (x *AnswerClarificationResponse) Reset() { *x = AnswerClarificationResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[90] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5600,7 +5957,7 @@ func (x *AnswerClarificationResponse) String() string { func (*AnswerClarificationResponse) ProtoMessage() {} func (x *AnswerClarificationResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[90] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[91] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5613,7 +5970,7 @@ func (x *AnswerClarificationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AnswerClarificationResponse.ProtoReflect.Descriptor instead. func (*AnswerClarificationResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{90} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{91} } func (x *AnswerClarificationResponse) GetInteraction() *Interaction { @@ -5633,7 +5990,7 @@ type CancelClarificationRequest struct { func (x *CancelClarificationRequest) Reset() { *x = CancelClarificationRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[91] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5645,7 +6002,7 @@ func (x *CancelClarificationRequest) String() string { func (*CancelClarificationRequest) ProtoMessage() {} func (x *CancelClarificationRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[91] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[92] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5658,7 +6015,7 @@ func (x *CancelClarificationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CancelClarificationRequest.ProtoReflect.Descriptor instead. func (*CancelClarificationRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{91} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{92} } func (x *CancelClarificationRequest) GetId() string { @@ -5684,7 +6041,7 @@ type CancelClarificationResponse struct { func (x *CancelClarificationResponse) Reset() { *x = CancelClarificationResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[92] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5696,7 +6053,7 @@ func (x *CancelClarificationResponse) String() string { func (*CancelClarificationResponse) ProtoMessage() {} func (x *CancelClarificationResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[92] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[93] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5709,7 +6066,7 @@ func (x *CancelClarificationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CancelClarificationResponse.ProtoReflect.Descriptor instead. func (*CancelClarificationResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{92} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{93} } func (x *CancelClarificationResponse) GetInteraction() *Interaction { @@ -5732,7 +6089,7 @@ type InvokeUtilityAgentRequest struct { func (x *InvokeUtilityAgentRequest) Reset() { *x = InvokeUtilityAgentRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[93] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5744,7 +6101,7 @@ func (x *InvokeUtilityAgentRequest) String() string { func (*InvokeUtilityAgentRequest) ProtoMessage() {} func (x *InvokeUtilityAgentRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[93] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[94] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5757,7 +6114,7 @@ func (x *InvokeUtilityAgentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InvokeUtilityAgentRequest.ProtoReflect.Descriptor instead. func (*InvokeUtilityAgentRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{93} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{94} } func (x *InvokeUtilityAgentRequest) GetPrompt() string { @@ -5776,7 +6133,7 @@ type InvokeUtilityAgentResponse struct { func (x *InvokeUtilityAgentResponse) Reset() { *x = InvokeUtilityAgentResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[94] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5788,7 +6145,7 @@ func (x *InvokeUtilityAgentResponse) String() string { func (*InvokeUtilityAgentResponse) ProtoMessage() {} func (x *InvokeUtilityAgentResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[94] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[95] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5801,7 +6158,7 @@ func (x *InvokeUtilityAgentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InvokeUtilityAgentResponse.ProtoReflect.Descriptor instead. func (*InvokeUtilityAgentResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{94} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{95} } func (x *InvokeUtilityAgentResponse) GetText() string { @@ -5831,7 +6188,7 @@ type CreateTaskRequest struct { func (x *CreateTaskRequest) Reset() { *x = CreateTaskRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[95] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5843,7 +6200,7 @@ func (x *CreateTaskRequest) String() string { func (*CreateTaskRequest) ProtoMessage() {} func (x *CreateTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[95] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[96] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5856,7 +6213,7 @@ func (x *CreateTaskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTaskRequest.ProtoReflect.Descriptor instead. func (*CreateTaskRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{95} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{96} } func (x *CreateTaskRequest) GetWorkspaceId() string { @@ -5942,7 +6299,7 @@ type PluginTaskRepository struct { func (x *PluginTaskRepository) Reset() { *x = PluginTaskRepository{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[96] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5954,7 +6311,7 @@ func (x *PluginTaskRepository) String() string { func (*PluginTaskRepository) ProtoMessage() {} func (x *PluginTaskRepository) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[96] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[97] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5967,7 +6324,7 @@ func (x *PluginTaskRepository) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginTaskRepository.ProtoReflect.Descriptor instead. func (*PluginTaskRepository) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{96} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{97} } func (x *PluginTaskRepository) GetRepositoryId() string { @@ -6026,7 +6383,7 @@ type RemoteRepositoryDescriptor struct { func (x *RemoteRepositoryDescriptor) Reset() { *x = RemoteRepositoryDescriptor{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[97] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6038,7 +6395,7 @@ func (x *RemoteRepositoryDescriptor) String() string { func (*RemoteRepositoryDescriptor) ProtoMessage() {} func (x *RemoteRepositoryDescriptor) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[97] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[98] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6051,7 +6408,7 @@ func (x *RemoteRepositoryDescriptor) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoteRepositoryDescriptor.ProtoReflect.Descriptor instead. func (*RemoteRepositoryDescriptor) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{97} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{98} } func (x *RemoteRepositoryDescriptor) GetProviderId() string { @@ -6143,7 +6500,7 @@ type PluginTaskLaunchOptions struct { func (x *PluginTaskLaunchOptions) Reset() { *x = PluginTaskLaunchOptions{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[98] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6155,7 +6512,7 @@ func (x *PluginTaskLaunchOptions) String() string { func (*PluginTaskLaunchOptions) ProtoMessage() {} func (x *PluginTaskLaunchOptions) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[98] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[99] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6168,7 +6525,7 @@ func (x *PluginTaskLaunchOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginTaskLaunchOptions.ProtoReflect.Descriptor instead. func (*PluginTaskLaunchOptions) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{98} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{99} } func (x *PluginTaskLaunchOptions) GetAgentProfileId() string { @@ -6208,7 +6565,7 @@ type CreateTaskResponse struct { func (x *CreateTaskResponse) Reset() { *x = CreateTaskResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[99] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6220,7 +6577,7 @@ func (x *CreateTaskResponse) String() string { func (*CreateTaskResponse) ProtoMessage() {} func (x *CreateTaskResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[99] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[100] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6233,7 +6590,7 @@ func (x *CreateTaskResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTaskResponse.ProtoReflect.Descriptor instead. func (*CreateTaskResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{99} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{100} } func (x *CreateTaskResponse) GetTask() *Task { @@ -6256,7 +6613,7 @@ type UpdateTaskRequest struct { func (x *UpdateTaskRequest) Reset() { *x = UpdateTaskRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[100] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6268,7 +6625,7 @@ func (x *UpdateTaskRequest) String() string { func (*UpdateTaskRequest) ProtoMessage() {} func (x *UpdateTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[100] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[101] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6281,7 +6638,7 @@ func (x *UpdateTaskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateTaskRequest.ProtoReflect.Descriptor instead. func (*UpdateTaskRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{100} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{101} } func (x *UpdateTaskRequest) GetId() string { @@ -6328,7 +6685,7 @@ type UpdateTaskResponse struct { func (x *UpdateTaskResponse) Reset() { *x = UpdateTaskResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[101] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6340,7 +6697,7 @@ func (x *UpdateTaskResponse) String() string { func (*UpdateTaskResponse) ProtoMessage() {} func (x *UpdateTaskResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[101] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[102] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6353,7 +6710,7 @@ func (x *UpdateTaskResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateTaskResponse.ProtoReflect.Descriptor instead. func (*UpdateTaskResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{101} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{102} } func (x *UpdateTaskResponse) GetTask() *Task { @@ -6380,7 +6737,7 @@ type SendMessageRequest struct { func (x *SendMessageRequest) Reset() { *x = SendMessageRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[102] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6392,7 +6749,7 @@ func (x *SendMessageRequest) String() string { func (*SendMessageRequest) ProtoMessage() {} func (x *SendMessageRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[102] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[103] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6405,7 +6762,7 @@ func (x *SendMessageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendMessageRequest.ProtoReflect.Descriptor instead. func (*SendMessageRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{102} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{103} } func (x *SendMessageRequest) GetTaskId() string { @@ -6439,7 +6796,7 @@ type SendMessageResponse struct { func (x *SendMessageResponse) Reset() { *x = SendMessageResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[103] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6451,7 +6808,7 @@ func (x *SendMessageResponse) String() string { func (*SendMessageResponse) ProtoMessage() {} func (x *SendMessageResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[103] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[104] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6464,7 +6821,7 @@ func (x *SendMessageResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SendMessageResponse.ProtoReflect.Descriptor instead. func (*SendMessageResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{103} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{104} } func (x *SendMessageResponse) GetSessionId() string { @@ -6490,7 +6847,7 @@ type PreviewPluginOwnedTaskTreeRequest struct { func (x *PreviewPluginOwnedTaskTreeRequest) Reset() { *x = PreviewPluginOwnedTaskTreeRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[104] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6502,7 +6859,7 @@ func (x *PreviewPluginOwnedTaskTreeRequest) String() string { func (*PreviewPluginOwnedTaskTreeRequest) ProtoMessage() {} func (x *PreviewPluginOwnedTaskTreeRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[104] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6515,7 +6872,7 @@ func (x *PreviewPluginOwnedTaskTreeRequest) ProtoReflect() protoreflect.Message // Deprecated: Use PreviewPluginOwnedTaskTreeRequest.ProtoReflect.Descriptor instead. func (*PreviewPluginOwnedTaskTreeRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{104} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{105} } func (x *PreviewPluginOwnedTaskTreeRequest) GetRootTaskId() string { @@ -6534,7 +6891,7 @@ type PreviewPluginOwnedTaskTreeResponse struct { func (x *PreviewPluginOwnedTaskTreeResponse) Reset() { *x = PreviewPluginOwnedTaskTreeResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[105] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6546,7 +6903,7 @@ func (x *PreviewPluginOwnedTaskTreeResponse) String() string { func (*PreviewPluginOwnedTaskTreeResponse) ProtoMessage() {} func (x *PreviewPluginOwnedTaskTreeResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[105] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[106] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6559,7 +6916,7 @@ func (x *PreviewPluginOwnedTaskTreeResponse) ProtoReflect() protoreflect.Message // Deprecated: Use PreviewPluginOwnedTaskTreeResponse.ProtoReflect.Descriptor instead. func (*PreviewPluginOwnedTaskTreeResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{105} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{106} } func (x *PreviewPluginOwnedTaskTreeResponse) GetTasks() []*Task { @@ -6578,7 +6935,7 @@ type DeletePluginOwnedTaskTreeRequest struct { func (x *DeletePluginOwnedTaskTreeRequest) Reset() { *x = DeletePluginOwnedTaskTreeRequest{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[106] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6590,7 +6947,7 @@ func (x *DeletePluginOwnedTaskTreeRequest) String() string { func (*DeletePluginOwnedTaskTreeRequest) ProtoMessage() {} func (x *DeletePluginOwnedTaskTreeRequest) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[106] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6603,7 +6960,7 @@ func (x *DeletePluginOwnedTaskTreeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeletePluginOwnedTaskTreeRequest.ProtoReflect.Descriptor instead. func (*DeletePluginOwnedTaskTreeRequest) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{106} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{107} } func (x *DeletePluginOwnedTaskTreeRequest) GetRootTaskId() string { @@ -6622,7 +6979,7 @@ type DeletePluginOwnedTaskTreeResponse struct { func (x *DeletePluginOwnedTaskTreeResponse) Reset() { *x = DeletePluginOwnedTaskTreeResponse{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[107] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6634,7 +6991,7 @@ func (x *DeletePluginOwnedTaskTreeResponse) String() string { func (*DeletePluginOwnedTaskTreeResponse) ProtoMessage() {} func (x *DeletePluginOwnedTaskTreeResponse) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[107] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[108] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6647,7 +7004,7 @@ func (x *DeletePluginOwnedTaskTreeResponse) ProtoReflect() protoreflect.Message // Deprecated: Use DeletePluginOwnedTaskTreeResponse.ProtoReflect.Descriptor instead. func (*DeletePluginOwnedTaskTreeResponse) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{107} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{108} } func (x *DeletePluginOwnedTaskTreeResponse) GetDeletedTaskIds() []string { @@ -6669,7 +7026,7 @@ type DeletePluginOwnedTaskTreeProgress struct { func (x *DeletePluginOwnedTaskTreeProgress) Reset() { *x = DeletePluginOwnedTaskTreeProgress{} - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[108] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6681,7 +7038,7 @@ func (x *DeletePluginOwnedTaskTreeProgress) String() string { func (*DeletePluginOwnedTaskTreeProgress) ProtoMessage() {} func (x *DeletePluginOwnedTaskTreeProgress) ProtoReflect() protoreflect.Message { - mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[108] + mi := &file_kandev_plugin_v1_plugin_proto_msgTypes[109] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6694,7 +7051,7 @@ func (x *DeletePluginOwnedTaskTreeProgress) ProtoReflect() protoreflect.Message // Deprecated: Use DeletePluginOwnedTaskTreeProgress.ProtoReflect.Descriptor instead. func (*DeletePluginOwnedTaskTreeProgress) Descriptor() ([]byte, []int) { - return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{108} + return file_kandev_plugin_v1_plugin_proto_rawDescGZIP(), []int{109} } func (x *DeletePluginOwnedTaskTreeProgress) GetDeletedTaskIds() []string { @@ -6883,7 +7240,7 @@ const file_kandev_plugin_v1_plugin_proto_rawDesc = "" + "\bPageInfo\x12\x1f\n" + "\vnext_cursor\x18\x01 \x01(\tR\n" + "nextCursor\x12\x19\n" + - "\bhas_more\x18\x02 \x01(\bR\ahasMore\"\xfb\x04\n" + + "\bhas_more\x18\x02 \x01(\bR\ahasMore\"\xf0\b\n" + "\x04Task\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12!\n" + "\fworkspace_id\x18\x02 \x01(\tR\vworkspaceId\x12\x1f\n" + @@ -6909,25 +7266,71 @@ const file_kandev_plugin_v1_plugin_proto_rawDesc = "" + "identifier\x12!\n" + "\fis_ephemeral\x18\x0f \x01(\bR\visEphemeral\x12D\n" + "\frepositories\x18\x10 \x03(\v2 .kandev.plugin.v1.TaskRepositoryR\frepositories\x123\n" + - "\bmetadata\x18\x11 \x01(\v2\x17.google.protobuf.StructR\bmetadataB\r\n" + + "\bmetadata\x18\x11 \x01(\v2\x17.google.protobuf.StructR\bmetadata\x12$\n" + + "\varchived_at\x18\x12 \x01(\tH\x03R\n" + + "archivedAt\x88\x01\x01\x12F\n" + + "\rpull_requests\x18\x13 \x03(\v2!.kandev.plugin.v1.TaskPullRequestR\fpullRequests\x12(\n" + + "\x10workflow_step_id\x18\x14 \x01(\tR\x0eworkflowStepId\x12\x1a\n" + + "\bposition\x18\x15 \x01(\x05R\bposition\x129\n" + + "\x19assignee_agent_profile_id\x18\x16 \x01(\tR\x16assigneeAgentProfileId\x12\x16\n" + + "\x06labels\x18\x17 \x03(\tR\x06labels\x12\x1c\n" + + "\tautopilot\x18\x18 \x01(\bR\tautopilot\x12!\n" + + "\fwip_admitted\x18\x19 \x01(\bR\vwipAdmitted\x12+\n" + + "\x12queued_for_step_id\x18\x1a \x01(\tR\x0fqueuedForStepId\x12 \n" + + "\tqueued_at\x18\x1b \x01(\tH\x04R\bqueuedAt\x88\x01\x01\x12\x1d\n" + + "\n" + + "project_id\x18\x1c \x01(\tR\tprojectId\x12\x1f\n" + + "\vexternal_id\x18\x1d \x01(\tR\n" + + "externalIdB\r\n" + "\v_started_atB\x0f\n" + "\r_completed_atB\f\n" + "\n" + - "_parent_id\"\xab\x01\n" + + "_parent_idB\x0e\n" + + "\f_archived_atB\f\n" + + "\n" + + "_queued_at\"\xab\x01\n" + "\x0eTaskRepository\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12#\n" + "\rrepository_id\x18\x02 \x01(\tR\frepositoryId\x12\x1f\n" + "\vbase_branch\x18\x03 \x01(\tR\n" + "baseBranch\x12\x1a\n" + "\bposition\x18\x04 \x01(\x05R\bposition\x12'\n" + - "\x0fcheckout_branch\x18\x05 \x01(\tR\x0echeckoutBranch\"\xc9\x01\n" + + "\x0fcheckout_branch\x18\x05 \x01(\tR\x0echeckoutBranch\"\x94\x05\n" + + "\x0fTaskPullRequest\x12\x16\n" + + "\x06number\x18\x01 \x01(\x03R\x06number\x12\x10\n" + + "\x03url\x18\x02 \x01(\tR\x03url\x12\x14\n" + + "\x05title\x18\x03 \x01(\tR\x05title\x12\x14\n" + + "\x05state\x18\x04 \x01(\tR\x05state\x12\x1f\n" + + "\vhead_branch\x18\x05 \x01(\tR\n" + + "headBranch\x12\x1f\n" + + "\vbase_branch\x18\x06 \x01(\tR\n" + + "baseBranch\x12\x19\n" + + "\bis_draft\x18\a \x01(\bR\aisDraft\x12\x1a\n" + + "\bprovider\x18\b \x01(\tR\bprovider\x12 \n" + + "\tmerged_at\x18\t \x01(\tH\x00R\bmergedAt\x88\x01\x01\x12!\n" + + "\freview_state\x18\n" + + " \x01(\tR\vreviewState\x12!\n" + + "\fchecks_state\x18\v \x01(\tR\vchecksState\x12'\n" + + "\x0fmergeable_state\x18\f \x01(\tR\x0emergeableState\x12:\n" + + "\x19unresolved_review_threads\x18\r \x01(\x05R\x17unresolvedReviewThreads\x12!\n" + + "\fchecks_total\x18\x0e \x01(\x05R\vchecksTotal\x12%\n" + + "\x0echecks_passing\x18\x0f \x01(\x05R\rchecksPassing\x12\x1c\n" + + "\tadditions\x18\x10 \x01(\x05R\tadditions\x12\x1c\n" + + "\tdeletions\x18\x11 \x01(\x05R\tdeletions\x12!\n" + + "\fauthor_login\x18\x12 \x01(\tR\vauthorLogin\x12 \n" + + "\tclosed_at\x18\x13 \x01(\tH\x01R\bclosedAt\x88\x01\x01B\f\n" + + "\n" + + "_merged_atB\f\n" + + "\n" + + "_closed_at\"\xf4\x01\n" + "\n" + "TaskFilter\x12#\n" + "\rworkspace_ids\x18\x01 \x03(\tR\fworkspaceIds\x12!\n" + "\fworkflow_ids\x18\x02 \x03(\tR\vworkflowIds\x12\x16\n" + "\x06states\x18\x03 \x03(\tR\x06states\x12 \n" + "\tparent_id\x18\x04 \x01(\tH\x00R\bparentId\x88\x01\x01\x12+\n" + - "\x11include_ephemeral\x18\x05 \x01(\bR\x10includeEphemeralB\f\n" + + "\x11include_ephemeral\x18\x05 \x01(\bR\x10includeEphemeral\x12)\n" + + "\x10include_archived\x18\x06 \x01(\bR\x0fincludeArchivedB\f\n" + "\n" + "_parent_id\"t\n" + "\x10ListTasksRequest\x124\n" + @@ -6978,7 +7381,7 @@ const file_kandev_plugin_v1_plugin_proto_rawDesc = "" + "\x04page\x18\x02 \x01(\v2\x16.kandev.plugin.v1.PageR\x04page\"\x8a\x01\n" + "\x15ListWorkflowsResponse\x128\n" + "\tworkflows\x18\x01 \x03(\v2\x1a.kandev.plugin.v1.WorkflowR\tworkflows\x127\n" + - "\tpage_info\x18\x02 \x01(\v2\x1a.kandev.plugin.v1.PageInfoR\bpageInfo\"\x8e\x01\n" + + "\tpage_info\x18\x02 \x01(\v2\x1a.kandev.plugin.v1.PageInfoR\bpageInfo\"\x8f\x02\n" + "\fWorkflowStep\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1f\n" + "\vworkflow_id\x18\x02 \x01(\tR\n" + @@ -6986,7 +7389,11 @@ const file_kandev_plugin_v1_plugin_proto_rawDesc = "" + "\x04name\x18\x03 \x01(\tR\x04name\x12\x1a\n" + "\bposition\x18\x04 \x01(\x05R\bposition\x12\x1d\n" + "\n" + - "stage_type\x18\x05 \x01(\tR\tstageType\";\n" + + "stage_type\x18\x05 \x01(\tR\tstageType\x12\x14\n" + + "\x05color\x18\x06 \x01(\tR\x05color\x12\"\n" + + "\ris_start_step\x18\a \x01(\bR\visStartStep\x12\x1b\n" + + "\twip_limit\x18\b \x01(\x05R\bwipLimit\x12(\n" + + "\x10agent_profile_id\x18\t \x01(\tR\x0eagentProfileId\";\n" + "\x18ListWorkflowStepsRequest\x12\x1f\n" + "\vworkflow_id\x18\x01 \x01(\tR\n" + "workflowId\"Q\n" + @@ -7327,7 +7734,7 @@ func file_kandev_plugin_v1_plugin_proto_rawDescGZIP() []byte { return file_kandev_plugin_v1_plugin_proto_rawDescData } -var file_kandev_plugin_v1_plugin_proto_msgTypes = make([]protoimpl.MessageInfo, 112) +var file_kandev_plugin_v1_plugin_proto_msgTypes = make([]protoimpl.MessageInfo, 113) var file_kandev_plugin_v1_plugin_proto_goTypes = []any{ (*Event)(nil), // 0: kandev.plugin.v1.Event (*EventAck)(nil), // 1: kandev.plugin.v1.EventAck @@ -7373,233 +7780,235 @@ var file_kandev_plugin_v1_plugin_proto_goTypes = []any{ (*PageInfo)(nil), // 41: kandev.plugin.v1.PageInfo (*Task)(nil), // 42: kandev.plugin.v1.Task (*TaskRepository)(nil), // 43: kandev.plugin.v1.TaskRepository - (*TaskFilter)(nil), // 44: kandev.plugin.v1.TaskFilter - (*ListTasksRequest)(nil), // 45: kandev.plugin.v1.ListTasksRequest - (*ListTasksResponse)(nil), // 46: kandev.plugin.v1.ListTasksResponse - (*GetTaskRequest)(nil), // 47: kandev.plugin.v1.GetTaskRequest - (*GetTaskResponse)(nil), // 48: kandev.plugin.v1.GetTaskResponse - (*Workspace)(nil), // 49: kandev.plugin.v1.Workspace - (*ListWorkspacesRequest)(nil), // 50: kandev.plugin.v1.ListWorkspacesRequest - (*ListWorkspacesResponse)(nil), // 51: kandev.plugin.v1.ListWorkspacesResponse - (*Workflow)(nil), // 52: kandev.plugin.v1.Workflow - (*ListWorkflowsRequest)(nil), // 53: kandev.plugin.v1.ListWorkflowsRequest - (*ListWorkflowsResponse)(nil), // 54: kandev.plugin.v1.ListWorkflowsResponse - (*WorkflowStep)(nil), // 55: kandev.plugin.v1.WorkflowStep - (*ListWorkflowStepsRequest)(nil), // 56: kandev.plugin.v1.ListWorkflowStepsRequest - (*ListWorkflowStepsResponse)(nil), // 57: kandev.plugin.v1.ListWorkflowStepsResponse - (*AgentProfile)(nil), // 58: kandev.plugin.v1.AgentProfile - (*ListAgentProfilesRequest)(nil), // 59: kandev.plugin.v1.ListAgentProfilesRequest - (*ListAgentProfilesResponse)(nil), // 60: kandev.plugin.v1.ListAgentProfilesResponse - (*ExecutorProfile)(nil), // 61: kandev.plugin.v1.ExecutorProfile - (*ListExecutorProfilesRequest)(nil), // 62: kandev.plugin.v1.ListExecutorProfilesRequest - (*ListExecutorProfilesResponse)(nil), // 63: kandev.plugin.v1.ListExecutorProfilesResponse - (*Repository)(nil), // 64: kandev.plugin.v1.Repository - (*ListRepositoriesRequest)(nil), // 65: kandev.plugin.v1.ListRepositoriesRequest - (*ListRepositoriesResponse)(nil), // 66: kandev.plugin.v1.ListRepositoriesResponse - (*Session)(nil), // 67: kandev.plugin.v1.Session - (*SessionFilter)(nil), // 68: kandev.plugin.v1.SessionFilter - (*ListSessionsRequest)(nil), // 69: kandev.plugin.v1.ListSessionsRequest - (*ListSessionsResponse)(nil), // 70: kandev.plugin.v1.ListSessionsResponse - (*SessionCodeStats)(nil), // 71: kandev.plugin.v1.SessionCodeStats - (*ListSessionCodeStatsRequest)(nil), // 72: kandev.plugin.v1.ListSessionCodeStatsRequest - (*ListSessionCodeStatsResponse)(nil), // 73: kandev.plugin.v1.ListSessionCodeStatsResponse - (*Message)(nil), // 74: kandev.plugin.v1.Message - (*MessageFilter)(nil), // 75: kandev.plugin.v1.MessageFilter - (*ListMessagesRequest)(nil), // 76: kandev.plugin.v1.ListMessagesRequest - (*ListMessagesResponse)(nil), // 77: kandev.plugin.v1.ListMessagesResponse - (*InteractionOption)(nil), // 78: kandev.plugin.v1.InteractionOption - (*InteractionQuestion)(nil), // 79: kandev.plugin.v1.InteractionQuestion - (*Interaction)(nil), // 80: kandev.plugin.v1.Interaction - (*InteractionFilter)(nil), // 81: kandev.plugin.v1.InteractionFilter - (*ListPendingInteractionsRequest)(nil), // 82: kandev.plugin.v1.ListPendingInteractionsRequest - (*ListPendingInteractionsResponse)(nil), // 83: kandev.plugin.v1.ListPendingInteractionsResponse - (*GetInteractionRequest)(nil), // 84: kandev.plugin.v1.GetInteractionRequest - (*GetInteractionResponse)(nil), // 85: kandev.plugin.v1.GetInteractionResponse - (*RespondToPermissionRequest)(nil), // 86: kandev.plugin.v1.RespondToPermissionRequest - (*RespondToPermissionResponse)(nil), // 87: kandev.plugin.v1.RespondToPermissionResponse - (*ClarificationAnswer)(nil), // 88: kandev.plugin.v1.ClarificationAnswer - (*AnswerClarificationRequest)(nil), // 89: kandev.plugin.v1.AnswerClarificationRequest - (*AnswerClarificationResponse)(nil), // 90: kandev.plugin.v1.AnswerClarificationResponse - (*CancelClarificationRequest)(nil), // 91: kandev.plugin.v1.CancelClarificationRequest - (*CancelClarificationResponse)(nil), // 92: kandev.plugin.v1.CancelClarificationResponse - (*InvokeUtilityAgentRequest)(nil), // 93: kandev.plugin.v1.InvokeUtilityAgentRequest - (*InvokeUtilityAgentResponse)(nil), // 94: kandev.plugin.v1.InvokeUtilityAgentResponse - (*CreateTaskRequest)(nil), // 95: kandev.plugin.v1.CreateTaskRequest - (*PluginTaskRepository)(nil), // 96: kandev.plugin.v1.PluginTaskRepository - (*RemoteRepositoryDescriptor)(nil), // 97: kandev.plugin.v1.RemoteRepositoryDescriptor - (*PluginTaskLaunchOptions)(nil), // 98: kandev.plugin.v1.PluginTaskLaunchOptions - (*CreateTaskResponse)(nil), // 99: kandev.plugin.v1.CreateTaskResponse - (*UpdateTaskRequest)(nil), // 100: kandev.plugin.v1.UpdateTaskRequest - (*UpdateTaskResponse)(nil), // 101: kandev.plugin.v1.UpdateTaskResponse - (*SendMessageRequest)(nil), // 102: kandev.plugin.v1.SendMessageRequest - (*SendMessageResponse)(nil), // 103: kandev.plugin.v1.SendMessageResponse - (*PreviewPluginOwnedTaskTreeRequest)(nil), // 104: kandev.plugin.v1.PreviewPluginOwnedTaskTreeRequest - (*PreviewPluginOwnedTaskTreeResponse)(nil), // 105: kandev.plugin.v1.PreviewPluginOwnedTaskTreeResponse - (*DeletePluginOwnedTaskTreeRequest)(nil), // 106: kandev.plugin.v1.DeletePluginOwnedTaskTreeRequest - (*DeletePluginOwnedTaskTreeResponse)(nil), // 107: kandev.plugin.v1.DeletePluginOwnedTaskTreeResponse - (*DeletePluginOwnedTaskTreeProgress)(nil), // 108: kandev.plugin.v1.DeletePluginOwnedTaskTreeProgress - nil, // 109: kandev.plugin.v1.WebhookRequest.HeadersEntry - nil, // 110: kandev.plugin.v1.WebhookResponse.HeadersEntry - nil, // 111: kandev.plugin.v1.PluginActionResponse.HeadersEntry - (*structpb.Struct)(nil), // 112: google.protobuf.Struct + (*TaskPullRequest)(nil), // 44: kandev.plugin.v1.TaskPullRequest + (*TaskFilter)(nil), // 45: kandev.plugin.v1.TaskFilter + (*ListTasksRequest)(nil), // 46: kandev.plugin.v1.ListTasksRequest + (*ListTasksResponse)(nil), // 47: kandev.plugin.v1.ListTasksResponse + (*GetTaskRequest)(nil), // 48: kandev.plugin.v1.GetTaskRequest + (*GetTaskResponse)(nil), // 49: kandev.plugin.v1.GetTaskResponse + (*Workspace)(nil), // 50: kandev.plugin.v1.Workspace + (*ListWorkspacesRequest)(nil), // 51: kandev.plugin.v1.ListWorkspacesRequest + (*ListWorkspacesResponse)(nil), // 52: kandev.plugin.v1.ListWorkspacesResponse + (*Workflow)(nil), // 53: kandev.plugin.v1.Workflow + (*ListWorkflowsRequest)(nil), // 54: kandev.plugin.v1.ListWorkflowsRequest + (*ListWorkflowsResponse)(nil), // 55: kandev.plugin.v1.ListWorkflowsResponse + (*WorkflowStep)(nil), // 56: kandev.plugin.v1.WorkflowStep + (*ListWorkflowStepsRequest)(nil), // 57: kandev.plugin.v1.ListWorkflowStepsRequest + (*ListWorkflowStepsResponse)(nil), // 58: kandev.plugin.v1.ListWorkflowStepsResponse + (*AgentProfile)(nil), // 59: kandev.plugin.v1.AgentProfile + (*ListAgentProfilesRequest)(nil), // 60: kandev.plugin.v1.ListAgentProfilesRequest + (*ListAgentProfilesResponse)(nil), // 61: kandev.plugin.v1.ListAgentProfilesResponse + (*ExecutorProfile)(nil), // 62: kandev.plugin.v1.ExecutorProfile + (*ListExecutorProfilesRequest)(nil), // 63: kandev.plugin.v1.ListExecutorProfilesRequest + (*ListExecutorProfilesResponse)(nil), // 64: kandev.plugin.v1.ListExecutorProfilesResponse + (*Repository)(nil), // 65: kandev.plugin.v1.Repository + (*ListRepositoriesRequest)(nil), // 66: kandev.plugin.v1.ListRepositoriesRequest + (*ListRepositoriesResponse)(nil), // 67: kandev.plugin.v1.ListRepositoriesResponse + (*Session)(nil), // 68: kandev.plugin.v1.Session + (*SessionFilter)(nil), // 69: kandev.plugin.v1.SessionFilter + (*ListSessionsRequest)(nil), // 70: kandev.plugin.v1.ListSessionsRequest + (*ListSessionsResponse)(nil), // 71: kandev.plugin.v1.ListSessionsResponse + (*SessionCodeStats)(nil), // 72: kandev.plugin.v1.SessionCodeStats + (*ListSessionCodeStatsRequest)(nil), // 73: kandev.plugin.v1.ListSessionCodeStatsRequest + (*ListSessionCodeStatsResponse)(nil), // 74: kandev.plugin.v1.ListSessionCodeStatsResponse + (*Message)(nil), // 75: kandev.plugin.v1.Message + (*MessageFilter)(nil), // 76: kandev.plugin.v1.MessageFilter + (*ListMessagesRequest)(nil), // 77: kandev.plugin.v1.ListMessagesRequest + (*ListMessagesResponse)(nil), // 78: kandev.plugin.v1.ListMessagesResponse + (*InteractionOption)(nil), // 79: kandev.plugin.v1.InteractionOption + (*InteractionQuestion)(nil), // 80: kandev.plugin.v1.InteractionQuestion + (*Interaction)(nil), // 81: kandev.plugin.v1.Interaction + (*InteractionFilter)(nil), // 82: kandev.plugin.v1.InteractionFilter + (*ListPendingInteractionsRequest)(nil), // 83: kandev.plugin.v1.ListPendingInteractionsRequest + (*ListPendingInteractionsResponse)(nil), // 84: kandev.plugin.v1.ListPendingInteractionsResponse + (*GetInteractionRequest)(nil), // 85: kandev.plugin.v1.GetInteractionRequest + (*GetInteractionResponse)(nil), // 86: kandev.plugin.v1.GetInteractionResponse + (*RespondToPermissionRequest)(nil), // 87: kandev.plugin.v1.RespondToPermissionRequest + (*RespondToPermissionResponse)(nil), // 88: kandev.plugin.v1.RespondToPermissionResponse + (*ClarificationAnswer)(nil), // 89: kandev.plugin.v1.ClarificationAnswer + (*AnswerClarificationRequest)(nil), // 90: kandev.plugin.v1.AnswerClarificationRequest + (*AnswerClarificationResponse)(nil), // 91: kandev.plugin.v1.AnswerClarificationResponse + (*CancelClarificationRequest)(nil), // 92: kandev.plugin.v1.CancelClarificationRequest + (*CancelClarificationResponse)(nil), // 93: kandev.plugin.v1.CancelClarificationResponse + (*InvokeUtilityAgentRequest)(nil), // 94: kandev.plugin.v1.InvokeUtilityAgentRequest + (*InvokeUtilityAgentResponse)(nil), // 95: kandev.plugin.v1.InvokeUtilityAgentResponse + (*CreateTaskRequest)(nil), // 96: kandev.plugin.v1.CreateTaskRequest + (*PluginTaskRepository)(nil), // 97: kandev.plugin.v1.PluginTaskRepository + (*RemoteRepositoryDescriptor)(nil), // 98: kandev.plugin.v1.RemoteRepositoryDescriptor + (*PluginTaskLaunchOptions)(nil), // 99: kandev.plugin.v1.PluginTaskLaunchOptions + (*CreateTaskResponse)(nil), // 100: kandev.plugin.v1.CreateTaskResponse + (*UpdateTaskRequest)(nil), // 101: kandev.plugin.v1.UpdateTaskRequest + (*UpdateTaskResponse)(nil), // 102: kandev.plugin.v1.UpdateTaskResponse + (*SendMessageRequest)(nil), // 103: kandev.plugin.v1.SendMessageRequest + (*SendMessageResponse)(nil), // 104: kandev.plugin.v1.SendMessageResponse + (*PreviewPluginOwnedTaskTreeRequest)(nil), // 105: kandev.plugin.v1.PreviewPluginOwnedTaskTreeRequest + (*PreviewPluginOwnedTaskTreeResponse)(nil), // 106: kandev.plugin.v1.PreviewPluginOwnedTaskTreeResponse + (*DeletePluginOwnedTaskTreeRequest)(nil), // 107: kandev.plugin.v1.DeletePluginOwnedTaskTreeRequest + (*DeletePluginOwnedTaskTreeResponse)(nil), // 108: kandev.plugin.v1.DeletePluginOwnedTaskTreeResponse + (*DeletePluginOwnedTaskTreeProgress)(nil), // 109: kandev.plugin.v1.DeletePluginOwnedTaskTreeProgress + nil, // 110: kandev.plugin.v1.WebhookRequest.HeadersEntry + nil, // 111: kandev.plugin.v1.WebhookResponse.HeadersEntry + nil, // 112: kandev.plugin.v1.PluginActionResponse.HeadersEntry + (*structpb.Struct)(nil), // 113: google.protobuf.Struct } var file_kandev_plugin_v1_plugin_proto_depIdxs = []int32{ - 112, // 0: kandev.plugin.v1.Event.payload:type_name -> google.protobuf.Struct - 112, // 1: kandev.plugin.v1.AgentToolRequest.arguments:type_name -> google.protobuf.Struct + 113, // 0: kandev.plugin.v1.Event.payload:type_name -> google.protobuf.Struct + 113, // 1: kandev.plugin.v1.AgentToolRequest.arguments:type_name -> google.protobuf.Struct 3, // 2: kandev.plugin.v1.AgentToolRequest.context:type_name -> kandev.plugin.v1.AgentToolContext - 112, // 3: kandev.plugin.v1.AgentToolResponse.structured_content:type_name -> google.protobuf.Struct - 109, // 4: kandev.plugin.v1.WebhookRequest.headers:type_name -> kandev.plugin.v1.WebhookRequest.HeadersEntry - 110, // 5: kandev.plugin.v1.WebhookResponse.headers:type_name -> kandev.plugin.v1.WebhookResponse.HeadersEntry + 113, // 3: kandev.plugin.v1.AgentToolResponse.structured_content:type_name -> google.protobuf.Struct + 110, // 4: kandev.plugin.v1.WebhookRequest.headers:type_name -> kandev.plugin.v1.WebhookRequest.HeadersEntry + 111, // 5: kandev.plugin.v1.WebhookResponse.headers:type_name -> kandev.plugin.v1.WebhookResponse.HeadersEntry 8, // 6: kandev.plugin.v1.PluginActionRequest.context:type_name -> kandev.plugin.v1.VerifiedActionContext - 111, // 7: kandev.plugin.v1.PluginActionResponse.headers:type_name -> kandev.plugin.v1.PluginActionResponse.HeadersEntry + 112, // 7: kandev.plugin.v1.PluginActionResponse.headers:type_name -> kandev.plugin.v1.PluginActionResponse.HeadersEntry 12, // 8: kandev.plugin.v1.SearchEntityReferencesResponse.candidates:type_name -> kandev.plugin.v1.EntityReferenceCandidate - 112, // 9: kandev.plugin.v1.EntityReferenceCandidate.attributes:type_name -> google.protobuf.Struct - 112, // 10: kandev.plugin.v1.AuthorizeEntityReferenceRequest.reference:type_name -> google.protobuf.Struct - 112, // 11: kandev.plugin.v1.GetStateResponse.value:type_name -> google.protobuf.Struct - 112, // 12: kandev.plugin.v1.SetStateRequest.value:type_name -> google.protobuf.Struct + 113, // 9: kandev.plugin.v1.EntityReferenceCandidate.attributes:type_name -> google.protobuf.Struct + 113, // 10: kandev.plugin.v1.AuthorizeEntityReferenceRequest.reference:type_name -> google.protobuf.Struct + 113, // 11: kandev.plugin.v1.GetStateResponse.value:type_name -> google.protobuf.Struct + 113, // 12: kandev.plugin.v1.SetStateRequest.value:type_name -> google.protobuf.Struct 27, // 13: kandev.plugin.v1.ListStateResponse.entries:type_name -> kandev.plugin.v1.StateEntry - 112, // 14: kandev.plugin.v1.StateEntry.value:type_name -> google.protobuf.Struct - 112, // 15: kandev.plugin.v1.GetConfigResponse.config:type_name -> google.protobuf.Struct - 112, // 16: kandev.plugin.v1.EmitEventRequest.payload:type_name -> google.protobuf.Struct + 113, // 14: kandev.plugin.v1.StateEntry.value:type_name -> google.protobuf.Struct + 113, // 15: kandev.plugin.v1.GetConfigResponse.config:type_name -> google.protobuf.Struct + 113, // 16: kandev.plugin.v1.EmitEventRequest.payload:type_name -> google.protobuf.Struct 43, // 17: kandev.plugin.v1.Task.repositories:type_name -> kandev.plugin.v1.TaskRepository - 112, // 18: kandev.plugin.v1.Task.metadata:type_name -> google.protobuf.Struct - 44, // 19: kandev.plugin.v1.ListTasksRequest.filter:type_name -> kandev.plugin.v1.TaskFilter - 40, // 20: kandev.plugin.v1.ListTasksRequest.page:type_name -> kandev.plugin.v1.Page - 42, // 21: kandev.plugin.v1.ListTasksResponse.tasks:type_name -> kandev.plugin.v1.Task - 41, // 22: kandev.plugin.v1.ListTasksResponse.page_info:type_name -> kandev.plugin.v1.PageInfo - 42, // 23: kandev.plugin.v1.GetTaskResponse.task:type_name -> kandev.plugin.v1.Task - 40, // 24: kandev.plugin.v1.ListWorkspacesRequest.page:type_name -> kandev.plugin.v1.Page - 49, // 25: kandev.plugin.v1.ListWorkspacesResponse.workspaces:type_name -> kandev.plugin.v1.Workspace - 41, // 26: kandev.plugin.v1.ListWorkspacesResponse.page_info:type_name -> kandev.plugin.v1.PageInfo - 40, // 27: kandev.plugin.v1.ListWorkflowsRequest.page:type_name -> kandev.plugin.v1.Page - 52, // 28: kandev.plugin.v1.ListWorkflowsResponse.workflows:type_name -> kandev.plugin.v1.Workflow - 41, // 29: kandev.plugin.v1.ListWorkflowsResponse.page_info:type_name -> kandev.plugin.v1.PageInfo - 55, // 30: kandev.plugin.v1.ListWorkflowStepsResponse.steps:type_name -> kandev.plugin.v1.WorkflowStep - 40, // 31: kandev.plugin.v1.ListAgentProfilesRequest.page:type_name -> kandev.plugin.v1.Page - 58, // 32: kandev.plugin.v1.ListAgentProfilesResponse.profiles:type_name -> kandev.plugin.v1.AgentProfile - 41, // 33: kandev.plugin.v1.ListAgentProfilesResponse.page_info:type_name -> kandev.plugin.v1.PageInfo - 40, // 34: kandev.plugin.v1.ListExecutorProfilesRequest.page:type_name -> kandev.plugin.v1.Page - 61, // 35: kandev.plugin.v1.ListExecutorProfilesResponse.profiles:type_name -> kandev.plugin.v1.ExecutorProfile - 41, // 36: kandev.plugin.v1.ListExecutorProfilesResponse.page_info:type_name -> kandev.plugin.v1.PageInfo - 40, // 37: kandev.plugin.v1.ListRepositoriesRequest.page:type_name -> kandev.plugin.v1.Page - 64, // 38: kandev.plugin.v1.ListRepositoriesResponse.repositories:type_name -> kandev.plugin.v1.Repository - 41, // 39: kandev.plugin.v1.ListRepositoriesResponse.page_info:type_name -> kandev.plugin.v1.PageInfo - 68, // 40: kandev.plugin.v1.ListSessionsRequest.filter:type_name -> kandev.plugin.v1.SessionFilter - 40, // 41: kandev.plugin.v1.ListSessionsRequest.page:type_name -> kandev.plugin.v1.Page - 67, // 42: kandev.plugin.v1.ListSessionsResponse.sessions:type_name -> kandev.plugin.v1.Session - 41, // 43: kandev.plugin.v1.ListSessionsResponse.page_info:type_name -> kandev.plugin.v1.PageInfo - 68, // 44: kandev.plugin.v1.ListSessionCodeStatsRequest.filter:type_name -> kandev.plugin.v1.SessionFilter - 40, // 45: kandev.plugin.v1.ListSessionCodeStatsRequest.page:type_name -> kandev.plugin.v1.Page - 71, // 46: kandev.plugin.v1.ListSessionCodeStatsResponse.stats:type_name -> kandev.plugin.v1.SessionCodeStats - 41, // 47: kandev.plugin.v1.ListSessionCodeStatsResponse.page_info:type_name -> kandev.plugin.v1.PageInfo - 75, // 48: kandev.plugin.v1.ListMessagesRequest.filter:type_name -> kandev.plugin.v1.MessageFilter - 40, // 49: kandev.plugin.v1.ListMessagesRequest.page:type_name -> kandev.plugin.v1.Page - 74, // 50: kandev.plugin.v1.ListMessagesResponse.messages:type_name -> kandev.plugin.v1.Message - 41, // 51: kandev.plugin.v1.ListMessagesResponse.page_info:type_name -> kandev.plugin.v1.PageInfo - 78, // 52: kandev.plugin.v1.InteractionQuestion.options:type_name -> kandev.plugin.v1.InteractionOption - 78, // 53: kandev.plugin.v1.Interaction.options:type_name -> kandev.plugin.v1.InteractionOption - 79, // 54: kandev.plugin.v1.Interaction.questions:type_name -> kandev.plugin.v1.InteractionQuestion - 81, // 55: kandev.plugin.v1.ListPendingInteractionsRequest.filter:type_name -> kandev.plugin.v1.InteractionFilter - 40, // 56: kandev.plugin.v1.ListPendingInteractionsRequest.page:type_name -> kandev.plugin.v1.Page - 80, // 57: kandev.plugin.v1.ListPendingInteractionsResponse.interactions:type_name -> kandev.plugin.v1.Interaction - 41, // 58: kandev.plugin.v1.ListPendingInteractionsResponse.page_info:type_name -> kandev.plugin.v1.PageInfo - 80, // 59: kandev.plugin.v1.GetInteractionResponse.interaction:type_name -> kandev.plugin.v1.Interaction - 80, // 60: kandev.plugin.v1.RespondToPermissionResponse.interaction:type_name -> kandev.plugin.v1.Interaction - 88, // 61: kandev.plugin.v1.AnswerClarificationRequest.answers:type_name -> kandev.plugin.v1.ClarificationAnswer - 80, // 62: kandev.plugin.v1.AnswerClarificationResponse.interaction:type_name -> kandev.plugin.v1.Interaction - 80, // 63: kandev.plugin.v1.CancelClarificationResponse.interaction:type_name -> kandev.plugin.v1.Interaction - 96, // 64: kandev.plugin.v1.CreateTaskRequest.repositories:type_name -> kandev.plugin.v1.PluginTaskRepository - 98, // 65: kandev.plugin.v1.CreateTaskRequest.launch:type_name -> kandev.plugin.v1.PluginTaskLaunchOptions - 112, // 66: kandev.plugin.v1.CreateTaskRequest.metadata:type_name -> google.protobuf.Struct - 97, // 67: kandev.plugin.v1.PluginTaskRepository.remote:type_name -> kandev.plugin.v1.RemoteRepositoryDescriptor - 42, // 68: kandev.plugin.v1.CreateTaskResponse.task:type_name -> kandev.plugin.v1.Task - 42, // 69: kandev.plugin.v1.UpdateTaskResponse.task:type_name -> kandev.plugin.v1.Task - 42, // 70: kandev.plugin.v1.PreviewPluginOwnedTaskTreeResponse.tasks:type_name -> kandev.plugin.v1.Task - 0, // 71: kandev.plugin.v1.Plugin.DeliverEvent:input_type -> kandev.plugin.v1.Event - 5, // 72: kandev.plugin.v1.Plugin.HandleWebhook:input_type -> kandev.plugin.v1.WebhookRequest - 7, // 73: kandev.plugin.v1.Plugin.HandleAction:input_type -> kandev.plugin.v1.PluginActionRequest - 10, // 74: kandev.plugin.v1.Plugin.SearchEntityReferences:input_type -> kandev.plugin.v1.SearchEntityReferencesRequest - 13, // 75: kandev.plugin.v1.Plugin.AuthorizeEntityReference:input_type -> kandev.plugin.v1.AuthorizeEntityReferenceRequest - 15, // 76: kandev.plugin.v1.Plugin.ResolveGitCredential:input_type -> kandev.plugin.v1.ResolveGitCredentialRequest - 17, // 77: kandev.plugin.v1.Plugin.GetGitCredentialBinding:input_type -> kandev.plugin.v1.GitCredentialBindingRequest - 2, // 78: kandev.plugin.v1.Plugin.InvokeAgentTool:input_type -> kandev.plugin.v1.AgentToolRequest - 19, // 79: kandev.plugin.v1.Host.GetState:input_type -> kandev.plugin.v1.GetStateRequest - 21, // 80: kandev.plugin.v1.Host.SetState:input_type -> kandev.plugin.v1.SetStateRequest - 23, // 81: kandev.plugin.v1.Host.DeleteState:input_type -> kandev.plugin.v1.DeleteStateRequest - 25, // 82: kandev.plugin.v1.Host.ListState:input_type -> kandev.plugin.v1.ListStateRequest - 36, // 83: kandev.plugin.v1.Host.RevealSecret:input_type -> kandev.plugin.v1.RevealSecretRequest - 38, // 84: kandev.plugin.v1.Host.EmitEvent:input_type -> kandev.plugin.v1.EmitEventRequest - 30, // 85: kandev.plugin.v1.Host.GetSecret:input_type -> kandev.plugin.v1.GetSecretRequest - 32, // 86: kandev.plugin.v1.Host.SetSecret:input_type -> kandev.plugin.v1.SetSecretRequest - 34, // 87: kandev.plugin.v1.Host.DeleteSecret:input_type -> kandev.plugin.v1.DeleteSecretRequest - 28, // 88: kandev.plugin.v1.Host.GetConfig:input_type -> kandev.plugin.v1.GetConfigRequest - 45, // 89: kandev.plugin.v1.Host.ListTasks:input_type -> kandev.plugin.v1.ListTasksRequest - 47, // 90: kandev.plugin.v1.Host.GetTask:input_type -> kandev.plugin.v1.GetTaskRequest - 50, // 91: kandev.plugin.v1.Host.ListWorkspaces:input_type -> kandev.plugin.v1.ListWorkspacesRequest - 53, // 92: kandev.plugin.v1.Host.ListWorkflows:input_type -> kandev.plugin.v1.ListWorkflowsRequest - 56, // 93: kandev.plugin.v1.Host.ListWorkflowSteps:input_type -> kandev.plugin.v1.ListWorkflowStepsRequest - 59, // 94: kandev.plugin.v1.Host.ListAgentProfiles:input_type -> kandev.plugin.v1.ListAgentProfilesRequest - 62, // 95: kandev.plugin.v1.Host.ListExecutorProfiles:input_type -> kandev.plugin.v1.ListExecutorProfilesRequest - 65, // 96: kandev.plugin.v1.Host.ListRepositories:input_type -> kandev.plugin.v1.ListRepositoriesRequest - 69, // 97: kandev.plugin.v1.Host.ListSessions:input_type -> kandev.plugin.v1.ListSessionsRequest - 72, // 98: kandev.plugin.v1.Host.ListSessionCodeStats:input_type -> kandev.plugin.v1.ListSessionCodeStatsRequest - 76, // 99: kandev.plugin.v1.Host.ListMessages:input_type -> kandev.plugin.v1.ListMessagesRequest - 82, // 100: kandev.plugin.v1.Host.ListPendingInteractions:input_type -> kandev.plugin.v1.ListPendingInteractionsRequest - 84, // 101: kandev.plugin.v1.Host.GetInteraction:input_type -> kandev.plugin.v1.GetInteractionRequest - 93, // 102: kandev.plugin.v1.Host.InvokeUtilityAgent:input_type -> kandev.plugin.v1.InvokeUtilityAgentRequest - 95, // 103: kandev.plugin.v1.Host.CreateTask:input_type -> kandev.plugin.v1.CreateTaskRequest - 100, // 104: kandev.plugin.v1.Host.UpdateTask:input_type -> kandev.plugin.v1.UpdateTaskRequest - 102, // 105: kandev.plugin.v1.Host.SendMessage:input_type -> kandev.plugin.v1.SendMessageRequest - 104, // 106: kandev.plugin.v1.Host.PreviewPluginOwnedTaskTree:input_type -> kandev.plugin.v1.PreviewPluginOwnedTaskTreeRequest - 106, // 107: kandev.plugin.v1.Host.DeletePluginOwnedTaskTree:input_type -> kandev.plugin.v1.DeletePluginOwnedTaskTreeRequest - 86, // 108: kandev.plugin.v1.Host.RespondToPermission:input_type -> kandev.plugin.v1.RespondToPermissionRequest - 89, // 109: kandev.plugin.v1.Host.AnswerClarification:input_type -> kandev.plugin.v1.AnswerClarificationRequest - 91, // 110: kandev.plugin.v1.Host.CancelClarification:input_type -> kandev.plugin.v1.CancelClarificationRequest - 1, // 111: kandev.plugin.v1.Plugin.DeliverEvent:output_type -> kandev.plugin.v1.EventAck - 6, // 112: kandev.plugin.v1.Plugin.HandleWebhook:output_type -> kandev.plugin.v1.WebhookResponse - 9, // 113: kandev.plugin.v1.Plugin.HandleAction:output_type -> kandev.plugin.v1.PluginActionResponse - 11, // 114: kandev.plugin.v1.Plugin.SearchEntityReferences:output_type -> kandev.plugin.v1.SearchEntityReferencesResponse - 14, // 115: kandev.plugin.v1.Plugin.AuthorizeEntityReference:output_type -> kandev.plugin.v1.AuthorizeEntityReferenceResponse - 16, // 116: kandev.plugin.v1.Plugin.ResolveGitCredential:output_type -> kandev.plugin.v1.ResolveGitCredentialResponse - 18, // 117: kandev.plugin.v1.Plugin.GetGitCredentialBinding:output_type -> kandev.plugin.v1.GitCredentialBindingResponse - 4, // 118: kandev.plugin.v1.Plugin.InvokeAgentTool:output_type -> kandev.plugin.v1.AgentToolResponse - 20, // 119: kandev.plugin.v1.Host.GetState:output_type -> kandev.plugin.v1.GetStateResponse - 22, // 120: kandev.plugin.v1.Host.SetState:output_type -> kandev.plugin.v1.SetStateResponse - 24, // 121: kandev.plugin.v1.Host.DeleteState:output_type -> kandev.plugin.v1.DeleteStateResponse - 26, // 122: kandev.plugin.v1.Host.ListState:output_type -> kandev.plugin.v1.ListStateResponse - 37, // 123: kandev.plugin.v1.Host.RevealSecret:output_type -> kandev.plugin.v1.RevealSecretResponse - 39, // 124: kandev.plugin.v1.Host.EmitEvent:output_type -> kandev.plugin.v1.EmitEventResponse - 31, // 125: kandev.plugin.v1.Host.GetSecret:output_type -> kandev.plugin.v1.GetSecretResponse - 33, // 126: kandev.plugin.v1.Host.SetSecret:output_type -> kandev.plugin.v1.SetSecretResponse - 35, // 127: kandev.plugin.v1.Host.DeleteSecret:output_type -> kandev.plugin.v1.DeleteSecretResponse - 29, // 128: kandev.plugin.v1.Host.GetConfig:output_type -> kandev.plugin.v1.GetConfigResponse - 46, // 129: kandev.plugin.v1.Host.ListTasks:output_type -> kandev.plugin.v1.ListTasksResponse - 48, // 130: kandev.plugin.v1.Host.GetTask:output_type -> kandev.plugin.v1.GetTaskResponse - 51, // 131: kandev.plugin.v1.Host.ListWorkspaces:output_type -> kandev.plugin.v1.ListWorkspacesResponse - 54, // 132: kandev.plugin.v1.Host.ListWorkflows:output_type -> kandev.plugin.v1.ListWorkflowsResponse - 57, // 133: kandev.plugin.v1.Host.ListWorkflowSteps:output_type -> kandev.plugin.v1.ListWorkflowStepsResponse - 60, // 134: kandev.plugin.v1.Host.ListAgentProfiles:output_type -> kandev.plugin.v1.ListAgentProfilesResponse - 63, // 135: kandev.plugin.v1.Host.ListExecutorProfiles:output_type -> kandev.plugin.v1.ListExecutorProfilesResponse - 66, // 136: kandev.plugin.v1.Host.ListRepositories:output_type -> kandev.plugin.v1.ListRepositoriesResponse - 70, // 137: kandev.plugin.v1.Host.ListSessions:output_type -> kandev.plugin.v1.ListSessionsResponse - 73, // 138: kandev.plugin.v1.Host.ListSessionCodeStats:output_type -> kandev.plugin.v1.ListSessionCodeStatsResponse - 77, // 139: kandev.plugin.v1.Host.ListMessages:output_type -> kandev.plugin.v1.ListMessagesResponse - 83, // 140: kandev.plugin.v1.Host.ListPendingInteractions:output_type -> kandev.plugin.v1.ListPendingInteractionsResponse - 85, // 141: kandev.plugin.v1.Host.GetInteraction:output_type -> kandev.plugin.v1.GetInteractionResponse - 94, // 142: kandev.plugin.v1.Host.InvokeUtilityAgent:output_type -> kandev.plugin.v1.InvokeUtilityAgentResponse - 99, // 143: kandev.plugin.v1.Host.CreateTask:output_type -> kandev.plugin.v1.CreateTaskResponse - 101, // 144: kandev.plugin.v1.Host.UpdateTask:output_type -> kandev.plugin.v1.UpdateTaskResponse - 103, // 145: kandev.plugin.v1.Host.SendMessage:output_type -> kandev.plugin.v1.SendMessageResponse - 105, // 146: kandev.plugin.v1.Host.PreviewPluginOwnedTaskTree:output_type -> kandev.plugin.v1.PreviewPluginOwnedTaskTreeResponse - 107, // 147: kandev.plugin.v1.Host.DeletePluginOwnedTaskTree:output_type -> kandev.plugin.v1.DeletePluginOwnedTaskTreeResponse - 87, // 148: kandev.plugin.v1.Host.RespondToPermission:output_type -> kandev.plugin.v1.RespondToPermissionResponse - 90, // 149: kandev.plugin.v1.Host.AnswerClarification:output_type -> kandev.plugin.v1.AnswerClarificationResponse - 92, // 150: kandev.plugin.v1.Host.CancelClarification:output_type -> kandev.plugin.v1.CancelClarificationResponse - 111, // [111:151] is the sub-list for method output_type - 71, // [71:111] is the sub-list for method input_type - 71, // [71:71] is the sub-list for extension type_name - 71, // [71:71] is the sub-list for extension extendee - 0, // [0:71] is the sub-list for field type_name + 113, // 18: kandev.plugin.v1.Task.metadata:type_name -> google.protobuf.Struct + 44, // 19: kandev.plugin.v1.Task.pull_requests:type_name -> kandev.plugin.v1.TaskPullRequest + 45, // 20: kandev.plugin.v1.ListTasksRequest.filter:type_name -> kandev.plugin.v1.TaskFilter + 40, // 21: kandev.plugin.v1.ListTasksRequest.page:type_name -> kandev.plugin.v1.Page + 42, // 22: kandev.plugin.v1.ListTasksResponse.tasks:type_name -> kandev.plugin.v1.Task + 41, // 23: kandev.plugin.v1.ListTasksResponse.page_info:type_name -> kandev.plugin.v1.PageInfo + 42, // 24: kandev.plugin.v1.GetTaskResponse.task:type_name -> kandev.plugin.v1.Task + 40, // 25: kandev.plugin.v1.ListWorkspacesRequest.page:type_name -> kandev.plugin.v1.Page + 50, // 26: kandev.plugin.v1.ListWorkspacesResponse.workspaces:type_name -> kandev.plugin.v1.Workspace + 41, // 27: kandev.plugin.v1.ListWorkspacesResponse.page_info:type_name -> kandev.plugin.v1.PageInfo + 40, // 28: kandev.plugin.v1.ListWorkflowsRequest.page:type_name -> kandev.plugin.v1.Page + 53, // 29: kandev.plugin.v1.ListWorkflowsResponse.workflows:type_name -> kandev.plugin.v1.Workflow + 41, // 30: kandev.plugin.v1.ListWorkflowsResponse.page_info:type_name -> kandev.plugin.v1.PageInfo + 56, // 31: kandev.plugin.v1.ListWorkflowStepsResponse.steps:type_name -> kandev.plugin.v1.WorkflowStep + 40, // 32: kandev.plugin.v1.ListAgentProfilesRequest.page:type_name -> kandev.plugin.v1.Page + 59, // 33: kandev.plugin.v1.ListAgentProfilesResponse.profiles:type_name -> kandev.plugin.v1.AgentProfile + 41, // 34: kandev.plugin.v1.ListAgentProfilesResponse.page_info:type_name -> kandev.plugin.v1.PageInfo + 40, // 35: kandev.plugin.v1.ListExecutorProfilesRequest.page:type_name -> kandev.plugin.v1.Page + 62, // 36: kandev.plugin.v1.ListExecutorProfilesResponse.profiles:type_name -> kandev.plugin.v1.ExecutorProfile + 41, // 37: kandev.plugin.v1.ListExecutorProfilesResponse.page_info:type_name -> kandev.plugin.v1.PageInfo + 40, // 38: kandev.plugin.v1.ListRepositoriesRequest.page:type_name -> kandev.plugin.v1.Page + 65, // 39: kandev.plugin.v1.ListRepositoriesResponse.repositories:type_name -> kandev.plugin.v1.Repository + 41, // 40: kandev.plugin.v1.ListRepositoriesResponse.page_info:type_name -> kandev.plugin.v1.PageInfo + 69, // 41: kandev.plugin.v1.ListSessionsRequest.filter:type_name -> kandev.plugin.v1.SessionFilter + 40, // 42: kandev.plugin.v1.ListSessionsRequest.page:type_name -> kandev.plugin.v1.Page + 68, // 43: kandev.plugin.v1.ListSessionsResponse.sessions:type_name -> kandev.plugin.v1.Session + 41, // 44: kandev.plugin.v1.ListSessionsResponse.page_info:type_name -> kandev.plugin.v1.PageInfo + 69, // 45: kandev.plugin.v1.ListSessionCodeStatsRequest.filter:type_name -> kandev.plugin.v1.SessionFilter + 40, // 46: kandev.plugin.v1.ListSessionCodeStatsRequest.page:type_name -> kandev.plugin.v1.Page + 72, // 47: kandev.plugin.v1.ListSessionCodeStatsResponse.stats:type_name -> kandev.plugin.v1.SessionCodeStats + 41, // 48: kandev.plugin.v1.ListSessionCodeStatsResponse.page_info:type_name -> kandev.plugin.v1.PageInfo + 76, // 49: kandev.plugin.v1.ListMessagesRequest.filter:type_name -> kandev.plugin.v1.MessageFilter + 40, // 50: kandev.plugin.v1.ListMessagesRequest.page:type_name -> kandev.plugin.v1.Page + 75, // 51: kandev.plugin.v1.ListMessagesResponse.messages:type_name -> kandev.plugin.v1.Message + 41, // 52: kandev.plugin.v1.ListMessagesResponse.page_info:type_name -> kandev.plugin.v1.PageInfo + 79, // 53: kandev.plugin.v1.InteractionQuestion.options:type_name -> kandev.plugin.v1.InteractionOption + 79, // 54: kandev.plugin.v1.Interaction.options:type_name -> kandev.plugin.v1.InteractionOption + 80, // 55: kandev.plugin.v1.Interaction.questions:type_name -> kandev.plugin.v1.InteractionQuestion + 82, // 56: kandev.plugin.v1.ListPendingInteractionsRequest.filter:type_name -> kandev.plugin.v1.InteractionFilter + 40, // 57: kandev.plugin.v1.ListPendingInteractionsRequest.page:type_name -> kandev.plugin.v1.Page + 81, // 58: kandev.plugin.v1.ListPendingInteractionsResponse.interactions:type_name -> kandev.plugin.v1.Interaction + 41, // 59: kandev.plugin.v1.ListPendingInteractionsResponse.page_info:type_name -> kandev.plugin.v1.PageInfo + 81, // 60: kandev.plugin.v1.GetInteractionResponse.interaction:type_name -> kandev.plugin.v1.Interaction + 81, // 61: kandev.plugin.v1.RespondToPermissionResponse.interaction:type_name -> kandev.plugin.v1.Interaction + 89, // 62: kandev.plugin.v1.AnswerClarificationRequest.answers:type_name -> kandev.plugin.v1.ClarificationAnswer + 81, // 63: kandev.plugin.v1.AnswerClarificationResponse.interaction:type_name -> kandev.plugin.v1.Interaction + 81, // 64: kandev.plugin.v1.CancelClarificationResponse.interaction:type_name -> kandev.plugin.v1.Interaction + 97, // 65: kandev.plugin.v1.CreateTaskRequest.repositories:type_name -> kandev.plugin.v1.PluginTaskRepository + 99, // 66: kandev.plugin.v1.CreateTaskRequest.launch:type_name -> kandev.plugin.v1.PluginTaskLaunchOptions + 113, // 67: kandev.plugin.v1.CreateTaskRequest.metadata:type_name -> google.protobuf.Struct + 98, // 68: kandev.plugin.v1.PluginTaskRepository.remote:type_name -> kandev.plugin.v1.RemoteRepositoryDescriptor + 42, // 69: kandev.plugin.v1.CreateTaskResponse.task:type_name -> kandev.plugin.v1.Task + 42, // 70: kandev.plugin.v1.UpdateTaskResponse.task:type_name -> kandev.plugin.v1.Task + 42, // 71: kandev.plugin.v1.PreviewPluginOwnedTaskTreeResponse.tasks:type_name -> kandev.plugin.v1.Task + 0, // 72: kandev.plugin.v1.Plugin.DeliverEvent:input_type -> kandev.plugin.v1.Event + 5, // 73: kandev.plugin.v1.Plugin.HandleWebhook:input_type -> kandev.plugin.v1.WebhookRequest + 7, // 74: kandev.plugin.v1.Plugin.HandleAction:input_type -> kandev.plugin.v1.PluginActionRequest + 10, // 75: kandev.plugin.v1.Plugin.SearchEntityReferences:input_type -> kandev.plugin.v1.SearchEntityReferencesRequest + 13, // 76: kandev.plugin.v1.Plugin.AuthorizeEntityReference:input_type -> kandev.plugin.v1.AuthorizeEntityReferenceRequest + 15, // 77: kandev.plugin.v1.Plugin.ResolveGitCredential:input_type -> kandev.plugin.v1.ResolveGitCredentialRequest + 17, // 78: kandev.plugin.v1.Plugin.GetGitCredentialBinding:input_type -> kandev.plugin.v1.GitCredentialBindingRequest + 2, // 79: kandev.plugin.v1.Plugin.InvokeAgentTool:input_type -> kandev.plugin.v1.AgentToolRequest + 19, // 80: kandev.plugin.v1.Host.GetState:input_type -> kandev.plugin.v1.GetStateRequest + 21, // 81: kandev.plugin.v1.Host.SetState:input_type -> kandev.plugin.v1.SetStateRequest + 23, // 82: kandev.plugin.v1.Host.DeleteState:input_type -> kandev.plugin.v1.DeleteStateRequest + 25, // 83: kandev.plugin.v1.Host.ListState:input_type -> kandev.plugin.v1.ListStateRequest + 36, // 84: kandev.plugin.v1.Host.RevealSecret:input_type -> kandev.plugin.v1.RevealSecretRequest + 38, // 85: kandev.plugin.v1.Host.EmitEvent:input_type -> kandev.plugin.v1.EmitEventRequest + 30, // 86: kandev.plugin.v1.Host.GetSecret:input_type -> kandev.plugin.v1.GetSecretRequest + 32, // 87: kandev.plugin.v1.Host.SetSecret:input_type -> kandev.plugin.v1.SetSecretRequest + 34, // 88: kandev.plugin.v1.Host.DeleteSecret:input_type -> kandev.plugin.v1.DeleteSecretRequest + 28, // 89: kandev.plugin.v1.Host.GetConfig:input_type -> kandev.plugin.v1.GetConfigRequest + 46, // 90: kandev.plugin.v1.Host.ListTasks:input_type -> kandev.plugin.v1.ListTasksRequest + 48, // 91: kandev.plugin.v1.Host.GetTask:input_type -> kandev.plugin.v1.GetTaskRequest + 51, // 92: kandev.plugin.v1.Host.ListWorkspaces:input_type -> kandev.plugin.v1.ListWorkspacesRequest + 54, // 93: kandev.plugin.v1.Host.ListWorkflows:input_type -> kandev.plugin.v1.ListWorkflowsRequest + 57, // 94: kandev.plugin.v1.Host.ListWorkflowSteps:input_type -> kandev.plugin.v1.ListWorkflowStepsRequest + 60, // 95: kandev.plugin.v1.Host.ListAgentProfiles:input_type -> kandev.plugin.v1.ListAgentProfilesRequest + 63, // 96: kandev.plugin.v1.Host.ListExecutorProfiles:input_type -> kandev.plugin.v1.ListExecutorProfilesRequest + 66, // 97: kandev.plugin.v1.Host.ListRepositories:input_type -> kandev.plugin.v1.ListRepositoriesRequest + 70, // 98: kandev.plugin.v1.Host.ListSessions:input_type -> kandev.plugin.v1.ListSessionsRequest + 73, // 99: kandev.plugin.v1.Host.ListSessionCodeStats:input_type -> kandev.plugin.v1.ListSessionCodeStatsRequest + 77, // 100: kandev.plugin.v1.Host.ListMessages:input_type -> kandev.plugin.v1.ListMessagesRequest + 83, // 101: kandev.plugin.v1.Host.ListPendingInteractions:input_type -> kandev.plugin.v1.ListPendingInteractionsRequest + 85, // 102: kandev.plugin.v1.Host.GetInteraction:input_type -> kandev.plugin.v1.GetInteractionRequest + 94, // 103: kandev.plugin.v1.Host.InvokeUtilityAgent:input_type -> kandev.plugin.v1.InvokeUtilityAgentRequest + 96, // 104: kandev.plugin.v1.Host.CreateTask:input_type -> kandev.plugin.v1.CreateTaskRequest + 101, // 105: kandev.plugin.v1.Host.UpdateTask:input_type -> kandev.plugin.v1.UpdateTaskRequest + 103, // 106: kandev.plugin.v1.Host.SendMessage:input_type -> kandev.plugin.v1.SendMessageRequest + 105, // 107: kandev.plugin.v1.Host.PreviewPluginOwnedTaskTree:input_type -> kandev.plugin.v1.PreviewPluginOwnedTaskTreeRequest + 107, // 108: kandev.plugin.v1.Host.DeletePluginOwnedTaskTree:input_type -> kandev.plugin.v1.DeletePluginOwnedTaskTreeRequest + 87, // 109: kandev.plugin.v1.Host.RespondToPermission:input_type -> kandev.plugin.v1.RespondToPermissionRequest + 90, // 110: kandev.plugin.v1.Host.AnswerClarification:input_type -> kandev.plugin.v1.AnswerClarificationRequest + 92, // 111: kandev.plugin.v1.Host.CancelClarification:input_type -> kandev.plugin.v1.CancelClarificationRequest + 1, // 112: kandev.plugin.v1.Plugin.DeliverEvent:output_type -> kandev.plugin.v1.EventAck + 6, // 113: kandev.plugin.v1.Plugin.HandleWebhook:output_type -> kandev.plugin.v1.WebhookResponse + 9, // 114: kandev.plugin.v1.Plugin.HandleAction:output_type -> kandev.plugin.v1.PluginActionResponse + 11, // 115: kandev.plugin.v1.Plugin.SearchEntityReferences:output_type -> kandev.plugin.v1.SearchEntityReferencesResponse + 14, // 116: kandev.plugin.v1.Plugin.AuthorizeEntityReference:output_type -> kandev.plugin.v1.AuthorizeEntityReferenceResponse + 16, // 117: kandev.plugin.v1.Plugin.ResolveGitCredential:output_type -> kandev.plugin.v1.ResolveGitCredentialResponse + 18, // 118: kandev.plugin.v1.Plugin.GetGitCredentialBinding:output_type -> kandev.plugin.v1.GitCredentialBindingResponse + 4, // 119: kandev.plugin.v1.Plugin.InvokeAgentTool:output_type -> kandev.plugin.v1.AgentToolResponse + 20, // 120: kandev.plugin.v1.Host.GetState:output_type -> kandev.plugin.v1.GetStateResponse + 22, // 121: kandev.plugin.v1.Host.SetState:output_type -> kandev.plugin.v1.SetStateResponse + 24, // 122: kandev.plugin.v1.Host.DeleteState:output_type -> kandev.plugin.v1.DeleteStateResponse + 26, // 123: kandev.plugin.v1.Host.ListState:output_type -> kandev.plugin.v1.ListStateResponse + 37, // 124: kandev.plugin.v1.Host.RevealSecret:output_type -> kandev.plugin.v1.RevealSecretResponse + 39, // 125: kandev.plugin.v1.Host.EmitEvent:output_type -> kandev.plugin.v1.EmitEventResponse + 31, // 126: kandev.plugin.v1.Host.GetSecret:output_type -> kandev.plugin.v1.GetSecretResponse + 33, // 127: kandev.plugin.v1.Host.SetSecret:output_type -> kandev.plugin.v1.SetSecretResponse + 35, // 128: kandev.plugin.v1.Host.DeleteSecret:output_type -> kandev.plugin.v1.DeleteSecretResponse + 29, // 129: kandev.plugin.v1.Host.GetConfig:output_type -> kandev.plugin.v1.GetConfigResponse + 47, // 130: kandev.plugin.v1.Host.ListTasks:output_type -> kandev.plugin.v1.ListTasksResponse + 49, // 131: kandev.plugin.v1.Host.GetTask:output_type -> kandev.plugin.v1.GetTaskResponse + 52, // 132: kandev.plugin.v1.Host.ListWorkspaces:output_type -> kandev.plugin.v1.ListWorkspacesResponse + 55, // 133: kandev.plugin.v1.Host.ListWorkflows:output_type -> kandev.plugin.v1.ListWorkflowsResponse + 58, // 134: kandev.plugin.v1.Host.ListWorkflowSteps:output_type -> kandev.plugin.v1.ListWorkflowStepsResponse + 61, // 135: kandev.plugin.v1.Host.ListAgentProfiles:output_type -> kandev.plugin.v1.ListAgentProfilesResponse + 64, // 136: kandev.plugin.v1.Host.ListExecutorProfiles:output_type -> kandev.plugin.v1.ListExecutorProfilesResponse + 67, // 137: kandev.plugin.v1.Host.ListRepositories:output_type -> kandev.plugin.v1.ListRepositoriesResponse + 71, // 138: kandev.plugin.v1.Host.ListSessions:output_type -> kandev.plugin.v1.ListSessionsResponse + 74, // 139: kandev.plugin.v1.Host.ListSessionCodeStats:output_type -> kandev.plugin.v1.ListSessionCodeStatsResponse + 78, // 140: kandev.plugin.v1.Host.ListMessages:output_type -> kandev.plugin.v1.ListMessagesResponse + 84, // 141: kandev.plugin.v1.Host.ListPendingInteractions:output_type -> kandev.plugin.v1.ListPendingInteractionsResponse + 86, // 142: kandev.plugin.v1.Host.GetInteraction:output_type -> kandev.plugin.v1.GetInteractionResponse + 95, // 143: kandev.plugin.v1.Host.InvokeUtilityAgent:output_type -> kandev.plugin.v1.InvokeUtilityAgentResponse + 100, // 144: kandev.plugin.v1.Host.CreateTask:output_type -> kandev.plugin.v1.CreateTaskResponse + 102, // 145: kandev.plugin.v1.Host.UpdateTask:output_type -> kandev.plugin.v1.UpdateTaskResponse + 104, // 146: kandev.plugin.v1.Host.SendMessage:output_type -> kandev.plugin.v1.SendMessageResponse + 106, // 147: kandev.plugin.v1.Host.PreviewPluginOwnedTaskTree:output_type -> kandev.plugin.v1.PreviewPluginOwnedTaskTreeResponse + 108, // 148: kandev.plugin.v1.Host.DeletePluginOwnedTaskTree:output_type -> kandev.plugin.v1.DeletePluginOwnedTaskTreeResponse + 88, // 149: kandev.plugin.v1.Host.RespondToPermission:output_type -> kandev.plugin.v1.RespondToPermissionResponse + 91, // 150: kandev.plugin.v1.Host.AnswerClarification:output_type -> kandev.plugin.v1.AnswerClarificationResponse + 93, // 151: kandev.plugin.v1.Host.CancelClarification:output_type -> kandev.plugin.v1.CancelClarificationResponse + 112, // [112:152] is the sub-list for method output_type + 72, // [72:112] is the sub-list for method input_type + 72, // [72:72] is the sub-list for extension type_name + 72, // [72:72] is the sub-list for extension extendee + 0, // [0:72] is the sub-list for field type_name } func init() { file_kandev_plugin_v1_plugin_proto_init() } @@ -7609,23 +8018,24 @@ func file_kandev_plugin_v1_plugin_proto_init() { } file_kandev_plugin_v1_plugin_proto_msgTypes[42].OneofWrappers = []any{} file_kandev_plugin_v1_plugin_proto_msgTypes[44].OneofWrappers = []any{} - file_kandev_plugin_v1_plugin_proto_msgTypes[49].OneofWrappers = []any{} - file_kandev_plugin_v1_plugin_proto_msgTypes[52].OneofWrappers = []any{} - file_kandev_plugin_v1_plugin_proto_msgTypes[64].OneofWrappers = []any{} - file_kandev_plugin_v1_plugin_proto_msgTypes[67].OneofWrappers = []any{} - file_kandev_plugin_v1_plugin_proto_msgTypes[75].OneofWrappers = []any{} - file_kandev_plugin_v1_plugin_proto_msgTypes[95].OneofWrappers = []any{} + file_kandev_plugin_v1_plugin_proto_msgTypes[45].OneofWrappers = []any{} + file_kandev_plugin_v1_plugin_proto_msgTypes[50].OneofWrappers = []any{} + file_kandev_plugin_v1_plugin_proto_msgTypes[53].OneofWrappers = []any{} + file_kandev_plugin_v1_plugin_proto_msgTypes[65].OneofWrappers = []any{} + file_kandev_plugin_v1_plugin_proto_msgTypes[68].OneofWrappers = []any{} + file_kandev_plugin_v1_plugin_proto_msgTypes[76].OneofWrappers = []any{} file_kandev_plugin_v1_plugin_proto_msgTypes[96].OneofWrappers = []any{} file_kandev_plugin_v1_plugin_proto_msgTypes[97].OneofWrappers = []any{} file_kandev_plugin_v1_plugin_proto_msgTypes[98].OneofWrappers = []any{} - file_kandev_plugin_v1_plugin_proto_msgTypes[100].OneofWrappers = []any{} + file_kandev_plugin_v1_plugin_proto_msgTypes[99].OneofWrappers = []any{} + file_kandev_plugin_v1_plugin_proto_msgTypes[101].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_kandev_plugin_v1_plugin_proto_rawDesc), len(file_kandev_plugin_v1_plugin_proto_rawDesc)), NumEnums: 0, - NumMessages: 112, + NumMessages: 113, NumExtensions: 0, NumServices: 2, }, diff --git a/apps/backend/proto/kandev/plugin/v1/plugin.proto b/apps/backend/proto/kandev/plugin/v1/plugin.proto index 3607fae376..11cfb82fd9 100644 --- a/apps/backend/proto/kandev/plugin/v1/plugin.proto +++ b/apps/backend/proto/kandev/plugin/v1/plugin.proto @@ -370,6 +370,39 @@ message Task { bool is_ephemeral = 15; repeated TaskRepository repositories = 16; google.protobuf.Struct metadata = 17; // free-form; plugin-tolerant + // RFC3339, set only when the task is archived. Present so a plugin reading + // with include_archived can tell a live task from a retired one; absent is + // the normal case, not an unknown. + optional string archived_at = 18; + // Pull requests opened for this task, newest first. A plugin that reports on + // delivery cannot otherwise get from a task to its change: the link lives in + // github_task_prs, and neither the checkout branch (which is the BASE branch) + // nor the title (rewritten to conventional-commit form on the PR) matches. + repeated TaskPullRequest pull_requests = 19; + // The step the task currently stands on, and its order within that step. + // Without these a plugin can read a task's State (created/in progress/review/ + // completed) but not WHERE on the board it is, so it cannot render, group by, + // or reason about a workflow at all. + string workflow_step_id = 20; + int32 position = 21; + // The agent profile running this task, empty when unassigned. Canonically a + // `runner` row in workflow_step_participants (ADR 0005 Wave F); this is the + // same read-time projection kandev's own callers consume. + string assignee_agent_profile_id = 22; + // Task labels. Stored as a JSON array string on the model; carried here as a + // real repeated field so a plugin does not have to re-parse it. + repeated string labels = 23; + bool autopilot = 24; + // Whether the task consumes a slot in its current step's WIP capacity. A + // queued task stays visible but admits nothing, so a capacity report that + // counted rows rather than this would over-count. + bool wip_admitted = 25; + string queued_for_step_id = 26; + optional string queued_at = 27; // RFC3339 + // Office project this task belongs to, empty for kanban-board tasks. + string project_id = 28; + // Caller-supplied create-idempotency key, empty when the task holds none. + string external_id = 29; } message TaskRepository { string id = 1; @@ -378,6 +411,33 @@ message TaskRepository { int32 position = 4; string checkout_branch = 5; } +// TaskPullRequest is the read-side view of a task's linked pull request. It +// carries provider-neutral fields only; provider-specific review metadata stays +// out of the plugin contract. +message TaskPullRequest { + int64 number = 1; + string url = 2; + string title = 3; + string state = 4; // "open" | "closed" | "merged" + string head_branch = 5; + string base_branch = 6; + bool is_draft = 7; + string provider = 8; // "github" | "gitlab" + optional string merged_at = 9; // RFC3339 + // Readiness, already synced by kandev's own PR watcher. A plugin reporting on + // what can merge would otherwise re-fetch every one of these from the forge + // per pull request, which is both slower and rate-limited. + string review_state = 10; // approved | changes_requested | pending | "" + string checks_state = 11; // success | failure | pending | "" + string mergeable_state = 12; // clean | blocked | behind | dirty | unstable | draft | unknown | "" + int32 unresolved_review_threads = 13; + int32 checks_total = 14; + int32 checks_passing = 15; + int32 additions = 16; + int32 deletions = 17; + string author_login = 18; + optional string closed_at = 19; // RFC3339 +} message TaskFilter { repeated string workspace_ids = 1; // empty → all the plugin may see @@ -385,6 +445,9 @@ message TaskFilter { repeated string states = 3; optional string parent_id = 4; bool include_ephemeral = 5; // default false (kanban-visible only) + // default false, matching the previous hardcoded behaviour: a plugin that + // does not ask still sees only live tasks. + bool include_archived = 6; } message ListTasksRequest { TaskFilter filter = 1; @@ -444,6 +507,14 @@ message WorkflowStep { string name = 3; int32 position = 4; string stage_type = 5; // work | review | approval | custom + // Presentation and capacity, so a plugin rendering a board reads the same + // step colour the operator already sees rather than inventing its own, and + // can report a step against its own WIP limit. + string color = 6; + bool is_start_step = 7; + int32 wip_limit = 8; // 0 means unlimited + // The agent profile this step runs work under, empty when it inherits. + string agent_profile_id = 9; } message ListWorkflowStepsRequest { string workflow_id = 1;