thinkwork-cli 0.12.11 → 0.12.15
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.
- package/README.md +42 -38
- package/dist/{api-client-ASJWIG3Z.js → api-client-4VT3FWOH.js} +1 -1
- package/dist/{chunk-JEHV35EU.js → chunk-H7AB42ES.js} +340 -30
- package/dist/cli.js +22157 -9229
- package/dist/commands/enterprise/templates/deploy-repo/.github/workflows/deploy.yml +17 -6
- package/dist/commands/enterprise/templates/deploy-repo/docs/runbook.md +81 -9
- package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +183 -21
- package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +1 -2
- package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +286 -0
- package/dist/drizzle/0000_petite_marvel_apes.sql +1188 -0
- package/dist/drizzle/0001_milky_surge.sql +103 -0
- package/dist/drizzle/0002_aberrant_mattie_franklin.sql +41 -0
- package/dist/drizzle/0003_exotic_ogun.sql +3 -0
- package/dist/drizzle/0004_glamorous_magneto.sql +2 -0
- package/dist/drizzle/0005_ancient_nocturne.sql +2 -0
- package/dist/drizzle/0006_new_colonel_america.sql +2 -0
- package/dist/drizzle/0007_unique_external_task_id.sql +31 -0
- package/dist/drizzle/0008_external_task_id_column.sql +43 -0
- package/dist/drizzle/0009_evaluations.sql +64 -0
- package/dist/drizzle/0010_eval_agent_template.sql +2 -0
- package/dist/drizzle/0011_eval_run_template.sql +2 -0
- package/dist/drizzle/0012_eval_seed_unique.sql +16 -0
- package/dist/drizzle/0013_motionless_white_queen.sql +140 -0
- package/dist/drizzle/0014_wiki_aggregation.sql +11 -0
- package/dist/drizzle/0015_pg_trgm_alias_title_indexes.sql +9 -0
- package/dist/drizzle/0016_wiki_schema_drops.sql +24 -0
- package/dist/drizzle/0017_wiki_places.sql +46 -0
- package/dist/drizzle/0018_agent_workspace_overlay.sql +26 -0
- package/dist/drizzle/0018_cool_firebird.sql +24 -0
- package/dist/drizzle/0018_skill_runs.sql +84 -0
- package/dist/drizzle/0019_condemned_dragon_man.sql +95 -0
- package/dist/drizzle/0019_webhook_skill_runs.sql +58 -0
- package/dist/drizzle/0020_crazy_the_anarchist.sql +9 -0
- package/dist/drizzle/0020_mutation_idempotency.sql +64 -0
- package/dist/drizzle/0021_crm_work_links.sql +76 -0
- package/dist/drizzle/0021_skill_runs_completion_hmac.sql +33 -0
- package/dist/drizzle/0022_add_billing_tables.sql +70 -0
- package/dist/drizzle/0022_seed_thinkwork_admin_permissions.sql +160 -0
- package/dist/drizzle/0022_stripe_billing_indexes.sql +48 -0
- package/dist/drizzle/0023_tenants_deactivation.sql +27 -0
- package/dist/drizzle/0024_tenant_mcp_admin_keys.sql +63 -0
- package/dist/drizzle/0025_v1_agent_architecture.sql +182 -0
- package/dist/drizzle/0026_thread_turns_add_kind.sql +28 -0
- package/dist/drizzle/0027_capability_catalog_and_manifests.sql +219 -0
- package/dist/drizzle/0028_aws_s3_extension.sql +26 -0
- package/dist/drizzle/0029_collapse_execution_types.sql +42 -0
- package/dist/drizzle/0030_retire_composition_primitives.sql +48 -0
- package/dist/drizzle/0031_thread_cleanup_drops.sql +131 -0
- package/dist/drizzle/0032_add_browser_automation_template_config.sql +24 -0
- package/dist/drizzle/0033_agent_operation_leases.sql +32 -0
- package/dist/drizzle/0034_agent_workspace_events.sql +116 -0
- package/dist/drizzle/0035_workspace_review_decisions.sql +19 -0
- package/dist/drizzle/0036_user_scoped_memory_wiki.sql +152 -0
- package/dist/drizzle/0037_user_profile_operating_model.sql +34 -0
- package/dist/drizzle/0042_agent_runtime_selector.sql +41 -0
- package/dist/drizzle/0043_wiki_search_tsv_tokenization.sql +48 -0
- package/dist/drizzle/0044_add_web_search_template_config.sql +7 -0
- package/dist/drizzle/0045_add_send_email_template_config.sql +7 -0
- package/dist/drizzle/0046_tenant_mcp_context_tools.sql +26 -0
- package/dist/drizzle/0047_add_context_engine_template_config.sql +7 -0
- package/dist/drizzle/0048_tenant_context_provider_settings.sql +22 -0
- package/dist/drizzle/0050_brain_v0_entity_subtype.sql +29 -0
- package/dist/drizzle/0051_brain_v0_tenant_entity_pages.sql +170 -0
- package/dist/drizzle/0052_brain_v0_external_refs.sql +41 -0
- package/dist/drizzle/0053_brain_v0_unresolved_mentions_subtype.sql +48 -0
- package/dist/drizzle/0054_wiki_compile_jobs_input.sql +28 -0
- package/dist/drizzle/0055_routines_stepfunctions_substrate.sql +202 -0
- package/dist/drizzle/0056_routine_step_events_dedup_idx.sql +25 -0
- package/dist/drizzle/0057_archive_legacy_python_routines.sql +36 -0
- package/dist/drizzle/0058_routines_visibility_and_owning_agent.sql +61 -0
- package/dist/drizzle/0061_routine_execution_asl_version_id.sql +29 -0
- package/dist/drizzle/0062_migrate_pi_to_flue.sql +110 -0
- package/dist/drizzle/0063_threads_session_data.sql +23 -0
- package/dist/drizzle/0064_tenant_credentials.sql +65 -0
- package/dist/drizzle/0067_thinkwork_computers_phase_one.sql +174 -0
- package/dist/drizzle/0068_drop_system_workflows_and_activation.sql +115 -0
- package/dist/drizzle/0069_compliance_schema.sql +364 -0
- package/dist/drizzle/0070_compliance_aurora_roles.sql +171 -0
- package/dist/drizzle/0072_threads_computer_ownership.sql +24 -0
- package/dist/drizzle/0073_compliance_tenant_anchor_state.sql +105 -0
- package/dist/drizzle/0074_compliance_event_hash_index.sql +49 -0
- package/dist/drizzle/0075_scheduled_jobs_computer_ownership.sql +27 -0
- package/dist/drizzle/0076_scheduled_jobs_marco_backfill.sql +69 -0
- package/dist/drizzle/0077_computers_primary_agent_id.sql +38 -0
- package/dist/drizzle/0078_tenant_customize_catalog.sql +46 -0
- package/dist/drizzle/0079_seed_tenant_customize_catalog.sql +53 -0
- package/dist/drizzle/0081_routines_catalog_slug.sql +42 -0
- package/dist/drizzle/0082_messages_parts_jsonb.sql +52 -0
- package/dist/drizzle/0083_computer_runbooks.sql +103 -0
- package/dist/drizzle/0084_artifacts_favorited_at.sql +32 -0
- package/dist/drizzle/0085_seed_thinkwork_computer_default_template.sql +46 -0
- package/dist/drizzle/0086_update_default_template_models.sql +19 -0
- package/dist/drizzle/0087_retire_oss_connectors.sql +77 -0
- package/dist/drizzle/0088_compliance_event_types_finance_pilot.sql +37 -0
- package/dist/drizzle/0089_remove_maniflow_eval_seeds.sql +81 -0
- package/dist/drizzle/0089_wiki_schema_extraction.sql +315 -0
- package/dist/drizzle/0090_brain_schema_extraction.sql +274 -0
- package/dist/drizzle/0091_drop_wiki_brain_compat_views.sql +118 -0
- package/dist/drizzle/0092_finish_oss_connector_retirement.sql +97 -0
- package/dist/drizzle/0093_eval_runs_scheduled_job_id.sql +23 -0
- package/dist/drizzle/0094_slack_workspace_app.sql +140 -0
- package/dist/drizzle/0095_eval_runs_computer_id.sql +22 -0
- package/dist/drizzle/0096_true_redteam_eval_seed_cleanup.sql +67 -0
- package/dist/drizzle/0097_shared_computers.sql +191 -0
- package/dist/drizzle/0098_business_ontology.sql +587 -0
- package/dist/drizzle/0099_thread_idle_learning.sql +145 -0
- package/dist/drizzle/0100_ontology_gated_brain_dynamic_subtypes.sql +7 -0
- package/dist/drizzle/0101_ontology_gated_unresolved_mentions_dynamic_subtypes.sql +7 -0
- package/dist/drizzle/0102_wiki_brain_owner_repair.sql +87 -0
- package/dist/drizzle/0103_brain_section_source_trigger_repair.sql +75 -0
- package/dist/drizzle/0104_expand_seed_ontology_for_user_memory.sql +166 -0
- package/dist/drizzle/0105_spaces_domain.sql +349 -0
- package/dist/drizzle/0106_expand_seed_ontology_for_triples.sql +173 -0
- package/dist/drizzle/0106_space_threads_participants.sql +197 -0
- package/dist/drizzle/0107_linked_task_mirror.sql +245 -0
- package/dist/drizzle/0108_message_mentions.sql +95 -0
- package/dist/drizzle/0109_space_owned_threads.sql +217 -0
- package/dist/drizzle/0110_thread_participant_read_state.sql +21 -0
- package/dist/drizzle/0111_agents_tenant_name_unique.sql +38 -0
- package/dist/drizzle/0112_recast_spaces_as_contextual_workrooms.sql +138 -0
- package/dist/drizzle/0113_agents_own_runtime_fields.sql +48 -0
- package/dist/drizzle/0114_migrate_templates_to_agents_and_spaces.sql +361 -0
- package/dist/drizzle/0115_remove_computer_eval_template_dependencies.sql +69 -0
- package/dist/drizzle/0116_backfill_thread_participants_access.sql +126 -0
- package/dist/drizzle/0117_space_access_mode.sql +40 -0
- package/dist/drizzle/0118_normalize_tenant_member_principal_type.sql +41 -0
- package/dist/drizzle/0119_space_knowledge_bases.sql +126 -0
- package/dist/drizzle/0120_space_automations.sql +58 -0
- package/dist/drizzle/0121_drop_computer_runbooks.sql +26 -0
- package/dist/drizzle/0122_space_email_triggers.sql +24 -0
- package/dist/drizzle/0123_single_platform_agent_and_overrides.sql +58 -0
- package/dist/drizzle/0124_thread_turns_finalized_at.sql +17 -0
- package/dist/drizzle/0125_drop_space_agent_assignments.sql +42 -0
- package/dist/drizzle/0126_migrate_flue_to_pi.sql +42 -0
- package/dist/drizzle/0127_runtime_type_observability.sql +28 -0
- package/dist/drizzle/0128_drop_eval_test_cases_agent_id.sql +37 -0
- package/dist/drizzle/0129_drop_code_factory_tables.sql +43 -0
- package/dist/drizzle/0129_eval_results_system_prompt.sql +30 -0
- package/dist/drizzle/0130_drop_teams_and_team_id_columns.sql +54 -0
- package/dist/drizzle/0131_drop_skill_catalog_and_tenant_skills.sql +33 -0
- package/dist/drizzle/0132_drop_computer_tables.sql +31 -0
- package/dist/drizzle/0133_drop_seed_view_tombstones.sql +79 -0
- package/dist/drizzle/0133_thread_turns_system_prompt.sql +22 -0
- package/dist/drizzle/0134_drop_dead_agent_runtime_tables.sql +53 -0
- package/dist/drizzle/0135_native_checklist_linked_tasks.sql +48 -0
- package/dist/drizzle/0136_goal_ledger.sql +55 -0
- package/dist/drizzle/0136_space_email_trigger_status.sql +66 -0
- package/dist/drizzle/0137_thread_participant_pins.sql +25 -0
- package/dist/drizzle/0138_users_cognito_sub.sql +30 -0
- package/dist/drizzle/0139_mobile_turn_client_id.sql +23 -0
- package/dist/drizzle/0140_workspace_folder_names.sql +36 -0
- package/dist/drizzle/0141_eval_runs_desktop_pi_provenance.sql +31 -0
- package/dist/drizzle/0142_pi_only_agent_runtime.sql +61 -0
- package/dist/drizzle/0143_add_web_extract_builtin_config.sql +28 -0
- package/dist/drizzle/0144_skill_catalog_index.sql +40 -0
- package/dist/drizzle/0145_knowledge_graph_thread_ingest.sql +512 -0
- package/dist/drizzle/0146_knowledge_graph_source_scope.sql +413 -0
- package/dist/drizzle/0147_knowledge_graph_scope_trigger_qualification.sql +211 -0
- package/dist/drizzle/0148_user_cost_attribution.sql +171 -0
- package/dist/drizzle/0149_managed_mcp_servers.sql +64 -0
- package/dist/drizzle/0149_user_model_approvals.sql +89 -0
- package/dist/drizzle/0150_bootstrap_first_admin_claim.sql +11 -0
- package/dist/drizzle/0151_managed_deployments.sql +91 -0
- package/dist/drizzle/0152_agent_profiles.sql +81 -0
- package/dist/drizzle/0153_message_mentions_agent_profile.sql +9 -0
- package/dist/drizzle/0154_customer_deployment_sessions.sql +61 -0
- package/dist/drizzle/0155_tenant_model_catalog.sql +152 -0
- package/dist/drizzle/0156_bootstrap_credential_leases.sql +52 -0
- package/dist/drizzle/0157_knowledge_graph_observations_source.sql +79 -0
- package/dist/drizzle/0158_pending_user_questions.sql +80 -0
- package/dist/drizzle/0158_wiki_tenant_scope.sql +38 -0
- package/dist/drizzle/0159_agent_profiles_space_local.sql +49 -0
- package/dist/drizzle/0159_application_plugins.sql +193 -0
- package/dist/drizzle/0159_eval_scoring_version.sql +46 -0
- package/dist/drizzle/0160_compliance_event_types_plugins.sql +37 -0
- package/dist/drizzle/0160_eval_datasets.sql +75 -0
- package/dist/drizzle/0160_eval_results_thread_turn.sql +35 -0
- package/dist/drizzle/0161_eval_run_pinning.sql +54 -0
- package/dist/drizzle/0161_tenant_mcp_servers_plugin_source.sql +62 -0
- package/dist/drizzle/0162_eval_result_override.sql +49 -0
- package/dist/drizzle/0163_eval_replay_tool_allowlist.sql +50 -0
- package/dist/drizzle/0164_eval_replay_tool_override_mode.sql +52 -0
- package/dist/drizzle/0165_plugin_premium_entitlements.sql +153 -0
- package/dist/drizzle/0166_company_brain_substrate_contract.sql +386 -0
- package/dist/drizzle/0167_company_brain_artifact_manifest_runtime.sql +85 -0
- package/dist/drizzle/0168_eval_skill_gate.sql +44 -0
- package/dist/drizzle/0169_release_update_jobs.sql +67 -0
- package/dist/drizzle/0170_email_channel_plugin.sql +291 -0
- package/dist/drizzle/0171_linked_task_external_providers.sql +30 -0
- package/dist/drizzle/0172_email_channel_sendgrid_provider.sql +8 -0
- package/dist/drizzle/0173_auth_provider_resources.sql +83 -0
- package/dist/drizzle/0174_workos_auth_bridges.sql +37 -0
- package/dist/drizzle/0175_workos_auth_sessions.sql +38 -0
- package/dist/drizzle/0176_n8n_agent_step_runs.sql +107 -0
- package/dist/drizzle/0177_workflow_control_plane.sql +281 -0
- package/dist/drizzle/0178_workflow_backfill_existing_routines.sql +525 -0
- package/dist/drizzle/0179_tenant_goal_budget_settings.sql +21 -0
- package/dist/drizzle/0180_skill_drafts.sql +89 -0
- package/dist/drizzle/0181_skill_draft_publish_status.sql +21 -0
- package/dist/drizzle/0182_agent_loops.sql +260 -0
- package/dist/drizzle/0183_okf_artifact_manifests.sql +52 -0
- package/dist/drizzle/0184_skill_catalog_trust_cache.sql +35 -0
- package/dist/drizzle/0185_agent_loop_space.sql +16 -0
- package/dist/drizzle/0186_tenant_mcp_runtime_metadata.sql +10 -0
- package/dist/drizzle/0187_native_work_items.sql +220 -0
- package/dist/drizzle/0188_company_etl_plugin_rename.sql +99 -0
- package/dist/drizzle/0189_trace_cost_substrate.sql +247 -0
- package/dist/drizzle/0190_billing_export_reconciliation.sql +101 -0
- package/dist/drizzle/0191_open_engine_work_item_queue.sql +66 -0
- package/dist/drizzle/0192_work_item_labels.sql +44 -0
- package/dist/drizzle/0193_work_item_documents.sql +31 -0
- package/dist/drizzle/0194_memory_retain_attempts.sql +103 -0
- package/dist/drizzle/0194_work_item_comments.sql +35 -0
- package/dist/drizzle/0195_plugin_app_overlays.sql +45 -0
- package/dist/drizzle/0196_pi_extensions.sql +118 -0
- package/dist/drizzle/0197_eval_profiles.sql +150 -0
- package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
- package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
- package/dist/drizzle/meta/_journal.json +160 -0
- package/dist/plugins/README.md +162 -0
- package/dist/plugins/catalog/package.json +40 -0
- package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
- package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
- package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
- package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
- package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
- package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
- package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
- package/dist/plugins/catalog/src/catalog.ts +434 -0
- package/dist/plugins/catalog/src/contracts.ts +1498 -0
- package/dist/plugins/catalog/src/index.ts +4 -0
- package/dist/plugins/catalog/src/plugin-package.ts +171 -0
- package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
- package/dist/plugins/catalog/src/registry/index.ts +1 -0
- package/dist/plugins/catalog/tsconfig.json +8 -0
- package/dist/plugins/company-brain/README.md +37 -0
- package/dist/plugins/company-brain/package.json +33 -0
- package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
- package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
- package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
- package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
- package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
- package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
- package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
- package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
- package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
- package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
- package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
- package/dist/plugins/company-brain/src/api/migration.ts +665 -0
- package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
- package/dist/plugins/company-brain/src/index.ts +62 -0
- package/dist/plugins/company-brain/src/manifest.ts +112 -0
- package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
- package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
- package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
- package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
- package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
- package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
- package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
- package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
- package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
- package/dist/plugins/company-brain/tsconfig.json +8 -0
- package/dist/plugins/company-data/README.md +49 -0
- package/dist/plugins/company-data/package.json +21 -0
- package/dist/plugins/company-data/src/index.ts +30 -0
- package/dist/plugins/company-data/src/manifest.ts +26 -0
- package/dist/plugins/company-data/test/manifest.test.ts +116 -0
- package/dist/plugins/company-data/tsconfig.json +8 -0
- package/dist/plugins/company-etl/README.md +46 -0
- package/dist/plugins/company-etl/package.json +21 -0
- package/dist/plugins/company-etl/src/index.ts +29 -0
- package/dist/plugins/company-etl/src/manifest.ts +26 -0
- package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
- package/dist/plugins/company-etl/tsconfig.json +8 -0
- package/dist/plugins/email-channel/README.md +41 -0
- package/dist/plugins/email-channel/package.json +22 -0
- package/dist/plugins/email-channel/src/index.ts +36 -0
- package/dist/plugins/email-channel/src/manifest.ts +44 -0
- package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
- package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
- package/dist/plugins/email-channel/tsconfig.json +8 -0
- package/dist/plugins/lastmile/README.md +50 -0
- package/dist/plugins/lastmile/package.json +23 -0
- package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
- package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
- package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
- package/dist/plugins/lastmile/src/index.ts +46 -0
- package/dist/plugins/lastmile/src/manifest.ts +139 -0
- package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
- package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
- package/dist/plugins/lastmile/tsconfig.json +8 -0
- package/dist/plugins/n8n/README.md +201 -0
- package/dist/plugins/n8n/n8n-app/README.md +33 -0
- package/dist/plugins/n8n/n8n-app/package.json +23 -0
- package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
- package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
- package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
- package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
- package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
- package/dist/plugins/n8n/package.json +35 -0
- package/dist/plugins/n8n/runtime/Dockerfile +18 -0
- package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
- package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
- package/dist/plugins/n8n/runtime/package-lock.json +13 -0
- package/dist/plugins/n8n/runtime/package.json +7 -0
- package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
- package/dist/plugins/n8n/smoke/README.md +95 -0
- package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
- package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
- package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
- package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
- package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
- package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
- package/dist/plugins/n8n/src/index.ts +79 -0
- package/dist/plugins/n8n/src/manifest.ts +403 -0
- package/dist/plugins/n8n/src/package-config.ts +186 -0
- package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
- package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
- package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
- package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
- package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
- package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
- package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
- package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
- package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
- package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
- package/dist/plugins/n8n/test/image-build.test.ts +118 -0
- package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
- package/dist/plugins/n8n/test/manifest.test.ts +278 -0
- package/dist/plugins/n8n/test/package-config.test.ts +57 -0
- package/dist/plugins/n8n/tsconfig.json +8 -0
- package/dist/plugins/sendgrid/README.md +30 -0
- package/dist/plugins/sendgrid/package.json +22 -0
- package/dist/plugins/sendgrid/src/index.ts +36 -0
- package/dist/plugins/sendgrid/src/manifest.ts +37 -0
- package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
- package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
- package/dist/plugins/sendgrid/tsconfig.json +8 -0
- package/dist/plugins/twenty/README.md +78 -0
- package/dist/plugins/twenty/package.json +27 -0
- package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
- package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
- package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
- package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
- package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
- package/dist/plugins/twenty/src/api/cutover.ts +209 -0
- package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
- package/dist/plugins/twenty/src/index.ts +55 -0
- package/dist/plugins/twenty/src/manifest.ts +259 -0
- package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
- package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
- package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
- package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
- package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
- package/dist/plugins/twenty/test/manifest.test.ts +463 -0
- package/dist/plugins/twenty/tsconfig.json +9 -0
- package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
- package/dist/plugins/twenty/twenty-app/README.md +148 -0
- package/dist/plugins/twenty/twenty-app/package.json +30 -0
- package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
- package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
- package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
- package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
- package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
- package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
- package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
- package/dist/plugins/workos-auth/package.json +22 -0
- package/dist/plugins/workos-auth/src/index.ts +30 -0
- package/dist/plugins/workos-auth/src/manifest.ts +40 -0
- package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
- package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
- package/dist/plugins/workos-auth/tsconfig.json +8 -0
- package/dist/scripts/bootstrap-workspace.sh +162 -0
- package/dist/scripts/post-deploy.sh +290 -0
- package/dist/terraform/examples/greenfield/main.tf +903 -75
- package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
- package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
- package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
- package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
- package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
- package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
- package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
- package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
- package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
- package/dist/terraform/modules/app/agentcore-pi/main.tf +453 -0
- package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
- package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
- package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
- package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
- package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
- package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
- package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
- package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
- package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
- package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
- package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
- package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
- package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
- package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
- package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
- package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
- package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
- package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
- package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
- package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
- package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
- package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
- package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
- package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
- package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
- package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
- package/dist/terraform/modules/app/ses-email/main.tf +143 -30
- package/dist/terraform/modules/app/static-site/main.tf +4 -3
- package/dist/terraform/modules/app/www-dns/main.tf +45 -5
- package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
- package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
- package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
- package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
- package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
- package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
- package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
- package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
- package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
- package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
- package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
- package/dist/terraform/modules/thinkwork/README.md +71 -0
- package/dist/terraform/modules/thinkwork/main.tf +1325 -174
- package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
- package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
- package/dist/terraform/schema.graphql +82 -9
- package/dist/workspace-defaults/files/AGENTS.md +344 -0
- package/dist/workspace-defaults/files/CONTEXT.md +8 -0
- package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
- package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
- package/dist/workspace-defaults/files/ROUTER.md +24 -0
- package/dist/workspace-defaults/files/SPACE.md +62 -0
- package/dist/workspace-defaults/files/TOOLS.md +65 -0
- package/dist/workspace-defaults/files/USER.md +40 -0
- package/dist/workspace-defaults/files/mcp.json +3 -0
- package/dist/workspace-defaults/files/memory/contacts.md +13 -0
- package/dist/workspace-defaults/files/memory/lessons.md +13 -0
- package/dist/workspace-defaults/files/memory/preferences.md +12 -0
- package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
- package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
- package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
- package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
- package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
- package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
- package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
- package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
- package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
- package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
- package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
- package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
- package/package.json +1 -1
- package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
- package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
- package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
- package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
- package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
- package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
- package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
- package/dist/terraform/modules/app/computer-runtime/variables.tf +0 -66
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
validatePluginManifest,
|
|
7
|
+
type PluginComponentType,
|
|
8
|
+
} from "@thinkwork/plugin-catalog/contracts";
|
|
9
|
+
import { defineFirstPartyPluginPackage } from "@thinkwork/plugin-catalog/plugin-package";
|
|
10
|
+
|
|
11
|
+
import { companyDataPluginPackage } from "../src";
|
|
12
|
+
import {
|
|
13
|
+
COMPANY_DATA_SETTINGS_SURFACE,
|
|
14
|
+
companyDataManifest,
|
|
15
|
+
} from "../src/manifest";
|
|
16
|
+
|
|
17
|
+
describe("ThinkWork Data Warehouse plugin manifest", () => {
|
|
18
|
+
it("validates as an inert shell plugin", () => {
|
|
19
|
+
const validated = validatePluginManifest(companyDataManifest);
|
|
20
|
+
|
|
21
|
+
expect(validated.pluginKey).toBe("company-data");
|
|
22
|
+
expect(validated.displayName).toBe("ThinkWork Data Warehouse");
|
|
23
|
+
expect(validated.versions[0].version).toBe("0.1.0");
|
|
24
|
+
expect(validated.versions[0].requiredOauthScopes).toEqual([]);
|
|
25
|
+
expect(validated.versions[0].capabilities).toEqual([]);
|
|
26
|
+
expect(validated.versions[0].components).toEqual([
|
|
27
|
+
{
|
|
28
|
+
type: "ui-surface",
|
|
29
|
+
key: "settings",
|
|
30
|
+
displayName: "ThinkWork Data Warehouse settings",
|
|
31
|
+
intendedMount: COMPANY_DATA_SETTINGS_SURFACE,
|
|
32
|
+
},
|
|
33
|
+
]);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("does not declare side-effecting components, OAuth scopes, or secrets", () => {
|
|
37
|
+
const version = companyDataManifest.versions[0];
|
|
38
|
+
const componentTypes = version.components.map(
|
|
39
|
+
(component) => component.type as PluginComponentType,
|
|
40
|
+
);
|
|
41
|
+
const serializedManifest = JSON.stringify(companyDataManifest);
|
|
42
|
+
|
|
43
|
+
expect(componentTypes).toEqual(["ui-surface"]);
|
|
44
|
+
expect(componentTypes).not.toContain("infrastructure");
|
|
45
|
+
expect(componentTypes).not.toContain("mcp-server");
|
|
46
|
+
expect(componentTypes).not.toContain("skills");
|
|
47
|
+
expect(version.requiredOauthScopes).toEqual([]);
|
|
48
|
+
expect(serializedManifest).not.toMatch(
|
|
49
|
+
/https?:\/\/|\.invalid|terraform|managedAppKey|endpointUrl|endpointFrom|credential|secret|skillMd/i,
|
|
50
|
+
);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("keeps customer-facing copy on the governed operational facts scope", () => {
|
|
54
|
+
const customerFacingText = [
|
|
55
|
+
companyDataManifest.displayName,
|
|
56
|
+
companyDataManifest.description,
|
|
57
|
+
...companyDataManifest.versions[0].components.map(
|
|
58
|
+
(component) => component.displayName,
|
|
59
|
+
),
|
|
60
|
+
].join("\n");
|
|
61
|
+
|
|
62
|
+
expect(customerFacingText).toContain("ThinkWork Data Warehouse");
|
|
63
|
+
expect(customerFacingText).toContain("governed operational facts");
|
|
64
|
+
expect(customerFacingText).toContain("agent and UI reads");
|
|
65
|
+
expect(customerFacingText).toContain(
|
|
66
|
+
"later ThinkWork Data Warehouse releases",
|
|
67
|
+
);
|
|
68
|
+
expect(customerFacingText).not.toContain("Company Data");
|
|
69
|
+
expect(customerFacingText).not.toMatch(
|
|
70
|
+
/\b(stores?|loads?)\s+every\s+operational\s+row\s+in\s+Company\s+Brain/i,
|
|
71
|
+
);
|
|
72
|
+
expect(customerFacingText).not.toMatch(
|
|
73
|
+
/\b(deploys?|provides?|operates?)\s+(analytics|BI|dashboards?|lakehouse query|ELT jobs?|extraction runners?|projection databases?)/i,
|
|
74
|
+
);
|
|
75
|
+
expect(customerFacingText).not.toMatch(
|
|
76
|
+
/\b(replaces?|mutates?|writes? back to)\s+source systems?/i,
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("defines a first-party package boundary under plugins/company-data", () => {
|
|
81
|
+
const defined = defineFirstPartyPluginPackage(companyDataPluginPackage);
|
|
82
|
+
|
|
83
|
+
expect(defined.packageKey).toBe("company-data");
|
|
84
|
+
expect(defined.sourceRoot).toBe("plugins/company-data");
|
|
85
|
+
expect(defined.ownedSources).toContainEqual({
|
|
86
|
+
kind: "manifest",
|
|
87
|
+
path: "plugins/company-data/src/manifest.ts",
|
|
88
|
+
description:
|
|
89
|
+
"Company Data catalog manifest for the shell-only plugin identity.",
|
|
90
|
+
});
|
|
91
|
+
expect(defined.ownedSources).toContainEqual({
|
|
92
|
+
kind: "tests",
|
|
93
|
+
path: "plugins/company-data/test",
|
|
94
|
+
description:
|
|
95
|
+
"Company Data package-local manifest and shell-boundary tests.",
|
|
96
|
+
});
|
|
97
|
+
expect(defined.compatibilityLinks).toEqual([]);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("documents deferred resource deployment for future implementers", () => {
|
|
101
|
+
const readmePath = fileURLToPath(new URL("../README.md", import.meta.url));
|
|
102
|
+
const readme = readFileSync(readmePath, "utf8");
|
|
103
|
+
|
|
104
|
+
expect(readme).toContain("intentionally does not deploy");
|
|
105
|
+
expect(readme).toContain("extraction runners");
|
|
106
|
+
expect(readme).toContain("projection database");
|
|
107
|
+
expect(readme).toContain("mapping workflows");
|
|
108
|
+
expect(readme).toContain("MCP");
|
|
109
|
+
expect(readme).toContain("Context Engine providers");
|
|
110
|
+
expect(readme).toContain("credentials");
|
|
111
|
+
expect(readme).toContain("analytics UI");
|
|
112
|
+
expect(readme).toContain("BI");
|
|
113
|
+
expect(readme).toContain("source-system writes");
|
|
114
|
+
expect(readme).toContain("Terraform-managed resources");
|
|
115
|
+
});
|
|
116
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Company ETL Plugin
|
|
2
|
+
|
|
3
|
+
The Company ETL plugin is the package-owned source boundary for the first-party
|
|
4
|
+
ETL integration shell. This slice publishes the stable catalog
|
|
5
|
+
identity and normal ThinkWork install path before any live integration runtime
|
|
6
|
+
exists.
|
|
7
|
+
|
|
8
|
+
The shell intentionally does not deploy connector runtime, ETL jobs, schedules,
|
|
9
|
+
pipelines, MCP servers, skills, credentials, datalake, warehouse, query,
|
|
10
|
+
monitoring, analytics UI, BI, bucket, warehouse, or Terraform-managed resources.
|
|
11
|
+
Future Company ETL work should extend this `company-etl` package and version
|
|
12
|
+
line with explicit requirements, handler-backed components, and deployed
|
|
13
|
+
verification before introducing runtime capability.
|
|
14
|
+
|
|
15
|
+
## Owned Source
|
|
16
|
+
|
|
17
|
+
- `src/manifest.ts` declares the catalog manifest with empty OAuth scopes,
|
|
18
|
+
no capabilities, and one declared-only `ui-surface` component.
|
|
19
|
+
- `test/manifest.test.ts` validates the shell boundary, manifest shape,
|
|
20
|
+
customer-facing integration copy, and deferred-resource language.
|
|
21
|
+
|
|
22
|
+
## Shell Scope
|
|
23
|
+
|
|
24
|
+
V1 is deliberately narrow:
|
|
25
|
+
|
|
26
|
+
- Company ETL appears in the first-party plugin catalog as
|
|
27
|
+
`company-etl@0.1.0`.
|
|
28
|
+
- Tenant administrators can install the shell through the normal plugin
|
|
29
|
+
install flow.
|
|
30
|
+
- The plugin engine records only the install and one no-op UI-surface component
|
|
31
|
+
with an empty handler reference.
|
|
32
|
+
- Live connector runtime, ETL jobs, schedules, pipelines, MCP servers, skills,
|
|
33
|
+
credentials, analytics UI, BI, lakehouse query UI, and infrastructure are
|
|
34
|
+
deferred follow-up work.
|
|
35
|
+
|
|
36
|
+
## Verification Notes
|
|
37
|
+
|
|
38
|
+
Package-local verification:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pnpm --filter @thinkwork/plugin-company-etl test
|
|
42
|
+
pnpm --filter @thinkwork/plugin-company-etl typecheck
|
|
43
|
+
pnpm --filter @thinkwork/plugin-catalog test
|
|
44
|
+
pnpm --filter @thinkwork/plugin-catalog typecheck
|
|
45
|
+
node scripts/verify-plugin-source-boundary.mjs
|
|
46
|
+
```
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@thinkwork/plugin-company-etl",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./src/index.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./src/index.ts",
|
|
9
|
+
"./manifest": "./src/manifest.ts"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc --build",
|
|
13
|
+
"typecheck": "tsc --noEmit",
|
|
14
|
+
"test": "vitest run"
|
|
15
|
+
},
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@thinkwork/plugin-catalog": "workspace:*",
|
|
18
|
+
"typescript": "^5.5.0",
|
|
19
|
+
"vitest": "^2.0.0"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { companyEtlManifest } from "./manifest";
|
|
2
|
+
|
|
3
|
+
export const companyEtlPluginPackage = {
|
|
4
|
+
packageKey: "company-etl",
|
|
5
|
+
sourceRoot: "plugins/company-etl",
|
|
6
|
+
manifest: companyEtlManifest,
|
|
7
|
+
ownedSources: [
|
|
8
|
+
{
|
|
9
|
+
kind: "manifest",
|
|
10
|
+
path: "plugins/company-etl/src/manifest.ts",
|
|
11
|
+
description:
|
|
12
|
+
"Company ETL catalog manifest for the shell-only plugin identity.",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
kind: "docs",
|
|
16
|
+
path: "plugins/company-etl/README.md",
|
|
17
|
+
description: "Company ETL package ownership and deferred resource notes.",
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
kind: "tests",
|
|
21
|
+
path: "plugins/company-etl/test",
|
|
22
|
+
description:
|
|
23
|
+
"Company ETL package-local manifest and shell-boundary tests.",
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
compatibilityLinks: [],
|
|
27
|
+
} as const;
|
|
28
|
+
|
|
29
|
+
export { companyEtlManifest };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { PluginManifest } from "@thinkwork/plugin-catalog/contracts";
|
|
2
|
+
|
|
3
|
+
export const COMPANY_ETL_SETTINGS_SURFACE =
|
|
4
|
+
"settings.plugins.detail.tab" as const;
|
|
5
|
+
|
|
6
|
+
export const companyEtlManifest = {
|
|
7
|
+
pluginKey: "company-etl",
|
|
8
|
+
displayName: "ThinkWork ETL",
|
|
9
|
+
description:
|
|
10
|
+
"Provides the tenant-managed ETL shell for moving data between SaaS apps, databases, and agent-accessible systems. Analytics dashboards, BI, warehouse query UI, and ThinkWork Data Warehouse projection behavior belong to separate plugins.",
|
|
11
|
+
versions: [
|
|
12
|
+
{
|
|
13
|
+
version: "0.1.0",
|
|
14
|
+
requiredOauthScopes: [],
|
|
15
|
+
capabilities: [],
|
|
16
|
+
components: [
|
|
17
|
+
{
|
|
18
|
+
type: "ui-surface",
|
|
19
|
+
key: "settings",
|
|
20
|
+
displayName: "ThinkWork ETL settings",
|
|
21
|
+
intendedMount: COMPANY_ETL_SETTINGS_SURFACE,
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
} satisfies PluginManifest;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
validatePluginManifest,
|
|
7
|
+
type PluginComponentType,
|
|
8
|
+
} from "@thinkwork/plugin-catalog/contracts";
|
|
9
|
+
import { defineFirstPartyPluginPackage } from "@thinkwork/plugin-catalog/plugin-package";
|
|
10
|
+
|
|
11
|
+
import { companyEtlPluginPackage } from "../src";
|
|
12
|
+
import {
|
|
13
|
+
COMPANY_ETL_SETTINGS_SURFACE,
|
|
14
|
+
companyEtlManifest,
|
|
15
|
+
} from "../src/manifest";
|
|
16
|
+
|
|
17
|
+
describe("ThinkWork ETL plugin manifest", () => {
|
|
18
|
+
it("validates as an inert shell plugin", () => {
|
|
19
|
+
const validated = validatePluginManifest(companyEtlManifest);
|
|
20
|
+
|
|
21
|
+
expect(validated.pluginKey).toBe("company-etl");
|
|
22
|
+
expect(validated.displayName).toBe("ThinkWork ETL");
|
|
23
|
+
expect(validated.versions[0].version).toBe("0.1.0");
|
|
24
|
+
expect(validated.versions[0].requiredOauthScopes).toEqual([]);
|
|
25
|
+
expect(validated.versions[0].capabilities).toEqual([]);
|
|
26
|
+
expect(validated.versions[0].components).toEqual([
|
|
27
|
+
{
|
|
28
|
+
type: "ui-surface",
|
|
29
|
+
key: "settings",
|
|
30
|
+
displayName: "ThinkWork ETL settings",
|
|
31
|
+
intendedMount: COMPANY_ETL_SETTINGS_SURFACE,
|
|
32
|
+
},
|
|
33
|
+
]);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("does not declare side-effecting components, OAuth scopes, or secrets", () => {
|
|
37
|
+
const version = companyEtlManifest.versions[0];
|
|
38
|
+
const componentTypes = version.components.map(
|
|
39
|
+
(component) => component.type as PluginComponentType,
|
|
40
|
+
);
|
|
41
|
+
const serializedManifest = JSON.stringify(companyEtlManifest);
|
|
42
|
+
|
|
43
|
+
expect(componentTypes).toEqual(["ui-surface"]);
|
|
44
|
+
expect(componentTypes).not.toContain("infrastructure");
|
|
45
|
+
expect(componentTypes).not.toContain("mcp-server");
|
|
46
|
+
expect(componentTypes).not.toContain("skills");
|
|
47
|
+
expect(version.requiredOauthScopes).toEqual([]);
|
|
48
|
+
expect(serializedManifest).not.toMatch(
|
|
49
|
+
/https?:\/\/|\.invalid|terraform|managedAppKey|endpointUrl|endpointFrom|credential|secret|skillMd/i,
|
|
50
|
+
);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("keeps customer-facing copy on the ETL integration scope", () => {
|
|
54
|
+
const customerFacingText = [
|
|
55
|
+
companyEtlManifest.displayName,
|
|
56
|
+
companyEtlManifest.description,
|
|
57
|
+
...companyEtlManifest.versions[0].components.map(
|
|
58
|
+
(component) => component.displayName,
|
|
59
|
+
),
|
|
60
|
+
].join("\n");
|
|
61
|
+
|
|
62
|
+
expect(customerFacingText).toContain("ThinkWork ETL");
|
|
63
|
+
expect(customerFacingText).toContain("tenant-managed ETL shell");
|
|
64
|
+
expect(customerFacingText).toContain("SaaS apps");
|
|
65
|
+
expect(customerFacingText).toContain("agent-accessible systems");
|
|
66
|
+
expect(customerFacingText).toContain("ThinkWork Data Warehouse projection");
|
|
67
|
+
expect(customerFacingText).toContain("separate plugins");
|
|
68
|
+
expect(customerFacingText).not.toContain("Company ETL");
|
|
69
|
+
expect(customerFacingText).not.toContain("Company Data");
|
|
70
|
+
expect(customerFacingText).not.toMatch(
|
|
71
|
+
/\b(deploys?|provides?|operates?)\s+(analytics|BI|dashboards?|lakehouse query)/i,
|
|
72
|
+
);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("defines a first-party package boundary under plugins/company-etl", () => {
|
|
76
|
+
const defined = defineFirstPartyPluginPackage(companyEtlPluginPackage);
|
|
77
|
+
|
|
78
|
+
expect(defined.packageKey).toBe("company-etl");
|
|
79
|
+
expect(defined.sourceRoot).toBe("plugins/company-etl");
|
|
80
|
+
expect(defined.ownedSources).toContainEqual({
|
|
81
|
+
kind: "manifest",
|
|
82
|
+
path: "plugins/company-etl/src/manifest.ts",
|
|
83
|
+
description:
|
|
84
|
+
"Company ETL catalog manifest for the shell-only plugin identity.",
|
|
85
|
+
});
|
|
86
|
+
expect(defined.ownedSources).toContainEqual({
|
|
87
|
+
kind: "tests",
|
|
88
|
+
path: "plugins/company-etl/test",
|
|
89
|
+
description:
|
|
90
|
+
"Company ETL package-local manifest and shell-boundary tests.",
|
|
91
|
+
});
|
|
92
|
+
expect(defined.compatibilityLinks).toEqual([]);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("documents deferred resource deployment for future implementers", () => {
|
|
96
|
+
const readmePath = fileURLToPath(new URL("../README.md", import.meta.url));
|
|
97
|
+
const readme = readFileSync(readmePath, "utf8");
|
|
98
|
+
|
|
99
|
+
expect(readme).toContain("intentionally does not deploy");
|
|
100
|
+
expect(readme).toContain("connector runtime");
|
|
101
|
+
expect(readme).toContain("ETL jobs");
|
|
102
|
+
expect(readme).toContain("analytics UI");
|
|
103
|
+
expect(readme).toContain("BI");
|
|
104
|
+
expect(readme).toContain("warehouse");
|
|
105
|
+
expect(readme).toContain("MCP");
|
|
106
|
+
expect(readme).toContain("Terraform-managed resources");
|
|
107
|
+
});
|
|
108
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Resend Channel Plugin
|
|
2
|
+
|
|
3
|
+
The Resend Channel plugin is the package-owned source boundary for the
|
|
4
|
+
Resend-backed tenant-owned agent and Space email channel. V1 recommends Resend
|
|
5
|
+
for new tenant-owned email channels and keeps SES as the AWS-native
|
|
6
|
+
compatibility provider while shared platform code owns installation, settings
|
|
7
|
+
GraphQL, database state, provider execution, and runtime gates.
|
|
8
|
+
|
|
9
|
+
SendGrid is intentionally represented by its own `@thinkwork/plugin-sendgrid`
|
|
10
|
+
package so operators see it as a separate installable provider in the plugin
|
|
11
|
+
catalog.
|
|
12
|
+
|
|
13
|
+
## Owned Source
|
|
14
|
+
|
|
15
|
+
- `src/manifest.ts` declares the catalog manifest and email-channel capability.
|
|
16
|
+
- `src/provider-contract.ts` holds provider keys and channel contract metadata
|
|
17
|
+
that package-local tests and shared platform code can import without reaching
|
|
18
|
+
into the manifest shape.
|
|
19
|
+
- `test/manifest.test.ts` validates provider scope, settings surface, and
|
|
20
|
+
package descriptor boundaries.
|
|
21
|
+
|
|
22
|
+
## Provider Scope
|
|
23
|
+
|
|
24
|
+
V1 provider options are deliberately narrow:
|
|
25
|
+
|
|
26
|
+
- Resend is recommended for new tenant-owned email channels.
|
|
27
|
+
- SES remains the AWS-native compatibility and migration provider.
|
|
28
|
+
- SendGrid, SMTP, Postmark, Mailgun, and other providers are separate or
|
|
29
|
+
deferred packages.
|
|
30
|
+
|
|
31
|
+
## Verification Notes
|
|
32
|
+
|
|
33
|
+
Package-local verification:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pnpm --filter @thinkwork/plugin-email-channel test
|
|
37
|
+
pnpm --filter @thinkwork/plugin-email-channel typecheck
|
|
38
|
+
pnpm --filter @thinkwork/plugin-catalog test
|
|
39
|
+
pnpm --filter @thinkwork/plugin-catalog typecheck
|
|
40
|
+
node scripts/verify-plugin-source-boundary.mjs
|
|
41
|
+
```
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@thinkwork/plugin-email-channel",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./src/index.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./src/index.ts",
|
|
9
|
+
"./manifest": "./src/manifest.ts",
|
|
10
|
+
"./provider-contract": "./src/provider-contract.ts"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc --build",
|
|
14
|
+
"typecheck": "tsc --noEmit",
|
|
15
|
+
"test": "vitest run"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@thinkwork/plugin-catalog": "workspace:*",
|
|
19
|
+
"typescript": "^5.5.0",
|
|
20
|
+
"vitest": "^2.0.0"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { emailChannelManifest } from "./manifest";
|
|
2
|
+
|
|
3
|
+
export const emailChannelPluginPackage = {
|
|
4
|
+
packageKey: "email-channel",
|
|
5
|
+
sourceRoot: "plugins/email-channel",
|
|
6
|
+
manifest: emailChannelManifest,
|
|
7
|
+
ownedSources: [
|
|
8
|
+
{
|
|
9
|
+
kind: "manifest",
|
|
10
|
+
path: "plugins/email-channel/src/manifest.ts",
|
|
11
|
+
description:
|
|
12
|
+
"Resend Email catalog manifest and provider capability contract.",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
kind: "api",
|
|
16
|
+
path: "plugins/email-channel/src/provider-contract.ts",
|
|
17
|
+
description:
|
|
18
|
+
"Resend Email provider keys and package-local channel contract metadata.",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
kind: "tests",
|
|
22
|
+
path: "plugins/email-channel/test",
|
|
23
|
+
description:
|
|
24
|
+
"Resend Email package-local manifest and provider scope tests.",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
kind: "docs",
|
|
28
|
+
path: "plugins/email-channel/README.md",
|
|
29
|
+
description: "Resend Email package ownership and verification notes.",
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
compatibilityLinks: [],
|
|
33
|
+
} as const;
|
|
34
|
+
|
|
35
|
+
export { emailChannelManifest };
|
|
36
|
+
export * from "./provider-contract";
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { PluginManifest } from "@thinkwork/plugin-catalog/contracts";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
EMAIL_CHANNEL_CAPABILITY_KEY,
|
|
5
|
+
EMAIL_CHANNEL_SETTINGS_SURFACE,
|
|
6
|
+
emailChannelProviders,
|
|
7
|
+
} from "./provider-contract";
|
|
8
|
+
|
|
9
|
+
export const emailChannelManifest = {
|
|
10
|
+
pluginKey: "email-channel",
|
|
11
|
+
displayName: "Resend Email",
|
|
12
|
+
description:
|
|
13
|
+
"Resend-backed agent and Space email channel with provider readiness, first-send review, inbound authorization, SES compatibility, and ledger evidence.",
|
|
14
|
+
versions: [
|
|
15
|
+
{
|
|
16
|
+
version: "0.1.0",
|
|
17
|
+
requiredOauthScopes: [],
|
|
18
|
+
capabilities: [
|
|
19
|
+
{
|
|
20
|
+
type: "email-channel",
|
|
21
|
+
key: EMAIL_CHANNEL_CAPABILITY_KEY,
|
|
22
|
+
displayName: "Agent and Space email",
|
|
23
|
+
providers: emailChannelProviders.map(
|
|
24
|
+
({ key, displayName, recommended, compatibility }) => ({
|
|
25
|
+
key,
|
|
26
|
+
displayName,
|
|
27
|
+
recommended,
|
|
28
|
+
compatibility,
|
|
29
|
+
}),
|
|
30
|
+
),
|
|
31
|
+
settingsSurface: EMAIL_CHANNEL_SETTINGS_SURFACE,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
components: [
|
|
35
|
+
{
|
|
36
|
+
type: "ui-surface",
|
|
37
|
+
key: "settings",
|
|
38
|
+
displayName: "Resend Email settings",
|
|
39
|
+
intendedMount: EMAIL_CHANNEL_SETTINGS_SURFACE,
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
} satisfies PluginManifest;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
EmailChannelProviderKey,
|
|
3
|
+
EmailChannelProviderOption,
|
|
4
|
+
} from "@thinkwork/plugin-catalog/contracts";
|
|
5
|
+
|
|
6
|
+
export const EMAIL_CHANNEL_CAPABILITY_KEY = "agent-space-email" as const;
|
|
7
|
+
export const EMAIL_CHANNEL_SETTINGS_SURFACE =
|
|
8
|
+
"settings.plugins.email-channel" as const;
|
|
9
|
+
|
|
10
|
+
export interface EmailChannelProviderDeclaration
|
|
11
|
+
extends EmailChannelProviderOption {
|
|
12
|
+
description: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const emailChannelProviders = [
|
|
16
|
+
{
|
|
17
|
+
key: "resend",
|
|
18
|
+
displayName: "Resend",
|
|
19
|
+
recommended: true,
|
|
20
|
+
description:
|
|
21
|
+
"Recommended v1 provider for tenant-owned agent and Space email.",
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
key: "ses",
|
|
25
|
+
displayName: "Amazon SES",
|
|
26
|
+
compatibility: true,
|
|
27
|
+
description:
|
|
28
|
+
"AWS-native compatibility and migration provider for existing SES-backed Space email.",
|
|
29
|
+
},
|
|
30
|
+
] satisfies EmailChannelProviderDeclaration[];
|
|
31
|
+
|
|
32
|
+
export function isEmailChannelProviderKey(
|
|
33
|
+
value: string,
|
|
34
|
+
): value is EmailChannelProviderKey {
|
|
35
|
+
return emailChannelProviders.some((provider) => provider.key === value);
|
|
36
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
validatePluginManifest,
|
|
5
|
+
type EmailChannelCapability,
|
|
6
|
+
type PluginManifest,
|
|
7
|
+
} from "@thinkwork/plugin-catalog/contracts";
|
|
8
|
+
import { defineFirstPartyPluginPackage } from "@thinkwork/plugin-catalog/plugin-package";
|
|
9
|
+
|
|
10
|
+
import { emailChannelPluginPackage } from "../src";
|
|
11
|
+
import { emailChannelManifest } from "../src/manifest";
|
|
12
|
+
import {
|
|
13
|
+
EMAIL_CHANNEL_CAPABILITY_KEY,
|
|
14
|
+
EMAIL_CHANNEL_SETTINGS_SURFACE,
|
|
15
|
+
emailChannelProviders,
|
|
16
|
+
isEmailChannelProviderKey,
|
|
17
|
+
} from "../src/provider-contract";
|
|
18
|
+
|
|
19
|
+
function clone<T>(value: T): T {
|
|
20
|
+
return JSON.parse(JSON.stringify(value)) as T;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function emailCapability(
|
|
24
|
+
manifest: PluginManifest = emailChannelManifest as PluginManifest,
|
|
25
|
+
): EmailChannelCapability {
|
|
26
|
+
const capability = manifest.versions[0].capabilities?.find(
|
|
27
|
+
(candidate) => candidate.type === "email-channel",
|
|
28
|
+
);
|
|
29
|
+
if (capability?.type !== "email-channel") {
|
|
30
|
+
throw new Error("email manifest is missing its email-channel capability");
|
|
31
|
+
}
|
|
32
|
+
return capability;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
describe("Resend Email plugin manifest", () => {
|
|
36
|
+
it("validates as an inert provider-channel plugin", () => {
|
|
37
|
+
const validated = validatePluginManifest(emailChannelManifest);
|
|
38
|
+
|
|
39
|
+
expect(validated.pluginKey).toBe("email-channel");
|
|
40
|
+
expect(validated.displayName).toBe("Resend Email");
|
|
41
|
+
expect(validated.versions[0].requiredOauthScopes).toEqual([]);
|
|
42
|
+
expect(validated.versions[0].components).toEqual([
|
|
43
|
+
{
|
|
44
|
+
type: "ui-surface",
|
|
45
|
+
key: "settings",
|
|
46
|
+
displayName: "Resend Email settings",
|
|
47
|
+
intendedMount: EMAIL_CHANNEL_SETTINGS_SURFACE,
|
|
48
|
+
},
|
|
49
|
+
]);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("declares Resend and SES provider options", () => {
|
|
53
|
+
expect(emailChannelProviders.map((provider) => provider.key)).toEqual([
|
|
54
|
+
"resend",
|
|
55
|
+
"ses",
|
|
56
|
+
]);
|
|
57
|
+
expect(isEmailChannelProviderKey("resend")).toBe(true);
|
|
58
|
+
expect(isEmailChannelProviderKey("smtp")).toBe(false);
|
|
59
|
+
|
|
60
|
+
const capability = emailCapability();
|
|
61
|
+
expect(capability).toMatchObject({
|
|
62
|
+
type: "email-channel",
|
|
63
|
+
key: EMAIL_CHANNEL_CAPABILITY_KEY,
|
|
64
|
+
settingsSurface: EMAIL_CHANNEL_SETTINGS_SURFACE,
|
|
65
|
+
});
|
|
66
|
+
expect(capability.providers).toEqual([
|
|
67
|
+
{
|
|
68
|
+
key: "resend",
|
|
69
|
+
displayName: "Resend",
|
|
70
|
+
recommended: true,
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
key: "ses",
|
|
74
|
+
displayName: "Amazon SES",
|
|
75
|
+
compatibility: true,
|
|
76
|
+
},
|
|
77
|
+
]);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it.each(["smtp", "postmark", "mailgun"])(
|
|
81
|
+
"rejects deferred provider %s in the v1 channel capability",
|
|
82
|
+
(provider) => {
|
|
83
|
+
const bad = clone(emailChannelManifest) as PluginManifest;
|
|
84
|
+
emailCapability(bad).providers.push({
|
|
85
|
+
key: provider as "resend",
|
|
86
|
+
displayName: provider,
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
expect(() => validatePluginManifest(bad)).toThrow(
|
|
90
|
+
/not a supported email-channel provider/,
|
|
91
|
+
);
|
|
92
|
+
},
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
it("rejects provider declarations without exactly one recommendation", () => {
|
|
96
|
+
const bad = clone(emailChannelManifest) as PluginManifest;
|
|
97
|
+
for (const provider of emailCapability(bad).providers) {
|
|
98
|
+
provider.recommended = false;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
expect(() => validatePluginManifest(bad)).toThrow(
|
|
102
|
+
/exactly one recommended provider/,
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("defines a first-party package boundary under plugins/email-channel", () => {
|
|
107
|
+
const defined = defineFirstPartyPluginPackage(emailChannelPluginPackage);
|
|
108
|
+
|
|
109
|
+
expect(defined.packageKey).toBe("email-channel");
|
|
110
|
+
expect(defined.sourceRoot).toBe("plugins/email-channel");
|
|
111
|
+
expect(defined.ownedSources).toContainEqual({
|
|
112
|
+
kind: "manifest",
|
|
113
|
+
path: "plugins/email-channel/src/manifest.ts",
|
|
114
|
+
description:
|
|
115
|
+
"Resend Email catalog manifest and provider capability contract.",
|
|
116
|
+
});
|
|
117
|
+
expect(defined.compatibilityLinks).toEqual([]);
|
|
118
|
+
});
|
|
119
|
+
});
|