Skip to main content

IssueProvider

Trait IssueProvider 

Source
pub trait IssueProvider: Send + Sync {
Show 37 methods // Required methods fn get_issues<'life0, 'async_trait>( &'life0 self, filter: IssueFilter, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Issue>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait; fn get_issue<'life0, 'life1, 'async_trait>( &'life0 self, key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Issue>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn create_issue<'life0, 'async_trait>( &'life0 self, input: CreateIssueInput, ) -> Pin<Box<dyn Future<Output = Result<Issue>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait; fn update_issue<'life0, 'life1, 'async_trait>( &'life0 self, key: &'life1 str, input: UpdateIssueInput, ) -> Pin<Box<dyn Future<Output = Result<Issue>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn get_comments<'life0, 'life1, 'async_trait>( &'life0 self, issue_key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Comment>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait; fn add_comment<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, issue_key: &'life1 str, body: &'life2 str, ) -> Pin<Box<dyn Future<Output = Result<Comment>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait; fn provider_name(&self) -> &'static str; // Provided methods fn get_statuses<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<IssueStatus>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn link_issues<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, _source_key: &'life1 str, _target_key: &'life2 str, _link_type: &'life3 str, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait { ... } fn unlink_issues<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, _source_key: &'life1 str, _target_key: &'life2 str, _link_type: &'life3 str, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait { ... } fn get_users<'life0, 'async_trait>( &'life0 self, _options: GetUsersOptions, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<User>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn upload_attachment<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, _issue_key: &'life1 str, _filename: &'life2 str, _data: &'life3 [u8], ) -> Pin<Box<dyn Future<Output = Result<String>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait { ... } fn get_issue_attachments<'life0, 'life1, 'async_trait>( &'life0 self, _issue_key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<AssetMeta>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait { ... } fn download_attachment<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, _issue_key: &'life1 str, _asset_id: &'life2 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<u8>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait { ... } fn delete_attachment<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, _issue_key: &'life1 str, _asset_id: &'life2 str, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait { ... } fn asset_capabilities(&self) -> AssetCapabilities { ... } fn set_custom_fields<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, _issue_key: &'life1 str, _fields: &'life2 [Value], ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait { ... } fn get_issue_relations<'life0, 'life1, 'async_trait>( &'life0 self, _issue_key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<IssueRelations>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait { ... } fn get_structures<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Structure>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn get_structure_forest<'life0, 'async_trait>( &'life0 self, _structure_id: u64, _options: GetForestOptions, ) -> Pin<Box<dyn Future<Output = Result<StructureForest>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn add_structure_rows<'life0, 'async_trait>( &'life0 self, _structure_id: u64, _input: AddStructureRowsInput, ) -> Pin<Box<dyn Future<Output = Result<ForestModifyResult>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn move_structure_rows<'life0, 'async_trait>( &'life0 self, _structure_id: u64, _input: MoveStructureRowsInput, ) -> Pin<Box<dyn Future<Output = Result<ForestModifyResult>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn remove_structure_row<'life0, 'async_trait>( &'life0 self, _structure_id: u64, _row_id: u64, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn get_structure_values<'life0, 'async_trait>( &'life0 self, _input: GetStructureValuesInput, ) -> Pin<Box<dyn Future<Output = Result<StructureValues>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn get_structure_views<'life0, 'async_trait>( &'life0 self, _structure_id: u64, _view_id: Option<u64>, ) -> Pin<Box<dyn Future<Output = Result<Vec<StructureView>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn save_structure_view<'life0, 'async_trait>( &'life0 self, _input: SaveStructureViewInput, ) -> Pin<Box<dyn Future<Output = Result<StructureView>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn create_structure<'life0, 'async_trait>( &'life0 self, _input: CreateStructureInput, ) -> Pin<Box<dyn Future<Output = Result<Structure>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn get_structure_generators<'life0, 'async_trait>( &'life0 self, _structure_id: u64, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<StructureGenerator>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn add_structure_generator<'life0, 'async_trait>( &'life0 self, _input: AddStructureGeneratorInput, ) -> Pin<Box<dyn Future<Output = Result<StructureGenerator>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn sync_structure_generator<'life0, 'async_trait>( &'life0 self, _input: SyncStructureGeneratorInput, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn delete_structure<'life0, 'async_trait>( &'life0 self, _structure_id: u64, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn update_structure_automation<'life0, 'async_trait>( &'life0 self, _input: UpdateStructureAutomationInput, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn trigger_structure_automation<'life0, 'async_trait>( &'life0 self, _structure_id: u64, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn list_project_versions<'life0, 'async_trait>( &'life0 self, _params: ListProjectVersionsParams, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<ProjectVersion>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn upsert_project_version<'life0, 'async_trait>( &'life0 self, _input: UpsertProjectVersionInput, ) -> Pin<Box<dyn Future<Output = Result<ProjectVersion>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn get_board_sprints<'life0, 'async_trait>( &'life0 self, _board_id: u64, _state: SprintState, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Sprint>>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... } fn assign_to_sprint<'life0, 'async_trait>( &'life0 self, _input: AssignToSprintInput, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>> where Self: 'async_trait, 'life0: 'async_trait { ... }
}
Expand description

