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,162 @@
|
|
|
1
|
+
# ThinkWork Plugin Packages
|
|
2
|
+
|
|
3
|
+
`plugins/<plugin-key>/` is the canonical ownership boundary for first-party
|
|
4
|
+
ThinkWork application plugin source. A maintainer should be able to open one
|
|
5
|
+
plugin package and understand the plugin-specific manifest, skills, deployment
|
|
6
|
+
shape, runtime assets, UI surfaces, smoke coverage, tests, and operating notes
|
|
7
|
+
without hunting through shared platform packages.
|
|
8
|
+
|
|
9
|
+
Shared packages still own generic infrastructure: manifest validation, catalog
|
|
10
|
+
build/signing, GraphQL transport, install and activation state machines,
|
|
11
|
+
deployment-runner orchestration, common web shell code, database schema, and
|
|
12
|
+
common test harnesses. Plugin packages own the product-specific source that
|
|
13
|
+
plugs into those contracts.
|
|
14
|
+
|
|
15
|
+
The generic catalog/contract package lives at `plugins/catalog` and is still
|
|
16
|
+
published inside the workspace as `@thinkwork/plugin-catalog`. It is not a
|
|
17
|
+
first-party application plugin; registry generation skips it and discovers only
|
|
18
|
+
real `plugins/<plugin-key>/` application packages.
|
|
19
|
+
|
|
20
|
+
## Package Contract
|
|
21
|
+
|
|
22
|
+
Each plugin package should include the pieces that apply to that plugin:
|
|
23
|
+
|
|
24
|
+
- `package.json` and `tsconfig.json` so the package participates in the pnpm
|
|
25
|
+
workspace.
|
|
26
|
+
- `src/index.ts` exporting a `FirstPartyPluginPackage` descriptor with
|
|
27
|
+
`packageKey`, `sourceRoot`, the validated manifest, owned source descriptors,
|
|
28
|
+
and temporary compatibility links.
|
|
29
|
+
- `src/manifest.ts` for the versioned catalog manifest.
|
|
30
|
+
- `src/api/` for plugin-specific API/runtime hooks.
|
|
31
|
+
- `src/deployment/` for managed-application adapters.
|
|
32
|
+
- `src/web/` for plugin-specific operator UI panels rendered by shared hosts.
|
|
33
|
+
- `terraform/<managed-app-key>/` for plugin-owned Terraform source.
|
|
34
|
+
- `runtime/` for plugin-owned Dockerfiles or runtime assets.
|
|
35
|
+
- `smoke/` for live or dry-run smoke validation scripts.
|
|
36
|
+
- `test/` for package-local contract and parity tests.
|
|
37
|
+
- `README.md` for review, operation, migration debt, and verification notes.
|
|
38
|
+
|
|
39
|
+
The descriptor is intentionally machine-readable so docs, release tooling,
|
|
40
|
+
source-boundary checks, and plugin-builder output can agree on the same package
|
|
41
|
+
shape.
|
|
42
|
+
|
|
43
|
+
## Temporary Compatibility Links
|
|
44
|
+
|
|
45
|
+
During THNK-31 migration, a plugin README and descriptor may reference legacy
|
|
46
|
+
paths outside `plugins/<plugin-key>/` only when the path is documented as
|
|
47
|
+
migration debt. Each compatibility link must explain why it remains outside the
|
|
48
|
+
package and which implementation unit or release pass removes it.
|
|
49
|
+
|
|
50
|
+
Compatibility links are not ownership claims. They are breadcrumbs that keep
|
|
51
|
+
review honest while source moves behind the package boundary.
|
|
52
|
+
|
|
53
|
+
## Shared Platform Code
|
|
54
|
+
|
|
55
|
+
Do not move generic platform code into a plugin package just because a plugin
|
|
56
|
+
uses it. Keep shared contracts and orchestration in the owning workspace package
|
|
57
|
+
and expose a generic extension point when plugin-specific behavior needs to be
|
|
58
|
+
called from shared code.
|
|
59
|
+
|
|
60
|
+
## Verification
|
|
61
|
+
|
|
62
|
+
For package-local changes, run the plugin package test or typecheck command:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
pnpm --filter @thinkwork/plugin-<key> test
|
|
66
|
+
pnpm --filter @thinkwork/plugin-<key> typecheck
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
For catalog contract changes, also run:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
pnpm --filter @thinkwork/plugin-catalog test
|
|
73
|
+
pnpm --filter @thinkwork/plugin-catalog typecheck
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Signed Catalog Publication
|
|
77
|
+
|
|
78
|
+
The authored source of truth stays in root `plugins/*` packages. The runtime
|
|
79
|
+
freshness channel is a signed JSON artifact produced from that source by the
|
|
80
|
+
`Plugin Catalog` GitHub Actions workflow.
|
|
81
|
+
|
|
82
|
+
On pull requests that touch `plugins/**`, the workflow:
|
|
83
|
+
|
|
84
|
+
- checks the generated first-party plugin registry;
|
|
85
|
+
- runs the catalog package tests and typecheck;
|
|
86
|
+
- builds a signed catalog with an ephemeral ed25519 key; and
|
|
87
|
+
- verifies the signed JSON before the PR can merge.
|
|
88
|
+
|
|
89
|
+
On pushes to `main`, the workflow publishes a stable GitHub Release asset only
|
|
90
|
+
when catalog-affecting source changed under `plugins/catalog/**`,
|
|
91
|
+
`plugins/<plugin-key>/src/**`, or `plugins/<plugin-key>/package.json`. Docs-only
|
|
92
|
+
changes under plugin folders leave the previous catalog asset in place. A manual
|
|
93
|
+
workflow dispatch can force a publish when an operator needs to republish the
|
|
94
|
+
current `main` catalog.
|
|
95
|
+
|
|
96
|
+
The stable channel is:
|
|
97
|
+
|
|
98
|
+
- release tag: `plugin-catalog-main`;
|
|
99
|
+
- asset: `thinkwork-plugin-catalog-main.json`;
|
|
100
|
+
- private signing secret: `PLUGIN_CATALOG_SIGNING_KEY`; and
|
|
101
|
+
- signed provenance: repository, ref, source commit SHA, generated timestamp,
|
|
102
|
+
catalog digest, and per-version payload digests.
|
|
103
|
+
|
|
104
|
+
The signing key is used only by GitHub Actions. Deployed ThinkWork stages should
|
|
105
|
+
trust the matching public key through runtime configuration and continue to read
|
|
106
|
+
catalog data through ThinkWork GraphQL, not browser-side GitHub calls.
|
|
107
|
+
|
|
108
|
+
## Runtime Freshness Model
|
|
109
|
+
|
|
110
|
+
Plugin authors change source under `plugins/<plugin-key>/`. The release path
|
|
111
|
+
turns that source into a signed catalog artifact; the deployed API fetches that
|
|
112
|
+
artifact from GitHub, verifies the signature and payload digests, and caches
|
|
113
|
+
only verified snapshots. The browser never fetches GitHub directly, and the API
|
|
114
|
+
never compiles or evaluates plugin TypeScript from GitHub.
|
|
115
|
+
|
|
116
|
+
ThinkWork has four distinct catalog states to keep straight during review:
|
|
117
|
+
|
|
118
|
+
| Layer | Owner | What changes it |
|
|
119
|
+
| ------------------ | ---------------------------------------- | ---------------------------------------------------------------------------------------- |
|
|
120
|
+
| Authored source | `plugins/*` package maintainers | Pull requests that edit manifests, package metadata, skills, adapters, or runtime source |
|
|
121
|
+
| Signed artifact | GitHub Actions `Plugin Catalog` workflow | Merge to `main` with catalog-affecting plugin source, or manual workflow dispatch |
|
|
122
|
+
| API verified cache | Deployed GraphQL API | TTL refresh, conditional GitHub revalidation, or operator `refreshPluginCatalog` |
|
|
123
|
+
| Installed pin | Tenant plugin install state | `installPlugin` or `upgradePlugin` mutations through ThinkWork |
|
|
124
|
+
|
|
125
|
+
Settings -> Plugins reads `pluginCatalog` plus `pluginCatalogMetadata` through
|
|
126
|
+
GraphQL. Operators see the installed pinned version next to the latest verified
|
|
127
|
+
catalog version, the source repository/tag/commit, generated and fetched
|
|
128
|
+
timestamps, stale fallback status, and a `Refresh catalog` action. That action
|
|
129
|
+
calls `refreshPluginCatalog`; it bypasses the API freshness TTL but still uses
|
|
130
|
+
the same signature/digest verification and stale-safe fallback path.
|
|
131
|
+
|
|
132
|
+
If GitHub is unavailable, rate limited, returns a malformed artifact, or serves
|
|
133
|
+
an artifact with a bad signature, the API must not trust it. A previously
|
|
134
|
+
verified snapshot may be served as stale fallback; otherwise the catalog fails
|
|
135
|
+
closed and installed plugin state remains in Aurora.
|
|
136
|
+
|
|
137
|
+
## Release And Verification Checklist
|
|
138
|
+
|
|
139
|
+
When a plugin version bump should become visible without a full app deploy:
|
|
140
|
+
|
|
141
|
+
1. Land the plugin source change under `plugins/*` on `main`.
|
|
142
|
+
2. Confirm the `Plugin Catalog` workflow published
|
|
143
|
+
`thinkwork-plugin-catalog-main.json` on release tag `plugin-catalog-main`.
|
|
144
|
+
3. Verify the signed artifact with the deployed trusted public key, or at least
|
|
145
|
+
confirm the artifact metadata contains the expected repository, ref, source
|
|
146
|
+
commit SHA, generated timestamp, catalog digest, and version payload digest.
|
|
147
|
+
4. In a GitHub-backed stage, refresh the API cache by waiting for TTL or using
|
|
148
|
+
the operator `Refresh catalog` action in Settings -> Plugins.
|
|
149
|
+
5. Confirm Settings -> Plugins shows the expected latest version, source
|
|
150
|
+
metadata, stale/fallback state when applicable, and update availability for
|
|
151
|
+
tenants with an older installed pin.
|
|
152
|
+
6. Install or upgrade through ThinkWork. Do not substitute a direct Terraform
|
|
153
|
+
apply, vendor cloud login, local Docker Compose run, or manual catalog edit.
|
|
154
|
+
7. Run the package-owned smoke for the plugin after install/upgrade. For
|
|
155
|
+
LastMile, that means proving `lastmile--crm`, `lastmile--tasks`, and
|
|
156
|
+
`lastmile--routing` through ThinkWork's MCP proxy.
|
|
157
|
+
|
|
158
|
+
Before closing a migration slice, run the source-boundary check:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
node scripts/verify-plugin-source-boundary.mjs
|
|
162
|
+
```
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@thinkwork/plugin-catalog",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./src/index.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./src/index.ts",
|
|
9
|
+
"./catalog": "./src/catalog.ts",
|
|
10
|
+
"./contracts": "./src/contracts.ts",
|
|
11
|
+
"./plugin-package": "./src/plugin-package.ts",
|
|
12
|
+
"./plugins": "./src/registry/index.ts",
|
|
13
|
+
"./registry": "./src/registry/index.ts"
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc --build",
|
|
17
|
+
"typecheck": "tsc --noEmit",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"generate:plugins": "tsx scripts/generate-plugin-registry.ts",
|
|
20
|
+
"check:plugins": "tsx scripts/generate-plugin-registry.ts --check",
|
|
21
|
+
"build:catalog": "tsx scripts/generate-plugin-registry.ts --check && tsx scripts/build-catalog.ts"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@thinkwork/plugin-company-brain": "workspace:*",
|
|
25
|
+
"@thinkwork/plugin-company-data": "workspace:*",
|
|
26
|
+
"@thinkwork/plugin-company-etl": "workspace:*",
|
|
27
|
+
"@thinkwork/plugin-email-channel": "workspace:*",
|
|
28
|
+
"@thinkwork/plugin-lastmile": "workspace:*",
|
|
29
|
+
"@thinkwork/plugin-n8n": "workspace:*",
|
|
30
|
+
"@thinkwork/plugin-sendgrid": "workspace:*",
|
|
31
|
+
"@thinkwork/plugin-twenty": "workspace:*",
|
|
32
|
+
"@thinkwork/plugin-workos-auth": "workspace:*"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/node": "^25.6.0",
|
|
36
|
+
"tsx": "^4.21.0",
|
|
37
|
+
"typescript": "^5.5.0",
|
|
38
|
+
"vitest": "^2.0.0"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the signed plugin catalog JSON from manifests discovered through the
|
|
3
|
+
* generated `plugins/*` package registry.
|
|
4
|
+
*
|
|
5
|
+
* Signing key input (ed25519 PKCS#8 PEM), in precedence order:
|
|
6
|
+
* 1. `--key <path>` — file containing the private key PEM
|
|
7
|
+
* 2. `PLUGIN_CATALOG_SIGNING_KEY` env var — the PEM content itself
|
|
8
|
+
*
|
|
9
|
+
* Output defaults to `dist/catalog.json` (override with `--out <path>`).
|
|
10
|
+
* Source provenance can be passed explicitly or inherited from GitHub Actions:
|
|
11
|
+
* --source-repository / PLUGIN_CATALOG_SOURCE_REPOSITORY / GITHUB_REPOSITORY
|
|
12
|
+
* --source-ref / PLUGIN_CATALOG_SOURCE_REF / GITHUB_REF_NAME / GITHUB_REF
|
|
13
|
+
* --source-commit / PLUGIN_CATALOG_SOURCE_COMMIT_SHA / GITHUB_SHA
|
|
14
|
+
*
|
|
15
|
+
* Usage: pnpm --filter @thinkwork/plugin-catalog build:catalog -- --key signing-key.pem
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
19
|
+
import { dirname } from "node:path";
|
|
20
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
21
|
+
|
|
22
|
+
import {
|
|
23
|
+
buildPluginCatalog,
|
|
24
|
+
signPluginCatalog,
|
|
25
|
+
type PluginCatalogSourceProvenance,
|
|
26
|
+
} from "../src/catalog";
|
|
27
|
+
import type { PluginManifest } from "../src/contracts";
|
|
28
|
+
import { allPluginManifests } from "../src/registry";
|
|
29
|
+
|
|
30
|
+
export function buildSignedCatalogJson(options: {
|
|
31
|
+
manifests: readonly PluginManifest[];
|
|
32
|
+
privateKeyPem: string;
|
|
33
|
+
generatedAt?: Date | string;
|
|
34
|
+
source?: PluginCatalogSourceProvenance;
|
|
35
|
+
}): string {
|
|
36
|
+
const catalog = buildPluginCatalog({
|
|
37
|
+
manifests: options.manifests,
|
|
38
|
+
generatedAt: options.generatedAt,
|
|
39
|
+
source: options.source,
|
|
40
|
+
});
|
|
41
|
+
const document = signPluginCatalog({
|
|
42
|
+
catalog,
|
|
43
|
+
privateKeyPem: options.privateKeyPem,
|
|
44
|
+
signedAt: options.generatedAt,
|
|
45
|
+
});
|
|
46
|
+
return `${JSON.stringify(document, null, 2)}\n`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function readArg(argv: string[], flag: string): string | undefined {
|
|
50
|
+
const index = argv.indexOf(flag);
|
|
51
|
+
if (index === -1) return undefined;
|
|
52
|
+
const value = argv[index + 1];
|
|
53
|
+
if (!value) {
|
|
54
|
+
throw new Error(`${flag} requires a value`);
|
|
55
|
+
}
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function readSourceProvenance(
|
|
60
|
+
argv: string[],
|
|
61
|
+
): PluginCatalogSourceProvenance | undefined {
|
|
62
|
+
const repository =
|
|
63
|
+
readArg(argv, "--source-repository") ??
|
|
64
|
+
process.env.PLUGIN_CATALOG_SOURCE_REPOSITORY ??
|
|
65
|
+
process.env.GITHUB_REPOSITORY;
|
|
66
|
+
const ref =
|
|
67
|
+
readArg(argv, "--source-ref") ??
|
|
68
|
+
process.env.PLUGIN_CATALOG_SOURCE_REF ??
|
|
69
|
+
process.env.GITHUB_REF_NAME ??
|
|
70
|
+
process.env.GITHUB_REF;
|
|
71
|
+
const commitSha =
|
|
72
|
+
readArg(argv, "--source-commit") ??
|
|
73
|
+
process.env.PLUGIN_CATALOG_SOURCE_COMMIT_SHA ??
|
|
74
|
+
process.env.GITHUB_SHA;
|
|
75
|
+
|
|
76
|
+
const values = [repository, ref, commitSha].filter(Boolean);
|
|
77
|
+
if (values.length === 0) return undefined;
|
|
78
|
+
if (!repository || !ref || !commitSha) {
|
|
79
|
+
throw new Error(
|
|
80
|
+
"Catalog source provenance requires repository, ref, and commit SHA. " +
|
|
81
|
+
"Pass --source-repository, --source-ref, and --source-commit or set the matching env vars.",
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
return { repository, ref, commitSha };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function main(): void {
|
|
88
|
+
const argv = process.argv.slice(2);
|
|
89
|
+
const keyPath = readArg(argv, "--key");
|
|
90
|
+
const privateKeyPem = keyPath
|
|
91
|
+
? readFileSync(keyPath, "utf8")
|
|
92
|
+
: process.env.PLUGIN_CATALOG_SIGNING_KEY;
|
|
93
|
+
if (!privateKeyPem) {
|
|
94
|
+
console.error(
|
|
95
|
+
"Missing signing key: pass --key <pem-file> or set PLUGIN_CATALOG_SIGNING_KEY",
|
|
96
|
+
);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const outPath =
|
|
101
|
+
readArg(argv, "--out") ??
|
|
102
|
+
fileURLToPath(new URL("../dist/catalog.json", import.meta.url));
|
|
103
|
+
const json = buildSignedCatalogJson({
|
|
104
|
+
manifests: allPluginManifests,
|
|
105
|
+
privateKeyPem,
|
|
106
|
+
source: readSourceProvenance(argv),
|
|
107
|
+
});
|
|
108
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
109
|
+
writeFileSync(outPath, json, "utf8");
|
|
110
|
+
console.log(
|
|
111
|
+
`Wrote signed catalog (${allPluginManifests.length} plugin${allPluginManifests.length === 1 ? "" : "s"}) to ${outPath}`,
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (
|
|
116
|
+
process.argv[1] &&
|
|
117
|
+
import.meta.url === pathToFileURL(process.argv[1]).href
|
|
118
|
+
) {
|
|
119
|
+
main();
|
|
120
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
|
+
|
|
5
|
+
export interface PluginRegistryEntry {
|
|
6
|
+
packageKey: string;
|
|
7
|
+
packageName: string;
|
|
8
|
+
exportName: string;
|
|
9
|
+
manifestExportName: string;
|
|
10
|
+
rawExportName: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const GENERATED_PATH = new URL(
|
|
14
|
+
"../src/registry/generated-first-party.ts",
|
|
15
|
+
import.meta.url,
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
export function discoverPluginRegistryEntries({
|
|
19
|
+
repoRoot = resolve(fileURLToPath(new URL("../../..", import.meta.url))),
|
|
20
|
+
} = {}): PluginRegistryEntry[] {
|
|
21
|
+
const pluginsRoot = resolve(repoRoot, "plugins");
|
|
22
|
+
return readdirSync(pluginsRoot, { withFileTypes: true })
|
|
23
|
+
.filter((entry) => entry.isDirectory())
|
|
24
|
+
.map((entry) => {
|
|
25
|
+
const packageKey = entry.name;
|
|
26
|
+
const packageJsonPath = resolve(pluginsRoot, packageKey, "package.json");
|
|
27
|
+
if (!existsSync(packageJsonPath)) return null;
|
|
28
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8")) as {
|
|
29
|
+
name?: string;
|
|
30
|
+
thinkworkPlugin?: {
|
|
31
|
+
catalogPublication?: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
if (!packageJson.name?.startsWith("@thinkwork/plugin-")) return null;
|
|
35
|
+
if (packageJson.name === "@thinkwork/plugin-catalog") return null;
|
|
36
|
+
if (packageJson.thinkworkPlugin?.catalogPublication === "deferred") {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const exportName = `${camelCase(packageKey)}PluginPackage`;
|
|
40
|
+
return {
|
|
41
|
+
packageKey,
|
|
42
|
+
packageName: packageJson.name,
|
|
43
|
+
exportName,
|
|
44
|
+
manifestExportName: `${camelCase(packageKey)}Manifest`,
|
|
45
|
+
rawExportName: `raw${pascalCase(packageKey)}PluginPackage`,
|
|
46
|
+
};
|
|
47
|
+
})
|
|
48
|
+
.filter((entry): entry is PluginRegistryEntry => entry !== null)
|
|
49
|
+
.sort((a, b) => a.packageKey.localeCompare(b.packageKey));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function renderPluginRegistry(entries: readonly PluginRegistryEntry[]) {
|
|
53
|
+
const imports = entries
|
|
54
|
+
.map(
|
|
55
|
+
(entry) =>
|
|
56
|
+
`import { ${entry.exportName} as ${entry.rawExportName} } from "${entry.packageName}";`,
|
|
57
|
+
)
|
|
58
|
+
.join("\n");
|
|
59
|
+
const packages = entries
|
|
60
|
+
.map(
|
|
61
|
+
(entry) =>
|
|
62
|
+
`export const ${entry.exportName} = defineFirstPartyPluginPackage(
|
|
63
|
+
${entry.rawExportName},
|
|
64
|
+
);`,
|
|
65
|
+
)
|
|
66
|
+
.join("\n");
|
|
67
|
+
const manifests = entries
|
|
68
|
+
.map(
|
|
69
|
+
(entry) =>
|
|
70
|
+
`export const ${entry.manifestExportName} = ${entry.exportName}.manifest;`,
|
|
71
|
+
)
|
|
72
|
+
.join("\n");
|
|
73
|
+
const packageList = entries
|
|
74
|
+
.map((entry) => ` ${entry.exportName},`)
|
|
75
|
+
.join("\n");
|
|
76
|
+
|
|
77
|
+
return `// Generated by plugins/catalog/scripts/generate-plugin-registry.ts.
|
|
78
|
+
// Do not edit by hand. Update plugins/*/package.json, then run:
|
|
79
|
+
// pnpm --filter @thinkwork/plugin-catalog generate:plugins
|
|
80
|
+
|
|
81
|
+
import { defineFirstPartyPluginPackage } from "../plugin-package";
|
|
82
|
+
${imports}
|
|
83
|
+
|
|
84
|
+
${packages}
|
|
85
|
+
|
|
86
|
+
${manifests}
|
|
87
|
+
|
|
88
|
+
export const firstPartyPluginPackages = [
|
|
89
|
+
${packageList}
|
|
90
|
+
] as const;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Every repo-authored manifest published to the catalog.
|
|
94
|
+
*/
|
|
95
|
+
export const allPluginManifests = firstPartyPluginPackages
|
|
96
|
+
.map((pluginPackage) => pluginPackage.manifest)
|
|
97
|
+
.sort((a, b) => {
|
|
98
|
+
const byName = a.displayName.localeCompare(b.displayName, undefined, {
|
|
99
|
+
sensitivity: "base",
|
|
100
|
+
});
|
|
101
|
+
return byName === 0 ? a.pluginKey.localeCompare(b.pluginKey) : byName;
|
|
102
|
+
});
|
|
103
|
+
`;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function expectedPluginRegistry({
|
|
107
|
+
repoRoot,
|
|
108
|
+
}: { repoRoot?: string } = {}) {
|
|
109
|
+
return renderPluginRegistry(discoverPluginRegistryEntries({ repoRoot }));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function camelCase(value: string) {
|
|
113
|
+
return value.replace(/-([a-z0-9])/g, (_match, char: string) =>
|
|
114
|
+
char.toUpperCase(),
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function pascalCase(value: string) {
|
|
119
|
+
const camel = camelCase(value);
|
|
120
|
+
return `${camel[0]?.toUpperCase() ?? ""}${camel.slice(1)}`;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function main() {
|
|
124
|
+
const generatedPath = fileURLToPath(GENERATED_PATH);
|
|
125
|
+
const expected = expectedPluginRegistry();
|
|
126
|
+
if (process.argv.includes("--check")) {
|
|
127
|
+
const actual = readFileSync(generatedPath, "utf8");
|
|
128
|
+
if (actual !== expected) {
|
|
129
|
+
throw new Error(
|
|
130
|
+
`${generatedPath} is stale; run pnpm --filter @thinkwork/plugin-catalog generate:plugins`,
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
writeFileSync(generatedPath, expected, "utf8");
|
|
136
|
+
console.log(`Wrote ${generatedPath}`);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (
|
|
140
|
+
process.argv[1] &&
|
|
141
|
+
import.meta.url === pathToFileURL(process.argv[1]).href
|
|
142
|
+
) {
|
|
143
|
+
main();
|
|
144
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { generateKeyPairSync } from "node:crypto";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
|
|
4
|
+
import { buildSignedCatalogJson } from "../../scripts/build-catalog";
|
|
5
|
+
import { verifyPluginCatalog } from "../catalog";
|
|
6
|
+
import { allPluginManifests } from "../registry";
|
|
7
|
+
|
|
8
|
+
function keyPair() {
|
|
9
|
+
const pair = generateKeyPairSync("ed25519");
|
|
10
|
+
return {
|
|
11
|
+
publicKeyPem: pair.publicKey.export({
|
|
12
|
+
format: "pem",
|
|
13
|
+
type: "spki",
|
|
14
|
+
}) as string,
|
|
15
|
+
privateKeyPem: pair.privateKey.export({
|
|
16
|
+
format: "pem",
|
|
17
|
+
type: "pkcs8",
|
|
18
|
+
}) as string,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
describe("buildSignedCatalogJson", () => {
|
|
23
|
+
it("produces a JSON document that verifies against the signing key", () => {
|
|
24
|
+
const keys = keyPair();
|
|
25
|
+
const json = buildSignedCatalogJson({
|
|
26
|
+
manifests: allPluginManifests,
|
|
27
|
+
privateKeyPem: keys.privateKeyPem,
|
|
28
|
+
generatedAt: "2026-06-12T00:00:00.000Z",
|
|
29
|
+
});
|
|
30
|
+
const document = JSON.parse(json) as unknown;
|
|
31
|
+
const verified = verifyPluginCatalog({
|
|
32
|
+
document,
|
|
33
|
+
trustedPublicKeyPem: keys.publicKeyPem,
|
|
34
|
+
});
|
|
35
|
+
expect(verified.plugins.map((plugin) => plugin.pluginKey)).toEqual([
|
|
36
|
+
"lastmile",
|
|
37
|
+
"n8n",
|
|
38
|
+
"email-channel",
|
|
39
|
+
"sendgrid",
|
|
40
|
+
"company-brain",
|
|
41
|
+
"company-data",
|
|
42
|
+
"company-etl",
|
|
43
|
+
"twenty",
|
|
44
|
+
"workos-auth",
|
|
45
|
+
]);
|
|
46
|
+
expect(verified.generatedAt).toBe("2026-06-12T00:00:00.000Z");
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("includes source provenance when provided by the publisher", () => {
|
|
50
|
+
const keys = keyPair();
|
|
51
|
+
const json = buildSignedCatalogJson({
|
|
52
|
+
manifests: allPluginManifests,
|
|
53
|
+
privateKeyPem: keys.privateKeyPem,
|
|
54
|
+
generatedAt: "2026-06-12T00:00:00.000Z",
|
|
55
|
+
source: {
|
|
56
|
+
repository: "thinkwork-ai/thinkwork",
|
|
57
|
+
ref: "main",
|
|
58
|
+
commitSha: "0123456789abcdef0123456789abcdef01234567",
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
const verified = verifyPluginCatalog({
|
|
62
|
+
document: JSON.parse(json) as unknown,
|
|
63
|
+
trustedPublicKeyPem: keys.publicKeyPem,
|
|
64
|
+
});
|
|
65
|
+
expect(verified.source).toEqual({
|
|
66
|
+
repository: "thinkwork-ai/thinkwork",
|
|
67
|
+
ref: "main",
|
|
68
|
+
commitSha: "0123456789abcdef0123456789abcdef01234567",
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("fails verification against a different key", () => {
|
|
73
|
+
const signing = keyPair();
|
|
74
|
+
const other = keyPair();
|
|
75
|
+
const json = buildSignedCatalogJson({
|
|
76
|
+
manifests: allPluginManifests,
|
|
77
|
+
privateKeyPem: signing.privateKeyPem,
|
|
78
|
+
});
|
|
79
|
+
expect(() =>
|
|
80
|
+
verifyPluginCatalog({
|
|
81
|
+
document: JSON.parse(json) as unknown,
|
|
82
|
+
trustedPublicKeyPem: other.publicKeyPem,
|
|
83
|
+
}),
|
|
84
|
+
).toThrow(/signature is invalid/);
|
|
85
|
+
});
|
|
86
|
+
});
|