temper-rb 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +291 -0
- data/lib/temper/act.rb +47 -0
- data/lib/temper/client.rb +96 -0
- data/lib/temper/cognitive_maps.rb +75 -0
- data/lib/temper/connection.rb +113 -0
- data/lib/temper/contexts.rb +54 -0
- data/lib/temper/credentials.rb +138 -0
- data/lib/temper/errors.rb +154 -0
- data/lib/temper/generated/api/access_api.rb +356 -0
- data/lib/temper/generated/api/auditor_api.rb +228 -0
- data/lib/temper/generated/api/blobs_api.rb +785 -0
- data/lib/temper/generated/api/cognitive_maps_api.rb +996 -0
- data/lib/temper/generated/api/contexts_api.rb +1039 -0
- data/lib/temper/generated/api/data_artifact_shapes_api.rb +243 -0
- data/lib/temper/generated/api/data_artifacts_api.rb +261 -0
- data/lib/temper/generated/api/events_api.rb +164 -0
- data/lib/temper/generated/api/facets_api.rb +406 -0
- data/lib/temper/generated/api/graph_api.rb +612 -0
- data/lib/temper/generated/api/health_api.rb +84 -0
- data/lib/temper/generated/api/ingest_api.rb +398 -0
- data/lib/temper/generated/api/invitations_api.rb +514 -0
- data/lib/temper/generated/api/invocations_api.rb +308 -0
- data/lib/temper/generated/api/meta_api.rb +169 -0
- data/lib/temper/generated/api/profile_api.rb +219 -0
- data/lib/temper/generated/api/query_api.rb +97 -0
- data/lib/temper/generated/api/reblocking_api.rb +95 -0
- data/lib/temper/generated/api/relationships_api.rb +332 -0
- data/lib/temper/generated/api/resources_api.rb +1329 -0
- data/lib/temper/generated/api/schema_api.rb +218 -0
- data/lib/temper/generated/api/search_api.rb +97 -0
- data/lib/temper/generated/api/slack_link_api.rb +159 -0
- data/lib/temper/generated/api/steward_api.rb +372 -0
- data/lib/temper/generated/api/teams_api.rb +687 -0
- data/lib/temper/generated/api_client.rb +441 -0
- data/lib/temper/generated/api_error.rb +58 -0
- data/lib/temper/generated/api_model_base.rb +88 -0
- data/lib/temper/generated/configuration.rb +393 -0
- data/lib/temper/generated/models/accept_invitation_response.rb +239 -0
- data/lib/temper/generated/models/act_input.rb +238 -0
- data/lib/temper/generated/models/act_invocation.rb +271 -0
- data/lib/temper/generated/models/act_name.rb +104 -0
- data/lib/temper/generated/models/act_quantity.rb +219 -0
- data/lib/temper/generated/models/act_refusal.rb +192 -0
- data/lib/temper/generated/models/actor_authority.rb +41 -0
- data/lib/temper/generated/models/add_member_request.rb +213 -0
- data/lib/temper/generated/models/advance_watermark_ack.rb +188 -0
- data/lib/temper/generated/models/advance_watermark_request.rb +161 -0
- data/lib/temper/generated/models/agent_authorship.rb +227 -0
- data/lib/temper/generated/models/anchor_address_resolution.rb +106 -0
- data/lib/temper/generated/models/anchor_address_resolution_one_of.rb +189 -0
- data/lib/temper/generated/models/anchor_address_resolution_one_of1.rb +242 -0
- data/lib/temper/generated/models/anchor_address_resolution_one_of2.rb +189 -0
- data/lib/temper/generated/models/anchor_shape.rb +239 -0
- data/lib/temper/generated/models/anchor_verdict.rb +41 -0
- data/lib/temper/generated/models/append_block_payload.rb +250 -0
- data/lib/temper/generated/models/artifact_commit_request.rb +337 -0
- data/lib/temper/generated/models/artifact_commit_response.rb +192 -0
- data/lib/temper/generated/models/artifact_view.rb +466 -0
- data/lib/temper/generated/models/assert_relationship_request.rb +406 -0
- data/lib/temper/generated/models/atlas_edge.rb +327 -0
- data/lib/temper/generated/models/atlas_entry.rb +221 -0
- data/lib/temper/generated/models/atlas_home.rb +195 -0
- data/lib/temper/generated/models/atlas_node.rb +329 -0
- data/lib/temper/generated/models/atlas_subgraph.rb +195 -0
- data/lib/temper/generated/models/audit_citation.rb +220 -0
- data/lib/temper/generated/models/audit_sweep_row.rb +220 -0
- data/lib/temper/generated/models/auditor_dispatch_tick_request.rb +150 -0
- data/lib/temper/generated/models/auditor_dispatch_tick_response.rb +178 -0
- data/lib/temper/generated/models/auditor_job_complete_ack.rb +175 -0
- data/lib/temper/generated/models/bind_team_outcome.rb +218 -0
- data/lib/temper/generated/models/bind_team_request.rb +166 -0
- data/lib/temper/generated/models/blob_commit_response.rb +283 -0
- data/lib/temper/generated/models/blob_delete_ack.rb +191 -0
- data/lib/temper/generated/models/blob_relation_ack.rb +165 -0
- data/lib/temper/generated/models/blob_relation_assert_request.rb +404 -0
- data/lib/temper/generated/models/blob_relation_direction.rb +40 -0
- data/lib/temper/generated/models/blob_relation_edge_direction.rb +40 -0
- data/lib/temper/generated/models/blob_relation_row.rb +390 -0
- data/lib/temper/generated/models/blob_summary.rb +256 -0
- data/lib/temper/generated/models/blob_upload_begin_request.rb +219 -0
- data/lib/temper/generated/models/blob_upload_begin_response.rb +165 -0
- data/lib/temper/generated/models/blob_upload_finalize_request.rb +211 -0
- data/lib/temper/generated/models/blob_upload_progress.rb +220 -0
- data/lib/temper/generated/models/blob_upload_segment_info.rb +227 -0
- data/lib/temper/generated/models/block_chunk_ref.rb +217 -0
- data/lib/temper/generated/models/block_fold_disposition.rb +106 -0
- data/lib/temper/generated/models/block_fold_disposition_one_of.rb +245 -0
- data/lib/temper/generated/models/block_fold_disposition_one_of1.rb +189 -0
- data/lib/temper/generated/models/block_fold_disposition_one_of2.rb +189 -0
- data/lib/temper/generated/models/block_provenance_row.rb +348 -0
- data/lib/temper/generated/models/block_read.rb +106 -0
- data/lib/temper/generated/models/block_read_one_of.rb +311 -0
- data/lib/temper/generated/models/block_read_one_of1.rb +297 -0
- data/lib/temper/generated/models/block_read_one_of2.rb +215 -0
- data/lib/temper/generated/models/block_successor.rb +177 -0
- data/lib/temper/generated/models/blocks_response.rb +194 -0
- data/lib/temper/generated/models/body_storage.rb +40 -0
- data/lib/temper/generated/models/bridge.rb +217 -0
- data/lib/temper/generated/models/bulk_reassign_ack.rb +167 -0
- data/lib/temper/generated/models/bulk_reassign_request.rb +191 -0
- data/lib/temper/generated/models/change_role_request.rb +187 -0
- data/lib/temper/generated/models/charter_block.rb +220 -0
- data/lib/temper/generated/models/charter_disposition.rb +42 -0
- data/lib/temper/generated/models/citation_audit_request.rb +231 -0
- data/lib/temper/generated/models/citation_audit_row.rb +366 -0
- data/lib/temper/generated/models/claimed_audit_job.rb +249 -0
- data/lib/temper/generated/models/claimed_job.rb +220 -0
- data/lib/temper/generated/models/close_invocation_request.rb +197 -0
- data/lib/temper/generated/models/cogmap_analytics_row.rb +220 -0
- data/lib/temper/generated/models/cogmap_detail.rb +224 -0
- data/lib/temper/generated/models/cogmap_foundation_row.rb +247 -0
- data/lib/temper/generated/models/cogmap_grant_body.rb +295 -0
- data/lib/temper/generated/models/cogmap_region_metrics_row.rb +248 -0
- data/lib/temper/generated/models/cogmap_region_row.rb +269 -0
- data/lib/temper/generated/models/cogmap_regulation_row.rb +228 -0
- data/lib/temper/generated/models/cogmap_revoke_body.rb +191 -0
- data/lib/temper/generated/models/cogmap_row.rb +341 -0
- data/lib/temper/generated/models/cogmap_staleness.rb +185 -0
- data/lib/temper/generated/models/combine_node.rb +263 -0
- data/lib/temper/generated/models/combine_op.rb +41 -0
- data/lib/temper/generated/models/composition.rb +203 -0
- data/lib/temper/generated/models/composition_trace.rb +167 -0
- data/lib/temper/generated/models/confidence_band.rb +41 -0
- data/lib/temper/generated/models/content_response.rb +213 -0
- data/lib/temper/generated/models/context_create_request.rb +176 -0
- data/lib/temper/generated/models/context_owner_ref.rb +106 -0
- data/lib/temper/generated/models/context_owner_ref_one_of.rb +166 -0
- data/lib/temper/generated/models/context_owner_ref_one_of1.rb +166 -0
- data/lib/temper/generated/models/context_panorama.rb +221 -0
- data/lib/temper/generated/models/context_row.rb +404 -0
- data/lib/temper/generated/models/context_row_with_counts.rb +430 -0
- data/lib/temper/generated/models/create_cogmap_outcome.rb +217 -0
- data/lib/temper/generated/models/create_cogmap_request.rb +221 -0
- data/lib/temper/generated/models/create_invitation_request.rb +213 -0
- data/lib/temper/generated/models/create_request_body.rb +184 -0
- data/lib/temper/generated/models/create_review_body.rb +148 -0
- data/lib/temper/generated/models/deactivated.rb +189 -0
- data/lib/temper/generated/models/delete_response.rb +165 -0
- data/lib/temper/generated/models/denied.rb +189 -0
- data/lib/temper/generated/models/device_overrides.rb +162 -0
- data/lib/temper/generated/models/discouraged_open_meta_key.rb +191 -0
- data/lib/temper/generated/models/dispatch_tick_request.rb +161 -0
- data/lib/temper/generated/models/dispatch_tick_response.rb +178 -0
- data/lib/temper/generated/models/disposition.rb +41 -0
- data/lib/temper/generated/models/doc_type_description.rb +247 -0
- data/lib/temper/generated/models/doc_type_summary.rb +219 -0
- data/lib/temper/generated/models/drift_sweep_row.rb +258 -0
- data/lib/temper/generated/models/edge_facet_row.rb +332 -0
- data/lib/temper/generated/models/edge_facet_set_request.rb +288 -0
- data/lib/temper/generated/models/edge_facets_response.rb +193 -0
- data/lib/temper/generated/models/edge_filter.rb +192 -0
- data/lib/temper/generated/models/edge_kind.rb +42 -0
- data/lib/temper/generated/models/element_event.rb +307 -0
- data/lib/temper/generated/models/element_kind.rb +40 -0
- data/lib/temper/generated/models/embed_dispatch_summary.rb +355 -0
- data/lib/temper/generated/models/enforcement_mode.rb +40 -0
- data/lib/temper/generated/models/entitlements.rb +234 -0
- data/lib/temper/generated/models/entry_bounds.rb +247 -0
- data/lib/temper/generated/models/error_body.rb +164 -0
- data/lib/temper/generated/models/error_detail.rb +201 -0
- data/lib/temper/generated/models/error_details.rb +105 -0
- data/lib/temper/generated/models/event_cursor_response.rb +150 -0
- data/lib/temper/generated/models/event_trail.rb +241 -0
- data/lib/temper/generated/models/exact_arm.rb +226 -0
- data/lib/temper/generated/models/exact_hit.rb +193 -0
- data/lib/temper/generated/models/extent.rb +106 -0
- data/lib/temper/generated/models/extent_one_of.rb +189 -0
- data/lib/temper/generated/models/extent_one_of1.rb +189 -0
- data/lib/temper/generated/models/extent_one_of2.rb +215 -0
- data/lib/temper/generated/models/facet_ack.rb +168 -0
- data/lib/temper/generated/models/facet_predicate.rb +191 -0
- data/lib/temper/generated/models/facet_retract_ack.rb +165 -0
- data/lib/temper/generated/models/facet_set_request.rb +304 -0
- data/lib/temper/generated/models/finalize_payload.rb +212 -0
- data/lib/temper/generated/models/fold_relationship_request.rb +248 -0
- data/lib/temper/generated/models/grant_outcome.rb +166 -0
- data/lib/temper/generated/models/graph_edge_row.rb +421 -0
- data/lib/temper/generated/models/group_key_meta.rb +217 -0
- data/lib/temper/generated/models/health_response.rb +202 -0
- data/lib/temper/generated/models/home_cogmap.rb +297 -0
- data/lib/temper/generated/models/home_context.rb +281 -0
- data/lib/temper/generated/models/id_kind.rb +104 -0
- data/lib/temper/generated/models/id_provenance.rb +105 -0
- data/lib/temper/generated/models/id_provenance_one_of.rb +215 -0
- data/lib/temper/generated/models/id_provenance_one_of1.rb +215 -0
- data/lib/temper/generated/models/id_set.rb +214 -0
- data/lib/temper/generated/models/idp_revocation.rb +41 -0
- data/lib/temper/generated/models/illegal_transition.rb +225 -0
- data/lib/temper/generated/models/ingest_create_response.rb +105 -0
- data/lib/temper/generated/models/ingest_delta.rb +334 -0
- data/lib/temper/generated/models/ingest_payload.rb +478 -0
- data/lib/temper/generated/models/ingest_state.rb +40 -0
- data/lib/temper/generated/models/inherited_read_grant.rb +219 -0
- data/lib/temper/generated/models/inherited_share.rb +192 -0
- data/lib/temper/generated/models/input_source.rb +106 -0
- data/lib/temper/generated/models/input_source_one_of.rb +227 -0
- data/lib/temper/generated/models/input_source_one_of1.rb +189 -0
- data/lib/temper/generated/models/input_source_one_of2.rb +189 -0
- data/lib/temper/generated/models/insufficient_authority.rb +241 -0
- data/lib/temper/generated/models/intention.rb +212 -0
- data/lib/temper/generated/models/invitation_status.rb +42 -0
- data/lib/temper/generated/models/invitation_token_request.rb +165 -0
- data/lib/temper/generated/models/invitee_invitation.rb +447 -0
- data/lib/temper/generated/models/invocation_ack.rb +191 -0
- data/lib/temper/generated/models/invocation_act_row.rb +269 -0
- data/lib/temper/generated/models/invocation_close_ack.rb +213 -0
- data/lib/temper/generated/models/invocation_summary.rb +296 -0
- data/lib/temper/generated/models/invocation_view.rb +433 -0
- data/lib/temper/generated/models/join_request.rb +403 -0
- data/lib/temper/generated/models/join_request_status.rb +42 -0
- data/lib/temper/generated/models/kind_owner_input.rb +105 -0
- data/lib/temper/generated/models/kind_owner_input_one_of.rb +164 -0
- data/lib/temper/generated/models/kind_owner_input_one_of1.rb +164 -0
- data/lib/temper/generated/models/lineage_node.rb +326 -0
- data/lib/temper/generated/models/managed_meta.rb +249 -0
- data/lib/temper/generated/models/match_location.rb +188 -0
- data/lib/temper/generated/models/materialize_ack.rb +307 -0
- data/lib/temper/generated/models/materialize_delta.rb +296 -0
- data/lib/temper/generated/models/materialize_request.rb +150 -0
- data/lib/temper/generated/models/merge_policy.rb +40 -0
- data/lib/temper/generated/models/meta_update_payload.rb +358 -0
- data/lib/temper/generated/models/narrowed_by.rb +210 -0
- data/lib/temper/generated/models/no_prior_standing.rb +189 -0
- data/lib/temper/generated/models/no_standing.rb +189 -0
- data/lib/temper/generated/models/node_home.rb +40 -0
- data/lib/temper/generated/models/open_invocation_request.rb +204 -0
- data/lib/temper/generated/models/open_meta_convention.rb +180 -0
- data/lib/temper/generated/models/ord_op.rb +42 -0
- data/lib/temper/generated/models/orphan_node.rb +264 -0
- data/lib/temper/generated/models/outcome_declaration.rb +177 -0
- data/lib/temper/generated/models/pending_invitation_counts.rb +177 -0
- data/lib/temper/generated/models/plan_refusal.rb +220 -0
- data/lib/temper/generated/models/plan_refusal_details.rb +167 -0
- data/lib/temper/generated/models/polarity.rb +40 -0
- data/lib/temper/generated/models/profile.rb +313 -0
- data/lib/temper/generated/models/profile_auth_link.rb +332 -0
- data/lib/temper/generated/models/profile_update_request.rb +169 -0
- data/lib/temper/generated/models/profile_with_entitlements.rb +344 -0
- data/lib/temper/generated/models/property_op.rb +106 -0
- data/lib/temper/generated/models/property_op_one_of.rb +189 -0
- data/lib/temper/generated/models/property_op_one_of1.rb +217 -0
- data/lib/temper/generated/models/property_op_one_of2.rb +227 -0
- data/lib/temper/generated/models/property_predicate.rb +191 -0
- data/lib/temper/generated/models/provenance_source.rb +106 -0
- data/lib/temper/generated/models/provenance_source_one_of.rb +214 -0
- data/lib/temper/generated/models/provenance_source_one_of1.rb +214 -0
- data/lib/temper/generated/models/provenance_source_one_of2.rb +216 -0
- data/lib/temper/generated/models/public_system_settings.rb +169 -0
- data/lib/temper/generated/models/quantity_scale.rb +106 -0
- data/lib/temper/generated/models/quantity_scale_one_of.rb +189 -0
- data/lib/temper/generated/models/quantity_scale_one_of1.rb +215 -0
- data/lib/temper/generated/models/quantity_scale_one_of2.rb +189 -0
- data/lib/temper/generated/models/query_response.rb +195 -0
- data/lib/temper/generated/models/reassign_ack.rb +191 -0
- data/lib/temper/generated/models/reassign_context_outcome.rb +243 -0
- data/lib/temper/generated/models/reassign_context_request.rb +166 -0
- data/lib/temper/generated/models/reassign_resource_request.rb +165 -0
- data/lib/temper/generated/models/reblock_candidate.rb +192 -0
- data/lib/temper/generated/models/reblock_outcome.rb +109 -0
- data/lib/temper/generated/models/reblock_outcome_one_of.rb +165 -0
- data/lib/temper/generated/models/reblock_outcome_one_of1.rb +165 -0
- data/lib/temper/generated/models/reblock_outcome_one_of1_in_progress.rb +166 -0
- data/lib/temper/generated/models/reblock_outcome_one_of2.rb +165 -0
- data/lib/temper/generated/models/reblock_outcome_one_of3.rb +165 -0
- data/lib/temper/generated/models/reblock_outcome_one_of4.rb +165 -0
- data/lib/temper/generated/models/reblock_outcome_one_of4_error.rb +165 -0
- data/lib/temper/generated/models/reblock_outcome_one_of_reblocked.rb +165 -0
- data/lib/temper/generated/models/reblock_receipt.rb +259 -0
- data/lib/temper/generated/models/reblock_request.rb +215 -0
- data/lib/temper/generated/models/reblock_scope.rb +106 -0
- data/lib/temper/generated/models/reblock_scope_one_of.rb +166 -0
- data/lib/temper/generated/models/reblock_scope_one_of1.rb +166 -0
- data/lib/temper/generated/models/reblock_summary.rb +350 -0
- data/lib/temper/generated/models/reconcile_cogmap_request.rb +199 -0
- data/lib/temper/generated/models/reconcile_edge.rb +253 -0
- data/lib/temper/generated/models/reconcile_edge_tombstone.rb +217 -0
- data/lib/temper/generated/models/reconcile_entry.rb +318 -0
- data/lib/temper/generated/models/reconcile_outcome.rb +327 -0
- data/lib/temper/generated/models/reconcile_telos.rb +167 -0
- data/lib/temper/generated/models/reconcile_telos_block.rb +191 -0
- data/lib/temper/generated/models/reconcile_tombstone.rb +165 -0
- data/lib/temper/generated/models/refusal.rb +112 -0
- data/lib/temper/generated/models/refusal_reason.rb +104 -0
- data/lib/temper/generated/models/region_disclosure.rb +193 -0
- data/lib/temper/generated/models/region_hit.rb +192 -0
- data/lib/temper/generated/models/relationship_ack.rb +165 -0
- data/lib/temper/generated/models/relationship_target.rb +40 -0
- data/lib/temper/generated/models/remove_member_outcome.rb +165 -0
- data/lib/temper/generated/models/rename_context_outcome.rb +300 -0
- data/lib/temper/generated/models/rename_context_request.rb +166 -0
- data/lib/temper/generated/models/requested.rb +189 -0
- data/lib/temper/generated/models/residual_bucket.rb +191 -0
- data/lib/temper/generated/models/residual_context.rb +201 -0
- data/lib/temper/generated/models/residual_groups.rb +193 -0
- data/lib/temper/generated/models/residual_owned_reach.rb +202 -0
- data/lib/temper/generated/models/resource_annotate_request.rb +261 -0
- data/lib/temper/generated/models/resource_create_request.rb +355 -0
- data/lib/temper/generated/models/resource_facet_row.rb +317 -0
- data/lib/temper/generated/models/resource_facets.rb +226 -0
- data/lib/temper/generated/models/resource_facets_response.rb +193 -0
- data/lib/temper/generated/models/resource_filter.rb +265 -0
- data/lib/temper/generated/models/resource_grant_body.rb +295 -0
- data/lib/temper/generated/models/resource_hit.rb +216 -0
- data/lib/temper/generated/models/resource_lineage.rb +224 -0
- data/lib/temper/generated/models/resource_list_response.rb +313 -0
- data/lib/temper/generated/models/resource_revoke_body.rb +191 -0
- data/lib/temper/generated/models/resource_section.rb +41 -0
- data/lib/temper/generated/models/resource_sort_field.rb +45 -0
- data/lib/temper/generated/models/resource_update_request.rb +379 -0
- data/lib/temper/generated/models/resource_view.rb +592 -0
- data/lib/temper/generated/models/restore_context_outcome.rb +274 -0
- data/lib/temper/generated/models/retire_context_outcome.rb +247 -0
- data/lib/temper/generated/models/return_spec.rb +189 -0
- data/lib/temper/generated/models/retype_relationship_request.rb +290 -0
- data/lib/temper/generated/models/revoke_outcome.rb +165 -0
- data/lib/temper/generated/models/revoked.rb +189 -0
- data/lib/temper/generated/models/reweight_relationship_request.rb +264 -0
- data/lib/temper/generated/models/score_kind.rb +104 -0
- data/lib/temper/generated/models/scoring.rb +192 -0
- data/lib/temper/generated/models/search_params.rb +254 -0
- data/lib/temper/generated/models/search_reason.rb +41 -0
- data/lib/temper/generated/models/search_response.rb +217 -0
- data/lib/temper/generated/models/search_result_row.rb +343 -0
- data/lib/temper/generated/models/search_scope.rb +41 -0
- data/lib/temper/generated/models/search_scope_info.rb +199 -0
- data/lib/temper/generated/models/segment_info.rb +200 -0
- data/lib/temper/generated/models/segmented_begin.rb +212 -0
- data/lib/temper/generated/models/segmented_begin_response.rb +247 -0
- data/lib/temper/generated/models/shape_declare_request.rb +315 -0
- data/lib/temper/generated/models/shape_emptiness.rb +42 -0
- data/lib/temper/generated/models/shape_view.rb +438 -0
- data/lib/temper/generated/models/share_context_outcome.rb +218 -0
- data/lib/temper/generated/models/share_context_request.rb +166 -0
- data/lib/temper/generated/models/slack_disconnect_request.rb +166 -0
- data/lib/temper/generated/models/slack_disconnect_response.rb +168 -0
- data/lib/temper/generated/models/slack_disconnected_principal.rb +269 -0
- data/lib/temper/generated/models/slice_request.rb +216 -0
- data/lib/temper/generated/models/sort_order.rb +40 -0
- data/lib/temper/generated/models/stage_disposition.rb +42 -0
- data/lib/temper/generated/models/stage_input.rb +105 -0
- data/lib/temper/generated/models/stage_input_one_of.rb +241 -0
- data/lib/temper/generated/models/stage_input_one_of1.rb +253 -0
- data/lib/temper/generated/models/stage_input_trace.rb +241 -0
- data/lib/temper/generated/models/stage_node.rb +105 -0
- data/lib/temper/generated/models/stage_output.rb +105 -0
- data/lib/temper/generated/models/stage_output_one_of.rb +217 -0
- data/lib/temper/generated/models/stage_output_one_of1.rb +217 -0
- data/lib/temper/generated/models/stage_relation.rb +40 -0
- data/lib/temper/generated/models/stage_result.rb +423 -0
- data/lib/temper/generated/models/stage_trace.rb +451 -0
- data/lib/temper/generated/models/standing.rb +43 -0
- data/lib/temper/generated/models/standing_shape.rb +355 -0
- data/lib/temper/generated/models/subscription.rb +267 -0
- data/lib/temper/generated/models/subscription_override.rb +193 -0
- data/lib/temper/generated/models/system_access_details.rb +206 -0
- data/lib/temper/generated/models/team_create_request.rb +217 -0
- data/lib/temper/generated/models/team_detail.rb +313 -0
- data/lib/temper/generated/models/team_invitation.rb +406 -0
- data/lib/temper/generated/models/team_member_detail.rb +265 -0
- data/lib/temper/generated/models/team_member_row.rb +265 -0
- data/lib/temper/generated/models/team_member_source.rb +40 -0
- data/lib/temper/generated/models/team_role.rb +42 -0
- data/lib/temper/generated/models/team_row.rb +287 -0
- data/lib/temper/generated/models/team_update_request.rb +159 -0
- data/lib/temper/generated/models/territory.rb +298 -0
- data/lib/temper/generated/models/territory_kind.rb +41 -0
- data/lib/temper/generated/models/territory_overview.rb +223 -0
- data/lib/temper/generated/models/unbind_team_outcome.rb +218 -0
- data/lib/temper/generated/models/unrecognized_standing.rb +215 -0
- data/lib/temper/generated/models/unshare_context_outcome.rb +218 -0
- data/lib/temper/generated/models/vault_config.rb +174 -0
- data/lib/temper/generated/models/via_entry.rb +305 -0
- data/lib/temper/generated/models/wide_arm.rb +252 -0
- data/lib/temper/generated/models/wide_hit.rb +193 -0
- data/lib/temper/generated/version.rb +15 -0
- data/lib/temper/generated.rb +402 -0
- data/lib/temper/refs.rb +36 -0
- data/lib/temper/resources.rb +68 -0
- data/lib/temper/validate.rb +127 -0
- data/lib/temper/version.rb +11 -0
- data/lib/temper.rb +47 -0
- metadata +525 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Temper
|
|
4
|
+
class Contexts
|
|
5
|
+
def initialize(client)
|
|
6
|
+
@client = client
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# POST /api/contexts -> 201 ContextRow.
|
|
10
|
+
#
|
|
11
|
+
# ContextCreateRequest's fields are `name` and `owner`; only `name` is
|
|
12
|
+
# required, and there is no `slug` on the wire -- the server derives it.
|
|
13
|
+
def create(name:, owner: nil)
|
|
14
|
+
attrs = { name: name }
|
|
15
|
+
attrs[:owner] = owner_ref(owner) unless owner.nil?
|
|
16
|
+
body = Generated::ContextCreateRequest.new(attrs)
|
|
17
|
+
@client.call { |api| Generated::ContextsApi.new(api).create_context(body) }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def list(**filters)
|
|
21
|
+
@client.call(idempotent: true) { |api| Generated::ContextsApi.new(api).list_contexts(filters) }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def show(ref)
|
|
25
|
+
id = Temper.parse_ref(ref)
|
|
26
|
+
@client.call(idempotent: true) { |api| Generated::ContextsApi.new(api).get_context(id) }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
# ContextOwnerRef is an externally-tagged serde enum mixing a unit variant
|
|
32
|
+
# with newtype variants, so it has no discriminator and the generated oneOf
|
|
33
|
+
# wrapper is best-effort by its own admission ("we do not attempt to check
|
|
34
|
+
# whether exactly one item matches"). We build the wire shape directly and
|
|
35
|
+
# let the generated model carry it: to_hash passes non-model values verbatim.
|
|
36
|
+
#
|
|
37
|
+
# Unencodable input is an error, never a guess.
|
|
38
|
+
def owner_ref(owner)
|
|
39
|
+
case owner
|
|
40
|
+
when :me, 'me' then 'Me'
|
|
41
|
+
when Hash then hash_owner_ref(owner)
|
|
42
|
+
else
|
|
43
|
+
raise ArgumentError, "owner must be :me, {team:}, or {profile:}, got #{owner.inspect}"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def hash_owner_ref(owner)
|
|
48
|
+
return { 'Team' => owner.fetch(:team) } if owner.key?(:team)
|
|
49
|
+
return { 'Profile' => owner.fetch(:profile) } if owner.key?(:profile)
|
|
50
|
+
|
|
51
|
+
raise ArgumentError, "owner Hash must carry :team or :profile, got #{owner.keys.inspect}"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'faraday'
|
|
4
|
+
require 'json'
|
|
5
|
+
require 'uri'
|
|
6
|
+
|
|
7
|
+
module Temper
|
|
8
|
+
# Two strategies behind one interface. Precedence is not discovered from the
|
|
9
|
+
# environment -- it is the caller's explicit choice. That avoids, structurally,
|
|
10
|
+
# the drift the steward's temper-auth.ts header documents: its schedules went
|
|
11
|
+
# Connect-first while its MCP connection went M2M-first, so on the Auth0-fronted
|
|
12
|
+
# prod instance the schedules' REST calls silently failed while MCP worked.
|
|
13
|
+
module Credentials
|
|
14
|
+
# A token the caller already holds -- a Puma request serving a signed-in user.
|
|
15
|
+
# No I/O, no refresh.
|
|
16
|
+
class BearerToken
|
|
17
|
+
def initialize(token)
|
|
18
|
+
raise ArgumentError, 'token must be a non-empty String' unless token.is_a?(String) && !token.empty?
|
|
19
|
+
|
|
20
|
+
@token = token
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
attr_reader :token
|
|
24
|
+
|
|
25
|
+
def refresh!
|
|
26
|
+
raise Unauthorized.new('BearerToken cannot refresh; mint a new token upstream', status: 401)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# A client_credentials machine principal -- a Sidekiq worker.
|
|
31
|
+
#
|
|
32
|
+
# Works against BOTH issuers a temper instance can be fronted by:
|
|
33
|
+
#
|
|
34
|
+
# * Auth0 (`temper admin machine provision`), where `token_url` is your Auth0
|
|
35
|
+
# tenant's /oauth/token and `audience` must equal the API's AUTH_AUDIENCE.
|
|
36
|
+
# * temper's own AS (`temper admin machine issue`, a `tmpr_*` client id), where
|
|
37
|
+
# `token_url` is your own instance's /oauth/token and `audience` is omitted --
|
|
38
|
+
# that AS mints with its server-side AS_AUDIENCE and ignores a request-supplied
|
|
39
|
+
# one entirely.
|
|
40
|
+
#
|
|
41
|
+
# Ported from packages/agent-workflows/steward/agent/lib/temper-auth.ts, the
|
|
42
|
+
# machine-principal caller already running in production: the same TEMPER_M2M_*
|
|
43
|
+
# inputs, `requireEnv` semantics (throw, never default), and a cache keyed on an
|
|
44
|
+
# ABSOLUTE expires_at with a 60s skew.
|
|
45
|
+
#
|
|
46
|
+
# Two deliberate divergences from that reference:
|
|
47
|
+
#
|
|
48
|
+
# * The cache is mutex-guarded. The steward's is a bare module global, sound
|
|
49
|
+
# only because a serverless function is single-threaded. Under Puma every
|
|
50
|
+
# in-flight thread races to mint at expiry.
|
|
51
|
+
# * #refresh! exists. Refresh-ahead-of-expiry alone is insufficient: the
|
|
52
|
+
# steward resolves a token once per tick, so a tick outliving its cached
|
|
53
|
+
# token takes a 401 nothing recovers. A Sidekiq job holding a token across
|
|
54
|
+
# a long unit of work has precisely that bug. Re-mint ON 401.
|
|
55
|
+
class ClientCredentials
|
|
56
|
+
SKEW_SECONDS = 60
|
|
57
|
+
TOKEN_REQUEST_CONTENT_TYPE = 'application/x-www-form-urlencoded'
|
|
58
|
+
|
|
59
|
+
# `audience` is optional because it is Auth0's, not the protocol's. Omit it for a
|
|
60
|
+
# temper-issued credential.
|
|
61
|
+
def initialize(token_url:, client_id:, client_secret:, audience: nil, clock: -> { Time.now },
|
|
62
|
+
allow_insecure_http: false)
|
|
63
|
+
# The client_secret goes on the wire to this URL on every mint, so the
|
|
64
|
+
# scheme is checked at construction -- refused here, not flagged per mint.
|
|
65
|
+
Validate.require_endpoint(token_url, name: 'token_url',
|
|
66
|
+
allow_insecure_http: allow_insecure_http)
|
|
67
|
+
@token_url = require_value(token_url, 'token_url')
|
|
68
|
+
@client_id = require_value(client_id, 'client_id')
|
|
69
|
+
@client_secret = require_value(client_secret, 'client_secret')
|
|
70
|
+
@audience = audience.nil? ? nil : require_value(audience, 'audience')
|
|
71
|
+
@clock = clock
|
|
72
|
+
@mutex = Mutex.new
|
|
73
|
+
@token = nil
|
|
74
|
+
@expires_at = nil
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def token
|
|
78
|
+
@mutex.synchronize do
|
|
79
|
+
mint! if expired?
|
|
80
|
+
@token
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def refresh!
|
|
85
|
+
@mutex.synchronize { mint! }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
private
|
|
89
|
+
|
|
90
|
+
def require_value(value, name)
|
|
91
|
+
raise ArgumentError, "#{name} must be a non-empty String" unless value.is_a?(String) && !value.empty?
|
|
92
|
+
|
|
93
|
+
value
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def expired?
|
|
97
|
+
@token.nil? || @clock.call.to_f >= (@expires_at - SKEW_SECONDS)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Caller holds @mutex.
|
|
101
|
+
def mint!
|
|
102
|
+
body = JSON.parse(post_token_request.body)
|
|
103
|
+
@token = body.fetch('access_token')
|
|
104
|
+
# Absolute, not relative: a duration cannot survive being cached.
|
|
105
|
+
@expires_at = @clock.call.to_f + body.fetch('expires_in').to_i
|
|
106
|
+
@token
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def post_token_request
|
|
110
|
+
response = Faraday.post(@token_url) do |req|
|
|
111
|
+
req.headers['Content-Type'] = TOKEN_REQUEST_CONTENT_TYPE
|
|
112
|
+
req.body = token_request_body
|
|
113
|
+
end
|
|
114
|
+
return response if response.success?
|
|
115
|
+
|
|
116
|
+
raise Unauthorized.new("token mint failed (#{response.status})",
|
|
117
|
+
status: response.status, details: response.body)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# RFC 6749 §4 mandates form encoding at the token endpoint. Auth0 also accepts
|
|
121
|
+
# JSON, which is why this sent JSON while Auth0 was the only issuer it faced --
|
|
122
|
+
# and why every test stayed green. Temper's own AS reads the body with
|
|
123
|
+
# `req.formData()`, so a JSON mint never reaches its client_credentials branch.
|
|
124
|
+
# Form-encoding is what both issuers accept.
|
|
125
|
+
def token_request_body
|
|
126
|
+
params = {
|
|
127
|
+
grant_type: 'client_credentials',
|
|
128
|
+
client_id: @client_id,
|
|
129
|
+
client_secret: @client_secret
|
|
130
|
+
}
|
|
131
|
+
# Auth0 requires it; temper's AS ignores a request-supplied audience and mints
|
|
132
|
+
# with its own AS_AUDIENCE. Sending an empty one would be a lie, so omit it.
|
|
133
|
+
params[:audience] = @audience unless @audience.nil?
|
|
134
|
+
URI.encode_www_form(params)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
|
|
5
|
+
module Temper
|
|
6
|
+
class Error < StandardError
|
|
7
|
+
attr_reader :status, :code, :details
|
|
8
|
+
|
|
9
|
+
def initialize(message = nil, status: nil, code: nil, details: nil)
|
|
10
|
+
super(message)
|
|
11
|
+
@status = status
|
|
12
|
+
@code = code
|
|
13
|
+
@details = details
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Let these escape: Sidekiq retries a job whose exception escapes.
|
|
18
|
+
class TransientError < Error; end
|
|
19
|
+
|
|
20
|
+
class RateLimited < TransientError
|
|
21
|
+
attr_reader :retry_after
|
|
22
|
+
|
|
23
|
+
def initialize(message = nil, retry_after: nil, **kwargs)
|
|
24
|
+
super(message, **kwargs)
|
|
25
|
+
@retry_after = retry_after
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class ServerError < TransientError; end
|
|
30
|
+
class ConnectionError < TransientError; end
|
|
31
|
+
|
|
32
|
+
# Rescue these: retrying will not help. Dead-letter them.
|
|
33
|
+
class PermanentError < Error; end
|
|
34
|
+
|
|
35
|
+
class Unauthorized < PermanentError; end
|
|
36
|
+
class Forbidden < PermanentError; end
|
|
37
|
+
|
|
38
|
+
# The one error whose `#details` is a typed payload rather than a free-form blob: the server
|
|
39
|
+
# says *why* it refused, so a worker can tell "never granted" from "granted and then revoked"
|
|
40
|
+
# without matching on the message string.
|
|
41
|
+
class SystemAccessRequired < Forbidden
|
|
42
|
+
# The refusal as a generated model — `Denied`, `Revoked`, `IllegalTransition`, and so on.
|
|
43
|
+
#
|
|
44
|
+
# `nil` means this build cannot name the refusal: either the server sent none (it predates the
|
|
45
|
+
# typed 403) or it sent a kind added after this gem was generated. Reach for #refusal_kind in
|
|
46
|
+
# that case — a name we cannot resolve is still worth logging.
|
|
47
|
+
def refusal
|
|
48
|
+
raw = refusal_hash
|
|
49
|
+
# The generated oneOf dispatcher matches on SYMBOL keys, because the ApiClient deserializes
|
|
50
|
+
# with symbolize_names. #details comes off the error envelope with string keys, and feeding
|
|
51
|
+
# those in resolves to nil SILENTLY — so the symbolize belongs here, once, not in every
|
|
52
|
+
# caller. The refusal payload is flat, so shallow is sufficient.
|
|
53
|
+
raw && Temper::Generated::Refusal.build(raw.transform_keys(&:to_sym))
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# The refusal's discriminator as the server sent it, resolvable or not.
|
|
57
|
+
def refusal_kind
|
|
58
|
+
refusal_hash&.fetch('kind', nil)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
def refusal_hash
|
|
64
|
+
return nil unless details.is_a?(Hash)
|
|
65
|
+
|
|
66
|
+
raw = details['refusal']
|
|
67
|
+
raw.is_a?(Hash) ? raw : nil
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
class NotFound < PermanentError; end
|
|
72
|
+
class Conflict < PermanentError; end
|
|
73
|
+
class BadRequest < PermanentError; end
|
|
74
|
+
|
|
75
|
+
# Translates the generated core's one flat ApiError into the tree above.
|
|
76
|
+
#
|
|
77
|
+
# The split is load-bearing rather than decorative: a 409 classified transient
|
|
78
|
+
# spins a Sidekiq job forever, and a 503 classified permanent is silently
|
|
79
|
+
# dropped.
|
|
80
|
+
module ErrorMapper
|
|
81
|
+
SYSTEM_ACCESS_REQUIRED = 'SYSTEM_ACCESS_REQUIRED'
|
|
82
|
+
|
|
83
|
+
# 422 is declared on no operation but is what a serde rejection surfaces as.
|
|
84
|
+
# 403 and 429 are not here: each needs more than the status to classify.
|
|
85
|
+
STATUS_CLASSES = {
|
|
86
|
+
400 => BadRequest,
|
|
87
|
+
401 => Unauthorized,
|
|
88
|
+
404 => NotFound,
|
|
89
|
+
409 => Conflict,
|
|
90
|
+
422 => BadRequest
|
|
91
|
+
}.freeze
|
|
92
|
+
|
|
93
|
+
module_function
|
|
94
|
+
|
|
95
|
+
def call(api_error)
|
|
96
|
+
status = api_error.code
|
|
97
|
+
code, message, details = parse_envelope(api_error.response_body)
|
|
98
|
+
# ApiError#message decorates itself with status/headers/body when it has
|
|
99
|
+
# them. A transport failure has none, so this fallback stays clean.
|
|
100
|
+
message ||= api_error.message
|
|
101
|
+
kwargs = { status: status, code: code, details: details }
|
|
102
|
+
|
|
103
|
+
# A nil status means the generated ApiClient rescued a Faraday transport
|
|
104
|
+
# failure (timeout / connection refused) and re-raised it code-less.
|
|
105
|
+
return ConnectionError.new(message, **kwargs) if status.nil?
|
|
106
|
+
|
|
107
|
+
build(status, message, code, kwargs, api_error)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def build(status, message, code, kwargs, api_error)
|
|
111
|
+
# 403 discriminates on error.code; 429 carries Retry-After. Everything else
|
|
112
|
+
# classifies off the status alone.
|
|
113
|
+
return forbidden(code, message, kwargs) if status == 403
|
|
114
|
+
return RateLimited.new(message, retry_after: retry_after_of(api_error), **kwargs) if status == 429
|
|
115
|
+
|
|
116
|
+
klass = STATUS_CLASSES[status] || (server_error?(status) ? ServerError : Error)
|
|
117
|
+
klass.new(message, **kwargs)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def server_error?(status)
|
|
121
|
+
(500..599).cover?(status)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def forbidden(code, message, kwargs)
|
|
125
|
+
return SystemAccessRequired.new(message, **kwargs) if code == SYSTEM_ACCESS_REQUIRED
|
|
126
|
+
|
|
127
|
+
Forbidden.new(message, **kwargs)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# The server speaks exactly one envelope: {"error":{code,message,details}}.
|
|
131
|
+
# Anything else -- an HTML 502 from a proxy, an undeclared 500 -- degrades to
|
|
132
|
+
# a raw body on #details rather than raising inside the error path.
|
|
133
|
+
#
|
|
134
|
+
# 422/429/500/503 are declared on NO operation, so those bodies are parsed
|
|
135
|
+
# opportunistically and classified off the raw HTTP status.
|
|
136
|
+
def parse_envelope(body)
|
|
137
|
+
return [nil, nil, nil] if body.nil? || body.to_s.empty?
|
|
138
|
+
|
|
139
|
+
parsed = JSON.parse(body.to_s)
|
|
140
|
+
error = parsed.is_a?(Hash) ? parsed['error'] : nil
|
|
141
|
+
return [nil, nil, body] unless error.is_a?(Hash)
|
|
142
|
+
|
|
143
|
+
[error['code'], error['message'], error['details']]
|
|
144
|
+
rescue JSON::ParserError
|
|
145
|
+
[nil, nil, body]
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def retry_after_of(api_error)
|
|
149
|
+
headers = api_error.response_headers || {}
|
|
150
|
+
raw = headers['Retry-After'] || headers['retry-after']
|
|
151
|
+
raw && Integer(raw, exception: false)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|