thinkwork-cli 0.12.12 → 0.12.16
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-JUBCQQDF.js} +1 -1
- package/dist/{chunk-JEHV35EU.js → chunk-STY44FQO.js} +353 -30
- package/dist/cli.js +23823 -10151
- 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/0197_rcm_context_columns.sql +28 -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 +466 -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 +2 -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,30 @@
|
|
|
1
|
+
# SendGrid Plugin
|
|
2
|
+
|
|
3
|
+
The SendGrid plugin is the package-owned source boundary for SendGrid-backed
|
|
4
|
+
tenant invitation email. It declares SendGrid as a standalone email provider so
|
|
5
|
+
operators can install and inspect it from Settings -> Plugins instead of finding
|
|
6
|
+
SendGrid hidden inside the Resend channel package.
|
|
7
|
+
|
|
8
|
+
Shared platform code owns credential storage, authenticated-domain discovery,
|
|
9
|
+
readiness checks, provider selection, and invitation delivery. This package owns
|
|
10
|
+
the catalog identity and provider capability contract.
|
|
11
|
+
|
|
12
|
+
## Owned Source
|
|
13
|
+
|
|
14
|
+
- `src/manifest.ts` declares the catalog manifest and email-channel capability.
|
|
15
|
+
- `src/provider-contract.ts` holds SendGrid provider metadata and the shared
|
|
16
|
+
settings surface identity.
|
|
17
|
+
- `test/manifest.test.ts` validates provider scope, settings surface, and
|
|
18
|
+
package descriptor boundaries.
|
|
19
|
+
|
|
20
|
+
## Verification Notes
|
|
21
|
+
|
|
22
|
+
Package-local verification:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pnpm --filter @thinkwork/plugin-sendgrid test
|
|
26
|
+
pnpm --filter @thinkwork/plugin-sendgrid typecheck
|
|
27
|
+
pnpm --filter @thinkwork/plugin-catalog test
|
|
28
|
+
pnpm --filter @thinkwork/plugin-catalog typecheck
|
|
29
|
+
node scripts/verify-plugin-source-boundary.mjs
|
|
30
|
+
```
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@thinkwork/plugin-sendgrid",
|
|
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 { sendgridManifest } from "./manifest";
|
|
2
|
+
|
|
3
|
+
export const sendgridPluginPackage = {
|
|
4
|
+
packageKey: "sendgrid",
|
|
5
|
+
sourceRoot: "plugins/sendgrid",
|
|
6
|
+
manifest: sendgridManifest,
|
|
7
|
+
ownedSources: [
|
|
8
|
+
{
|
|
9
|
+
kind: "manifest",
|
|
10
|
+
path: "plugins/sendgrid/src/manifest.ts",
|
|
11
|
+
description:
|
|
12
|
+
"SendGrid Email catalog manifest and provider capability contract.",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
kind: "api",
|
|
16
|
+
path: "plugins/sendgrid/src/provider-contract.ts",
|
|
17
|
+
description:
|
|
18
|
+
"SendGrid Email provider keys and package-local channel contract metadata.",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
kind: "tests",
|
|
22
|
+
path: "plugins/sendgrid/test",
|
|
23
|
+
description:
|
|
24
|
+
"SendGrid Email package-local manifest and provider scope tests.",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
kind: "docs",
|
|
28
|
+
path: "plugins/sendgrid/README.md",
|
|
29
|
+
description: "SendGrid Email package ownership and verification notes.",
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
compatibilityLinks: [],
|
|
33
|
+
} as const;
|
|
34
|
+
|
|
35
|
+
export { sendgridManifest };
|
|
36
|
+
export * from "./provider-contract";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { PluginManifest } from "@thinkwork/plugin-catalog/contracts";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
SENDGRID_EMAIL_CHANNEL_CAPABILITY_KEY,
|
|
5
|
+
SENDGRID_SETTINGS_SURFACE,
|
|
6
|
+
sendGridEmailChannelProviders,
|
|
7
|
+
} from "./provider-contract";
|
|
8
|
+
|
|
9
|
+
export const sendgridManifest = {
|
|
10
|
+
pluginKey: "sendgrid",
|
|
11
|
+
displayName: "SendGrid Email",
|
|
12
|
+
description:
|
|
13
|
+
"SendGrid email provider for tenant member invitations with authenticated-domain readiness.",
|
|
14
|
+
versions: [
|
|
15
|
+
{
|
|
16
|
+
version: "0.1.0",
|
|
17
|
+
requiredOauthScopes: [],
|
|
18
|
+
capabilities: [
|
|
19
|
+
{
|
|
20
|
+
type: "email-channel",
|
|
21
|
+
key: SENDGRID_EMAIL_CHANNEL_CAPABILITY_KEY,
|
|
22
|
+
displayName: "SendGrid invitation email",
|
|
23
|
+
providers: sendGridEmailChannelProviders,
|
|
24
|
+
settingsSurface: SENDGRID_SETTINGS_SURFACE,
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
components: [
|
|
28
|
+
{
|
|
29
|
+
type: "ui-surface",
|
|
30
|
+
key: "settings",
|
|
31
|
+
displayName: "SendGrid Email settings",
|
|
32
|
+
intendedMount: SENDGRID_SETTINGS_SURFACE,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
} satisfies PluginManifest;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { EmailChannelProviderOption } from "@thinkwork/plugin-catalog/contracts";
|
|
2
|
+
|
|
3
|
+
export const SENDGRID_EMAIL_CHANNEL_CAPABILITY_KEY =
|
|
4
|
+
"sendgrid-email-provider" as const;
|
|
5
|
+
export const SENDGRID_SETTINGS_SURFACE =
|
|
6
|
+
"settings.plugins.email-channel" as const;
|
|
7
|
+
|
|
8
|
+
export const sendGridEmailChannelProviders = [
|
|
9
|
+
{
|
|
10
|
+
key: "sendgrid",
|
|
11
|
+
displayName: "SendGrid",
|
|
12
|
+
recommended: true,
|
|
13
|
+
},
|
|
14
|
+
] satisfies EmailChannelProviderOption[];
|
|
@@ -0,0 +1,80 @@
|
|
|
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 { sendgridPluginPackage } from "../src";
|
|
11
|
+
import { sendgridManifest } from "../src/manifest";
|
|
12
|
+
import {
|
|
13
|
+
SENDGRID_EMAIL_CHANNEL_CAPABILITY_KEY,
|
|
14
|
+
SENDGRID_SETTINGS_SURFACE,
|
|
15
|
+
sendGridEmailChannelProviders,
|
|
16
|
+
} from "../src/provider-contract";
|
|
17
|
+
|
|
18
|
+
function emailCapability(
|
|
19
|
+
manifest: PluginManifest = sendgridManifest as PluginManifest,
|
|
20
|
+
): EmailChannelCapability {
|
|
21
|
+
const capability = manifest.versions[0].capabilities?.find(
|
|
22
|
+
(candidate) => candidate.type === "email-channel",
|
|
23
|
+
);
|
|
24
|
+
if (capability?.type !== "email-channel") {
|
|
25
|
+
throw new Error(
|
|
26
|
+
"SendGrid manifest is missing its email-channel capability",
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
return capability;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
describe("SendGrid plugin manifest", () => {
|
|
33
|
+
it("validates as a standalone email provider plugin", () => {
|
|
34
|
+
const validated = validatePluginManifest(sendgridManifest);
|
|
35
|
+
|
|
36
|
+
expect(validated.pluginKey).toBe("sendgrid");
|
|
37
|
+
expect(validated.displayName).toBe("SendGrid Email");
|
|
38
|
+
expect(validated.versions[0].requiredOauthScopes).toEqual([]);
|
|
39
|
+
expect(validated.versions[0].components).toEqual([
|
|
40
|
+
{
|
|
41
|
+
type: "ui-surface",
|
|
42
|
+
key: "settings",
|
|
43
|
+
displayName: "SendGrid Email settings",
|
|
44
|
+
intendedMount: SENDGRID_SETTINGS_SURFACE,
|
|
45
|
+
},
|
|
46
|
+
]);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("declares only the SendGrid provider option", () => {
|
|
50
|
+
expect(sendGridEmailChannelProviders).toEqual([
|
|
51
|
+
{
|
|
52
|
+
key: "sendgrid",
|
|
53
|
+
displayName: "SendGrid",
|
|
54
|
+
recommended: true,
|
|
55
|
+
},
|
|
56
|
+
]);
|
|
57
|
+
|
|
58
|
+
const capability = emailCapability();
|
|
59
|
+
expect(capability).toMatchObject({
|
|
60
|
+
type: "email-channel",
|
|
61
|
+
key: SENDGRID_EMAIL_CHANNEL_CAPABILITY_KEY,
|
|
62
|
+
settingsSurface: SENDGRID_SETTINGS_SURFACE,
|
|
63
|
+
});
|
|
64
|
+
expect(capability.providers).toEqual(sendGridEmailChannelProviders);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("defines a first-party package boundary under plugins/sendgrid", () => {
|
|
68
|
+
const defined = defineFirstPartyPluginPackage(sendgridPluginPackage);
|
|
69
|
+
|
|
70
|
+
expect(defined.packageKey).toBe("sendgrid");
|
|
71
|
+
expect(defined.sourceRoot).toBe("plugins/sendgrid");
|
|
72
|
+
expect(defined.ownedSources).toContainEqual({
|
|
73
|
+
kind: "manifest",
|
|
74
|
+
path: "plugins/sendgrid/src/manifest.ts",
|
|
75
|
+
description:
|
|
76
|
+
"SendGrid Email catalog manifest and provider capability contract.",
|
|
77
|
+
});
|
|
78
|
+
expect(defined.compatibilityLinks).toEqual([]);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Twenty Plugin
|
|
2
|
+
|
|
3
|
+
Twenty CRM is a first-party application plugin package for the THNK-31
|
|
4
|
+
`plugins/<plugin-key>/` source boundary. It owns the Twenty catalog manifest,
|
|
5
|
+
managed-app/MCP smoke contracts, package tests, and migration notes for the
|
|
6
|
+
remaining infrastructure and activation source.
|
|
7
|
+
|
|
8
|
+
## Package Contract
|
|
9
|
+
|
|
10
|
+
- `package.json` exposes `@thinkwork/plugin-twenty`.
|
|
11
|
+
- `src/index.ts` exports `twentyPluginPackage` with owned source descriptors
|
|
12
|
+
and compatibility links.
|
|
13
|
+
- `src/manifest.ts` owns the Twenty catalog manifest.
|
|
14
|
+
- `src/deployment/managed-app.ts` owns the Twenty managed-app deployment
|
|
15
|
+
adapter.
|
|
16
|
+
- `src/api/cutover.ts` owns the Twenty MCP cutover orchestration contract.
|
|
17
|
+
- The latest manifest version also declares the `client-engagement`
|
|
18
|
+
`ui-surface` component. Updating an installed Twenty plugin to that version
|
|
19
|
+
records a provisioned no-op UI component; the day-to-day app launches from the
|
|
20
|
+
main ThinkWork `Apps` surface, not from Settings.
|
|
21
|
+
- `twenty-app/` owns the native Twenty app source package. It installs as an
|
|
22
|
+
application named `ThinkWork` and exposes a logic function named
|
|
23
|
+
`ThinkWork Webhook` as a workflow action. Its native Settings tab includes
|
|
24
|
+
a `ThinkWork Webhook` configuration form that saves the app's webhook URL and
|
|
25
|
+
trigger-stage application variables.
|
|
26
|
+
- `terraform/twenty/` owns the Twenty managed-app Terraform module.
|
|
27
|
+
- `smoke/` owns Twenty managed-app and MCP OAuth smoke scripts.
|
|
28
|
+
- `test/manifest.test.ts` keeps Twenty endpoint, OAuth, infrastructure, and
|
|
29
|
+
managed-app input contracts aligned, including the presence of the native
|
|
30
|
+
Twenty app package.
|
|
31
|
+
|
|
32
|
+
## Verification
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pnpm --filter @thinkwork/plugin-twenty test
|
|
36
|
+
pnpm --filter @thinkwork/plugin-twenty typecheck
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The native Twenty app is intentionally a nested Twenty/Yarn project, not a
|
|
40
|
+
pnpm workspace package. See `twenty-app/README.md` for dry-run and sync
|
|
41
|
+
instructions, or use `plugins/twenty/scripts/sync-thinkwork-app.mjs` from the
|
|
42
|
+
guarded deploy workflow path.
|
|
43
|
+
|
|
44
|
+
The workflow wiring is also explicit and guarded. The target Twenty workflow
|
|
45
|
+
must call the native `ThinkWork -> ThinkWork Webhook` action instead of the
|
|
46
|
+
built-in `HTTP_REQUEST` action, with the webhook URL and trigger stage coming
|
|
47
|
+
from the installed ThinkWork app settings.
|
|
48
|
+
|
|
49
|
+
## Client Engagement App Surface
|
|
50
|
+
|
|
51
|
+
Twenty contributes the first ThinkWork plugin app: **Client Engagement**. The
|
|
52
|
+
surface is declared in the plugin manifest as a trusted bundled React app with
|
|
53
|
+
route segment `client-engagement` and app key `twenty-client-engagement`.
|
|
54
|
+
|
|
55
|
+
Operational split:
|
|
56
|
+
|
|
57
|
+
- Settings remains the install, update, infrastructure, MCP, and reconnect
|
|
58
|
+
surface. Operators install or update Twenty from Settings, and users reconnect
|
|
59
|
+
OAuth there when readiness requires it.
|
|
60
|
+
- Apps is the usage surface. When the installed Twenty plugin includes the
|
|
61
|
+
provisioned `client-engagement` `ui-surface` component, the main shell shows
|
|
62
|
+
`Apps`, and selecting Client Engagement opens
|
|
63
|
+
`/apps/twenty/client-engagement`.
|
|
64
|
+
- CRM-owned records load through ThinkWork GraphQL resolvers that call the
|
|
65
|
+
authenticated Twenty plugin path on the server. Browser code must not receive
|
|
66
|
+
MCP bearer tokens, tenant-wide CRM credentials, or raw MCP endpoint secrets.
|
|
67
|
+
- ThinkWork-owned engagement fields persist through plugin app overlay state,
|
|
68
|
+
not browser `localStorage`.
|
|
69
|
+
|
|
70
|
+
Readiness expectations:
|
|
71
|
+
|
|
72
|
+
- If the app surface is not installed, it does not appear in Apps.
|
|
73
|
+
- If Twenty is installed but the runtime/MCP component is unavailable, the app
|
|
74
|
+
route renders a readiness message with an operator settings action.
|
|
75
|
+
- If the current user has not connected or needs to reconnect Twenty, the app
|
|
76
|
+
route renders a plugin settings action.
|
|
77
|
+
- Updating an older Twenty install to the latest manifest version is the
|
|
78
|
+
supported path for enabling the Client Engagement app on existing tenants.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@thinkwork/plugin-twenty",
|
|
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
|
+
"./api/cutover": "./src/api/cutover.ts",
|
|
11
|
+
"./deployment/managed-app": "./src/deployment/managed-app.ts"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc --build",
|
|
15
|
+
"typecheck": "tsc --noEmit",
|
|
16
|
+
"test": "vitest run"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"graphql": "^16.10.0"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@thinkwork/deployment-runner": "workspace:*",
|
|
23
|
+
"@thinkwork/plugin-catalog": "workspace:*",
|
|
24
|
+
"typescript": "^5.5.0",
|
|
25
|
+
"vitest": "^2.0.0"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
buildTwentyRemoteConfig,
|
|
5
|
+
dryRunTwentyCommand,
|
|
6
|
+
} from "../sync-thinkwork-app.mjs";
|
|
7
|
+
|
|
8
|
+
describe("sync-thinkwork-app", () => {
|
|
9
|
+
it("builds a Twenty remote config from an empty config file", () => {
|
|
10
|
+
const config = buildTwentyRemoteConfig(
|
|
11
|
+
{},
|
|
12
|
+
{
|
|
13
|
+
remoteName: "thinkwork-crm",
|
|
14
|
+
url: "https://crm.thinkwork.ai",
|
|
15
|
+
apiKey: "test-key",
|
|
16
|
+
},
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
expect(config).toEqual({
|
|
20
|
+
version: 1,
|
|
21
|
+
defaultRemote: "thinkwork-crm",
|
|
22
|
+
remotes: {
|
|
23
|
+
"thinkwork-crm": {
|
|
24
|
+
apiUrl: "https://crm.thinkwork.ai",
|
|
25
|
+
apiKey: "test-key",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("preserves existing Twenty remotes while selecting the ThinkWork remote", () => {
|
|
32
|
+
const config = buildTwentyRemoteConfig(
|
|
33
|
+
{
|
|
34
|
+
version: 1,
|
|
35
|
+
defaultRemote: "local",
|
|
36
|
+
remotes: {
|
|
37
|
+
local: {
|
|
38
|
+
apiUrl: "http://localhost:2020",
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
remoteName: "thinkwork-crm",
|
|
44
|
+
url: "https://crm.thinkwork.ai",
|
|
45
|
+
apiKey: "test-key",
|
|
46
|
+
},
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
expect(config.defaultRemote).toBe("thinkwork-crm");
|
|
50
|
+
expect(config.remotes.local).toEqual({
|
|
51
|
+
apiUrl: "http://localhost:2020",
|
|
52
|
+
});
|
|
53
|
+
expect(config.remotes["thinkwork-crm"]).toEqual({
|
|
54
|
+
apiUrl: "https://crm.thinkwork.ai",
|
|
55
|
+
apiKey: "test-key",
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("validates remote auth in dry-run mode without calling unsupported sync dry-run", () => {
|
|
60
|
+
expect(dryRunTwentyCommand("thinkwork-crm")).toEqual([
|
|
61
|
+
"twenty",
|
|
62
|
+
"--remote",
|
|
63
|
+
"thinkwork-crm",
|
|
64
|
+
"remote:status",
|
|
65
|
+
]);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import process from "node:process";
|
|
7
|
+
import { pathToFileURL } from "node:url";
|
|
8
|
+
|
|
9
|
+
const DEFAULT_REMOTE = "thinkwork-crm";
|
|
10
|
+
const DEFAULT_APP_DIR = "plugins/twenty/twenty-app";
|
|
11
|
+
|
|
12
|
+
function parseArgs(argv) {
|
|
13
|
+
const args = {
|
|
14
|
+
appDir: process.env.TWENTY_THINKWORK_APP_DIR || DEFAULT_APP_DIR,
|
|
15
|
+
remoteName: process.env.TWENTY_THINKWORK_APP_REMOTE_NAME || DEFAULT_REMOTE,
|
|
16
|
+
dryRun: process.env.TWENTY_THINKWORK_APP_SYNC_DRY_RUN !== "0",
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
20
|
+
const arg = argv[index];
|
|
21
|
+
if (arg === "--app-dir") {
|
|
22
|
+
args.appDir = requireValue(argv, ++index, arg);
|
|
23
|
+
} else if (arg === "--remote-name") {
|
|
24
|
+
args.remoteName = requireValue(argv, ++index, arg);
|
|
25
|
+
} else if (arg === "--url") {
|
|
26
|
+
args.url = requireValue(argv, ++index, arg);
|
|
27
|
+
} else if (arg === "--api-key") {
|
|
28
|
+
args.apiKey = requireValue(argv, ++index, arg);
|
|
29
|
+
} else if (arg === "--dry-run") {
|
|
30
|
+
args.dryRun = true;
|
|
31
|
+
} else if (arg === "--apply") {
|
|
32
|
+
args.dryRun = false;
|
|
33
|
+
} else {
|
|
34
|
+
throw new Error(`Unknown argument: ${arg}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
args.url ||= process.env.TWENTY_PUBLIC_URL;
|
|
39
|
+
args.apiKey ||=
|
|
40
|
+
process.env.TWENTY_DEPLOY_API_KEY || process.env.TWENTY_APP_SYNC_API_KEY;
|
|
41
|
+
return args;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function requireValue(argv, index, flag) {
|
|
45
|
+
const value = argv[index];
|
|
46
|
+
if (!value || value.startsWith("--")) {
|
|
47
|
+
throw new Error(`${flag} requires a value.`);
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function validateUrl(url) {
|
|
53
|
+
if (!url) {
|
|
54
|
+
throw new Error("Set TWENTY_PUBLIC_URL or pass --url.");
|
|
55
|
+
}
|
|
56
|
+
const parsed = new URL(url);
|
|
57
|
+
if (parsed.protocol !== "https:" && parsed.hostname !== "localhost") {
|
|
58
|
+
throw new Error(`Twenty URL must be HTTPS or localhost, got ${url}.`);
|
|
59
|
+
}
|
|
60
|
+
return parsed.toString().replace(/\/$/, "");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function run(command, args, options) {
|
|
64
|
+
const result = spawnSync(command, args, {
|
|
65
|
+
cwd: options.cwd,
|
|
66
|
+
env: {
|
|
67
|
+
...process.env,
|
|
68
|
+
YARN_ENABLE_IMMUTABLE_INSTALLS: "false",
|
|
69
|
+
},
|
|
70
|
+
stdio: "inherit",
|
|
71
|
+
});
|
|
72
|
+
if (result.error) throw result.error;
|
|
73
|
+
if (result.status !== 0) {
|
|
74
|
+
throw new Error(`${command} ${args.join(" ")} exited ${result.status}.`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function readTwentyConfig(configPath) {
|
|
79
|
+
if (!fs.existsSync(configPath)) {
|
|
80
|
+
return {};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const rawConfig = fs.readFileSync(configPath, "utf8");
|
|
84
|
+
if (rawConfig.trim() === "") {
|
|
85
|
+
return {};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return JSON.parse(rawConfig);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function buildTwentyRemoteConfig(
|
|
92
|
+
existingConfig,
|
|
93
|
+
{ remoteName, url, apiKey },
|
|
94
|
+
) {
|
|
95
|
+
return {
|
|
96
|
+
...existingConfig,
|
|
97
|
+
version: existingConfig.version ?? 1,
|
|
98
|
+
defaultRemote: remoteName,
|
|
99
|
+
remotes: {
|
|
100
|
+
...existingConfig.remotes,
|
|
101
|
+
[remoteName]: {
|
|
102
|
+
apiUrl: url,
|
|
103
|
+
apiKey,
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function writeTwentyRemoteConfig({ remoteName, url, apiKey }) {
|
|
110
|
+
const configDir = path.join(os.homedir(), ".twenty");
|
|
111
|
+
const configPath = path.join(configDir, "config.json");
|
|
112
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
113
|
+
const existingConfig = readTwentyConfig(configPath);
|
|
114
|
+
fs.writeFileSync(
|
|
115
|
+
configPath,
|
|
116
|
+
JSON.stringify(
|
|
117
|
+
buildTwentyRemoteConfig(existingConfig, { remoteName, url, apiKey }),
|
|
118
|
+
null,
|
|
119
|
+
2,
|
|
120
|
+
),
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function dryRunTwentyCommand(remoteName) {
|
|
125
|
+
return ["twenty", "--remote", remoteName, "remote:status"];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function main() {
|
|
129
|
+
const args = parseArgs(process.argv.slice(2));
|
|
130
|
+
const url = validateUrl(args.url);
|
|
131
|
+
if (!args.apiKey) {
|
|
132
|
+
throw new Error(
|
|
133
|
+
"Set TWENTY_DEPLOY_API_KEY, TWENTY_APP_SYNC_API_KEY, or pass --api-key.",
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
console.log(
|
|
138
|
+
JSON.stringify(
|
|
139
|
+
{
|
|
140
|
+
app: "ThinkWork",
|
|
141
|
+
remoteName: args.remoteName,
|
|
142
|
+
url,
|
|
143
|
+
mode: args.dryRun ? "dry-run" : "apply",
|
|
144
|
+
note: args.dryRun
|
|
145
|
+
? "Dry run validates the package and Twenty remote credentials without deploying or installing."
|
|
146
|
+
: "Apply deploys the private app package to Twenty and installs it into the target workspace.",
|
|
147
|
+
},
|
|
148
|
+
null,
|
|
149
|
+
2,
|
|
150
|
+
),
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
run("corepack", ["enable"], { cwd: args.appDir });
|
|
154
|
+
run("yarn", ["install"], { cwd: args.appDir });
|
|
155
|
+
writeTwentyRemoteConfig({
|
|
156
|
+
remoteName: args.remoteName,
|
|
157
|
+
url,
|
|
158
|
+
apiKey: args.apiKey,
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
if (args.dryRun) {
|
|
162
|
+
run("yarn", dryRunTwentyCommand(args.remoteName), {
|
|
163
|
+
cwd: args.appDir,
|
|
164
|
+
});
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
run(
|
|
169
|
+
"yarn",
|
|
170
|
+
["twenty", "app:publish", "--private", "--remote", args.remoteName],
|
|
171
|
+
{ cwd: args.appDir },
|
|
172
|
+
);
|
|
173
|
+
run("yarn", ["twenty", "app:install", "--remote", args.remoteName], {
|
|
174
|
+
cwd: args.appDir,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
179
|
+
try {
|
|
180
|
+
main();
|
|
181
|
+
} catch (error) {
|
|
182
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
183
|
+
process.exit(1);
|
|
184
|
+
}
|
|
185
|
+
}
|