Provider for working with issues.

Implementations include GitLab, GitHub, ClickUp, and Jira providers.

Required Methods§

Source

fn get_issues<'life0, 'async_trait>( &'life0 self, filter: IssueFilter, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Issue>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Get a list of issues with optional filters.

Source

fn get_issue<'life0, 'life1, 'async_trait>( &'life0 self, key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Issue>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Get a single issue by key (e.g., “gitlab#123”, “gh#456”).

Source

fn create_issue<'life0, 'async_trait>( &'life0 self, input: CreateIssueInput, ) -> Pin<Box<dyn Future<Output = Result<Issue>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Create a new issue.

Source

fn update_issue<'life0, 'life1, 'async_trait>( &'life0 self, key: &'life1 str, input: UpdateIssueInput, ) -> Pin<Box<dyn Future<Output = Result<Issue>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Update an existing issue.

Source

fn get_comments<'life0, 'life1, 'async_trait>( &'life0 self, issue_key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Comment>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Source

fn add_comment<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, issue_key: &'life1 str, body: &'life2 str, ) -> Pin<Box<dyn Future<Output = Result<Comment>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Source

fn provider_name(&self) -> &'static str

Get the provider name for logging (e.g., “gitlab”, “github”).

Provided Methods§

Source

fn get_statuses<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<IssueStatus>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Get available statuses for the issue tracker. Default returns ProviderUnsupported — override in providers that support statuses.

Link two issues together.

Remove a link between two issues.

Source

fn get_users<'life0, 'async_trait>( &'life0 self, _options: GetUsersOptions, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<User>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Get users from the issue tracker (Jira only).

Source

fn upload_attachment<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, _issue_key: &'life1 str, _filename: &'life2 str, _data: &'life3 [u8], ) -> Pin<Box<dyn Future<Output = Result<String>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, 'life3: 'async_trait,

Upload a file attachment to an issue. Returns the download URL. Default returns ProviderUnsupported — override in providers that support attachments.

Source

fn get_issue_attachments<'life0, 'life1, 'async_trait>( &'life0 self, _issue_key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<AssetMeta>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

List attachments currently attached to an issue (body + comments).

Returns provider-agnostic AssetMeta values. Default returns ProviderUnsupported; providers that can parse or fetch their own attachment listings override this.

Source

fn download_attachment<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, _issue_key: &'life1 str, _asset_id: &'life2 str, ) -> Pin<Box<dyn Future<Output = Result<Vec<u8>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Download the raw bytes of an attachment belonging to an issue.

asset_id is the provider-specific identifier returned from IssueProvider::get_issue_attachments (ClickUp attachment id, Jira attachment id, GitLab upload URL, etc.).

Source

fn delete_attachment<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, _issue_key: &'life1 str, _asset_id: &'life2 str, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Delete an attachment from an issue.

Not all providers expose a delete endpoint for attachments (ClickUp doesn’t, GitLab file uploads are immutable) — the default returns ProviderUnsupported and callers can consult asset_capabilities beforehand.

Source

fn asset_capabilities(&self) -> AssetCapabilities

Describe which asset operations this provider supports for each context. Used by the enricher to surface per-provider capabilities in tool schemas so agents can adapt their behaviour before making calls that would fail with ProviderUnsupported.

Source

fn set_custom_fields<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, _issue_key: &'life1 str, _fields: &'life2 [Value], ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Set custom fields on an issue. Each entry: {"id": "field_id", "value": <value>}. Default is no-op — override in providers that support custom fields (e.g., ClickUp).

Source

fn get_issue_relations<'life0, 'life1, 'async_trait>( &'life0 self, _issue_key: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<IssueRelations>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Get issue relations (parent, subtasks, linked issues).

Source

fn get_structures<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Structure>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

List all available structures.

Source

fn get_structure_forest<'life0, 'async_trait>( &'life0 self, _structure_id: u64, _options: GetForestOptions, ) -> Pin<Box<dyn Future<Output = Result<StructureForest>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Get a structure’s forest (hierarchy tree).

Source

fn add_structure_rows<'life0, 'async_trait>( &'life0 self, _structure_id: u64, _input: AddStructureRowsInput, ) -> Pin<Box<dyn Future<Output = Result<ForestModifyResult>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Add rows to a structure’s forest.

Source

fn move_structure_rows<'life0, 'async_trait>( &'life0 self, _structure_id: u64, _input: MoveStructureRowsInput, ) -> Pin<Box<dyn Future<Output = Result<ForestModifyResult>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Move rows within a structure’s forest.

Source

fn remove_structure_row<'life0, 'async_trait>( &'life0 self, _structure_id: u64, _row_id: u64, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Remove a row from a structure’s forest.

Source

fn get_structure_values<'life0, 'async_trait>( &'life0 self, _input: GetStructureValuesInput, ) -> Pin<Box<dyn Future<Output = Result<StructureValues>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Batch-read column values (including formulas) for structure rows.

Source

fn get_structure_views<'life0, 'async_trait>( &'life0 self, _structure_id: u64, _view_id: Option<u64>, ) -> Pin<Box<dyn Future<Output = Result<Vec<StructureView>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Get views for a structure, optionally a specific view by ID.

Source

fn save_structure_view<'life0, 'async_trait>( &'life0 self, _input: SaveStructureViewInput, ) -> Pin<Box<dyn Future<Output = Result<StructureView>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Create or update a structure view.

Source

fn create_structure<'life0, 'async_trait>( &'life0 self, _input: CreateStructureInput, ) -> Pin<Box<dyn Future<Output = Result<Structure>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Create a new structure.

Source

fn get_structure_generators<'life0, 'async_trait>( &'life0 self, _structure_id: u64, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<StructureGenerator>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

List generators configured on a structure.

Source

fn add_structure_generator<'life0, 'async_trait>( &'life0 self, _input: AddStructureGeneratorInput, ) -> Pin<Box<dyn Future<Output = Result<StructureGenerator>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Attach a new generator to a structure.

Source

fn sync_structure_generator<'life0, 'async_trait>( &'life0 self, _input: SyncStructureGeneratorInput, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Force a generator to refresh its produced rows.

Source

fn delete_structure<'life0, 'async_trait>( &'life0 self, _structure_id: u64, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Delete a structure permanently.

Source

fn update_structure_automation<'life0, 'async_trait>( &'life0 self, _input: UpdateStructureAutomationInput, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Replace a structure’s automation configuration.

Source

fn trigger_structure_automation<'life0, 'async_trait>( &'life0 self, _structure_id: u64, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Run a structure’s automation pass on demand.

Source

fn list_project_versions<'life0, 'async_trait>( &'life0 self, _params: ListProjectVersionsParams, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<ProjectVersion>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

List versions (“releases” / fixVersion targets) for a project. Default: ProviderUnsupported.

Source

fn upsert_project_version<'life0, 'async_trait>( &'life0 self, _input: UpsertProjectVersionInput, ) -> Pin<Box<dyn Future<Output = Result<ProjectVersion>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Create-or-update a project version, keyed by (project, name). Partial update: optional fields left as None are not touched. Default: ProviderUnsupported.

Source

fn get_board_sprints<'life0, 'async_trait>( &'life0 self, _board_id: u64, _state: SprintState, ) -> Pin<Box<dyn Future<Output = Result<ProviderResult<Sprint>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

List sprints visible on a board, optionally filtered by state.

Source

fn assign_to_sprint<'life0, 'async_trait>( &'life0 self, _input: AssignToSprintInput, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Move one or more issues onto a sprint.

Implementors§