From 7c70cdaf1c9a9705e5b103cf68d5ab9ce67b9637 Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 00:11:29 +0300 Subject: [PATCH 01/37] feat: n8n node v2, English overlay, docs and CI - n8n community node v2.0.0 with full v1 backward compatibility - 18 resources, 60+ operations, Pachca Trigger with auto-webhook - VersionedNodeType pattern (V1/V2), SharedRouter, Simplify, pagination - Unit tests (309), CI workflow with version check and npm publish - README, CHANGELOG, DEVELOPMENT, CONTRIBUTORS docs - English OpenAPI overlay (openapi.en.yaml) with apply/validate scripts - n8n docs on dev.pachca.com: setup, resources, trigger, workflows, advanced, migration, troubleshooting (8 pages) - New n8n screenshots and workflow examples - C# SDK: improved examples structure - Regenerated SDKs (TypeSpec changes) - turbo.json: generate-n8n, overlay tasks --- .github/workflows/n8n.yml | 135 + AGENTS.md | 14 - apps/docs/app/globals.css | 6 + apps/docs/components/api/copied-tooltip.tsx | 3 +- apps/docs/components/api/endpoint-header.tsx | 11 +- apps/docs/components/api/endpoint-link.tsx | 112 +- .../docs/components/api/scope-roles-table.tsx | 9 +- apps/docs/components/mdx/cli-commands.tsx | 23 +- apps/docs/components/mdx/sdk-commands.tsx | 19 +- apps/docs/content/guides/forms/handling.mdx | 5 +- apps/docs/content/guides/n8n.mdx | 181 - apps/docs/content/guides/n8n/advanced.mdx | 192 + apps/docs/content/guides/n8n/migration.mdx | 111 + apps/docs/content/guides/n8n/overview.mdx | 66 + apps/docs/content/guides/n8n/resources.mdx | 338 + apps/docs/content/guides/n8n/setup.mdx | 121 + apps/docs/content/guides/n8n/trigger.mdx | 136 + .../content/guides/n8n/troubleshooting.mdx | 140 + apps/docs/content/guides/n8n/workflows.mdx | 193 + apps/docs/content/guides/sdk/csharp.mdx | 10 +- apps/docs/content/guides/sdk/go.mdx | 7 +- apps/docs/content/guides/sdk/kotlin.mdx | 7 +- apps/docs/content/guides/sdk/overview.mdx | 4 +- apps/docs/content/guides/sdk/python.mdx | 7 +- apps/docs/content/guides/sdk/swift.mdx | 7 +- apps/docs/content/guides/sdk/typescript.mdx | 8 +- apps/docs/content/guides/webhook.mdx | 6 + apps/docs/content/home.mdx | 2 +- apps/docs/content/updates.mdx | 4 +- apps/docs/lib/openapi/mapper.ts | 2 +- apps/docs/lib/openapi/resolve-links.ts | 8 +- .../guides/ViewSubmitWebhookPayload.json | 50 - apps/docs/lib/tabs-config.ts | 17 +- apps/docs/public/api/bots/list-events.md | 12 + apps/docs/public/api/models.md | 12 + apps/docs/public/guides/forms/handling.md | 25 +- apps/docs/public/guides/n8n.md | 200 - apps/docs/public/guides/n8n/advanced.md | 209 + apps/docs/public/guides/n8n/migration.md | 110 + apps/docs/public/guides/n8n/overview.md | 57 + apps/docs/public/guides/n8n/resources.md | 353 + apps/docs/public/guides/n8n/setup.md | 159 + apps/docs/public/guides/n8n/trigger.md | 154 + .../docs/public/guides/n8n/troubleshooting.md | 140 + apps/docs/public/guides/n8n/workflows.md | 208 + apps/docs/public/guides/sdk/csharp.md | 12 +- apps/docs/public/guides/sdk/go.md | 7 +- apps/docs/public/guides/sdk/kotlin.md | 7 +- apps/docs/public/guides/sdk/overview.md | 2 +- apps/docs/public/guides/sdk/python.md | 7 +- apps/docs/public/guides/sdk/swift.md | 7 +- apps/docs/public/guides/sdk/typescript.md | 8 +- apps/docs/public/guides/webhook.md | 19 + .../docs/public/images/n8n/ai-agent-tool.avif | Bin 0 -> 47673 bytes .../public/images/n8n/community-nodes.avif | Bin 21283 -> 0 bytes .../public/images/n8n/credentials-list.avif | Bin 0 -> 41913 bytes .../public/images/n8n/credentials-search.avif | Bin 0 -> 20063 bytes .../public/images/n8n/credentials-test.avif | Bin 0 -> 24858 bytes .../public/images/n8n/credentials-v2.avif | Bin 0 -> 25534 bytes apps/docs/public/images/n8n/credentials.avif | Bin 25732 -> 0 bytes .../images/n8n/error-invalid-token.avif | Bin 0 -> 53754 bytes apps/docs/public/images/n8n/file-upload.avif | Bin 0 -> 29533 bytes .../public/images/n8n/main-dashboard.avif | Bin 0 -> 15305 bytes .../public/images/n8n/message-buttons.avif | Bin 0 -> 30581 bytes .../public/images/n8n/message-get-many.avif | Bin 0 -> 24294 bytes .../docs/public/images/n8n/n8n-interface.avif | Bin 82095 -> 28286 bytes .../images/n8n/node-message-create.avif | Bin 0 -> 38071 bytes .../public/images/n8n/operation-dropdown.avif | Bin 0 -> 28638 bytes .../docs/public/images/n8n/owner-account.avif | Bin 15096 -> 20973 bytes .../images/n8n/resource-dropdown-all.avif | Bin 0 -> 29262 bytes .../public/images/n8n/resource-dropdown.avif | Bin 0 -> 36009 bytes apps/docs/public/images/n8n/return-all.avif | Bin 0 -> 24294 bytes .../images/n8n/searchable-dropdown.avif | Bin 0 -> 31636 bytes apps/docs/public/images/n8n/trigger-add.avif | Bin 0 -> 30521 bytes .../public/images/n8n/trigger-events.avif | Bin 0 -> 34678 bytes apps/docs/public/images/n8n/trigger-node.avif | Bin 0 -> 25627 bytes .../public/images/n8n/workflow-add-node.avif | Bin 0 -> 30521 bytes .../public/images/n8n/workflow-approval.avif | Bin 0 -> 28046 bytes .../public/images/n8n/workflow-editor.avif | Bin 37797 -> 0 bytes .../public/images/n8n/workflow-example.avif | Bin 56700 -> 0 bytes .../images/n8n/workflow-execute-success.avif | Bin 0 -> 50309 bytes .../public/images/n8n/workflow-forward.avif | Bin 0 -> 28203 bytes .../images/n8n/workflow-monitoring.avif | Bin 0 -> 25338 bytes .../images/n8n/workflow-output-data.avif | Bin 0 -> 50597 bytes .../images/n8n/workflow-pachca-node.avif | Bin 0 -> 49269 bytes .../public/images/n8n/workflow-reminder.avif | Bin 0 -> 24687 bytes .../images/n8n/workflow-trigger-example.avif | Bin 0 -> 47544 bytes .../public/images/n8n/workflow-vacation.avif | Bin 0 -> 56706 bytes .../public/images/n8n/workflow-welcome.avif | Bin 0 -> 25186 bytes apps/docs/public/index.md | 2 +- apps/docs/public/llms-full.txt | 1968 +++- apps/docs/public/llms.txt | 11 +- apps/docs/public/skill.md | 11 +- apps/docs/public/updates.md | 4 +- .../workflows/n8n/approval-handler.json | 88 + apps/docs/public/workflows/n8n/approval.json | 38 + apps/docs/public/workflows/n8n/forward.json | 52 + .../docs/public/workflows/n8n/monitoring.json | 66 + apps/docs/public/workflows/n8n/reminder.json | 66 + .../workflows/n8n/vacation-handler.json | 71 + apps/docs/public/workflows/n8n/vacation.json | 55 + apps/docs/public/workflows/n8n/welcome.json | 52 + apps/docs/redirects.ts | 2 + apps/docs/scripts/generate-llms.ts | 51 +- bun.lock | 1293 ++- integrations/n8n/.gitignore | 11 + integrations/n8n/.npmrc | 1 + integrations/n8n/CHANGELOG.md | 26 + integrations/n8n/LICENSE | 21 + integrations/n8n/README.md | 269 + integrations/n8n/changelog.json | 16 + .../n8n/credentials/PachcaApi.credentials.ts | 64 + integrations/n8n/credentials/pachca.dark.svg | 3 + integrations/n8n/credentials/pachca.svg | 3 + integrations/n8n/docs/CONTRIBUTORS.md | 72 + integrations/n8n/docs/DEVELOPMENT.md | 136 + integrations/n8n/eslint.config.mjs | 26 + integrations/n8n/examples/basic-usage.json | 69 + integrations/n8n/icons/pachca.dark.svg | 3 + integrations/n8n/icons/pachca.svg | 3 + integrations/n8n/index.js | 1 + .../n8n/nodes/Pachca/GenericFunctions.ts | 812 ++ .../n8n/nodes/Pachca/Pachca.node.json | 24 + integrations/n8n/nodes/Pachca/Pachca.node.ts | 25 + .../n8n/nodes/Pachca/PachcaTrigger.node.json | 24 + .../n8n/nodes/Pachca/PachcaTrigger.node.ts | 183 + integrations/n8n/nodes/Pachca/SharedRouter.ts | 968 ++ .../n8n/nodes/Pachca/V1/BotDescription.ts | 58 + .../n8n/nodes/Pachca/V1/ChatDescription.ts | 305 + .../Pachca/V1/CustomFieldsDescription.ts | 86 + .../n8n/nodes/Pachca/V1/FileDescription.ts | 111 + .../n8n/nodes/Pachca/V1/FormDescription.ts | 569 ++ .../nodes/Pachca/V1/GroupTagDescription.ts | 181 + .../n8n/nodes/Pachca/V1/MessageDescription.ts | 502 + .../n8n/nodes/Pachca/V1/PachcaV1.node.ts | 206 + .../nodes/Pachca/V1/ReactionsDescription.ts | 99 + .../n8n/nodes/Pachca/V1/StatusDescription.ts | 89 + .../n8n/nodes/Pachca/V1/TaskDescription.ts | 182 + .../n8n/nodes/Pachca/V1/ThreadDescription.ts | 64 + .../n8n/nodes/Pachca/V1/UserDescription.ts | 367 + .../n8n/nodes/Pachca/V2/BotDescription.ts | 85 + .../n8n/nodes/Pachca/V2/ChatDescription.ts | 322 + .../Pachca/V2/CustomPropertyDescription.ts | 40 + .../n8n/nodes/Pachca/V2/ExportDescription.ts | 118 + .../n8n/nodes/Pachca/V2/FileDescription.ts | 76 + .../n8n/nodes/Pachca/V2/FormDescription.ts | 337 + .../nodes/Pachca/V2/GroupTagDescription.ts | 215 + .../nodes/Pachca/V2/LinkPreviewDescription.ts | 41 + .../n8n/nodes/Pachca/V2/MemberDescription.ts | 426 + .../n8n/nodes/Pachca/V2/MessageDescription.ts | 566 ++ .../n8n/nodes/Pachca/V2/PachcaV2.node.ts | 218 + .../n8n/nodes/Pachca/V2/ProfileDescription.ts | 124 + .../nodes/Pachca/V2/ReactionDescription.ts | 134 + .../nodes/Pachca/V2/ReadMemberDescription.ts | 56 + .../n8n/nodes/Pachca/V2/SearchDescription.ts | 322 + .../nodes/Pachca/V2/SecurityDescription.ts | 159 + .../n8n/nodes/Pachca/V2/TaskDescription.ts | 323 + .../n8n/nodes/Pachca/V2/ThreadDescription.ts | 53 + .../n8n/nodes/Pachca/V2/UserDescription.ts | 585 ++ integrations/n8n/nodes/Pachca/pachca.dark.svg | 3 + integrations/n8n/nodes/Pachca/pachca.svg | 3 + integrations/n8n/package.json | 79 + integrations/n8n/scripts/freeze-v1.ts | 312 + integrations/n8n/scripts/generate-n8n.ts | 3239 +++++++ integrations/n8n/scripts/utils.ts | 165 + integrations/n8n/tests/compatibility.test.ts | 709 ++ integrations/n8n/tests/contract.test.ts | 850 ++ .../n8n/tests/execute-helpers.test.ts | 850 ++ .../n8n/tests/generic-functions.test.ts | 142 + integrations/n8n/tests/router.test.ts | 1379 +++ integrations/n8n/tests/routes-spec.test.ts | 507 + integrations/n8n/tsconfig.json | 29 + package.json | 6 +- packages/generator/src/lang/csharp.ts | 19 +- .../snapshots/cs/Utils.cs | 1 + .../tests/allof-sibling/snapshots/cs/Utils.cs | 1 + .../tests/circular-ref/snapshots/cs/Utils.cs | 1 + .../tests/crud/snapshots/cs/Client.cs | 2 +- .../tests/crud/snapshots/cs/Utils.cs | 1 + .../tests/deep-nesting/snapshots/cs/Utils.cs | 1 + .../tests/edge-cases/snapshots/cs/Client.cs | 4 +- .../tests/edge-cases/snapshots/cs/Utils.cs | 1 + .../tests/enums/snapshots/cs/Utils.cs | 1 + .../tests/models/snapshots/cs/Utils.cs | 1 + .../multi-path-params/snapshots/cs/Utils.cs | 1 + .../tests/nullable-ref/snapshots/cs/Utils.cs | 1 + .../tests/oneof/snapshots/cs/Utils.cs | 1 + .../tests/patch/snapshots/cs/Utils.cs | 1 + .../tests/record/snapshots/cs/Utils.cs | 1 + .../tests/redirect/snapshots/cs/Utils.cs | 1 + .../reserved-keywords/snapshots/cs/Utils.cs | 1 + .../tests/search/snapshots/cs/Client.cs | 6 +- .../tests/search/snapshots/cs/Utils.cs | 1 + .../tests/unions/snapshots/cs/Utils.cs | 1 + .../tests/unwrap/snapshots/cs/Utils.cs | 1 + .../tests/upload/snapshots/cs/Utils.cs | 1 + packages/openapi-parser/package.json | 3 +- packages/spec/examples.ts | 193 + packages/spec/openapi.en.yaml | 8249 +++++++++++++++++ packages/spec/openapi.yaml | 53 + packages/spec/overlay.en.yaml | 3106 +++++++ packages/spec/package.json | 8 +- packages/spec/scripts/apply-overlay.ts | 437 + packages/spec/scripts/validate-overlay.ts | 266 + packages/spec/typespec.tsp | 42 + sdk/csharp/generated/Client.cs | 38 +- sdk/csharp/generated/Models.cs | 16 + sdk/csharp/generated/Pachca.csproj | 1 + sdk/csharp/generated/Utils.cs | 1 + .../generated/bin/Debug/net8.0/Pachca.dll | Bin 236032 -> 236544 bytes .../generated/bin/Debug/net8.0/Pachca.pdb | Bin 71372 -> 71812 bytes sdk/csharp/generated/examples.json | 22 +- .../obj/Debug/net8.0/Pachca.AssemblyInfo.cs | 4 +- .../net8.0/Pachca.AssemblyInfoInputs.cache | 2 +- ....GeneratedMSBuildEditorConfig.editorconfig | 6 +- .../obj/Debug/net8.0/Pachca.assets.cache | Bin 150 -> 156 bytes .../Pachca.csproj.CoreCompileInputs.cache | 2 +- .../net8.0/Pachca.csproj.FileListAbsolute.txt | 14 + .../generated/obj/Debug/net8.0/Pachca.dll | Bin 236032 -> 236544 bytes .../generated/obj/Debug/net8.0/Pachca.pdb | Bin 71372 -> 71812 bytes .../obj/Debug/net8.0/Pachca.sourcelink.json | 2 +- .../generated/obj/Debug/net8.0/ref/Pachca.dll | Bin 97792 -> 98304 bytes .../obj/Debug/net8.0/refint/Pachca.dll | Bin 97792 -> 98304 bytes .../obj/Pachca.csproj.nuget.dgspec.json | 24 +- .../generated/obj/Pachca.csproj.nuget.g.props | 8 +- sdk/csharp/generated/obj/project.assets.json | 22 +- sdk/csharp/generated/obj/project.nuget.cache | 4 +- sdk/go/generated/types.go | 17 + .../src/main/kotlin/com/pachca/Models.kt | 11 + sdk/python/generated/pachca/models.py | 13 +- .../Pachca/GeneratedSources/Models.swift | 35 + sdk/typescript/src/generated/types.ts | 12 +- sdk/typescript/src/generated/utils.ts | 2 +- turbo.json | 34 +- 234 files changed, 36804 insertions(+), 1437 deletions(-) create mode 100644 .github/workflows/n8n.yml delete mode 100644 apps/docs/content/guides/n8n.mdx create mode 100644 apps/docs/content/guides/n8n/advanced.mdx create mode 100644 apps/docs/content/guides/n8n/migration.mdx create mode 100644 apps/docs/content/guides/n8n/overview.mdx create mode 100644 apps/docs/content/guides/n8n/resources.mdx create mode 100644 apps/docs/content/guides/n8n/setup.mdx create mode 100644 apps/docs/content/guides/n8n/trigger.mdx create mode 100644 apps/docs/content/guides/n8n/troubleshooting.mdx create mode 100644 apps/docs/content/guides/n8n/workflows.mdx delete mode 100644 apps/docs/lib/schemas/guides/ViewSubmitWebhookPayload.json delete mode 100644 apps/docs/public/guides/n8n.md create mode 100644 apps/docs/public/guides/n8n/advanced.md create mode 100644 apps/docs/public/guides/n8n/migration.md create mode 100644 apps/docs/public/guides/n8n/overview.md create mode 100644 apps/docs/public/guides/n8n/resources.md create mode 100644 apps/docs/public/guides/n8n/setup.md create mode 100644 apps/docs/public/guides/n8n/trigger.md create mode 100644 apps/docs/public/guides/n8n/troubleshooting.md create mode 100644 apps/docs/public/guides/n8n/workflows.md create mode 100644 apps/docs/public/images/n8n/ai-agent-tool.avif delete mode 100644 apps/docs/public/images/n8n/community-nodes.avif create mode 100644 apps/docs/public/images/n8n/credentials-list.avif create mode 100644 apps/docs/public/images/n8n/credentials-search.avif create mode 100644 apps/docs/public/images/n8n/credentials-test.avif create mode 100644 apps/docs/public/images/n8n/credentials-v2.avif delete mode 100644 apps/docs/public/images/n8n/credentials.avif create mode 100644 apps/docs/public/images/n8n/error-invalid-token.avif create mode 100644 apps/docs/public/images/n8n/file-upload.avif create mode 100644 apps/docs/public/images/n8n/main-dashboard.avif create mode 100644 apps/docs/public/images/n8n/message-buttons.avif create mode 100644 apps/docs/public/images/n8n/message-get-many.avif create mode 100644 apps/docs/public/images/n8n/node-message-create.avif create mode 100644 apps/docs/public/images/n8n/operation-dropdown.avif create mode 100644 apps/docs/public/images/n8n/resource-dropdown-all.avif create mode 100644 apps/docs/public/images/n8n/resource-dropdown.avif create mode 100644 apps/docs/public/images/n8n/return-all.avif create mode 100644 apps/docs/public/images/n8n/searchable-dropdown.avif create mode 100644 apps/docs/public/images/n8n/trigger-add.avif create mode 100644 apps/docs/public/images/n8n/trigger-events.avif create mode 100644 apps/docs/public/images/n8n/trigger-node.avif create mode 100644 apps/docs/public/images/n8n/workflow-add-node.avif create mode 100644 apps/docs/public/images/n8n/workflow-approval.avif delete mode 100644 apps/docs/public/images/n8n/workflow-editor.avif delete mode 100644 apps/docs/public/images/n8n/workflow-example.avif create mode 100644 apps/docs/public/images/n8n/workflow-execute-success.avif create mode 100644 apps/docs/public/images/n8n/workflow-forward.avif create mode 100644 apps/docs/public/images/n8n/workflow-monitoring.avif create mode 100644 apps/docs/public/images/n8n/workflow-output-data.avif create mode 100644 apps/docs/public/images/n8n/workflow-pachca-node.avif create mode 100644 apps/docs/public/images/n8n/workflow-reminder.avif create mode 100644 apps/docs/public/images/n8n/workflow-trigger-example.avif create mode 100644 apps/docs/public/images/n8n/workflow-vacation.avif create mode 100644 apps/docs/public/images/n8n/workflow-welcome.avif create mode 100644 apps/docs/public/workflows/n8n/approval-handler.json create mode 100644 apps/docs/public/workflows/n8n/approval.json create mode 100644 apps/docs/public/workflows/n8n/forward.json create mode 100644 apps/docs/public/workflows/n8n/monitoring.json create mode 100644 apps/docs/public/workflows/n8n/reminder.json create mode 100644 apps/docs/public/workflows/n8n/vacation-handler.json create mode 100644 apps/docs/public/workflows/n8n/vacation.json create mode 100644 apps/docs/public/workflows/n8n/welcome.json create mode 100644 integrations/n8n/.gitignore create mode 100644 integrations/n8n/.npmrc create mode 100644 integrations/n8n/CHANGELOG.md create mode 100644 integrations/n8n/LICENSE create mode 100644 integrations/n8n/README.md create mode 100644 integrations/n8n/changelog.json create mode 100644 integrations/n8n/credentials/PachcaApi.credentials.ts create mode 100644 integrations/n8n/credentials/pachca.dark.svg create mode 100644 integrations/n8n/credentials/pachca.svg create mode 100644 integrations/n8n/docs/CONTRIBUTORS.md create mode 100644 integrations/n8n/docs/DEVELOPMENT.md create mode 100644 integrations/n8n/eslint.config.mjs create mode 100644 integrations/n8n/examples/basic-usage.json create mode 100644 integrations/n8n/icons/pachca.dark.svg create mode 100644 integrations/n8n/icons/pachca.svg create mode 100644 integrations/n8n/index.js create mode 100644 integrations/n8n/nodes/Pachca/GenericFunctions.ts create mode 100644 integrations/n8n/nodes/Pachca/Pachca.node.json create mode 100644 integrations/n8n/nodes/Pachca/Pachca.node.ts create mode 100644 integrations/n8n/nodes/Pachca/PachcaTrigger.node.json create mode 100644 integrations/n8n/nodes/Pachca/PachcaTrigger.node.ts create mode 100644 integrations/n8n/nodes/Pachca/SharedRouter.ts create mode 100644 integrations/n8n/nodes/Pachca/V1/BotDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V1/ChatDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V1/CustomFieldsDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V1/FileDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V1/FormDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V1/GroupTagDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V1/MessageDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V1/PachcaV1.node.ts create mode 100644 integrations/n8n/nodes/Pachca/V1/ReactionsDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V1/StatusDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V1/TaskDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V1/ThreadDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V1/UserDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/BotDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/ChatDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/CustomPropertyDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/ExportDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/FileDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/FormDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/GroupTagDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/LinkPreviewDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/MemberDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/MessageDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/PachcaV2.node.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/ProfileDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/ReactionDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/ReadMemberDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/SearchDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/SecurityDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/TaskDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/ThreadDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/V2/UserDescription.ts create mode 100644 integrations/n8n/nodes/Pachca/pachca.dark.svg create mode 100644 integrations/n8n/nodes/Pachca/pachca.svg create mode 100644 integrations/n8n/package.json create mode 100644 integrations/n8n/scripts/freeze-v1.ts create mode 100644 integrations/n8n/scripts/generate-n8n.ts create mode 100644 integrations/n8n/scripts/utils.ts create mode 100644 integrations/n8n/tests/compatibility.test.ts create mode 100644 integrations/n8n/tests/contract.test.ts create mode 100644 integrations/n8n/tests/execute-helpers.test.ts create mode 100644 integrations/n8n/tests/generic-functions.test.ts create mode 100644 integrations/n8n/tests/router.test.ts create mode 100644 integrations/n8n/tests/routes-spec.test.ts create mode 100644 integrations/n8n/tsconfig.json create mode 100644 packages/spec/examples.ts create mode 100644 packages/spec/openapi.en.yaml create mode 100644 packages/spec/overlay.en.yaml create mode 100644 packages/spec/scripts/apply-overlay.ts create mode 100644 packages/spec/scripts/validate-overlay.ts diff --git a/.github/workflows/n8n.yml b/.github/workflows/n8n.yml new file mode 100644 index 00000000..5a122e4d --- /dev/null +++ b/.github/workflows/n8n.yml @@ -0,0 +1,135 @@ +name: n8n Node + +on: + push: + branches: [main] + paths: + - 'integrations/n8n/**' + - 'packages/spec/openapi.yaml' + - 'packages/spec/workflows.ts' + - 'packages/spec/examples.ts' + - 'packages/openapi-parser/src/**' + - 'packages/generator/src/naming.ts' + - 'apps/docs/lib/openapi/mapper.ts' + - 'apps/docs/lib/openapi/example-generator.ts' + pull_request: + branches: [main] + paths: + - 'integrations/n8n/**' + - 'packages/spec/openapi.yaml' + - 'packages/spec/workflows.ts' + - 'packages/spec/examples.ts' + - 'packages/openapi-parser/src/**' + - 'packages/generator/src/naming.ts' + - 'apps/docs/lib/openapi/mapper.ts' + - 'apps/docs/lib/openapi/example-generator.ts' + workflow_dispatch: + +jobs: + generate-and-build: + name: Generate & Build + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v2 + - uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Build parser + working-directory: packages/openapi-parser + run: bun run build + + - name: Generate n8n node + run: bun run integrations/n8n/scripts/generate-n8n.ts + + - name: Type check + working-directory: integrations/n8n + run: bun run tsc --noEmit + + - name: Lint + working-directory: integrations/n8n + run: bun run lint + + - name: Test + working-directory: integrations/n8n + run: bun run test + + - name: Build n8n node + working-directory: integrations/n8n + run: bun run build + + publish: + if: github.event_name == 'push' + needs: generate-and-build + runs-on: ubuntu-latest + concurrency: + group: publish-n8n + cancel-in-progress: false + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v2 + - uses: actions/setup-node@v4 + with: + node-version: 22 + registry-url: "https://registry.npmjs.org" + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Build parser + working-directory: packages/openapi-parser + run: bun run build + + - name: Generate n8n node + run: bun run integrations/n8n/scripts/generate-n8n.ts + + - name: Check version + id: version + run: | + PKG_VERSION=$(node -e "console.log(require('./integrations/n8n/package.json').version)") + CHANGELOG_VERSION=$(node -e "console.log(JSON.parse(require('fs').readFileSync('integrations/n8n/changelog.json'))[0].version)") + + if [ "$PKG_VERSION" != "$CHANGELOG_VERSION" ]; then + echo "::error::Version mismatch: package.json=$PKG_VERSION, changelog.json=$CHANGELOG_VERSION" + exit 1 + fi + + echo "version=$PKG_VERSION" >> $GITHUB_OUTPUT + + # Check if this version already exists on npm + PUBLISHED=$(node -e " + const { execSync } = require('child_process'); + try { + const raw = execSync('npm view n8n-nodes-pachca versions --json', { stdio: ['pipe', 'pipe', 'pipe'] }).toString().trim(); + const versions = JSON.parse(raw); + const list = Array.isArray(versions) ? versions : [versions]; + console.log(list.includes('$PKG_VERSION') ? 'yes' : 'no'); + } catch { console.log('no'); } + ") + echo "published=$PUBLISHED" >> $GITHUB_OUTPUT + + - name: Build n8n node + if: steps.version.outputs.published == 'no' + working-directory: integrations/n8n + run: bun run build + + - name: Scan community package + if: steps.version.outputs.published == 'no' + working-directory: integrations/n8n + run: bun x @n8n/scan-community-package . + + - name: Publish to npm + if: steps.version.outputs.published == 'no' + working-directory: integrations/n8n + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + run: npm publish --access public --provenance diff --git a/AGENTS.md b/AGENTS.md index cac8a157..106f9881 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -80,17 +80,3 @@ npx skills add pachca/openapi ``` More info: [API Docs](https://dev.pachca.com) · [Full reference](https://dev.pachca.com/llms-full.txt) · [OpenAPI spec](https://dev.pachca.com/openapi.yaml) · CLI help: `pachca --help` - -## Generator Development - -When modifying the SDK generator (`packages/generator/src/lang/*.ts`): - -1. Run tests: `cd packages/generator && npm test` -2. **Regenerate test snapshots**: Ask the user to run `bun bin/regen-snapshots.ts` in `packages/generator` -3. Regenerate SDKs: Run `npm run generate` in each `sdk/*` directory - -## Agent Restrictions - -**NEVER run these commands directly** — ask the user to run them: -- `bun bin/regen-snapshots.ts` — regenerates test snapshots -- Any command that bulk-modifies test fixtures or snapshots diff --git a/apps/docs/app/globals.css b/apps/docs/app/globals.css index 66a519b1..c68fd74f 100644 --- a/apps/docs/app/globals.css +++ b/apps/docs/app/globals.css @@ -5,6 +5,7 @@ /* Primary — warm orange (Pachca brand), AA-compliant white text (4.82:1) */ --color-primary: oklch(48% 0.17 50); --color-primary-dark: oklch(42% 0.17 50); + --color-primary-inverted: oklch(72% 0.15 50); /* Text — 4-level hierarchy, warm stone neutrals */ --color-text-primary: oklch(20% 0.01 70); @@ -38,6 +39,7 @@ --color-callout-tip-text: var(--color-accent-green); --color-method-get: oklch(60.2% 0.193 263); + --color-method-get-inverted: oklch(66% 0.193 263); --color-method-post: oklch(63.8% 0.142 143.5); --color-method-put: oklch(55.4% 0.116 77); --color-method-delete: oklch(63.9% 0.179 28); @@ -85,6 +87,7 @@ html.dark { /* Primary — lighter warm orange for dark mode, desaturated */ --color-primary: oklch(72% 0.15 50); --color-primary-dark: oklch(78% 0.13 50); + --color-primary-inverted: oklch(48% 0.17 50); /* Text — warm off-white, clear 3-level separation */ --color-text-primary: oklch(93% 0.007 70); @@ -128,6 +131,7 @@ html.dark { /* HTTP methods — lighter for dark mode readability */ --color-method-get: oklch(66% 0.193 263); + --color-method-get-inverted: oklch(60.2% 0.193 263); --color-method-post: oklch(68% 0.142 143.5); --color-method-put: oklch(68% 0.116 77); --color-method-delete: oklch(67.1% 0.145 17); @@ -149,6 +153,7 @@ html.dark { html:not(.light):not(.dark) { --color-primary: oklch(72% 0.15 50); --color-primary-dark: oklch(78% 0.13 50); + --color-primary-inverted: oklch(48% 0.17 50); --color-text-primary: oklch(93% 0.007 70); --color-text-secondary: oklch(70% 0.012 70); @@ -187,6 +192,7 @@ html.dark { --color-glass-active: oklch(100% 0 0 / 12%); --color-method-get: oklch(66% 0.193 263); + --color-method-get-inverted: oklch(60.2% 0.193 263); --color-method-post: oklch(68% 0.142 143.5); --color-method-put: oklch(68% 0.116 77); --color-method-delete: oklch(67.1% 0.145 17); diff --git a/apps/docs/components/api/copied-tooltip.tsx b/apps/docs/components/api/copied-tooltip.tsx index 18721a81..8f2d2347 100644 --- a/apps/docs/components/api/copied-tooltip.tsx +++ b/apps/docs/components/api/copied-tooltip.tsx @@ -18,10 +18,9 @@ export function CopiedTooltip({ children, open }: CopiedTooltipProps) { align="center" sideOffset={2} collisionPadding={8} - className="z-50 pointer-events-none animate-tooltip bg-text-primary text-background text-[12px] font-semibold rounded-md px-2.5 py-1.5 whitespace-nowrap shadow-xl" + className="z-50 pointer-events-none animate-tooltip rounded-lg px-2.5 py-1.5 shadow-xl border border-glass-heavy-border bg-glass-heavy backdrop-blur-md text-text-primary text-[12px] font-semibold whitespace-nowrap" > Скопировано - diff --git a/apps/docs/components/api/endpoint-header.tsx b/apps/docs/components/api/endpoint-header.tsx index 071008fe..16013596 100644 --- a/apps/docs/components/api/endpoint-header.tsx +++ b/apps/docs/components/api/endpoint-header.tsx @@ -98,7 +98,7 @@ export function EndpointHeader({ align="center" sideOffset={4} collisionPadding={8} - className="z-50 animate-tooltip bg-text-primary text-[12px] font-semibold rounded-md px-2.5 py-1.5 shadow-xl whitespace-nowrap flex items-center gap-1.5" + className="z-50 animate-tooltip rounded-lg px-2.5 py-1.5 shadow-xl border border-glass-heavy-border bg-glass-heavy backdrop-blur-md text-[12px] font-semibold whitespace-nowrap flex items-center gap-1.5" > {requirements.scopeRoles ? ( ROLES.map((r, i) => ( @@ -106,18 +106,17 @@ export function EndpointHeader({ key={r} className={ requirements.scopeRoles!.includes(r) - ? 'text-background' - : 'text-background/40' + ? 'text-text-primary' + : 'text-text-tertiary' } > - {i > 0 && ·} + {i > 0 && ·} {ROLE_LABELS[r]} )) ) : ( - Все роли + Все роли )} - diff --git a/apps/docs/components/api/endpoint-link.tsx b/apps/docs/components/api/endpoint-link.tsx index e2541618..7cbf9e68 100644 --- a/apps/docs/components/api/endpoint-link.tsx +++ b/apps/docs/components/api/endpoint-link.tsx @@ -1,4 +1,7 @@ +'use client'; + import Link from 'next/link'; +import * as Tooltip from '@radix-ui/react-tooltip'; const ENDPOINT_METHOD_COLORS: Record = { GET: 'bg-method-get/10 text-method-get', @@ -8,13 +11,40 @@ const ENDPOINT_METHOD_COLORS: Record = { PATCH: 'bg-method-patch/10 text-method-patch', }; +const ROLES = ['owner', 'admin', 'user', 'bot'] as const; +const ROLE_LABELS: Record = { + owner: 'Владелец', + admin: 'Администратор', + user: 'Сотрудник', + bot: 'Бот', +}; + +const PLAN_NAMES: Record = { + corporation: 'Корпорация', +}; + interface EndpointLinkProps { method?: string; href?: string; + scope?: string; + scopeRoles?: string; + plan?: string; + noAuth?: boolean; children: React.ReactNode; } -export function EndpointLink({ method, href, children }: EndpointLinkProps) { +export function EndpointLink({ + method, + href, + scope, + scopeRoles: scopeRolesStr, + plan, + noAuth, + children, +}: EndpointLinkProps) { + const scopeRoles = scopeRolesStr ? scopeRolesStr.split(',') : undefined; + const hasBadges = scope || plan || noAuth; + const badge = method ? ( ) : null; - if (href) { + const linkContent = ( + <> + {badge} + + {children} + + + ); + + if (!href) { return ( - + {badge} - - {children} - - + {children} + ); } + const link = ( + + {linkContent} + + ); + + if (!hasBadges) { + return link; + } + return ( - - {badge} - {children} - + + {link} + + + {noAuth && ( + + Без авторизации + + )} + {scope && ( + + {scope} + {scopeRoles && ( + + {ROLES.map((r) => ( + + ))} + + )} + + )} + {plan && ( + + {PLAN_NAMES[plan] ?? plan} + + )} + + + ); } diff --git a/apps/docs/components/api/scope-roles-table.tsx b/apps/docs/components/api/scope-roles-table.tsx index fdad2b80..aea6908f 100644 --- a/apps/docs/components/api/scope-roles-table.tsx +++ b/apps/docs/components/api/scope-roles-table.tsx @@ -129,22 +129,21 @@ export function ScopeRolesTable({ schema }: ScopeRolesTableProps) { align="end" sideOffset={4} collisionPadding={8} - className="z-50 animate-tooltip bg-text-primary text-[12px] font-semibold rounded-md px-2.5 py-1.5 shadow-xl whitespace-nowrap flex items-center gap-1.5" + className="z-50 animate-tooltip rounded-lg px-2.5 py-1.5 shadow-xl border border-glass-heavy-border bg-glass-heavy backdrop-blur-md text-[12px] font-semibold whitespace-nowrap flex items-center gap-1.5" > {ROLES.map((r, i) => ( - {i > 0 && ·} + {i > 0 && ·} {ROLE_LABELS[r]} ))} - diff --git a/apps/docs/components/mdx/cli-commands.tsx b/apps/docs/components/mdx/cli-commands.tsx index b1769cd8..55874954 100644 --- a/apps/docs/components/mdx/cli-commands.tsx +++ b/apps/docs/components/mdx/cli-commands.tsx @@ -1,14 +1,25 @@ import { generateNavigation } from '@/lib/navigation'; +import { parseOpenAPI } from '@/lib/openapi/parser'; +import { generateUrlFromOperation } from '@/lib/openapi/mapper'; import { CopyableInlineCode } from '@/components/api/copyable-inline-code'; import { EndpointLink } from '@/components/api/endpoint-link'; +import type { EndpointRequirements } from '@/lib/openapi/types'; export async function CliCommands() { - const sections = await generateNavigation(); + const [sections, api] = await Promise.all([generateNavigation(), parseOpenAPI()]); const methodsSection = sections.find((s) => s.title === 'Методы API'); const allCommands = methodsSection ? methodsSection.items.flatMap((group) => group.children ?? []) : []; + // Build a map from URL to requirements for tooltip data + const requirementsMap = new Map(); + for (const ep of api.endpoints) { + if (ep.requirements) { + requirementsMap.set(generateUrlFromOperation(ep), ep.requirements); + } + } + return (
@@ -25,13 +36,21 @@ export async function CliCommands() { {allCommands.map((item) => { const command = `pachca ${item.href.replace(/^\/api\//, '').replace(/\//g, ' ')}`; + const req = requirementsMap.get(item.href); return ( diff --git a/apps/docs/components/mdx/sdk-commands.tsx b/apps/docs/components/mdx/sdk-commands.tsx index 59516142..55a819cb 100644 --- a/apps/docs/components/mdx/sdk-commands.tsx +++ b/apps/docs/components/mdx/sdk-commands.tsx @@ -3,6 +3,7 @@ import { groupEndpointsByTag, generateUrlFromOperation, generateTitle } from '@/ import { sortTagsByOrder } from '@/lib/guides-config'; import { CopyableInlineCode } from '@/components/api/copyable-inline-code'; import { EndpointLink } from '@/components/api/endpoint-link'; +import type { EndpointRequirements } from '@/lib/openapi/types'; const METHOD_ORDER: Record = { POST: 0, GET: 1, PUT: 2, PATCH: 3, DELETE: 4 }; @@ -62,7 +63,13 @@ export async function SdkCommands({ lang }: SdkCommandsProps) { const grouped = groupEndpointsByTag(api.endpoints); const sortedTags = sortTagsByOrder(Array.from(grouped.keys())); - const rows: Array<{ sdkCall: string; method: string; href: string; title: string }> = []; + const rows: Array<{ + sdkCall: string; + method: string; + href: string; + title: string; + requirements?: EndpointRequirements; + }> = []; for (const tag of sortedTags) { const endpoints = grouped.get(tag)!; @@ -74,6 +81,7 @@ export async function SdkCommands({ lang }: SdkCommandsProps) { method: endpoint.method, href: generateUrlFromOperation(endpoint), title: generateTitle(endpoint), + requirements: endpoint.requirements, }); } } @@ -98,7 +106,14 @@ export async function SdkCommands({ lang }: SdkCommandsProps) { {row.sdkCall} diff --git a/apps/docs/content/guides/forms/handling.mdx b/apps/docs/content/guides/forms/handling.mdx index 63c182e4..0034ddc2 100644 --- a/apps/docs/content/guides/forms/handling.mdx +++ b/apps/docs/content/guides/forms/handling.mdx @@ -28,10 +28,7 @@ description: Открытие представлений, получение р Каждый исходящий вебхук защищён с помощью подписи, основанной на хешировании содержимого. Подробнее об этом — в разделе [Безопасность](/guides/webhook#bezopasnost). - + ```json title="Пример вебхука о заполнении формы" { diff --git a/apps/docs/content/guides/n8n.mdx b/apps/docs/content/guides/n8n.mdx deleted file mode 100644 index 3966ed78..00000000 --- a/apps/docs/content/guides/n8n.mdx +++ /dev/null @@ -1,181 +0,0 @@ ---- -title: n8n -description: Автоматизации в Пачке через платформу n8n без программирования ---- - -# n8n - -## Что такое n8n - -n8n — платформа для автоматизации рабочих процессов с открытым исходным кодом. Можно развернуть на собственном сервере или использовать веб-версию. Платформа позволяет создавать интеграции с сервисами без написания кода, используя визуальный редактор с узлами (nodes). - -В n8n встроено более 400 готовых узлов для популярных сервисов. Узлы бывают двух типов: - -- **Узел триггера** — событие, запускающее рабочий процесс: новое сообщение, нажатие кнопки, обновление статуса и др. -- **Узел действия** — логика после триггера: отправка сообщения в чат, создание задачи, добавление записи в БД и т.д. - -n8n автоматически выполняет каждое действие по триггеру в указанном порядке. - - - -## Настройка - - - - Расширение Пачки доступно пока только в Beta. Его нет в веб-версии n8n — для использования нужно развернуть коробочную версию на собственном сервере. - - Два способа установки: - - **С помощью команды** (требуется Node.js): - - ```bash - npx n8n - ``` - - **С помощью Docker:** - - ```bash - docker volume create n8n_data - - docker run -it --rm \ - --name n8n \ - -p 5678:5678 \ - -e GENERIC_TIMEZONE="" \ - -e TZ="" \ - -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \ - -e N8N_RUNNERS_ENABLED=true \ - -v n8n_data:/home/node/.n8n \ - docker.n8n.io/n8nio/n8n - ``` - - Подробные инструкции — в [официальной документации n8n](https://docs.n8n.io/hosting/) и на [GitHub](https://github.com/n8n-io/n8n). - - После запуска настройте аккаунт владельца (Owner Account), указав почту, имя и пароль. - - - - - Расширение доступно на [GitHub](https://github.com/pachca/n8n-nodes-pachca) и [npmjs](https://www.npmjs.com/package/n8n-nodes-pachca). - - Три способа установки: - - 1. Зайти в **Settings** > **Community nodes** и добавить `n8n-nodes-pachca` (рекомендуется) - 2. Выполнить команду `npm i n8n-nodes-pachca` в директории n8n - 3. Следовать README-инструкции на [GitHub](https://github.com/pachca/n8n-nodes-pachca) - - - - - Credentials — данные для авторизации. - - Нажмите **«Add Credential»**, найдите **Pachca API** в списке и заполните поля: - - - **Base URL:** `https://api.pachca.com/api/shared/v1` - - **Access Token:** Токен доступа к API. В Пачке доступны два типа токенов: - - Персональный токен — доступен в разделе **Автоматизации** > **Интеграции** > **API** - - Токен бота — доступен в настройках бота на вкладке **API** - - Подробнее о токенах — в разделе [Авторизация](/api/authorization). Credentials можно создать несколько — для разных операций и токенов. - - - - - Workflow — визуальный редактор, в котором выстраиваются цепочки триггеров и действий. - - - - Пример: отправка сообщения от лица бота. Триггер — нажатие кнопки **«Execute Workflow»**, действие — **Send a message** в Пачке: - - - **Credential** — от чьего лица будет отправлено сообщение - - **Entity ID** — ID чата - - **Content** — содержание сообщения - - Не забудьте добавить бота в чат. - - - - В платформу встроено более 400 узлов для популярных сервисов, а дополнительные Community nodes можно установить из интерфейса. При необходимости доступны HTTP-запросы к любому API, условия, кастомный JavaScript- или Python-код. - - - -## Методы API в nodes Pachca (Beta) - -Nodes (узлы) в расширении Пачки для n8n совпадают с методами API. Вот список доступных: - -### Действия с сообщениями - -- **Send a message** — [Новое сообщение](POST /messages) -- **Get a message** — [Информация о сообщении](GET /messages/{id}) -- **Get messages from the chat** — [Список сообщений чата](GET /messages) -- **Update a message** — [Редактирование сообщения](PUT /messages/{id}) -- **Delete a message** — [Удаление сообщения](DELETE /messages/{id}) -- **Pin a message** — [Закрепление сообщения](POST /messages/{id}/pin) -- **Unpin a message** — [Открепление сообщения](DELETE /messages/{id}/pin) -- **Get message readers** — [Список прочитавших сообщение](GET /messages/{id}/read_member_ids) -- **Unfurl message links** — [Unfurl (разворачивание ссылок)](POST /messages/{id}/link_previews) - -### Действия с тредами - -- **Create a thread** — [Новый тред](POST /messages/{id}/thread) -- **Get a thread** — [Информация о треде](GET /threads/{id}) - -### Действия с реакциями - -- **Add a reaction** — [Новая реакция](POST /messages/{id}/reactions) -- **Remove a reaction** — [Удаление реакции](DELETE /messages/{id}/reactions) -- **Get message reactions** — [Список реакций на сообщение](GET /messages/{id}/reactions) - -### Действия с чатом - -- **Get all chats** — [Список чатов](GET /chats) -- **Get a chat** — [Информация о чате](GET /chats/{id}) -- **Create a chat** — [Новый чат](POST /chats) -- **Update a chat** — [Обновление чата](PUT /chats/{id}) -- **Archive a chat** — [Архивация чата](PUT /chats/{id}/archive) -- **Unarchive a chat** — [Разархивация чата](PUT /chats/{id}/unarchive) -- **Get chat members** — [Список участников чата](GET /chats/{id}/members) -- **Add users to chat** — [Добавление пользователей](POST /chats/{id}/members) -- **Remove user from chat** — [Исключение пользователя](DELETE /chats/{id}/members/{user_id}) -- **Update user role in chat** — [Редактирование роли](PUT /chats/{id}/members/{user_id}) -- **Leave a chat** — [Выход из чата](DELETE /chats/{id}/leave) - -### Действия с пользователями - -- **Get all users** — [Список сотрудников](GET /users) -- **Get a user** — [Информация о сотруднике](GET /users/{id}) -- **Create a user** — [Новый сотрудник](POST /users) -- **Update a user** — [Редактирование сотрудника](PUT /users/{id}) -- **Delete a user** — [Удаление сотрудника](DELETE /users/{id}) - -### Действия с тегами пользователей - -- **Get all group tags** — [Список тегов сотрудников](GET /group_tags) -- **Get a group tag** — [Информация о теге](GET /group_tags/{id}) -- **Create a group tag** — [Новый тег](POST /group_tags) -- **Update a group tag** — [Редактирование тега](PUT /group_tags/{id}) -- **Delete a group tag** — [Удаление тега](DELETE /group_tags/{id}) -- **Get users in group tag** — [Список сотрудников тега](GET /group_tags/{id}/users) -- **Add tags to chat** — [Добавление тегов](POST /chats/{id}/group_tags) -- **Remove tag from chat** — [Исключение тега](DELETE /chats/{id}/group_tags/{tag_id}) - -### Действия со статусом и профилем - -- **Get my profile** — [Информация о профиле](GET /profile) -- **Get my status** — [Текущий статус](GET /profile/status) -- **Set my status** — [Новый статус](PUT /profile/status) -- **Clear my status** — [Удаление статуса](DELETE /profile/status) - -### Действия с формами - -- **Create a form** — [Открытие представления](POST /views/open) -- **Process form submission** — закрытие и отображение ошибок -- **Get form templates** - -### Другие действия - -- **Get custom properties** — [Список дополнительных полей](GET /custom_properties) -- **Create a task** — [Новое напоминание](POST /tasks) -- **Update a bot** — [Редактирование бота](PUT /bots/{id}) -- **Upload a file** — [Загрузка файла](POST /direct_url) - -Некоторые действия доступны только с персональным токеном (владельца или участника с ролью «Администратор»). diff --git a/apps/docs/content/guides/n8n/advanced.mdx b/apps/docs/content/guides/n8n/advanced.mdx new file mode 100644 index 00000000..e6eb95e3 --- /dev/null +++ b/apps/docs/content/guides/n8n/advanced.mdx @@ -0,0 +1,192 @@ +--- +title: Продвинутые функции +description: "Экспорт сообщений, загрузка файлов, кнопки, формы, AI-агент, разворачивание ссылок, журнал безопасности" +--- + +# Продвинутые функции + +## Загрузка файлов + + + +Ресурс **File** позволяет загружать файлы через двухшаговый S3 upload. n8n автоматически выполняет оба этапа: запрашивает presigned URL через API и загружает файл на S3. + +**Два источника файлов:** + +| Источник | Описание | +|----------|----------| +| **URL** | Файл загружается по ссылке. Укажите `fileUrl`, `fileName` и `contentType` | +| **Binary Data** | Файл из предыдущего узла workflow (например, из HTTP Request). Укажите `binaryProperty` | + +**Пример workflow: загрузка PDF и отправка в чат** + +1. **HTTP Request** — скачать файл по URL +2. **Pachca** (File > Create) — загрузить файл, получить `key` +3. **Pachca** (Message > Create) — отправить сообщение с прикреплённым файлом, указав `key` в поле `files` + +Загруженные файлы привязываются к сообщениям через массив `files` при создании или обновлении сообщения. Каждый файл описывается объектом с полями: `key`, `name`, `file_type`, `size`. + +Подробнее — в [документации загрузки файлов](/api/file-uploads). + +--- + +## Экспорт сообщений + +Ресурс **Chat Export** позволяет выгружать сообщения из чатов. Экспорт выполняется асинхронно: вы запрашиваете экспорт, а Пачка присылает уведомление на вебхук, когда архив готов. + +**Пример workflow:** + + + + Создайте отдельный workflow с узлом **Webhook** (встроенный в n8n). Он создаст URL, на который Пачка отправит уведомление о готовности экспорта. Скопируйте этот URL — он понадобится на следующем шаге. + + + В основном workflow добавьте узел **Pachca** с ресурсом **Chat Export** и операцией **Create**. Укажите период (`startAt`, `endAt`) и вставьте URL вебхука из первого шага в поле `webhookUrl`. + + + Когда экспорт будет готов, Пачка отправит JSON на ваш вебхук: + ```json + { + "type": "export", + "event": "ready", + "export_id": 22322, + "created_at": "2025-03-20T12:33:58Z" + } + ``` + + + В workflow с Webhook-узлом добавьте узел **Pachca** с ресурсом **Chat Export** и операцией **Get**. Передайте `export_id` из данных вебхука в поле **ID**. Архив будет скачан автоматически. + + + +**Ограничения:** +- Максимальный период одной выгрузки: 45 дней (366 дней при указании конкретных чатов) +- Максимум 50 чатов при фильтрации по `chatIds` +- Новый запрос можно сделать только после завершения текущего + +Подробнее — в [документации экспорта](/guides/export). + +--- + +## Кнопки в сообщениях + + + +При создании или обновлении сообщения можно добавить интерактивные кнопки через поле **Buttons**. Кнопки передаются как JSON-строка. + +Два типа кнопок: + +| Тип | Описание | +|-----|----------| +| **URL-кнопка** | Открывает ссылку в браузере | +| **Data-кнопка** | Отправляет вебхук с `button_pressed` событием | + +Пример JSON для одной строки кнопок: + +```json +[ + [ + { "text": "Открыть сайт", "url": "https://example.com" }, + { "text": "Подтвердить", "data": "confirm_action" } + ] +] +``` + +Максимум 100 кнопок на сообщение, до 8 в одной строке. + +Подробнее о кнопках, их внешнем виде в чате и обработке нажатий — в [документации кнопок](/guides/buttons). + +--- + +## Формы + +Ресурс **Form** позволяет открывать модальные формы (представления) для пользователей. + +**Как это работает:** + +1. Пользователь нажимает Data-кнопку в сообщении бота +2. Бот получает вебхук с `trigger_id` +3. Бот вызывает [Открытие представления](POST /views/open) с `trigger_id` и описанием формы +4. Пользователь видит модальное окно с полями + +**Ключевые параметры:** + +| Параметр | Описание | +|----------|----------| +| `triggerId` | Уникальный ID из вебхука кнопки (действителен 3 секунды) | +| `title` | Заголовок модального окна | +| `type` | Тип представления (по умолчанию `modal`) | +| `blocks` | JSON-массив блоков формы | +| `submitText` | Текст кнопки отправки | +| `closeText` | Текст кнопки закрытия | + +**Пример workflow:** + +1. **Pachca Trigger** — событие `Button Pressed` +2. **Pachca** (Form > Create) — открыть форму с `trigger_id` из триггера +3. **Pachca Trigger** — событие `Form Submitted` (в отдельном workflow) +4. Обработка данных формы + +Подробнее о формах, типах полей и внешнем виде модального окна в интерфейсе Пачки — в [документации форм](/guides/forms/overview). + +--- + +## AI-агент + + + +Оба узла (Pachca и Pachca Trigger) поддерживают `usableAsTool: true` — их можно использовать как инструменты для **AI Agent** в n8n. + +**Что это значит:** + +- AI Agent может вызывать операции Pachca для выполнения задач +- Примеры: поиск сообщений, отправка ответов, создание задач +- Agent автоматически выбирает подходящую операцию на основе запроса + +**Пример: AI-помощник для команды** + + + + Создайте новый workflow. Добавьте узел **AI Agent** и подключите LLM-модель (OpenAI, Anthropic и др.) через соответствующие Credentials. + + + Нажмите **+** на входе **Tool** узла AI Agent и добавьте узел **Pachca**. Выберите нужную операцию — например, **Search > Get Many Messages** для поиска по сообщениям. Добавьте ещё один узел Pachca для **Message > Create** — отправки ответов. + + + Добавьте **Pachca Trigger** с событием `New Message` на вход workflow. AI Agent будет автоматически отвечать на сообщения пользователей, используя поиск по истории чатов. + + + +AI Agent самостоятельно выбирает подходящий инструмент на основе запроса пользователя — ищет информацию, создаёт задачи или отправляет сообщения. + +Для использования AI Agent необходимо настроить LLM-провайдер (OpenAI, Anthropic и др.) в Credentials n8n. + +--- + +## Разворачивание ссылок + +Ресурс **Link Preview** позволяет формировать кастомные превью для ссылок в сообщениях бота. + +Когда бот отправляет сообщение со ссылкой, Пачка может запросить у бота данные для превью. Бот может ответить через [Создание превью ссылки](POST /messages/{id}/link_previews) с заголовком, описанием и изображением. + +Подробнее — в [документации разворачивания ссылок](/guides/link-previews). + +--- + +## Журнал безопасности + +Ресурс **Security** предоставляет доступ к журналу аудита — списку событий безопасности в пространстве. + +**Доступные фильтры:** + +| Фильтр | Описание | +|--------|----------| +| `eventKey` | Тип события (login, message_created, user_deleted и др.) | +| `actorId` | ID пользователя, совершившего действие | +| `actorType` | Тип актора (user или bot) | +| `entityId` | ID сущности, над которой совершено действие | +| `entityType` | Тип сущности | +| `startTime` | Начало временного диапазона | +| `endTime` | Конец временного диапазона | + +Подробнее — в [документации журнала аудита](/guides/audit-events). diff --git a/apps/docs/content/guides/n8n/migration.mdx b/apps/docs/content/guides/n8n/migration.mdx new file mode 100644 index 00000000..3844b442 --- /dev/null +++ b/apps/docs/content/guides/n8n/migration.mdx @@ -0,0 +1,111 @@ +--- +title: Миграция с v1 +description: "Обновление с v1 на v2: таблицы переименований, новые ресурсы, полная обратная совместимость" +--- + +# Миграция с v1 + +Обновление необязательно. Все существующие workflow на v1 продолжают работать без изменений. + +## Полная обратная совместимость + +Версия 2.0 на 100% совместима с v1. При обновлении расширения: + +- Существующие workflow остаются на v1 и работают как прежде +- Новые workflow по умолчанию создаются на v2 с обновлёнными именами +- Переход с v1 на v2 — опциональный + +## Переименованные ресурсы + +| v1 | v2 | Изменение | +|----|-----|-----------| +| `reactions` | `reaction` | Единственное число | +| `status` | `profile` | Более точное имя | +| `customFields` | `customProperty` | Более точное имя | + +## Переименованные операции + +| Ресурс | v1 | v2 | +|--------|-----|-----| +| Message | `send` | `create` | +| Message | `getById` | `get` | +| Chat | `getById` | `get` | +| User | `getById` | `get` | +| Group Tag | `getById` | `get` | +| Group Tag | `getUsers` | `getAllUsers` | +| Reaction | `addReaction` | `create` | +| Reaction | `deleteReaction` | `delete` | +| Reaction | `getReactions` | `getAll` | +| Custom Property | `getCustomProperties` | `get` | +| Profile | `getProfile` | `get` | +| Thread | `createThread` | `create` | +| Thread | `getThread` | `get` | +| Form | `createView` | `create` | +| File | `upload` | `create` | + +## Перенесённые операции + +Некоторые операции из v1 ресурсов были перенесены в новые v2 ресурсы: + +| v1 ресурс | v1 операция | v2 ресурс | v2 операция | +|-----------|-------------|-----------|-------------| +| Chat | `getMembers` | Chat Member | `getAll` | +| Chat | `addUsers` | Chat Member | `create` | +| Chat | `removeUser` | Chat Member | `delete` | +| Chat | `updateRole` | Chat Member | `update` | +| Chat | `leaveChat` | Chat Member | `leave` | +| Group Tag | `addTags` | Chat Member | `addGroupTags` | +| Group Tag | `removeTag` | Chat Member | `removeGroupTags` | +| Message | `getReadMembers` | Read Member | `getAll` | +| Message | `unfurl` | Link Preview | `create` | + +Все перенесённые операции продолжают работать в v1 workflow без изменений. Маршрутизатор автоматически транслирует v1 имена в v2. + +## Новые ресурсы (только v2) + +| Ресурс | Описание | +|--------|----------| +| **Chat Member** | Управление участниками чата: добавление, удаление, роли, теги | +| **Custom Property** | Дополнительные поля пространства | +| **Read Member** | Список прочитавших сообщение | +| **Link Preview** | Разворачивание ссылок в сообщениях | +| **Search** | Полнотекстовый поиск по чатам, сообщениям, пользователям | +| **Chat Export** | Экспорт сообщений из чатов | +| **Security** | Журнал безопасности | + +## Новые функции + +| Функция | Описание | +|---------|----------| +| **Return All / Limit** | Курсорная автопагинация вместо ручного `per`/`page` | +| **Simplify** | Переключатель для получения только ключевых полей из ответа API ([подробнее](/guides/n8n/resources#simplify)) | +| **Pachca Trigger** | Webhook-нода с авторегистрацией вебхука через Bot ID, 16 типов событий | +| **AI Tool Use** | Использование узлов как инструментов AI Agent | +| **Searchable Dropdowns** | Поиск по чатам и пользователям в выпадающих списках | +| **File Upload** | Загрузка файлов через S3 с поддержкой URL и Binary Data | +| **Task CRUD** | Полный CRUD для задач (было только создание) | + +## Как работает совместимость + +Расширение использует паттерн **VersionedNodeType** с `defaultVersion: 2`: + +- **V1** и **V2** — отдельные классы с собственными описаниями ресурсов и операций +- Общий **SharedRouter** обрабатывает запросы обеих версий, транслируя v1 имена ресурсов и операций в v2 на лету +- При обновлении расширения существующие ноды сохраняют `typeVersion: 1` и используют V1 класс — все параметры и поведение остаются прежними +- Новые ноды по умолчанию создаются с `typeVersion: 2` и используют чистый V2 класс +- В Node Creator отображаются только v2 операции — без дубликатов +- V1 ноды в существующих workflow показывают жёлтый баннер «New node version available» с предложением обновиться + +## Как обновить workflow (необязательно) + +При открытии существующего workflow вы увидите жёлтый баннер в настройках v1 нод — это информационное уведомление, менять ничего не нужно. + +Если вы хотите перевести ноду на v2: + +1. Откройте workflow в n8n +2. Удалите v1 ноду Pachca +3. Добавьте новую ноду Pachca (по умолчанию v2) +4. Перенастройте с v2 именами ресурсов и операций +5. API-вызовы идентичны — изменились только имена в UI + +При удалении ноды и добавлении новой вы получите v2 с обновлёнными именами и новыми ресурсами. Все параметры и API endpoint-ы остались прежними. diff --git a/apps/docs/content/guides/n8n/overview.mdx b/apps/docs/content/guides/n8n/overview.mdx new file mode 100644 index 00000000..f248b53f --- /dev/null +++ b/apps/docs/content/guides/n8n/overview.mdx @@ -0,0 +1,66 @@ +--- +title: Обзор +description: Автоматизации в Пачке через платформу n8n — 18 ресурсов, триггер, AI-агент +--- + +# n8n + +## Что такое n8n + +[n8n](https://n8n.io) — платформа для автоматизации рабочих процессов с открытым исходным кодом. Можно развернуть на собственном сервере или использовать веб-версию. Платформа позволяет создавать интеграции с сервисами без написания кода, используя визуальный редактор с узлами (nodes). + +В n8n встроено более 400 готовых узлов для популярных сервисов. Узлы бывают двух типов: + +- **Узел триггера** — событие, запускающее рабочий процесс: новое сообщение, нажатие кнопки, обновление статуса и др. +- **Узел действия** — логика после триггера: отправка сообщения в чат, создание задачи, добавление записи в БД и т.д. + + + +## Что можно автоматизировать + +- **Уведомления из внешних систем** — пересылайте алерты из мониторинга, CI/CD, CRM и других сервисов в чаты Пачки +- **Бот-ассистент** — подключите AI-агент, который ищет по сообщениям и отвечает на вопросы команды +- **Задачи по сообщениям** — автоматически создавайте задачи из сообщений с определённым тегом или реакцией +- **Согласование** — отправляйте кнопки «Одобрить / Отклонить» и обрабатывайте ответ в workflow +- **Онбординг** — приветствуйте новых сотрудников личным сообщением от бота +- **Синхронизация данных** — экспортируйте сообщения, задачи и события в Google Sheets, Notion или другие сервисы +- **Мониторинг и алерты** — проверяйте состояние сервисов по расписанию и отправляйте алерт в чат при сбое + +## Расширение Пачки + +Расширение Пачки для n8n предоставляет два узла: + +| Узел | Тип | Описание | +|------|-----|----------| +| **Pachca** | Действие | 18 ресурсов и более 60 операций для работы с API | +| **Pachca Trigger** | Триггер | 16 типов событий через вебхуки | + + + + Сообщения, чаты, пользователи, задачи, формы, поиск и другие + + + 16 типов событий с авторегистрацией вебхука + + + Используйте Pachca как инструмент AI Agent + + + Cursor-based пагинация с Return All / Limit + + + +## Что нового в v2.0 + +Версия 2.0 — полностью автогенерируемая из OpenAPI-спецификации с сохранением 100% обратной совместимости с v1. + +- **7 новых ресурсов:** Chat Member, Custom Property, Read Member, Link Preview, Search, Chat Export, Security +- **Курсорная пагинация** с Return All / Limit вместо ручного `per`/`page` +- **AI Tool Use** — `usableAsTool: true` для использования с AI Agent +- **Trigger-нода** с авторегистрацией вебхука через Bot ID и 16 типами событий +- **Поисковые выпадающие списки** для Chat ID и User ID +- **Загрузка файлов** через S3 с поддержкой URL и Binary Data +- **Полнотекстовый поиск** по сообщениям, чатам и пользователям +- **Журнал безопасности** — аудит действий пользователей + +Все существующие workflow на v1 продолжают работать без изменений. Подробнее — в разделе [Миграция с v1](/guides/n8n/migration). diff --git a/apps/docs/content/guides/n8n/resources.mdx b/apps/docs/content/guides/n8n/resources.mdx new file mode 100644 index 00000000..3a7dcf5e --- /dev/null +++ b/apps/docs/content/guides/n8n/resources.mdx @@ -0,0 +1,338 @@ +--- +title: Ресурсы и операции +description: Все 18 ресурсов и более 60 операций расширения Пачки для n8n +--- + +# Ресурсы и операции + +В расширении Пачки каждый узел **Pachca** работает по модели **Resource → Operation**: вы выбираете ресурс (например, Message) и операцию над ним (например, Create). + + + +Для каждого ресурса доступен свой набор операций. + + + +## Список ресурсов + +| # | Ресурс | Операций | Описание | Только v2 | +|---|--------|:---:|----------|:---:| +| 1 | [Message](#message) | 7 | Сообщения: создание, редактирование, удаление, закрепление | | +| 2 | [Chat](#chat) | 6 | Чаты: создание, обновление, архивация | | +| 3 | [Chat Member](#chat-member) | 7 | Участники чата: добавление, удаление, роли, теги | да | +| 4 | [User](#user) | 8 | Сотрудники: CRUD, статус | | +| 5 | [Group Tag](#group-tag) | 6 | Теги сотрудников: CRUD, список пользователей | | +| 6 | [Thread](#thread) | 2 | Треды: создание, получение | | +| 7 | [Reaction](#reaction) | 3 | Реакции: создание, удаление, список | | +| 8 | [Profile](#profile) | 5 | Мой профиль: информация, статус | | +| 9 | [Task](#task) | 5 | Задачи: полный CRUD | | +| 10 | [Bot](#bot) | 3 | Боты: обновление, события, удаление событий | | +| 11 | [File](#file) | 1 | Загрузка файлов через S3 | | +| 12 | [Form](#form) | 1 | Модальные формы | | +| 13 | [Custom Property](#custom-property) | 1 | Дополнительные поля | да | +| 14 | [Read Member](#read-member) | 1 | Список прочитавших сообщение | да | +| 15 | [Link Preview](#link-preview) | 1 | Разворачивание ссылок | да | +| 16 | [Search](#search) | 3 | Полнотекстовый поиск | да | +| 17 | [Chat Export](#chat-export) | 2 | Экспорт сообщений из чатов | да | +| 18 | [Security](#security) | 1 | Журнал безопасности | да | + +Для некоторых операций требуются скоупы, которые доступны только определённым ролям (администратор, владелец). При создании персонального токена отображаются только скоупы, доступные вашей роли. Подробнее — в разделе [Авторизация](/api/authorization). + +--- + +## Message + +Сообщения: создание, получение, редактирование, удаление, закрепление и открепление. + +| Операция | API | +|----------|-----| +| Create | [Создание сообщения](POST /messages) | +| Get Many | [Список сообщений чата](GET /messages) | +| Get | [Информация о сообщении](GET /messages/{id}) | +| Update | [Редактирование сообщения](PUT /messages/{id}) | +| Delete | [Удаление сообщения](DELETE /messages/{id}) | +| Pin | [Закрепление сообщения](POST /messages/{id}/pin) | +| Unpin | [Открепление сообщения](DELETE /messages/{id}/pin) | + +**Ключевые параметры Create:** `entityId` (ID чата или пользователя), `content` (текст, Markdown), `entityType` (discussion, user, thread), `files`, `buttons`, `parentMessageId`. + + + +--- + +## Chat + +Чаты: создание, получение, обновление, архивация и разархивация. + +| Операция | API | +|----------|-----| +| Create | [Создание чата](POST /chats) | +| Get Many | [Список чатов](GET /chats) | +| Get | [Информация о чате](GET /chats/{id}) | +| Update | [Обновление чата](PUT /chats/{id}) | +| Archive | [Архивация чата](PUT /chats/{id}/archive) | +| Unarchive | [Разархивация чата](PUT /chats/{id}/unarchive) | + +--- + +## Chat Member + +Управление участниками чата: добавление, удаление, изменение ролей, управление тегами. + +В v1 эти операции были частью ресурса Chat. В v2 они выделены в отдельный ресурс Chat Member. + +| Операция | API | +|----------|-----| +| Get Many | [Список участников чата](GET /chats/{id}/members) | +| Create | [Добавление пользователей в чат](POST /chats/{id}/members) | +| Delete | [Удаление пользователя из чата](DELETE /chats/{id}/members/{user_id}) | +| Update | [Изменение роли участника](PUT /chats/{id}/members/{user_id}) | +| Leave | [Выход из чата](DELETE /chats/{id}/leave) | +| Add Group Tags | [Добавление тегов к чату](POST /chats/{id}/group_tags) | +| Remove Group Tags | [Удаление тегов из чата](DELETE /chats/{id}/group_tags/{tag_id}) | + +--- + +## User + +Сотрудники: полный CRUD, получение и управление статусом. + +| Операция | API | +|----------|-----| +| Create | [Создание сотрудника](POST /users) | +| Get Many | [Список сотрудников](GET /users) | +| Get | [Информация о сотруднике](GET /users/{id}) | +| Update | [Обновление сотрудника](PUT /users/{id}) | +| Delete | [Удаление сотрудника](DELETE /users/{id}) | +| Get Status | [Получение статуса](GET /users/{user_id}/status) | +| Update Status | [Обновление статуса](PUT /users/{user_id}/status) | +| Delete Status | [Удаление статуса](DELETE /users/{user_id}/status) | + +--- + +## Group Tag + +Теги (группы) сотрудников: создание, обновление, удаление, список пользователей. + +| Операция | API | +|----------|-----| +| Create | [Создание тега](POST /group_tags) | +| Get Many | [Список тегов](GET /group_tags) | +| Get | [Информация о теге](GET /group_tags/{id}) | +| Update | [Обновление тега](PUT /group_tags/{id}) | +| Delete | [Удаление тега](DELETE /group_tags/{id}) | +| Get Many Users | [Список пользователей тега](GET /group_tags/{id}/users) | + +--- + +## Thread + +Треды (комментарии к сообщениям): создание и получение. + +| Операция | API | +|----------|-----| +| Create | [Создание треда](POST /messages/{id}/thread) | +| Get | [Информация о треде](GET /threads/{id}) | + +--- + +## Reaction + +Реакции на сообщения: создание, удаление, список. + +| Операция | API | +|----------|-----| +| Create | [Добавление реакции](POST /messages/{id}/reactions) | +| Delete | [Удаление реакции](DELETE /messages/{id}/reactions) | +| Get Many | [Список реакций](GET /messages/{id}/reactions) | + +--- + +## Profile + +Профиль текущего пользователя: информация, статус, информация о токене. + +| Операция | API | +|----------|-----| +| Get | [Информация о профиле](GET /profile) | +| Get Info | [Информация о токене](GET /oauth/token/info) | +| Get Status | [Получение статуса](GET /profile/status) | +| Update Status | [Обновление статуса](PUT /profile/status) | +| Delete Status | [Удаление статуса](DELETE /profile/status) | + +--- + +## Task + +Задачи (напоминания): полный CRUD. + +| Операция | API | +|----------|-----| +| Create | [Создание задачи](POST /tasks) | +| Get Many | [Список задач](GET /tasks) | +| Get | [Информация о задаче](GET /tasks/{id}) | +| Update | [Обновление задачи](PUT /tasks/{id}) | +| Delete | [Удаление задачи](DELETE /tasks/{id}) | + +**Типы задач:** `call`, `email`, `event`, `meeting`, `reminder`. + +--- + +## Bot + +Управление ботами: обновление настроек, получение и удаление событий. + +| Операция | API | +|----------|-----| +| Update | [Обновление бота](PUT /bots/{id}) | +| Get Many Events | [Список событий бота](GET /webhooks/events) | +| Remove Events | [Удаление событий](DELETE /webhooks/events/{id}) | + +--- + +## File + +Загрузка файлов через двухшаговый S3 upload. + +| Операция | API | +|----------|-----| +| Create | [Загрузка файла](POST /uploads) | + +Подробнее — в разделе [Продвинутые функции](/guides/n8n/advanced#zagruzka-fajlov). + +--- + +## Form + +Модальные формы (представления). + +| Операция | API | +|----------|-----| +| Create | [Открытие представления](POST /views/open) | + +Подробнее — в разделе [Продвинутые функции](/guides/n8n/advanced#formy) и в [документации форм](/guides/forms/overview). + +--- + +## Custom Property + +Дополнительные поля пространства. + +| Операция | API | +|----------|-----| +| Get | [Список дополнительных полей](GET /custom_properties) | + +--- + +## Read Member + +Список пользователей, прочитавших сообщение. + +| Операция | API | +|----------|-----| +| Get Many | [Список прочитавших](GET /messages/{id}/read_member_ids) | + +--- + +## Link Preview + +Разворачивание ссылок в сообщениях. + +| Операция | API | +|----------|-----| +| Create | [Создание превью ссылки](POST /messages/{id}/link_previews) | + +Подробнее — в [документации разворачивания ссылок](/guides/link-previews). + +--- + +## Search + +Полнотекстовый поиск по сообщениям, чатам и пользователям. + +| Операция | API | +|----------|-----| +| Get Many Chats | [Поиск чатов](GET /search/chats) | +| Get Many Messages | [Поиск сообщений](GET /search/messages) | +| Get Many Users | [Поиск пользователей](GET /search/users) | + +**Обязательный параметр:** `query` — строка поиска. + +--- + +## Chat Export + +Экспорт сообщений из чатов: запрос экспорта и скачивание архива. + +| Операция | API | +|----------|-----| +| Create | [Запрос экспорта](POST /chats/exports) | +| Get | [Скачивание архива](GET /chats/exports/{id}) | + +**Ключевые параметры Create:** `startAt` (дата начала, YYYY-MM-DD), `endAt` (дата окончания), `webhookUrl` (URL для уведомления о готовности). + +**Дополнительные параметры:** `chatIds` (экспорт конкретных чатов, до 50), `skipChatsFile` (не создавать chats.json). + +Экспорт выполняется асинхронно. После завершения Пачка отправит вебхук на указанный `webhookUrl` с `export_id`. Используйте операцию **Get** для скачивания готового архива. + +Подробнее — в разделе [Продвинутые функции](/guides/n8n/advanced#eksport-soobshhenij) и в [документации экспорта](/guides/export). + +--- + +## Security + +Журнал безопасности: отслеживание действий пользователей. + +| Операция | API | +|----------|-----| +| Get Many | [Список событий аудита](GET /audit_events) | + +**Фильтры:** `eventKey`, `actorId`, `actorType`, `entityId`, `entityType`, `startTime`, `endTime`. + +Подробнее — в [документации журнала аудита](/guides/audit-events). + +--- + +## Пагинация + +Все операции Get Many поддерживают автоматическую курсорную пагинацию: + +- **Return All** = `true` — получить все результаты автоматически, переключаясь между страницами +- **Return All** = `false` — получить не более **Limit** результатов (по умолчанию 50) + + + +n8n автоматически отправляет повторные запросы с курсором до получения всех данных. + +Для операций со списками (Get Many) рекомендуется использовать **Return All = false** с разумным **Limit**, чтобы избежать долгих запросов при большом объёме данных. + +--- + +## Simplify + +Операции получения данных (Get, Get Many) поддерживают переключатель **Simplify** (включён по умолчанию). Когда Simplify включён, из ответа API возвращаются только ключевые поля — остальные отбрасываются. + +| Ресурс | Ключевые поля | +|--------|---------------| +| Message | `id`, `entity_id`, `chat_id`, `content`, `user_id`, `created_at` | +| Chat | `id`, `name`, `channel`, `public`, `members_count`, `created_at` | +| User | `id`, `first_name`, `last_name`, `nickname`, `email`, `role`, `suspended` | +| Task | `id`, `content`, `kind`, `status`, `priority`, `due_at`, `created_at` | +| Bot | `id`, `name`, `created_at` | +| Group Tag | `id`, `name`, `users_count` | +| Reaction | `id`, `code`, `user_id`, `created_at` | +| Chat Export | `id`, `status`, `created_at` | + +Чтобы получить все поля ответа — выключите **Simplify**. + +Simplify доступен только в v2. В v1 workflow всегда возвращают полный ответ API. + +--- + +## Поисковые выпадающие списки + + + +Для поля **Chat ID** доступен поиск по имени: начните вводить текст, и n8n покажет подходящие результаты из вашего пространства Пачки. + +Поиск вызывает API-эндпоинт [Поиск чатов](GET /search/chats) и работает только с валидным `Access Token` в Credentials. diff --git a/apps/docs/content/guides/n8n/setup.mdx b/apps/docs/content/guides/n8n/setup.mdx new file mode 100644 index 00000000..73cf07a0 --- /dev/null +++ b/apps/docs/content/guides/n8n/setup.mdx @@ -0,0 +1,121 @@ +--- +title: Настройка +description: Установка n8n, расширения Пачки, настройка Credentials и первый workflow +--- + +# Настройка + +## Установка + + + + Два способа установки: + + **С помощью команды** (требуется Node.js 22+): + + ```bash + npx n8n + ``` + + **С помощью Docker:** + + ```bash + docker volume create n8n_data + + docker run -it --rm \ + --name n8n \ + -p 5678:5678 \ + -e GENERIC_TIMEZONE="Europe/Moscow" \ + -e TZ="Europe/Moscow" \ + -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \ + -e N8N_RUNNERS_ENABLED=true \ + -v n8n_data:/home/node/.n8n \ + docker.n8n.io/n8nio/n8n + ``` + + Подробные инструкции — в [официальной документации n8n](https://docs.n8n.io/hosting/) и на [GitHub](https://github.com/n8n-io/n8n). + + После запуска откройте `http://localhost:5678` и настройте аккаунт владельца (Owner Account), указав почту, имя и пароль. + + + + После входа вы увидите главный экран n8n с пустым списком workflow. + + + + + Расширение доступно на [npm](https://www.npmjs.com/package/n8n-nodes-pachca) и [GitHub](https://github.com/pachca/openapi/tree/main/integrations/n8n). + + Три способа установки: + + 1. Зайти в **Settings** > **Community nodes** и добавить `n8n-nodes-pachca` (рекомендуется) + 2. Выполнить команду `npm i n8n-nodes-pachca` в директории n8n + 3. Следовать README-инструкции на [GitHub](https://github.com/pachca/openapi/tree/main/integrations/n8n) + + + Credentials — данные для авторизации. Перейдите в **Credentials** и нажмите **Add Credential**. + + + + Найдите **Pachca API** в списке и заполните поля: + + + + | Поле | Обязательное | Описание | + |------|:---:|----------| + | **Base URL** | нет | Базовый URL API. По умолчанию `https://api.pachca.com/api/shared/v1`. Менять только для on-premise | + | **Access Token** | да | Токен доступа к API | + | **Bot ID** | нет | ID бота — нужен для авторегистрации вебхука в [Pachca Trigger](/guides/n8n/trigger) | + | **Signing Secret** | нет | Секрет для верификации входящих webhook-запросов (HMAC-SHA256) | + + + + + В Пачке доступны два типа токенов: + + - **Персональный токен** — доступен в разделе **Автоматизации** > **Интеграции** > **API** + - **Токен бота** — доступен в настройках бота на вкладке **API** + + Доступные операции зависят от [скоупов](/api/authorization#skoupy) токена, а не от его типа. Подробнее — в разделе [Авторизация](/api/authorization). + + После заполнения полей нажмите **Test** — n8n проверит подключение вызовом [Информация о токене](GET /oauth/token/info). При успехе вы увидите подтверждение. + + + + Если тест не проходит — проверьте правильность токена и доступность API. Подробнее — в разделе [Устранение ошибок](/guides/n8n/troubleshooting). + + + Workflow — визуальный редактор, в котором выстраиваются цепочки триггеров и действий. Создайте новый workflow и добавьте триггер **Manual Trigger** для ручного запуска. + + Нажмите **+** на выходе триггера и найдите **Pachca** в списке узлов. + + + + После добавления узла на канвасе появится цепочка: Manual Trigger → Pachca. + + + + + Дважды кликните на узел **Pachca** и настройте: + + - **Credential:** выберите созданный Pachca API + - **Resource:** Message + - **Operation:** Create + - **Entity ID:** ID чата (число) + - **Content:** текст сообщения + + + + Перед отправкой сообщения [добавьте бота в чат](/guides/bots#dostupy-bota-k-chatam-i-soobscheniyam). + + Закройте панель настроек и нажмите **Execute Workflow**. При успехе узлы подсветятся зелёным и покажут количество обработанных элементов. + + + + Откройте узел Pachca, чтобы увидеть ответ API с данными созданного сообщения. + + + + Больше примеров — в разделе [Примеры workflow](/guides/n8n/workflows). + + diff --git a/apps/docs/content/guides/n8n/trigger.mdx b/apps/docs/content/guides/n8n/trigger.mdx new file mode 100644 index 00000000..c4626f32 --- /dev/null +++ b/apps/docs/content/guides/n8n/trigger.mdx @@ -0,0 +1,136 @@ +--- +title: Триггер +description: "Pachca Trigger: 16 типов событий, авторегистрация вебхука, проверка подписи" +--- + +# Триггер + +Узел **Pachca Trigger** запускает workflow при наступлении события в Пачке — новое сообщение, нажатие кнопки, отправка формы, изменение состава команды и др. + +## Поддерживаемые события + +### Сообщения и чаты + +| Событие | Значение | Описание | +|---------|----------|----------| +| Новое сообщение | `new_message` | Создание сообщения в чате | +| Сообщение изменено | `message_updated` | Редактирование существующего сообщения | +| Сообщение удалено | `message_deleted` | Удаление сообщения | +| Новая реакция | `new_reaction` | Добавление реакции к сообщению | +| Реакция удалена | `reaction_deleted` | Удаление реакции с сообщения | +| Участник добавлен | `chat_member_added` | Добавление участника в чат | +| Участник удалён | `chat_member_removed` | Удаление участника из чата | + +### Интерактивные элементы + +| Событие | Значение | Описание | +|---------|----------|----------| +| Нажатие кнопки | `button_pressed` | Клик по Data-кнопке в сообщении | +| Отправка формы | `form_submitted` | Отправка модальной формы | +| Ссылка отправлена | `link_shared` | Бот может развернуть превью ссылки | + +### Сотрудники + +| Событие | Значение | Описание | +|---------|----------|----------| +| Приглашение сотрудника | `company_member_invite` | Отправлено приглашение новому сотруднику | +| Подтверждение регистрации | `company_member_confirm` | Сотрудник подтвердил регистрацию | +| Активация сотрудника | `company_member_activate` | Сотрудник активирован | +| Обновление сотрудника | `company_member_update` | Изменение данных сотрудника | +| Приостановка сотрудника | `company_member_suspend` | Сотрудник приостановлен | +| Удаление сотрудника | `company_member_delete` | Сотрудник удалён | + +### Wildcard + +| Событие | Значение | Описание | +|---------|----------|----------| +| Все события | `*` | Получать все типы событий | + + + +Бот получает события только из чатов, в которых он состоит. Убедитесь, что бот добавлен в нужные чаты. + +## Настройка + +Добавьте узел **Pachca Trigger** в workflow — найдите его через поиск в панели узлов. + + + +### Автоматический режим (рекомендуется) + + + +При наличии **Bot ID** в [Credentials](/guides/n8n/setup#sozdanie-credentials) вебхук регистрируется автоматически: + + + + Откройте Pachca API Credentials и заполните поле **Bot ID** — это ID вашего бота в Пачке. + + + Создайте новый workflow и добавьте узел **Pachca Trigger**. Выберите нужный тип события. + + + Нажмите **Activate**. n8n автоматически вызовет [Обновление бота](PUT /bots/{id}) и зарегистрирует webhook URL в настройках бота. + + + +При деактивации workflow вебхук автоматически удаляется. + +>Pachca: PUT /bots/{id}
webhook_url=n8n_url + Pachca->>Bot: Webhook зарегистрирован + + Note over Bot: Событие в чате + Bot->>Pachca: Новое сообщение + Pachca->>n8n: POST webhook_url
+ payload + signature + Note over n8n: Проверка подписи + n8n->>n8n: Запуск workflow + + Note over n8n: Деактивация workflow + n8n->>Pachca: PUT /bots/{id}
webhook_url=null + Pachca->>Bot: Webhook удалён`} +/> + +### Ручной режим + +Если **Bot ID** не указан в Credentials: + +1. Добавьте узел **Pachca Trigger** в workflow +2. Скопируйте сгенерированный **Webhook URL** из настроек узла +3. Вставьте URL в настройки бота в Пачке (раздел **Webhook URL**) +4. Активируйте workflow + +## Проверка подписи + +Для защиты от поддельных запросов добавьте **Signing Secret** бота в [Credentials](/guides/n8n/setup#sozdanie-credentials). Trigger автоматически проверяет HMAC-SHA256 подпись каждого входящего запроса и отклоняет невалидные. + +Подробнее о механизме подписи — в разделе [Исходящие вебхуки](/guides/webhook#bezopasnost). + +Рекомендуется всегда использовать Signing Secret в продакшене для защиты от несанкционированных запросов. + +## Фильтрация событий + +Выберите конкретный тип события для фильтрации — workflow будет запускаться только при совпадении. Можно выбрать только один тип события на один узел Trigger. + +Используйте **All Events** (`*`) и фильтруйте в последующих узлах (например, через IF или Switch), если нужна сложная логика маршрутизации по типу события или обработка нескольких типов в одном workflow. + +## Пример: бот-эхо + + + +Простой workflow, который отвечает на каждое новое сообщение: + +1. **Pachca Trigger** — событие `New Message` +2. **IF** — условие: `message.user_id` не равен ID бота (чтобы бот не отвечал сам себе) +3. **Pachca** — операция `Message > Create`, `entityId` = ID чата из триггера, `content` = текст ответа + +ID бота — это `user_id` из ответа [Информация о профиле](GET /profile) при авторизации токеном бота. + +Больше готовых сценариев — в разделе [Примеры workflow](/guides/n8n/workflows). diff --git a/apps/docs/content/guides/n8n/troubleshooting.mdx b/apps/docs/content/guides/n8n/troubleshooting.mdx new file mode 100644 index 00000000..85ab6057 --- /dev/null +++ b/apps/docs/content/guides/n8n/troubleshooting.mdx @@ -0,0 +1,140 @@ +--- +title: Устранение ошибок +description: "Частые ошибки при работе с Пачкой в n8n: неверный токен, 403, 429, вебхук не приходит" +--- + +# Устранение ошибок + +## Ошибки авторизации + +### 401 Unauthorized — неверный токен + + + +**Причина:** указан некорректный или просроченный Access Token. + +**Решение:** + +1. Откройте **Credentials** и проверьте значение **Access Token** +2. Убедитесь, что токен скопирован целиком, без лишних пробелов +3. Нажмите **Test** — при ошибке создайте новый токен в Пачке +4. Для бот-токена: **Настройки бота** → вкладка **API** → скопируйте токен +5. Для персонального токена: **Автоматизации** → **Интеграции** → **API** + +### 403 Forbidden — недостаточно прав + +**Причина:** операция требует более высокий уровень доступа, чем предоставляет текущий токен. + +**Решение:** + +Доступ к операциям определяется [скоупами](/api/authorization#skoupy) токена, а не его типом. Убедитесь, что ваш токен включает нужные скоупы: + +| Операция | Требуемые скоупы | +|----------|-----------------| +| Управление сотрудниками (User > Create/Update/Delete) | `users:write` (доступен администраторам и владельцам) | +| Журнал безопасности (Security > Get Many) | `audit_events:read` (доступен администраторам и владельцам) | +| Управление тегами (Group Tag > Create/Update/Delete) | `group_tags:write` (доступен администраторам и владельцам) | +| Отправка сообщений, чаты, задачи | `messages:write`, `chats:write`, `tasks:write` | + +Подробнее — в разделе [Авторизация](/api/authorization). + +--- + +## Ошибки лимитов + +### 429 Too Many Requests — превышение лимита + +**Причина:** слишком много запросов за единицу времени. + +**Лимиты API:** + +| Тип операции | Лимит | +|-------------|-------| +| Отправка сообщений | ~4 запроса/сек на чат | +| Остальные операции | ~50 запросов/сек | + +**Решение:** + +1. Добавьте узел **Wait** между операциями для замедления +2. Используйте **Batching** в настройках узла Pachca (Additional Fields → Request Options → Batching) +3. Для массовых операций используйте **Return All** = `false` с ограниченным **Limit** + +При получении 429 или 5xx расширение автоматически повторяет запросы с экспоненциальной задержкой и jitter (до 5 попыток). Учитывается заголовок `Retry-After` из ответа API. + +--- + +## Ошибки триггера + +### Вебхук не приходит + +**Возможные причины и решения:** + +1. **Бот не добавлен в чат** — бот получает события только из чатов, в которых он состоит. Добавьте бота в нужный канал +2. **Workflow не активирован** — нажмите **Activate** в правом верхнем углу. Неактивные workflow не принимают вебхуки +3. **Bot ID не указан** — при отсутствии Bot ID в Credentials авторегистрация не работает. Укажите Bot ID или настройте вебхук вручную +4. **n8n недоступен извне** — при локальной установке Пачка не может отправить вебхук на `localhost`. Используйте туннель (ngrok, Cloudflare Tunnel) или разверните n8n на сервере с публичным IP + +### Ошибка подписи (Signature Mismatch) + +**Причина:** Signing Secret в Credentials не совпадает с секретом бота в Пачке. + +**Решение:** скопируйте Signing Secret из настроек бота в Пачке (вкладка **API**) и вставьте в Credentials. + +--- + +## Ошибки данных + +### Entity ID не найден + +**Причина:** указан несуществующий ID чата, пользователя или сообщения. + +**Решение:** + +- Для чатов: используйте **Search** (Search > Get Many Chats) для поиска по имени +- Для пользователей: используйте **Search** (Search > Get Many Users) для поиска +- Для сообщений: убедитесь, что сообщение не было удалено + +### Бот не может отправить сообщение + +**Причина:** бот не является участником целевого чата. + +**Решение:** добавьте бота в чат. Бот может отправлять сообщения только в те чаты, в которых он состоит. + +--- + +## Ошибки форм + +### Форма не открывается + +**Причина:** `trigger_id` из события `button_pressed` действителен только **3 секунды**. Если между получением вебхука и вызовом [Открытие представления](POST /views/open) проходит больше времени — форма не откроется. + +**Решение:** + +1. Убедитесь, что узел **Form > Create** стоит сразу после триггера, без долгих операций между ними +2. Не используйте узел **Wait** между получением `trigger_id` и открытием формы +3. Если нужна дополнительная логика — выполняйте её после отправки формы, а не до + +Подробнее о формах — в [документации форм](/guides/forms/overview). + +--- + +## Ошибки пагинации + +### Возвращаются не все данные + +**Причина:** API возвращает данные постранично. Если **Return All** выключен, вы получаете только первую страницу (по умолчанию до 50 записей). + +**Решение:** + +1. Включите **Return All** = `true` в настройках узла — n8n автоматически пройдёт по всем страницам через cursor-based пагинацию +2. Если нужен ограниченный набор — используйте **Return All** = `false` и укажите нужное число в поле **Limit** +3. Для больших объёмов данных учитывайте [лимиты API](#oshibki-limitov) — при Return All n8n делает несколько запросов последовательно + +--- + +## Общие рекомендации + +1. **Включите Retry On Fail** в настройках узла (Settings → Retry On Fail) для автоматического повтора при временных ошибках +2. **Используйте Error Trigger** для обработки ошибок в отдельном workflow — отправляйте уведомление об ошибке в специальный канал +3. **Проверяйте Credentials** кнопкой **Test** перед запуском workflow +4. **Используйте Execute Step** для отладки узлов по одному, не запуская весь workflow diff --git a/apps/docs/content/guides/n8n/workflows.mdx b/apps/docs/content/guides/n8n/workflows.mdx new file mode 100644 index 00000000..b7b06471 --- /dev/null +++ b/apps/docs/content/guides/n8n/workflows.mdx @@ -0,0 +1,193 @@ +--- +title: Примеры workflow +description: "Готовые сценарии автоматизации Пачки в n8n: приветствие, пересылка, задачи, согласование, мониторинг, заявки на отпуск" +--- + +# Примеры workflow + +Ниже — готовые сценарии, которые можно воспроизвести в n8n. Каждый пример использует узлы **Pachca** и **Pachca Trigger** из расширения. + +## Приветствие нового сотрудника + +Автоматическое приветственное сообщение при добавлении сотрудника в канал. + + + +**Как работает:** + +1. **Pachca Trigger** — событие `New Message` +2. **IF** — проверка: сообщение системное (тип `user_joined`) +3. **Pachca** (Message > Create) — отправка приветствия в тот же чат + +**Что можно добавить:** отправка личного сообщения с полезными ссылками, добавление сотрудника в рабочие каналы. + + + Готовый workflow для импорта в n8n + + +После импорта замените Credentials на свои во всех узлах Pachca. + +--- + +## Пересылка сообщений между каналами + +Автоматическая пересылка сообщений из одного чата в другой. + + + +**Как работает:** + +1. **Pachca Trigger** — событие `New Message` (в исходном канале) +2. **IF** — фильтрация: пропускать сервисные сообщения, пересылать только пользовательские +3. **Pachca** (Message > Create) — отправка в целевой канал с указанием автора + +**Когда полезно:** дублирование важных новостей в общие каналы, агрегация обсуждений. + + + Готовый workflow для импорта в n8n + + +После импорта замените Credentials, `CHAT_ID_ИСТОЧНИКА` и `CHAT_ID_ЦЕЛЕВОГО` на свои значения. + +--- + +## Напоминание о задачах + +Ежедневная проверка просроченных задач с уведомлением в чат. + + + +**Как работает:** + +1. **Schedule Trigger** — ежедневный запуск (например, в 10:00) +2. **Pachca** (Task > Get Many) — получение списка задач +3. **IF** — фильтр: только просроченные (дедлайн < сегодня) +4. **Pachca** (Message > Create) — уведомление в чат со списком задач + +**Что можно добавить:** личные уведомления ответственным, группировка по проектам. + + + Готовый workflow для импорта в n8n + + +После импорта замените Credentials и `CHAT_ID` во всех узлах Pachca. + +--- + +## Согласование с кнопками + +Запрос на согласование через сообщение с кнопками и обработка ответа. + + + +**Как работает:** + +1. **Manual Trigger** или **Webhook** — инициация запроса +2. **Pachca** (Message > Create) — отправка сообщения с кнопками «Согласовать» / «Отклонить» +3. **Pachca Trigger** (в отдельном workflow) — событие `Button Pressed` +4. **Switch** — маршрутизация по `data` из нажатой кнопки +5. **Pachca** (Message > Update) — обновление исходного сообщения с результатом + +**Пример кнопок:** + +```json +[ + [ + { "text": "Согласовать", "data": "approve" }, + { "text": "Отклонить", "data": "reject" } + ] +] +``` + +Подробнее о кнопках — в разделе [Продвинутые функции](/guides/n8n/advanced#knopki-v-soobshheniyax). + + + + Отправка запроса с кнопками + + + Обработка нажатий кнопок + + + +После импорта замените Credentials и `CHAT_ID` во всех узлах Pachca. + +--- + +## Мониторинг и алерты + +Периодическая проверка состояния и отправка алерта при аномалиях. + + + +**Как работает:** + +1. **Schedule Trigger** — проверка каждые 5 минут +2. **HTTP Request** — запрос к внешнему API или сервису +3. **IF** — проверка: статус не 200 или метрика выше порога +4. **Pachca** (Message > Create) — отправка алерта в канал мониторинга + +**Что можно добавить:** проверка нескольких сервисов, графики через разворачивание ссылок, эскалация в личные сообщения. + + + Готовый workflow для импорта в n8n + + +После импорта замените Credentials, `CHAT_ID_МОНИТОРИНГА` и URL сервиса во всех узлах Pachca. + +--- + +## Заявка на отпуск + +Полноценный сценарий с кнопками, формой и согласованием в треде — бот принимает заявку через модальную форму и отправляет на согласование руководителю. + + + +**Как работает (два workflow):** + +**Workflow 1 — Приём заявки:** + +1. **Pachca Trigger** — событие `New Message`, фильтр по команде `/отпуск` +2. **Pachca** (Message > Create) — отправка сообщения с Data-кнопкой «Создать заявку» +3. **Pachca Trigger** (событие `Button Pressed`) — пользователь нажимает кнопку +4. **Pachca** (Form > Create) — открытие модальной формы с полями «Дата начала», «Дата окончания», «Комментарий» + +**Workflow 2 — Обработка и согласование:** + +1. **Pachca Trigger** — событие `Form Submitted` +2. **Pachca** (Thread > Create) — создание треда с деталями заявки +3. **Pachca** (Message > Create) — отправка в тред кнопок «Согласовать» / «Отклонить» +4. **Pachca Trigger** (событие `Button Pressed`) — руководитель нажимает кнопку +5. **Pachca** (Message > Create) — уведомление сотрудника о результате + +**Что задействовано:** триггер, кнопки, формы, треды, условная логика. + +Подробнее о кнопках — в разделе [Кнопки в сообщениях](/guides/n8n/advanced#knopki-v-soobshheniyax), о формах — в разделе [Формы](/guides/n8n/advanced#formy). + + + + Приём команды и кнопка заявки + + + Форма, тред и согласование + + + +После импорта замените Credentials и `CHAT_ID_HR` во всех узлах Pachca. + +--- + +## AI-ассистент + +Бот, использующий AI для ответов на вопросы на основе истории чата. + + + +**Как работает:** + +1. **Pachca Trigger** — событие `New Message` +2. **AI Agent** — обработка запроса с LLM +3. **Pachca** (Search > Get Many Messages) — как Tool для поиска информации +4. **Pachca** (Message > Create) — как Tool для отправки ответа + +Для использования AI Agent необходимо настроить LLM-провайдер (OpenAI, Anthropic и др.) в n8n. Подробнее — в разделе [Продвинутые функции](/guides/n8n/advanced#ai-agent). diff --git a/apps/docs/content/guides/sdk/csharp.mdx b/apps/docs/content/guides/sdk/csharp.mdx index 0bf2158e..af59fdfe 100644 --- a/apps/docs/content/guides/sdk/csharp.mdx +++ b/apps/docs/content/guides/sdk/csharp.mdx @@ -1,9 +1,9 @@ --- -title: CSharp +title: "C#" description: Типизированный клиент для Pachca API на C# с async/await и автопагинацией --- -# CSharp +# C# NuGet @@ -182,11 +182,11 @@ catch (OAuthError e) ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Отмена запросов diff --git a/apps/docs/content/guides/sdk/go.mdx b/apps/docs/content/guides/sdk/go.mdx index eaeb3fae..5e75fa31 100644 --- a/apps/docs/content/guides/sdk/go.mdx +++ b/apps/docs/content/guides/sdk/go.mdx @@ -205,12 +205,13 @@ if err != nil { ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Тело запроса пересоздаётся через `req.GetBody()` при каждой попытке +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Типы diff --git a/apps/docs/content/guides/sdk/kotlin.mdx b/apps/docs/content/guides/sdk/kotlin.mdx index a67cb022..b3611926 100644 --- a/apps/docs/content/guides/sdk/kotlin.mdx +++ b/apps/docs/content/guides/sdk/kotlin.mdx @@ -191,12 +191,13 @@ try { ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests` или серверной ошибки (`5xx`): +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — линейный backoff: 1 сек, 2 сек, 3 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff с jitter +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Реализовано через плагин Ktor `HttpRequestRetry` +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Типы diff --git a/apps/docs/content/guides/sdk/overview.mdx b/apps/docs/content/guides/sdk/overview.mdx index 9721819e..d2301ca2 100644 --- a/apps/docs/content/guides/sdk/overview.mdx +++ b/apps/docs/content/guides/sdk/overview.mdx @@ -20,7 +20,7 @@ description: Типизированные клиентские библиоте go get · sync · net/http JitPack · coroutines · Ktor SPM · async throws · URLSession - NuGet · async/await · HttpClient + NuGet · async/await · HttpClient Автоматически обновляются при каждом обновлении спецификации. [Исходный код на GitHub](https://github.com/pachca/openapi/tree/main/sdk). @@ -58,7 +58,7 @@ npx @pachca/generator --spec https://example.com/openapi.yaml --output ./generat |-------------|----------| | **16 сервисов** | Типизированные методы для каждого API-эндпоинта | | **Автопагинация** | Методы `*All()` для автоматического обхода всех страниц | -| **Повторные запросы** | Автоматический retry при `429` с экспоненциальным backoff | +| **Повторные запросы** | Автоматический retry при `429` и `5xx` с экспоненциальным backoff | | **Обработка ошибок** | Типизированные `ApiError` и `OAuthError` | | **Сериализация** | Автоматическая конвертация между форматами (snake_case ↔ camelCase) | | **Авторизация** | Bearer-токен передаётся один раз при создании клиента | diff --git a/apps/docs/content/guides/sdk/python.mdx b/apps/docs/content/guides/sdk/python.mdx index 87ca9e7d..229bb95a 100644 --- a/apps/docs/content/guides/sdk/python.mdx +++ b/apps/docs/content/guides/sdk/python.mdx @@ -180,12 +180,13 @@ except OAuthError as error: ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Реализовано через `RetryTransport` — обёртку над httpx-транспортом +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Типы diff --git a/apps/docs/content/guides/sdk/swift.mdx b/apps/docs/content/guides/sdk/swift.mdx index 7256b31a..35228aa0 100644 --- a/apps/docs/content/guides/sdk/swift.mdx +++ b/apps/docs/content/guides/sdk/swift.mdx @@ -177,12 +177,13 @@ do { ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Ожидание через `Task.sleep(nanoseconds:)` — не блокирует поток +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Типы diff --git a/apps/docs/content/guides/sdk/typescript.mdx b/apps/docs/content/guides/sdk/typescript.mdx index 8376af4f..c478b18a 100644 --- a/apps/docs/content/guides/sdk/typescript.mdx +++ b/apps/docs/content/guides/sdk/typescript.mdx @@ -179,12 +179,12 @@ try { ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек -- Все остальные ошибки возвращаются сразу без retry +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Сериализация diff --git a/apps/docs/content/guides/webhook.mdx b/apps/docs/content/guides/webhook.mdx index 0100ccb4..4de717fc 100644 --- a/apps/docs/content/guides/webhook.mdx +++ b/apps/docs/content/guides/webhook.mdx @@ -58,6 +58,12 @@ description: Получение уведомлений о событиях в р +### Заполнение формы + +Вебхук отправляется при отправке пользователем заполненной формы ([представления](/guides/forms/overview)). Подробнее об обработке результатов — в разделе [Обработка форм](/guides/forms/handling). + + + ### Изменение участников чатов Вебхук отправляется при изменении состава участников чатов, где состоит бот, и в тредах этих чатов. diff --git a/apps/docs/content/home.mdx b/apps/docs/content/home.mdx index e3ad8f94..711880df 100644 --- a/apps/docs/content/home.mdx +++ b/apps/docs/content/home.mdx @@ -51,7 +51,7 @@ hideTableOfContents: true Подключайте Пачку к внешним сервисам без написания кода. - + Визуальные автоматизации diff --git a/apps/docs/content/updates.mdx b/apps/docs/content/updates.mdx index 3b9139f2..d80c0234 100644 --- a/apps/docs/content/updates.mdx +++ b/apps/docs/content/updates.mdx @@ -13,7 +13,7 @@ useUpdatesComponent: true ## C# SDK -Добавлен официальный [C# SDK](/guides/sdk/csharp) для .NET 8+. Полная поддержка async/await, CancellationToken, автопагинация через `*AllAsync()` методы и автоматические повторы при `429`. Установка: `dotnet add package Pachca.Sdk`. +Добавлен официальный [C# SDK](/guides/sdk/csharp) для .NET 8+. Типизированный клиент с поддержкой async/await, автопагинацией и автоматическими повторными запросами при ошибках сервера. Все примеры кода в документации API теперь доступны на C#. @@ -96,7 +96,7 @@ useUpdatesComponent: true - [Кнопки](/guides/buttons) — интерактивные кнопки в сообщениях - [Входящие вебхуки](/guides/incoming-webhooks) — отправка сообщений через URL - [Разворачивание ссылок](/guides/link-previews) — unfurl-боты для предпросмотра ссылок -- [Albato](/guides/albato) и [n8n](/guides/n8n) — интеграции с no-code платформами +- [Albato](/guides/albato) и [n8n](/guides/n8n/overview) — интеграции с no-code платформами Документация реструктурирована: [Быстрый старт](/guides/quickstart), [Пагинация](/api/pagination), [Загрузка файлов](/api/file-uploads), [Запросы и ответы](/api/requests-responses) вынесены в отдельные страницы, раздел форм разбит на три страницы. diff --git a/apps/docs/lib/openapi/mapper.ts b/apps/docs/lib/openapi/mapper.ts index 1e11917d..68e667d2 100644 --- a/apps/docs/lib/openapi/mapper.ts +++ b/apps/docs/lib/openapi/mapper.ts @@ -1,5 +1,5 @@ import type { Endpoint } from './types'; -import { toSlug } from '@/lib/utils/transliterate'; +import { toSlug } from '../utils/transliterate'; // Overrides for auto-generated command URLs that produce ugly names. // Key: "METHOD /path", value: "/section/action" for the CLI URL. diff --git a/apps/docs/lib/openapi/resolve-links.ts b/apps/docs/lib/openapi/resolve-links.ts index 116cb1b4..70697d75 100644 --- a/apps/docs/lib/openapi/resolve-links.ts +++ b/apps/docs/lib/openapi/resolve-links.ts @@ -20,7 +20,13 @@ export function resolveEndpointLinks( if (endpoint) { const url = generateUrlFromOperation(endpoint); if (mdx) { - return `${description.trim()}`; + const req = endpoint.requirements; + const attrs: string[] = [`method="${method}"`, `href="${url}"`]; + if (req?.scope) attrs.push(`scope="${req.scope}"`); + if (req?.scopeRoles) attrs.push(`scopeRoles="${req.scopeRoles.join(',')}"`); + if (req?.plan) attrs.push(`plan="${req.plan}"`); + if (req?.auth === false) attrs.push(`noAuth`); + return `${description.trim()}`; } return `[${description.trim()}](${method}:${url})`; } diff --git a/apps/docs/lib/schemas/guides/ViewSubmitWebhookPayload.json b/apps/docs/lib/schemas/guides/ViewSubmitWebhookPayload.json deleted file mode 100644 index ca3dee1e..00000000 --- a/apps/docs/lib/schemas/guides/ViewSubmitWebhookPayload.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "title": "Структура исходящего вебхука о заполнении формы", - "schema": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "Тип объекта (для представлений всегда view)", - "enum": ["view"], - "x-enum-descriptions": { "view": "представление" } - }, - "event": { - "type": "string", - "description": "Тип события (для отправки пользователем формы всегда submit)", - "enum": ["submit"], - "x-enum-descriptions": { "submit": "отправка формы" } - }, - "private_metadata": { - "type": "string", - "description": "Строка, заданная при отправке представления", - "example": "{\"order_id\": 123}" - }, - "callback_id": { - "type": "string", - "description": "Идентификатор для распознавания этого представления, заданный при отправке представления", - "example": "feedback_form" - }, - "user_id": { - "type": "integer", - "description": "Идентификатор пользователя, который заполнил форму", - "example": 456 - }, - "data": { - "type": "object", - "description": "JSON карта заполненных полей представления, где каждый ключ - значение поля name.", - "properties": { - "name": { - "type": ["string", "array of strings", "array of objects", "null", "[]"], - "description": "Значение, которое указал пользователь в поле (или массив значений, если это был множественный выбор или загруженные пользователем файлы). Если пользователь не указал значение, тогда null (или пустой массив, если это поле файлов или чекбоксов)" - } - } - }, - "webhook_timestamp": { - "type": "integer", - "description": "Дата и время отправки вебхука (UTC+0) в формате UNIX", - "example": 1705312200 - } - } - } -} diff --git a/apps/docs/lib/tabs-config.ts b/apps/docs/lib/tabs-config.ts index e56c2808..1bc2c7f1 100644 --- a/apps/docs/lib/tabs-config.ts +++ b/apps/docs/lib/tabs-config.ts @@ -65,7 +65,7 @@ export const GUIDE_SECTIONS: SidebarSection[] = [ { title: 'Go', path: '/guides/sdk/go' }, { title: 'Kotlin', path: '/guides/sdk/kotlin' }, { title: 'Swift', path: '/guides/sdk/swift' }, - { title: 'CSharp', path: '/guides/sdk/csharp' }, + { title: 'C#', path: '/guides/sdk/csharp' }, ], }, { title: 'Сценарии', path: '/guides/workflows' }, @@ -101,7 +101,20 @@ export const GUIDE_SECTIONS: SidebarSection[] = [ { title: 'No-code интеграции', items: [ - { title: 'n8n', path: '/guides/n8n' }, + { + title: 'n8n', + path: '/guides/n8n/overview', + children: [ + { title: 'Обзор', path: '/guides/n8n/overview' }, + { title: 'Настройка', path: '/guides/n8n/setup' }, + { title: 'Ресурсы и операции', path: '/guides/n8n/resources' }, + { title: 'Триггер', path: '/guides/n8n/trigger' }, + { title: 'Примеры workflow', path: '/guides/n8n/workflows' }, + { title: 'Продвинутые функции', path: '/guides/n8n/advanced' }, + { title: 'Устранение ошибок', path: '/guides/n8n/troubleshooting' }, + { title: 'Миграция с v1', path: '/guides/n8n/migration' }, + ], + }, { title: 'Albato', path: '/guides/albato' }, ], }, diff --git a/apps/docs/public/api/bots/list-events.md b/apps/docs/public/api/bots/list-events.md index 1a6d6c53..02dcdfbd 100644 --- a/apps/docs/public/api/bots/list-events.md +++ b/apps/docs/public/api/bots/list-events.md @@ -81,6 +81,18 @@ curl "https://api.pachca.com/api/shared/v1/webhooks/events?limit=1" \ - `user_id: integer, int32` (required) — Идентификатор пользователя, который нажал кнопку - `chat_id: integer, int32` (required) — Идентификатор чата, в котором была нажата кнопка - `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX + - **ViewSubmitWebhookPayload**: Структура исходящего вебхука о заполнении формы + - `type: string` (required) — Тип объекта + Значения: `view` — Для формы всегда view + - `event: string` (required) — Тип события + Значения: `submit` — Отправка формы + - `callback_id: string` (required) — Идентификатор обратного вызова, указанный при открытии представления + - `private_metadata: string` (required) — Приватные метаданные, указанные при открытии представления + - `user_id: integer, int32` (required) — Идентификатор пользователя, который отправил форму + - `data: Record` (required) — Данные заполненных полей представления. Ключ — `action_id` поля, значение — введённые данные + **Структура значений Record:** + - Тип значения: `any` + - `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX - **ChatMemberWebhookPayload**: Структура исходящего вебхука об участниках чата - `type: string` (required) — Тип объекта Значения: `chat_member` — Для участника чата всегда chat_member diff --git a/apps/docs/public/api/models.md b/apps/docs/public/api/models.md index 1bffa87f..668d3749 100644 --- a/apps/docs/public/api/models.md +++ b/apps/docs/public/api/models.md @@ -435,6 +435,18 @@ - `user_id: integer, int32` (required) — Идентификатор пользователя, который нажал кнопку. Пример: `2345` - `chat_id: integer, int32` (required) — Идентификатор чата, в котором была нажата кнопка. Пример: `9012` - `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX. Пример: `1747574400` + - **ViewSubmitWebhookPayload**: Структура исходящего вебхука о заполнении формы + - `type: string` (required) — Тип объекта. Пример: `"view"` + Значения: `view` — Для формы всегда view + - `event: string` (required) — Тип события. Пример: `"submit"` + Значения: `submit` — Отправка формы + - `callback_id: string` (required) — Идентификатор обратного вызова, указанный при открытии представления. Пример: `"timeoff_request_form"` + - `private_metadata: string` (required) — Приватные метаданные, указанные при открытии представления. Пример: `"{'timeoff_id':4378}"` + - `user_id: integer, int32` (required) — Идентификатор пользователя, который отправил форму. Пример: `1235523` + - `data: Record` (required) — Данные заполненных полей представления. Ключ — `action_id` поля, значение — введённые данные + **Структура значений Record:** + - Тип значения: `any` + - `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX. Пример: `1755075544` - **ChatMemberWebhookPayload**: Структура исходящего вебхука об участниках чата - `type: string` (required) — Тип объекта. Пример: `"chat_member"` Значения: `chat_member` — Для участника чата всегда chat_member diff --git a/apps/docs/public/guides/forms/handling.md b/apps/docs/public/guides/forms/handling.md index b20e0650..3452667d 100644 --- a/apps/docs/public/guides/forms/handling.md +++ b/apps/docs/public/guides/forms/handling.md @@ -23,18 +23,19 @@ Каждый исходящий вебхук защищён с помощью подписи, основанной на хешировании содержимого. Подробнее об этом — в разделе [Безопасность](/guides/webhook#bezopasnost). -#### Структура исходящего вебхука о заполнении формы - -- `type: string` — Тип объекта (для представлений всегда view) - Значения: `view` — представление -- `event: string` — Тип события (для отправки пользователем формы всегда submit) - Значения: `submit` — отправка формы -- `private_metadata: string` — Строка, заданная при отправке представления -- `callback_id: string` — Идентификатор для распознавания этого представления, заданный при отправке представления -- `user_id: integer` — Идентификатор пользователя, который заполнил форму -- `data: object` — JSON карта заполненных полей представления, где каждый ключ - значение поля name. - - `name: string | array of strings | array of objects | null | []` — Значение, которое указал пользователь в поле (или массив значений, если это был множественный выбор или загруженные пользователем файлы). Если пользователь не указал значение, тогда null (или пустой массив, если это поле файлов или чекбоксов) -- `webhook_timestamp: integer` — Дата и время отправки вебхука (UTC+0) в формате UNIX +#### ViewSubmitWebhookPayload + +- `type: string` (required) — Тип объекта + Значения: `view` — Для формы всегда view +- `event: string` (required) — Тип события + Значения: `submit` — Отправка формы +- `callback_id: string` (required) — Идентификатор обратного вызова, указанный при открытии представления +- `private_metadata: string` (required) — Приватные метаданные, указанные при открытии представления +- `user_id: integer, int32` (required) — Идентификатор пользователя, который отправил форму +- `data: Record` (required) — Данные заполненных полей представления. Ключ — `action_id` поля, значение — введённые данные + **Структура значений Record:** + - Тип значения: `any` +- `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX ```json title="Пример вебхука о заполнении формы" diff --git a/apps/docs/public/guides/n8n.md b/apps/docs/public/guides/n8n.md deleted file mode 100644 index 3845e6da..00000000 --- a/apps/docs/public/guides/n8n.md +++ /dev/null @@ -1,200 +0,0 @@ - -# n8n - -## Что такое n8n - -n8n — платформа для автоматизации рабочих процессов с открытым исходным кодом. Можно развернуть на собственном сервере или использовать веб-версию. Платформа позволяет создавать интеграции с сервисами без написания кода, используя визуальный редактор с узлами (nodes). - -В n8n встроено более 400 готовых узлов для популярных сервисов. Узлы бывают двух типов: - -- **Узел триггера** — событие, запускающее рабочий процесс: новое сообщение, нажатие кнопки, обновление статуса и др. -- **Узел действия** — логика после триггера: отправка сообщения в чат, создание задачи, добавление записи в БД и т.д. - -n8n автоматически выполняет каждое действие по триггеру в указанном порядке. - -![Интерфейс n8n с визуальным редактором workflow](/images/n8n/n8n-interface.avif) - -*Визуальный редактор n8n* - - -## Настройка - - - ### Шаг 1. Установка n8n - -> **Внимание:** Расширение Пачки доступно пока только в Beta. Его нет в веб-версии n8n — для использования нужно развернуть коробочную версию на собственном сервере. - - - Два способа установки: - - **С помощью команды** (требуется Node.js): - - ```bash - npx n8n - ``` - - **С помощью Docker:** - - ```bash - docker volume create n8n_data - - docker run -it --rm \ - --name n8n \ - -p 5678:5678 \ - -e GENERIC_TIMEZONE="" \ - -e TZ="" \ - -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \ - -e N8N_RUNNERS_ENABLED=true \ - -v n8n_data:/home/node/.n8n \ - docker.n8n.io/n8nio/n8n - ``` - - Подробные инструкции — в [официальной документации n8n](https://docs.n8n.io/hosting/) и на [GitHub](https://github.com/n8n-io/n8n). - - После запуска настройте аккаунт владельца (Owner Account), указав почту, имя и пароль. - - ![Настройка аккаунта владельца n8n](/images/n8n/owner-account.avif) - -*Настройка Owner Account* - - - ### Шаг 2. Установка расширения Пачки - -Расширение доступно на [GitHub](https://github.com/pachca/n8n-nodes-pachca) и [npmjs](https://www.npmjs.com/package/n8n-nodes-pachca). - - Три способа установки: - - 1. Зайти в **Settings** > **Community nodes** и добавить `n8n-nodes-pachca` (рекомендуется) - 2. Выполнить команду `npm i n8n-nodes-pachca` в директории n8n - 3. Следовать README-инструкции на [GitHub](https://github.com/pachca/n8n-nodes-pachca) - - ![Установка расширения Пачки через Community nodes](/images/n8n/community-nodes.avif) - -*Установка через Community nodes* - - - ### Шаг 3. Создание Credentials - -Credentials — данные для авторизации. - - Нажмите **«Add Credential»**, найдите **Pachca API** в списке и заполните поля: - - - **Base URL:** `https://api.pachca.com/api/shared/v1` - - **Access Token:** Токен доступа к API. В Пачке доступны два типа токенов: - - Персональный токен — доступен в разделе **Автоматизации** > **Интеграции** > **API** - - Токен бота — доступен в настройках бота на вкладке **API** - - Подробнее о токенах — в разделе [Авторизация](/api/authorization). Credentials можно создать несколько — для разных операций и токенов. - - ![Создание Credentials для Пачки в n8n](/images/n8n/credentials.avif) - -*Настройка Pachca API Credentials* - - - ### Шаг 4. Создание Workflow - -Workflow — визуальный редактор, в котором выстраиваются цепочки триггеров и действий. - - ![Визуальный редактор workflow в n8n](/images/n8n/workflow-editor.avif) - -*Редактор workflow* - - - Пример: отправка сообщения от лица бота. Триггер — нажатие кнопки **«Execute Workflow»**, действие — **Send a message** в Пачке: - - - **Credential** — от чьего лица будет отправлено сообщение - - **Entity ID** — ID чата - - **Content** — содержание сообщения - - Не забудьте добавить бота в чат. - - ![Пример workflow с отправкой сообщения](/images/n8n/workflow-example.avif) - -*Пример отправки сообщения* - - - В платформу встроено более 400 узлов для популярных сервисов, а дополнительные Community nodes можно установить из интерфейса. При необходимости доступны HTTP-запросы к любому API, условия, кастомный JavaScript- или Python-код. - - -## Методы API в nodes Pachca (Beta) - -Nodes (узлы) в расширении Пачки для n8n совпадают с методами API. Вот список доступных: - -### Действия с сообщениями - -- **Send a message** — [Новое сообщение](POST /messages) -- **Get a message** — [Информация о сообщении](GET /messages/{id}) -- **Get messages from the chat** — [Список сообщений чата](GET /messages) -- **Update a message** — [Редактирование сообщения](PUT /messages/{id}) -- **Delete a message** — [Удаление сообщения](DELETE /messages/{id}) -- **Pin a message** — [Закрепление сообщения](POST /messages/{id}/pin) -- **Unpin a message** — [Открепление сообщения](DELETE /messages/{id}/pin) -- **Get message readers** — [Список прочитавших сообщение](GET /messages/{id}/read_member_ids) -- **Unfurl message links** — [Unfurl (разворачивание ссылок)](POST /messages/{id}/link_previews) - -### Действия с тредами - -- **Create a thread** — [Новый тред](POST /messages/{id}/thread) -- **Get a thread** — [Информация о треде](GET /threads/{id}) - -### Действия с реакциями - -- **Add a reaction** — [Новая реакция](POST /messages/{id}/reactions) -- **Remove a reaction** — [Удаление реакции](DELETE /messages/{id}/reactions) -- **Get message reactions** — [Список реакций на сообщение](GET /messages/{id}/reactions) - -### Действия с чатом - -- **Get all chats** — [Список чатов](GET /chats) -- **Get a chat** — [Информация о чате](GET /chats/{id}) -- **Create a chat** — [Новый чат](POST /chats) -- **Update a chat** — [Обновление чата](PUT /chats/{id}) -- **Archive a chat** — [Архивация чата](PUT /chats/{id}/archive) -- **Unarchive a chat** — [Разархивация чата](PUT /chats/{id}/unarchive) -- **Get chat members** — [Список участников чата](GET /chats/{id}/members) -- **Add users to chat** — [Добавление пользователей](POST /chats/{id}/members) -- **Remove user from chat** — [Исключение пользователя](DELETE /chats/{id}/members/{user_id}) -- **Update user role in chat** — [Редактирование роли](PUT /chats/{id}/members/{user_id}) -- **Leave a chat** — [Выход из чата](DELETE /chats/{id}/leave) - -### Действия с пользователями - -- **Get all users** — [Список сотрудников](GET /users) -- **Get a user** — [Информация о сотруднике](GET /users/{id}) -- **Create a user** — [Новый сотрудник](POST /users) -- **Update a user** — [Редактирование сотрудника](PUT /users/{id}) -- **Delete a user** — [Удаление сотрудника](DELETE /users/{id}) - -### Действия с тегами пользователей - -- **Get all group tags** — [Список тегов сотрудников](GET /group_tags) -- **Get a group tag** — [Информация о теге](GET /group_tags/{id}) -- **Create a group tag** — [Новый тег](POST /group_tags) -- **Update a group tag** — [Редактирование тега](PUT /group_tags/{id}) -- **Delete a group tag** — [Удаление тега](DELETE /group_tags/{id}) -- **Get users in group tag** — [Список сотрудников тега](GET /group_tags/{id}/users) -- **Add tags to chat** — [Добавление тегов](POST /chats/{id}/group_tags) -- **Remove tag from chat** — [Исключение тега](DELETE /chats/{id}/group_tags/{tag_id}) - -### Действия со статусом и профилем - -- **Get my profile** — [Информация о профиле](GET /profile) -- **Get my status** — [Текущий статус](GET /profile/status) -- **Set my status** — [Новый статус](PUT /profile/status) -- **Clear my status** — [Удаление статуса](DELETE /profile/status) - -### Действия с формами - -- **Create a form** — [Открытие представления](POST /views/open) -- **Process form submission** — закрытие и отображение ошибок -- **Get form templates** - -### Другие действия - -- **Get custom properties** — [Список дополнительных полей](GET /custom_properties) -- **Create a task** — [Новое напоминание](POST /tasks) -- **Update a bot** — [Редактирование бота](PUT /bots/{id}) -- **Upload a file** — [Загрузка файла](POST /direct_url) - -> **Внимание:** Некоторые действия доступны только с персональным токеном (владельца или участника с ролью «Администратор»). - diff --git a/apps/docs/public/guides/n8n/advanced.md b/apps/docs/public/guides/n8n/advanced.md new file mode 100644 index 00000000..a4a91234 --- /dev/null +++ b/apps/docs/public/guides/n8n/advanced.md @@ -0,0 +1,209 @@ + +# Продвинутые функции + +## Загрузка файлов + +![Настройка загрузки файла в узле Pachca](/images/n8n/file-upload.avif) + +*Ресурс File с параметрами загрузки* + + +Ресурс **File** позволяет загружать файлы через двухшаговый S3 upload. n8n автоматически выполняет оба этапа: запрашивает presigned URL через API и загружает файл на S3. + +**Два источника файлов:** + +| Источник | Описание | +|----------|----------| +| **URL** | Файл загружается по ссылке. Укажите `fileUrl`, `fileName` и `contentType` | +| **Binary Data** | Файл из предыдущего узла workflow (например, из HTTP Request). Укажите `binaryProperty` | + +**Пример workflow: загрузка PDF и отправка в чат** + +1. **HTTP Request** — скачать файл по URL +2. **Pachca** (File > Create) — загрузить файл, получить `key` +3. **Pachca** (Message > Create) — отправить сообщение с прикреплённым файлом, указав `key` в поле `files` + +> Загруженные файлы привязываются к сообщениям через массив `files` при создании или обновлении сообщения. Каждый файл описывается объектом с полями: `key`, `name`, `file_type`, `size`. + + +Подробнее — в [документации загрузки файлов](/api/file-uploads). + +--- + +## Экспорт сообщений + +Ресурс **Chat Export** позволяет выгружать сообщения из чатов. Экспорт выполняется асинхронно: вы запрашиваете экспорт, а Пачка присылает уведомление на вебхук, когда архив готов. + +**Пример workflow:** + + + ### Шаг 1. Настройте приём вебхука + +Создайте отдельный workflow с узлом **Webhook** (встроенный в n8n). Он создаст URL, на который Пачка отправит уведомление о готовности экспорта. Скопируйте этот URL — он понадобится на следующем шаге. + + + ### Шаг 2. Запросите экспорт + +В основном workflow добавьте узел **Pachca** с ресурсом **Chat Export** и операцией **Create**. Укажите период (`startAt`, `endAt`) и вставьте URL вебхука из первого шага в поле `webhookUrl`. + + + ### Шаг 3. Обработайте уведомление + +Когда экспорт будет готов, Пачка отправит JSON на ваш вебхук: + ```json + { + "type": "export", + "event": "ready", + "export_id": 22322, + "created_at": "2025-03-20T12:33:58Z" + } + ``` + + + ### Шаг 4. Скачайте архив + +В workflow с Webhook-узлом добавьте узел **Pachca** с ресурсом **Chat Export** и операцией **Get**. Передайте `export_id` из данных вебхука в поле **ID**. Архив будет скачан автоматически. + + +**Ограничения:** +- Максимальный период одной выгрузки: 45 дней (366 дней при указании конкретных чатов) +- Максимум 50 чатов при фильтрации по `chatIds` +- Новый запрос можно сделать только после завершения текущего + +Подробнее — в [документации экспорта](/guides/export). + +--- + +## Кнопки в сообщениях + +![Настройка кнопок в сообщении в узле Pachca](/images/n8n/message-buttons.avif) + +*Кнопки в параметрах сообщения* + + +При создании или обновлении сообщения можно добавить интерактивные кнопки через поле **Buttons**. Кнопки передаются как JSON-строка. + +Два типа кнопок: + +| Тип | Описание | +|-----|----------| +| **URL-кнопка** | Открывает ссылку в браузере | +| **Data-кнопка** | Отправляет вебхук с `button_pressed` событием | + +Пример JSON для одной строки кнопок: + +```json +[ + [ + { "text": "Открыть сайт", "url": "https://example.com" }, + { "text": "Подтвердить", "data": "confirm_action" } + ] +] +``` + +Максимум 100 кнопок на сообщение, до 8 в одной строке. + +Подробнее о кнопках, их внешнем виде в чате и обработке нажатий — в [документации кнопок](/guides/buttons). + +--- + +## Формы + +Ресурс **Form** позволяет открывать модальные формы (представления) для пользователей. + +**Как это работает:** + +1. Пользователь нажимает Data-кнопку в сообщении бота +2. Бот получает вебхук с `trigger_id` +3. Бот вызывает [Открытие представления](POST /views/open) с `trigger_id` и описанием формы +4. Пользователь видит модальное окно с полями + +**Ключевые параметры:** + +| Параметр | Описание | +|----------|----------| +| `triggerId` | Уникальный ID из вебхука кнопки (действителен 3 секунды) | +| `title` | Заголовок модального окна | +| `type` | Тип представления (по умолчанию `modal`) | +| `blocks` | JSON-массив блоков формы | +| `submitText` | Текст кнопки отправки | +| `closeText` | Текст кнопки закрытия | + +**Пример workflow:** + +1. **Pachca Trigger** — событие `Button Pressed` +2. **Pachca** (Form > Create) — открыть форму с `trigger_id` из триггера +3. **Pachca Trigger** — событие `Form Submitted` (в отдельном workflow) +4. Обработка данных формы + +Подробнее о формах, типах полей и внешнем виде модального окна в интерфейсе Пачки — в [документации форм](/guides/forms/overview). + +--- + +## AI-агент + +![Pachca как инструмент AI Agent в n8n](/images/n8n/ai-agent-tool.avif) + +*Pachca Tool в панели инструментов AI Agent* + + +Оба узла (Pachca и Pachca Trigger) поддерживают `usableAsTool: true` — их можно использовать как инструменты для **AI Agent** в n8n. + +**Что это значит:** + +- AI Agent может вызывать операции Pachca для выполнения задач +- Примеры: поиск сообщений, отправка ответов, создание задач +- Agent автоматически выбирает подходящую операцию на основе запроса + +**Пример: AI-помощник для команды** + + + ### Шаг 1. Добавьте AI Agent + +Создайте новый workflow. Добавьте узел **AI Agent** и подключите LLM-модель (OpenAI, Anthropic и др.) через соответствующие Credentials. + + + ### Шаг 2. Подключите инструменты Pachca + +Нажмите **+** на входе **Tool** узла AI Agent и добавьте узел **Pachca**. Выберите нужную операцию — например, **Search > Get Many Messages** для поиска по сообщениям. Добавьте ещё один узел Pachca для **Message > Create** — отправки ответов. + + + ### Шаг 3. Настройте триггер + +Добавьте **Pachca Trigger** с событием `New Message` на вход workflow. AI Agent будет автоматически отвечать на сообщения пользователей, используя поиск по истории чатов. + + +AI Agent самостоятельно выбирает подходящий инструмент на основе запроса пользователя — ищет информацию, создаёт задачи или отправляет сообщения. + +> Для использования AI Agent необходимо настроить LLM-провайдер (OpenAI, Anthropic и др.) в Credentials n8n. + + +--- + +## Разворачивание ссылок + +Ресурс **Link Preview** позволяет формировать кастомные превью для ссылок в сообщениях бота. + +Когда бот отправляет сообщение со ссылкой, Пачка может запросить у бота данные для превью. Бот может ответить через [Создание превью ссылки](POST /messages/{id}/link_previews) с заголовком, описанием и изображением. + +Подробнее — в [документации разворачивания ссылок](/guides/link-previews). + +--- + +## Журнал безопасности + +Ресурс **Security** предоставляет доступ к журналу аудита — списку событий безопасности в пространстве. + +**Доступные фильтры:** + +| Фильтр | Описание | +|--------|----------| +| `eventKey` | Тип события (login, message_created, user_deleted и др.) | +| `actorId` | ID пользователя, совершившего действие | +| `actorType` | Тип актора (user или bot) | +| `entityId` | ID сущности, над которой совершено действие | +| `entityType` | Тип сущности | +| `startTime` | Начало временного диапазона | +| `endTime` | Конец временного диапазона | + +Подробнее — в [документации журнала аудита](/guides/audit-events). diff --git a/apps/docs/public/guides/n8n/migration.md b/apps/docs/public/guides/n8n/migration.md new file mode 100644 index 00000000..33e7cdbd --- /dev/null +++ b/apps/docs/public/guides/n8n/migration.md @@ -0,0 +1,110 @@ + +# Миграция с v1 + +> Обновление необязательно. Все существующие workflow на v1 продолжают работать без изменений. + + +## Полная обратная совместимость + +Версия 2.0 на 100% совместима с v1. При обновлении расширения: + +- Существующие workflow остаются на v1 и работают как прежде +- Новые workflow по умолчанию создаются на v2 с обновлёнными именами +- Переход с v1 на v2 — опциональный + +## Переименованные ресурсы + +| v1 | v2 | Изменение | +|----|-----|-----------| +| `reactions` | `reaction` | Единственное число | +| `status` | `profile` | Более точное имя | +| `customFields` | `customProperty` | Более точное имя | + +## Переименованные операции + +| Ресурс | v1 | v2 | +|--------|-----|-----| +| Message | `send` | `create` | +| Message | `getById` | `get` | +| Chat | `getById` | `get` | +| User | `getById` | `get` | +| Group Tag | `getById` | `get` | +| Group Tag | `getUsers` | `getAllUsers` | +| Reaction | `addReaction` | `create` | +| Reaction | `deleteReaction` | `delete` | +| Reaction | `getReactions` | `getAll` | +| Custom Property | `getCustomProperties` | `get` | +| Profile | `getProfile` | `get` | +| Thread | `createThread` | `create` | +| Thread | `getThread` | `get` | +| Form | `createView` | `create` | +| File | `upload` | `create` | + +## Перенесённые операции + +Некоторые операции из v1 ресурсов были перенесены в новые v2 ресурсы: + +| v1 ресурс | v1 операция | v2 ресурс | v2 операция | +|-----------|-------------|-----------|-------------| +| Chat | `getMembers` | Chat Member | `getAll` | +| Chat | `addUsers` | Chat Member | `create` | +| Chat | `removeUser` | Chat Member | `delete` | +| Chat | `updateRole` | Chat Member | `update` | +| Chat | `leaveChat` | Chat Member | `leave` | +| Group Tag | `addTags` | Chat Member | `addGroupTags` | +| Group Tag | `removeTag` | Chat Member | `removeGroupTags` | +| Message | `getReadMembers` | Read Member | `getAll` | +| Message | `unfurl` | Link Preview | `create` | + +> Все перенесённые операции продолжают работать в v1 workflow без изменений. Маршрутизатор автоматически транслирует v1 имена в v2. + + +## Новые ресурсы (только v2) + +| Ресурс | Описание | +|--------|----------| +| **Chat Member** | Управление участниками чата: добавление, удаление, роли, теги | +| **Custom Property** | Дополнительные поля пространства | +| **Read Member** | Список прочитавших сообщение | +| **Link Preview** | Разворачивание ссылок в сообщениях | +| **Search** | Полнотекстовый поиск по чатам, сообщениям, пользователям | +| **Chat Export** | Экспорт сообщений из чатов | +| **Security** | Журнал безопасности | + +## Новые функции + +| Функция | Описание | +|---------|----------| +| **Return All / Limit** | Курсорная автопагинация вместо ручного `per`/`page` | +| **Simplify** | Переключатель для получения только ключевых полей из ответа API ([подробнее](/guides/n8n/resources#simplify)) | +| **Pachca Trigger** | Webhook-нода с авторегистрацией вебхука через Bot ID, 16 типов событий | +| **AI Tool Use** | Использование узлов как инструментов AI Agent | +| **Searchable Dropdowns** | Поиск по чатам и пользователям в выпадающих списках | +| **File Upload** | Загрузка файлов через S3 с поддержкой URL и Binary Data | +| **Task CRUD** | Полный CRUD для задач (было только создание) | + +## Как работает совместимость + +Расширение использует паттерн **VersionedNodeType** с `defaultVersion: 2`: + +- **V1** и **V2** — отдельные классы с собственными описаниями ресурсов и операций +- Общий **SharedRouter** обрабатывает запросы обеих версий, транслируя v1 имена ресурсов и операций в v2 на лету +- При обновлении расширения существующие ноды сохраняют `typeVersion: 1` и используют V1 класс — все параметры и поведение остаются прежними +- Новые ноды по умолчанию создаются с `typeVersion: 2` и используют чистый V2 класс +- В Node Creator отображаются только v2 операции — без дубликатов +- V1 ноды в существующих workflow показывают жёлтый баннер «New node version available» с предложением обновиться + +## Как обновить workflow (необязательно) + +При открытии существующего workflow вы увидите жёлтый баннер в настройках v1 нод — это информационное уведомление, менять ничего не нужно. + +Если вы хотите перевести ноду на v2: + +1. Откройте workflow в n8n +2. Удалите v1 ноду Pachca +3. Добавьте новую ноду Pachca (по умолчанию v2) +4. Перенастройте с v2 именами ресурсов и операций +5. API-вызовы идентичны — изменились только имена в UI + +> При удалении ноды и добавлении новой вы получите v2 с обновлёнными именами и новыми ресурсами. Все параметры и API endpoint-ы остались прежними. + diff --git a/apps/docs/public/guides/n8n/overview.md b/apps/docs/public/guides/n8n/overview.md new file mode 100644 index 00000000..308bfb1a --- /dev/null +++ b/apps/docs/public/guides/n8n/overview.md @@ -0,0 +1,57 @@ + +# n8n + +## Что такое n8n + +[n8n](https://n8n.io) — платформа для автоматизации рабочих процессов с открытым исходным кодом. Можно развернуть на собственном сервере или использовать веб-версию. Платформа позволяет создавать интеграции с сервисами без написания кода, используя визуальный редактор с узлами (nodes). + +В n8n встроено более 400 готовых узлов для популярных сервисов. Узлы бывают двух типов: + +- **Узел триггера** — событие, запускающее рабочий процесс: новое сообщение, нажатие кнопки, обновление статуса и др. +- **Узел действия** — логика после триггера: отправка сообщения в чат, создание задачи, добавление записи в БД и т.д. + +![Интерфейс n8n с визуальным редактором workflow](/images/n8n/n8n-interface.avif) + +*Визуальный редактор n8n* + + +## Что можно автоматизировать + +- **Уведомления из внешних систем** — пересылайте алерты из мониторинга, CI/CD, CRM и других сервисов в чаты Пачки +- **Бот-ассистент** — подключите AI-агент, который ищет по сообщениям и отвечает на вопросы команды +- **Задачи по сообщениям** — автоматически создавайте задачи из сообщений с определённым тегом или реакцией +- **Согласование** — отправляйте кнопки «Одобрить / Отклонить» и обрабатывайте ответ в workflow +- **Онбординг** — приветствуйте новых сотрудников личным сообщением от бота +- **Синхронизация данных** — экспортируйте сообщения, задачи и события в Google Sheets, Notion или другие сервисы +- **Мониторинг и алерты** — проверяйте состояние сервисов по расписанию и отправляйте алерт в чат при сбое + +## Расширение Пачки + +Расширение Пачки для n8n предоставляет два узла: + +| Узел | Тип | Описание | +|------|-----|----------| +| **Pachca** | Действие | 18 ресурсов и более 60 операций для работы с API | +| **Pachca Trigger** | Триггер | 16 типов событий через вебхуки | + +- [18 ресурсов](/guides/n8n/resources) — Сообщения, чаты, пользователи, задачи, формы, поиск и другие +- [Триггер с вебхуком](/guides/n8n/trigger) — 16 типов событий с авторегистрацией вебхука +- [AI-агент](/guides/n8n/advanced) — Используйте Pachca как инструмент AI Agent +- [Автопагинация](/guides/n8n/resources) — Cursor-based пагинация с Return All / Limit + + +## Что нового в v2.0 + +Версия 2.0 — полностью автогенерируемая из OpenAPI-спецификации с сохранением 100% обратной совместимости с v1. + +- **7 новых ресурсов:** Chat Member, Custom Property, Read Member, Link Preview, Search, Chat Export, Security +- **Курсорная пагинация** с Return All / Limit вместо ручного `per`/`page` +- **AI Tool Use** — `usableAsTool: true` для использования с AI Agent +- **Trigger-нода** с авторегистрацией вебхука через Bot ID и 16 типами событий +- **Поисковые выпадающие списки** для Chat ID и User ID +- **Загрузка файлов** через S3 с поддержкой URL и Binary Data +- **Полнотекстовый поиск** по сообщениям, чатам и пользователям +- **Журнал безопасности** — аудит действий пользователей + +> Все существующие workflow на v1 продолжают работать без изменений. Подробнее — в разделе [Миграция с v1](/guides/n8n/migration). + diff --git a/apps/docs/public/guides/n8n/resources.md b/apps/docs/public/guides/n8n/resources.md new file mode 100644 index 00000000..04ba0ab8 --- /dev/null +++ b/apps/docs/public/guides/n8n/resources.md @@ -0,0 +1,353 @@ + +# Ресурсы и операции + +В расширении Пачки каждый узел **Pachca** работает по модели **Resource → Operation**: вы выбираете ресурс (например, Message) и операцию над ним (например, Create). + +![Выпадающий список ресурсов в узле Pachca](/images/n8n/resource-dropdown.avif) + +*Выбор ресурса в узле Pachca* + + +Для каждого ресурса доступен свой набор операций. + +![Выпадающий список операций для ресурса Message](/images/n8n/operation-dropdown.avif) + +*Операции для ресурса Message* + + +## Список ресурсов + +| # | Ресурс | Операций | Описание | Только v2 | +|---|--------|:---:|----------|:---:| +| 1 | [Message](#message) | 7 | Сообщения: создание, редактирование, удаление, закрепление | | +| 2 | [Chat](#chat) | 6 | Чаты: создание, обновление, архивация | | +| 3 | [Chat Member](#chat-member) | 7 | Участники чата: добавление, удаление, роли, теги | да | +| 4 | [User](#user) | 8 | Сотрудники: CRUD, статус | | +| 5 | [Group Tag](#group-tag) | 6 | Теги сотрудников: CRUD, список пользователей | | +| 6 | [Thread](#thread) | 2 | Треды: создание, получение | | +| 7 | [Reaction](#reaction) | 3 | Реакции: создание, удаление, список | | +| 8 | [Profile](#profile) | 5 | Мой профиль: информация, статус | | +| 9 | [Task](#task) | 5 | Задачи: полный CRUD | | +| 10 | [Bot](#bot) | 3 | Боты: обновление, события, удаление событий | | +| 11 | [File](#file) | 1 | Загрузка файлов через S3 | | +| 12 | [Form](#form) | 1 | Модальные формы | | +| 13 | [Custom Property](#custom-property) | 1 | Дополнительные поля | да | +| 14 | [Read Member](#read-member) | 1 | Список прочитавших сообщение | да | +| 15 | [Link Preview](#link-preview) | 1 | Разворачивание ссылок | да | +| 16 | [Search](#search) | 3 | Полнотекстовый поиск | да | +| 17 | [Chat Export](#chat-export) | 2 | Экспорт сообщений из чатов | да | +| 18 | [Security](#security) | 1 | Журнал безопасности | да | + +> **Внимание:** Для некоторых операций требуются скоупы, которые доступны только определённым ролям (администратор, владелец). При создании персонального токена отображаются только скоупы, доступные вашей роли. Подробнее — в разделе [Авторизация](/api/authorization). + + +--- + +## Message + +Сообщения: создание, получение, редактирование, удаление, закрепление и открепление. + +| Операция | API | +|----------|-----| +| Create | [Создание сообщения](POST /messages) | +| Get Many | [Список сообщений чата](GET /messages) | +| Get | [Информация о сообщении](GET /messages/{id}) | +| Update | [Редактирование сообщения](PUT /messages/{id}) | +| Delete | [Удаление сообщения](DELETE /messages/{id}) | +| Pin | [Закрепление сообщения](POST /messages/{id}/pin) | +| Unpin | [Открепление сообщения](DELETE /messages/{id}/pin) | + +**Ключевые параметры Create:** `entityId` (ID чата или пользователя), `content` (текст, Markdown), `entityType` (discussion, user, thread), `files`, `buttons`, `parentMessageId`. + +![Настройка Message Get Many с Entity ID и Return All](/images/n8n/message-get-many.avif) + +*Настройка Message → Get Many* + + +--- + +## Chat + +Чаты: создание, получение, обновление, архивация и разархивация. + +| Операция | API | +|----------|-----| +| Create | [Создание чата](POST /chats) | +| Get Many | [Список чатов](GET /chats) | +| Get | [Информация о чате](GET /chats/{id}) | +| Update | [Обновление чата](PUT /chats/{id}) | +| Archive | [Архивация чата](PUT /chats/{id}/archive) | +| Unarchive | [Разархивация чата](PUT /chats/{id}/unarchive) | + +--- + +## Chat Member + +Управление участниками чата: добавление, удаление, изменение ролей, управление тегами. + +> В v1 эти операции были частью ресурса Chat. В v2 они выделены в отдельный ресурс Chat Member. + + +| Операция | API | +|----------|-----| +| Get Many | [Список участников чата](GET /chats/{id}/members) | +| Create | [Добавление пользователей в чат](POST /chats/{id}/members) | +| Delete | [Удаление пользователя из чата](DELETE /chats/{id}/members/{user_id}) | +| Update | [Изменение роли участника](PUT /chats/{id}/members/{user_id}) | +| Leave | [Выход из чата](DELETE /chats/{id}/leave) | +| Add Group Tags | [Добавление тегов к чату](POST /chats/{id}/group_tags) | +| Remove Group Tags | [Удаление тегов из чата](DELETE /chats/{id}/group_tags/{tag_id}) | + +--- + +## User + +Сотрудники: полный CRUD, получение и управление статусом. + +| Операция | API | +|----------|-----| +| Create | [Создание сотрудника](POST /users) | +| Get Many | [Список сотрудников](GET /users) | +| Get | [Информация о сотруднике](GET /users/{id}) | +| Update | [Обновление сотрудника](PUT /users/{id}) | +| Delete | [Удаление сотрудника](DELETE /users/{id}) | +| Get Status | [Получение статуса](GET /users/{user_id}/status) | +| Update Status | [Обновление статуса](PUT /users/{user_id}/status) | +| Delete Status | [Удаление статуса](DELETE /users/{user_id}/status) | + +--- + +## Group Tag + +Теги (группы) сотрудников: создание, обновление, удаление, список пользователей. + +| Операция | API | +|----------|-----| +| Create | [Создание тега](POST /group_tags) | +| Get Many | [Список тегов](GET /group_tags) | +| Get | [Информация о теге](GET /group_tags/{id}) | +| Update | [Обновление тега](PUT /group_tags/{id}) | +| Delete | [Удаление тега](DELETE /group_tags/{id}) | +| Get Many Users | [Список пользователей тега](GET /group_tags/{id}/users) | + +--- + +## Thread + +Треды (комментарии к сообщениям): создание и получение. + +| Операция | API | +|----------|-----| +| Create | [Создание треда](POST /messages/{id}/thread) | +| Get | [Информация о треде](GET /threads/{id}) | + +--- + +## Reaction + +Реакции на сообщения: создание, удаление, список. + +| Операция | API | +|----------|-----| +| Create | [Добавление реакции](POST /messages/{id}/reactions) | +| Delete | [Удаление реакции](DELETE /messages/{id}/reactions) | +| Get Many | [Список реакций](GET /messages/{id}/reactions) | + +--- + +## Profile + +Профиль текущего пользователя: информация, статус, информация о токене. + +| Операция | API | +|----------|-----| +| Get | [Информация о профиле](GET /profile) | +| Get Info | [Информация о токене](GET /oauth/token/info) | +| Get Status | [Получение статуса](GET /profile/status) | +| Update Status | [Обновление статуса](PUT /profile/status) | +| Delete Status | [Удаление статуса](DELETE /profile/status) | + +--- + +## Task + +Задачи (напоминания): полный CRUD. + +| Операция | API | +|----------|-----| +| Create | [Создание задачи](POST /tasks) | +| Get Many | [Список задач](GET /tasks) | +| Get | [Информация о задаче](GET /tasks/{id}) | +| Update | [Обновление задачи](PUT /tasks/{id}) | +| Delete | [Удаление задачи](DELETE /tasks/{id}) | + +**Типы задач:** `call`, `email`, `event`, `meeting`, `reminder`. + +--- + +## Bot + +Управление ботами: обновление настроек, получение и удаление событий. + +| Операция | API | +|----------|-----| +| Update | [Обновление бота](PUT /bots/{id}) | +| Get Many Events | [Список событий бота](GET /webhooks/events) | +| Remove Events | [Удаление событий](DELETE /webhooks/events/{id}) | + +--- + +## File + +Загрузка файлов через двухшаговый S3 upload. + +| Операция | API | +|----------|-----| +| Create | [Загрузка файла](POST /uploads) | + +Подробнее — в разделе [Продвинутые функции](/guides/n8n/advanced#zagruzka-fajlov). + +--- + +## Form + +Модальные формы (представления). + +| Операция | API | +|----------|-----| +| Create | [Открытие представления](POST /views/open) | + +Подробнее — в разделе [Продвинутые функции](/guides/n8n/advanced#formy) и в [документации форм](/guides/forms/overview). + +--- + +## Custom Property + +Дополнительные поля пространства. + +| Операция | API | +|----------|-----| +| Get | [Список дополнительных полей](GET /custom_properties) | + +--- + +## Read Member + +Список пользователей, прочитавших сообщение. + +| Операция | API | +|----------|-----| +| Get Many | [Список прочитавших](GET /messages/{id}/read_member_ids) | + +--- + +## Link Preview + +Разворачивание ссылок в сообщениях. + +| Операция | API | +|----------|-----| +| Create | [Создание превью ссылки](POST /messages/{id}/link_previews) | + +Подробнее — в [документации разворачивания ссылок](/guides/link-previews). + +--- + +## Search + +Полнотекстовый поиск по сообщениям, чатам и пользователям. + +| Операция | API | +|----------|-----| +| Get Many Chats | [Поиск чатов](GET /search/chats) | +| Get Many Messages | [Поиск сообщений](GET /search/messages) | +| Get Many Users | [Поиск пользователей](GET /search/users) | + +**Обязательный параметр:** `query` — строка поиска. + +--- + +## Chat Export + +Экспорт сообщений из чатов: запрос экспорта и скачивание архива. + +| Операция | API | +|----------|-----| +| Create | [Запрос экспорта](POST /chats/exports) | +| Get | [Скачивание архива](GET /chats/exports/{id}) | + +**Ключевые параметры Create:** `startAt` (дата начала, YYYY-MM-DD), `endAt` (дата окончания), `webhookUrl` (URL для уведомления о готовности). + +**Дополнительные параметры:** `chatIds` (экспорт конкретных чатов, до 50), `skipChatsFile` (не создавать chats.json). + +Экспорт выполняется асинхронно. После завершения Пачка отправит вебхук на указанный `webhookUrl` с `export_id`. Используйте операцию **Get** для скачивания готового архива. + +Подробнее — в разделе [Продвинутые функции](/guides/n8n/advanced#eksport-soobshhenij) и в [документации экспорта](/guides/export). + +--- + +## Security + +Журнал безопасности: отслеживание действий пользователей. + +| Операция | API | +|----------|-----| +| Get Many | [Список событий аудита](GET /audit_events) | + +**Фильтры:** `eventKey`, `actorId`, `actorType`, `entityId`, `entityType`, `startTime`, `endTime`. + +Подробнее — в [документации журнала аудита](/guides/audit-events). + +--- + +## Пагинация + +Все операции Get Many поддерживают автоматическую курсорную пагинацию: + +- **Return All** = `true` — получить все результаты автоматически, переключаясь между страницами +- **Return All** = `false` — получить не более **Limit** результатов (по умолчанию 50) + +![Переключатель Return All и поле Limit в узле Pachca](/images/n8n/return-all.avif) + +*Return All и Limit для операции Get Many* + + +n8n автоматически отправляет повторные запросы с курсором до получения всех данных. + +> Для операций со списками (Get Many) рекомендуется использовать **Return All = false** с разумным **Limit**, чтобы избежать долгих запросов при большом объёме данных. + + +--- + +## Simplify + +Операции получения данных (Get, Get Many) поддерживают переключатель **Simplify** (включён по умолчанию). Когда Simplify включён, из ответа API возвращаются только ключевые поля — остальные отбрасываются. + +| Ресурс | Ключевые поля | +|--------|---------------| +| Message | `id`, `entity_id`, `chat_id`, `content`, `user_id`, `created_at` | +| Chat | `id`, `name`, `channel`, `public`, `members_count`, `created_at` | +| User | `id`, `first_name`, `last_name`, `nickname`, `email`, `role`, `suspended` | +| Task | `id`, `content`, `kind`, `status`, `priority`, `due_at`, `created_at` | +| Bot | `id`, `name`, `created_at` | +| Group Tag | `id`, `name`, `users_count` | +| Reaction | `id`, `code`, `user_id`, `created_at` | +| Chat Export | `id`, `status`, `created_at` | + +Чтобы получить все поля ответа — выключите **Simplify**. + +> Simplify доступен только в v2. В v1 workflow всегда возвращают полный ответ API. + + +--- + +## Поисковые выпадающие списки + +![Поисковый выпадающий список Chat ID в узле Pachca](/images/n8n/searchable-dropdown.avif) + +*Поиск чата по имени в поле Chat ID* + + +Для поля **Chat ID** доступен поиск по имени: начните вводить текст, и n8n покажет подходящие результаты из вашего пространства Пачки. + +Поиск вызывает API-эндпоинт [Поиск чатов](GET /search/chats) и работает только с валидным `Access Token` в Credentials. diff --git a/apps/docs/public/guides/n8n/setup.md b/apps/docs/public/guides/n8n/setup.md new file mode 100644 index 00000000..435745f8 --- /dev/null +++ b/apps/docs/public/guides/n8n/setup.md @@ -0,0 +1,159 @@ + +# Настройка + +## Установка + + + ### Шаг 1. Установка n8n + +Два способа установки: + + **С помощью команды** (требуется Node.js 22+): + + ```bash + npx n8n + ``` + + **С помощью Docker:** + + ```bash + docker volume create n8n_data + + docker run -it --rm \ + --name n8n \ + -p 5678:5678 \ + -e GENERIC_TIMEZONE="Europe/Moscow" \ + -e TZ="Europe/Moscow" \ + -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \ + -e N8N_RUNNERS_ENABLED=true \ + -v n8n_data:/home/node/.n8n \ + docker.n8n.io/n8nio/n8n + ``` + + Подробные инструкции — в [официальной документации n8n](https://docs.n8n.io/hosting/) и на [GitHub](https://github.com/n8n-io/n8n). + + После запуска откройте `http://localhost:5678` и настройте аккаунт владельца (Owner Account), указав почту, имя и пароль. + + ![Настройка аккаунта владельца n8n](/images/n8n/owner-account.avif) + +*Настройка Owner Account* + + + После входа вы увидите главный экран n8n с пустым списком workflow. + + ![Главная страница n8n после авторизации](/images/n8n/main-dashboard.avif) + +*Главная страница n8n* + + + ### Шаг 2. Установка расширения Пачки + +Расширение доступно на [npm](https://www.npmjs.com/package/n8n-nodes-pachca) и [GitHub](https://github.com/pachca/openapi/tree/main/integrations/n8n). + + Три способа установки: + + 1. Зайти в **Settings** > **Community nodes** и добавить `n8n-nodes-pachca` (рекомендуется) + 2. Выполнить команду `npm i n8n-nodes-pachca` в директории n8n + 3. Следовать README-инструкции на [GitHub](https://github.com/pachca/openapi/tree/main/integrations/n8n) + + + ### Шаг 3. Создание Credentials + +Credentials — данные для авторизации. Перейдите в **Credentials** и нажмите **Add Credential**. + + ![Список Credentials в n8n](/images/n8n/credentials-list.avif) + +*Список Credentials* + + + Найдите **Pachca API** в списке и заполните поля: + + ![Поиск Pachca API в списке Credentials](/images/n8n/credentials-search.avif) + +*Поиск Pachca API в списке Credentials* + + + | Поле | Обязательное | Описание | + |------|:---:|----------| + | **Base URL** | нет | Базовый URL API. По умолчанию `https://api.pachca.com/api/shared/v1`. Менять только для on-premise | + | **Access Token** | да | Токен доступа к API | + | **Bot ID** | нет | ID бота — нужен для авторегистрации вебхука в [Pachca Trigger](/guides/n8n/trigger) | + | **Signing Secret** | нет | Секрет для верификации входящих webhook-запросов (HMAC-SHA256) | + + ![Форма Credentials для Пачки в n8n](/images/n8n/credentials-v2.avif) + +*Форма Pachca API Credentials* + + + ### Шаг 4. Где получить токен + +В Пачке доступны два типа токенов: + + - **Персональный токен** — доступен в разделе **Автоматизации** > **Интеграции** > **API** + - **Токен бота** — доступен в настройках бота на вкладке **API** + + Доступные операции зависят от [скоупов](/api/authorization#skoupy) токена, а не от его типа. Подробнее — в разделе [Авторизация](/api/authorization). + + После заполнения полей нажмите **Test** — n8n проверит подключение вызовом [Информация о токене](GET /oauth/token/info). При успехе вы увидите подтверждение. + + ![Успешная проверка Credentials](/images/n8n/credentials-test.avif) + +*Connection tested successfully* + + + > Если тест не проходит — проверьте правильность токена и доступность API. Подробнее — в разделе [Устранение ошибок](/guides/n8n/troubleshooting). + + + ### Шаг 5. Создание workflow + +Workflow — визуальный редактор, в котором выстраиваются цепочки триггеров и действий. Создайте новый workflow и добавьте триггер **Manual Trigger** для ручного запуска. + + Нажмите **+** на выходе триггера и найдите **Pachca** в списке узлов. + + ![Поиск Pachca в списке узлов n8n](/images/n8n/workflow-add-node.avif) + +*Поиск узла Pachca* + + + После добавления узла на канвасе появится цепочка: Manual Trigger → Pachca. + + ![Узел Pachca на канвасе workflow](/images/n8n/workflow-pachca-node.avif) + +*Pachca на канвасе* + + + ### Шаг 6. Настройка и запуск + +Дважды кликните на узел **Pachca** и настройте: + + - **Credential:** выберите созданный Pachca API + - **Resource:** Message + - **Operation:** Create + - **Entity ID:** ID чата (число) + - **Content:** текст сообщения + + ![Настройка отправки сообщения в узле Pachca](/images/n8n/node-message-create.avif) + +*Настройка Message → Create* + + + > **Внимание:** Перед отправкой сообщения [добавьте бота в чат](/guides/bots#dostupy-bota-k-chatam-i-soobscheniyam). + + + Закройте панель настроек и нажмите **Execute Workflow**. При успехе узлы подсветятся зелёным и покажут количество обработанных элементов. + + ![Успешное выполнение workflow](/images/n8n/workflow-execute-success.avif) + +*Workflow выполнен* + + + Откройте узел Pachca, чтобы увидеть ответ API с данными созданного сообщения. + + ![Данные ответа API после выполнения](/images/n8n/workflow-output-data.avif) + +*Ответ API в панели Output* + + + Больше примеров — в разделе [Примеры workflow](/guides/n8n/workflows). + + diff --git a/apps/docs/public/guides/n8n/trigger.md b/apps/docs/public/guides/n8n/trigger.md new file mode 100644 index 00000000..3a775ebb --- /dev/null +++ b/apps/docs/public/guides/n8n/trigger.md @@ -0,0 +1,154 @@ + +# Триггер + +Узел **Pachca Trigger** запускает workflow при наступлении события в Пачке — новое сообщение, нажатие кнопки, отправка формы, изменение состава команды и др. + +## Поддерживаемые события + +### Сообщения и чаты + +| Событие | Значение | Описание | +|---------|----------|----------| +| Новое сообщение | `new_message` | Создание сообщения в чате | +| Сообщение изменено | `message_updated` | Редактирование существующего сообщения | +| Сообщение удалено | `message_deleted` | Удаление сообщения | +| Новая реакция | `new_reaction` | Добавление реакции к сообщению | +| Реакция удалена | `reaction_deleted` | Удаление реакции с сообщения | +| Участник добавлен | `chat_member_added` | Добавление участника в чат | +| Участник удалён | `chat_member_removed` | Удаление участника из чата | + +### Интерактивные элементы + +| Событие | Значение | Описание | +|---------|----------|----------| +| Нажатие кнопки | `button_pressed` | Клик по Data-кнопке в сообщении | +| Отправка формы | `form_submitted` | Отправка модальной формы | +| Ссылка отправлена | `link_shared` | Бот может развернуть превью ссылки | + +### Сотрудники + +| Событие | Значение | Описание | +|---------|----------|----------| +| Приглашение сотрудника | `company_member_invite` | Отправлено приглашение новому сотруднику | +| Подтверждение регистрации | `company_member_confirm` | Сотрудник подтвердил регистрацию | +| Активация сотрудника | `company_member_activate` | Сотрудник активирован | +| Обновление сотрудника | `company_member_update` | Изменение данных сотрудника | +| Приостановка сотрудника | `company_member_suspend` | Сотрудник приостановлен | +| Удаление сотрудника | `company_member_delete` | Сотрудник удалён | + +### Wildcard + +| Событие | Значение | Описание | +|---------|----------|----------| +| Все события | `*` | Получать все типы событий | + +![Типы событий Pachca Trigger](/images/n8n/trigger-events.avif) + +*16 типов событий в Pachca Trigger* + + +> **Внимание:** Бот получает события только из чатов, в которых он состоит. Убедитесь, что бот добавлен в нужные чаты. + + +## Настройка + +Добавьте узел **Pachca Trigger** в workflow — найдите его через поиск в панели узлов. + +![Поиск Pachca Trigger в панели узлов](/images/n8n/trigger-add.avif) + +*Поиск Pachca Trigger* + + +### Автоматический режим (рекомендуется) + +![Конфигурация Pachca Trigger с выбором события](/images/n8n/trigger-node.avif) + +*Настройка Pachca Trigger* + + +При наличии **Bot ID** в [Credentials](/guides/n8n/setup#sozdanie-credentials) вебхук регистрируется автоматически: + + + ### Шаг 1. Укажите Bot ID в Credentials + +Откройте Pachca API Credentials и заполните поле **Bot ID** — это ID вашего бота в Пачке. + + + ### Шаг 2. Добавьте Pachca Trigger + +Создайте новый workflow и добавьте узел **Pachca Trigger**. Выберите нужный тип события. + + + ### Шаг 3. Активируйте workflow + +Нажмите **Activate**. n8n автоматически вызовет [Обновление бота](PUT /bots/{id}) и зарегистрирует webhook URL в настройках бота. + + +При деактивации workflow вебхук автоматически удаляется. + +**Автоматическая регистрация вебхука** + +```mermaid +sequenceDiagram + participant n8n + participant Pachca as Pachca API + participant Bot as Бот в Пачке + + Note over n8n: Активация workflow + n8n->>Pachca: PUT /bots/{id}
webhook_url=n8n_url + Pachca->>Bot: Webhook зарегистрирован + + Note over Bot: Событие в чате + Bot->>Pachca: Новое сообщение + Pachca->>n8n: POST webhook_url
+ payload + signature + Note over n8n: Проверка подписи + n8n->>n8n: Запуск workflow + + Note over n8n: Деактивация workflow + n8n->>Pachca: PUT /bots/{id}
webhook_url=null + Pachca->>Bot: Webhook удалён +``` + + +### Ручной режим + +Если **Bot ID** не указан в Credentials: + +1. Добавьте узел **Pachca Trigger** в workflow +2. Скопируйте сгенерированный **Webhook URL** из настроек узла +3. Вставьте URL в настройки бота в Пачке (раздел **Webhook URL**) +4. Активируйте workflow + +## Проверка подписи + +Для защиты от поддельных запросов добавьте **Signing Secret** бота в [Credentials](/guides/n8n/setup#sozdanie-credentials). Trigger автоматически проверяет HMAC-SHA256 подпись каждого входящего запроса и отклоняет невалидные. + +Подробнее о механизме подписи — в разделе [Исходящие вебхуки](/guides/webhook#bezopasnost). + +> Рекомендуется всегда использовать Signing Secret в продакшене для защиты от несанкционированных запросов. + + +## Фильтрация событий + +Выберите конкретный тип события для фильтрации — workflow будет запускаться только при совпадении. Можно выбрать только один тип события на один узел Trigger. + +> Используйте **All Events** (`*`) и фильтруйте в последующих узлах (например, через IF или Switch), если нужна сложная логика маршрутизации по типу события или обработка нескольких типов в одном workflow. + + +## Пример: бот-эхо + +![Пример workflow с Pachca Trigger](/images/n8n/workflow-trigger-example.avif) + +*Workflow с триггером и действием Pachca* + + +Простой workflow, который отвечает на каждое новое сообщение: + +1. **Pachca Trigger** — событие `New Message` +2. **IF** — условие: `message.user_id` не равен ID бота (чтобы бот не отвечал сам себе) +3. **Pachca** — операция `Message > Create`, `entityId` = ID чата из триггера, `content` = текст ответа + +> ID бота — это `user_id` из ответа [Информация о профиле](GET /profile) при авторизации токеном бота. + + +Больше готовых сценариев — в разделе [Примеры workflow](/guides/n8n/workflows). diff --git a/apps/docs/public/guides/n8n/troubleshooting.md b/apps/docs/public/guides/n8n/troubleshooting.md new file mode 100644 index 00000000..f5d6b0a6 --- /dev/null +++ b/apps/docs/public/guides/n8n/troubleshooting.md @@ -0,0 +1,140 @@ + +# Устранение ошибок + +## Ошибки авторизации + +### 401 Unauthorized — неверный токен + +![Ошибка 401 при неверном токене](/images/n8n/error-invalid-token.avif) + +*Ошибка авторизации* + + +**Причина:** указан некорректный или просроченный Access Token. + +**Решение:** + +1. Откройте **Credentials** и проверьте значение **Access Token** +2. Убедитесь, что токен скопирован целиком, без лишних пробелов +3. Нажмите **Test** — при ошибке создайте новый токен в Пачке +4. Для бот-токена: **Настройки бота** → вкладка **API** → скопируйте токен +5. Для персонального токена: **Автоматизации** → **Интеграции** → **API** + +### 403 Forbidden — недостаточно прав + +**Причина:** операция требует более высокий уровень доступа, чем предоставляет текущий токен. + +**Решение:** + +Доступ к операциям определяется [скоупами](/api/authorization#skoupy) токена, а не его типом. Убедитесь, что ваш токен включает нужные скоупы: + +| Операция | Требуемые скоупы | +|----------|-----------------| +| Управление сотрудниками (User > Create/Update/Delete) | `users:write` (доступен администраторам и владельцам) | +| Журнал безопасности (Security > Get Many) | `audit_events:read` (доступен администраторам и владельцам) | +| Управление тегами (Group Tag > Create/Update/Delete) | `group_tags:write` (доступен администраторам и владельцам) | +| Отправка сообщений, чаты, задачи | `messages:write`, `chats:write`, `tasks:write` | + +Подробнее — в разделе [Авторизация](/api/authorization). + +--- + +## Ошибки лимитов + +### 429 Too Many Requests — превышение лимита + +**Причина:** слишком много запросов за единицу времени. + +**Лимиты API:** + +| Тип операции | Лимит | +|-------------|-------| +| Отправка сообщений | ~4 запроса/сек на чат | +| Остальные операции | ~50 запросов/сек | + +**Решение:** + +1. Добавьте узел **Wait** между операциями для замедления +2. Используйте **Batching** в настройках узла Pachca (Additional Fields → Request Options → Batching) +3. Для массовых операций используйте **Return All** = `false` с ограниченным **Limit** + +> При получении 429 или 5xx расширение автоматически повторяет запросы с экспоненциальной задержкой и jitter (до 5 попыток). Учитывается заголовок `Retry-After` из ответа API. + + +--- + +## Ошибки триггера + +### Вебхук не приходит + +**Возможные причины и решения:** + +1. **Бот не добавлен в чат** — бот получает события только из чатов, в которых он состоит. Добавьте бота в нужный канал +2. **Workflow не активирован** — нажмите **Activate** в правом верхнем углу. Неактивные workflow не принимают вебхуки +3. **Bot ID не указан** — при отсутствии Bot ID в Credentials авторегистрация не работает. Укажите Bot ID или настройте вебхук вручную +4. **n8n недоступен извне** — при локальной установке Пачка не может отправить вебхук на `localhost`. Используйте туннель (ngrok, Cloudflare Tunnel) или разверните n8n на сервере с публичным IP + +### Ошибка подписи (Signature Mismatch) + +**Причина:** Signing Secret в Credentials не совпадает с секретом бота в Пачке. + +**Решение:** скопируйте Signing Secret из настроек бота в Пачке (вкладка **API**) и вставьте в Credentials. + +--- + +## Ошибки данных + +### Entity ID не найден + +**Причина:** указан несуществующий ID чата, пользователя или сообщения. + +**Решение:** + +- Для чатов: используйте **Search** (Search > Get Many Chats) для поиска по имени +- Для пользователей: используйте **Search** (Search > Get Many Users) для поиска +- Для сообщений: убедитесь, что сообщение не было удалено + +### Бот не может отправить сообщение + +**Причина:** бот не является участником целевого чата. + +**Решение:** добавьте бота в чат. Бот может отправлять сообщения только в те чаты, в которых он состоит. + +--- + +## Ошибки форм + +### Форма не открывается + +**Причина:** `trigger_id` из события `button_pressed` действителен только **3 секунды**. Если между получением вебхука и вызовом [Открытие представления](POST /views/open) проходит больше времени — форма не откроется. + +**Решение:** + +1. Убедитесь, что узел **Form > Create** стоит сразу после триггера, без долгих операций между ними +2. Не используйте узел **Wait** между получением `trigger_id` и открытием формы +3. Если нужна дополнительная логика — выполняйте её после отправки формы, а не до + +Подробнее о формах — в [документации форм](/guides/forms/overview). + +--- + +## Ошибки пагинации + +### Возвращаются не все данные + +**Причина:** API возвращает данные постранично. Если **Return All** выключен, вы получаете только первую страницу (по умолчанию до 50 записей). + +**Решение:** + +1. Включите **Return All** = `true` в настройках узла — n8n автоматически пройдёт по всем страницам через cursor-based пагинацию +2. Если нужен ограниченный набор — используйте **Return All** = `false` и укажите нужное число в поле **Limit** +3. Для больших объёмов данных учитывайте [лимиты API](#oshibki-limitov) — при Return All n8n делает несколько запросов последовательно + +--- + +## Общие рекомендации + +1. **Включите Retry On Fail** в настройках узла (Settings → Retry On Fail) для автоматического повтора при временных ошибках +2. **Используйте Error Trigger** для обработки ошибок в отдельном workflow — отправляйте уведомление об ошибке в специальный канал +3. **Проверяйте Credentials** кнопкой **Test** перед запуском workflow +4. **Используйте Execute Step** для отладки узлов по одному, не запуская весь workflow diff --git a/apps/docs/public/guides/n8n/workflows.md b/apps/docs/public/guides/n8n/workflows.md new file mode 100644 index 00000000..bcc80fe7 --- /dev/null +++ b/apps/docs/public/guides/n8n/workflows.md @@ -0,0 +1,208 @@ + +# Примеры workflow + +Ниже — готовые сценарии, которые можно воспроизвести в n8n. Каждый пример использует узлы **Pachca** и **Pachca Trigger** из расширения. + +## Приветствие нового сотрудника + +Автоматическое приветственное сообщение при добавлении сотрудника в канал. + +![Workflow приветствия нового сотрудника](/images/n8n/workflow-welcome.avif) + +*Приветствие нового сотрудника* + + +**Как работает:** + +1. **Pachca Trigger** — событие `New Message` +2. **IF** — проверка: сообщение системное (тип `user_joined`) +3. **Pachca** (Message > Create) — отправка приветствия в тот же чат + +**Что можно добавить:** отправка личного сообщения с полезными ссылками, добавление сотрудника в рабочие каналы. + + + Готовый workflow для импорта в n8n + + +> После импорта замените Credentials на свои во всех узлах Pachca. + + +--- + +## Пересылка сообщений между каналами + +Автоматическая пересылка сообщений из одного чата в другой. + +![Workflow пересылки сообщений](/images/n8n/workflow-forward.avif) + +*Пересылка сообщений между каналами* + + +**Как работает:** + +1. **Pachca Trigger** — событие `New Message` (в исходном канале) +2. **IF** — фильтрация: пропускать сервисные сообщения, пересылать только пользовательские +3. **Pachca** (Message > Create) — отправка в целевой канал с указанием автора + +**Когда полезно:** дублирование важных новостей в общие каналы, агрегация обсуждений. + + + Готовый workflow для импорта в n8n + + +> После импорта замените Credentials, `CHAT_ID_ИСТОЧНИКА` и `CHAT_ID_ЦЕЛЕВОГО` на свои значения. + + +--- + +## Напоминание о задачах + +Ежедневная проверка просроченных задач с уведомлением в чат. + +![Workflow напоминания о задачах](/images/n8n/workflow-reminder.avif) + +*Напоминание о просроченных задачах* + + +**Как работает:** + +1. **Schedule Trigger** — ежедневный запуск (например, в 10:00) +2. **Pachca** (Task > Get Many) — получение списка задач +3. **IF** — фильтр: только просроченные (дедлайн < сегодня) +4. **Pachca** (Message > Create) — уведомление в чат со списком задач + +**Что можно добавить:** личные уведомления ответственным, группировка по проектам. + + + Готовый workflow для импорта в n8n + + +> После импорта замените Credentials и `CHAT_ID` во всех узлах Pachca. + + +--- + +## Согласование с кнопками + +Запрос на согласование через сообщение с кнопками и обработка ответа. + +![Workflow согласования с кнопками](/images/n8n/workflow-approval.avif) + +*Согласование с Data-кнопками* + + +**Как работает:** + +1. **Manual Trigger** или **Webhook** — инициация запроса +2. **Pachca** (Message > Create) — отправка сообщения с кнопками «Согласовать» / «Отклонить» +3. **Pachca Trigger** (в отдельном workflow) — событие `Button Pressed` +4. **Switch** — маршрутизация по `data` из нажатой кнопки +5. **Pachca** (Message > Update) — обновление исходного сообщения с результатом + +**Пример кнопок:** + +```json +[ + [ + { "text": "Согласовать", "data": "approve" }, + { "text": "Отклонить", "data": "reject" } + ] +] +``` + +Подробнее о кнопках — в разделе [Продвинутые функции](/guides/n8n/advanced#knopki-v-soobshheniyax). + +- [approval.json](/workflows/n8n/approval.json) — Отправка запроса с кнопками +- [approval-handler.json](/workflows/n8n/approval-handler.json) — Обработка нажатий кнопок + + +> После импорта замените Credentials и `CHAT_ID` во всех узлах Pachca. + + +--- + +## Мониторинг и алерты + +Периодическая проверка состояния и отправка алерта при аномалиях. + +![Workflow мониторинга с алертами](/images/n8n/workflow-monitoring.avif) + +*Мониторинг с отправкой алертов в Пачку* + + +**Как работает:** + +1. **Schedule Trigger** — проверка каждые 5 минут +2. **HTTP Request** — запрос к внешнему API или сервису +3. **IF** — проверка: статус не 200 или метрика выше порога +4. **Pachca** (Message > Create) — отправка алерта в канал мониторинга + +**Что можно добавить:** проверка нескольких сервисов, графики через разворачивание ссылок, эскалация в личные сообщения. + + + Готовый workflow для импорта в n8n + + +> После импорта замените Credentials, `CHAT_ID_МОНИТОРИНГА` и URL сервиса во всех узлах Pachca. + + +--- + +## Заявка на отпуск + +Полноценный сценарий с кнопками, формой и согласованием в треде — бот принимает заявку через модальную форму и отправляет на согласование руководителю. + +![Workflow заявки на отпуск с кнопками, формой и согласованием](/images/n8n/workflow-vacation.avif) + +*Заявка на отпуск: триггер → кнопка → форма → тред → согласование* + + +**Как работает (два workflow):** + +**Workflow 1 — Приём заявки:** + +1. **Pachca Trigger** — событие `New Message`, фильтр по команде `/отпуск` +2. **Pachca** (Message > Create) — отправка сообщения с Data-кнопкой «Создать заявку» +3. **Pachca Trigger** (событие `Button Pressed`) — пользователь нажимает кнопку +4. **Pachca** (Form > Create) — открытие модальной формы с полями «Дата начала», «Дата окончания», «Комментарий» + +**Workflow 2 — Обработка и согласование:** + +1. **Pachca Trigger** — событие `Form Submitted` +2. **Pachca** (Thread > Create) — создание треда с деталями заявки +3. **Pachca** (Message > Create) — отправка в тред кнопок «Согласовать» / «Отклонить» +4. **Pachca Trigger** (событие `Button Pressed`) — руководитель нажимает кнопку +5. **Pachca** (Message > Create) — уведомление сотрудника о результате + +**Что задействовано:** триггер, кнопки, формы, треды, условная логика. + +> Подробнее о кнопках — в разделе [Кнопки в сообщениях](/guides/n8n/advanced#knopki-v-soobshheniyax), о формах — в разделе [Формы](/guides/n8n/advanced#formy). + + +- [vacation.json](/workflows/n8n/vacation.json) — Приём команды и кнопка заявки +- [vacation-handler.json](/workflows/n8n/vacation-handler.json) — Форма, тред и согласование + + +> После импорта замените Credentials и `CHAT_ID_HR` во всех узлах Pachca. + + +--- + +## AI-ассистент + +Бот, использующий AI для ответов на вопросы на основе истории чата. + +![Настройка AI Agent с Pachca Tool](/images/n8n/ai-agent-tool.avif) + +*AI Agent с инструментами Pachca* + + +**Как работает:** + +1. **Pachca Trigger** — событие `New Message` +2. **AI Agent** — обработка запроса с LLM +3. **Pachca** (Search > Get Many Messages) — как Tool для поиска информации +4. **Pachca** (Message > Create) — как Tool для отправки ответа + +> Для использования AI Agent необходимо настроить LLM-провайдер (OpenAI, Anthropic и др.) в n8n. Подробнее — в разделе [Продвинутые функции](/guides/n8n/advanced#ai-agent). + diff --git a/apps/docs/public/guides/sdk/csharp.md b/apps/docs/public/guides/sdk/csharp.md index dcfc8a30..6f05500d 100644 --- a/apps/docs/public/guides/sdk/csharp.md +++ b/apps/docs/public/guides/sdk/csharp.md @@ -1,5 +1,5 @@ -# CSharp +# C# [Pachca.Sdk](https://www.nuget.org/packages/Pachca.Sdk) NuGet @@ -137,7 +137,7 @@ using var client = new PachcaClient("YOUR_TOKEN", "https://custom-api.example.co using Pachca.Sdk; // Список чатов -var response = await client.Chats.ListChatsAsync(SortOrder.Desc, ChatAvailability.IsMember, "2025-01-01T00:00:00.000Z", "2025-02-01T00:00:00.000Z", false, 1, "eyJpZCI6MTAsImRpciI6ImFzYyJ9"); +var response = await client.Chats.ListChatsAsync(SortOrder.Desc, ChatAvailability.IsMember, DateTimeOffset.Parse("2025-01-01T00:00:00.000Z"), DateTimeOffset.Parse("2025-02-01T00:00:00.000Z"), false, 1, "eyJpZCI6MTAsImRpciI6ImFzYyJ9"); // → ListChatsResponse(Data: List, Meta: PaginationMeta?) ``` @@ -275,11 +275,11 @@ catch (OAuthError e) ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Отмена запросов @@ -415,7 +415,7 @@ var request = new TaskCreateRequest { Kind = TaskKind.Reminder, Content = "Забрать со склада 21 заказ", - DueAt = "2020-06-05T12:00:00.000+03:00", + DueAt = DateTimeOffset.Parse("2020-06-05T12:00:00.000+03:00"), Priority = 2, PerformerIds = new List { 123 }, ChatId = 456, diff --git a/apps/docs/public/guides/sdk/go.md b/apps/docs/public/guides/sdk/go.md index 1e43a6ae..5cc4fe98 100644 --- a/apps/docs/public/guides/sdk/go.md +++ b/apps/docs/public/guides/sdk/go.md @@ -305,12 +305,13 @@ if err != nil { ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Тело запроса пересоздаётся через `req.GetBody()` при каждой попытке +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Типы diff --git a/apps/docs/public/guides/sdk/kotlin.md b/apps/docs/public/guides/sdk/kotlin.md index a50ab4a4..7d00894d 100644 --- a/apps/docs/public/guides/sdk/kotlin.md +++ b/apps/docs/public/guides/sdk/kotlin.md @@ -281,12 +281,13 @@ try { ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests` или серверной ошибки (`5xx`): +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — линейный backoff: 1 сек, 2 сек, 3 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff с jitter +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Реализовано через плагин Ktor `HttpRequestRetry` +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Типы diff --git a/apps/docs/public/guides/sdk/overview.md b/apps/docs/public/guides/sdk/overview.md index 37d3cbc6..7dfaa233 100644 --- a/apps/docs/public/guides/sdk/overview.md +++ b/apps/docs/public/guides/sdk/overview.md @@ -45,7 +45,7 @@ npx @pachca/generator --spec https://example.com/openapi.yaml --output ./generat |-------------|----------| | **16 сервисов** | Типизированные методы для каждого API-эндпоинта | | **Автопагинация** | Методы `*All()` для автоматического обхода всех страниц | -| **Повторные запросы** | Автоматический retry при `429` с экспоненциальным backoff | +| **Повторные запросы** | Автоматический retry при `429` и `5xx` с экспоненциальным backoff | | **Обработка ошибок** | Типизированные `ApiError` и `OAuthError` | | **Сериализация** | Автоматическая конвертация между форматами (snake_case ↔ camelCase) | | **Авторизация** | Bearer-токен передаётся один раз при создании клиента | diff --git a/apps/docs/public/guides/sdk/python.md b/apps/docs/public/guides/sdk/python.md index 94eb5465..b5448871 100644 --- a/apps/docs/public/guides/sdk/python.md +++ b/apps/docs/public/guides/sdk/python.md @@ -277,12 +277,13 @@ except OAuthError as error: ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Реализовано через `RetryTransport` — обёртку над httpx-транспортом +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Типы diff --git a/apps/docs/public/guides/sdk/swift.md b/apps/docs/public/guides/sdk/swift.md index e1333211..966188c0 100644 --- a/apps/docs/public/guides/sdk/swift.md +++ b/apps/docs/public/guides/sdk/swift.md @@ -268,12 +268,13 @@ do { ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Ожидание через `Task.sleep(nanoseconds:)` — не блокирует поток +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Типы diff --git a/apps/docs/public/guides/sdk/typescript.md b/apps/docs/public/guides/sdk/typescript.md index 3fd242a3..1decb27b 100644 --- a/apps/docs/public/guides/sdk/typescript.md +++ b/apps/docs/public/guides/sdk/typescript.md @@ -274,12 +274,12 @@ try { ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек -- Все остальные ошибки возвращаются сразу без retry +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Сериализация diff --git a/apps/docs/public/guides/webhook.md b/apps/docs/public/guides/webhook.md index 1ab746a2..156590af 100644 --- a/apps/docs/public/guides/webhook.md +++ b/apps/docs/public/guides/webhook.md @@ -104,6 +104,25 @@ - `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX +### Заполнение формы + +Вебхук отправляется при отправке пользователем заполненной формы ([представления](/guides/forms/overview)). Подробнее об обработке результатов — в разделе [Обработка форм](/guides/forms/handling). + +#### ViewSubmitWebhookPayload + +- `type: string` (required) — Тип объекта + Значения: `view` — Для формы всегда view +- `event: string` (required) — Тип события + Значения: `submit` — Отправка формы +- `callback_id: string` (required) — Идентификатор обратного вызова, указанный при открытии представления +- `private_metadata: string` (required) — Приватные метаданные, указанные при открытии представления +- `user_id: integer, int32` (required) — Идентификатор пользователя, который отправил форму +- `data: Record` (required) — Данные заполненных полей представления. Ключ — `action_id` поля, значение — введённые данные + **Структура значений Record:** + - Тип значения: `any` +- `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX + + ### Изменение участников чатов Вебхук отправляется при изменении состава участников чатов, где состоит бот, и в тредах этих чатов. diff --git a/apps/docs/public/images/n8n/ai-agent-tool.avif b/apps/docs/public/images/n8n/ai-agent-tool.avif new file mode 100644 index 0000000000000000000000000000000000000000..6e1b14db4eb14cfba63e977887483e0ce5ebf1ae GIT binary patch literal 47673 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

hp@v}1oM-riTy7xt|R)f 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 r|D@sA$#Z5<5P-&o5Z0> literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/community-nodes.avif b/apps/docs/public/images/n8n/community-nodes.avif deleted file mode 100644 index 5edbaa803d1f75f4d72818edb96f9aa69160f71b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21283 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/credentials-test.avif b/apps/docs/public/images/n8n/credentials-test.avif new file mode 100644 index 0000000000000000000000000000000000000000..30b22f1943934c761e62dd1c959372e791a961b9 GIT binary patch literal 24858 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 BD#8E& literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/credentials-v2.avif b/apps/docs/public/images/n8n/credentials-v2.avif new file mode 100644 index 0000000000000000000000000000000000000000..702a010a1388787103acbc60a49e554ed0c82f41 GIT binary patch literal 25534 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 diff --git a/apps/docs/public/images/n8n/error-invalid-token.avif b/apps/docs/public/images/n8n/error-invalid-token.avif new file mode 100644 index 0000000000000000000000000000000000000000..5cc6a6e59f726008a07e4a8aa2d797e7fd14567b GIT binary patch literal 53754 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 D(CvsQ literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/file-upload.avif b/apps/docs/public/images/n8n/file-upload.avif new file mode 100644 index 0000000000000000000000000000000000000000..3173608f4d0d7af1114a36a8a1d01f8c6f2be546 GIT binary patch literal 29533 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 tiFo>76qfL(g)+<2L{R literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/n8n-interface.avif b/apps/docs/public/images/n8n/n8n-interface.avif index c3afcf80e9ccbfa30f8aa44df6466dc7e1dce27d..79f2c6ba528e9e6fe21c933c7cae5807e1729634 100644 GIT binary patch literal 28286 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

HXu8fZi}5+Srctav?bxORK)1!R0_ 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 NV0gAL?!Wlu^ndr)*!KVc literal 82095 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Ǿr~jJv+dd4whg_{eE|jI= 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 H)@H##w81Y* literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/operation-dropdown.avif b/apps/docs/public/images/n8n/operation-dropdown.avif new file mode 100644 index 0000000000000000000000000000000000000000..95aa6bb6bf616ed207305524004d29f3377bcd3f GIT binary patch literal 28638 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/owner-account.avif b/apps/docs/public/images/n8n/owner-account.avif index 7f46456e293b6c85bdd445fc145642e6d839498e..7819c7336c2ff8d2318188332fb32ad9bfc59d23 100644 GIT binary patch literal 20973 zcmXuJV~{XR4=lR2ZQI^wZQHhO+qP}nwr$(CectcfdonfC-ASq@H9sc-006)-b@s3~ zaJ4W6_|I%COd0>jZ7dA_r&n!EoDKfx|IY}`jjbL3KMDX~Z(-#8|M>qyIC~3coBt~S z|2v5+tnG~cr-b5e;eX|c?k9v?iT;^07F1P{0C?j z_BQ{o{{M;q4gdlM0FeK(F*a~U0)T?Xru+KEekUNzpZ90lF91Z02Mon9;D7F%nbR++6OaK%*XxESJr05*z(bScVa3HrV@0W_ zWB&Q#Zb`RnyMVis-lbNfrKTVIqcro?4Zv=EPR2Hjw9H${wqvUoSB)H%wBiz023p0y zmPMoo6g`hyt2I}A(xClr2fXs%femIr^|D7;9pNWF0dpFCh64tSj8Ix zxNy_C_XY6VTLQU;i*KLX0lPLVQDLf2eOAdVXQW`HG>F2%p@Jt*LQEGkNsb(xNH~C) z@cy%G{jWf2jiBMd9?~+TJkUfYYCc%kpFA470(bx%L*1pt0N|V`%5`&&;OihL*CmC! z4T?SfB8~3+`uOBRVFBM$eL96sCr(gqgcE`4;vZnW3S(}ex+9PpnTYVZRvn4LcZcpT z{2R>rhWI4G)-LkrxsWaS+u&`v@bML zFnnj_O+sppJMYeMs9gpR(z`^sf`4<1N|SSVty_g zSRnL%NC!=KmUd+RA8JWH!FhTBoZkm-%tf_N0YZ^SZfCn)N<^Q|nT}LBL`jJ$B+>7A zT=0@N;)yrE!9T~FWPWNX1BPo#Z5FA?>m>|iTFeliBmtnDy*>X)H10p=@gX26fg%;h zF7ap<7M$$|pE#-z@>>$8PV6=GBI+-Ij!R6ypOOTI7z}|w1aK)yQ=gnTsr-WC8?9xu z6V@zwuv^z(4_Cr9qsB-3Epvub&Onejo<=SAn`naR^d7}mG~_|GEo{>bA|T>?No?_H zE0D@YpdAbl9Qs)Vi+SmC5V)2gG?oc>DxW}RTxg|ao*i`9k#9V+LkR=a-PE`@cEa0d z2|<+kgH(-;o_I1fkamBd<=5_1c<*rKmFB$~1Xe4Df@diH1lR9;Ezqqy-o~DCf3nPb zY~dl`BT57!^?gd6kr}t=`_SF&R&~|a#YpDjSQ-2iiP^_lkmO#x>^8@papcKHG02O{ zT-R?j@28iB}#_lBVL&i|;pQx2J zct01DtT^900PxhVIV~NS{c2c1y=#)ZwioLd%ri(;vf-!Ln>UY`-}*ih1dk(S#F(S2VEf9RUH7Ra(lfR!?5exs{6iKBer>3QFYSa0k zTYIws)o8eN80sw*zXn>^7(P@GfsjnGx?!J>p$Yhy1S-B59_9+WwFyr7pQl+$o0lKW zo|P-6SjN*zC)JwJDe7=_a~WbjI!r6oW6czDOHyp|UVwcGeRI;M$WJWBl_jLo2|xBAa6^Mh+vuWn}gi2J14 zA!Dr1>5HTAI-Gpgr$rOY8^kxFtVL%9c?&!$KG!Ba;+|AlbB$-}cT{^KmKFFQ7)lW2 zvg{r8)}{gFzuEdR^$14*`Qu5A0}`aC;gH$N8hHm~jkGtPJBvSGy7~fZ%n1i&Nz*yv zsZd;Q>SC4JRIpeJ;QW@TW5arG`BS*d1h=h*GamDiwRn-0=+bZI`)X~fTKMr=vTyyH zmhHB#byG|k%{#HJQy8yo(PC~qx=7@$;g$}K-)I@|&=H806kBh5A*p0bqRWfk&TQ#t zgCi_0!gm+dezVes_qA7=C(P}5#k4nm3Ju#h)I(Yg1>AC!L|5t$Xq&iEcHO^A)8fWI z<_{+>SHm(4kM~v-MYwMe(*29#Nam+^6v9l@!#|Y>(LxG3672_3qpMN!l^uRR%C


qjYfqr1h3$w(Xm8^v2j-%%% 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/resource-dropdown.avif b/apps/docs/public/images/n8n/resource-dropdown.avif new file mode 100644 index 0000000000000000000000000000000000000000..93479aeaff812b899ef0c9f5fa74e4952d9c3fb0 GIT binary patch literal 36009 zcmXuJV~{XB6D2yfZQHhO+qP}nwr$(C&1Y=eGy8sf?{+FV=XAO%U6sm@bTt3~0FIf9 zr-PxJr5V6~W@~B2_&;uIY4|_AW^3wV_&@)DMrdJT{{ILNUH_jVwzRbSzlZ)`FY1576zG3Z|HT@*F);p* zs#!WXIsAtlmJY`D{~?T_8>4U_49x%bP%NDtO#ep!0O0?d5dVuqaIo~S{GSIH0s`Vc zK(lnP{eSuYmjrMi5HJ8hbi1vIp$ifK6f`#7*Dv-v0b#*H08>sn5Mlyg7>1$1bJt2_ z5Eyh75d=liI<{(N&rT$l|`xeL7s35dewW90@< zU4H#fA!O{txKxVe%f6W5@^^Z52&5x7UJ~AU1LIN;c4HCwg1nzy7zc@g)<)i8mDs3jV%ae5LIrG0+k zR`CEB{*2au?vcY^>;6Nl3p0?sc|lpa`BY{)-_$A4l~OqYlt97};wyR*w(z2!ZRCtH z4cf(m7V3=(W@hdn<6u8tnwBz<5F_qCKg0*JEH4!64>v<;_%f$STCOGx=9ChZW*ng4*)AF2A0eSP5Y2o!S z1j#f8iW_XFZ%Z#gpV_j28?g@0|F z@vxTyFw_KMAVeSwl|YpE>?2PxmB94N<$VkDt9i=Hiqy9!_5k(}@lza~vJWg)da1?9 zwS|wROk75sPUtT?SI+-*p#ptE7hBcXU7ih#W`gXQDMV?x@S1XKMKe*MJ1LtZ#KzfR zt%-JzTJ)B}OK-V!C=2CBjs7NVFWfsFP3l>`Lq>Z z*rhwvEDaI?{pq1jtib$2KcQokp#ovLEz-hG_${EX#You4QL7a;GR3G9b?!g{;zyP|>7Hv@BiZqB5;?*+6US*>qy}!E>Jmzr>fDx7ck$-$gRDcMxNeoiqrmLQ}qPpo*0k`O%zZCn-E{Fyv$&F;=|Hby1 zNmUE_ayRSeU^*bG<@otYv4!Fh@dB6VzNhrvv^zvk^Q63b$;p(~Oi!gqON$825x9rP zF)51IHDSnQ*@YX(5wfXcE9vr8de<_cUHZ^hzW7U`u57`Jbo^8f<#Bi-n-MS(jl~?v zK<1PUYRk>u55eh45Km0#2=2&>Hld^9_C5t{CK0smbSH>_E(>-iiVl{`EWiaDtR6ke8r0XEm``Ju%1L=ZS{iN0!T%;heuD#T_9vi5OQU zrBB?Gn>UvulJoB8VQhJi#|!D*u2ufBYiWn)K14`+`_n_Hg4Ww)_u#K>u7YMf1_AS- zZ|5I3Mdmt)&P3qgUj8+ zdS>$gj$TfhOGCW)Q|ojUS6Azl3yxj*Bk6JZk4P^aL>dE$Gv0-oC8~?~z$Ffh1 zT1^+M00tHosk4#UAGG_=8xfN8K!rrCkE(xSZ1VDL8pqqIzGk_l4^tN&J?c;y(=haf z7n!FH9g|cOy)b2Iki*6WW%9ZwoqA-TB<_H-0uZM2YP9cxL6O>Jgdd8H?=fFaSQ1N+ zM|>EHhADqfvUad^Iz;Z{-PK6SmZmpBp=kW=&Y*pFU0EJEV{R+yKXQKg8P8p8ZU{ zzs*iY;m$96JhGkyn=RRSw78FuQ~c|okZKS34a1=?GpsfeM2;qpUd1RKq7Mrpif+0P z6v)PIHbX~0g)rm%XcDP$1c&>e2Ywr6Z#PZcy6D<7dTY{;tRS0{;i+%GGX(kLr{Arp ztB}D>Nxq|rmvZu+J=ND|q( zwMZzZ=mf5t_Q5P(iaI2JK3AOz++InZ3*naW%h9oyu-O$L`F|?!!MBaZ({2L+E)ZHJ z_|~96MxXl-IjqEK1*~+#U$Wjv$ zQkbdOF5c`G@Tg!*l~w-y$An@hlMb>kcl~7NY^l1!mEmV;%3Xj;_Af*mCk`bjv@_sA zzAxhaiN>pn#<~r=aunSSq)+}8`+<+K@6VwpRmwH?nPUSW-CZ?*TSt?|1;ielHhKBW zWi+`>v^VdgA)K{AVTDD#c#;vKnIhKCuCNDQHsOc8E>s2T>6#co6r%pHTQ1>WgYm z@iAHS=9?E5XL}c|CUhVj6M}K3GIQ|}QbCkKH=aA|lytxLU4-cHsl1jw>V1i4oA`lsq8r(~REYq}Z#Dyv1b2XUn+HDk7MO>~6@!t|4upZf%;PXq@^LCMG~ zMZ`Xq+q_XKRmhYPi;mG$3?2BZ$$!AQ-hJjB(snMPpn1*hf=?|D9;sS#W#H0=*fe2HaAZp-XvA-x-!#fyAO@%*m=t4b zY&!pSp>-v(0$ zD7jKE5LtR0Y^e#MMOsP0BM?%k6;R~dNjRek+Sh-chY&5JC)hztW)-r1c)ZYu!vexz z=P~z$`TV3CE{xwrnUtx*j3f(M7Q>?h6gvF?|NH9YT6z?dFQW)?9_T9`h+es8xC!fO z5fBIzQX2}{eyd6*9lR#38Yg0)ul>e|LzsBpW9W|2wsTW~QFzHM_-9Kt<57p{EFT7m z`8;JUm`(0b*J)du0-eSSrsDDI^OH51ox6u1$_m(}7xY9wTHoKL2@q6!jv60ED(-I; zrHnbvAe>*wY#2^L^84i0X?7!V8=_5jy$5x0`tdjHMGu+{tFFO1Ra24MY9BC~A*Xh~ zANCwK8#5L!R9R7M-H&fiY%ynzC~YSMHcAGtv23;cJU7KNUg}%tocyXQU!eHcB5E9y z49(8W&>?6d1%iUTReIN}@4g|DHMbHWnNAL<*yzv-x}}rKAKIXnJb3{f*{L1HnSiCA z_hNkMe|&i1R(FYSw~m5V6z>TMfSw%{eFvZfK!)k!WL`sE_}~iHp4>H6^N_f5fY2+d zESs52cK7z-suG8kB*Vf1<4Y~NS3G;P0{}ukBFyZ$7>!T!aBnDPR1$x$mRw*CeYBB$ zCUR;@*#TWU4X`lD^ou!AUPM1*4e9$?S+?pN5j{glk8&3#mPg!3YlCNbSDhxYBc{>- zIks~Fre!nL2&ZJ<98sS~mUq8rnu8$0Ir1mDbVIw*=6%C2m%~L+^!(jg`X*Ts)6J3! z#hNzmA->m*96b?t!YaMuIOTBsTFpzpZCjEFT3orL85MTPfY%!~){$UltdWc?((Y0L zDRj@DfmW|!L(7Y4C)fqCC!Qa^FBts0m_Z;b(84g{`=J(v83!(2l)HNOelcErVup3X z@54PZj6n=33M4hbCC=Qm($;dW@FTK93gc@y;w$)^fxaCJaBp0*-6@9G_E33xkP0k4 zE_u7>K2rLF$M2n`5tno-1PDP85DXR7675lDY1RkOqZVb|lZ(~JGIzn7J|*i_x78JC z2y$rLee~bk%3$`SgPE9<=8jPY9)SwH4FrPGmD&)m7ik(|c)vIjh|WlYVD!Oi&B=&W#-pD)dh zzdc6ugwKR-MhIt}Di9qm4^mlPjS&P8H)SG%b~&arZb_`D2nP%;PCsn3=q)lV$b zR2{*Z-(71&!S8Q_U0?6I+b6rF)k>Y23{QTNmD{mDK0ULH zKat&Nj3(SyvQ;OrQa5Y!-u@N~7wyFL(TqMa%)JP@o*T)M^5QM%Lr0==i~gu9APB4W zycyRMgQms(L%4o!KvVyvhc@`N2dl-hgSj#3_`-vU) zx)7wRa(ms$NBp+m(bH#C9wW!U*8vMsI|nx$4asdd?=r7(oRjfuHemNK^d5S(4!KyK zj&GiMr#=B-g*Ra`w`e+D8ds^Lb>c@?!S5RG@0M__(K03-DZ-!4N3Yn4a*=W4Y$0T- zx>8Ccq3-7K45E$Dq=b@qE!3(UBl-XKCE`H3Tcx7G0&EbSr&3 zdb!m?1zO9!5ME5~QG}Mhk3#BIk=3`?4zpq#jto5@ev#f89@{qQ`Kj&xmYb)5DQhHh z@HeoiR7VQIH5rzP5vzPc2$B-njnYL8aZlZbMp?%Cw|lC(CMD<^%`m?%FJkpBH8Vtt z`l7dPeDlZfD9xfJa8vv6Aw&=7?1CDjJm6?K~VGS!w(Hu)1R^4aGJKK=s+&K1hT6R)d%SX7t z#Q`L^%D5SkHThZ_t~gA-HPAHvul-|bI%He+CYPwMMwVw!YF(@AKA|FJ;gde)@k6gz zOjQofW%i6Cvw~#nD~|_BQE;SPh3!GM7I(Jqp(@gR%`0H|CJCHwYAQsl=mNM^aVf;^ z6RtF4`*fTs2!br!wKw~P*8y5izyhbDLr#`h1X#N(wRpkL3o26)qIrDN_OPf_?`thvUz3;*rsaW!_R6x1kc55F!(0d|V?U(X z!)3dJ-c#y2EzJ@ilD`M)RHdoY86fow6I(sD&iuW*8)5$5XT-IR#c@}16N+-#ZB-l3 zk8qcFb9D<=LSyVKe$WM1rGRRtW@B$q(r#ogyMkKQ87GrpallrG0`{yT-3YR;5>#WI zB`8FuM`1xO;dLzt_f?O+pSb|N(@mfjAs=T8#W>jw3PGLF8p6#^E{ST6ZTTV0BLp#r803@t3hBH|J63k0`sU zfKIQWF(J>^AL%>2r;OzIWJZ{(-6nKc0W#VccG@JtJO=~>1IGoYo?^CL^xBpo?BZKU zYf(2v2d${$Hyu;F9N-Y4GRX0*NSnYSfhU61Im^ogJOi2qS$v79wBHQ8IJCj9pSSscsSOC zR!eUqm~@!KNNBnExY{%k-G}~(x{v;F9|5i^329Aus5W>ZS)iXwH>~C84NHf_Vwnw^ zly zRhG4-V~+V~-S;N$AJE}?Q*X^y%$`ed#HDLU0@%y8CxDcO8EG#0ndZ&WoP_)wwi`Wp z1&N;%HDOD9)@n#M{>t?Pu!4`c2gNEOWIm z+%=ViKy%>e8-+qlslAw5#WU(cxRl=)Xr;fZy4FZlQPWGk!c11p(`KF~s;$|^;~749 zk&un3|GwFlc0=>T4M9x|147xC>`)G5RkltslpU!YG?Ur;OzE=-5JEy?p0tMzFr(!4 z%K+mwflHUEW(adcYNWHezNMBbO8sd2W^5l=s7Tnf1tN6v8aX-_#f0yS8)#o=lt z+5>~D>QRO7FH4{-*fO)1IEO+@{qhM*0a>ELZ$u?Gr%u&e%m9VpD3!1I2`;baUqwCukTEs_NzRO6tj^ z;C8abu*FBy?w^B8@$^t#u(2%r)Xa=%3&PVonYu2A=%Jsu04&IFq0+O<3N9zXr%N%SSNXtc76xFuM{ zV47En-R1Oyyf7&_OY@lhSE$DK)-h1=RR#%kLpU)zFqx}M?B~w#d9`Ec2ibZ6Wu@{Q!>}Ig{W`knym}Sb z`WBmfQWICKHLS0)yHg2{DTRxz?m;gecsbiyDF$OcKMNtF7Im`%)QqGi0VVaJ0nWoT z`E`M{%yuBWXz|3Ju_r*TEp{qPU5n$1V5V>V&z;P6@gfirJ(k=Q{eFRS-Vv50Ij3F% zIV;+fe)EU&nevqyxv%ehT#$M5OAzX;nJlh}Rp4lGnjBUwKf3M0{hO;G79|?yZQLmf z76JDZUsM_NEWyCj_$sj1L58^T8iHQVrO26rkA1_UIjeqT_|i0#lT~Pj{cRHV!m3j) zM}=A!)CQ?La{jPTQpr^8r80Z`fShrt?VyyiQevrDvzvPsU{u0hqyl4XRQOz<@ylPL z_i*0iMS}5c>k?@}FW+EEt4&fd8RnzlecA6KQ5%wQ81!$IBo4}3pXuIeTo??+WQ_X2!&OxzoVwm|ym7H_>BM2dFQH_M_;n5B3w;8*vIDOV@ z2tyeOy)6ZCly0Js-?uE>z~-f8kYYX7$h`35UoRVOO2xvtq#ZXW&MGX$sf;c^?qX3i zx1D(jb}M2JyWc&DYHmRQA?$`eR+!sFQvJP3bcqkx4hv3YsP*?4?XnolwExWsa-%X3 zU@1Ir0?U3=V;XM&I;ZutAUF)s>?NcprvjIKcf&A{6UbeRY4x`_sMHDMFNi$nOIMD_ zYN`XHV(>u~2!=+@G%Q|DhS3VrDV+)}E!Mvt8_-@GpsJg|2Up_5rNCh)2uD%QxB=z0 zUY1sXmq{>>ma?5twejQrid~I|4>S3SlhmT{nxA?ALZ+(xN)BHSro*^u9}4zKyl(eSrAqPrYEbQfuIL zZ^V)b(rg0SBygqsfw2?F&FQnK!Ve$bF${6wJB@f2?XO`r-X<1hJu zCo;qGf{gwZeM0NjXIm48k{}6p_ZUA7N(68C-4(DFb^=m?x1N8@dx3N+z7qyg{b*W$ zz$9BCg%-DS@E&q%T*%3fx-B=;l+zoaYB3SR9XZyS31zry;@1Fm+(n7c!)Wdm$|+r> zrtIpUT~C# zy;p-U1}%zpfsB5YJ1RADy;K{FE0m+M{|PwO?yn{^H6lySg2j zoA>tsb}^us3xDz2SS}UZ!%ogbV&j!ZG2MFNq9Qnhr z(~aV{~~@h`V}hN#3=s*M?gufmXAxDe+a zoV!Tgmr}1&0peko%t!+I$|-bhgHwcKD85^6@Vj8rA7J=^b|u^{spd|Yqu`krZ}Na$ zV;x<%)PJ>&N&L)NuwNwvd9H3LlL=g6%XDh;g-sBsxG$a(^fe^>-G!*Ey7qNV4k5p# z@905Eh;M2e;3YEjQ$ed|7$Q2W0_U^>+w_54>8x!Q22R4_vdl=Ukv^97uj0+lEiB-Xtf{(34YW*?%={Jlt$bxLf02w=7~N@`KP)Wu@w#Kd*Xlr{ zqL-_KxV^a|0yQpA{X~($bMo``qh1|Z5&S%S3P`jZv6s?v}TBFYeQj5<5rHQ63b!VAN|D90SKHMQC_ zoSRj+VBzK#IWh4&umjD~>5h_(WYrZIu_8qG#*}A=_)u_lizW$a+bOf>y$HxlU*$yj8{u+D0ULj>USgj=G!=(x0x2~v zuvL7giUGUzFcH#rIADhT9_fXrz?R*3#Gz{fNe`K!&roRZXvZUH!vEm2VndMRw}XO! z24~=;hxsTBByIQ|x-{S;=FLM8ibk!v(1!8c+74LdmQQiDbgJ`dYEg)c+f_!|SbsR;a`jwLZogWy(TBQ^hq1kDQL zP}dgmzYio{uQRF&D-NI8B91w}4-Ty%A8X?e=&pt_uvi~mw2&b+ZJgZCr)Sv@*m~V< zl=51qFQ7FE_b2(u$j=d+fJEi>+YbMx4N96{u}U#>4&#s{@q5R+efy1MDhNOrF0<1T zDDxre3n(XG=Qh`rK??+YvL%1V_`at=WAF;o%>0kAtGvfu(|jbvjBUpkCB-Umo1wf} z#7i;Pg>IlUAoDuV#jq&h7s?FqM}$h+ff^7Ts)~>vDln2BbZ(iWnOA)IgRx~j$CfNW zcVVEFLt#I2GjBnd+>)5oIrrFJQE8mexmc{YlC^m-*ruc}Z9zQ^{2eOtxJ_5;^!=Ye8P0;7lmx4td)}voT?IE{U+YL#2^e!0a zJrNl9fT~r&c3TE_#<`ai%Pj2lCBKNB=);67kw~y}4TitUy%Qdu8DB#pmuQ-L=S-Ur zd*sdD<>h$@y^P;d=sR$nqo6yWdY$knN*tNjzHKee4Rd3;E17W&<1=Aib9$w_?zdg1 zZ^mRk9uU)T5T@7HhsPTdoQ(#>yetwg-pm2aQNLdl@SVPcJggvpphRbu``~ZClmEI6IGsAu*69j;Uf`~nGHk9?am(qfn*TnGMt*r07 z$~9?*#m^Ybi?!s{KaI5YvropayFE3GL3mcpA~q-^z{gKpbeCPdq!f4t7X&+M|4yGw zcP_L|FWS#KL7F4iA5HtF)`O+Q820(W0UzPR6jFU<2;dOM%kTjSAyEC>uVTe5oT$v?AmKsKA+tySrLNK_sV!|(+*j;IP( z-I`zPRDxbLJ*;iRZ06XEW6bUKP_idSbH6SIgU(jHvu*m!j|w2K2{blX+8C@E{ zU<}@&x5Ff~iPW~tv-3DA=OOCVxqB+yYf0sTohtdn&%ZFZ*M}AR1+Ezd_ z2I^PL;`eQTUL2_MPipM#6<1Z84b~NunBZDQBq2f)m)6Za#sO@KcxB72YIn}PA^Gyt zwMhz%Q;tWLasT{9?6~^zkw%~Uqbk9CSIvxQTcRRd3u5VD*g0{mjKgB!9jMC7hb`e* zajuqOyi;vF>H@e^C>$cKt|oc5z0)^+(gTDEOf1#TwVn9#Cc%%+z$tQ!mt zI~yeB5}4l{EO4#pMG@NOl3r3 zd@kf|1{-|J)mkEA-o8&*e)+bx=GN&pe-?Z>mN(A5`84Z+nw4Oha#P$PquoYnNq2wU zYF%KBd1BH)>39hixCRFu7#WL zlbJjDBGj2KGuRly!|G`e$tZK~XjR%8oAZ?plAAM3Y%`|g-NttJ7;a)f$;37hLAgEyR3_Iq7UwhO z8f|8r3dTfz(oL!_I+2<^)P@jns=_ILey@TD2#LU z2hI&8=?_-S=8>p*qMOd#7@AV1C{_{B9Q+On6VSb-W!_7Rx*UI#bmgL07%a5v$h%D4 zVmb1O2%vUp5rXmOHo1(xV=_5UszB}tFF)Mo`?QdNtCIx<{1RSGqibC{aEA3YBTqnr zTFm?Tco$4K-86>N`QnNG01b*BT*Zc9 zmzEZ-+7`V{YJYAdpI@`veb4ZuAwkf%y7ge?zG)?9c_$%s&mcglxtBTW|T>Pi<>y@ zkb`DcDtA73M?Wb)VT~;H+Ag}}gG)eeC$x;AlQ_8DSj8^tK`Cp5dBqGA;!_bOJkypS z31L-%Y4%DGF0hn$EAf59VbQ)iFUGJ9J528W-0*2-6cxaA)AJ;z$vXtR7N^Kja%6i@ zKe$;aQm2~n>W9<{;)H_wRZ<+RA0JBp2^M1v3MwH(AU!68Kg!deu}$gNWA)*_UprPY z%Q>7LukBfG`rR`~b}nPJl&^jH7yfzFgR|j+MaPJ*rc8*F8yp*BgDmI^BGh(E*w1~H z$O&(zA4n0%&9YC`N+ZS--zyMYHC>VRO)ktZmace(D79X@en?<5;DuMerI(zj+ILgM z_aiZZE+&rXSJJ;*f6N%+9&BTs-;rZLfH-Va|5`ZEuXKUz%%RKIB$iq*3%qQTo3Ukj zNA|LpD7%(rkWVV>s{n|;!c;a6np-*@)yIta1w`j*6c~a%gCTJs7$Dtns4D=qRIQ`S z?k=P`FCqxT1N9Ku0UjsYJ#*o3DV@w@TKbJmmQ7(UzbgS4^UmEs1wA+HPa1MrUV)Ar zk(5e3=MPPa4HCY9zR95Tr({0e5ya7?EXb~@k0Nr&K_ulACaYFMs40*f#AyJT;P+4j= z`@Hb(fMYGo7{Rea#loOgu(CX0%i$0jB~cjI&__!2mq}PGm+1su*I2+KzE(?9L8#R5!PSIVGbHNh` zxl%Pbj&j&~JOol$Uh~g$kR@~x4B6_()#jf_tk03DlZTm!{>4A5 z5e3~5hzfiY#oYL7HTNZLo`v&g@S7_-$xb|WAiv202kl5`TbX1g%C0vN&qf`RF5tsKdL@pQyP<)yM)$b71vFAJazJM=2z%-7@^;MNR|zNuxGk z*itMx_0&dgaiXO};4M4#K`r#@N*ZJpEugM~maCCgP_yq`;w~auHZE*p(m+NZh_MB+ z*y;kCN2zh=)UJhQAW#_M$%%+gCe^*C-r#aAC=_lG3aAr;DF#7eAgfvsa7Vs=;xYh`L#x+>02R!qNOZ>kjUl0$GoTW;S zB8amy*hyywG)8brlYHz8N5qQMX}lif(Q=SCL?%VNuB6H54*&_o{#X6O0lL8PePy&I z9Y*Y#(eh9eBSahl6bd41|DDbai7M2I&gouML|+j0arRyvYc4M=t{~#NJSr%X{_)#3 z&C8VAcva5TDwXM-XPF7&a2n5IxyJrjG6D1sUhTjC8de}F@->rMmhaB<2|67h5`8JlyYOKN1_W-g1Cj9J2n3i6`0xjeP2m%l|nze zJh_EmS4kOZ1vWT;zOov;ef+-lpyabw#C&W-O>ImKF5O5^uN{A+?KN@9d-yJ}hZb5# z{u|)Qm|C)sxTtMN=f}3znbl(Y%SlGR3o!VZ6`57*c$L|O^&vj#^|+S}w&b6=r{pr!_%Oc>C2( zywtO;H~6sS95sqCy|ZfF+}~_AMZa0U>0!@Fcev$~#yx5Z^zJ)If679@Pgg$k92ApCFuVvV5c8rP2`8nB{c0K z*ae{qvns1jHMV5E(`i6w-6XA%m%!2&$xL|nNqpMjkycO=r(Zs0L%&C8=#xRhGPN}= zH08p|ysmoIyvW4YS^8q%m1|3|fT~*%W^~u~m)XM+8O_qv$J5#&U|a1mq)cs;28TmM z7f$KyvE-_Cv!L>!ip8r0uNRIIhVMBoPV9oBL?98TNJ4Y>D??oiu4z`CSb-Lg_u3{s z9bYzh?3Sq++uNMRJY%D?R}T-VK=65;7!-UA$x`C#)Ju%Ifnt5Rk=mEVpYQ(s5weRd zX&v%qxJkHmVQq;-YSb9c`6oO{{Ixf!L+Ngy!EPht-Pu>zNdHm%#?&FXS4{Ie z`wcmd(F+60>{43QIpT5yz;)lzo3Y1waHoEX~dDIc}=RG`@mqAvvinme=nw5sEHI9u|iLA9a}DFQ|v zD)u{clk!9y1aoS)(|2m%C%Zf6e$#GgJ#^PhWS&^ft@f2t45G2rzK@JY%6B6?EZM8M@@!Kd3{-u<>%%{&Cj_;t^9zxVG`N%yHGrfL)QM{^x4Lq574$f{(if zFxsqF)`oY!!ItdMc91{x^)NG@R#is|4ANPIza|m;X|`0k^_~v#P`9MyXJHH3J}-xQ zYlP|W&LowBwHau?^g641{r)}h06*-wRrNMeSQQIo60;VD&-^?x(&1Ypvu9uWkOE8A zr8=+YDS-|~@UeFZ7PYGA(?s7w^OXF=y5kO#2EbdUjh3B}Fwy^m{eJc@h>5eqZzz1l zHsEva%~fh~k9h4+&MeXgoO$l#DF7R^_NTUD8h}FuYHqjYK&WT@G&RII#+fpiF_HI@ zv`;A`GcvcGW37*uhH8ykCCfpPHOE1{9*n0QW|Ly02$s3W0Mo>p4KSMQw6)buO#D8V z;fL_lW42YyW{$$__LC^d2`wMBcSU1Q>O#cmEs{fXv6O=M;wV+w%n@$}xL1``zs>n4 zP0zsTBo{7%t&sh@iiTKkv>St9xuV+dvt}fOtyW|e z$BY2c*wg2(QZ*D~5K=Ex2#g@q7LfApYr9%-{Dccm13Y!}?+ykLb_~^7RF0TS7xDYuW;aQ2?B%XZaXICOO|ru6e8}X-I-JL*ij5 zSkK%&$vOh+I@sZ(jNeN0Euey!hBcjQ7itV`#&we%HE=(qK(sq#-oX-BaT_ccIKCPj zi#(`uCyk{f7wgZA9RmD(wA$r)tpFTrHKTT8FsGW#E%XJkemX57uLZx`6zGL|d`fO8Y8b zVWnuu+l;fOMgMQ4LOTsav-V~wuBn1&sS9<{KMjeibrQvLzmu&6!yRQwJA^O?HJJtT z$Z(Da%Kp(6*J4Ghda~`aFvDsE2E&s2m7r(4d1vwJvIvFZ9iaUohd3q8T(&t$uNiU% zJd1BYmb@hmh1rWw|BWgS_Pxbho(+k+5A4-i20f(KSPMoy111avBUfB+Nz&2_E2pRn;o5}hTb%t34$rVI3N9lB`8BXyduJOFfG*` zaqc?FPjDZ111BEo&wSRx(Kf4`i_j^QnEYPmYnZTE9iqaZ^%?VxR#Z%~#Ta(#vpTf3 z$r|N3;X6$uRGHWg+ON9lvaH36&ES^8u3eQc7|_vZ6hG?!?l+!m@2-B@-^J6~OB~5A z!9WTW@P#(r+DuyYJKd*c&-W2I|=rqPQu5 zau7-cA$=kpDZTZV5v{Bh#r!({>5n7jh%Wi0f9H6YiXyZAbJ5VRYLWDNP2-A9plNp{ zAG*ZgeXoEdfr*J8I<&m)60UlD9(ZpH%0`M8%8`m`vWI`04XkH0aF@{}`4NXhrEdFV z`V7^*Hs&{Cs-%FO(Q(0LgZOM$%%YGo9s z&L_^B{$x`ZwAVS>E%{S$xgaWV|FSAcDL5s(DZS~O61q|*(YrqO_>k$ML#&P`BK3gx ze|=>9SKEY9f~D=^RafsBW}`)Jfo21J-k%S#%A7fS4NTx zMad1k&x!*xM>;+cw+O2tx679M^dsj?p}^tkU31cVdE5v_Ogo##Oeo!w;u=981m*wj0(SQ-L4*z6Xq+OeZ_QaB_P0}?G}3^*UO=6xF0qXpEM$SA2;b% zE|*bhHNSUds{zRVpy(nPQ21SnK^eVIvjNys^0QF0QoiBkth(Gd2@?{1AF!YR_yvF` z|FCXKu|Cu&&eSrG$5mUv@nS!##wsy5A*W{oW$x{fEhmhc>ey9Bwf9God6)nVK%y{~ zP@`^Qc>Dy%j7)$4NeBO7)}sSX#DlxZfpE0^rmY|#WF>2fGypX$wGO74#De-NfOhU~ z^@SL+#Xlu^f!I|h*P8BxU6TxSqZPP!p(_%do5~p>{dnW!x-L)9UDmzbYde;^i_b41a zvNafqVj2mVCCR~%>w=+Zc#vQmp@hOZ>p{CoCJP&qP>>vWMQbxWznD($F7LK-ea;{P z=XV35AKA)w9Fo6U_2T4DSK){XsCd!9AZLefK5q+}A|?nZ?AOVD%;WMJ#s!x8@+shE z6N#N^MaWN>MUm>9dAg3XRHsFpSm4NAYCAz-h?|@Lr)rFWv~}I@zAuz=8^et9uNN7iN>xU2h@O zu~k1RG|Ftw!#Ytuy{7fNCAyHUku4vN#LoH!db3{mB<{wyN+|?DO!m-akr^dSUpj5t za{=|%t$+Y`0Xv&xV1nZTzR4RAQJgx>37k)%smQXmARM0W2~=(>cvyx~>=fCR{rvpH zHO1t6t(J$X2tW&!8*umlZcVLt*gq`k6PgcqY?>6P7;VF8v+?3Dw+;$;Juyy}$H_rb zAovKGED%F+ASSNKC+q@;3i!#PzD(P>>l-QVK+OFoSHH0VoKdbNDzcvH-j zz~}K+>geO2ecw(r(=qp4AFZ*)q0lRgFTT_Tm1+Cpqd^pU@Z50-8M#Be9!XKTf_V7o z+2ACRx*L~ zxb)0brrI9Kll+;c%7RJ}<;*1HdDcRyg6Ii4B)G1P5`OFv7k^Ox+;U1>u~?(~>An zOx)|hfuxZD&uxIio)hHA{O&|P;xEu(s3L8!Yu`vO9Jv{pjH|i$_3VTSzgY9AXb3UvceUG=F z{|Q62omZYOo{XTqcsq6j^N0pBuAdgKz{6mtYya%2#*P+sq(9k8G}ysEx&%m3@;*I5 zsG_ll9LsoSV&6z0?ahWzO-gP%eU+XR0j=&I05u*eakKBjDxaMK+aOy?y1=K zA7*a0+tyOy!Z7xX+yRWl^S~mK?hgGNawUMEKRVUX6eCNnJ$P?jSBa9@z82!Fx4!kGqYd!fHGPRbd}QV;>B=7})WeXK|5R zdX_feX$P3`i4~KNyiYgQ`P<8tQ=iL$*1I2|bGh~$bQqLd45zf1AIdFW1Kl^3;abWw z%=GDe1<+kRS?8Z+yU=IOv8Oc;-;oc`_Xy(@7967kSGyxe66oAX0+x+8-|^GZ$wXNp zhC(amilCI1U;4!yMFRe`e%CVK#?-TFZjBI)8o!h%g8y0@@S%>b8372?WhZi;6uqTG ztfppqib~yemEoUxFd|G05_!fXe0OJx41RTh%xEy=;1sz{TdW#LV=#UO=;}rCN%L7c z36m_FCbTI5t@P}r}jooQk+8*wk$5lI6)_Cu2K=t1( z-c89PPRzk@K1u>ws${t}ANKFa{wXA%3TYbkmm=>uw47&z^EiRR8ZI}ii+3KXz?^}u zfCp}fZ-!bX`7KO3U zVQF&=$dp~Biduvas4x#WWFS8%@VA+h5D>g=Q&cGDy4nEwhg_l=uYvQ2Gf+M|m1un+ zi14qF2fvC|1>v1TOmzg}`H&Zpcv7zOlmkOZi|xX~hU28Jek>?w`fhHX6guga|4*!K zmDeKC0^(z`$0tzlkw?ur^3mMkpP~LS3cH?AK4Z8Kxz)4*R+$f6h^_z1M~Jl#GAm3K ztcCNbR*YP0;YjB=)zkzm?9j&|cf(w)X@~0H*m=Kh1bG&QJ6)RU9p+Bt>J9BDu3V50 zn9ja6R2HE=r?i%F(RCF(gPh7R-41QWJ2_zKQzhk4Fa53Qfg%c4Ie*jZU(@3mJAZ*g zghtstZl$Q=0!qr%K2RGT5{2yp^A$4{#rxbB!7bd~sc3UjvW>kw_BEJXbm_r9@Cs!f zgDlT%)lky|k)YliOP|(Th1o}4YM%{93DnBZDbDGU@m?HN_8H;`3i9HrM|*IAA+2jp zJxGEhis5!ofKNL}&ur@|{_llaI>2*U*H)GD94+9j{AKkk*o-GZJ<|MsHDp50#?TMb z97)an_pbtf*ud3Q844y4nNNb&*SC$n8ec%d#wIwljED0NDfZi$O_undNqN)nnCPx~ zKmkPx@i*680f{KY@-LNX?~=K&*Vs3oyM$!|`inE7m@nYUu*#~A^^)YKdaji6VGF;a zzK+g}&4)(jYA!l{5_2>S@+zn_67k>WryAE{>dQ@8ri{}v_=zILc#f{}8l_l#|2_aM z)W1fFE2ku_F^brR<|dw3Si$aylnkLI{#;o)j*i$j-v9YD82}95 z*w4UHSQ?zNKSLI(%h`~sJTpu5+pKap@4PqH#Y-;AP+)_u0>``n*xjDZFzZ_s)Rgg1 zk)GtJ{~QZWi_%sWqX};k#k_iP1{8kv-)v15IuGe9?Q282(9#o`@gk)>UO1Emy!=d? z1%Q_~1p_|YuNvDAcDfXP`Q!Ax&S=F8UGBJPQu3(dOt!*;43({f$M!A@H=ZBA&Krwb>acDd26sY-uz<+WH zY2HP8kCuxnC&2(AUF-5GKkM~cG$l5Gdc6TyAKI*bQkd_xFe>HJ^+Tc<#7xUp|9vOF-7SAfc=)L8; zEO4onp$gN)QdH;2su>nC?@+C2XZUeyZq8Ag0r%t#1IAT%R21-YM7Y*#w!i}$7UX4N z2KXiplUMmsV((Ntsno~!!EH>WY$~O|QEe_;y5{hG|Km9D(RPUY=jUjEIPFG;)$S)!aL8E|g%a!W>F6Gi+ z)gc&j5%^37jHxCId@tRFwH}l@lm>gC%hq*UOy}@t(p9fGG zE@?C2!2#n9P7I6Mfe-egZpBDIi*St+TCdi;auGp|JgX;T%T_R>B^TS?6oG)C%@O%S z<8WZ#9wpeb;U7eQ_&c5akVTQQfy42hV%w3zXl!MW3Y`IYi z>r)C4chg2Q0KOaS#Ncz}e-9I=*$QtJW?BvJZQ&#+&A58#f9$5)JJ@XHn~yck;-P*^ zcKOwCN8g^|YqF4FwD*_x;TJKV#k#-k)l>P84GJ0uXo%zouMn-`!`OPg6_#1b`dhxH z*wha31jEeO@SruX?T*Iy#5E7=ozwFQK%krW!9wk&FZ*(=F=vXO*=oEI$*`$1*^}(Y z&p=_4*6E|Q1QmZn;J2~*%qKJI5rh<8MRwc}_LG?ty_*Vmq$_(F6wY;K2gr5Krojq3 zewL$@xLwrgBP7NP1prB(53zt{Q=Q@CvaP-{qm#eHJ$r^iJUaVcH)Hq*Cyw`#38&^y zc)70(SV@wumIG)5wg;Z!U@Jql=0!xI7f0F47nm{+>^@x7dl6P=R-rJj4R@e&VgSke z(XDjcCY`77b;7Mzix_5ar$W7qgG$_^98w>alo{PvwW<%0AH$_Z^LW#Lnlqvihu&@C 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 ZJcGlB!UT^eQjvVPr*2v+087#>FDx)IvSI)L literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/return-all.avif b/apps/docs/public/images/n8n/return-all.avif new file mode 100644 index 0000000000000000000000000000000000000000..8d397251bd3d45864a76d746b6779a44a11baafb GIT binary patch literal 24294 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 tiFo>76qfL(g)+<2L{R literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/searchable-dropdown.avif b/apps/docs/public/images/n8n/searchable-dropdown.avif new file mode 100644 index 0000000000000000000000000000000000000000..56d9343b0e9ec83185776756934a8c4e5a66b77b GIT binary patch literal 31636 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 MWcW&NRBySzm=*ycO8@`> literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/trigger-add.avif b/apps/docs/public/images/n8n/trigger-add.avif new file mode 100644 index 0000000000000000000000000000000000000000..bfdf5f4f86c1418a9d9602061b41b52994b8ce4f GIT binary patch literal 30521 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/trigger-node.avif b/apps/docs/public/images/n8n/trigger-node.avif new file mode 100644 index 0000000000000000000000000000000000000000..15bd11c4618db2532fcc485e9ca89c4c704e73b3 GIT binary patch literal 25627 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�JC3M|`I{D@s^ih9 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�zfL>ej}mL+(cQu`!GjaYpAy&n+M}#p z+R}xU(9(mHl>@4xC9OxTYwcr_x@;CaNsO5P|5-!w5LT#gGo7u|9-YOZwe&W8762gm zi{V>4fZSsP4YRuYQt22hytFUruo}%c(S0ih4jX93$2}^}eQTiYvi?4%)yLxsV?b5) zyf)KST0NCyM&advVU(f_@cp~547g*NE_-o-ptmB_YZGQZ=LZQ9P^CaV#~6ml2a&97 zqMH&g@tZ5Hf<20ug1URiwC(6TjrOX}QBd<)O3HL}RLnH8)#Uw>&Lb~%jRaxH{sPmy zUZfbD0(SFZscr_YqTBwIdU5tjPk%)PEhP38O1-1jY5P9{<=j2RP1fY=-@J?x;YI#6 zPxdZO>?aDNeK-rj0O!x@0x?l;m6r<^)J*BStQ8y7u&dWDfS5bG#9ZAtc})5{LS?F+ zOh)DVR2eU_RG-BL4bSAFVqpc8#dV&pRffPU)BZX*M><77=3S`u%}?24+gYyYG6 zHp0(%>2wI;>ZiJIy%Are@{tRKOOniJn&2}0*M-_qnKozK*Y0Qk+W+DXQ!u91MWEKT zv$_P9sokar(|`!&Zta+AYV3kqIBuy3Whr|%?P4HFsqLvXE&OfMA_O9t0twV@wRka_ zB{rmXhp2+dB&CCZZ>^3O?Tk9ji!29_&mpYLes5qQmuG@<4{nkF67m&7>}j+Ly{v;m zU0jix|44$JKIYdQ<*#GP#$q*Klq6{r3dU|>DxyFgO?EQ_86i{{1&9FNHV;>gtp(9kh#+^z zYrrucL66DtU|QucjnSKYLK3|2DLq7gWuHoU&W*VsObMF2fUW((WZ)kHtG$ept=@1O zX&y_l1Gp^yuPSmk!zYIl^=YiERyoV_?;7R^+9`_o-sRg%+WDcv{ey%b$6cfRRWyxu zim-^*1ll6A4adL{&$Ma&22Dd=2GA%N8XxP*hUu!qE*Sn0z6lyF4IW6=9RYV47b^>V zarcQCf=C>PC+>f_h*FgT|7{QZ^1&I;OO-6Yf8^+UL@+lp5qoE9f))KwWnG1Pd3O@H z_cV@+Pg14&DDu?)>CHZ)2L*6c1+%(@q!OlJ0C64xDVxt?@VaiEa8S7V6VSEZ&m zR26bTAG`?~W$f&@4GF6m6Xw#)IQ5d#TR*)T@qdDKIDu}-MIY70TzlneP0_0%)lfQo zT+98PEEBkVcHdPK{bHJzOH40MLYukgJV;nLhCk(chlx7p43Rj5B1PwPiHf ztcoJW;R_|4Sag?ktz4XWCz2aTOB{%>ge%)je)U|@eL*-G@#O;X8H+4@3YxhHe5r1_ z4g9R?fGqCB%wKA7WD;ZOV1~1iik`us^N75CpDdD$!eZSn*}cU66zPF*@mR4$J|UJr z-SLpUz^rg3u?jn4F~r}_P5-=4M*aR#q;mP^c%{6AYU&nQsZY2>*;~plKak(-GfWXG zmbv$L7_QkxQl--yo}HEiaTY1@n#3V3tSYo?0GGR9cc=IeZXlEukC|Gw>EjC~O>5Rk z2zEKeCL3IYKez1tqO`>p#zi}G*W)ymnompmZ?s_FN=e=KExl4E3tPZ2-nP3lEkWZI zslQ`Wlai{p3){&UdnQplRSjhBj1W?{{bjuj_|DS<#lYrTZUOS?oNp&=p0k((=;-Yi z6h*kMVe`k9yvwVoD%qCP1e{nzMh-v(O9;5l=tYWZ?*Nvdx3K##TgQT_1|jx;p#dV5 z^>qgPcV`ZtA_V1s3*!1p=-ug$d<`)%ZrQ@O>MsGMS_D2rJQ@@a5th^ER0r&wnVsh>=k*C_fqccM5`GjfzIx^UoM^`7dzy7b>UW4(=lQ%Fw{eP~ZP>-XWE?$d5_Y4hO9^=LArOrnZJ>J=pN z@=W+UbkX`XqvH6O%TsUY*`!m4b8OBvKF{9Bh~tjMab|i3%CMz9D7%6zH#XGw*~Mq~ ze{CoOt73WLR%O}{2ATdUcjZ|}q$>&mnoc+3=w zKv-}6U7%wAcvjg&`s<9k@30!aq6x-mLo)3=5`3d{3JphMfh^A^URcQYZESF!Xt843 zqghcQO_Hf~35QTLCB_Rio6Kn}iIIm(gg7HgOmd~y)l4?^UJ29_jrrkPlMw%%TtYsT zcyR>%&@C-b$goq&_Gc9I8DDU3Js*>1*H3HTb@1AZ`@ApFkuTF{)I)P4$v~{|`6MzY z1^}iDzty<6HIW#~MXPZqSY8nrtg+@LB<-hviXJQJO14-Rhy$2w>kBIKmK&F)4LND6 zv9su86@sUQn8Lg~255y4_c(HWUvhP@{r^}I#yf^lSDQXReC&?&m6s~ z)>o`1kcMCBe2lu^j-HMX`|>C%TQGa2IB-fqeEc2veH|(m!Q5Zrqa35xbPrHaPJT#s z8_069-l_pOxM%Pp%_##5xh}6>Uz##J4jgyCC}=H?M%`%7Of5H0dRf7e zBB#kquiPMPbF;?{*>|=GJ@sTaW8f&bCp<1W@Py&U{JVkgg0jpdcJM}46{8pul}oA* z#v&@G4KlN0DyA<2<=Lv1-FzNPV2hc95q&ZG77Gz~#=$?V@3n+xO3ytrsmPcoL$aB9 zk9h~yH^pJGthSl-rJ6l&26TiS#hSID2npnmE$`eoX9#updVn{oi>Ldlg)J_eKmg_e z%SF_=xEU=J%E}0V{H4z!#D3Txv7-{r-_H6&efB1wzq=ILzwB`2uEQ6j3a|2mK+r88 zl(1$t4$0&N=EY?FoSvDeUfxL=kRi>|_x!3YeL35AmBf-2J_+TuXo!D?GV55oJ zmONd@2!j6>nlX%CO4ohaxI5yeORhYihM{dxP!DX3;g>CFS$%y(?#_c4Kdz9p_~ohv z?ca@ecSiRzMB12}yb%xpR`RzLSI(}^M`w+mZUz^fSklWlz~L>QtUdaUh8kw+UoD_j z+&Ay-6_1isF9dQn72?kZFNSscADVF4FP3xa^Yls;vMV)yD8487eTv~eX5m${9I?&@ zAgvRm7I$H*ipwUc-p_2~vCptZuB+%uJFy-~yk_ybVW6R($}$ifOZ8;@CehLn4rgLR z+wdkh_AD&&6b3*`Wop?J2-iq;qJk7D#&9XRVuWV3(gvPzqtKdwI40kC=CFSA5hTgE+YSrT^{%21052=*!!$e~ zdYzBM>QludBNE;(hhgBIMW7@3fuEgAjzol|l5;e{SRp3fX~<`7VzR8WtB&Rooe6p@nbT>~z1fla+;T~R z$JwPr7cYd(>@pi3|2GM8B1J+iuc*X5qH*4C2H>r;V&7*Mn3u@H)8TL!+hhGtCN1?C zr*jl(jT`S4xZ&F3k%q&oO&cP|KV9ad%S@H76E?f+7F0T(&98EQbG(qrPU9^^|7Ohp z-CR*ZXtgZH*_7Hp!&h#|VbVm}boF12ik(yVr0otI7`#cbd_ysQa2e9E@IUkXYb_CmTaY z-vy(mY+~d-F9rQT159YGGXd;?Z2YVKv31U($ym3w^mH3EW}zvv??;hk^f$5^!y^i; zv3dOIe(feyzW0s2s$lg}$jG$guE>U^7LHe@EdrgZRn0LRDFfDFv5MdN_Dw?3<0y8z%B@`(6T_SzxVU$fgF#(Foaumn9hNM@`5ZQKR}E)m zXVt+EY~@=F+4CQ1#cnfao^!ijgOe(%c+xTEMGBk6CuwhZ8(lpWvS3+8WB^uIRs%~@ zt|!;ne2~2I9&dY)+GSD6yN}qcj5DIM0+(DjZA+EmB`+FqSCL$DdS%~~(vOyO#~<7r zZKR1k`pNVGx$7r=F=ncwTSnKXpf@BbHYEx_P$7;gXO|ybv5v8+w{_WDRcPw9PHrJw zhts*wp3xj=MHgg!mBTL9^F2j7g-v8BODVtL=2%h`1O61!QR&$4aidEv-3E*$?07&M zdtpVqFcp4F$=>{gFxjJOZJ;}T)-bPTcW!eUq)>|B7PPR+F?0?q$IAzMFmz;>J69*& zJj_kVWo6*rHQ=MDIoJ5yQgfD{lK=h0S zj=rQ-aJal-9d*`|h|5fU=(>Vu^-*`Rp%tFt=dC>`#PMZn*Ug4wVw%Cygca19EHs(#&xP|_b^WRTGM?B$Ux?WSsMpgl>(z5_Z}|t z2%#)2L8Zbv@9G!tOA&9pClayuWLSinD_Dr5OjHNOChtdfN?3+wVd|>u zQp8YslGCBPo3b!c{7AS$#)L2$D zh6WVwRAZ_3oR%F2?hE$>7R>6l+OLcp@Sst6MIRYGJs?Q1zH6lD2UQ>B8O z8XsWuT1<#GHZ+KG;i276G3bnVVQA&gpS-1YepJiKW#_b;4aXb3PJ-*ov(Ot|Lc zj}JhX?gru|evAB7odK9V!9 zEk#1*i#bL5ns&XIgn-e`EIEf!ro5N+8v62SP9 zggdf12}kepSs@%R4MjiJ7^)OUstx46YBX$!Sff2bH53f&*n60eivi}Db2B|om;Vkmd^2K||HhsnqZz(Mzz`Kf+Hk{P%cXeVFJJz&|ARYg52muiffPw<3&CT5ymS?>tE1M;n2WX32{5 zeEl$?poS@iDhBfCKCx_%-Q)3={rp=P(WCc#)~N#t$e+mjkre5iYm;1L{MkB@OWx{G zEzFOz{Dsa5))%XJY>g>Wfep7x4l(YRmFuL-;^dN2Lb1 z_46D@%I8q;-f;m`YN8T=2Jj*w9W5#A-qSy24{w6rPfL6I|04j+oO)e6R27@h6VI{1 zswuZeNSi3xH;E3M(T`pbsqyIp z%2@ijl!Jf#=?q*xMqA>0MVm$8wU;fhO)<^8u4?}9G`j4OSl$X68UWIKC9B1PEGsvM zb!OhA`Vl5da66JCL$=xN3F*1IUfTqd5qOY_8zDbOGtIeOvi=qt*6{jE&<2N z=R6lL0jz(mHIg7-^V?Z1U@AGp@iFqR87-|x5XB2FSx2WBhZ_1o24NIK8!DEB;bo$n z-UV#p+Fg-i=tEr2HYV3{f#WX{lW{DqGkn);OpIxvcIm=E`Lv2!q{^(mNCr<#8_MFw z&zLX@6%pWZ?)p6zOhA_+L95Kkz_Hk~fefv|x3KlQ1PddRdp+L@b{}tcxetDGzMo~O zcU<{@8yfxh$VTnQ`vd3!Nt%Ua5qbc|EYHTJw(0CdyqeeYeA|lI$cJTc5Iq<>GIh`` zabhe*g*xHdhbIdTgis*+zk&?karQRB=d^^V79Mw0mWv{4N7z>vqiCD75Fi-@9i}#rQy&HlFOk;e!uhIO`K-+p( z8J%?*Ibp9bg~&FaAr2|KA@n`4lv zEYK^A^AZIw$&L43qLaOH|bE?>f_8je3r znDVglzRsLk_1(FG87hiUvG*S|ekB%}9{0VU-*EgL2_UE<;%Byd| zvAne*z+rx)ObDJ+PdN(ZLPgcC&O6{Yg<~jrhr`Wmbw@@M$=UP0g6n4l296jTcoLH> zCj*`R_>hU4+@?Q1&Vvtu&4`{;S-yv-UoxEK&^+$oN+}FNuSo}jKS4t0tLtp{&YKuM zD^ygeA`+8ATQQljS0`zA`d&<}UJsVwGPKC?;r~Y!@G`o~q(=5vdkWq{fzoR9IMzlx z8!=WJ2O`{-=flsM^S!c_4atRpL0_W+iSI{aLJW;5GkDqh2~IAD2@;hH$rpr+6aQd? z)*onuH_0X5t!q(6x)jLE;h6tn-5yHhKc4-;b3KrlzM#bso0PJPO`j&f9QL1S?~@LP zXOewH7}6ugSNu?~w>TPIx>7j@rroFvlP5v#~@PDl;;sIbfo>MY?is@Z3C8)Q7ydo}4WW z1`6upvM+ylnqP~pD|0E*K1|u!=XiV(BlXg_*e4QlR}d@XT;P}rYr4^l!Kq=#nII7R z9|T>kDty=NiWcjNuQG~T0(K=X*8U+mi`9g)KDbBrdv{lEm6&uPU$Zu)b#ENU=a+Yp zNTn7Dho-A-K4{!C`snI=qbqlZgoU{@K9#>oMBb&|hYSuY)k(kSdqhMelZ*K4N*t$X z@zjcYwZW71%`-k(gKyWXP$NN!qFJ6`jVf0u_0JME{lzd8u%dw}8pdUqrjH-bt7y^B zLWd8FZsU1!7*#csvkEQY-Kz7nX*>XFaW?;rxtRIZg;6R2&F?#A$4UQ2Hih!LRpv}8 zV*RN3e_^x78rO12{U}a1!@(18e>_osk5zvGNLC1y@K9>E%FM+!+`{s?zQ6^T6G`0$cn7a9vPtJ_< zv|(B!i%b+#+$v=by=!KB0U6vkC)$Sfm~^L-c7@ERjt9=I5>e-A z6GUfWg}^P&DPVJYR?z-P#G&^8;}9E`kN$)||Ev^jS9G~gKW^Mleo^0qx=L$A(Sf}+ zwe7%^ER2FH6k~U5w4_tTxP0Hw@Huv4AczcGk^q%3|}+&E&AkqhNh`~ zoHTk^hLsD-?THiw$1*NUEsl>!I>x2aU0FU@di9I^;hRO_pWnoFL3vwE)i7uSp*xlZ z?s2eC%ds%3@ToMiA=7XSAJbw8pXd^7TTdE!zYkz8iff3Aq{@>O_%wHiA{n$V2n7t{ zkA~&7GiFR-+Y@2>INYghNg{BHj7k@-gWy97nbMR7>8RZL=ksZim3L((yoN2gZY*o< za*)}(lEZWfATt@s)uG*Nb7S4*;>~`h2rC3?Qsf$x%!q{ zobqHjC!T@7jSaM#+NL9(er>cK3{-Yuq?Jm9K8-;l1A~u3A>Uk{I#0=R z+PFN*iX&vm^lrGZ1felP^41P&0LY3c(eoBPyzr5N}1KwA&i{vQ7q>LRTv=!;A zz2G5L&%|FEL;y+TXR?UZop`GzzpD^{>AuJ3e0{7e<^iV0mIcKbKYM&FKPFLdqsdSk zb_pRW_Btm;Iop__qi6u@UM8}OmNzVqDJ5gVD%GOJJom@d9a*zw-ny*WHXYMzW(B>g z?vJqXEy_dCnF)*L*@T>=;5wir$1$P+Ygi1-FkT%NG{n>wF6yYA5N{!Z!j~{Vg`Teo z1g6At4;!|t-zD@{nu4m8ox|_*t1rheow5o_rUGo$QsB(EBK3P;@hN+<1*{pF8|n(V z2V#~k?#+8|&v{Jon#^SFL4kS?ShTYGL*STRutq}TBNx31bs`F@Q;2!vH`-0@ak}hR z=Hqu8jU<9ft$J7dx=&lK%QU4lCcIIz=1VZ>ZJ38i04)VeDT*Yr!6_h?bz(Yc z`P85vux17|j6Ak9yr%-+Z?MD`#LRo*PZgka>w#=~-CxwL^+sVEe#1360f}c_7+o#{ zHl7?=C^I)Hq-*>C#=}$7Ttd3N6J^?=;xj8yz-IZrAZfbojVjNLHpOC|t@#~WP}rO* zx?W+23<7E9RB@@R#0Dkxe~+RyZ3)U1aPwA@x#$egfAIN~cgHBLcPqyv$uY*S&&d5r>+7(QtZxZq-97-PFlxp0YV_$qF_Bf!9h^UHfxSyni96d|a5Ge5V z3i5o4f~fVT%Jh{S#_q%H^ZV}(1FVYB71?3^l?K+$y9^52>Cg=Nv)TBUIs1(0H1p%K zxSS)sx^MTpyljjNi||8)V-vQeJugY0*5R8s>zNx5f`DNCk? zOqSB=&9O#FXV|^(q!Em3EP)JF;NZ2WgOe%YbzurXwR_%DdE9PQHMY#ZJrDAi6^rZ9XA<=@f#H<*6`016g|5_ zHljtsB8q*fVMLETCLi#{G_gZ3fh=X@yRA!W<*6j`<|d_2rN_E50IO*+wsVm=h_a`c zHtf?0&|J^Q!Yb1^BFXs0-m>E{P}@Plt`xVAxSrD}j^*HxsnQ{*Z?ueKQ>K;5GvW8} zlqcNvQKBKgH?JKD8~n^p%l1s-7nA!dSrCLZNqR}Iu6Wgr+}sceFLPB|m15yGRW)g~ zriT6*0|97x#e$3Q#O30a%}%3@rRn>~Y0Zvx^u zxus~8%bR&H?0=6R*IH`W6DM^oanqg2O36-Ch%WrJLNl&N~y!QNIe<@=VD7LAr4D98$=sHA$8SfJ9#!PZR5H)iL8 z%MDC%q)TLDytfaEXo{pQH8qt($Q+6diih=x%_SB&E~MN`wcf6&lj_s=Dmy7HM@AI%PANT$!k#Ol_Cc)0ZztHkm zJ&m$iYQ(KXY`(?FL_>YzCEla9IWYUs-FzZW&mycPlElqx;!pdq+(1R*RYbotyZ(2Q zLpTD)?<}8F!3NjW5IA`ARr5&xcd@Bg2xUpJW#i*fUc5X>DlE9kt_bI~s>Bq%jt$8U zBfN3NXYOGg1$5EHEpE@UW{JXf9N;BnKbBVefkZNtmPp`;_6!hK#?V^17z8iHcbLi& zEqZT8)>q}S1kFB}5SyBQtFE(~vj+F+2CyrGHu5>Yw8hHbV^1K~`sqCJoNC%*G}yIZ zXcoOsZa|jkBv*?vq}|`9x3JUK(bC;3b%vY0VyCNH?6y3+6gMlzu_ zkjlpNz(`#z_EwUl_I9KjYAC_-!64XftZ>KyIi zJ}u2#ax@y&#UGuAVmk~DcC&-XXwVuZ!2NntWsP6D60B>UX{P|q>efHt?Q1_-d46>$ z{4d9y6YJmXq8|dm7;AU82Q}72F1N9%()RJdG$V>uA0azbm4t8KTP+!|F9@0e;b51P zC8M`m6LkkrmAAg$-WAz5e@?!+{82mG?pvW2j5y*yHqUnrJ!0yq7@|6>805!O)V-C8 zZ#>hnx47;oj8*9K&)2s}A;jOn4IhRJNC6bfn?=2gBkGR8ZA|ig9vPo~Ecc@dH{fp{ zGJl+(GaEg$d|DNS^vaJ~_9Ac-JA!Zr&^nf6aPN;)uuh4+*ksW6H%{nLY?pI8ld%O{ zmdsSb`ky3Hxxu-6L3uusP#+&10>@|YF zdB$vO=yJ-fvRf-);G-07HgS=3i6d=*H{9b6za zpjZS@J`;TUrOU2)2qP6YIdoS)Bo_=HP#O~>&yVS_r{97^bfA4L_8m{+Ei%~5sQ!Ha z1s7^~7nv)d2cSx%_@_y1wTvLeR~qtgGS`+a#EX}b?sYFr?wY~nh&PdDjgSNrmm;j( zT-IQCr(t-4lX`OEvUM@Q_vp6b(6~0%75w&#Cr#~=9KCaq`G_T^YN?35K_J%kR9Hin zMN!NuVWd&~ZS-b=_?n-GYIA`pdQ&YotY5~_ZlUXmp1cvn)tw#{>vHhwD}3UL!-*$S zq{LyEXln2e2(;VFtE*jx3AIl~+f7kSda`c1IFtawKg=|n8EZceR(#R zUK$-1;-hdTQPrp2O;9sE_yo@F^rPc0a_5aofyKZ?sfk@z15^c+4m(S;0{);T7Fs`w zH*^Enh~={<0#~ROLEF=&qZ1kTe3m63?Z1&%_SvEn%Ovsmw;A#m-PH(Iv` zH<1eLP`3aFh=ve~8B?U8tU62ILt3}YjErXCxO-y_~c)t8*abU#y zLEX+=DQ`8oC2#8aX(cTdGD8T9&uCP|s;l-}FvF|rH7P<@W+6AVsf;SXJ*p#qEvrw-gk5sz!ij?@)~ko!d4Fd*Q50rM zdLi*YOl;{vMk~>6vkA16@oNNJKBEU~yv^uKo;&DH#iFWYmf8Mhe_*Q+%#`*^Q!mEk zxMC+73wc7C-tA0&qYP8Cdgi24IXHCBLwch@)hq(mP&(rEt zXX;_K3iqU+DbL4%Qj|y18uUx%_rcb>vJ@i5;^6i{@p-+Y-=0cbI>5^tJcOu}hod(e zb;7Mj?PGE=8L+Da>JL$7l*KPjiM8wEqILZQ{8rkUg%B!3$h0D(A)&68zGS#`Vl#Up zchM*IL?Cvu+3BhCN0OQ)o(5S3@Bn9SgOLkbG3~dWE}-xG_5Y z27)~&Kb864kd^B+BpRs$QzR}&#)!=s3+#p8ae5U~lMLOn=?PiEb&^uqET_7F(ei`T z84wz**@bwt+@3D=uSx|MB`rEzlXj<&SURh!h3pco08(ECukg^SL7b<6ZM^;l%exvK zjyLZ4ot=cnzLDk2I^spV48=j*=;KpFK6z-C;p(x5uQugkU!(e<rT^0`95bxK- zS7szH=VV6T7&4AOj;BB2-27(XgE-Cx2(}l2<*kh6#QyY4qj+?|d?ewHqK3~&3H~_M z|3!6t$E6*yR_0Oa`8KQU;o94J*8c_KS@0ZGrl8_|UbTkH(*6-{p(! zr~%K1D8~X>PoL*S>HMEtITyQ-;gMLik)qFFCrf%{nsQvO9}j0+cezHQmrO}{dm4Ly zi;Id;X zG?eP~A$_OQmsXqb0(m|8~|S zM6G*zzHF5wV=HxUlfXyLRd^m#SGOnC@s|PLhDDn4J)&i%;aYZlphvYN_#O6_ z%N82L;o&p86JYe3jSO6BP${OUQcDV$od%qYiVVc4!Ua)0R{F>!Sv)L~cEsHXTx*?( zuNmf^b2(|^@x^W&j}ro<2mT4jzrnn~cEXo!bU+~0QSX*-f&}L(MFwK;h=;ZMC!xJ22bJmpp2=V%ymxMozmHjJY6<`9!Ye9M5so$@!(5yG4`y4T&{h4fD@pCI9NDqLP z|9w?HDH6ib%cGRAs@nutvkwkC?t%fRVcp?=h7eu}OifD*0|vg5Z!~(l8hezZu))BT0LciA)^+5bIG1mVW`F-|)q|rbXJSW7{F(h~%GH_3fk-fxz@1+Jn%I__$q>{V_qkZ}a`m|LR&GCYP z2*J`&DcI|c75iXAQ(+&lr)QIP_Yqa9<=FKmp1tP?1?sl{>ipX<^VGdHgREn4hrx>n zgWEkpSYv9f{EzRa0B)x+tme#QsTUQ) zWlm=^WZYpgD*uG56ws|j?fv+_9eU)b)5FqJ7)iz&1zLl-}5yyR+;w5bI#bw##j(vz~r#>8v^~SfP;_ z2s0XT>zWmd0j`+dkGR=YxL-^{KzFdAV=+M9rXhAQndfb)QT%}1Q3p4fwO>J*Ocgtq zMP?o+Spfgufkla_`;eYpyzl5$Y!hP>6q-G`IIC7f($KdF(dadvZ=j{RkG#T7&`V)_ zJn0)+!bin#%F%H1*cW5=_yALT%NCt>EaD?kkriM-_n2KJNyBd5B`q`&5f-c|0en!XY?f)4gE$of#{&5%sS4N=#1epH>pjbHBoBT%r z06_S6K>k;-w{W-kj{pn-0r8LhfBrcCf&OLjKO5kGEF1Z0t?U{<{cr z8Ce+Fb2)i9Ih)uxasBhLu(mL8^x!hEwm1Lpe&Jf!+x%Df7y2)I-~b?C03eWHAkff% z0G5TL$^X*)ce;PU*8kn0e@SlL+ZY=-BLP4`K7%Jz)^r+1%_2}0T4v-XmU>3 zI z>;w8h&K5AEw>1)^ z*x#O7uftU&x$?G=qbQ2G|Ghy7^BC*@OR^^>-A1mj$Gqh_2j1Un*Y#r7efm_}VN>oxG)!!)-np{i0TrU92ZF$9*+8xE-&zu59-^x9@C`!4m7A z@FA9^HmhlR+AR4ugc~kj1bnhvz01F{by|&927pa$bWz%JgUEbLj zi;L#MA=;}rb((&p!xh`qB?Z9+v9U_qpH@lCdAVm`#?YCkTgU)ulPWX4`-_uVUgYRz z!XBW3DJj##=Gr6((rHeis_F@UtjSaUu3*4eYhuSuX-ve9am=n{8^XvIX7&j-N2$mVy(2+M6}{i| z87aj(`DMnoR3?c=SE&`hF6e$AwZCPw%N+Rt*xat=AvMdhTUDsw-Chsg2(W!oWVF)% zJ*%7BNWV}i0;@lGG_t+#6QV+ENC${*fYA8w2tKm{(s0O3^*yet9rGsu{?_VX7)lkV zIJmVKAM7uvMqAnRU*6<7`0?qKjRK0;$o?(u5F#Dp`$1hy^5<#e@C^adeX&EVSugMh z1d48k+Mjt0OGTyWs8|5w)z^Y`)qUAZW_|M8(6M@)>XfjY0zL{=>B5B@yh_+YqAT)NWC6)7v(IoJ)!PTX$~ndpFLAss6^nVYVv`NA~|0>j00%}gHdM}x_bM?&n` z87*rCOnrmh`KrW~mJ0qv@jfyVGvx;i*6yX@bedu9jXkhpzHC{DzYhbrh8b4ThyqXX z^33gIm&|q-;`51RxV}$%J>$}dg05u zH&pt+$FUvZP$bUcG$(fQCsEx1ce?=3o#xb6^$d#4*rkwU6Q@OLY+5^GvR6Lay3LUJ zk4qGAKxe-Tbe2kzkEd%`M~!93cBOk9ZGQHul69S4uGrxit=MD%H)>(aTOvl0jDOYF zDK-)pMMyGR%O5Rdnaa7P=f=gX^9_qF^-QzpYCkz!ke(hEKc)ClA)Ez~$@Y;DlNdYH z0n2`E06*rPP852?%~$rJ6;*7FXq`4VWCo=wJtGb|yzj?SBC|0uECsF*f2G)r#c6GO zGXi+8={C=u)Cieo?=B0a>J3q2@e|(OlUHO<>rbYJ8}wnaAfpcq z)Z7*@-ZdOzSCw>N754d!L|^5d88Q-YvdM7Ye6p)KPZU$Spo=gtYD>+fw`9v5 zgn}Iu3x|TQO!(qCLSZZ%w-BK2EmKm0gPcZ~@qG{jYYDb4aIHq-kNSw%WZlOJaO)ll z>GC42*?qefign~wi?>Ad;p1|RAIaghL#+L^r>&OMr9b|bTGQGcnel7pV|8PRWC}<7 z@0*c8BkX6O<`G5o$^VOs>Es{5Pb_@ zTu7hsjFu`$(MydR<_0uAp(mc$7%FQd$jIAE=hIG((yIo~;rx<&iiZ+0l*A1I@o7>RZY!&>F!FCRnT6hC}JK}R4AJ&+jRR`n2 zXjd!!vb#D~TRe^hh+)*16l;E=ww>(NCBksQK9PE=RJ0Ug4Pu-lO325`p5NF7jW>_- zl;Xb|P}d!By9=ruN59F=54jwG)CMsz7$A66wYt+ZeLFWr)p9Hle$*+OyVZgqRYvYodF!n1+GlVQ1?a8&Dr{`jb zpM4PBw-O~q$0Om^sznqMo&|q$=PGH#uIz`y%wg2nJT7B*R|qCO}K$x3U}{K~=XoVr7R{f~{bh z?81g?0flSXzCEPpd+NMA=y)N&_&v*GWEV-tfS~GmjMmC)q5{ChnS%V71gsN3;0cpH zN~pH5Ro3%2am-_u;sT6tEb4^TEta1bBu$-3#K56>fZu_U0--cXeyr-#6i3YT06yo; z9$nA?g&Vw8Lx0uNMovqxnbY|;?vAsiP;yoPu^%G|GI0@D;ncFQxcq_aFmN(l#6|~V zm;{;}w)Fg(%(9qz=ab+mTTo*B)z{s2krtE?<=@jqr`AtYe@$2$OO>PhLMl0NDBk`a zu;}}Phc!k%(e}K_znrqG7Eq>!B}=gj)dZhtDeEA&U`!4RU01zB&>Q7Ob%Gidyz*hx z4j9;Ir$;mq;E3A6-&LFn7|#UUL*o@l-R2pJa~ARw-r~0|tdD36U{}8l26QdF^I~bN z7v6iC%-EPC)7{cNt5YZE$COV=Jo=#OTECUqg*j>e0q(19 zBl!~BeU71Fbw~IhLJ2PfZbB)#wV2{bb+Bcc@%)QiUjq0xXnNmvZ9JqAd;UQ*QguQr z^|L=o+(qnSVi`-hI=*>+xj~-;1cYW(mVD1HB(%zhNLMOPwUm^?Mw@Kec{6g)$Rz9B zA{H*ke$-(+8R5(8gOWti-bi0)FDTvdX@LXCq9?bcPZJ*FKKlgPks%zoA>XPOlOrQ59r99vAcSsVX?vNLx^i4B+ZN3GneivueGnU46@X3!g>30p7sQEqk}*Ik$ILA)|5-Ug(vShb?Ulv;l;Y zt+F+Mp;KgBH=Ha}XP`M>Kx$sPNEPoFL2L0EOebfYF!v!M8T0R6Hk<)h?nJ95b=rw; zi)oV=DEIRnJmni~G#%usc7?scz9wBE|BLh79=T{%=;AfCH5w)=a=a;-0}B>ot4^-+ zv|Bw^n{sooWw{$&oK68b&VV!6qnpmzlU^Tjl2FN%>ON!PBXE9iPPPALaq4p9`jWUx zFw~d+kg-?ndsE}DGIf-rX`Ut2&39D782$*o{M{G+&N+V)9~pTw(G``=;im8!ZUEwh zq^3!USmLu2l4dBs3^(w|7;3A#Il9*ZtGC`FSRQ@A!!&h?g}v0{Q3re2KJ%#-ksQ;j zpSlebQM0xos+?Z}C?|?IxLmxe5T81uAKB&Um#2v2k~wE&(^z{;DTdTmy+HgB0WiT8 z-Y;DC!wV;E5OCOPx1=6d4oideS*A12 z^AXnW5*h)got_@SEjE~(ZR6lOK|5G&obeYBUyq>dBeWm)QnaWc|M?|4yYImx*-t#= ztc=bLm0kYtY!;+M(*EGsA(&rb5x!V%JC3fG?&m~sg};I!N@C*>Z1Zh6@x=_d;4Xze`Z7-6E-nnOMIy6)Q~v?5L|f>2{dO6V$y~AXODFV-;Zb z3*4y@xctf7P+hig9`J0>b79*`{$0I7T*My0M-qlaCD~ds+_h%zN2!Z+4l4bh&NdQ) z5`HdYm}PA%ZZv(=xWO?s1!T~dAIG}inRwojde@*1_F1SzL6)jZisCJ_hC0R=%zGx0 zlZ^DhI5hmz8@f{tv;@(e3Ziw-zD}c-vl%x&pz(^l*@@KxmRPnX>=LzO@}H}m z-&a$LQA#j$*>DU;`Yh;sPd5k?F_Y%9n~F^zTgZaH!VXOu4b9~6Uy>x^BNi9%-erTY zN;I;>qE{Gz8Z|4NocK{Gpgh;XKzL8Xit&kf-8h85mowxOV%bp>{2WZ+I&xJx5zqL( z|K5nO?=XB37UZI$YOYtmmK7OQT>(#tnn3?>H!S&jG!>gr#WFaz}`zB(2?tmtuM z$y)?Xk|rSV35((Wu(lb(fx-^eAP(P?J?kCbtvo!W3|Z5S^f8r!13p@qG1X{tWAyB* z`eE-Qg6$9m9wPM7vAJd)!Xz}k_S{H}!V`tTxZzpcgRzbpiu{1~cOkMJ3X2t3a}NT+Jq3b(FixZ{ zYo9xDA6%YEiPYJmqp8XQfZrc?Z72&q?oBZaIGmD)XTl-|)V4V9>A3d>EzS}V$M9yT zZ%p4QLqd+rbA1jw(+lO`Ht2y$|r z_WZ10ZVSd^rLd9F?6EDC;o(1G1#zI?)IjsXu~*_sHutrRBC!W1gqaOdZV63>`9N15 zuXt6ECVMZapZ6-rE{93jL>c8%aa3^c?qyvmU91$9^2`#*3dzGU+welj=irM2w9P<2 zOHT%B9FNGxR7$c;JHaun4ncwLf;r6^S6mq z#914UbQqeuSCa=`lncLQF?zrRp>YN0q)wkIR2+AJ+-HJPYVw|YLa!gkMBl$|C{L^R zo{#@`bUxzmOBDLBaqcEv+~B^{RnNMa{q)$Fzlb#K@~*WJf{r_>7Qp+6c^r(B*zA2FbqaqjUnIjEWnV(EX~QMliMql{{8+#RwI~Co zt)DB9rG`*54c)5hc{>#VfR`a4p|>P7*>45=7C+cdHFEov2T1YLpSl@e-We?ciZi># zHABG<1e%CCx5H#btmew&eQksC}A;3!C7yjBljF^l<&{5cU%Q=fKX+h$1QO9dddiUp@$FJ3@f={ru!UeN^JPMK*FbRuVkGJ5W8>7Pq zOgE=wUWz6{)S&rRg5ZCJon+Y|n*@B(OyFcAjtSdqhgKPq8ddj?XvmU@+2LsVf)GTT z?lPIMUR{igKNAo8gvKmgoylhs#CiUU-+kYAz8J zL|uh6Vqo$ofEFh<fdtzun-&Iln;{1wi z8Y{revwsV!1R(H(Bnu-265`9A#>l8wen<+z2CX!4Br`=ela=v^qdi zW->?|18L*opzoLT* z74ew7m(Jde{b4?Yq@*Jf&}FEP4j=b9{&-rFn&PLXW66v@A;ioq_px;WsQjFS8i(e| z^_njFdx4F)oVpe=*3hA;F%)W7zf)nd0J|It*mpj!tXv8!L94JP zXvw5xD7vw=)D%w9v_j^+;82Wc6*uF`3v{Q%Gc459v)pq4N#~DLy%i#nUhdLRDU_D_ zazmXI&p$g)^nI_0NT9_&KTl>N;ZDcvamA5?{;FLG0_CcL8q4`H3$m7WWp z*LIZV(ed((ot#s2d?s(BrPwe z1-zviVD>dEIA&M39D(p>QDV)%A9tTUpjnKBNL%yL#v&_26qb2CCGs-BHHnlyM5J2gBy4uG1G1lnTxQqSNcwcw(lRXdb_!ci$`s+Fkr z{O^^UkfbX-gX4FQ8Szlp!`Yzjzb6zL{2iPMIL4n^MAN$$$<00B#I1sx(^F$3GB;Wi z5R#?&@IGi+t_9i~au+RjUZmKs~L zb&-20H>{si+M?)ACi0?H0=Im{46dqPTTzjli|yT}nO#XlFWlJompggoIQ!M~ClOXz zb2}l0FDYbZP%u~Cx7|(=b97v}cQosbUtgI0#==rw zd5x>wN`pw3-cl59lgZ%nEpgP#NMzs;<2w}9kFiZKo6z{kqb>6Lhie*D=Uru$;7ds_ zNGff7)B^4@!0)<#XjxiV8Sn}mpu^pQll-DCT@E6^_u}nK={yKC12+*8_tF$`I_RJd zRiv+d3t>MVL<{=q#J}}-G4$y=ZJ_0GD4ioj-N*O@qnELoXtv)?NG^hc!f%n9VMp)n zzIe0yQM)=Dg#@CZkuTkwrzK5rv`5rYXVDIvOI5W`IbWS7aYy8;Ib|K-J5QGUGpfft zxk9IY`#hT^{mR7~Tn&y61dqG?8ka%w8jKPu%>{ix)_J7(msJ~p#Mbb@ywSHAPcZhn z1foh5dHLH}P#TNpw9_O4kA;}+pWV_FrN64DT>m&@cg(&H0^U?Y9j_i8S-**yZ?bA*-GT_g2xb<7FE7K9Tae=%1gKJPVLim#T0(IqWKsbebZcyjI0-dF z;?cDG^_9;tqqr3z(^QC$=8%tz)O)-GaBE!9gP_T?RQ`0C;Wf`x=9Q0_&Cb^maeL`F z<59fNm90T~Qswyxqb)=V_}8zq6bnL)w%)<_)k!x@&T@d5 zhFEC2T1ze2env04roJFok?7 zX7@byh?kf80D9$e{30-3`i7Ui=LaCv_ed#SRdf1$E}+M}4c?F&t-_f%{`#u1*yInbbtD z#yR}-YY9Ll?$GmnfW6vua0lp}DNf^^BwLbR2kK7rmL5-lWVyF z+?|$9H$Z<83b4lG%|c+uI8vhzsFphmAkUH;2Dg#msDv!+WomOkr1?wv{@EfASSLSg zgw2>!GUMai%kJar1i=J`ygTOP*lCp_KxGD@&3wTBNfZb4?UzysYC0CW&iX%$EeqPdxvNdW1IYUIDn~=D@|E4OY=QiP$KV2IG%@pca_2dC*z{Fd0W z`4pW*+|s2>5>=*apua3xk{f#5u>Z|-=NrIeSBjUQchh6oYdJ5t#bS_->1jl-^;v=u zUvJ1X1%H`SQzl zLZO*1KSPIE(-FIbf|09%QR`3B5=n}i*RqzQyE>vNNK)2A%iW3;h2C547&w(D1a}@) zct>F&EMK~x!km#WyY&ZMyAl&g)C2_gH=0}Ae7g_NMO zoJdP53xc90bD~BdutF2SR{)2{iC$6AYD5^R29*ex_7Babf9}hko(hTTjl~T)hU&oMQ#fhyoUq0>5$1s17EgFwpUJ3?=Gq zh0};H{L2fFFXo-RbkL-Lk~lFLZopBNSjCYp0r$3E0a9EygXSyB+J-FAy*3+pTwDrh zbfZ+k@;1SOla{*IveZuKMkUnUkd`yy2+Bbky4Z{HrTp?LBPr7n* z2F5x=hz=j*14OPLu9lUP1*F{^XP6j+Vl^9~&ZER&s?^K(;dsF&FMmAb#}0W|aRWNV zq#7QS#H097KzmwXt3+ZhaJgcGe`+))>5FgO@E<1INhr(3sGN*eM*$eSx;%jcr?D>N zbaoQ5#Vch_5QIWufgWT1P~<6pykGpt`EYpy5QkNrT{Z(KLEu{2@#D$38D(VLF2m5_ zIp=;)3}YOvbo9@EIiJeO70xvS@;{B>i;uq&>|RNj!2Raj*!Mx${LPY9D1LH=8ufAW zu&h$5Q?>3N5+1*50NKAF);5`PlLK_n{0S0{NmGw?VxiEuO&-wxfLd+k<%IaEx7S27 ztLXCG^m-#OV}&_Eq--Wx8avZACstkS@KHHgunPy|aLs(axqI24?RJ`sP7xu2x1~Od z>@aSFP7nK)8mKeir`XQGa(^_!DGCIQqjJ3v0KUw9bX3}nfq}3&)d+$!nm^(*g~Rzx za^dPC=U?yjkoP{J8Aif}wZ?1$yR2HmsgMoFh!!)#`~yo%mKLCmTph4uG)Eo>{TRHh0{|u?es$%3-kEpyRD#I)f`mxGKIv4U#o+!v4>-D|GAc=l*`0%rblEHOq zq??$QpF4^@O%yuabMSK}oO6pXde*t^rEKqqbO_U@$>YpjUzu3fvwjhJroG*HdX^j4 zfV-rUU0lx%&unr)TXHkn-=4gFvcK2chG4Xx|EjGjSkhb$g+iZHO4$z5IB20j!^83t zmKgk}#vFocqN{kGYm7}bOmcJxQ#4Z)^UH#nQm`vm=Uil^M8TQ{B#VRbxjpyAAL)9e zk^(0|9jMu5$bOJGn4A$qPEprw-RQ1LKnh;J#VP1e*DuD4heh{~os*oTHgj@K^|Xea?t*Eocb!(^Q+0WH{A_e^qTlFJ)NDv#5l{9T@>G5KqxwxZmk9rJ zJ;ztCiF%UR+oP+do3If;HvfxnbPYFkH77v;P^f5rwX^^MN$!U~e9Pg4rgN9z$Dg3F zf$i;9BA#x;%)VG&Ah9+~xJIlxynU^Oo1#XUCUF%ApFl{`CVxB<=5-_ILVq;rSRJet z+@#91@mR$}@DUJ2ThM5sYk$5nsqG)x*RQ-c<9W(Z#fAb#gP69)RXdqmBVIj!V>B@0 zA6X6YkQ1%!zg^zbKO3t$RwT7qf1Vdi+$NIDS2NvzV1_6R4 zM#8QAM1Q$2SXaOv69gzkV})KvA%1Wjfbt^{2Soi5#@U`=r-g6dnV7AdjFeM!4Er;eF#Z>9ijLp8nDQPl zbUnx*Iw2PK+4W-CA(~>>0HxfCw+g@*g2CC_!%|54FoUk|mxOTT?`}6Yj_bK0`Q02N z5RN{`T@ME(>ef=95NuK}{x?7bz^aF*GqrzRH8~(>)z2X1Bf{T3$*SZq+y_{+Q^?<_ zyV{L8DGQ82fz+hH)|L$)rF>6UBaoUEB7ia#@GerGc)O$W&fN7+KYDJ&r|7usZ5vme zRKDnPH+K~0?C@j z@j(`?M>@lAodtcqsQc{{Iu?+PxkZ{I;(uI%ZCSML0&mGh%o&E#MdKF0BSp1-Ys(pn zJEJx7S}@xR1Pf$s!nx%p7^m6Xrjb?c3a*@mcgdPpABk}n&6Met*F|^upJ>(3g1pX7 z3yP@Y`8~L1 zFQ`wJc*QkhnjCniN6K&!D<5m)~qrA)kk)7BiN=PG_FOZctBw3iO&S9?*oll&W{tV?_7y*kHZPz&K4;REAA}?CX6-_o z?UT{qt%2V0kcOEmP;jaT&kSyi5SZ)7P=8b(0Oag6LFPkaNG<$$Y2BdL%6b}I2@g?+ zSzWz>iw_1(xo;V*Is)^7<(@2*?!Z|VT1xrE>;v;cJN3=%K%WZMWN_5)yCi{oJ^oXE zH6`lB4p8?UO`xsp7&AOHdBDX@D5hgu^v#^`(3NFz$6Ifs!;yRHVHS}O?)#KM&O3w4 z@YpsxnuKUUEh+qm6KF0o{oZoglDPCO$$e|waT1Z=-}OK$?9ABg&Tu27%=_48SU<5R zHUY?=>S@q&{HfhGcc>tc{pr3!Zye^ia5tvGa^Km1404VT$U zm|D05{Wkk|?+da+L9lUnUqIJgG@cCqTL?dFfoKHF9%ooijp zR4sa%w{9WU?Fedb>@?No$ksGLQBcHQ5p8T=3C!@vMTAi8j}~?8EXjL)dmn|_(Qn8c-u(-Oe%f8%ZNODkcoTy_AlIuJXBXH47TZ3Xa4FWbnu)G@ z?-wge5XpwigP}g2S+9x$tPPiY%|0|$_SV$XP^~|NpYbyv5?a`?h4knG7-4M?nRZc?`7}#ymOSi6$Z=Uy*kY!38{2~E9~&{d zcjItMqUJRjS!$Ee9N}+b5gnQusCp6jBIP)e(*a{5)Twf?j*u|TD(!@!oBa|pgPH@%K#JPtvHC$n)PJ8JcS7_q?0Bng)aWAaYeu9^Uhh&K2t;9 zg^iI6yS`&C=hMPkc!_&f)1j()knv*_n@Rs+YtOku$g=h~JHUoTMHA|wv9l+1C~}m> zw$Ms6f)p@OZ8zi|;Jen=&w-gKvH0V@L%uu!YnsLB#c5l6lAb~zw7t>5%KPMKLK>@? z9xN7mebr)fXkE&zdQa}fj|Ttpc|KRpjt&p(n?~Hp_l0!ZqSKisBJxOgaiC!C+tC0k z)lb6pq8=>LvKh~o>sl6o!N9Lx)%ecw=m}5n13OI;b|xb#fe%a&m9e zjlX*Xn$A^khnSc*6Zh6H7SfDg&W|rKD`wCzx4!F^Qh4V5oDOofhI^#T3ha4f*!4vK zvyjUkla&TfrG`#%j~LpDo#5N=+R=*nC_n=q(Etn;Cv}YQD}9(uM)$q9Na zxslZ2BxDXX)@f+er%9zg$dH?{L%8C2``!$1UapLbB6wP*6nrS0!SPCQB&&U_6jgmg zXRVwtE6RLO@hM>hevIRfq)Q4_`MVEo{f15nzUX zAhYvMj<>tMXhxnml);2MolRTkPsDZ0uqM~UF#FuCz;n$;PhaEZ1tgO_zl z@%@m9E^YxBo4OhnIsA*Dfsz{6?e>S%@do0p)yUB@;Z-0sj1?tovUIdx>|WdBXwuRq zWiXW+M_i!5M>UFn_^~*!Rt%%zDx_s!m^vUi+AobfpYNLbrJ-=LN!4p?$9BMG%uTyu zc$%q83g4g?Mj%A>o{`pbx@OK!->sFh<7pdOQsuODAfV7;H)bSCs?{n)&NS#nk_ocQ zDzcIF2{(hzeKIE&c61b#@yjSQL#A4#Zg|hrX0y|7%6$b0hGt%rTRCtVYoVbuIdm@1 z80Oa3pp}j@`C2|Nrh-iP5v737;EmmqIw`={Q;X&tjXuM0WmiN^jzX-H-XAZtR({Un4Nl zRe@C#zzNGj;l`+sewG1~dW zDKzL!IXWklNQ-XX4{KPx#ldZGGpFTv^NPuH^B96*=mwpHWrcE(tLR)2=kAMaX;)Ar zv#HAvZVNe<4DPbHLt*4@!RIIy=gb)fL~e}`-ZJ$1woniF zv4u@PT6-TNkDu{-%w+d7PJeC)CyJzX;f#@&H*RarqyTL{X?G7O^W$ehEQ z*rmAXH1eDY!ee+l#!9#%zpuS7kRY?bRjhTHA}lK+p#M_Ce1h+!dnG>UOv{zZyFHD& zeHAo2R}v3go4M6C{K$~k5d5pG++zJ4zUORf$YH$gH)5>F=<{vU+PP0`Zbnv-gaRBB z0xTf7HItosDQFZ~d2?I66{Q_bpZMs~nZ_FJ^8Wb9q{JS4PefGOta?6qQfL^{*k|`$ zTKg}3M&u$qTb}Ko@Dd_iWxQMEmaQ%a_ytS=PkNDp?Rq&G9ADp+pxa1beMX08<3;(C z@1(mfCLl2@1jB}5b*kZ`zGzrtqh7I|4=K_wqhi;CR(_u1v``gcfT`oR@1DIl3E5#w z?w6bo&JV$)u%e@!r`;w??U=EbQIYiN`0=xY(zvX~V-8O9f= z;^0YIy>^G|!7Cajlwi4AaA%@}aIr#O_1r08UTC~0oY>R5^o+|vyiVsEop|~)s*O@r z54nW|*Ur~XGW6!`#zI!O2$(NU6{*H&P-G473K%##1cs0_oY2yF8dgiS4W@sg_4eM zio0q}7jw!dNIU_;o>!%;Tta9kkqYHEgSBImG^X4ol&#a5-UX#%i4A-*^g(Au##~2T zA><`*O)M-5wb2s)J{8R)tEdhG4L`xqjLs|HlBpA!A6 z{0WL{$+G#xR^zUCKJxelx_=Rnwt*x=TvmX=r019s06S$ol-P`;fQJQo{Q0Dct>igN z?i<8rG97kx$-FJ+q4O=7FGP$$hR^ylLxSZ`)w+J%WC!1<9})wten7 z4zLtO9}c*wo1R236tU(iAO%KQpSlmE#S1GwDAi{p)3&64&fLXs;y%(Yi(7oRmP0N3 zg3xbqy!zZmn4VW|F@{mv{GLVTvo3DSXB8prg{(6rxEHyyO9VOi28DViu9+}u$7XK$ z4U-kf#7+5(H($;Xw;S(miAl(N)6e7XK+4$CRBU4GeHdz01f-LCrGRZG3L1a)h0Vubjg+i5-&B zv79HDEcSoMD5;?4>Zl~&(nmOcn2vqtF`Q71>%gcN%tv5zYGPWd>TA!+OA=9diw$TJ%9vJ_a|!DDM8SnHy|glNFIf0 zKPfGqz~7*ENYAJc@Dk0Hy9)<+=CF|oF;f$@+7*Ew`BY669uRg6Kumk8$er!K(3>~Q zJy-C3E*D;D{$yofv@Ii+4v9z^7YfWPKSr56p2L(t1>ZIl#iJA}aoUm}x0pvc46Iun zi2;z0h?=5|O;F*jLd?CBocT^lEc+vHrB2+w=0!sg_bYDS2!pg0DtbOsqa^BJ4l(n# z1s#<@(K(+k+%IdGGCjT>c=q$p5sUk^>bTspIMa*}y7JmJu~n@MtV5T{3gyg5wel?1 zw8TS^Sqi1cVn#Of`lAR<2Ix1U6n;83`DtAIKS>e_?gWf_MKm7$t9u3PqM*zY|Hc?D zelCWxYx?Ume8#Ft3fQsK_3kqD%E)#RdET%hn3x)!K3b{%l1Rj2e(O% ztK+U4FpS|kim9i#<94%Alc@&09(uiY$TZ6mp>~8E{{0{a1C9w8%aglq=AAw0%}%Eq zuc$}Z{@JYr#?v?GS_aJKChc%O#%$!=NF9c&RbK~?NBixVf0z`J$w-O2OAEYXD)s78 zx~)VaMi-rr_#2L;0Y?JxF-l&&rWT`X(aD~!4ER~78>tTugOU1vxhK6UsR90lXea+u z%~lMkQ^%J-zm*qp@Z`b`5BL4&m+s#uE8CG_+f9=RX_U*Dlov8qbuNP9G> zyy1Xc>c+xSL&`uYn8LCof$(+e!uL+II#jH5uyVN+fgAoES%FsR=J@H8pz>>@KN`s_ za5ffCv0mr#Y(142cy^a2yD|;teH0xpc(RElY(9gluKs;AKIkh9ttRUoZ(;Fl#D)8< zRtfnZ@+UK!dRqJO5LE!VqaT^9ScpEWlQmH@rxi5pTBk)Su*q9Gf9XG1+0q|02 z0ofqx)(KGW@?V~1+`nE3&af6eUi=E?{-D8#;tntlGt!jT@K#)e`d&GeB52|tV^}+$ zB)MhI{3009W3(q@=K@uUCt*IQK7YLP_fBIYZ5vh!%BUgJ@3EY32GZP7VRZ7=Y zV8X+W^j*4PYCf!6b?4y=ahc^NFfD2j$J-;3o9_aasxgVBV(><27vgkZTF4g97AS34 zh>RSx>EKu9Y+nlyg`tb{>V+LUB2_MKyL^K$7mFbRGM2qzDq?5oGo~37Tp*r9#u)Gv zzyf>%ejQLr8nE4100!GmDzDxv-fYRJgHm#>F~3K*JE9}{*!jBko`E{L4@Hw<+w2)G zIUG&X>t6%D%&MYd0%RY|5DDI8qy&A;D{u! zuasK=ZD*i>>;{m;wHO)E!TDgy!(;kFNN=1#aZ$k3_$*UcXc)KB9_K*DN{ zWGWb{0QA!F?|NHuxevEA3vGJemAS^c+}$iQzY{bY_8URZEs;IYIfG--ItgiM)s&*& z>p{VSEg?0#4f}0%fX}h41HiN&?3__$((cCL7NqGIz2!g=l)fERu>=RGnHhWtCSgI4FpMADNws@{0B%6t~%muh$d?Ll*f zQGtoP7bmbkc`9d+G4UoNrX#$l(?$riQja#zQ9jd-h^YB>;t z%4_6o@JFFoHNF%!g6FE4ox$0q06rJe$bB}d?Ex>;6_$^3qB8jKG@Q?*RbsB3c!s!x z7@$6H(Ed_Ae9Oai>^34C(E+HtSZw_UlCz}@8sp&B4G%h1u=os^XsLSGI4Sk*&3uua zdKYJY|ueTpV(@ zIa42>u0(S#igYtA=s7uvUE2jtf}sQfz&7HhCiD{3)`7;3EMn$XqLh z-&_wDxw-QX=#=?vHzG#b&Z*yY=)$*q5b>X3vCSB`Fu~ypGqMhyrCBBFp0y?ww)MXB| z%8bx`rlx*D-y!D)k9r*tsMV=n5r$C=Aw&M*3DyyB2TsLWh_>uWh$PfQS6E_31dIeN z!(yiv)o;tleOk!)&`v5-YFdz!b=m;V`9Py-scB1ufgoo^SSbh5frjA~yg~WXiKG`2 zC4+Bo2|TSx>KBdSF$!5=;r|HSszFnE-0d!Lf|aWR0qHZy-HvJ?O$QH}eMd$dnqNkX z9#?!`Y>B6N&DVXDk_{uuqd278?)I^f?${!jXWFp=c%pAFG4$QE8j{U8NxoBH>$6Aj z5~$VYPO7AMDnU$BLhaF|Tl$H7z)us2E6AxQibb#pKxsn42cwr}aeb(qLu`QaX3(}U z&9-}BKgyEEx*hpRgPZ4lMR=9zSE&A20;S_C;o%U{?^F$c}Gs-TPP3~u^ z6Ujv8uk8@x;564t`&mIvPq#BFSpIliQt3;U1NzULRLGAZ4ITuk|r+2v!f(}UmBAxu}j{_RK5syWV$9v zuB*w5{#xDeR+20PkM&;c0}(A&F>z{&REdAm2MO)y@9z@ZX6Vga@H%>A237sI>+TyH z)qkf}d2+N+OB)fhS%s$n&XU>AhyfkkXCRwrp8fGE_zMh-iClflQjAZvFx^F-;lWM* zl2AwL1qkdhK~jwJI};(?%Hfwzj{Rpe6FN?-@tUcZS-?^t>_0+BGJJ6`N@JdTqWhln z=RIhUMmsy#gK@K_#MRnuEQuWtu?adyp&@4GXpdsGmq%Kh9m3AH(r>aQBnFa`UgoqX?5 z5HY?&QPwL~2CE>>WiWl73Ay;RZG8xE`kS|mtz_v){)cC;>zNl&&N)=oU)sD}JVZ<% z$TYQWTdysF$R$H0vldnna@DE(!Zi>U|XZ*-F`VT#`C7+zdZQD?^yMUCWnA&8FEdA}iLElk99dEVx z1WfoOLH_E)WoHT!FPs%DJohQ(F}{fu=jY7f%h~nT&j3smlVS@5YzP(|p9ojrtgf79 z389s(A%tJQ8Q#Ud<#ZEiJjiT$mLx_5mLgy-#o=mBzIKBVH328qD)}6CH$VHnut^0~2_zsk5 z?}V#1sd90^^b-m9y{5(gAiH6jmpR$g8jt)eym7SF1)wt-4Yk~>bUeEFy}xl5aJpj( zq&+yl^6Cw6`tVB3@Z8&f_jq~C1c&2cT<*uCVrChByVi4oa)G(A$v8oyZOE&nu|O#} zQieSu;WB?k9CK@}cQ82pCgIAb!MREixv>6Ux2 zcT!t*Ml8zL1MT}Uv%^`i<4UM3{)Z+=F7%Z#4*_zmbAC5N%PeAh`;lurh_U4noLoG+ z2pG1KDfE(u2a*z4sW735ni@=9@i99ttWNK|!@qG0Wx%6zjYpY6JV!6|D%Izu&WY|F zO0~~DJs#%J@)nM3?ve(L1=vOMxM&MbMcAS8d6u!EK>gUnfgAOdQpF4=v>1H7%(WP1 ze&eds<0J~^$G2ta#hkoD*hM6AF|_pFYYLq$`_1P1@%|4+u(aFeIUDm$-}iA6z@~E~ z^M)Bg)(balh$#IH*mCrdk!HM_pmrxw`gT|wmWa@E`>n%cy{&|7=H+G%IoRtr|cbJdncyq9mN-l{T05JHH!0KPgcB9mA;VnHsuy ziY9@9lwvVTf|u(5W1MDBq;7Vd(dJqD39w^Y0}R1hTu)JbAn2fw@V9rlA{E&=yY|3V z_5hb>JYlXE75`U+Hk-l-^lC9r!)eps0uY=gaw{n4CC#`-q)acw=m)`w>5Iu(ACM@I zFjZ_tM}s_w(lL+tu=l2A_R?8k#TwvEwb~cDR@Zu_fFn&8Wi;;6Vlan}g3qYnd67Km zzTVA0H;v+G(-RNTxd~%2QNR<$>kj`~$BPRFceK<=tkU(J@RfRG5NXiOyMyroAD$$s zJCVtj^}lKg`{&y@VDd5sm}n0A?Iwu&+4R5HYmQiu^ekX3@ZFw`<05QkQNatg%#o~M zpYgLYuhKh8{#q15PlK z$0*(I5L8A<;O=cVz&e*!eU%%)dB&Qu$TmkTE2&)XHD6@{i1*60TO6g9556TQ8)zU=86Ox)<0O@B{X^Q8OfuQE2DP&);?0{rf z*u_#WxIuGbHc-_PzOE({dN2{w6FU7M(gwbwz#HN@)l|ms2!CA}bVruE1eRj)#2)L8 z(0_E%(YfG$JxvV{7|S1DsGBP1Py1v(E?^=ZXW{kz$v{PbI|_KPxFP%B#@B53J7X|7 zr8jba^ru7$>GG8=hco&7+8o|T82#hgMCCwgJjv@g08H!`pC3=#sua3bX=>2J>14cNc|Xc3?qRKsCrW-1o|jk|!w;nzkY1}bg6T_DS^vF=sH6I;f+&vzwYeGv*)J33E#)my7TK@hoR3|582e$zU1!z9us zyZDScdc-;dK2_e0`MmHgUJ6LseX$DNDA&&do!+U;Acm%Gqm4Cxt|nDC+aTD$ViSrw70jQ! z=rJ?4QTKBopMBid7zQU32D2yEFryEIkB|L|A*lfXUA2sq|3_ft!cc|0byv74QVd-d zjRL#hSJ8tjg>}12x^dTUZ$;3geVlP|){rDnyVLU_70Ij730}Ppo?^i^`2Zg0OAk|+ zrI2wVhZ?3wcF}Hc(yJ$YJIz(Qy#^Ec-j-yuMBh5oF|D*c+I&%8tsck~D4_4`U5J>Q z-rtn!g1F~QwbF%@cAR`JsOrjN2MWgTxj#$F@OIt9@DlcQ^MYIz3^f3?OLfOqrI~sK z4E=>spknV^rDSH)fIy3mPaMEBLbjTgj{2<}ifXwJV~a@>E!NI-VTb zsM#qv0E&#}n7*ahgrjM6#4^e8_m5lj`#vRqQ?DC3Pz$P~#-)_Dcw_go*BLuv`n7M~ zNQ=yukpS3lp@c3)VOyc&3gi@WJLTJQCqH=)bfkA1M$hpFWJZksF+WOw4E9f8dgU#s zQ2|AQfa)J)&@hW?{7=s+(!`wO2OrO{N$?kQW7!9+HIuLQY}~L>!;-^d)s4vb5(A9LTWH2m1OvI{6#vj$ajhP7}zZt&CFBsgXbdGAP=VJRk9R^-lGian?xPeWbvkr5;&R(wrS%I8 zsW`m-?{Iwo;U1qtY=$4zwwCu6^|cbYD8U1<;O>9eh$n#f*Mj)>#&V}#2K??u&3yI{Y=Fu`heerDdEo*rO)}{!rn?pqE1#u-wr(bOOvPQmK_Ji7l*~uz}LvD&&IMK ze?nxY~-H`BvI>}JalS!G&@`~-2rn<#aVoLsV?MfY*bfU)rGJqz**oZfNoO(s&4JTN^ z#7N*Fd;ZOCV$i4KGyr#Wx}DyYTMYO%N3V5bDB5%HNA%p|4Nyu> zv}l^3KOqu7y=9CI1X)zgsw&-p=uz2Vy)h3l?(FDrA-RL4gy7+PXF3Hp41k_|inVlQ z{1G(u+-C4ouzPybEs>nsCE}dm3byy^g zL=@K7_(-{J=4Lz~rnQ3VBN}-9t_2TSS3)biKx!rG$*My)r9yx+#I8onFtlY^uWF>^ za8nr3q1rdK?$Dgi#+oAl&Jj>zF9R0{K)*2LU*cK6aTG#G3##}QhDr%|t9(9BXvjsk zjV@e%Ql_QE;zi&BDtw{E=_5a44Nfq;oXI{*!thQh4)Aqu(N3c0R{hF`WC=`d?U6t| z8sUX9HoHD;3&e>=xPL~1R>)|8r?0kSS~49Qt<>k>^ur# zn;ldE8|~i#NZI#*q^t8(@Z@9Z)RNNqHrFo+ANfV5PaFGi5uyg$6I!TfGY4F^62fqs z;{jOtI~1*Zl(@tgmX&B4ERaY>RXTuY;p`B@4T(ZJwlJs+tq9Q1GFX_)TB*QLK+A*C zY>6Ah^~DNO3D3N#50@(WC^A7`YK2x4nVQeCLL0^}3I$Wno7h;fm+CBSntKFU*3VP3 zM5-{l{~|wdUesc$4LzNpbH6Ct0-28E+H20;?kMyeq7 z>2d9UEm? znDgQkaecS8(&qls691p`3YyaRaf`Tt5&g0BKyGUZ+5lvxtVR?v(SZ_lX)7yxnkk~N z+?;?^HixcSsqQsEKqkcH%`bcaVv{p^u!xl<0H34e>>ku@LleNkn#d7C@ai2wMslh3 zt%j9fUJmmlf06#>OE4ZVzz=%_&GEmQRx*%`N%OBg@TdCbgE7r1j9sl_QoI#J1k)ch zyHUsCX}tz3t;PU=Q5ZM2IbQDE14D?LN6mlyUQOreIRA1R9NJTQ903Sn6|~HT zkf_D!!%4TNAPHB&j>8oC^am0cU!2QB>(O1?0Ayd>_3* znEK0J=r_E~!U_W|Jce0glCdy)V;E<_@;aWclkY((e)c0sm!(66mc5(S#vbG2q)D5M zHfEW-G%JuWE4^*Ssi?*`U%d!2s{Ri9H#e_XP>$Vvn$m3_svLL0xE^IXgMTv13Le)@ z7{Dsud9izCSpEkiLLH)8S^v0B9^D8(EhHZ{Xn0VS3&wnNBU z-smREu0+ zPbJ^%<4=2bvh!cMA|Gyx5CZ~7rH2E_kVI@~-ZDr&vS*^Iz|E~8vnY&D=9eH@_S<0) z3QC)DY|FAsf0DE_wNL;O_(Jna`R5puqhOsZAbkil?Pw$)F{MLNX>y9OPmDpWE`5eU zN~T4Lv`)$7ppqBahH!gdFl{oIKq?7-3&PB6(=awrRLg`sIG%O}=;n*rRsWuzn5moK zO3eH}$;-wwazUFcRz??^SE$$J&1U?>7~oZEGs196@I=ILV)dZE${@LkScX8 zFXCfGpaEqSYZG{TIe_Vq)TacRZJWF0jvDN!WFCa|iNoxvEE&rv zCgbFpKmLO zY|~$M4AO4CM*St{Y^tm41M1Z*htEGZoNHnljE-(wE_eigxl6cpSR7Z3gJ^I=ug(NsX)_7 z-Y6cR@Up+7rI+q@neWK_TblJn(Lb?0JqYntfd4g03M&UvlS~z%aVy%vSk2+rFR6LK zjmONzHmqzsz%sa2a0vVJMerxbcn(AH0X3o6trw?UXOSs7K(BopY||Y$5~zLfCaUTN zE0*OpOp`{RbGk3p0ci`MEtN32E02Ci=W16*ZCccf>MQpjxe-;*)-lgNB@a%N@Qcbo zVtNqyC6T6lFA|lTljSescpSE0j z%vZIWbXA?wkG&+5avDJl`gC3}D-ThcpZP*`V@mG=mgwv8!v>!{Mwc-D+&`FMq~EYK z2`bg~SP}k2&hDT-g74^<7E=I~89FQIN+(jecPCKHEwGN_0>B%ge$SHKFjs%%^v@$E z&&s=}edjBxtdLJw#~|CfD-f{WEj@!0itJP|r>lZP_v39XG29>PgNxfpdN8lh$h|HF zHBbC^U@rKN)R49@s!AeP+r!6{91ovssun7KYtp#vE>bBJ723+4DHZWwJqTuTB$#EWw@4)^` z?E4AA2lkPv09Fw3;_Xugi%ELJajbjpHwXxt-g;QqRYD^6!jyD4LNO(y@ylB1#>Khy z*AqV(r50=T91n#oqx2M$%Y+aU-m1-!YGiaCVK;+kA22akzCcj*DG4?6x(63o-PL}dXfBk`D`M4 zHs3l@*-YD0oKrveB8aU6ejyaV5_W*C9CBWQHhDaoA@f7dE0#MPGH<1v-$(^(9L`dl9}Cc4+Y*Cb zh8U$LoxZVWt0nSFsQU7UOFOB*jI#|+_@lo@%Ulxc!VE&8R<51B67{-1%1kj$k?L6CCgLf(H{QJZ=}hV>4&&lz7ZgHajO)^r~_fE^Zs4esZ4E~l%7{9=1N zjsI^Eor-@x2E8~9hT7XNL!zc9p4~w@b+L1?{S+?ze@?$BrYeFzZLOHc1h(J|REsW0 zeJQ#ZjfNgN^=|$O&Us6>sj{07qypZKoI7S_&$GOv!pq@aPzQVi+%t}qfen9NEo1TN zto0Vs^<)|YS?Sp$nWb;5c|nA%#DEqPW#zb53XtOmY*>;P@78d;C^sYs|L#OG5DnkOMD?ND#ChO*)+p38?Ga3~KF^S5Y%bOnb zqZ}92KB4Ii0>l+B10M<1ljbOMDXaO0xnhqdt|UDmR4nH*1dYL_>d>n!VyLXJwz&v3|oWl;>#5p$KJHXLe5RkgzeWo;ZdWz>1+2G`3C;{9~H zl9B{V)!<4EY~fpsadfP7YIOakh?81)t@7Nhr(YU2xbTZ!xJ)?+YUV#cw0)E-(2CbK z@O4n@aekO&67WoE)bD(c&8p#dG@H0!X=D~tR~njExb%ZIlmgrTh`0hxKt30 zf$IQ`(R?W@`&)UyZ<~PMK`3rt*K8*TKp@He=oMhYa5jZ?@SLC0=%W^DNMr{M*=88VDV@L0 zAXisdmawW(8A+N|hSlG0fS(e-u0dwU5{*x&TNAqxx1FmPTO{5~vj2)C3|RBwSF0P4 zlg;@sWmQoyL8qWBaeM1nKUkrx_A)SNYe#uPS)H`hSE_^&b6$0OPpDbniAt?RM@6Mw znah!96x<_!aSSpHXrj^lx($3jk)$84z@9MQ`(hmdl6p;d;I^5_$}L;Rd3v){`(sBu z*L;-Genhnv7~(HXoPqvySef+&&CO?h0)xHud-g*YO+IglR0aIzo|-T4B^uT$ll{0X zh!RraQ{!>o9I&+gj>4L79+|dEOv<=BKs9R3psj#~#R0 zaZl&5#gK%kRPYD`M$-yLeY_U)69-KXw&NXnWq(w?{2b$X(t^t3n6hVIa)`59=t;Yz z)NYF%>-Bl9S%ZJu>m6_YAp9M`ggXCus@r5-uu-Mdq(7j7f`WTQh;4qt5LFX^I-v?J7xo10AB;c_i;O zrqUcQ0)zb^9i^%}2QvFZ(w18KR!EfuBXbVPhviJIYN=RLk8@K?x3T|aQZ4IZGrc}> z@m_jG!%Oj5Elh>P(|(#I(lP$#s!ug0If@v2TsBEM-$MmI&V#QnIgR43GQ%CWtl!Xa z5$7o!!tjMUi@)dp{DBSZ8ZJc zIDVj}kL*$(P(l+=(qBfJ6e%nRnwiayKc&|~`Fsb7a>V6l0lFD&SM`yLSW<$y>xIT) zCBC5sO6Kf7$D9%uxQUm^9I@navGRkNnVGLRzq! z``2D@T%w{T;%49cj(cdHsO#ey_U+Qd>+BAA&;3@7hJe_WWl3_ym<-zb5_et|G>sGiz~vjaTuIAEECKb zb)YRxOe70Sh6Ei-2QkGflkZZnb3LJMTDkDZ5rCa`Y`?~6y(v-sXDTXrPqp5x)wqz; z{?|gtqE^|JY$LZ8^y5h?&%3gjIu!_(6<^kSTi+B<=(4%@;9SvTsSPIw$^c9R?2A4Z znrk}=du0|Il%xL_ZXd=OpZM*=;4WU*BFpqaj$$oJM9l^Smg-2-@9Y*n)gvjzU{ql@ zU)CZf!gJ_6C#u!ibnCGxlAj0beh0{H?~;`lv?=&7iyiT}OL20`_)Y(wBpKrz4lc;H zQ>Cc9r7?Ny%i7}3uzx&py01fk23EmbSRofo%O1*!bkV|LuJ{+5Fg6%Dzo0bdvxFW& z4u{X%K0?*p%wZxXzHdEY3GHKN8XF*fKd24-+bU`UU=6!F`8`8G;>!C6>@~8t?ba(E`ifC zC0u;%khvqB!uG(EvE?SHsrAv)HNKciPs?fhnyV;GNZ#>TNC}xdzs6rLF@bZPG8)W@ zdzPhI+(qDmd^5{eM`k7spU0Hx?`!S~WcKDFa~8%V1Wwz)^%z;g znJ%v!G@H=pH0m+@PT6f4DV&o?} z6qjZ*9uXfI-$0hKD+9E4A_yn9I3~Wrh)=u1l!m8LdWJe#O>*|}-c6PLvFGl!-^TB+iWC$lrsM z4PsMfeEz4_a*u}`QU+F0D;w`se6SkV2a9g% z3nwpcf5*YQFYe0jwq4W)fPKCCN~^}APh-(M?!Wr&yB(?i8-Jkj+q%pzR&cN$NC*wo2X7e&%=#_dlmOPL2%Z^I=-Ed2jyy zZ^mE{)%Aon>c}VZ(c(4LG0=3r@R?wq5G^zpwMB6-Dy!-cOF*J`DE%TxL6^NEXj^WckR8l&Pvou&<7hJ;bNnhOdS%J1Ekb`Rc!bNTCwcW9GaF+ec>|Vo=M(6 zA3&ft!xR`yq%N>`xx27u!)h)kFb}-~3iaWwXoG__vn@DUt|VgWt?J?0oQ=uhjN**D zIQp&0^^9wG0>Ah}v+kPyfo){&YNL|M{wc(@QkuI|*pkx=s@lN<_^X6h8X$HnNG+_M zeIAYqO>iGe{nRD#y`~+v>&je;lwBSdC|Cv`qi1i)Ou3cZY-#)+tH?ruo{&Nag##Nfm z|GcjWU*ktJ6hlFBId~!49{f^gaEA@MW73NE10vm$66hAQXpfYd`4I~ zB~(n4%V$>It_ddUx;;?3UAzL-xXY-EKKKHL$7jR%4s|y31!~;Mi$fuY+*rxQ(MW_W?eLy|$R_){KHMd9$KJ>jI0m#j(9oQ#>x-Ie_HspClBHeeM4Qg4myR?< zQU!G)kpXh>bUDmCL!zlr0z4}UuLH!|@c&`hj@KT@xy~2)!Jl~M5pGSEjSUu>_4}*( z{1%J;5o3s2*(J~GZ4*?`Vkp5bMxqEZwg|nZy}=ob2d4@KRHx&7Yb>!oxl%&=s<2T> zl7zX!b11@`%GGiv{&VxQ9(mb@#`_O z`{IiEsNl9f}7MVC8HLzWH+M`0n%ptzRJ5T=KOKB&& zQP7eh@0lpe!H5tzK!@&$G%6S_h{vQ2R3iVFn@#3O{3Am28e~zFMb>F*;*7TD>puZQ z47GXmQ57tJcmS~K{OHB=;R)n*!z&J^FjJ<6Vy0*%2BDgOs5>Tjz!O9GHEpx{6m#H5 zc(n{9EncJgK}))^Jco~V@5B)*I5GW4rda}Cy$J4c{}$whAX7pgZy4aGO=X)k!uBj9 z8}POHz1?2vvnk0*2w1b0;!=pX?i^zN`tn74vBo9vk8^F}jv&9FFd>HxU!`Ic8{Ech z|Bd8!XacX?!S9lXmu&qvyKq!C%91F01vn6FaTWsx0$3<>cfFQ8zLao`GAIoHk7I0u z=^)t>5mtwUwg0FYO#a8xZT-$-zO1n*`8yA46)#Z&*@zOc6_aG&>S43;_WID&fH4>g z(wz}rL9YxodLB@vo(OF5L5F$KxS=Fyv;{pXrF#G5 zv}c$GK2{8Pjp~x_z##JSLH%0c(F2MnzhgLmHv$Wl+rB(LFY9XX5&6$`l!Dx z-?r=MG&IgEdwkilro)h2Zq05IvN|aD`ntNNF8ZD)bqHr7Bl&}Np=w2iiEPmIX`>f4rA zQ@G^5eE1@rb&E#5l|}Nso4$F^b6EO~Au9CPgn8pvB8R)O44&jl*Iem4W0qzvhm`uL z=4fX8{cu>&M*x-tGmz{OM7pLa;2YKh^-aD7Z3Lib)+wof?IE4Y;fRS~@eUG{6(Z4f zMmxa_knTAMaG-338-ac^D&bv%j~9Ik+>qC%#Q_i}oKPJS%ajk0-fMDd+pbvISR06r^Gp+X-ZeI| zL8SRr#`W?e;Eji}<{7P6%5cGpar{fSp`s9PYB5v%S^(sjO)%wi7o-|yFuGH$OjXVh zx;&4ap(#mn)@aArG1*!E4S_X%awTXP>V>k|yZRJ7i6vs44^8iJ@hPG+`;u+Q7%*j1 zK7V#)d`&YAEF)BOGXrG9S92B_09iIuj%9u^ws*VV>@v)w;24#cA-b7uvNaT_o#Hc& zY7n+ICs-<;GExG9Uea3YqE`m=ltKQp9Y8xFHo&KM* z1Cw8k7bpE=p}ap>IF@Q0V%h!DZAj+IN4OBnkhLoO@{d|1;SFxf{R920`Z*r#`=bimidy-2B-Y>lXHDepbfY}k{k{3}@@t&PhQHxZGr(ZW&44V-2Q08ivS(k-TY`SL(1aCrQ3TU<14fY`MZ zVvK}sETHJv>))!dQ-kAAOJrHMqJ$gOT&H8g|mB5O(B>2FfPhHt*9O zX*&n3PZm-TT^0lMCh{7kYLi%bV+nMAHx>7|5GXO#A}j-0Q!@>>_EF+5a< z+w!?4U;u9|8pz&CL6s224A;xI!OnuTqJ_Tc_Fll|%O<~5*G6%C1?RZS9RnlscKjl! zjWhzRy@k9^K)*9oj(#Q#U1dQ<*8g$ljLD6=HJGKd(;qS7o1h4fBiAcPU)Ij3!3|eD zjmIxS0~@O2#e*ko?^I`$?SU=#*t1LxCL!4aeNu1pFZIGYnbQD%1->gL^We8MoT*e{ z%u(=nv2U+EH$1k0x8uC=B><&(0;aywF9BcVCjON}qh4VL2HnrJJbiWIdePPlcdB*M zJWf-QB{=L2b1~mpjbl~a=9iUJ=-M)iHTr~YNe`?ja$!p=>MF4}8P1##Cxkrb9I*9~ zhMoVOgPA-<#+Ek+AblDNvfkH>KUH(&RKro&HI1_N<)sJ}F8+(eGb%=4o zv~N6NPm{e5ZbOm_i!};IQx1Y@$@dla_Vfs3^ z`&%uxn8dqXfr6_{m$wXAv127Rr9Nr^r|nt0zR_Ov zIXDS8gDbOzPf}ePKl{slEwY)qQl<6kWN#Sjw{?Ty6OfW)uPF5ymMHL@v;_oik=&1s z-Q%+*$E96G2sO~($P@{Yagw7`1+p{ zCEfeYk5yM~>km$4Lm`J>-3$Q#%7FX#3t6Jz#g!^6%^{kvQAZ7nw!bjoq0PiWFy{E( z+p^Uh>mLkWphs$kdLshitR1^FTk!zAyO5#xB7^zTejvo4o17!BTtPPhsdxR}w}z+9 z!5LrEQV|;rCSrMh&j*5Lo?ZuC6e=`b_y-JNIq!Dn)+N9^a(FcXbb(`YG!^zkM2CRm zq?h756%QJKTo}@DVHfr`2BO$%n%`x46i8S{??ELLO4H#*9`IHZ_P}6f4pe3_J@qt3 zJGM83nx6p>7$_ua;HSuV>D^g1>9|7V(Gm&u?S6?k;HFT}LrVHDy*xpUMejXQ;q7(I zmh}0}a$zGb1L`o7WZYP|dH)Pi2z4hliKoUPl)PhCv6T*oQB6w*xVAZi_p7aseM6oY zB&3j@!=%H>(F+M=Vc?r*UMD&z>~OA=lx4l~&eGL;rL3ec=a%550S!zNvS%v?z;4|w z{tt4`h_vRLccX=Yu_W1eCZx*)>zVtV_JL7!Dex#fWDIa->)N4Z_WaXHIw=D%>J2RB z53zgA6!m`xfSec67Pp1RXu3^ zlUbRmKkO{zqnr050W*uDecFAva=EfMpzDfCsG0W2j4e2^7QS+%N>Yyfag-A59k5lz z8-}(EcKM&>&{(YblZA`Kj$ZkN&VE*>Slki=^&sKn)x0Y1xwW{Eo#c}Y(2bMmii2t` z(4Eno7VrC|$Hp!V>CXfKN{T;|55YD-iDs4v>1BpFeF|Qi!?GT1HAa5ti-7hZFt>10 z&KV+tW}lUfgF#E!MmKi*c$DOpurGlIWC8QX)_iU*t+OO&#!SicP)tqH*Zur3c0=26 zPabD2Ssa1SbxJ23z(zdh0wVyDigpxI9oY5UG0Z$4tuqB{4qYw)HepKi3qf}oc-mJM zJ-Z}QBsy+_CM91w6px7cjVQs;2T|agv0cDZsEbfg;+CyuNcH`%BsX60U)8Ao<_%7D zK=*w=N*g;Xv5G-%uVp&JSXCCGpUoW>JZ0!NYC}q2&PX@$Ru3(fw$3)6ns(bmy|30v z@zZr+tAs2O!O5L*`fxDwlDfSGK@0}&rqgJY! z)Hfv68MGsE*ZZVQ;6rCI=$AO6L__l{`k`Q%j~R0=94jaHzpVgfi3b9`4{#5IK{Jq?F+VHvwEz{CWjN9j9V+_F6Q0U>vWH`~U#7v2x7F zMAkTD(cYV>fQ6l=Mp4$#dCf@_OZ#qwd!V$B3)Y7oKc1JA;5*>PMTY38VE(4^4m)CQ zDhmMY_#~_$R~rX?p4g-Q?+4|cJaRFAC}>s}7LHx`3uGW0HbDj#bC)+YHfDup6dWLr zl|}+62B`_}w9!yQ^&UKuYt}U^XU#_(G~&h8U}Qlo@|2m_qV$U$zc6ZANKbOk%_c>K zJweN%s@7@-7X<3@Mt^4wRVn?0y5w3>(z2t{Dls<~k6m8=h84nM^{SJE)DM;wDpuL9 z<7q+}BVb5#gP1l)gGgWnJYOua=2&cGM&o@t7OYglIWO+i#TY(iu-QWZ=3$A~(o?wa zd?pgEvKTWbtqbPF_Fl)386bM6HQNaN1vv1{ELorCc6z^7Lw2BpiHOP{#?`Oz8~W}w zk$J&5Um~SkAmKloryvqNU2_d0ChzH+7^37-wNP+{<4J;9Z_Rf%$L{UAj3v^{An{Gv z;OobD1A0eNWWga$A2gK}P)5)^I*?Fp;*{nlWg^|;D7(_5qey@mH5g!2&^t9_J!;^* z*ZI3RS9(6_y3yYZ!cL7S|Km%Zm1&1kahPy!8g^uQ$>w#vJ45Sdo1#(!=DhL1KgNmE z{5u?hb$8bw&ocW~g${WjVZ-y8dwn3k~*Ngu{3LRL6HVfvGlr^td1^<7ZjRJ&w#|h0;>_2Jcrcz$1 z5yEv<`|@{eSst{c+|Q7j;g0vlf|hi+bJ!0Bf-}qEkq>9`z_w`BkZI@7-d4<>oq4!A zBgaQIqNy#DVpI&(a@B056%<662j!0l67F4O10qW@hjJ+LsR7Sc{ZQ@)`G}K+Ld|+6 zU94OPK|oBw-{u~b4CKhXNx=vI_>?HiGJycWf^%-vxh7 zF%Ax7k`Lmik}&zdR+tnv-}%;7DKHtLhm~ zxBn>y^Jsf%i}c0I^Z2+25(ftbNHR=;Za{99hKLu!;sIWk59A<}npAtDl(ZL~s zGnQ+TmE_?tF4&bfCJ#NMrY#8w+ zZ$3W>c`mC%mBN3?BiGTkc_Qkcb>~PQoH1@_WoR5oa4-7n3Epaf2in*n3Lq`+XzP3} z5|9tCA{*`bT0R$oIu+nC97Hp3ZISJI_l6zf@2wQ+=}nKN6by3nAEYTWh^>omIaPJC zjc^-jcU}+=;e?kV>o(2sx-L%{SGxckyb)MwvK{MA%xgMUegC)&gA^Mi*a%K|v z2sDAM;kL`jZY+wi$o{J zDjQYfI7;e(9>hm}mvbu~NO#!n#{Cx~ZETwotvpCm=6)H?ii@mcr^-Lw#&R+Ofl^RQ zZr7ANCqSZ_)Hv~+z-o~NAtJtjdo+E&*ri?lin+lU$QlVM0P$Tu`J)(Xj)J9B{(~*$ z%K=$3J*)_$JiT%rJoDULHsh4@q}=H;W>{CvHp7G}WWG+;!R6i%IY8=J97 zQ#!gnZ>1B8hji}L_$ECNdkx-UdA86i`T$J!d~ujwnXkD1joKZE#tjm|{`>kQTmeDu z+&uH>`cpep(SsiJTNK#-9dcC}77#DtW-n0yv^5nq zdk_ZU!vtYIRQtF)fC%Q9u=gcmW`~>6X!z52X6czl=ICA_S?nIdMrWmM{T-(f0& zlzVf`XpF~zG1wL=scZCyo0qxL;FKAkv?b8RT5ArEUGo9w0|eTbI$>!C3PqbZdj`9P z%Q*hLcMknjBKzqcy^b+jB!$SGvjNCFP0#u`LDn9PT zM+w_Hs%UVZM5`?CBn1}Rnriprd2IhHUjY7Sv;BBH!O&=& z%giTqdrl>q_Z9*mysN|5Ta{5!pK0MjU&lcJ_=duN_^zVC3CBTPP9;}(K|_f!4pplQ zxV*b(nP$bV!YYLXOJlk3!CV8bB12N4GyH`ABlIhlSyq%%=i}XU1d_Q044Yit7v#PJ z1DXi)eW3C8ZpiFa(n8Mi%5a5ZtP^-v;LE8tcA7hk#P$k`t-B}3y-_aG;F;}1b_@n< z5O_S~CP@(0;`&ZQpmoY!7cnkl-LN7=ujp2hONyf~87mFf z68XaLet0=d9G*B0GCbF6YW#b$brZhasF<4U_z~xbJ?T z#nLoOvx5d%*8qj)b6cmS?X{j_ib|Chv?4M|Y_d_rGV8nr5=+`(#j_8T><@R$BkIE? zgny@+gSmye#JIroeUvY&VrK^?Fiz{m;eDq%o?XYAnH_Gkm*E!;QC;~g^dbmIazCly z4?LxZQi%6R*)ay+FJ1QA;^!BAgNmhF1kbsY>(IliBk&o~{it2M4&m zgt{T^1r4h_+^i6@K?9_%F1;f$3Q?zEu;sY!MwlsXn=J^Zp1wR_u|Dj%Oi_znE7ND; zP77`HB|dqOJhgq2C=<0FXv&YMS&B<1cDDeu)%i0(WdCCf=Q*Y|QyM)oUaE(ijN53Xeh8tj z{TPTbWl+Kx-ImUS8ATkgj-|(r5-wyd)21& zG>~Jj3FM){%`D;v#H{H}qe6Wg=U3KV5ehD zJ&Hkey;(B3Si}1^dR@gRsA#=?YqZ+@;MwNH<;(*6BPjEq%>ctKZmq*DM&AV9*+Ws| zgR(y7f6;=>qGE~1Dv=kcjh1KNYFmVdZ$z(tk;`O4tftNX7^cr;@BBugnh7wRC0FWg z&_(xsfus!@ydrsKr|wz2-TCJ;mO@c=bcte)IhShe2U;dk|Ml9_UyzYk8M%4R)bi}4 z<~#~o3(RO|NuOYLab#N6l*+J3{Eggz=Ye1J(8{6^Lf^m%p9kFs2khgl{S7IQBPKDc zyG0V$OM1c=_=m_^b`oDvlcM8E+a_yn03St0kH@`jE24&Q8l^;GlFFPV)G=$L9|YfD zR0WWv9yib2FS3Y>h`pBM{s(_QJ-GXezVqp6pbLpnPDbq7E0KsnMx=;yM9p&T-D@bGfZq{v_v{tlB(A63A8nH>F$3dT3U%r^D6EKy>huftz} zXEFD|S=^;G)Out-Dfayd@nK4sIHm9m9$YcczZ3#Sl^gKs{@Ge_CCV0r|LOPP4taGH zye(9%_=Dc_)b%4@B$0AG*()e4wm#Br>jhA0cDn33aqS)83q6%jUz8M9ziU|$Iyj|9 z645~Hzi)4O(yb)s@!se@X3zbp#M_l?yBJXt9s7I@_g;_4GGd#~1^7kepl{vli$%?m z%^B=$-N7sl@Ui^FW9N=av@G&7Wp1fsk|!5ws)W(p*Vk-m`FLU6Co@8cK9cI=Vf;~#=X91p}ag zi;3K!LrH6kt!n#hf7k84TvIe!a0d}*MM>Kja05(u^5lZ3vQqvbjd|+%G7!iAvgpy9 z)2Av{iZ<9y(8dcNQ|}_>A3+kY&Ag*1X#-iJzzAfxF&go>J_Vbm(aF3d@>t@4n(L%D zH9O@ak<+ozp&yOoCwk~bOKf4HL6Phx4nSW0lutEbL6Qiw=?8qahbCFPR!B}U-Ce|5 zAQ+yb4l*V4Q05IE1fMjW4*}mKd5vS!BUQGHCzV__ap%qpBqf!?nwv2xn0Q&nHGUTgS0dHFl`*_2gpxeq6Rf#sPMJKV^6sl7LniB-B9y{ zIJS#d{IWrHrvwa*eLzqy2*yL1Mc>v_i&98w9I!2y6|!zzIRbRU4#aw)8{LuCB1li> zZz9E)B>iU-0@)BO?rkd(ux2-hyT*ik_9Ow$KoxPMurjEC36ST4`>+fv}{2^=gxV>$n3xpuW zkf>s&zH)?=%VDhCh+ZI6i;Gavv4#5baiSN8{)#BN(Yc78v=(hY73M&-EaK8YYGske=mDdSsquk!GRZlMFSGs4l_!wG0$#c9W9wDB@RegLsIOmp-dg$ zuxk3)>kFiHQwII`}NsGs&TD(YIXc zGXaL+NwEe0cBqu_qGHKJ!OkyIZ$%-1MDrM+oEyf+P!@nVfe0tPyeWWyPF!m1}hjzK%9$;!mEFjN9zL`UiFF_B*2Raaol%W6HKlaY_Bx zqfT_1W}EzFDBWLg2pt8L9w-b_J{nG$=rmBaJ(!D!B)mg~uTM>h`d@Q$seFM}r=V#a zAXfO=9bH8NtYqkAgoKMa{`(_l?mE^O+T0k3T)yQ%fV>|l7*<8vKkq@fA0oKWt%o6p ze&lvzAh(|bFON`%$KSVXV|*28%tICTa?*}&#xkx=|->S4h zBvoVs{WwIT1WI#UZu#O}Ug~6;;MW|wH#N0a_Pj`v9d1MvUhN~TS>#PU?%a*tMG905 z=sQpEl8fv&l-IlNBbU@dm9=t2IcVtMQJtF9ly5$pV6Zzqxi!hX0D(z(sMod7JO>Eo z3dT|ojQ9Rk6QKj#i{)n39*F)w0J@|sU*>6&4P~0kA!K@XMG(2W3&;)QFJ^?f$tbIe zyQkJvC-ebV+T!Uq-{)~@d8pR@-`9H6T*WbSa!|0C(NMxleHv#`v-v=(d4T_Zt9*Bs8_4R z#}yoRakV602nu9+{tnXBP_QM}&ZcWdjLWS9nLLqaAJ)zJI1C~zJxf$w*gU2qy7zz% z3-kV+q+hxRKJukGCeq(Y<04~N1Ep-iyv^f))U#y0cR&4V5!gQC{T4j1-RAM~8 z2IZ1)`dZ&SvYrq`Qntd<;hY=G*7zlb3-hrhOq_W@W+G%!q|1ND&)Y73={CiMo8%Z|#cP*4yEW0ImTOTOemGP}F+5AsKr}xyH#}l4 zvWcns!FxR;VlULO<0^bL>oCbS-a0X+V{u>}S6=X9Nnfl%_2-|z#ybE*ZGNUViCkA6 zb?j+Y#`Hib2R`yjjxXvc28bzA*6i{A1B@GWMDq+B9q|-8!9K`M>M+79oI2!Jnt)4S zRV$xRbKT;lqKe>P#lR7=Rnb~MhAzKl_0#C^?gLHlr?sAyD&W6$f!I}OV>T2X8Cj5T zO3y`Xq47j~zxkCtC+5hc{5$})%mO%}=4xHAi&m9}`T^+p%DBOMU$dVKAU}{A>{b%8rBE_JF*AGt3?un5e#sHUlI1@DterqsPs7Y@6lCG@P= ziD2^UrxD;gsSZ09cGp!22(w{GLi1X{>L;-llWC9Fvmv}yw55%HC-Ce;^mXo=m9WFi z6@AelonAGfO;Le<5^20>K)1|AcS54OUg7gF+mXD=$s?FjuG4qzHvF(j`=f(pHlUih0TpXCq5OFMB?NuYYj>>XE*J8no882-V zAJDDIuFzlhA=a<-UDi#Hi^yZV4g|?}$^(LDz^jXrfAez~Gw9Eq$f~R!z@;loBsJ1(NGQxySMisAS@v=h$rnv^so_ujxd;I zhTJ$(dzBSOg*=2fIj_gG^AycUtQPc#2_Sq~5_O13NA%(O`)hRAPFTs$QOKlbJ4+>! zc=z!k;P&HnXe|@q8BBSBTNgzsrWy9CK!+&KU2USYXoOL{74hk&*mWbg65pwKS0ZoR z23zj$;v}Ji!!(qfxTDP3g9CHTn9vtpOnU7dQB zdX9O?Hl0?LkJ7BKeE{E19MmqvFc#DKb3r9oBg9%|a7gpr9|YU&a5iB8VA_c@_Nf1@ zX#nv);0SCr7o|(OMv;N!D{nso8UxhE$kw|IDSVd58W+ZfN(SjWjh1r0F{lh^0>D;p z(43)08mssh)gwr^dzV2i%*@wuNPBMs|DJ#mk9mwN^q`Y89rsLZqAZbYUGv_+Mg-#!2zE-MzX}NuVXt-6`osak;A!B`~4r zfHb;jSS5QR;799tv~hL+#R(dAwUDhICC*D6`I;blgRQe0Jm{>qs5PwJLx9SerCPIp zDKM){JT%jGfpA6+mi5K6( z3(xblU#+VcAoBaws|G~wBO0VSl?tzH8HiC!A^?NIDNE*776uyrUKI~i;Wq8EtGMH@ zNI6zYWFsI1?t*QI`9$?Hu?+UnSkNM+Uq-7ksiJmdRdnNUM;kzs=C#6JC@EF>atIXG zivI|5r^GGGb2xdwSmp@glEehbtSSJTD%h-f)^IJmawr`u;D8Ao#=T4A_sjE5RbtR$ zTOwmT{97|=aj~#d30yKBnr*{P(+b>R_z#c=+todg{fMvcv@E`k%_-l3VP8DLMq&~_ z=^M0;T$Mow8QnrXZ6Z`1FeU5d4kq;(&9?R??h4!AZTaTTzL-yOT^G4E+dH6l6L*4u zy4uA-9g)!#STY#1N9EQVHk(3dX5@S-@1`B;bi^>AeS6yoYtlYpCGaA_C4~9aGQy)L zAr_Gw){ftNj`pikNZ;;cWcg%JwWc}}zwzZuR6->85t&RFC20sZDE5XGN7z0OiDaSBfH#Jj{BPmD%oTS)kpj6bKMvV_x_F|XO=9|x!Ul6BukXI9YuW8 z$_Ig;0dDOp{EzGtO!r^J!$qthfNhxkiYzpYSkQG{Vi`U1f|A)3RYv!*TE>9Fh)HOu zxxG*e7Kl+f`89Ea!~xhj3(9T*Z%v&|mk+D%4Swp!oAXdbY9PGyI9}4)Nm^y^3Xn~t z)a;oy#)bH;HfAa)Jk7qTmh}u1&|nSZ*{G&`?v;RvkVGLY7l>MU-%c_htk!E2-XsFu zwJWdo`{Kj0%ztN;!~>kdyiB^N*x=|W@v=l2F`g5eYO>_d_hd7JuT2L`AF&G`qGUr| z__TK!!V>H3mle)YYB$;z*n+8-7)a78>20d0E1$;mhugPNA7n%Vq~>F(whVQlgK_-H zzCC!odIpkAT2pU{1;?0-J)8usvYn>1J-J@GT@A71n(Y8>x+!R_P+4kvuAX5$GTmEk zu56ZaO`4-Z_B+-BgMV7s87{WP-QlrMBILD^+&z|SSr)2=$_k2q)}00l2^wwP|5U5f z5#^O2GB0@=r^^`%hX{4+{RgBET`-NhdU$IlQhnwxLQ%$NRhKa<{Tiz<_5v-gylFTB z>7CV}V!~&0iJ>uOLoCf0f4Q8F5G+lK8L{8+tKFm&(X=;lIe=yk)C$&E@Qjujjc6MS zaoXU{Jq0#F5C)){ZPywQKJ4vLAGSPl^Huw(Lt(Gtml~|M_Nu@O!7_!wN5ltoJy?i< z@6qZ()~(v%q@PW*s|=TS8sL%iynTdq;s8NTm#O%z%3TU#HI93>F7=DGTKA;&(a7{l|g$DI$L5 zX!#O{DP7D&UAtC@mW`{z<^w-bK7;ND0rXP0)|a>$aYuAwfQM8ZmT<(47#-cbyfnHX z%eRiMV&V{(*f;w1b!%)SC?#AO$0)(nNv#m{nz=d8+mYMW?#(knF`8_pdc8~33o%IewNe!DD zlE@M&s}93f+e5Cokz_CUJK%=_Ml{-EM7TqJ@DrpBV>6=A*HBD}n}tq(p@m2{R$C;c z?(U^I7-goUaapMj9+REqO>{YUL}`rh?ON?I;}7g~T%}m%fdjO3B@OujhbIXZnom3A zpF+cg6Dd@J73=)YW9yru;?ggVVQsy9DCo(yM@ft5YYZf9sjUG&X8OzCt`em7-zdU1 zO2T0NmGOdPBhhoU%j5FjP~*~rG9jDzA{v=PyaPfi@NvVUQCtmCjNG|8dSVHB15E~9 z{DU!n&AVCt3}5>*5`_aqdGQ-?=>D^zv#ix%MHs(hS+Ol^K#+iPl{rK2gIlax|jQdS>Z%ov? zR!i^5Rf*e5lW~<4Aak99QYAnb6DQ{0|5Z-Y-sP?fV##pjer8pnziZM5iJVo9*S|cIMdW*yNGH$phL=S z0ObS$!2M@7zwT)R7X)#|#34%a`W8PnO&1rju?Cwe(Xi(b2{=H(bdR{U{tIFua>-a` zEpr%z-HV z?-X^4i>HgjJ#K3ykxK%XHDMWnCER@c;O@~41$8&)Id>p>U8z7ekX2?{7+po5zz;5t zt{R_fe=0tH<{ZzQ&Q37{S!ze~vl#bS>N_4w|`dSiE`fG#(l zG6;|0S0^--%euaStc5`?6im8Q^st>VZ+6dIcQl%UTV{-%8{9TWJ*@?cdw* ztZHwc0Qlu){d>8-Fo^xeXhX0-#!$50Zg4WL;0@X-1-8~NifV@u979Fcc#0w)5y%1i zqqUgiM~A>6-T7QXigxRVNY!;mch+4FfqYh+8j*;@%+YxE+ErW>A1-%n zR*p|S47>JYwyOtbZ;GsJiEq3Dlxtus^2DcSs*qoohb7-5vOYUH|0r)x$)o4o=$o$N zVRek)gU)Sd5yp*>2AIP2ol!2e018Qxnu)?0zjxEnNWe3#CFb(&`>VYt9G+b|?zz(@ykw&yYjZ|8IMwxRRD&@T=<-W4bBT zQfZ$0CwNPETt~|+nZu^iLO`Q>MG4h5Fhf+Y z>WVCSlF;_iV~O8F*5&8u2{%@3JBJpyC9kvbCHX_MRdV_MoTG;~WgMM40hR|+XK(b2>E1a3 zvI3tGn@F3v+AsG;Ea71YE5y(SwsB#kcMCWukhXULp_sy44&m7jX%3l*kxwc#!OF5F zP|j~QrK=65MA6f&olL-NvA&Ch^swChazsDL0D5yw#7?LS1i^wauC1Sf0+oUb8A^Vj zGF*&x2`VD*RKRkg1BFDCE^i&CtwYvaQgx|B zn-1stab@n*3yaAqS*7&?7@;LZA&uFxNJi}Xy21nPYP5+D^8sD*ed`>Ke$x(0yNC`D zSh~xyE^nz1R{tA;sgl|HZ}Ut?n42QjoU|!T_ zY`d`q1&26wKLO~6C zE_BdW8WLxOwl_0t0bVbY)(`$&I5h{vm;qLsm|&kblOqd%>&eW3=Y^HsT&4mF(}NBs z`oZx1J|WIztv_o64xdc$Id8aI<6&VKm%DoykM0vua6_DI=XM<_W&Q^%I}sB67}}$_Uxs5r0t4#V$>ucR{ig`VZYvtqQMuagt$;4>e`q6wzEmsNHJzxTgyDLDWRpIS=FT6NQ;;+5?hk$@wB`AF;(4S2M#S!MXsGB8x#(6UfUa-R#};30*uz5)An>1?Ku$GhA&8yE6>DWtch=97&KUKt>FL_*6$V@xh%f zd8r66IcKQ8mmhtaz72E89QKn*>eh8A>XPN;6FkwR9y#VL-v#a&2)Xw0rB@*j&pleK zk$;#(cYTv%BTq5Do1ru}juMRlzNzjy$&kB?r?l`qTK)0NN!GBYdEguh(dq!C{4i^; zk|gBd4VC4L!oc6d8Yo>=620Gm9`cicx=n*KG4R7T6S-+a7~Xg=3iOl;RV?)JKP}c0 zc5LJ;{JX1$xH54eG1;&H-w0tsmy0nJ1=ua6dUPwCq+dMI=#YuO{>N}mNskk_let+a zG1GP=_(2BpUZaKR*y;G|?fbhzg&*7H)e2$=@m|jU;fcVY-L}4=6XIsw|)>Rz{T$ zd;=yiGUjnT%7iwLBH|W9;-iT5b%lLf9nQVgLOQm3?YQy?BA-5UBPA=#`&z3V;W26g z07h!s>{-YV!a9rji?6B)FrJjkj^>PuhqAJWABt_{fcbB)arl}eGdPF2JbKS|pNoud z;R+u)hioQl!M-qLRU<+}$dROy62bH~*sc9yAlcm|L}IaYE}!%T!42UpQJh;lmcmfe z?uDfO`wo(bM_aglvF)p_z_HUPz}Wo{y4?`ArZ^Wd(ltR4Iu)En;#?g(2XlyP@J|}cW3Av% zG^M@p=?Gx?W2N7&2&)CPg>-wUVg&p<8|RNtaHi~BJ@*?xSfQwD;qIPc&-d_UyQyX~ z@T;V|-cUHxW0(6?Hr^6pD%E1`nBX(Ywf2w07_WGmMUo_L!n`hR3Tlqr@5PBm817=!qnXX=dJdATA~^8FQjb2KC}F+dEzMyBG8(+29_>rmg3^fk`=T zA*Td%o(#o}2U9WXT544NPWw?B2sSJ+rB5HGu(n zamj#JDYPkl|ovmz+B!`^MfE6BAQH}o>#Q%y4*vx ztF>CK)oVAatOn~Pw=T4SvP$jy#+Q?+wb6cgg^t%47ZrL~&Yn)cbYZqn&D8b$NS;i% z&W?@6%*OXEnk}YI0y*wyR;5sTrH+6;whl!P?;r`+T;%H2V*O%>5Kzj&>=;+zeO7%B7Qy z^oYI*Fx;M9>%?`3A2#vq6`pZE=J0j`{sCvW4YR!F^~$BK3SQdkrWfilKhz<0 z`b&Y}V4El;zRPo9ZUdF6hm(4!yzIx`y+0DDrW;^%@JssMHG=L2*EqLhv4-ifxzPQv zGFukg$R`~tu&yKqpYJrUhvYjb2EKN-?kw_>hoCs{nB9PDDASRR7^y~H$kBE^5}d@YM?H8 z)ZOMm&6~)6bqA2ebmMAXQy{v9s(-BXXrZD7B<3zuD6gP4{A%{PB!LD^81#reDuu;ST zk|S=(Y$-eBdAWsPpq>rbYZP*2-tAyf!gK)5swGd#bvpa5Zqu?1)p|753N*}1u!k=| z9Zw>!G8~!NzwM~A{-y|OB_Wm@b6GUX{k0AU4>xb)ij6T{L2zGSex@yhQy=w(

`q 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 diff --git a/apps/docs/public/images/n8n/workflow-execute-success.avif b/apps/docs/public/images/n8n/workflow-execute-success.avif new file mode 100644 index 0000000000000000000000000000000000000000..44d418313e293d674a6068235e7ba44cf08c3403 GIT binary patch literal 50309 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/workflow-forward.avif b/apps/docs/public/images/n8n/workflow-forward.avif new file mode 100644 index 0000000000000000000000000000000000000000..ed37505335f130bb7cc39bdfc21b8adb958024cf GIT binary patch literal 28203 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/workflow-monitoring.avif b/apps/docs/public/images/n8n/workflow-monitoring.avif new file mode 100644 index 0000000000000000000000000000000000000000..078aab968fb6cccc56b81d6d12a743d7ad7768c8 GIT binary patch literal 25338 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⪙ z%!D2`%Sqt4NaFpOt~coj=KIujw}S$mc}=f$wz4=L!F zYRFh#&ST64L+9}7nF*MPu~6fdG%s_Y!N`QZ#Lt-WYY;otbiScf^-DB`=Sl)NUou#` z({*rL&VNqCG+6FT_bZXTMtfq>+XqhnV^=%Rz)fa!bTnUysN}?>;_rimqbxT^%o2|r!vQ;lB`vFXGNFG7{4e8k=3+gnhG2j-HW8-VnyZqpJEEvcDo2#QC-PY2 z6{1`K`p<9#n-gA)5h)kP4V&+P=L+@@HPupG@616nPc7G1EHoP~F3dN92Q9eK+iW`g zlpd3~?!S~qb1iJFG7|DzN{*(F@@P|tuR}&47&=jN+zI_doIs*S%OXBNDrR*UyhSm( zhgl;ydMJ#}7@PWGgNoA5WC)wu7h}X7lQI5jCWy4ZLZ~L;gtuqth)2d*oYn%$)c4Sm$SAACU5n9y?%A(Xme{9In~G85^X9I!bl3(TPp$c!^(?^1y^?D z5&&@NvWXqj_$>9xKO7frb=?ZDBh;1{|F2LMC7{d8dcrmzmcvOqM?@RdOJeTK02Z<- zsSP@0cK%to2&7L^>Fwt-D5ApcK2o6yp`CW;NN(=EK9%8~4!*@HYx%Wc-k*_=}t(#J;PbMViD%1jD0Ji^e0iwRH!I9gr8xJ`4YtR2Cdc!KX8E zvcvE5MZhLlEp3@a%pVEim-bmq}jW*n(%h&v?Y8gbf`fsFmT|LLOa3uG&)+vo+NY;u9hxx z^ex3-0D~CjYcz3RVsLE+*;=(r-~YAHB)aPP9H9ucX;f;E`<;yv!g;d+4BJpJc!n@ z$=-!IAj0pM;H#f6+?uIrR$a0#`omNJ@b~`D35B3c{HWI0RyJ88L9vV!!-7`->dXlW zQ$l8LwE=`@b57l6&Jve10*WCc9%`FRlgYwc6*z+rons|)OMyW-FcKncGl9b;7y_h4 zBlB7FI|ECD5-pM{3-enqBl5us)uGd04F}}`^h|q`pm6oqrt&)xn?X`o4z5>)Nj$9d zqkss_qt>Xer}a|MfFhxHVES4l!)Ojh~28&UUsfo;Yqys{L%e%N^2>!$*z$uzA4 zTNz7&sVrz$%<@3BK~7YP5GTN^$rkeuy}F&EziPsd0t1A62xe^A0w_Dzv6o8g2$=Ay zwYd_fGv$oaE$0l)Y2LrBrf8}YeC^^H0_|WV6r*7=#qf%HuKuSs#99YtwZK9Ily9=C3zSH`SRRzOQ=pF7)9Ev(`_r$uckAtLJep7`DzMRb)K@= zE!~(O#z0bwsHV6XcL`uA;HOJlc|!3glz@Df#HprKh9a~-Sejk~t2Dx<2y%g}3OGT^){oad9#4};vKlCT zwtuqDa_%ibRBps4(QH`j(CEinD5%ne>Ti48d}HRw2Wt~V7`kf{RP8=lTI0V~l8T(* z80;I6y0bpbvGGZ3V{4485oMlUqwT{o)tv=h!YC0^z|<`)dql#Fh9P>I*$5AT)FaYV zMrkEyD9vUe)o&T$bZMcrjfmewpW4P$=%K0%Jn-ZntM=u*@l0SH2}2a5;e9B-?C|?k zGb7Z-pcJvf2O_qoxTM46cIPXJxWE6;kj+7t2e-M)&Osbh>HW$6ZR?HZzc~oaYS`U| zdgNr9d^2tjTa>zC*@2@!^e_g0u$}Kge2KnwgOL63M@}z-_eWu~_WI$;${o=u+ka zjrer=M&C4HoEywyH1TzIx&S)FP{Brv&N2cLnkvb9XkP)Cmzm*`0(cbm^>qq#+I=T#J1PtK)7wmsO((T zNT-IlxoFs4{kuJ4w_<);Ji{JK^rDij26>1cFpx{K=$5BM>!bN^zOqo;%a%0mflnIh z&u&Ik&(-a$%4Jes^Q_FAbc3`_&-ABfuOjy6qjcV05nbSXacZ_cTf+QcGhO z_EBW;IDmx&@T7o#1pMkay6T;RB3Th?gq1xHIrE|t$B}BZIgTX*dXcjhSlOTHDbH+S zF3D8{DE%Im8~a}Nt{lJq@TMP7^7-|Y_0~yI@MNGLZ^kL^8cw3t^$FO9XD;)sJcn1Es7W;ER4 zItds5@IPNm2<0aZWdMn;`Gt`B8Po7DVdAt;qL1#KO)r9@=xwPslJMQlK*)^BwwV;5 z8YYG#(&i?b)m>5ppILY_6N*0%E(EpW*PxuB=ySinCRcK24-p8E)WdMN! zpqMUk_%+!zt8d0sB7ky32CTgIP@VQ(j}Ozf8kpPEugNF`_pwTA6k%-?^SeD76;pvCG18pf!7v=I>mWvv* z7eA@|rp(8v_w(;3%{SR;qkggzmIP;p&&oN;SoSMjb3T3bD3Z0aaK|aAaAz}+dw5|i z*oq-r`-$JXZHAOH;WOpqEc5>LN9|Si*<6)xUvW%@p<3iOdCP259!zi(VN2gfwXOM3 zm?C5bK~_*6%Of*o8bZL4sU)K3WpAn}T9HB94N#bllK^fXH{M&^S!X zTMPtmXI7P}hVWQq?`y9qT+6}15g3fXHGwN!`AP9cS{7$}`avWZt<@*gKP1A})Q&l6 z2I)|p#4^xq%T=_+_4rQdZ@1#i)1&sWf`4G+%w;3sV(4Y^#DlbyGPy zyIG2v?EubP#O9{XI%Xy}@#G}!sRaARtxUziqM8QYhjB{G{uHpXdH#KuG;gGqpS6v6 z;}Jxzo#KGba5m~CjJr|=_b%jFtMLL$V|_LZMZBMGLiW5n&V$SnwycS%;e9_ob_YY4 z{G|sLe>oUKRjBK)$~dX5zvHOecEdL7WiMnBe9|OuM4?YZw(YQL@Rm&dvQqh7uK$ zmVyzSy#@AeCVnCsHx6RbpI{I1f!(X8)cl*>1rO@x>|k4oYCxN?Y8yoy!iOkdWzx_n(2b5kRhD)3#dy zxo?Xd?=`os`Xkb;LCF>3DAC zaB!JH-q7JSN6A#x;N2~s|8F_Ct{G2m#)n)3ZYnrISO8Ol<~d3# z1OG6;l=xO)a&iHl%hUi>OQ%6Yyb<2k-lii5Rw zJP?SHI1&rpryQ^FE61mmGUDyXJW9FGB9vb(#KQJ4CI*K5keD@K4g#O!lyg9DaKCgm zkGAI=0c(cf$4`hitc|~(iXE9=)9A<`^|F}eG%^@Ur=w>Cef`icakGjBl&eK*XLtm% zJ*Ms*1#C4pZN)#HHxJ~;r{s-|mEsE*cSLOrZ7MSI{6imP2%?B`AN5Jp&8LduZgbn`o#bq}B_D}(oczTLA zceWt5zDYlr4GMO$NI2aNl)KQ5?yT5fX@j(!IZzUO^-OqxTs(&IHbtmln>Px^Ni`P`?Cm`~0d?SFb8y@zX>yv%LVTI=XAJN=cP zTxJlTI`PbyF+gX;6mdK4G6>`$y206VnY8oi^6>0U18; zx_e_!$|B!;WqU39>Ml|XGr96am2W(NcG!8rKD7rQv(MLg&b=LF>p<6DT77wQ(huAc z7U{5QWzy$0R0Q77!eeln60Jz4?U#cz;Jp5SioCtU8!(Y}RICvtQRD$j5{*eOKcvJ+gg|CsH8cVvrk?NWR0^9-K7-DQG}%&T9Q z^5MB5UHIh?m3s6b_lI5* z`8(eERO$~gfgP9UV!V5~X~GR=a8Nc`M;Ze%%D|jG*`32HUog{S)y+>6WFAqWCAp`s zA9YoEV>N%J06WvDvW(&d`W>PUx*g;_o-|U;q<~R5!?xiCQbs^k?G!^UZpou;yokrW zxu<(wlSG$M0`|JG1aHA#QWEa1)97Km+uRMwl=ct~0EnTH`^73zp^$?^e5O#CxDlG&$MlQpWjnATNT-7Jf!7%CrnRBc{mMge}8yj-Wh zR1WyNt8xQ^1k_$$wNsiKqr9$;I$ku(^e_p5w5VBU74uUeF84sNKzps&?37E5~>@ZCdJ$uGsIh#u#iBD@RRZz@FaaNPkJ9bT6Ej z_tXFU@9FBgpREVi2>J&(gOLw^K+nnH4M5`y$p*8o|82_#^WWt%ATvZQ*~G|NxAsh* zMbX##uqLDIkbwe6g0{_9Bm>p^Clp1v^G1wG+d~r`XC5rjw<&DQkslg&jSJ99HEgD0 zx`kQ-yqn5`7WPo8Mmo$+V7;@hez@%9k?6|ETvF5LEwxe?2LsvoC?GtG{^p>Dn;A+c zN%W1O2U0G-TPhQC1?jYj_+8@w6h$Csx#!mmQ{^ab(q||N*q0%Tl{f0#iUcs*zvCM% zC|`HqfeN7Tv8Sh2%*ch2=5pFiG%0A&4?!anAZ|{Gr+$uLP#b9zCNj%o(!M%I<7U%2 zvY;e=g>t)4T$pc$NRzeTs6mP(k&K!p!pJ~&G`qmcduG6Cv zpTwU6HEva2z>08@?zi4|Eg!Yw3)BDirom>qP)@n+P6@0ND+?;Ut`Ann7e4k`XsM-=Y?%yNzaz^Zd_w*ZctJZ{@;KhEan^a6 zNpI_WIbPKkFjx1Ht3*9a&l3csh~aVYv5vlrR%;FZ8DcT^u0@3lt?@){lX$PAMqkwR z*ac`!GmE5F+I*Qy$(4Prus6W+t!M2)q8r%0$#Jak%*AF^>%}- z5$F@t%mJ~iLxM6woP3xjwOL?C_3fONLrh#SP1uY8L?LY#D*EBF5==X7@do_HD_c}) z0|GUFJTwLkq+^*fWYuE=p8WA`lutifk3_TX<82=3+kHIQvU>yQ^=&ioT#K=WwOQUb zw>l@4%4;lOwO(7`*Vn3i9bYIvF+Bo2t28Qf3)?vYc)U}o*Dy?OexLv;0tAxbY2zD? z^}=&8XcEYTY_nR+LAQgqOr(Mq`;F%{Ieu1?3JfI<=Rr=ij8ShEL#^I5_*#f1tp|(w9qj!u z_OC|P*}4R}xU#!y2Gif-ubk;n_94M3Qi?_R^44?%A|atQk{?d2m_ z|8w%=@Vq^?kvfGg)D)?Vln&)FlSpIw*~U1#MBRE3e}xtOGy<&hq{~}l?#v$&@mHrJcp!ifU!S94q1x3&|_loO^%ED2$Sh{OT-qPc|ElbYlwUe z+>jHwwzs*8tIr&tA(!zy1B-YuFYS47%6c)hEh!kcB;bt1I2FqkLt#sU#09oZCubft zeBQFIZ$VDrb)a^Vv7ZS~b?LvK%Xop-(ZOUsQ67M=$dYEXcCGmj#4My%@B5~*A1ac< zLTT;a|61mr%%i7Vs0D!v-yi~%lI=Ws+oXaIBgfd~LuyDxC4S60ch4D2a z=2NE#SCbu>1F;DfaZt&$Z6(d~ek67peN#VZI;FD)#|N21$_H))6 zza`dmxh&gUmh(ET% zE!x=+F(tWz(Je=pk1^r=Y4)lISQ<D9AokAT+CA9ShjH;;ZedhhHn*M5R5dwJh z(y3>N0G70ETX;qXkC43)<*VA*m(cPGvl^QG4(`_+0y`dRo1GN(X&XG}=1PH*0BUQU z!=||OWUmG6D$ra?*EsNZo9@(SF%O0clhAo7JR*bhzPV&6 zOw3)8dqpxaun`^3;hsLMtwEjkY&+*D3@5GqD?>{hjY@yqT^uq_?cnr1vxS*I-}2&^ zm~Vg2A2p>Ns*kyq<_gbXt`DU9mD{Lke7O+wabY>wqW2CB0q&bz(&lP3vxl9}Se6C2 z$x07hCZ7M^rF0sZMy}#nukgbKrx(PrX#OBCM~jSEPI=y~Oa}l#^Tc7IHPA4O=5J%Q zb&rS7Q>*~lBrFPzLOpn9_pshBFank2Ki4`@Yj56D_ZA`S2i>iD|D2D8A zZyatDrG}uG<>b%afvNwH0bX%EqO_7DF9}x+w&ZR?*Q|n@$ZGM$0ql&ch-)>< z66yaX0mwl-RUu!24_`XwPmE2F*tQJ?9Fl%F4i<<5(O+n1fXAx`dj=Hga3-cZI74?AWfZbS*c;3iQ{HUEn?1b}zYrbNz9{K>! z&mIi@BL+wO%^GW#U@sfT@3ZD^Lb7z@27^kwr|&b+81MM}VlG|!m%19Lgd4q6^V}bj z6KU7}3&#>_k)TZj{S&kLCT)?sj%s$rx&?egI@f|!Iwlu}!oCUSn)e3_VN9>E~W*=Ck^;k!r%Wx^i2Z6C8Oa>{U?h$Z0=UvOT z4$WE+b}zWOEKL2ko>S2byxjbOk=A>Ydaox}>CGfVfXX&Qs^A2UE2~0U15DEsiTO5g z$(Zu>F+bnQ2Jm!85$6I%`AY^G%tf?+Q6>E9AU~k?Hq*?$y|X|E5h>NY2jU@`*!HF zI8=dOIWqh;=nG%;e0PCLPf_J4Kux{-vY~b*wfAD%(o3L5H<_~f&bV@>U!t@({lvjs zHzEnL8b^&U%70NB8ZUlDRbo(4r7xrL>d+^pc%LvbU+ftC4IiP}XClHK=eyZDBzwZE za%-{_ya;|Buo&UO7rJx~sz3CPhNkW*x?r76RavPVtUfrc35%Rs83L`1WZf4c{R2}B zd>Wb0ARSmmFa1Ja!GO45hjv7z&)ClQKUZScu(t}vw?kG5K4(phg~!q@yxxL;3Av#7 ziLyZwGK&sdBh4OJeJR!Am$rK1)nPG@-UZUKCwc;VG@|bT4QHBcn6q|mShT#CnZa2L zkAFMgS78TVWL@JE3KGS>bnnkngV~@HpXtJi@uq<|(Jg8h`|LZe4ihCpc z?=RkXpc**1-`|FFM`|GCl4%rYYtM)KJk`KE|CRF}673QhU!O?Su|){|xc#RtnVvC@0GID+K=`)u zSb~K1MXt-o8gP(N6*UC#>#@b=j_#G~v6*|#M#6wtRDX4)GA$QHuEReL8A928FoyBi zafLs^Y>Kc9+Y;au(NEX4g|Jxt`vlzH%&c8@ix^t-XmUCn(k}Ot7>Vk)BnO^#9b@Gk z^yq6%T0(8CTS#zYh_YRxjZzC+Of`M2`&;w@ zE;bdEK-iFAyEc2<#XeCqBn8~C1X{`z*0lB{bpE}E&1aq7!o-BtEKHXo++2vlWe&`%BKJk4qGB=@`%bK1DBdHX#69WmM zJatRFDYO3-0tPbN2W57ai*852*St6&Mmuw0y0P5d*NDL>+A%}o^QmAF+=A)D#KsqkhoWMdF|pNI}aXtH(T8lPD%%zKTFAHs#Akl z>!hR!TUSZJV~kRFo%c{%#1J6uK~e$}TZximMP_x*>AnUk^%U$!df-wVWsXnZp~^<- znMF9k5B(Sxe>t0G4-uG&RKQVcmU@Jo=3LaUaSA zCjpBd%N5==+35Gd;8ShE7|0i^yRIKu>*tD@T%bwIfPPXo{1M~s2UUMZsp_i9zGo!; zaY&f2HxR9xAMCS@V8Jpzo8cSYuw^&OoOpWh3c5uAF*e_q88YpPYtiGYc;|t!(;B=J zk_UZe1I$F)ytI~2g4=pgAHeDu%qb&Q&mX+K2p2$Vr@^bHB2JwThXB!fx|IY?y^;UI z^-^`{s>zPffjaaP|J2t)MY^J`O-RBR$K&SL4 zI&hd!(`7HJgK(i2rp$MhF-}qiZ$R%j0oe zDqEf;G`Oup|i2 zCkahWSM2DPOuj}_dqu_iG|8Mqe*+L!)S>{(9%&&ugZmuNVtcdh2aK@n!7hcf9t3n< z%iap+Zmnp@v~Id&V!1k?U9|00b8GNaqi}23D~;R)4AR*=kR#cqOrG3Bc6oR70aUAN zZ@iBRQ5 zY%WX}Z#MLNJ25Wwye~$aO`jy1MZ1BLkX3(hLyw_Q}8;YQaJ zI0&RBx%^b?bK!fwwQ=gMCFELW!-<@-!bWnoW3Zuz0)X z)DPNtuWG;dQcM*?geDoo{18#J-qF9sop~`vOa`70C$r%9NCq{MW z?uBo9j}p?sxzVnIPs%)@!HcX%$;Bez&$9bGr5GCm%>NzJ`k+2iuR$6*$v3m?wJnqpUC9?{&>hHBfIjrRYB%-rj?u2y@n z<+^Cr(1!3fM>t@D^F^Qlu1v0y#E$_U5{UI2*|NxmpJjA|i&;yBW=bOL3#L zcHeFG5?gQjlFN{>k${IX-&|vzJEn%fu!V!?g0Uc95Hv#SX}*3aQNCB|lG`*0c9BeE zCa0i*q%1t%60=3QX6#kIj)i{1+}})%Q$@G1`y@8I(371`D*ATMUbWiQF@kF8|F*;$ zCGkpLs*J(DiD^3)gU#ePAegTQ4f|-X+@!q4Kc_+V!0N~;3)mQiGa6vY5C^`JWLO|} zjrV7?L}EY$DicVdo!fbqcnzkCgz;Y9TgQ{raJMi!Xj z26Zh#{G$8LgX`QRoalBvyl7q5=Hio~gRhg^)us>(Ci)Joe-z)!65M#VO`s^dYg7CPjbGd7K*tBd zZpGyO`8)+m$__$Z_QDGBstWAUJE;4jmbao$s=90a*R){wzMrzJO{%<^ZdJwW|#Ca9cT8v#bQPayIcF-ZVqGZ zZC)<%Qtgq=YLT5Pv(AAQJPG{>F%?az7m2gnY_%Ya1LE{H1K_Ab0=nnvod>r)esjPG zl*D`sROVI>VInQzJ>C9%rP*edX&U<^>b1pKAQSN*QvC1J7sOA~ea_Laaj+9x;%M=L zD+CX8J>XAz#@7_2&fJ0rZ0trO;gJb@1TB9Yh(hONN%}lVK2Ud5GQ%!3saCgq+i<&I z7&S*-c2p7@z*x7idAJ><*}pH?F*um#Fa~x}hQ;x|?M%kGqUIBa*@q zBuP$1?n4iCt0ngT+_DAYC-I@hK7X`JLlZwF{vHVPHtTaq;cLMrhKbkiNjlr2&I(IW zj7r28u16rz#<2!pJkze?r;!@`!$S#J54>-b2MN6_#Z2Q<8^%;F{^A$k?^4n$wpTbG zXjh9;OQQ(Vc}aOj?qklTlo86Z%itMo#m59Hh~bQmE2Y2t~`O= z30;EThyQV1hTMi#GTX*Nu%3+1*`|x{DYj}MdQhppkF$XJw%^!w3{s%nOl~kRuxfWU zN8O>W|DpmTek}dzkostwAM0rTdUfhJZlK6xRlk!5T8p+at zHY`Pw3HVK3utk{D6|Nlkx$Q}0Vw0zetG%##e#{&`BdHHMCJkrp0prBxnK~tTrAgO6 zKGsYu3)y)FJ)lwF+2*2(8Yj_*^mnk9>ofG*Zd-BHDIdANXo2`Jan2R{15CTyPXwS) z?m!+m0{{gm{~?)HqZrbmI%4g~uy}So9_0O0bF|6nPL~OJ_m$0?*2v%cKbEOHUK%8W zJdPEhcjBd0A!oG~3vXFmC*E`;mu!{ieLPX8>1c*cfub{VGzw1@wqLfIGn|~}lTf61 zP+MMl_BdWHwun>DFYk;(g5HOAg|JE~ZYgw=g$>P4^Uv%hbwK%Ww5TQzT?i991a zqLe|4NC#pIIdCXgJHYC4+ZB$foNxD;jx3I$;#;>-OCqm`g23mM)dp zeZ}(`P>?}210I>L2IQf#YB<{U6%ej0HP2?h6lt8;&Y+dw!6Wtd0!&kgISXx(Ascfz zs0w311n;k93ZFy{C&JDVdUI8g-Yh_+*O6+}E+mB{7WYvE*{ATK-!e@`eOsnKHNr9p zdtvU^F8(te5e+PNG&csRlQG$eK+#nk!(W&JqCLB=KyC_W@5{nZ=axo{z+&dUy*|Y&i)U;+p3yDei1kj6 zV7O{#i?(61-ybF@Y#mWf&tXV#qW%Z?>@_hN4ZRz!z^Y?aPxm_XCo|_2F*G`*PYIKG z2>{SZT2HVc2pbz(z?#5nuR3>RH2~^Vf(?#8?iUzC4#Xp75bi{P#aPp|e^iEw2H__C zE#Uu;95oPVV^izM-X6kbt6za8xd?JqoV1%+-O?DWMj1_C_34Y$&bMdF`-D5-BsFE0 zq;FJ46)^Km9>CX(ODmcLt~k5`$WeagBU zz%d6i5J)Gh{g|0KnYrd+X#k%=DbSvLBq{jwpUCI#IoT9rSCD+W3va{ma=0p~w%lry zKhPgO9A3+KWuw`5M`g}Csn&&puc#mLNg6-x#kyyk0%D=qbd-dfol}lGkHU9IHb_Kl z;fQ3<4-T^hl>WP3LO}q2;khQUct0ur6K!*?wr-q_4wC^-i`jEj?KA1ox{$}xG0ee? z4xtQ~1i^itH6wfo^FY*3LK?Qc;~|pEf{}4H@;{`nM?dYMSyb$2$Xvn?yaD;iTW%?? zZcB^1hKc#f!i7l!Jl}ydDPm`69=dbuQa+w{q^E7qSbx;!sUyf@dg z{?P*tF`B|&CV~N)Zn5rTMmpS(#5Lu?v!*}WRk6B*QRG}TkkX0zDED%ZHlHy6{kepy zGT$r1$MQpQPz^BzZXRNsNHvC@N@7-grfc4q>RwEzA4n9<#BwB@v zxcn^X9uG#yQlC1%Vyi_XO(Lw6(9#EX5tffe=+%c!UERjf7WHf!HUfF*rvpaJQv+c4 zVtK|(#~90C{kK~l9K~RrmwqG9+dG|p-YjvFx9Fl_oe6rrAyjBpP;Z&T*Pn76iKn+R zP}@8fChHcF*DXx2nw6Y;yECQvp))^^5;v=GTp39wwWVgfxf2ngb51&H)s6s>TuPlT?gr5{7+bU2! zP?K#1rpF}c|0ql5e9y-AuWGOKNQ^D+$c^C3())y{lTGSfcYMk;NudNb%RVUhox3Gj zIVed8E9S6WECXF_G6c-B_;Vy_U5&U1`CQy+CU?|<7WLfM{ zu%>JxYoU&pD{s&-LhQ%fWox+=vCO-L276K8uZ|<|zY-#WIf;J6UaHj6bWVM}^@r7C zj-W=TG#n&8b!WKzWRc}brA;t49^?H^P(g7-M2SQQV{#B!jH@_6Wu1OCz!aDlM<}O^ zyWe_Mwzf_Sw|HV5E2X}*e=8VlZ-BK^tN^;p_JeciLaTV?oz|1`@O3Ha%FW%Pb1cc0 z<1Av1tgLWPi%hi41%S>r`b~>+5xZ+b_wRKjwyC~za4^^w5E$coxC_Cr66jETOoi~O zN0jT@TXG6+=*kS_94NSqlm#+b!m4Am)b29_!bPFH(oxx0 zBRa)D;muHWrz(-i)}>`3i|g3WbGSjj7T0Jn8=%G_K>!s@ks+`#4Ai&pBpO$|*L!o5 zVkXsPzwKTHzaN(>H;iAvHyv3?CY$dOmLgi!2xQ2Q)|DrFtvk*JM74s3o~x%n=j-e0 zXG_(!S8(7Z#4zzeSwD9uCvVB#-5O}BvX#fN=bngI01g?dpKDda-whA z?JOj%dccJe7QT?Z6j`SB{Wjah2(RtG#H|ZzS zpNG0aHvXIWte?yp#|Nj+Mtx6uNqo0iQw25}h=XSq-Fa8&OtadL- zln$MmWMcN1x=aSsxMR_5C81L{=#t{L(=2GWsg^(+lQ#=Z3W1A6cos`s)|!jWWyK+K z{Z}kUIt9ZGjH2G%*E#>e8kwuwk2aVwoSK%12-Ytsp+0D-PJKgS5G`@Qk$ex;=`%i7 z&H}XA5>RKgD^8UT$<|~+Zz%A}VpT|wgfq9e)jl9OLyAs!*0pG6J!9h>C{}YY!X3=d ziF91aZi7f~!9$*S13$e($0*j7Ep?v^4VOR%1wlMvWD&SpPq;uayl?D0erJZnJOb`$ zkT)Y#R^Ft|CKlZB3%f;D^m$u%XF#90Y@;hWC$|f@9@_LXMJ#fDzMky@Fs{MgC<`eb zx;X2I_vb+@WQqrDb@eEg!(EGY5nTf1#Qh&4Fu-zvK9c}DCOIVd@6)m2~W*J z?Wwondbi5t2v~KH7?dBJONA2*KunI0ndreil=}sL<+yvV58+ zDI(3gl|L(H5!925u<>OJq>oLe#%Ta*fK?}EcG{`+Qib{V8twA--TzNvFek)bOdCj$ zx!9MmG*IVT>T$3vXKz|>yZJf2brUJtsgy;wF9-t3TS;%kt;cMSV>K(#jrdT!U4k1! z*gSi)jLGB3=U=SdC$mY@!`qFY`+YDJP}Rjpc*Q~p?+Bz{%xIk^VPs8xr_4{y(Z%i zuPszUNcvein`Jshs+}w~4;AEK9)$I1oap@p2*VM(FHTRd@$S<9yX5|yO&+rCyDh{? zQGaXaLH*iI0H29-pG>Z4M-DGpa;6P}z8*G5l8}`XPnXyYi3w_~y91z1@*zO+NjLG? zVbe%qJLSK!s0}6pSHhd1pIB+UxBbC)z&|jw#4swzXarze#Ik91T;1pA;`FTgE$WL@ zrbxgX`32txIHv;93QemkQpYyZFri=yd4EzuUR=+PoJ5{4Vb1HNktB(1Zfoal#LOD5 z2^qH1^jdc-8Q$M!qnt1cHX(+goGVNY0Yp(B+O5dKhO|w;e~d*5xb1nk0trBSBNjFP z7r;mQ&+6VLH{h6>FS3FP4t#?N$S1sH)`&H;s%lVY8#=m~-?oCJabOw+UB$00q1RxH&l1(h^IGQGyj1ef_6t7$e0X&YEdsR3eW$heioa^g%K(I7|xM_N0cTu5qX( z+6-K4JXJjq2fYXLr79i>60J;f}VCH>Q*r0DUZ~ImCJe)ct)_GnG zzivj6B!MBc$B}b!Oj)&P&pF&26;<2U%9)wSpBMP(@Yn^t^D)P>$Ywy8V0yDdMM*aDw1v^D9>2GYs(Qch@yc)h03i2&gqM>&)qPLtN5qa@)FQ~-rzxZ8b zv;!ppqi{!w{6QpW29}ME7MfYda33LQoC0q{vOtW01^ha#rO2d2euHm}5%pBmCjxii z2MzDor@l!(M-A0MM!=SL%6OB~wP^I_U&a?nROAIMQI&3_ZL05(LzZAcZ#a9MF{2S=_RPZeWyjyY-9mfVOwqDpU%zM`SxNlCq+-;S*7EgtV{`W9|DwbvNWFUk)fUVtJ{NWBIz)3=uhsllEh7%-obO^j*u6Kj#y;KpLO$$5ra368ay$h-;{?+j$WYqFX zQ&9jT%4sz6Au1T$je~h$nfy59ClK*Z9iLG2b?xp2Gj&#+lD`Kn=N4?8gLrb*IbX#H zuPn6ftUcDUvX`OJi?xpumz(}5mn$VwgVNW%=)&}BgtHb$%U7qQ8`zZUUdp1yEUjZO zn2A+JEQ-rzl?MBT$F-2Q4T%mnwWSay;OgA<4WH$e7e9AUVbYkHQFO6EJ|VfbeD#sz zF9cDj9NeoddKWaL(KhxIyf%_i?P2?=6q>X0#X9TIQ}C*jGb|BNc+Sza0a*r4Iw0$%EdWo7?xIdzQn9Av)TVw=hjRFQTAKpYbZ%&#L7U`2`iQU@)_K7% zdTt2v+qo52wUA_T{w%fGy}lGf?=8xJeSL1*`l1j+XY`Y}9Fv~k?}$Ru6stS&nRcU6 zWdNhtI}&s+SFvGCxdG++X@_>~E%_HEgg1fgh&$0G7H?nw^3e*rAS7gAs!5Ms*Yd6o zZq$^!=POhKIvi{mBEuu0!%emS!w8~`F1AguopLrhBcGR7lfFcw`0rpg5a2S@@^eGk z^~blh@t|5if!n=6(ZOkMYr|xZi#o8|PISe4DPzUGtP}OQ%2UwO9N;HAq-6y~NfX;V zg`}tpM`DPv6JU2k1Pm6eh*<|o6eRuro#3&DNU(svX>3Xb@e0{*(1v<`MkZIh5SQF| z+bj@03rp=vgSPDZO|t)T`NS{Z7h`GBus`%!mj+dwX zNMpUWr)3tEBy`Y#NgX1)zOl;#FXiVv^cb~dBh4d{$nVR}#$9WIv&atTpM}M~-evxz zB3_6r394x*x|voliA^(eM7>hK>+FopyRvz5gy^0uuq^kv5KHF2kT3d|10omq@F ze|_v&9neS?zzYx5t`&Du!Tn5?>~2;~yRz%{hQr?1jbk>1W#l^(sRB#6abW!50L~8E z5!+>P)+LHty8jcapzeRv0x;}hum+Axp68Lx1043!hA+h90rvktEcu~M8W6;30+1DQ zY)41bxO}JzWsNOcLMDC8AZBu5p|MRB^E28#KCCecL#kdK7QMNvy%=OVLDlaWFtI5O zp)+-0m#gl2a;H*6OqMIN6jbns^VU3KBN{KM>&u>cwn#1Vh4s?$q7mGVzHL!-bv?-# z?E?-Dln#WVDSzq41=BABhB*&fdB0a92FdgfXdCPloJlpc2bXOY7+ZL=ktDwq0C+1P zrR{skSo4>i=W+!<&3c`R`9} zGQK{dEaRBh1^p!D)5ADXkZ?tcn2@p5VO?(?tF#tWrCI^Gg;f#at4Er3$zH9~??p7m zmOXaw>;BY5lb?d4x-=h;12`hfg470zz$plyvI)GpTahLQ(}mb2dG2ZF?8Bz+byMtI zNQWe^t+Rim5~2zTUw&GfIRVa<-*6tZ%_0?4+h6 zdS~ujVhgM%Gn8xCmW+>Flg_TiSf(X7@~6AMEc@5c^4&o}t9TGbn^tOl%69_RUat#- zc2vg)&H-D#A&L2Kwwjw%v%YnwGxsj>RoRP70ql2VdKa>atjV%WCmx~rdaN`p75>Ap zn3%Qbf(s#RqWzQ^&35g38I#O~g9C(hPy~XMOgeW(;h8y@x4MxH%D`~vS@SEgu)pH6 z3zCA(3zG6&q`dJq@Dbb@{V7+YE`g;`XqNzjv{tbsfP(CGa@;9VcjER&FYi=Bc`Dh?rT{TrSN4{m+9WR`U$w&0HDQvE(COOM%2(Vv|Jx?|C!H&J1L4ss%7)0Da{&rU@pG+-u9`EZOd zKItj-Y&qUHX6Vh8_FLMcAR;EX#~9mSdv9iY>5EgnTHjXSEk77ujgpA|gcqn$Ip%CUBaq5_67OD}{d%@zeR;pui~gs6gR&(3CU8mpmVCNt&fJ>*3dIK)a+ z((@DF6gwrYi0QmS1TpH+0K(2)7}gbeT$j zH`&k7mm=-8qceTk?qC32>DGH1dyy`fC9}z})g;+VhFjr{6C^$hgBp`rqRM%vuk1L< z%PedJ#ht+Ak}|j;FS+bc2$N`dV2*_2ix$LG12|h}Jgc8PF@`}FF0Ghj=@eCPz~L%U zw`}}tJ_XP}1~iT)fP0LxA~}QZ6&1q?03)!#0(AWX=aIJ^6X#W@ze(i52wcTTfcmVB z72MX0{KH`l*I@W|;&lM?u zvh%K~bhv=qM-U1*g7M-^r-WxTD#b>BtNnA&aoE+iVDK$*c2;h6H;{ z#N2COnEtz0JoWTb-1S(`{VtwQFf#VC*O+`=`_Uo^3mIEJX~y(wVuWn4?$w1gI_nFUSena)5B}^J;yQ1%cS2>$`;KK z7H2Qdoi29P&ea=fH$1F76zl8;&f_Zd+GO1Wa zSc#@ia}|VgszButUAV7su$?%YX=%$t&qyka$T_dX$L#-8R5j=D%T@Fmz_?;qIVPeU zPc`*R#OY>n6BZp_4>7DX(4uf?_BL5j?inTu`U*)HC8f>TSGJ|T2;{xxykTYl0+@wS z5_eIm+ps@fJ6h>@sdyn(PxAGbT_V8s@KGxo<6A<`jyyTqdlPfOfMgUfC376tm0 z*TVpXoNHu6AIHZlpmx6y#?s0lfr5`!)ighZe84m>6}gmnaib zP#-1UO|9hvm%tNm!3>$z$)eTUbp&x47f9DxgvEp2y9Vk3fjWJ0W9t`QhI9IH|JJ*A zZaNJCcu~!( z*iz=D4GH`GW;#uRnAK}L%A7V+AQo*7f<3Nypkv6qI(P16p0wBs+rz!~T5gAu8@VJ5 zNVSpsN}*pzFQb={pOu8V;@f45Qm$x^h#zjl4Vz~qRcuJ}PBZtl6=g~=K;2yK@UTpw z5d0Hh_ag#|Dz{-bxn&rTjRgipnG4eTfBFmwreIm#kPKYD)$+CpjAGlidgj^k#ww-#_N4@0`I#IgEE+xh-#yb+kXFx{7z~w{+?bpJJb_#hGqr@*KPBN1uEZZjH#70Rw?t&DZ|E#@ z%rJ;kzoUduHFeoP?9xRq@ADK2$k)s}-3Ub3N;Uj|QU%e)j2Aor+YHlugW=}BPxX)$ ziT_6UoWD{E1|WS%PhE>(ofYj(6V?D@YR}opS^t|-9C5P*7fq^fX)Dn0L#}|_`^M2G zMwQ6`!*Qvxv1)k!p1H5irhO)8+`CnJNsLT*9~~H3I+b6vAh6c!1{({XNlDN(jv2nr zEAM`DC=06%>k~>}Fz@q2NRaNDL4A$N5e!9)4*ze*iKLldTZ)mzLn?3u3S3MlzEQN4 z_0%eqip+f*;VP>XtJ-Wu^rkCATceEw8B4q%^m--_|1m#6f9pi|m~|wrfoh#j-_w>c zMR3zIq1f*Db{nZ0XLoc|#t~G+SAOd88)*^It75rwpPUA1%!hR-4JtgD(WVPU0JB2) z0>XguUv#G1!)CoOYBkdxO%tplWz$tlOT+5xww#+u*iyoz4zmJLysDuF;#`c-dnYIK zuaw#^Bl8ekh(~@~F4k#F?m(>nYwOKgxa&^5pASGk-lT9pE+qs?td~$JHNJFlrIftT9x^}exOSF_247dM~~uevrx zi7SXmAlm#%K!Zxd?oWS0e_w+Hyo^XUQ|E4$qH3t$A)R5~7yhr;)KaiF3#$c&5b`yg F2WG>LBntol literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/workflow-pachca-node.avif b/apps/docs/public/images/n8n/workflow-pachca-node.avif new file mode 100644 index 0000000000000000000000000000000000000000..03a40c53d6ef6e64281ae040c7d3677d68247e88 GIT binary patch literal 49269 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⪼;~UnI#N{-zD*(S0KN0K~(D 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 z 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�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 AF8}}l literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/workflow-trigger-example.avif b/apps/docs/public/images/n8n/workflow-trigger-example.avif new file mode 100644 index 0000000000000000000000000000000000000000..566cd0475e9a4d5342ebbef4d365a72b28c6827b GIT binary patch literal 47544 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 z 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 EP&YFR-T(jq literal 0 HcmV?d00001 diff --git a/apps/docs/public/images/n8n/workflow-vacation.avif b/apps/docs/public/images/n8n/workflow-vacation.avif new file mode 100644 index 0000000000000000000000000000000000000000..3f37ce08347ffd2848b661418b9a5789596be3cd GIT binary patch literal 56706 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

7bX>2$!kC}e{)iqK;tx${ zlN1KAS9w`S0c&u=-AR+^K&At9=%>-;!cR>S+&)GBZ9@hTKj@dZ*O4DfTJ>h4e`d!M zu)b1RwN=ju+{LTn-NCAb7a3vzfm^O2KYqlZaBd<5-XSpbAu;Ekxo;-~BKvL_+sDjP z?5kjinlwa|;rOEy8T_8sX1Mzv@?W=7`Ev*Dvp@g+?|@4B6x%qOhU$zooRtCd8Rr`I z{SDS9zuf88b3)=qU*{wDLqvLzeoWL^!R_2UW0kY=5>x-)1zvlOyPXreuSJb;tRCx7 zhpiymf&=H8i{}mb-*^B3B*Xvx15`R4#x6%XtmEU#lDD>OD>!HjXf}*2=sW-bxid!% z4(LtC^FT*E-$QhKU+UwOS-xBFd;2$WGD43)=dzc({OFJZV@=^ff8_Poo&6Lcph@u( zNQ1~jSHi>K7eIJRbB{D(czcSa51LRXS_Zl9a) zQCA)P2#HLxLc;%{01+zyxU^~m(ry$jty#61b_SC@1tM3=evaX(*6|d_V zR6=Z%mWzu~YbCYzf7uVNet;s(7#gq21R-*-#n|1s^IBd39&iQ!gAIatc#Jq$@GfMMy z&}#bSp*=peg}~OGmU?h04zR}<8(icS(jOp$#L<1l_mt-9@7OF=Dik2?fWn6=-gxGX z9WBc4b8R{=pS(3o@Wq%%$LIW!@1AqaM zw_AeZui7R2A0Gy8X0e#+(p_onRl&H!7;va+YnvK<8jrDrSwk{TF|BMWW4xUSQ_4PD z&mICK?UAmV|G4+rWXSptwlL{hPrV>Ih*8m69men(R8n+62cON0XEciR|jJRL*ub59D8-k^x0wnptcQg{;4}jd*czAw7Sb>Dw9YgS2ms z`SJvh6#ZapIJ|locQb~`AG1OC@lrhHa89n5!|1h%I5o;N_SL1fG8{bjXIZ5^z<93A z8+4$>NfKiv*)d(oh04s+JWAbKp)~Vt}n+8}@4U+TB#Qraf}dl@4iP?*3c- z(7~QjrhVDvg6qLoI&nArvl#90amF(tD>C$Nt#|`>k@P$1GTMK&HAf}6M!6qnkfSR- zA1{YK+hWL{z+y;4Q+(RuwaAs>`R@25bb@2>3ekslQX3Y;!3kFSj8#}iHWcER&uU00 z1lUG_wLWClg$s@4KXA%KR`i8^TH2phZ6q-oqk@)wbu64N_+{C}WzF{{6+FxoYxz)>XdYy9$nc6SY-y@o*NReJf&Slk z6*T)w=Hn_uRZbH+_Rhqr&zv-}6V3l-wgAXs`nWP3t-7Dzc^lZ0l63@G+nb!7JmU~c zpeWD8=w_ZW-Ey|!2U~ZfweAXW{jLQ1!8&iu9y6!xUpg`y)Y~e%4YVpyRsy&j%kkKn2j4R=$qd=7@WHQ zQU7+*vjK7N(uTefXBbr)P|<1Dir1~@Kw{|E7PQ;@F5!$LdQiylNMMX%Ib_^x(5*B{ zeJ8<~-Y4){3PwA0I<7nnzjxsfofDG)GySFcQ9|rQuVxGYLwIq0f&? zz+nv_x(QgK1o02_MkN`eK?R`UU`8P7*MO%kHU4DiHjHcKYc!`(m%7z<6udDejfMBx ze!p-i7g(YM@sZsf@5RE}C|c6oO*-S%V&_^!aziAbTjqD}ykqBiAH86q`G-=-h1>uP z1W=6W=oQqN`TFhcw<>UnvM_jWmHRY6{!o?95(Y;);UV$*W- zBbrwS5{1IAnx0NAi5%1KI>aKM;rvTl?Ou$r%zGx5A5GdBlOkQ8939;*g!kQ!FyL)Q zJJf8mnL{mDRR8`c5~)z$R$(b8b?g$H``Hcy+i0NpR%BLTv6h= z+>uqsKq#w2ZKy!V#_Ya<1PT20gWo#hO|lxRh2Z>nn#Ba< z&)H4?pJC_S_hl&KAl!4~E*tjSA*A-iRE>=!ZDU`$6A7~_p!~^7n-dbfDg)k+I+3Il z>ZfnJqPmw)%0;Xn;`OR@hZ(apG&A20+fi_E>Ueke->f!NA?=>k0V~@z!JxH z&yr15fVq3U*f9T85?OTB?c1!S&%j$MDzAhtn~p2!WGzsmvgvWt@ zelU~QwKYbzoFtc|<*ppk@(;W5 zde$b0;T=!5r_P-@DkGpcE{#20f4%Ly(g=aSX1oO?<}-F0LbxNnwbm$ht*ePb5ElGA z7Kj9)`MxgvVtA&^sk6?HA&3HbDt)u@Vh~!ICA-UVrA8W?D1N|$;vN!n-u9J(%8-yS z2n}v@>iTG;j(bcU6q$IcH(q2$bmo+5fw;vV0F4w660QA}+kZMQs@f4G#@tWJ{zpb< zj3EKL(Zf}nnHI{ik zKSC|Nz`%u0*!`VjnF(ezcXuMRQR4Mro!G`um%OEAM9>i&6f;tC9(FOEdjT`??^*8{ z0Jug%FLIwTr3iLXsXi?OmJLj3VM;JueX!pcxq}eLne7M)q(AzOGDH+k36C$fQt7?6 zd7(|(p+bfI^AL@3HBC=g%y9wguVD!WXt3Eu4)c?*ns8)H+~$H_FgeK zNJ3AlOoUo{6S(2dzRGhX`K-G$;aet$lpRQcSdrD3UB9ywgG2}urxL2$fAH|dpw~tf z4M9A@urJ6tQ_48}OIlvzIMq&p21`ZC9lQ9$sKco+wQKAv&=7iOA7?hUspA=XcWFmr zQqeKmc9EJkdRuL&V$>p_4+cxSU-?-!Jr4if)w9?WRPexOE5UR%%xMvB0 zMPlu}R%D5%+utF3OL8Xj)0JqxpWFZ}+hg(|daUxE*EaUSsvwI^w3y?wbnr(Z|lQJsZJXX|OM}4prVZOY6X| z8$n|;e;esY$~zQ~A0`QpvR4t!3y??=gKi0HHDC5n(2BsO zbjCOe`#O$;&icfHLRWF*DbNGETL$Ajpn@bWEY*5sBwJlnU9>%b8sn zc@H+-R!lLg@&}zI8Y`RKM!6kON{uIXQ z3yhXBZM-LDN-f)zHZ8sbdE%QHoJF)Zq*Fdqp-PfaU;ao?u_t1uKd@5vbwbsFh6Z3pt1jPKRNicYMPH6wfPqj3QK9mBL_9~;=f#fNj9rXO z<1*_8SB?NF>q4V-Znx6#6YvUgOP~fNk6IvbX>##aSYKG_cs>hR^Di%Rq2T-7(1tbe z4if4W$!a1^*uEwUfbfIFI;TT3<_|?1RpmTBBs5Rt5W#u)4xjgaSVN*ZvALCo|xhLd{yKG&80l|)n^fnAoe8);+Ki$M*Y-R?_M)96|Q?yP)$ZG3-PN26|pQ-ssGwr67R=E+U-DJ*W-#0zB-s6P(|76uJjbF zT4vh?C2l!D$ef#MYgz|Zv9blA{4)y=2==QL?4nzBcP!rg4KwsLNGbT)159wVby;x! zu#D?Hu=})hvG^*ogR8oq?WcEDToKQ#mE@+Wueb*O9Kf?;ds_Oa-RD=C zCxb0y4&XCBI|4L0E_}O+SInQepUS3k1d74#?uK2dP;vqx9qehlAO)x>`6r|Azv^U@ zJ_Rt^F@=kZ8xr^P8HC}cGej(BkK0%QsO&{7%}YB)vHEo%-yqmW+ha?XP6}jrziWCs zkd}p6-4RV`wSZq=5Rmtt`Qb?&;O@hM?^0sT;FONw-)$V(fu&#ioCV!@_Z5&$!9EmD zN#@-U21S{tCHz}y*!k@n;*}*k8D)ybsS0CRx%nz`dh~SY{b7wIF0*eSefRkZOJLkK zP-P@Z3Y4F%BgdSCuU?+1xXAy^%=|=~KW~#?&&TM{0C#OJ9F|J^!DIAFcA6zn4d%1u z0c}-qo0s8@``>}y66gau7r4i`Ez0CJ^lYw9aOG(_h9Wu+BlpfQa##AHswqc0B$o>{ zl@wv-xJZLP#Im9;1M=?!)O3h<&JCE?|L6JF?+gO4SJL-7js_cHDon;l&|kQLZCA|_NRs&M zgw>)wb|r`nEi?b9TYvw|{{1zMjbg-!l87t=RAh8eLViiBhadO<&qP)DH9ze-3_& z0XGAD4DS0ls>il0*=nnBpv^n+h!ZL19;;mz0X}$Qow*8YsOyl;Y9eP43%2M=6Unw@ zS&C-P*MVy~8ope#wts$Z&Pt1#_ZlRmZ7^Xg@w2CfnNC(`$FfWyN6V2~c8%_7dD6X{ zyM%CfFXs%zwBiAYxXJYJ4W95J73%y1ah0bz$NHzoGp+DM+A-9P7Uq@~_r;Aax>_rK zdh^Uawd?-_OviwmNRkns>*NZkxVMAko(lMhNFzV zD8LjvO5%O~+1Sfcygl{PgCpq=CjkTY2mlWo%U2!^{Q|gE-Vwb>1ry5sZ~M0}W9sOg zV>RaJl!k|Nv^dU)UK+M=9CY_N9)fQjxHp{Fx(YZAtm_E7-fkRX@J!DuJ%wh_ft8B5 znp?`C!X}?;r(!S=xv1O*tmfrnQxzPPLk$W~wTQ8Dj)_oZ= z3%Pj~M5$4C(&s0SbDy~i$itqs0gSM~S!kw}++VMomvB3s?y@D&Bl zxA$3zZjQUWHa>hR*u02Z#_#i=9^_YQd%%G?*zUD<^2Ll3c(lEg{`j%5IE=VvAU#+& z%{{%ZGmPOy))-L?m4xOi43cL(+D9D?zwogmAWTio?~+J)CP+lup$K=#l;V=jSw_7O zgSw&SE@Gc1>i;a8FNGjnO?eHnRouD13Vuetb1xn2dukYj`1Xh1JmaxE<)H3l=(+nI z@r7fDuJoQ2^&GdoL>}F+DO6x^r4O~v)T;iP!Yvz^l&FbT7L~O`22LMIN~O7XH>cg% z+Y0^kZJ!C`(BfJ<+9Q2&8q6b?_S%m1Xk5%I6s{*U#7}qHKZnr%oRSfY8eY#71!a0g zo!W!F0q$GYHxGvU&a)B=uExIm|I9sWu2XU<_!~ElufSFIe`0;o4R(`R)pR|GuJn-# zy0Y1>dXzf7kF4H}!}#?K(^WK75a@IFY>~iYN7*8$wnG2y z4r52<5u{Je5{++*Ki4XV?3XYLsGca9H#>aTFjXN1@@mG@Cw(Ql zjG!S%624U^-*@La8gFOn6$`o!KRYGt)fWt}{J@UrqoKgvMvo9qNr^ufiD_}giQ`-JX2iCb6{t+98y#(;Tvqdp zc2}Yt1KZDM*h|UcQwf>ad8sG{7@)xUXVIh@{?2wMF?ZtS1OEZFRyu86@>MF!$G$9x z5pmp^sWhFiJ#;HSuZSTY_`zf%QXcu(-ep-cb4Ysmqya^Bu9DmiYBkJl^6o}Mg{6*- zdW_kPju$d+6CGl9BV{&`CKDViFHhH7e>}&1ri2qci-sZFBEW_Lh=jqTL{gI-izW>yX1Oa{l2$NNo^ zczN`{kT8@DUqi(sS_yd#cG$vG(Ki^eBQmm_zcHo-A#10W5#LB=Ozq>f2UZSh^Xg~; zCcS1HhN>^+N>oyIkv>CFB=|U0BhJO9Q&Iz9KCi<=i9$bFB6i9`G5KQ^%%P%+$}}L; z`2e-`o+#N1n#VgdQatTh{YP(~?_sN?p!19Llau2|QLn2|@U-=mF9VFfO#*BSt zYBN#r#78H*Va`uOHMg9_89g5d`1ETM zx6+ql73Q-btJVEt2?A3%W*onr@=6++AN)c4L zm$QZEwCuhvg^!`VIX28MsH^-u#*M04ruy1RJ3xgmnE(M+c@5vT9C8OvoHG8Mgy;2z z{Y3f-D7iW%S)(b@Il??E4QRVzzyUYpaRN}36jJnMa=`H-WZ4+Lf|+*D|LkOA?2LV? zsJe(H4RiN+G5=Yz#d=o|PAhfh0Y5zgur2Ie;7-9rSEkY7#J%uRzw|)Z_5%Ls&F2iZ zm&R|fvtKm%sdoNQZ!V-pzZ+SyhSJNbz$UmHs)tD&xo$8`&ly()!EAy#}9@fT?NFEqcRx4if1P}h&uNZS+38NAfg zBl6^32n?q;6BD-6)(xAZZB+$ZtaVGDjr}cp-j;v;K%p`f$+84Dootojxilp(ABaY1 zGzPLxw=*poGGTB9Ak2aGfLI#EOn;WQw_(ijeykbC8+medIvqXUI{8zdf1)Z9(3VLv zD9^}We2PViRqMstPkG1${@h!WI-7aP zx1{P0PtDgQZgXDdy;c1}Sjy`P2mJnK1z#CPUbEZO7BgJ<^N$5TwO;kxd~A$4e78De z?)6;=gM*k6R9(7i$#^<=K5FuU0unisfgK`WRpRM=h(C-h_yVx8Ip7oSJJ>KcnPp}n z%7~Vf73CgfRg3YmG3nWl%7ec#{qm3ART<3sb&=ZhY5;E7*` z?0sD!SkD_wiw!27tiP}KTYbUJJBMUkD1912p#LE2E|THJ8lKkFA&Y=vdWSE{)f3YO)LqdCFDeUSa?8Kp4K) zbUhSn&-)q>sDtb3Os9NtF5`fKurL|@O<{T7`_;{Ne6#}iIKJ~3+)31^T}Q(xtZr}~ zOgpANN3(-U=M3#2cqu4-3i!{D^#s2$23qW#H}Ec=;b6==%VY({a-^+2%job$HnKr5 z{;1WwCKMgOWTUy&lg&h4;?_7C>&BD)N8wn0=MtQvhTw|{?7J3mW*st2SJ~Oh@1wrF z;eP6xmUB1*!7B5ILSZtBZ406|L8P_#nJ)|ak7_T3(K;pz(~=I7;SA&xS+(5#`$ykz z_11)3+8@?_x1kRoD3H6Z|E5mB$ zj8PZYx>OYKh()i{hFpica3lQVn3gvD_PBJlN(od4bvoks){2M#fT)bV!lO&MO81%% z1RvFarEh)WhkXHYms_YM7|*4|n7SpJlwYtd)uy!<2@XpxEE8MH2JYfNoFPXYTWQ>I z?3yKzd4WSfhAY|?->5bwe%)c4H(}9bP#lidi+2@JK+&3z&96bImueZ;qXi#wZqLvGUX*e1`EvV0x+AiI1ASx>C zP`mljclQZ1oLcYyN1(Q6g4(VrUPf97T%g){UuhYPzk-u?tAHBEAV9pe@{pE$u!k?R zrVw2!-_3E|?2N0L69EH{Ufh|_*^>hw`=dIxpM@fN*q~wTb!<2!y>?4Me_1cj3H54IRR}aS9I~g#1LaLq;JC|_e3S{ieI*2ku+Qs2^q#j6Q z`|wp^OLU8tWAFnVJ7nIzGFmJ%qo3U>#1Ul=4;*s7lT#Xn1mA~_WY0FI_-AAW6{ReC znBM(;&ojiqk^W}#9iIaGRoWYVpCYeYD{^~cp^{MLt+?uRaG`FiW4bzUe@cIfW0 zm;QEI{CMCw?j$MmstL7s&lM+6GaNM`u-HS%qL|X@UP_v(ZRI0C+x z?b95roQKscO9-;^APo1;1weA0!n}M&E3(eozT|7$)>6*vzCF{uMnszzvG~Q!uR9rH z_%g#HKl2s>>XTK4N`za&vBl
{command} - + {item.title} - + {row.title} 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/index.md b/apps/docs/public/index.md index c0455705..515f55f0 100644 --- a/apps/docs/public/index.md +++ b/apps/docs/public/index.md @@ -68,7 +68,7 @@ curl "https://api.pachca.com/api/shared/v1/messages" \ Подключайте Пачку к внешним сервисам без написания кода. -- [n8n](/guides/n8n) — Визуальные автоматизации +- [n8n](/guides/n8n/overview) — Визуальные автоматизации - [Albato](/guides/albato) — Подключение 250+ сервисов diff --git a/apps/docs/public/llms-full.txt b/apps/docs/public/llms-full.txt index e141a5eb..8351b4cd 100644 --- a/apps/docs/public/llms-full.txt +++ b/apps/docs/public/llms-full.txt @@ -17,7 +17,7 @@ - [Go](#go) - [Kotlin](#kotlin) - [Swift](#swift) -- [CSharp](#csharp) +- [C#](#c) - [Сценарии](#сценарии) - [Боты](#боты) - [Входящие вебхуки](#входящие-вебхуки) @@ -30,7 +30,14 @@ - [Экспорт сообщений](#экспорт-сообщений) - [DLP-система](#dlp-система) - [Журнал аудита событий](#журнал-аудита-событий) -- [n8n](#n8n) +- [Обзор](#обзор) +- [Настройка](#настройка) +- [Ресурсы и операции](#ресурсы-и-операции) +- [Триггер](#триггер) +- [Примеры workflow](#примеры-workflow) +- [Продвинутые функции](#продвинутые-функции) +- [Устранение ошибок](#устранение-ошибок) +- [Миграция с v1](#миграция-с-v1) - [Albato](#albato) - [Последние обновления](#последние-обновления) - [Авторизация](#авторизация) @@ -202,7 +209,7 @@ curl "https://api.pachca.com/api/shared/v1/messages" \ Подключайте Пачку к внешним сервисам без написания кода. -- [n8n](/guides/n8n) — Визуальные автоматизации +- [n8n](/guides/n8n/overview) — Визуальные автоматизации - [Albato](/guides/albato) — Подключение 250+ сервисов @@ -1136,7 +1143,7 @@ npx @pachca/generator --spec https://example.com/openapi.yaml --output ./generat |-------------|----------| | **16 сервисов** | Типизированные методы для каждого API-эндпоинта | | **Автопагинация** | Методы `*All()` для автоматического обхода всех страниц | -| **Повторные запросы** | Автоматический retry при `429` с экспоненциальным backoff | +| **Повторные запросы** | Автоматический retry при `429` и `5xx` с экспоненциальным backoff | | **Обработка ошибок** | Типизированные `ApiError` и `OAuthError` | | **Сериализация** | Автоматическая конвертация между форматами (snake_case ↔ camelCase) | | **Авторизация** | Bearer-токен передаётся один раз при создании клиента | @@ -1442,12 +1449,12 @@ try { ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек -- Все остальные ошибки возвращаются сразу без retry +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Сериализация @@ -1836,12 +1843,13 @@ except OAuthError as error: ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Реализовано через `RetryTransport` — обёртку над httpx-транспортом +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Типы @@ -2250,12 +2258,13 @@ if err != nil { ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Тело запроса пересоздаётся через `req.GetBody()` при каждой попытке +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Типы @@ -2637,12 +2646,13 @@ try { ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests` или серверной ошибки (`5xx`): +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — линейный backoff: 1 сек, 2 сек, 3 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff с jitter +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Реализовано через плагин Ktor `HttpRequestRetry` +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Типы @@ -3023,12 +3033,13 @@ do { ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Ожидание через `Task.sleep(nanoseconds:)` — не блокирует поток +- Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Типы @@ -3125,7 +3136,7 @@ let response = try await client.tasks.createTask(body: body) --- -# CSharp +# C# [Pachca.Sdk](https://www.nuget.org/packages/Pachca.Sdk) NuGet @@ -3263,7 +3274,7 @@ using var client = new PachcaClient("YOUR_TOKEN", "https://custom-api.example.co using Pachca.Sdk; // Список чатов -var response = await client.Chats.ListChatsAsync(SortOrder.Desc, ChatAvailability.IsMember, "2025-01-01T00:00:00.000Z", "2025-02-01T00:00:00.000Z", false, 1, "eyJpZCI6MTAsImRpciI6ImFzYyJ9"); +var response = await client.Chats.ListChatsAsync(SortOrder.Desc, ChatAvailability.IsMember, DateTimeOffset.Parse("2025-01-01T00:00:00.000Z"), DateTimeOffset.Parse("2025-02-01T00:00:00.000Z"), false, 1, "eyJpZCI6MTAsImRpciI6ImFzYyJ9"); // → ListChatsResponse(Data: List, Meta: PaginationMeta?) ``` @@ -3401,11 +3412,11 @@ catch (OAuthError e) ## Повторные запросы -SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx`: +SDK автоматически повторяет запрос при получении `429 Too Many Requests` и ошибок сервера `5xx` (`500`, `502`, `503`, `504`): - До **3 повторов** на каждый запрос -- Если сервер вернул заголовок `Retry-After` — ждёт указанное время -- Иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **429:** если сервер вернул заголовок `Retry-After` — ждёт указанное время, иначе — экспоненциальный backoff: 1 сек, 2 сек, 4 сек +- **5xx:** экспоненциальный backoff с jitter: ~10 сек, ~20 сек, ~40 сек - Ошибки клиента (4xx, кроме 429) возвращаются сразу без повторов ## Отмена запросов @@ -3541,7 +3552,7 @@ var request = new TaskCreateRequest { Kind = TaskKind.Reminder, Content = "Забрать со склада 21 заказ", - DueAt = "2020-06-05T12:00:00.000+03:00", + DueAt = DateTimeOffset.Parse("2020-06-05T12:00:00.000+03:00"), Priority = 2, PerformerIds = new List { 123 }, ChatId = 456, @@ -4430,6 +4441,25 @@ Liquid также поддерживает: - `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX +### Заполнение формы + +Вебхук отправляется при отправке пользователем заполненной формы ([представления](/guides/forms/overview)). Подробнее об обработке результатов — в разделе [Обработка форм](/guides/forms/handling). + +#### ViewSubmitWebhookPayload + +- `type: string` (required) — Тип объекта + Значения: `view` — Для формы всегда view +- `event: string` (required) — Тип события + Значения: `submit` — Отправка формы +- `callback_id: string` (required) — Идентификатор обратного вызова, указанный при открытии представления +- `private_metadata: string` (required) — Приватные метаданные, указанные при открытии представления +- `user_id: integer, int32` (required) — Идентификатор пользователя, который отправил форму +- `data: Record` (required) — Данные заполненных полей представления. Ключ — `action_id` поля, значение — введённые данные + **Структура значений Record:** + - Тип значения: `any` +- `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX + + ### Изменение участников чатов Вебхук отправляется при изменении состава участников чатов, где состоит бот, и в тредах этих чатов. @@ -4999,18 +5029,19 @@ sequenceDiagram Каждый исходящий вебхук защищён с помощью подписи, основанной на хешировании содержимого. Подробнее об этом — в разделе [Безопасность](/guides/webhook#bezopasnost). -#### Структура исходящего вебхука о заполнении формы +#### ViewSubmitWebhookPayload -- `type: string` — Тип объекта (для представлений всегда view) - Значения: `view` — представление -- `event: string` — Тип события (для отправки пользователем формы всегда submit) - Значения: `submit` — отправка формы -- `private_metadata: string` — Строка, заданная при отправке представления -- `callback_id: string` — Идентификатор для распознавания этого представления, заданный при отправке представления -- `user_id: integer` — Идентификатор пользователя, который заполнил форму -- `data: object` — JSON карта заполненных полей представления, где каждый ключ - значение поля name. - - `name: string | array of strings | array of objects | null | []` — Значение, которое указал пользователь в поле (или массив значений, если это был множественный выбор или загруженные пользователем файлы). Если пользователь не указал значение, тогда null (или пустой массив, если это поле файлов или чекбоксов) -- `webhook_timestamp: integer` — Дата и время отправки вебхука (UTC+0) в формате UNIX +- `type: string` (required) — Тип объекта + Значения: `view` — Для формы всегда view +- `event: string` (required) — Тип события + Значения: `submit` — Отправка формы +- `callback_id: string` (required) — Идентификатор обратного вызова, указанный при открытии представления +- `private_metadata: string` (required) — Приватные метаданные, указанные при открытии представления +- `user_id: integer, int32` (required) — Идентификатор пользователя, который отправил форму +- `data: Record` (required) — Данные заполненных полей представления. Ключ — `action_id` поля, значение — введённые данные + **Структура значений Record:** + - Тип значения: `any` +- `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX ```json title="Пример вебхука о заполнении формы" @@ -5243,464 +5274,1675 @@ curl "https://api.pachca.com/api/shared/v1/messages/194275/link_previews" \ ```json title="Пример JSON вебхука об успешном завершении экспорта" { - "type": "export", - "event": "ready", - "export_id": 22322, - "created_at": "2025-03-20T12:33:58Z" + "type": "export", + "event": "ready", + "export_id": 22322, + "created_at": "2025-03-20T12:33:58Z" + } + ``` + + + ### Шаг 2. Скачайте готовый архив + +Получив `JSON` с информацией о готовом экспорте, вам необходимо взять значение поля `export_id` и выполнить запрос на скачивание архива сообщений, указав его в `URL` запроса. + + Для скачивания архива используйте метод [Скачать архив экспорта](GET /chats/exports/{id}). + + + ### Шаг 3. Изучите структуру архива + +Архив представляет собой папки, где каждая папка соответствует чату в вашем пространстве. Название папки состоит из имени чата и его `ID`, например: `Design_12925828`. Внутри папки будут `JSON`-файлы, которые соответствуют дате переписки. Каждый день — отдельный файл. + + Дополнительно, рядом с папками будет находиться список чатов, которые попали в экспорт. Список чатов представлен файлом `chats.json`. Список не создается, если при запросе экспорта было указано `skip_chats_file` как `true`. + + ``` +├── Design_12925828/ +│ ├── 2025-01-15.json +│ ├── 2025-01-16.json +│ └── 2025-01-17.json +├── Marketing_12925901/ +│ ├── 2025-01-15.json +│ └── 2025-01-16.json +├── Development_12926012/ +│ ├── 2025-01-15.json +│ ├── 2025-01-16.json +│ └── 2025-01-17.json +└── chats.json +``` + + + #### Структура данных в JSON-файлах сообщений + +- `id: integer` — Идентификатор сообщения +- `created_at: date-time` — Дата и время создания сообщения (ISO-8601, UTC+0) +- `deleted_at: date-time` — Дата и время удаления сообщения. Возвращается как null, если сообщение не удалено. +- `content: string` — Текст сообщения +- `thread_id: integer` — Идентификатор треда сообщения. Возвращается как null, если у сообщения нет комментариев. +- `reactions: array of object` — Массив списка реакций + - `user_id: integer` — Идентификатор пользователя, который добавил реакцию + - `created_at: string` — Дата и время добавления реакции (ISO-8601, UTC+0) + - `code: string` — Emoji символ реакции +- `user: object` — Информация об авторе сообщения + - `id: integer` — Идентификатор пользователя + - `role: string` — Тип автора + Значения: `member` — пользователь, `bot` — бот + - `name: string` — Имя + - `last_name: string` — Фамилия + - `email: string` — Электронная почта + - `tags: array of string` — Массив тегов, привязанных к пользователю +- `chat: object` — Информация о чате, в котором было написано сообщение + - `id: integer` — Идентификатор чата + - `name: string` — Название чата + - `personal: boolean` — Тип чата + Значения: `true` — личный чат, `false` — групповой чат + - `owner: object` — Информация о владельце чата + - `id: integer` — Идентификатор пользователя + - `role: string` — Тип владельца + Значения: `member` — пользователь, `bot` — бот + - `name: string` — Имя + - `last_name: string` — Фамилия + - `email: string` — Электронная почта + - `tags: array of string` — Массив тегов + - `tags: array of string` — Массив тегов, привязанных к чату +- `thread: object` — Тред, в котором находится сообщение. Возвращается как null, если сообщение находится не в треде. + - `id: integer` — Идентификатор треда + - `message_id: integer` — Идентификатор сообщения, под которым был начат тред + - `message_chat_id: string` — Идентификатор чата, в котором был начат тред + + + Список в файле `chats.json` представляет собой массив объектов чатов. Структура каждого объекта чата описана ниже. + + #### Структура объекта чата в массиве файла chats.json + +- `id: integer` — Идентификатор чата +- `personal: boolean` — Тип чата + Значения: `true` — личный чат, `false` — групповой чат +- `name: string` — Название +- `owner_id: integer` — Идентификатор пользователя, создавшего чат +- `members: array of object` — Массив объектов участников чата + - `id: integer` — Идентификатор пользователя + - `role: string` — Роль в чате + Значения: `owner` — создатель, `admin` — админ, `editor` — редактор, `member` — участник/подписчик +- `created_at: date-time` — Дата и время создания чата (ISO-8601, UTC+0) +- `updated_at: date-time` — Дата и время обновления чата (ISO-8601, UTC+0) + + + +--- + + +# DLP-система + +> **Внимание:** Доступно только на тарифе **Корпорация** + + +Встроенная в Пачку DLP-система (Data Loss Prevention) позволяет вам построить защиту от утечек конфиденциальной информации без интеграции сторонних сервисов. + +Управление правилами DLP-системы доступно в разделе **Настройки пространства** > **DLP**. Вы можете изменять список правил, а также включать и отключать их. + +![Список правил DLP-системы](/images/dlp/dlp-page.webp) + +*Список правил DLP-системы* + + +## Создание правила + +Чтобы внести новое правило нажмите на кнопку «Создать новое правило», укажите название правила (чтобы было проще его потом изменить или удалить), его приоритет и `JSON` объект условия. + +![Новое правило](/images/dlp/new-rule.webp) + +*Создание нового правила* + + +Параметр «Приоритет» задает значение приоритета для политики, определяющее порядок её обработки. Меньшее целое число указывает на более высокий приоритет, значение 0 — на наивысший приоритет. Правила не могут иметь одинаковое значение приоритета. + +`JSON` условие состоит из трёх полей: контекст применения правила (необязательное), условие срабатывания правила и действие при срабатывании правила. Параметры и пример условия вы можете посмотреть ниже. + +## Структура правила + +#### DlpRule + +- `scope: object` — Объект контекста применения правила + - `to_external: boolean` (default: false) — Применимость правила к внешним контактам. При значении true правило работает только при наличии гостей или мульти-гостей в чате. + - `channel_type: array of string` — Массив типов чата, для которых будет работать правило + - `user_role: array of string` — Массив ролей пользователя в чате, для которых будет работать правило +- `conditions: object` (required) — Объект условия срабатывания правила. Можно указать all, any или оба. + - `all: array of object` — Массив условий (все должны совпасть) + - `type: string` (required) — Тип условия + Значения: `regex` — регулярное выражение, `keyword` — ключевое слово + - `max_hits: integer` — Максимальное количество совпадений + - `min_hits: integer` (default: 1) — Минимальное количество совпадений + - `pattern: string` — Регулярное выражение для поиска в тексте. Используется синтаксис [Google RE2](https://github.com/google/re2/wiki/Syntax). Обязательно, если type указано как regex. + - `value: string` — Ключевое слово для поиска в тексте. Обязательно, если type указано как keyword. + - `any: array of object` — Массив условий (хотя бы одно должно совпасть) + - `type: string` (required) — Тип условия + Значения: `regex` — регулярное выражение, `keyword` — ключевое слово + - `max_hits: integer` — Максимальное количество совпадений + - `min_hits: integer` (default: 1) — Минимальное количество совпадений + - `pattern: string` — Регулярное выражение для поиска в тексте. Используется синтаксис [Google RE2](https://github.com/google/re2/wiki/Syntax). Обязательно, если type указано как regex. + - `value: string` — Ключевое слово для поиска в тексте. Обязательно, если type указано как keyword. +- `action: object` (required) — Объект действия при срабатывании правила + - `type: string` (required) — Тип действия + Значения: `BLOCK` — удалить текст сообщения, `AUDIT_LOG` — добавить запись в журнал событий + - `message: string` — Текст сообщения для пользователя + + +```json title="Пример правила #1" +{ + "conditions": { + "any": [ + { + "type": "regex", + "pattern": "\\b(?:\\+7|7|8)\\s*\\(?\\d{3}\\)?\\s*\\d{3}[\\s-]*\\d{2}[\\s-]*\\d{2}\\b" + } + ] + }, + "action": { + "type": "AUDIT_LOG", + "message": "Обнаружен номер телефона в сообщении" + } +} +``` + +```json title="Пример правила #2" +{ + "conditions": { + "all": [ + { + "type": "keyword", + "value": "паспорт" + }, + { + "type": "regex", + "pattern": "\\b\\d{4}\\s?\\d{6}\\b" + } + ] + }, + "action": { + "type": "BLOCK", + "message": "Нельзя отправлять паспортные данные" + } +} +``` + +--- + + +# Пачка Audit Events API + +> **Внимание:** Доступно только на тарифе **Корпорация**. Для работы с журналом аудита токен должен иметь скоуп `audit_events:read`, доступный только владельцу пространства. + + +`Audit events API` Пачки предоставляет командам безопасности доступ к логам о критически важных событиях в мессенджере. Это позволяет обеспечивать надежный мониторинг и соответствовать требованиям информационной безопасности и регуляторов. + +Для получения логов событий на основе указанных фильтров используйте метод [Журнал аудита событий](GET /audit_events). + +## Реализованные типы событий + +#### AuditEventKey + + +## Примеры использования + +**Получение всех событий входа в систему за определенный период** + +```bash +# Для получения следующей страницы используйте cursor из meta.paginate.next_page +curl "https://api.pachca.com/api/shared/v1/audit_events?start_time=2025-05-01T00:00:00Z&end_time=2025-05-02T00:00:00Z&event_key=user_login&limit=50" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" +``` + + +**Получение всех событий, связанных с конкретным пользователем** + +```bash +# Для получения следующей страницы используйте cursor из meta.paginate.next_page +curl "https://api.pachca.com/api/shared/v1/audit_events?start_time=2025-05-01T00:00:00Z&end_time=2025-05-02T00:00:00Z&actor_id=133321&actor_type=User" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" +``` + + +**Получение всех изменений прав доступа к чатам** + +```bash +# Для получения следующей страницы используйте cursor из meta.paginate.next_page +curl "https://api.pachca.com/api/shared/v1/audit_events?start_time=2025-05-01T00:00:00Z&end_time=2025-05-08T00:00:00Z&event_key=chat_permission_changed" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" +``` + + +## Хранение данных + +Журналы аудита хранятся в течение 90 дней для баланса между требованиями соответствия и эффективностью хранения. Все журналы неизменяемы и хранятся в системе только для чтения, чтобы обеспечить целостность данных. + +## Типичные сценарии использования + +- Расследовать подозрительные попытки входа в систему +- Отслеживать изменения прав доступа +- Отслеживать действия по удалению сообщений +- Расследовать изменения ролей пользователей +- Отслеживать изменения в составе участников чатов +- Составлять отчеты о соответствии требованиям и во время аудита + +## Ограничения + +- Текущая версия API поддерживает только типы событий, указанные в документации +- Данные собираются только с 12 мая 2025 года +- За один запрос можно запросить только один тип события +- Список событий и фильтры планируется развивать в следующих версиях + +--- + + +# n8n + +## Что такое n8n + +[n8n](https://n8n.io) — платформа для автоматизации рабочих процессов с открытым исходным кодом. Можно развернуть на собственном сервере или использовать веб-версию. Платформа позволяет создавать интеграции с сервисами без написания кода, используя визуальный редактор с узлами (nodes). + +В n8n встроено более 400 готовых узлов для популярных сервисов. Узлы бывают двух типов: + +- **Узел триггера** — событие, запускающее рабочий процесс: новое сообщение, нажатие кнопки, обновление статуса и др. +- **Узел действия** — логика после триггера: отправка сообщения в чат, создание задачи, добавление записи в БД и т.д. + +![Интерфейс n8n с визуальным редактором workflow](/images/n8n/n8n-interface.avif) + +*Визуальный редактор n8n* + + +## Что можно автоматизировать + +- **Уведомления из внешних систем** — пересылайте алерты из мониторинга, CI/CD, CRM и других сервисов в чаты Пачки +- **Бот-ассистент** — подключите AI-агент, который ищет по сообщениям и отвечает на вопросы команды +- **Задачи по сообщениям** — автоматически создавайте задачи из сообщений с определённым тегом или реакцией +- **Согласование** — отправляйте кнопки «Одобрить / Отклонить» и обрабатывайте ответ в workflow +- **Онбординг** — приветствуйте новых сотрудников личным сообщением от бота +- **Синхронизация данных** — экспортируйте сообщения, задачи и события в Google Sheets, Notion или другие сервисы +- **Мониторинг и алерты** — проверяйте состояние сервисов по расписанию и отправляйте алерт в чат при сбое + +## Расширение Пачки + +Расширение Пачки для n8n предоставляет два узла: + +| Узел | Тип | Описание | +|------|-----|----------| +| **Pachca** | Действие | 18 ресурсов и более 60 операций для работы с API | +| **Pachca Trigger** | Триггер | 16 типов событий через вебхуки | + +- [18 ресурсов](/guides/n8n/resources) — Сообщения, чаты, пользователи, задачи, формы, поиск и другие +- [Триггер с вебхуком](/guides/n8n/trigger) — 16 типов событий с авторегистрацией вебхука +- [AI-агент](/guides/n8n/advanced) — Используйте Pachca как инструмент AI Agent +- [Автопагинация](/guides/n8n/resources) — Cursor-based пагинация с Return All / Limit + + +## Что нового в v2.0 + +Версия 2.0 — полностью автогенерируемая из OpenAPI-спецификации с сохранением 100% обратной совместимости с v1. + +- **7 новых ресурсов:** Chat Member, Custom Property, Read Member, Link Preview, Search, Chat Export, Security +- **Курсорная пагинация** с Return All / Limit вместо ручного `per`/`page` +- **AI Tool Use** — `usableAsTool: true` для использования с AI Agent +- **Trigger-нода** с авторегистрацией вебхука через Bot ID и 16 типами событий +- **Поисковые выпадающие списки** для Chat ID и User ID +- **Загрузка файлов** через S3 с поддержкой URL и Binary Data +- **Полнотекстовый поиск** по сообщениям, чатам и пользователям +- **Журнал безопасности** — аудит действий пользователей + +> Все существующие workflow на v1 продолжают работать без изменений. Подробнее — в разделе [Миграция с v1](/guides/n8n/migration). + + +--- + + +# Настройка + +## Установка + + + ### Шаг 1. Установка n8n + +Два способа установки: + + **С помощью команды** (требуется Node.js 22+): + + ```bash + npx n8n + ``` + + **С помощью Docker:** + + ```bash + docker volume create n8n_data + + docker run -it --rm \ + --name n8n \ + -p 5678:5678 \ + -e GENERIC_TIMEZONE="Europe/Moscow" \ + -e TZ="Europe/Moscow" \ + -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \ + -e N8N_RUNNERS_ENABLED=true \ + -v n8n_data:/home/node/.n8n \ + docker.n8n.io/n8nio/n8n + ``` + + Подробные инструкции — в [официальной документации n8n](https://docs.n8n.io/hosting/) и на [GitHub](https://github.com/n8n-io/n8n). + + После запуска откройте `http://localhost:5678` и настройте аккаунт владельца (Owner Account), указав почту, имя и пароль. + + ![Настройка аккаунта владельца n8n](/images/n8n/owner-account.avif) + +*Настройка Owner Account* + + + После входа вы увидите главный экран n8n с пустым списком workflow. + + ![Главная страница n8n после авторизации](/images/n8n/main-dashboard.avif) + +*Главная страница n8n* + + + ### Шаг 2. Установка расширения Пачки + +Расширение доступно на [npm](https://www.npmjs.com/package/n8n-nodes-pachca) и [GitHub](https://github.com/pachca/openapi/tree/main/integrations/n8n). + + Три способа установки: + + 1. Зайти в **Settings** > **Community nodes** и добавить `n8n-nodes-pachca` (рекомендуется) + 2. Выполнить команду `npm i n8n-nodes-pachca` в директории n8n + 3. Следовать README-инструкции на [GitHub](https://github.com/pachca/openapi/tree/main/integrations/n8n) + + + ### Шаг 3. Создание Credentials + +Credentials — данные для авторизации. Перейдите в **Credentials** и нажмите **Add Credential**. + + ![Список Credentials в n8n](/images/n8n/credentials-list.avif) + +*Список Credentials* + + + Найдите **Pachca API** в списке и заполните поля: + + ![Поиск Pachca API в списке Credentials](/images/n8n/credentials-search.avif) + +*Поиск Pachca API в списке Credentials* + + + | Поле | Обязательное | Описание | + |------|:---:|----------| + | **Base URL** | нет | Базовый URL API. По умолчанию `https://api.pachca.com/api/shared/v1`. Менять только для on-premise | + | **Access Token** | да | Токен доступа к API | + | **Bot ID** | нет | ID бота — нужен для авторегистрации вебхука в [Pachca Trigger](/guides/n8n/trigger) | + | **Signing Secret** | нет | Секрет для верификации входящих webhook-запросов (HMAC-SHA256) | + + ![Форма Credentials для Пачки в n8n](/images/n8n/credentials-v2.avif) + +*Форма Pachca API Credentials* + + + ### Шаг 4. Где получить токен + +В Пачке доступны два типа токенов: + + - **Персональный токен** — доступен в разделе **Автоматизации** > **Интеграции** > **API** + - **Токен бота** — доступен в настройках бота на вкладке **API** + + Доступные операции зависят от [скоупов](/api/authorization#skoupy) токена, а не от его типа. Подробнее — в разделе [Авторизация](/api/authorization). + + После заполнения полей нажмите **Test** — n8n проверит подключение вызовом [Информация о токене](GET /oauth/token/info). При успехе вы увидите подтверждение. + + ![Успешная проверка Credentials](/images/n8n/credentials-test.avif) + +*Connection tested successfully* + + + > Если тест не проходит — проверьте правильность токена и доступность API. Подробнее — в разделе [Устранение ошибок](/guides/n8n/troubleshooting). + + + ### Шаг 5. Создание workflow + +Workflow — визуальный редактор, в котором выстраиваются цепочки триггеров и действий. Создайте новый workflow и добавьте триггер **Manual Trigger** для ручного запуска. + + Нажмите **+** на выходе триггера и найдите **Pachca** в списке узлов. + + ![Поиск Pachca в списке узлов n8n](/images/n8n/workflow-add-node.avif) + +*Поиск узла Pachca* + + + После добавления узла на канвасе появится цепочка: Manual Trigger → Pachca. + + ![Узел Pachca на канвасе workflow](/images/n8n/workflow-pachca-node.avif) + +*Pachca на канвасе* + + + ### Шаг 6. Настройка и запуск + +Дважды кликните на узел **Pachca** и настройте: + + - **Credential:** выберите созданный Pachca API + - **Resource:** Message + - **Operation:** Create + - **Entity ID:** ID чата (число) + - **Content:** текст сообщения + + ![Настройка отправки сообщения в узле Pachca](/images/n8n/node-message-create.avif) + +*Настройка Message → Create* + + + > **Внимание:** Перед отправкой сообщения [добавьте бота в чат](/guides/bots#dostupy-bota-k-chatam-i-soobscheniyam). + + + Закройте панель настроек и нажмите **Execute Workflow**. При успехе узлы подсветятся зелёным и покажут количество обработанных элементов. + + ![Успешное выполнение workflow](/images/n8n/workflow-execute-success.avif) + +*Workflow выполнен* + + + Откройте узел Pachca, чтобы увидеть ответ API с данными созданного сообщения. + + ![Данные ответа API после выполнения](/images/n8n/workflow-output-data.avif) + +*Ответ API в панели Output* + + + Больше примеров — в разделе [Примеры workflow](/guides/n8n/workflows). + + + +--- + + +# Ресурсы и операции + +В расширении Пачки каждый узел **Pachca** работает по модели **Resource → Operation**: вы выбираете ресурс (например, Message) и операцию над ним (например, Create). + +![Выпадающий список ресурсов в узле Pachca](/images/n8n/resource-dropdown.avif) + +*Выбор ресурса в узле Pachca* + + +Для каждого ресурса доступен свой набор операций. + +![Выпадающий список операций для ресурса Message](/images/n8n/operation-dropdown.avif) + +*Операции для ресурса Message* + + +## Список ресурсов + +| # | Ресурс | Операций | Описание | Только v2 | +|---|--------|:---:|----------|:---:| +| 1 | [Message](#message) | 7 | Сообщения: создание, редактирование, удаление, закрепление | | +| 2 | [Chat](#chat) | 6 | Чаты: создание, обновление, архивация | | +| 3 | [Chat Member](#chat-member) | 7 | Участники чата: добавление, удаление, роли, теги | да | +| 4 | [User](#user) | 8 | Сотрудники: CRUD, статус | | +| 5 | [Group Tag](#group-tag) | 6 | Теги сотрудников: CRUD, список пользователей | | +| 6 | [Thread](#thread) | 2 | Треды: создание, получение | | +| 7 | [Reaction](#reaction) | 3 | Реакции: создание, удаление, список | | +| 8 | [Profile](#profile) | 5 | Мой профиль: информация, статус | | +| 9 | [Task](#task) | 5 | Задачи: полный CRUD | | +| 10 | [Bot](#bot) | 3 | Боты: обновление, события, удаление событий | | +| 11 | [File](#file) | 1 | Загрузка файлов через S3 | | +| 12 | [Form](#form) | 1 | Модальные формы | | +| 13 | [Custom Property](#custom-property) | 1 | Дополнительные поля | да | +| 14 | [Read Member](#read-member) | 1 | Список прочитавших сообщение | да | +| 15 | [Link Preview](#link-preview) | 1 | Разворачивание ссылок | да | +| 16 | [Search](#search) | 3 | Полнотекстовый поиск | да | +| 17 | [Chat Export](#chat-export) | 2 | Экспорт сообщений из чатов | да | +| 18 | [Security](#security) | 1 | Журнал безопасности | да | + +> **Внимание:** Для некоторых операций требуются скоупы, которые доступны только определённым ролям (администратор, владелец). При создании персонального токена отображаются только скоупы, доступные вашей роли. Подробнее — в разделе [Авторизация](/api/authorization). + + +--- + +## Message + +Сообщения: создание, получение, редактирование, удаление, закрепление и открепление. + +| Операция | API | +|----------|-----| +| Create | [Создание сообщения](POST /messages) | +| Get Many | [Список сообщений чата](GET /messages) | +| Get | [Информация о сообщении](GET /messages/{id}) | +| Update | [Редактирование сообщения](PUT /messages/{id}) | +| Delete | [Удаление сообщения](DELETE /messages/{id}) | +| Pin | [Закрепление сообщения](POST /messages/{id}/pin) | +| Unpin | [Открепление сообщения](DELETE /messages/{id}/pin) | + +**Ключевые параметры Create:** `entityId` (ID чата или пользователя), `content` (текст, Markdown), `entityType` (discussion, user, thread), `files`, `buttons`, `parentMessageId`. + +![Настройка Message Get Many с Entity ID и Return All](/images/n8n/message-get-many.avif) + +*Настройка Message → Get Many* + + +--- + +## Chat + +Чаты: создание, получение, обновление, архивация и разархивация. + +| Операция | API | +|----------|-----| +| Create | [Создание чата](POST /chats) | +| Get Many | [Список чатов](GET /chats) | +| Get | [Информация о чате](GET /chats/{id}) | +| Update | [Обновление чата](PUT /chats/{id}) | +| Archive | [Архивация чата](PUT /chats/{id}/archive) | +| Unarchive | [Разархивация чата](PUT /chats/{id}/unarchive) | + +--- + +## Chat Member + +Управление участниками чата: добавление, удаление, изменение ролей, управление тегами. + +> В v1 эти операции были частью ресурса Chat. В v2 они выделены в отдельный ресурс Chat Member. + + +| Операция | API | +|----------|-----| +| Get Many | [Список участников чата](GET /chats/{id}/members) | +| Create | [Добавление пользователей в чат](POST /chats/{id}/members) | +| Delete | [Удаление пользователя из чата](DELETE /chats/{id}/members/{user_id}) | +| Update | [Изменение роли участника](PUT /chats/{id}/members/{user_id}) | +| Leave | [Выход из чата](DELETE /chats/{id}/leave) | +| Add Group Tags | [Добавление тегов к чату](POST /chats/{id}/group_tags) | +| Remove Group Tags | [Удаление тегов из чата](DELETE /chats/{id}/group_tags/{tag_id}) | + +--- + +## User + +Сотрудники: полный CRUD, получение и управление статусом. + +| Операция | API | +|----------|-----| +| Create | [Создание сотрудника](POST /users) | +| Get Many | [Список сотрудников](GET /users) | +| Get | [Информация о сотруднике](GET /users/{id}) | +| Update | [Обновление сотрудника](PUT /users/{id}) | +| Delete | [Удаление сотрудника](DELETE /users/{id}) | +| Get Status | [Получение статуса](GET /users/{user_id}/status) | +| Update Status | [Обновление статуса](PUT /users/{user_id}/status) | +| Delete Status | [Удаление статуса](DELETE /users/{user_id}/status) | + +--- + +## Group Tag + +Теги (группы) сотрудников: создание, обновление, удаление, список пользователей. + +| Операция | API | +|----------|-----| +| Create | [Создание тега](POST /group_tags) | +| Get Many | [Список тегов](GET /group_tags) | +| Get | [Информация о теге](GET /group_tags/{id}) | +| Update | [Обновление тега](PUT /group_tags/{id}) | +| Delete | [Удаление тега](DELETE /group_tags/{id}) | +| Get Many Users | [Список пользователей тега](GET /group_tags/{id}/users) | + +--- + +## Thread + +Треды (комментарии к сообщениям): создание и получение. + +| Операция | API | +|----------|-----| +| Create | [Создание треда](POST /messages/{id}/thread) | +| Get | [Информация о треде](GET /threads/{id}) | + +--- + +## Reaction + +Реакции на сообщения: создание, удаление, список. + +| Операция | API | +|----------|-----| +| Create | [Добавление реакции](POST /messages/{id}/reactions) | +| Delete | [Удаление реакции](DELETE /messages/{id}/reactions) | +| Get Many | [Список реакций](GET /messages/{id}/reactions) | + +--- + +## Profile + +Профиль текущего пользователя: информация, статус, информация о токене. + +| Операция | API | +|----------|-----| +| Get | [Информация о профиле](GET /profile) | +| Get Info | [Информация о токене](GET /oauth/token/info) | +| Get Status | [Получение статуса](GET /profile/status) | +| Update Status | [Обновление статуса](PUT /profile/status) | +| Delete Status | [Удаление статуса](DELETE /profile/status) | + +--- + +## Task + +Задачи (напоминания): полный CRUD. + +| Операция | API | +|----------|-----| +| Create | [Создание задачи](POST /tasks) | +| Get Many | [Список задач](GET /tasks) | +| Get | [Информация о задаче](GET /tasks/{id}) | +| Update | [Обновление задачи](PUT /tasks/{id}) | +| Delete | [Удаление задачи](DELETE /tasks/{id}) | + +**Типы задач:** `call`, `email`, `event`, `meeting`, `reminder`. + +--- + +## Bot + +Управление ботами: обновление настроек, получение и удаление событий. + +| Операция | API | +|----------|-----| +| Update | [Обновление бота](PUT /bots/{id}) | +| Get Many Events | [Список событий бота](GET /webhooks/events) | +| Remove Events | [Удаление событий](DELETE /webhooks/events/{id}) | + +--- + +## File + +Загрузка файлов через двухшаговый S3 upload. + +| Операция | API | +|----------|-----| +| Create | [Загрузка файла](POST /uploads) | + +Подробнее — в разделе [Продвинутые функции](/guides/n8n/advanced#zagruzka-fajlov). + +--- + +## Form + +Модальные формы (представления). + +| Операция | API | +|----------|-----| +| Create | [Открытие представления](POST /views/open) | + +Подробнее — в разделе [Продвинутые функции](/guides/n8n/advanced#formy) и в [документации форм](/guides/forms/overview). + +--- + +## Custom Property + +Дополнительные поля пространства. + +| Операция | API | +|----------|-----| +| Get | [Список дополнительных полей](GET /custom_properties) | + +--- + +## Read Member + +Список пользователей, прочитавших сообщение. + +| Операция | API | +|----------|-----| +| Get Many | [Список прочитавших](GET /messages/{id}/read_member_ids) | + +--- + +## Link Preview + +Разворачивание ссылок в сообщениях. + +| Операция | API | +|----------|-----| +| Create | [Создание превью ссылки](POST /messages/{id}/link_previews) | + +Подробнее — в [документации разворачивания ссылок](/guides/link-previews). + +--- + +## Search + +Полнотекстовый поиск по сообщениям, чатам и пользователям. + +| Операция | API | +|----------|-----| +| Get Many Chats | [Поиск чатов](GET /search/chats) | +| Get Many Messages | [Поиск сообщений](GET /search/messages) | +| Get Many Users | [Поиск пользователей](GET /search/users) | + +**Обязательный параметр:** `query` — строка поиска. + +--- + +## Chat Export + +Экспорт сообщений из чатов: запрос экспорта и скачивание архива. + +| Операция | API | +|----------|-----| +| Create | [Запрос экспорта](POST /chats/exports) | +| Get | [Скачивание архива](GET /chats/exports/{id}) | + +**Ключевые параметры Create:** `startAt` (дата начала, YYYY-MM-DD), `endAt` (дата окончания), `webhookUrl` (URL для уведомления о готовности). + +**Дополнительные параметры:** `chatIds` (экспорт конкретных чатов, до 50), `skipChatsFile` (не создавать chats.json). + +Экспорт выполняется асинхронно. После завершения Пачка отправит вебхук на указанный `webhookUrl` с `export_id`. Используйте операцию **Get** для скачивания готового архива. + +Подробнее — в разделе [Продвинутые функции](/guides/n8n/advanced#eksport-soobshhenij) и в [документации экспорта](/guides/export). + +--- + +## Security + +Журнал безопасности: отслеживание действий пользователей. + +| Операция | API | +|----------|-----| +| Get Many | [Список событий аудита](GET /audit_events) | + +**Фильтры:** `eventKey`, `actorId`, `actorType`, `entityId`, `entityType`, `startTime`, `endTime`. + +Подробнее — в [документации журнала аудита](/guides/audit-events). + +--- + +## Пагинация + +Все операции Get Many поддерживают автоматическую курсорную пагинацию: + +- **Return All** = `true` — получить все результаты автоматически, переключаясь между страницами +- **Return All** = `false` — получить не более **Limit** результатов (по умолчанию 50) + +![Переключатель Return All и поле Limit в узле Pachca](/images/n8n/return-all.avif) + +*Return All и Limit для операции Get Many* + + +n8n автоматически отправляет повторные запросы с курсором до получения всех данных. + +> Для операций со списками (Get Many) рекомендуется использовать **Return All = false** с разумным **Limit**, чтобы избежать долгих запросов при большом объёме данных. + + +--- + +## Simplify + +Операции получения данных (Get, Get Many) поддерживают переключатель **Simplify** (включён по умолчанию). Когда Simplify включён, из ответа API возвращаются только ключевые поля — остальные отбрасываются. + +| Ресурс | Ключевые поля | +|--------|---------------| +| Message | `id`, `entity_id`, `chat_id`, `content`, `user_id`, `created_at` | +| Chat | `id`, `name`, `channel`, `public`, `members_count`, `created_at` | +| User | `id`, `first_name`, `last_name`, `nickname`, `email`, `role`, `suspended` | +| Task | `id`, `content`, `kind`, `status`, `priority`, `due_at`, `created_at` | +| Bot | `id`, `name`, `created_at` | +| Group Tag | `id`, `name`, `users_count` | +| Reaction | `id`, `code`, `user_id`, `created_at` | +| Chat Export | `id`, `status`, `created_at` | + +Чтобы получить все поля ответа — выключите **Simplify**. + +> Simplify доступен только в v2. В v1 workflow всегда возвращают полный ответ API. + + +--- + +## Поисковые выпадающие списки + +![Поисковый выпадающий список Chat ID в узле Pachca](/images/n8n/searchable-dropdown.avif) + +*Поиск чата по имени в поле Chat ID* + + +Для поля **Chat ID** доступен поиск по имени: начните вводить текст, и n8n покажет подходящие результаты из вашего пространства Пачки. + +Поиск вызывает API-эндпоинт [Поиск чатов](GET /search/chats) и работает только с валидным `Access Token` в Credentials. + +--- + + +# Триггер + +Узел **Pachca Trigger** запускает workflow при наступлении события в Пачке — новое сообщение, нажатие кнопки, отправка формы, изменение состава команды и др. + +## Поддерживаемые события + +### Сообщения и чаты + +| Событие | Значение | Описание | +|---------|----------|----------| +| Новое сообщение | `new_message` | Создание сообщения в чате | +| Сообщение изменено | `message_updated` | Редактирование существующего сообщения | +| Сообщение удалено | `message_deleted` | Удаление сообщения | +| Новая реакция | `new_reaction` | Добавление реакции к сообщению | +| Реакция удалена | `reaction_deleted` | Удаление реакции с сообщения | +| Участник добавлен | `chat_member_added` | Добавление участника в чат | +| Участник удалён | `chat_member_removed` | Удаление участника из чата | + +### Интерактивные элементы + +| Событие | Значение | Описание | +|---------|----------|----------| +| Нажатие кнопки | `button_pressed` | Клик по Data-кнопке в сообщении | +| Отправка формы | `form_submitted` | Отправка модальной формы | +| Ссылка отправлена | `link_shared` | Бот может развернуть превью ссылки | + +### Сотрудники + +| Событие | Значение | Описание | +|---------|----------|----------| +| Приглашение сотрудника | `company_member_invite` | Отправлено приглашение новому сотруднику | +| Подтверждение регистрации | `company_member_confirm` | Сотрудник подтвердил регистрацию | +| Активация сотрудника | `company_member_activate` | Сотрудник активирован | +| Обновление сотрудника | `company_member_update` | Изменение данных сотрудника | +| Приостановка сотрудника | `company_member_suspend` | Сотрудник приостановлен | +| Удаление сотрудника | `company_member_delete` | Сотрудник удалён | + +### Wildcard + +| Событие | Значение | Описание | +|---------|----------|----------| +| Все события | `*` | Получать все типы событий | + +![Типы событий Pachca Trigger](/images/n8n/trigger-events.avif) + +*16 типов событий в Pachca Trigger* + + +> **Внимание:** Бот получает события только из чатов, в которых он состоит. Убедитесь, что бот добавлен в нужные чаты. + + +## Настройка + +Добавьте узел **Pachca Trigger** в workflow — найдите его через поиск в панели узлов. + +![Поиск Pachca Trigger в панели узлов](/images/n8n/trigger-add.avif) + +*Поиск Pachca Trigger* + + +### Автоматический режим (рекомендуется) + +![Конфигурация Pachca Trigger с выбором события](/images/n8n/trigger-node.avif) + +*Настройка Pachca Trigger* + + +При наличии **Bot ID** в [Credentials](/guides/n8n/setup#sozdanie-credentials) вебхук регистрируется автоматически: + + + ### Шаг 1. Укажите Bot ID в Credentials + +Откройте Pachca API Credentials и заполните поле **Bot ID** — это ID вашего бота в Пачке. + + + ### Шаг 2. Добавьте Pachca Trigger + +Создайте новый workflow и добавьте узел **Pachca Trigger**. Выберите нужный тип события. + + + ### Шаг 3. Активируйте workflow + +Нажмите **Activate**. n8n автоматически вызовет [Обновление бота](PUT /bots/{id}) и зарегистрирует webhook URL в настройках бота. + + +При деактивации workflow вебхук автоматически удаляется. + +**Автоматическая регистрация вебхука** + +```mermaid +sequenceDiagram + participant n8n + participant Pachca as Pachca API + participant Bot as Бот в Пачке + + Note over n8n: Активация workflow + n8n->>Pachca: PUT /bots/{id}
webhook_url=n8n_url + Pachca->>Bot: Webhook зарегистрирован + + Note over Bot: Событие в чате + Bot->>Pachca: Новое сообщение + Pachca->>n8n: POST webhook_url
+ payload + signature + Note over n8n: Проверка подписи + n8n->>n8n: Запуск workflow + + Note over n8n: Деактивация workflow + n8n->>Pachca: PUT /bots/{id}
webhook_url=null + Pachca->>Bot: Webhook удалён +``` + + +### Ручной режим + +Если **Bot ID** не указан в Credentials: + +1. Добавьте узел **Pachca Trigger** в workflow +2. Скопируйте сгенерированный **Webhook URL** из настроек узла +3. Вставьте URL в настройки бота в Пачке (раздел **Webhook URL**) +4. Активируйте workflow + +## Проверка подписи + +Для защиты от поддельных запросов добавьте **Signing Secret** бота в [Credentials](/guides/n8n/setup#sozdanie-credentials). Trigger автоматически проверяет HMAC-SHA256 подпись каждого входящего запроса и отклоняет невалидные. + +Подробнее о механизме подписи — в разделе [Исходящие вебхуки](/guides/webhook#bezopasnost). + +> Рекомендуется всегда использовать Signing Secret в продакшене для защиты от несанкционированных запросов. + + +## Фильтрация событий + +Выберите конкретный тип события для фильтрации — workflow будет запускаться только при совпадении. Можно выбрать только один тип события на один узел Trigger. + +> Используйте **All Events** (`*`) и фильтруйте в последующих узлах (например, через IF или Switch), если нужна сложная логика маршрутизации по типу события или обработка нескольких типов в одном workflow. + + +## Пример: бот-эхо + +![Пример workflow с Pachca Trigger](/images/n8n/workflow-trigger-example.avif) + +*Workflow с триггером и действием Pachca* + + +Простой workflow, который отвечает на каждое новое сообщение: + +1. **Pachca Trigger** — событие `New Message` +2. **IF** — условие: `message.user_id` не равен ID бота (чтобы бот не отвечал сам себе) +3. **Pachca** — операция `Message > Create`, `entityId` = ID чата из триггера, `content` = текст ответа + +> ID бота — это `user_id` из ответа [Информация о профиле](GET /profile) при авторизации токеном бота. + + +Больше готовых сценариев — в разделе [Примеры workflow](/guides/n8n/workflows). + +--- + + +# Примеры workflow + +Ниже — готовые сценарии, которые можно воспроизвести в n8n. Каждый пример использует узлы **Pachca** и **Pachca Trigger** из расширения. + +## Приветствие нового сотрудника + +Автоматическое приветственное сообщение при добавлении сотрудника в канал. + +![Workflow приветствия нового сотрудника](/images/n8n/workflow-welcome.avif) + +*Приветствие нового сотрудника* + + +**Как работает:** + +1. **Pachca Trigger** — событие `New Message` +2. **IF** — проверка: сообщение системное (тип `user_joined`) +3. **Pachca** (Message > Create) — отправка приветствия в тот же чат + +**Что можно добавить:** отправка личного сообщения с полезными ссылками, добавление сотрудника в рабочие каналы. + + + Готовый workflow для импорта в n8n + + +> После импорта замените Credentials на свои во всех узлах Pachca. + + +--- + +## Пересылка сообщений между каналами + +Автоматическая пересылка сообщений из одного чата в другой. + +![Workflow пересылки сообщений](/images/n8n/workflow-forward.avif) + +*Пересылка сообщений между каналами* + + +**Как работает:** + +1. **Pachca Trigger** — событие `New Message` (в исходном канале) +2. **IF** — фильтрация: пропускать сервисные сообщения, пересылать только пользовательские +3. **Pachca** (Message > Create) — отправка в целевой канал с указанием автора + +**Когда полезно:** дублирование важных новостей в общие каналы, агрегация обсуждений. + + + Готовый workflow для импорта в n8n + + +> После импорта замените Credentials, `CHAT_ID_ИСТОЧНИКА` и `CHAT_ID_ЦЕЛЕВОГО` на свои значения. + + +--- + +## Напоминание о задачах + +Ежедневная проверка просроченных задач с уведомлением в чат. + +![Workflow напоминания о задачах](/images/n8n/workflow-reminder.avif) + +*Напоминание о просроченных задачах* + + +**Как работает:** + +1. **Schedule Trigger** — ежедневный запуск (например, в 10:00) +2. **Pachca** (Task > Get Many) — получение списка задач +3. **IF** — фильтр: только просроченные (дедлайн < сегодня) +4. **Pachca** (Message > Create) — уведомление в чат со списком задач + +**Что можно добавить:** личные уведомления ответственным, группировка по проектам. + + + Готовый workflow для импорта в n8n + + +> После импорта замените Credentials и `CHAT_ID` во всех узлах Pachca. + + +--- + +## Согласование с кнопками + +Запрос на согласование через сообщение с кнопками и обработка ответа. + +![Workflow согласования с кнопками](/images/n8n/workflow-approval.avif) + +*Согласование с Data-кнопками* + + +**Как работает:** + +1. **Manual Trigger** или **Webhook** — инициация запроса +2. **Pachca** (Message > Create) — отправка сообщения с кнопками «Согласовать» / «Отклонить» +3. **Pachca Trigger** (в отдельном workflow) — событие `Button Pressed` +4. **Switch** — маршрутизация по `data` из нажатой кнопки +5. **Pachca** (Message > Update) — обновление исходного сообщения с результатом + +**Пример кнопок:** + +```json +[ + [ + { "text": "Согласовать", "data": "approve" }, + { "text": "Отклонить", "data": "reject" } + ] +] +``` + +Подробнее о кнопках — в разделе [Продвинутые функции](/guides/n8n/advanced#knopki-v-soobshheniyax). + +- [approval.json](/workflows/n8n/approval.json) — Отправка запроса с кнопками +- [approval-handler.json](/workflows/n8n/approval-handler.json) — Обработка нажатий кнопок + + +> После импорта замените Credentials и `CHAT_ID` во всех узлах Pachca. + + +--- + +## Мониторинг и алерты + +Периодическая проверка состояния и отправка алерта при аномалиях. + +![Workflow мониторинга с алертами](/images/n8n/workflow-monitoring.avif) + +*Мониторинг с отправкой алертов в Пачку* + + +**Как работает:** + +1. **Schedule Trigger** — проверка каждые 5 минут +2. **HTTP Request** — запрос к внешнему API или сервису +3. **IF** — проверка: статус не 200 или метрика выше порога +4. **Pachca** (Message > Create) — отправка алерта в канал мониторинга + +**Что можно добавить:** проверка нескольких сервисов, графики через разворачивание ссылок, эскалация в личные сообщения. + + + Готовый workflow для импорта в n8n + + +> После импорта замените Credentials, `CHAT_ID_МОНИТОРИНГА` и URL сервиса во всех узлах Pachca. + + +--- + +## Заявка на отпуск + +Полноценный сценарий с кнопками, формой и согласованием в треде — бот принимает заявку через модальную форму и отправляет на согласование руководителю. + +![Workflow заявки на отпуск с кнопками, формой и согласованием](/images/n8n/workflow-vacation.avif) + +*Заявка на отпуск: триггер → кнопка → форма → тред → согласование* + + +**Как работает (два workflow):** + +**Workflow 1 — Приём заявки:** + +1. **Pachca Trigger** — событие `New Message`, фильтр по команде `/отпуск` +2. **Pachca** (Message > Create) — отправка сообщения с Data-кнопкой «Создать заявку» +3. **Pachca Trigger** (событие `Button Pressed`) — пользователь нажимает кнопку +4. **Pachca** (Form > Create) — открытие модальной формы с полями «Дата начала», «Дата окончания», «Комментарий» + +**Workflow 2 — Обработка и согласование:** + +1. **Pachca Trigger** — событие `Form Submitted` +2. **Pachca** (Thread > Create) — создание треда с деталями заявки +3. **Pachca** (Message > Create) — отправка в тред кнопок «Согласовать» / «Отклонить» +4. **Pachca Trigger** (событие `Button Pressed`) — руководитель нажимает кнопку +5. **Pachca** (Message > Create) — уведомление сотрудника о результате + +**Что задействовано:** триггер, кнопки, формы, треды, условная логика. + +> Подробнее о кнопках — в разделе [Кнопки в сообщениях](/guides/n8n/advanced#knopki-v-soobshheniyax), о формах — в разделе [Формы](/guides/n8n/advanced#formy). + + +- [vacation.json](/workflows/n8n/vacation.json) — Приём команды и кнопка заявки +- [vacation-handler.json](/workflows/n8n/vacation-handler.json) — Форма, тред и согласование + + +> После импорта замените Credentials и `CHAT_ID_HR` во всех узлах Pachca. + + +--- + +## AI-ассистент + +Бот, использующий AI для ответов на вопросы на основе истории чата. + +![Настройка AI Agent с Pachca Tool](/images/n8n/ai-agent-tool.avif) + +*AI Agent с инструментами Pachca* + + +**Как работает:** + +1. **Pachca Trigger** — событие `New Message` +2. **AI Agent** — обработка запроса с LLM +3. **Pachca** (Search > Get Many Messages) — как Tool для поиска информации +4. **Pachca** (Message > Create) — как Tool для отправки ответа + +> Для использования AI Agent необходимо настроить LLM-провайдер (OpenAI, Anthropic и др.) в n8n. Подробнее — в разделе [Продвинутые функции](/guides/n8n/advanced#ai-agent). + + +--- + + +# Продвинутые функции + +## Загрузка файлов + +![Настройка загрузки файла в узле Pachca](/images/n8n/file-upload.avif) + +*Ресурс File с параметрами загрузки* + + +Ресурс **File** позволяет загружать файлы через двухшаговый S3 upload. n8n автоматически выполняет оба этапа: запрашивает presigned URL через API и загружает файл на S3. + +**Два источника файлов:** + +| Источник | Описание | +|----------|----------| +| **URL** | Файл загружается по ссылке. Укажите `fileUrl`, `fileName` и `contentType` | +| **Binary Data** | Файл из предыдущего узла workflow (например, из HTTP Request). Укажите `binaryProperty` | + +**Пример workflow: загрузка PDF и отправка в чат** + +1. **HTTP Request** — скачать файл по URL +2. **Pachca** (File > Create) — загрузить файл, получить `key` +3. **Pachca** (Message > Create) — отправить сообщение с прикреплённым файлом, указав `key` в поле `files` + +> Загруженные файлы привязываются к сообщениям через массив `files` при создании или обновлении сообщения. Каждый файл описывается объектом с полями: `key`, `name`, `file_type`, `size`. + + +Подробнее — в [документации загрузки файлов](/api/file-uploads). + +--- + +## Экспорт сообщений + +Ресурс **Chat Export** позволяет выгружать сообщения из чатов. Экспорт выполняется асинхронно: вы запрашиваете экспорт, а Пачка присылает уведомление на вебхук, когда архив готов. + +**Пример workflow:** + + + ### Шаг 1. Настройте приём вебхука + +Создайте отдельный workflow с узлом **Webhook** (встроенный в n8n). Он создаст URL, на который Пачка отправит уведомление о готовности экспорта. Скопируйте этот URL — он понадобится на следующем шаге. + + + ### Шаг 2. Запросите экспорт + +В основном workflow добавьте узел **Pachca** с ресурсом **Chat Export** и операцией **Create**. Укажите период (`startAt`, `endAt`) и вставьте URL вебхука из первого шага в поле `webhookUrl`. + + + ### Шаг 3. Обработайте уведомление + +Когда экспорт будет готов, Пачка отправит JSON на ваш вебхук: + ```json + { + "type": "export", + "event": "ready", + "export_id": 22322, + "created_at": "2025-03-20T12:33:58Z" } ``` - ### Шаг 2. Скачайте готовый архив + ### Шаг 4. Скачайте архив -Получив `JSON` с информацией о готовом экспорте, вам необходимо взять значение поля `export_id` и выполнить запрос на скачивание архива сообщений, указав его в `URL` запроса. +В workflow с Webhook-узлом добавьте узел **Pachca** с ресурсом **Chat Export** и операцией **Get**. Передайте `export_id` из данных вебхука в поле **ID**. Архив будет скачан автоматически. - Для скачивания архива используйте метод [Скачать архив экспорта](GET /chats/exports/{id}). +**Ограничения:** +- Максимальный период одной выгрузки: 45 дней (366 дней при указании конкретных чатов) +- Максимум 50 чатов при фильтрации по `chatIds` +- Новый запрос можно сделать только после завершения текущего - ### Шаг 3. Изучите структуру архива +Подробнее — в [документации экспорта](/guides/export). -Архив представляет собой папки, где каждая папка соответствует чату в вашем пространстве. Название папки состоит из имени чата и его `ID`, например: `Design_12925828`. Внутри папки будут `JSON`-файлы, которые соответствуют дате переписки. Каждый день — отдельный файл. +--- - Дополнительно, рядом с папками будет находиться список чатов, которые попали в экспорт. Список чатов представлен файлом `chats.json`. Список не создается, если при запросе экспорта было указано `skip_chats_file` как `true`. +## Кнопки в сообщениях - ``` -├── Design_12925828/ -│ ├── 2025-01-15.json -│ ├── 2025-01-16.json -│ └── 2025-01-17.json -├── Marketing_12925901/ -│ ├── 2025-01-15.json -│ └── 2025-01-16.json -├── Development_12926012/ -│ ├── 2025-01-15.json -│ ├── 2025-01-16.json -│ └── 2025-01-17.json -└── chats.json -``` +![Настройка кнопок в сообщении в узле Pachca](/images/n8n/message-buttons.avif) +*Кнопки в параметрах сообщения* - #### Структура данных в JSON-файлах сообщений -- `id: integer` — Идентификатор сообщения -- `created_at: date-time` — Дата и время создания сообщения (ISO-8601, UTC+0) -- `deleted_at: date-time` — Дата и время удаления сообщения. Возвращается как null, если сообщение не удалено. -- `content: string` — Текст сообщения -- `thread_id: integer` — Идентификатор треда сообщения. Возвращается как null, если у сообщения нет комментариев. -- `reactions: array of object` — Массив списка реакций - - `user_id: integer` — Идентификатор пользователя, который добавил реакцию - - `created_at: string` — Дата и время добавления реакции (ISO-8601, UTC+0) - - `code: string` — Emoji символ реакции -- `user: object` — Информация об авторе сообщения - - `id: integer` — Идентификатор пользователя - - `role: string` — Тип автора - Значения: `member` — пользователь, `bot` — бот - - `name: string` — Имя - - `last_name: string` — Фамилия - - `email: string` — Электронная почта - - `tags: array of string` — Массив тегов, привязанных к пользователю -- `chat: object` — Информация о чате, в котором было написано сообщение - - `id: integer` — Идентификатор чата - - `name: string` — Название чата - - `personal: boolean` — Тип чата - Значения: `true` — личный чат, `false` — групповой чат - - `owner: object` — Информация о владельце чата - - `id: integer` — Идентификатор пользователя - - `role: string` — Тип владельца - Значения: `member` — пользователь, `bot` — бот - - `name: string` — Имя - - `last_name: string` — Фамилия - - `email: string` — Электронная почта - - `tags: array of string` — Массив тегов - - `tags: array of string` — Массив тегов, привязанных к чату -- `thread: object` — Тред, в котором находится сообщение. Возвращается как null, если сообщение находится не в треде. - - `id: integer` — Идентификатор треда - - `message_id: integer` — Идентификатор сообщения, под которым был начат тред - - `message_chat_id: string` — Идентификатор чата, в котором был начат тред +При создании или обновлении сообщения можно добавить интерактивные кнопки через поле **Buttons**. Кнопки передаются как JSON-строка. +Два типа кнопок: - Список в файле `chats.json` представляет собой массив объектов чатов. Структура каждого объекта чата описана ниже. +| Тип | Описание | +|-----|----------| +| **URL-кнопка** | Открывает ссылку в браузере | +| **Data-кнопка** | Отправляет вебхук с `button_pressed` событием | - #### Структура объекта чата в массиве файла chats.json +Пример JSON для одной строки кнопок: -- `id: integer` — Идентификатор чата -- `personal: boolean` — Тип чата - Значения: `true` — личный чат, `false` — групповой чат -- `name: string` — Название -- `owner_id: integer` — Идентификатор пользователя, создавшего чат -- `members: array of object` — Массив объектов участников чата - - `id: integer` — Идентификатор пользователя - - `role: string` — Роль в чате - Значения: `owner` — создатель, `admin` — админ, `editor` — редактор, `member` — участник/подписчик -- `created_at: date-time` — Дата и время создания чата (ISO-8601, UTC+0) -- `updated_at: date-time` — Дата и время обновления чата (ISO-8601, UTC+0) +```json +[ + [ + { "text": "Открыть сайт", "url": "https://example.com" }, + { "text": "Подтвердить", "data": "confirm_action" } + ] +] +``` +Максимум 100 кнопок на сообщение, до 8 в одной строке. +Подробнее о кнопках, их внешнем виде в чате и обработке нажатий — в [документации кнопок](/guides/buttons). --- +## Формы -# DLP-система +Ресурс **Form** позволяет открывать модальные формы (представления) для пользователей. -> **Внимание:** Доступно только на тарифе **Корпорация** +**Как это работает:** +1. Пользователь нажимает Data-кнопку в сообщении бота +2. Бот получает вебхук с `trigger_id` +3. Бот вызывает [Открытие представления](POST /views/open) с `trigger_id` и описанием формы +4. Пользователь видит модальное окно с полями -Встроенная в Пачку DLP-система (Data Loss Prevention) позволяет вам построить защиту от утечек конфиденциальной информации без интеграции сторонних сервисов. +**Ключевые параметры:** -Управление правилами DLP-системы доступно в разделе **Настройки пространства** > **DLP**. Вы можете изменять список правил, а также включать и отключать их. +| Параметр | Описание | +|----------|----------| +| `triggerId` | Уникальный ID из вебхука кнопки (действителен 3 секунды) | +| `title` | Заголовок модального окна | +| `type` | Тип представления (по умолчанию `modal`) | +| `blocks` | JSON-массив блоков формы | +| `submitText` | Текст кнопки отправки | +| `closeText` | Текст кнопки закрытия | -![Список правил DLP-системы](/images/dlp/dlp-page.webp) +**Пример workflow:** -*Список правил DLP-системы* +1. **Pachca Trigger** — событие `Button Pressed` +2. **Pachca** (Form > Create) — открыть форму с `trigger_id` из триггера +3. **Pachca Trigger** — событие `Form Submitted` (в отдельном workflow) +4. Обработка данных формы +Подробнее о формах, типах полей и внешнем виде модального окна в интерфейсе Пачки — в [документации форм](/guides/forms/overview). -## Создание правила +--- -Чтобы внести новое правило нажмите на кнопку «Создать новое правило», укажите название правила (чтобы было проще его потом изменить или удалить), его приоритет и `JSON` объект условия. +## AI-агент -![Новое правило](/images/dlp/new-rule.webp) +![Pachca как инструмент AI Agent в n8n](/images/n8n/ai-agent-tool.avif) -*Создание нового правила* +*Pachca Tool в панели инструментов AI Agent* -Параметр «Приоритет» задает значение приоритета для политики, определяющее порядок её обработки. Меньшее целое число указывает на более высокий приоритет, значение 0 — на наивысший приоритет. Правила не могут иметь одинаковое значение приоритета. +Оба узла (Pachca и Pachca Trigger) поддерживают `usableAsTool: true` — их можно использовать как инструменты для **AI Agent** в n8n. -`JSON` условие состоит из трёх полей: контекст применения правила (необязательное), условие срабатывания правила и действие при срабатывании правила. Параметры и пример условия вы можете посмотреть ниже. +**Что это значит:** -## Структура правила +- AI Agent может вызывать операции Pachca для выполнения задач +- Примеры: поиск сообщений, отправка ответов, создание задач +- Agent автоматически выбирает подходящую операцию на основе запроса -#### DlpRule +**Пример: AI-помощник для команды** -- `scope: object` — Объект контекста применения правила - - `to_external: boolean` (default: false) — Применимость правила к внешним контактам. При значении true правило работает только при наличии гостей или мульти-гостей в чате. - - `channel_type: array of string` — Массив типов чата, для которых будет работать правило - - `user_role: array of string` — Массив ролей пользователя в чате, для которых будет работать правило -- `conditions: object` (required) — Объект условия срабатывания правила. Можно указать all, any или оба. - - `all: array of object` — Массив условий (все должны совпасть) - - `type: string` (required) — Тип условия - Значения: `regex` — регулярное выражение, `keyword` — ключевое слово - - `max_hits: integer` — Максимальное количество совпадений - - `min_hits: integer` (default: 1) — Минимальное количество совпадений - - `pattern: string` — Регулярное выражение для поиска в тексте. Используется синтаксис [Google RE2](https://github.com/google/re2/wiki/Syntax). Обязательно, если type указано как regex. - - `value: string` — Ключевое слово для поиска в тексте. Обязательно, если type указано как keyword. - - `any: array of object` — Массив условий (хотя бы одно должно совпасть) - - `type: string` (required) — Тип условия - Значения: `regex` — регулярное выражение, `keyword` — ключевое слово - - `max_hits: integer` — Максимальное количество совпадений - - `min_hits: integer` (default: 1) — Минимальное количество совпадений - - `pattern: string` — Регулярное выражение для поиска в тексте. Используется синтаксис [Google RE2](https://github.com/google/re2/wiki/Syntax). Обязательно, если type указано как regex. - - `value: string` — Ключевое слово для поиска в тексте. Обязательно, если type указано как keyword. -- `action: object` (required) — Объект действия при срабатывании правила - - `type: string` (required) — Тип действия - Значения: `BLOCK` — удалить текст сообщения, `AUDIT_LOG` — добавить запись в журнал событий - - `message: string` — Текст сообщения для пользователя + ### Шаг 1. Добавьте AI Agent -```json title="Пример правила #1" -{ - "conditions": { - "any": [ - { - "type": "regex", - "pattern": "\\b(?:\\+7|7|8)\\s*\\(?\\d{3}\\)?\\s*\\d{3}[\\s-]*\\d{2}[\\s-]*\\d{2}\\b" - } - ] - }, - "action": { - "type": "AUDIT_LOG", - "message": "Обнаружен номер телефона в сообщении" - } -} -``` +Создайте новый workflow. Добавьте узел **AI Agent** и подключите LLM-модель (OpenAI, Anthropic и др.) через соответствующие Credentials. -```json title="Пример правила #2" -{ - "conditions": { - "all": [ - { - "type": "keyword", - "value": "паспорт" - }, - { - "type": "regex", - "pattern": "\\b\\d{4}\\s?\\d{6}\\b" - } - ] - }, - "action": { - "type": "BLOCK", - "message": "Нельзя отправлять паспортные данные" - } -} -``` ---- + ### Шаг 2. Подключите инструменты Pachca +Нажмите **+** на входе **Tool** узла AI Agent и добавьте узел **Pachca**. Выберите нужную операцию — например, **Search > Get Many Messages** для поиска по сообщениям. Добавьте ещё один узел Pachca для **Message > Create** — отправки ответов. -# Пачка Audit Events API -> **Внимание:** Доступно только на тарифе **Корпорация**. Для работы с журналом аудита токен должен иметь скоуп `audit_events:read`, доступный только владельцу пространства. + ### Шаг 3. Настройте триггер +Добавьте **Pachca Trigger** с событием `New Message` на вход workflow. AI Agent будет автоматически отвечать на сообщения пользователей, используя поиск по истории чатов. -`Audit events API` Пачки предоставляет командам безопасности доступ к логам о критически важных событиях в мессенджере. Это позволяет обеспечивать надежный мониторинг и соответствовать требованиям информационной безопасности и регуляторов. -Для получения логов событий на основе указанных фильтров используйте метод [Журнал аудита событий](GET /audit_events). +AI Agent самостоятельно выбирает подходящий инструмент на основе запроса пользователя — ищет информацию, создаёт задачи или отправляет сообщения. -## Реализованные типы событий +> Для использования AI Agent необходимо настроить LLM-провайдер (OpenAI, Anthropic и др.) в Credentials n8n. -#### AuditEventKey +--- -## Примеры использования +## Разворачивание ссылок -**Получение всех событий входа в систему за определенный период** +Ресурс **Link Preview** позволяет формировать кастомные превью для ссылок в сообщениях бота. -```bash -# Для получения следующей страницы используйте cursor из meta.paginate.next_page -curl "https://api.pachca.com/api/shared/v1/audit_events?start_time=2025-05-01T00:00:00Z&end_time=2025-05-02T00:00:00Z&event_key=user_login&limit=50" \ - -H "Authorization: Bearer YOUR_ACCESS_TOKEN" -``` +Когда бот отправляет сообщение со ссылкой, Пачка может запросить у бота данные для превью. Бот может ответить через [Создание превью ссылки](POST /messages/{id}/link_previews) с заголовком, описанием и изображением. +Подробнее — в [документации разворачивания ссылок](/guides/link-previews). -**Получение всех событий, связанных с конкретным пользователем** +--- -```bash -# Для получения следующей страницы используйте cursor из meta.paginate.next_page -curl "https://api.pachca.com/api/shared/v1/audit_events?start_time=2025-05-01T00:00:00Z&end_time=2025-05-02T00:00:00Z&actor_id=133321&actor_type=User" \ - -H "Authorization: Bearer YOUR_ACCESS_TOKEN" -``` +## Журнал безопасности +Ресурс **Security** предоставляет доступ к журналу аудита — списку событий безопасности в пространстве. -**Получение всех изменений прав доступа к чатам** +**Доступные фильтры:** -```bash -# Для получения следующей страницы используйте cursor из meta.paginate.next_page -curl "https://api.pachca.com/api/shared/v1/audit_events?start_time=2025-05-01T00:00:00Z&end_time=2025-05-08T00:00:00Z&event_key=chat_permission_changed" \ - -H "Authorization: Bearer YOUR_ACCESS_TOKEN" -``` +| Фильтр | Описание | +|--------|----------| +| `eventKey` | Тип события (login, message_created, user_deleted и др.) | +| `actorId` | ID пользователя, совершившего действие | +| `actorType` | Тип актора (user или bot) | +| `entityId` | ID сущности, над которой совершено действие | +| `entityType` | Тип сущности | +| `startTime` | Начало временного диапазона | +| `endTime` | Конец временного диапазона | +Подробнее — в [документации журнала аудита](/guides/audit-events). -## Хранение данных +--- -Журналы аудита хранятся в течение 90 дней для баланса между требованиями соответствия и эффективностью хранения. Все журналы неизменяемы и хранятся в системе только для чтения, чтобы обеспечить целостность данных. -## Типичные сценарии использования +# Устранение ошибок -- Расследовать подозрительные попытки входа в систему -- Отслеживать изменения прав доступа -- Отслеживать действия по удалению сообщений -- Расследовать изменения ролей пользователей -- Отслеживать изменения в составе участников чатов -- Составлять отчеты о соответствии требованиям и во время аудита +## Ошибки авторизации -## Ограничения +### 401 Unauthorized — неверный токен -- Текущая версия API поддерживает только типы событий, указанные в документации -- Данные собираются только с 12 мая 2025 года -- За один запрос можно запросить только один тип события -- Список событий и фильтры планируется развивать в следующих версиях +![Ошибка 401 при неверном токене](/images/n8n/error-invalid-token.avif) ---- +*Ошибка авторизации* -# n8n +**Причина:** указан некорректный или просроченный Access Token. -## Что такое n8n +**Решение:** -n8n — платформа для автоматизации рабочих процессов с открытым исходным кодом. Можно развернуть на собственном сервере или использовать веб-версию. Платформа позволяет создавать интеграции с сервисами без написания кода, используя визуальный редактор с узлами (nodes). +1. Откройте **Credentials** и проверьте значение **Access Token** +2. Убедитесь, что токен скопирован целиком, без лишних пробелов +3. Нажмите **Test** — при ошибке создайте новый токен в Пачке +4. Для бот-токена: **Настройки бота** → вкладка **API** → скопируйте токен +5. Для персонального токена: **Автоматизации** → **Интеграции** → **API** -В n8n встроено более 400 готовых узлов для популярных сервисов. Узлы бывают двух типов: +### 403 Forbidden — недостаточно прав -- **Узел триггера** — событие, запускающее рабочий процесс: новое сообщение, нажатие кнопки, обновление статуса и др. -- **Узел действия** — логика после триггера: отправка сообщения в чат, создание задачи, добавление записи в БД и т.д. +**Причина:** операция требует более высокий уровень доступа, чем предоставляет текущий токен. -n8n автоматически выполняет каждое действие по триггеру в указанном порядке. +**Решение:** -![Интерфейс n8n с визуальным редактором workflow](/images/n8n/n8n-interface.avif) +Доступ к операциям определяется [скоупами](/api/authorization#skoupy) токена, а не его типом. Убедитесь, что ваш токен включает нужные скоупы: -*Визуальный редактор n8n* +| Операция | Требуемые скоупы | +|----------|-----------------| +| Управление сотрудниками (User > Create/Update/Delete) | `users:write` (доступен администраторам и владельцам) | +| Журнал безопасности (Security > Get Many) | `audit_events:read` (доступен администраторам и владельцам) | +| Управление тегами (Group Tag > Create/Update/Delete) | `group_tags:write` (доступен администраторам и владельцам) | +| Отправка сообщений, чаты, задачи | `messages:write`, `chats:write`, `tasks:write` | +Подробнее — в разделе [Авторизация](/api/authorization). -## Настройка +--- +## Ошибки лимитов - ### Шаг 1. Установка n8n +### 429 Too Many Requests — превышение лимита -> **Внимание:** Расширение Пачки доступно пока только в Beta. Его нет в веб-версии n8n — для использования нужно развернуть коробочную версию на собственном сервере. +**Причина:** слишком много запросов за единицу времени. +**Лимиты API:** - Два способа установки: +| Тип операции | Лимит | +|-------------|-------| +| Отправка сообщений | ~4 запроса/сек на чат | +| Остальные операции | ~50 запросов/сек | - **С помощью команды** (требуется Node.js): +**Решение:** - ```bash - npx n8n - ``` +1. Добавьте узел **Wait** между операциями для замедления +2. Используйте **Batching** в настройках узла Pachca (Additional Fields → Request Options → Batching) +3. Для массовых операций используйте **Return All** = `false` с ограниченным **Limit** - **С помощью Docker:** +> При получении 429 или 5xx расширение автоматически повторяет запросы с экспоненциальной задержкой и jitter (до 5 попыток). Учитывается заголовок `Retry-After` из ответа API. - ```bash - docker volume create n8n_data - docker run -it --rm \ - --name n8n \ - -p 5678:5678 \ - -e GENERIC_TIMEZONE="" \ - -e TZ="" \ - -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \ - -e N8N_RUNNERS_ENABLED=true \ - -v n8n_data:/home/node/.n8n \ - docker.n8n.io/n8nio/n8n - ``` +--- - Подробные инструкции — в [официальной документации n8n](https://docs.n8n.io/hosting/) и на [GitHub](https://github.com/n8n-io/n8n). +## Ошибки триггера - После запуска настройте аккаунт владельца (Owner Account), указав почту, имя и пароль. +### Вебхук не приходит - ![Настройка аккаунта владельца n8n](/images/n8n/owner-account.avif) +**Возможные причины и решения:** -*Настройка Owner Account* +1. **Бот не добавлен в чат** — бот получает события только из чатов, в которых он состоит. Добавьте бота в нужный канал +2. **Workflow не активирован** — нажмите **Activate** в правом верхнем углу. Неактивные workflow не принимают вебхуки +3. **Bot ID не указан** — при отсутствии Bot ID в Credentials авторегистрация не работает. Укажите Bot ID или настройте вебхук вручную +4. **n8n недоступен извне** — при локальной установке Пачка не может отправить вебхук на `localhost`. Используйте туннель (ngrok, Cloudflare Tunnel) или разверните n8n на сервере с публичным IP +### Ошибка подписи (Signature Mismatch) - ### Шаг 2. Установка расширения Пачки +**Причина:** Signing Secret в Credentials не совпадает с секретом бота в Пачке. -Расширение доступно на [GitHub](https://github.com/pachca/n8n-nodes-pachca) и [npmjs](https://www.npmjs.com/package/n8n-nodes-pachca). +**Решение:** скопируйте Signing Secret из настроек бота в Пачке (вкладка **API**) и вставьте в Credentials. - Три способа установки: +--- - 1. Зайти в **Settings** > **Community nodes** и добавить `n8n-nodes-pachca` (рекомендуется) - 2. Выполнить команду `npm i n8n-nodes-pachca` в директории n8n - 3. Следовать README-инструкции на [GitHub](https://github.com/pachca/n8n-nodes-pachca) +## Ошибки данных - ![Установка расширения Пачки через Community nodes](/images/n8n/community-nodes.avif) +### Entity ID не найден -*Установка через Community nodes* +**Причина:** указан несуществующий ID чата, пользователя или сообщения. +**Решение:** - ### Шаг 3. Создание Credentials +- Для чатов: используйте **Search** (Search > Get Many Chats) для поиска по имени +- Для пользователей: используйте **Search** (Search > Get Many Users) для поиска +- Для сообщений: убедитесь, что сообщение не было удалено + +### Бот не может отправить сообщение + +**Причина:** бот не является участником целевого чата. + +**Решение:** добавьте бота в чат. Бот может отправлять сообщения только в те чаты, в которых он состоит. -Credentials — данные для авторизации. +--- + +## Ошибки форм + +### Форма не открывается + +**Причина:** `trigger_id` из события `button_pressed` действителен только **3 секунды**. Если между получением вебхука и вызовом [Открытие представления](POST /views/open) проходит больше времени — форма не откроется. - Нажмите **«Add Credential»**, найдите **Pachca API** в списке и заполните поля: +**Решение:** - - **Base URL:** `https://api.pachca.com/api/shared/v1` - - **Access Token:** Токен доступа к API. В Пачке доступны два типа токенов: - - Персональный токен — доступен в разделе **Автоматизации** > **Интеграции** > **API** - - Токен бота — доступен в настройках бота на вкладке **API** +1. Убедитесь, что узел **Form > Create** стоит сразу после триггера, без долгих операций между ними +2. Не используйте узел **Wait** между получением `trigger_id` и открытием формы +3. Если нужна дополнительная логика — выполняйте её после отправки формы, а не до - Подробнее о токенах — в разделе [Авторизация](/api/authorization). Credentials можно создать несколько — для разных операций и токенов. +Подробнее о формах — в [документации форм](/guides/forms/overview). - ![Создание Credentials для Пачки в n8n](/images/n8n/credentials.avif) +--- + +## Ошибки пагинации -*Настройка Pachca API Credentials* +### Возвращаются не все данные +**Причина:** API возвращает данные постранично. Если **Return All** выключен, вы получаете только первую страницу (по умолчанию до 50 записей). - ### Шаг 4. Создание Workflow +**Решение:** -Workflow — визуальный редактор, в котором выстраиваются цепочки триггеров и действий. +1. Включите **Return All** = `true` в настройках узла — n8n автоматически пройдёт по всем страницам через cursor-based пагинацию +2. Если нужен ограниченный набор — используйте **Return All** = `false` и укажите нужное число в поле **Limit** +3. Для больших объёмов данных учитывайте [лимиты API](#oshibki-limitov) — при Return All n8n делает несколько запросов последовательно - ![Визуальный редактор workflow в n8n](/images/n8n/workflow-editor.avif) +--- -*Редактор workflow* +## Общие рекомендации +1. **Включите Retry On Fail** в настройках узла (Settings → Retry On Fail) для автоматического повтора при временных ошибках +2. **Используйте Error Trigger** для обработки ошибок в отдельном workflow — отправляйте уведомление об ошибке в специальный канал +3. **Проверяйте Credentials** кнопкой **Test** перед запуском workflow +4. **Используйте Execute Step** для отладки узлов по одному, не запуская весь workflow - Пример: отправка сообщения от лица бота. Триггер — нажатие кнопки **«Execute Workflow»**, действие — **Send a message** в Пачке: +--- - - **Credential** — от чьего лица будет отправлено сообщение - - **Entity ID** — ID чата - - **Content** — содержание сообщения - Не забудьте добавить бота в чат. +# Миграция с v1 - ![Пример workflow с отправкой сообщения](/images/n8n/workflow-example.avif) +> Обновление необязательно. Все существующие workflow на v1 продолжают работать без изменений. -*Пример отправки сообщения* +## Полная обратная совместимость - В платформу встроено более 400 узлов для популярных сервисов, а дополнительные Community nodes можно установить из интерфейса. При необходимости доступны HTTP-запросы к любому API, условия, кастомный JavaScript- или Python-код. +Версия 2.0 на 100% совместима с v1. При обновлении расширения: +- Существующие workflow остаются на v1 и работают как прежде +- Новые workflow по умолчанию создаются на v2 с обновлёнными именами +- Переход с v1 на v2 — опциональный -## Методы API в nodes Pachca (Beta) +## Переименованные ресурсы -Nodes (узлы) в расширении Пачки для n8n совпадают с методами API. Вот список доступных: +| v1 | v2 | Изменение | +|----|-----|-----------| +| `reactions` | `reaction` | Единственное число | +| `status` | `profile` | Более точное имя | +| `customFields` | `customProperty` | Более точное имя | -### Действия с сообщениями +## Переименованные операции -- **Send a message** — [Новое сообщение](POST /messages) -- **Get a message** — [Информация о сообщении](GET /messages/{id}) -- **Get messages from the chat** — [Список сообщений чата](GET /messages) -- **Update a message** — [Редактирование сообщения](PUT /messages/{id}) -- **Delete a message** — [Удаление сообщения](DELETE /messages/{id}) -- **Pin a message** — [Закрепление сообщения](POST /messages/{id}/pin) -- **Unpin a message** — [Открепление сообщения](DELETE /messages/{id}/pin) -- **Get message readers** — [Список прочитавших сообщение](GET /messages/{id}/read_member_ids) -- **Unfurl message links** — [Unfurl (разворачивание ссылок)](POST /messages/{id}/link_previews) +| Ресурс | v1 | v2 | +|--------|-----|-----| +| Message | `send` | `create` | +| Message | `getById` | `get` | +| Chat | `getById` | `get` | +| User | `getById` | `get` | +| Group Tag | `getById` | `get` | +| Group Tag | `getUsers` | `getAllUsers` | +| Reaction | `addReaction` | `create` | +| Reaction | `deleteReaction` | `delete` | +| Reaction | `getReactions` | `getAll` | +| Custom Property | `getCustomProperties` | `get` | +| Profile | `getProfile` | `get` | +| Thread | `createThread` | `create` | +| Thread | `getThread` | `get` | +| Form | `createView` | `create` | +| File | `upload` | `create` | -### Действия с тредами +## Перенесённые операции -- **Create a thread** — [Новый тред](POST /messages/{id}/thread) -- **Get a thread** — [Информация о треде](GET /threads/{id}) +Некоторые операции из v1 ресурсов были перенесены в новые v2 ресурсы: -### Действия с реакциями +| v1 ресурс | v1 операция | v2 ресурс | v2 операция | +|-----------|-------------|-----------|-------------| +| Chat | `getMembers` | Chat Member | `getAll` | +| Chat | `addUsers` | Chat Member | `create` | +| Chat | `removeUser` | Chat Member | `delete` | +| Chat | `updateRole` | Chat Member | `update` | +| Chat | `leaveChat` | Chat Member | `leave` | +| Group Tag | `addTags` | Chat Member | `addGroupTags` | +| Group Tag | `removeTag` | Chat Member | `removeGroupTags` | +| Message | `getReadMembers` | Read Member | `getAll` | +| Message | `unfurl` | Link Preview | `create` | -- **Add a reaction** — [Новая реакция](POST /messages/{id}/reactions) -- **Remove a reaction** — [Удаление реакции](DELETE /messages/{id}/reactions) -- **Get message reactions** — [Список реакций на сообщение](GET /messages/{id}/reactions) +> Все перенесённые операции продолжают работать в v1 workflow без изменений. Маршрутизатор автоматически транслирует v1 имена в v2. -### Действия с чатом -- **Get all chats** — [Список чатов](GET /chats) -- **Get a chat** — [Информация о чате](GET /chats/{id}) -- **Create a chat** — [Новый чат](POST /chats) -- **Update a chat** — [Обновление чата](PUT /chats/{id}) -- **Archive a chat** — [Архивация чата](PUT /chats/{id}/archive) -- **Unarchive a chat** — [Разархивация чата](PUT /chats/{id}/unarchive) -- **Get chat members** — [Список участников чата](GET /chats/{id}/members) -- **Add users to chat** — [Добавление пользователей](POST /chats/{id}/members) -- **Remove user from chat** — [Исключение пользователя](DELETE /chats/{id}/members/{user_id}) -- **Update user role in chat** — [Редактирование роли](PUT /chats/{id}/members/{user_id}) -- **Leave a chat** — [Выход из чата](DELETE /chats/{id}/leave) +## Новые ресурсы (только v2) -### Действия с пользователями +| Ресурс | Описание | +|--------|----------| +| **Chat Member** | Управление участниками чата: добавление, удаление, роли, теги | +| **Custom Property** | Дополнительные поля пространства | +| **Read Member** | Список прочитавших сообщение | +| **Link Preview** | Разворачивание ссылок в сообщениях | +| **Search** | Полнотекстовый поиск по чатам, сообщениям, пользователям | +| **Chat Export** | Экспорт сообщений из чатов | +| **Security** | Журнал безопасности | -- **Get all users** — [Список сотрудников](GET /users) -- **Get a user** — [Информация о сотруднике](GET /users/{id}) -- **Create a user** — [Новый сотрудник](POST /users) -- **Update a user** — [Редактирование сотрудника](PUT /users/{id}) -- **Delete a user** — [Удаление сотрудника](DELETE /users/{id}) +## Новые функции -### Действия с тегами пользователей +| Функция | Описание | +|---------|----------| +| **Return All / Limit** | Курсорная автопагинация вместо ручного `per`/`page` | +| **Simplify** | Переключатель для получения только ключевых полей из ответа API ([подробнее](/guides/n8n/resources#simplify)) | +| **Pachca Trigger** | Webhook-нода с авторегистрацией вебхука через Bot ID, 16 типов событий | +| **AI Tool Use** | Использование узлов как инструментов AI Agent | +| **Searchable Dropdowns** | Поиск по чатам и пользователям в выпадающих списках | +| **File Upload** | Загрузка файлов через S3 с поддержкой URL и Binary Data | +| **Task CRUD** | Полный CRUD для задач (было только создание) | -- **Get all group tags** — [Список тегов сотрудников](GET /group_tags) -- **Get a group tag** — [Информация о теге](GET /group_tags/{id}) -- **Create a group tag** — [Новый тег](POST /group_tags) -- **Update a group tag** — [Редактирование тега](PUT /group_tags/{id}) -- **Delete a group tag** — [Удаление тега](DELETE /group_tags/{id}) -- **Get users in group tag** — [Список сотрудников тега](GET /group_tags/{id}/users) -- **Add tags to chat** — [Добавление тегов](POST /chats/{id}/group_tags) -- **Remove tag from chat** — [Исключение тега](DELETE /chats/{id}/group_tags/{tag_id}) +## Как работает совместимость -### Действия со статусом и профилем +Расширение использует паттерн **VersionedNodeType** с `defaultVersion: 2`: -- **Get my profile** — [Информация о профиле](GET /profile) -- **Get my status** — [Текущий статус](GET /profile/status) -- **Set my status** — [Новый статус](PUT /profile/status) -- **Clear my status** — [Удаление статуса](DELETE /profile/status) +- **V1** и **V2** — отдельные классы с собственными описаниями ресурсов и операций +- Общий **SharedRouter** обрабатывает запросы обеих версий, транслируя v1 имена ресурсов и операций в v2 на лету +- При обновлении расширения существующие ноды сохраняют `typeVersion: 1` и используют V1 класс — все параметры и поведение остаются прежними +- Новые ноды по умолчанию создаются с `typeVersion: 2` и используют чистый V2 класс +- В Node Creator отображаются только v2 операции — без дубликатов +- V1 ноды в существующих workflow показывают жёлтый баннер «New node version available» с предложением обновиться -### Действия с формами +## Как обновить workflow (необязательно) -- **Create a form** — [Открытие представления](POST /views/open) -- **Process form submission** — закрытие и отображение ошибок -- **Get form templates** +При открытии существующего workflow вы увидите жёлтый баннер в настройках v1 нод — это информационное уведомление, менять ничего не нужно. -### Другие действия +Если вы хотите перевести ноду на v2: -- **Get custom properties** — [Список дополнительных полей](GET /custom_properties) -- **Create a task** — [Новое напоминание](POST /tasks) -- **Update a bot** — [Редактирование бота](PUT /bots/{id}) -- **Upload a file** — [Загрузка файла](POST /direct_url) +1. Откройте workflow в n8n +2. Удалите v1 ноду Pachca +3. Добавьте новую ноду Pachca (по умолчанию v2) +4. Перенастройте с v2 именами ресурсов и операций +5. API-вызовы идентичны — изменились только имена в UI -> **Внимание:** Некоторые действия доступны только с персональным токеном (владельца или участника с ролью «Администратор»). +> При удалении ноды и добавлении новой вы получите v2 с обновлёнными именами и новыми ресурсами. Все параметры и API endpoint-ы остались прежними. --- @@ -5846,7 +7088,7 @@ Albato — платформа для интеграции различных с ## C# SDK -Добавлен официальный [C# SDK](/guides/sdk/csharp) для .NET 8+. Полная поддержка async/await, CancellationToken, автопагинация через `*AllAsync()` методы и автоматические повторы при `429`. Установка: `dotnet add package Pachca.Sdk`. +Добавлен официальный [C# SDK](/guides/sdk/csharp) для .NET 8+. Типизированный клиент с поддержкой async/await, автопагинацией и автоматическими повторными запросами при ошибках сервера. Все примеры кода в документации API теперь доступны на C#. @@ -5929,7 +7171,7 @@ Albato — платформа для интеграции различных с - [Кнопки](/guides/buttons) — интерактивные кнопки в сообщениях - [Входящие вебхуки](/guides/incoming-webhooks) — отправка сообщений через URL - [Разворачивание ссылок](/guides/link-previews) — unfurl-боты для предпросмотра ссылок -- [Albato](/guides/albato) и [n8n](/guides/n8n) — интеграции с no-code платформами +- [Albato](/guides/albato) и [n8n](/guides/n8n/overview) — интеграции с no-code платформами Документация реструктурирована: [Быстрый старт](/guides/quickstart), [Пагинация](/api/pagination), [Загрузка файлов](/api/file-uploads), [Запросы и ответы](/api/requests-responses) вынесены в отдельные страницы, раздел форм разбит на три страницы. @@ -7455,6 +8697,18 @@ await fetch(`${BASE}/messages`, { - `user_id: integer, int32` (required) — Идентификатор пользователя, который нажал кнопку. Пример: `2345` - `chat_id: integer, int32` (required) — Идентификатор чата, в котором была нажата кнопка. Пример: `9012` - `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX. Пример: `1747574400` + - **ViewSubmitWebhookPayload**: Структура исходящего вебхука о заполнении формы + - `type: string` (required) — Тип объекта. Пример: `"view"` + Значения: `view` — Для формы всегда view + - `event: string` (required) — Тип события. Пример: `"submit"` + Значения: `submit` — Отправка формы + - `callback_id: string` (required) — Идентификатор обратного вызова, указанный при открытии представления. Пример: `"timeoff_request_form"` + - `private_metadata: string` (required) — Приватные метаданные, указанные при открытии представления. Пример: `"{'timeoff_id':4378}"` + - `user_id: integer, int32` (required) — Идентификатор пользователя, который отправил форму. Пример: `1235523` + - `data: Record` (required) — Данные заполненных полей представления. Ключ — `action_id` поля, значение — введённые данные + **Структура значений Record:** + - Тип значения: `any` + - `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX. Пример: `1755075544` - **ChatMemberWebhookPayload**: Структура исходящего вебхука об участниках чата - `type: string` (required) — Тип объекта. Пример: `"chat_member"` Значения: `chat_member` — Для участника чата всегда chat_member @@ -19150,6 +20404,18 @@ curl "https://api.pachca.com/api/shared/v1/webhooks/events?limit=1" \ - `user_id: integer, int32` (required) — Идентификатор пользователя, который нажал кнопку - `chat_id: integer, int32` (required) — Идентификатор чата, в котором была нажата кнопка - `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX + - **ViewSubmitWebhookPayload**: Структура исходящего вебхука о заполнении формы + - `type: string` (required) — Тип объекта + Значения: `view` — Для формы всегда view + - `event: string` (required) — Тип события + Значения: `submit` — Отправка формы + - `callback_id: string` (required) — Идентификатор обратного вызова, указанный при открытии представления + - `private_metadata: string` (required) — Приватные метаданные, указанные при открытии представления + - `user_id: integer, int32` (required) — Идентификатор пользователя, который отправил форму + - `data: Record` (required) — Данные заполненных полей представления. Ключ — `action_id` поля, значение — введённые данные + **Структура значений Record:** + - Тип значения: `any` + - `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX - **ChatMemberWebhookPayload**: Структура исходящего вебхука об участниках чата - `type: string` (required) — Тип объекта Значения: `chat_member` — Для участника чата всегда chat_member diff --git a/apps/docs/public/llms.txt b/apps/docs/public/llms.txt index 1e178a60..1f381b44 100644 --- a/apps/docs/public/llms.txt +++ b/apps/docs/public/llms.txt @@ -28,7 +28,7 @@ pachca guide "отправить сообщение" # CLI guide for humans - [Go](https://dev.pachca.com/guides/sdk/go.md): Типизированный клиент для Pachca API на Go с контекстами и автопагинацией - [Kotlin](https://dev.pachca.com/guides/sdk/kotlin.md): Типизированный клиент для Pachca API на Kotlin с корутинами и Ktor - [Swift](https://dev.pachca.com/guides/sdk/swift.md): Типизированный клиент для Pachca API на Swift с async/await и Codable -- [CSharp](https://dev.pachca.com/guides/sdk/csharp.md): Типизированный клиент для Pachca API на C# с async/await и автопагинацией +- [C#](https://dev.pachca.com/guides/sdk/csharp.md): Типизированный клиент для Pachca API на C# с async/await и автопагинацией - [Сценарии](https://dev.pachca.com/guides/workflows.md): Пошаговые сценарии для типичных задач с API - [Боты](https://dev.pachca.com/guides/bots.md): Создание, настройка и возможности ботов в Пачке - [Входящие вебхуки](https://dev.pachca.com/guides/incoming-webhooks.md): Отправка сообщений от имени бота без использования API @@ -41,7 +41,14 @@ pachca guide "отправить сообщение" # CLI guide for humans - [Экспорт сообщений](https://dev.pachca.com/guides/export.md): Экспорт сообщений из чатов: запрос, скачивание и структура архива - [DLP-система](https://dev.pachca.com/guides/dlp.md): Создание правил DLP: условия, контексты и действия - [Журнал аудита событий](https://dev.pachca.com/guides/audit-events.md): Журнал аудита: типы событий, фильтрация и примеры запросов -- [n8n](https://dev.pachca.com/guides/n8n.md): Автоматизации в Пачке через платформу n8n без программирования +- [Обзор](https://dev.pachca.com/guides/n8n/overview.md): Автоматизации в Пачке через платформу n8n — 18 ресурсов, триггер, AI-агент +- [Настройка](https://dev.pachca.com/guides/n8n/setup.md): Установка n8n, расширения Пачки, настройка Credentials и первый workflow +- [Ресурсы и операции](https://dev.pachca.com/guides/n8n/resources.md): Все 18 ресурсов и более 60 операций расширения Пачки для n8n +- [Триггер](https://dev.pachca.com/guides/n8n/trigger.md): Pachca Trigger: 16 типов событий, авторегистрация вебхука, проверка подписи +- [Примеры workflow](https://dev.pachca.com/guides/n8n/workflows.md): Готовые сценарии автоматизации Пачки в n8n: приветствие, пересылка, задачи, согласование, мониторинг, заявки на отпуск +- [Продвинутые функции](https://dev.pachca.com/guides/n8n/advanced.md): Экспорт сообщений, загрузка файлов, кнопки, формы, AI-агент, разворачивание ссылок, журнал безопасности +- [Устранение ошибок](https://dev.pachca.com/guides/n8n/troubleshooting.md): Частые ошибки при работе с Пачкой в n8n: неверный токен, 403, 429, вебхук не приходит +- [Миграция с v1](https://dev.pachca.com/guides/n8n/migration.md): Обновление с v1 на v2: таблицы переименований, новые ресурсы, полная обратная совместимость - [Albato](https://dev.pachca.com/guides/albato.md): Интеграция Пачки с Albato — подключение сотен сервисов без кода - [Последние обновления](https://dev.pachca.com/updates.md): История изменений и новые возможности API - [Авторизация](https://dev.pachca.com/api/authorization.md): Типы токенов, скоупы и настройка доступа к API diff --git a/apps/docs/public/skill.md b/apps/docs/public/skill.md index 37f40fa2..353b6a9c 100644 --- a/apps/docs/public/skill.md +++ b/apps/docs/public/skill.md @@ -224,7 +224,7 @@ Detailed documentation on specific topics is available at: - [Go](https://dev.pachca.com/guides/sdk/go) — Типизированный клиент для Pachca API на Go с контекстами и автопагинацией - [Kotlin](https://dev.pachca.com/guides/sdk/kotlin) — Типизированный клиент для Pachca API на Kotlin с корутинами и Ktor - [Swift](https://dev.pachca.com/guides/sdk/swift) — Типизированный клиент для Pachca API на Swift с async/await и Codable -- [CSharp](https://dev.pachca.com/guides/sdk/csharp) — Типизированный клиент для Pachca API на C# с async/await и автопагинацией +- [C#](https://dev.pachca.com/guides/sdk/csharp) — Типизированный клиент для Pachca API на C# с async/await и автопагинацией - [Сценарии](https://dev.pachca.com/guides/workflows) — Пошаговые сценарии для типичных задач с API - [Боты](https://dev.pachca.com/guides/bots) — Создание, настройка и возможности ботов в Пачке - [Входящие вебхуки](https://dev.pachca.com/guides/incoming-webhooks) — Отправка сообщений от имени бота без использования API @@ -237,7 +237,14 @@ Detailed documentation on specific topics is available at: - [Экспорт сообщений](https://dev.pachca.com/guides/export) — Экспорт сообщений из чатов: запрос, скачивание и структура архива - [DLP-система](https://dev.pachca.com/guides/dlp) — Создание правил DLP: условия, контексты и действия - [Журнал аудита событий](https://dev.pachca.com/guides/audit-events) — Журнал аудита: типы событий, фильтрация и примеры запросов -- [n8n](https://dev.pachca.com/guides/n8n) — Автоматизации в Пачке через платформу n8n без программирования +- [Обзор](https://dev.pachca.com/guides/n8n/overview) — Автоматизации в Пачке через платформу n8n — 18 ресурсов, триггер, AI-агент +- [Настройка](https://dev.pachca.com/guides/n8n/setup) — Установка n8n, расширения Пачки, настройка Credentials и первый workflow +- [Ресурсы и операции](https://dev.pachca.com/guides/n8n/resources) — Все 18 ресурсов и более 60 операций расширения Пачки для n8n +- [Триггер](https://dev.pachca.com/guides/n8n/trigger) — Pachca Trigger: 16 типов событий, авторегистрация вебхука, проверка подписи +- [Примеры workflow](https://dev.pachca.com/guides/n8n/workflows) — Готовые сценарии автоматизации Пачки в n8n: приветствие, пересылка, задачи, согласование, мониторинг, заявки на отпуск +- [Продвинутые функции](https://dev.pachca.com/guides/n8n/advanced) — Экспорт сообщений, загрузка файлов, кнопки, формы, AI-агент, разворачивание ссылок, журнал безопасности +- [Устранение ошибок](https://dev.pachca.com/guides/n8n/troubleshooting) — Частые ошибки при работе с Пачкой в n8n: неверный токен, 403, 429, вебхук не приходит +- [Миграция с v1](https://dev.pachca.com/guides/n8n/migration) — Обновление с v1 на v2: таблицы переименований, новые ресурсы, полная обратная совместимость - [Albato](https://dev.pachca.com/guides/albato) — Интеграция Пачки с Albato — подключение сотен сервисов без кода - [Последние обновления](https://dev.pachca.com/updates) — История изменений и новые возможности API - [Авторизация](https://dev.pachca.com/api/authorization) — Типы токенов, скоупы и настройка доступа к API diff --git a/apps/docs/public/updates.md b/apps/docs/public/updates.md index 86a1d830..d97ef537 100644 --- a/apps/docs/public/updates.md +++ b/apps/docs/public/updates.md @@ -8,7 +8,7 @@ ## C# SDK -Добавлен официальный [C# SDK](/guides/sdk/csharp) для .NET 8+. Полная поддержка async/await, CancellationToken, автопагинация через `*AllAsync()` методы и автоматические повторы при `429`. Установка: `dotnet add package Pachca.Sdk`. +Добавлен официальный [C# SDK](/guides/sdk/csharp) для .NET 8+. Типизированный клиент с поддержкой async/await, автопагинацией и автоматическими повторными запросами при ошибках сервера. Все примеры кода в документации API теперь доступны на C#. @@ -91,7 +91,7 @@ - [Кнопки](/guides/buttons) — интерактивные кнопки в сообщениях - [Входящие вебхуки](/guides/incoming-webhooks) — отправка сообщений через URL - [Разворачивание ссылок](/guides/link-previews) — unfurl-боты для предпросмотра ссылок -- [Albato](/guides/albato) и [n8n](/guides/n8n) — интеграции с no-code платформами +- [Albato](/guides/albato) и [n8n](/guides/n8n/overview) — интеграции с no-code платформами Документация реструктурирована: [Быстрый старт](/guides/quickstart), [Пагинация](/api/pagination), [Загрузка файлов](/api/file-uploads), [Запросы и ответы](/api/requests-responses) вынесены в отдельные страницы, раздел форм разбит на три страницы. diff --git a/apps/docs/public/workflows/n8n/approval-handler.json b/apps/docs/public/workflows/n8n/approval-handler.json new file mode 100644 index 00000000..d4c3ba4f --- /dev/null +++ b/apps/docs/public/workflows/n8n/approval-handler.json @@ -0,0 +1,88 @@ +{ + "name": "Обработка согласования", + "nodes": [ + { + "parameters": { + "events": ["button_pressed"] + }, + "name": "Pachca Trigger", + "type": "n8n-nodes-pachca.pachcaTrigger", + "typeVersion": 2, + "position": [0, 0] + }, + { + "parameters": { + "mode": "rules", + "rules": { + "values": [ + { + "conditions": { + "conditions": [ + { + "leftValue": "={{ $json.data }}", + "rightValue": "approve", + "operator": { "type": "string", "operation": "equals" } + } + ] + }, + "renameOutput": true, + "outputKey": "Одобрено" + }, + { + "conditions": { + "conditions": [ + { + "leftValue": "={{ $json.data }}", + "rightValue": "reject", + "operator": { "type": "string", "operation": "equals" } + } + ] + }, + "renameOutput": true, + "outputKey": "Отклонено" + } + ] + } + }, + "name": "Switch", + "type": "n8n-nodes-base.switch", + "typeVersion": 3.2, + "position": [220, 0] + }, + { + "parameters": { + "resource": "message", + "operation": "update", + "messageId": "={{ $('Pachca Trigger').item.json.message_id }}", + "content": "Запрос **одобрен**" + }, + "name": "Одобрено", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [440, -100] + }, + { + "parameters": { + "resource": "message", + "operation": "update", + "messageId": "={{ $('Pachca Trigger').item.json.message_id }}", + "content": "Запрос **отклонён**" + }, + "name": "Отклонено", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [440, 100] + } + ], + "connections": { + "Pachca Trigger": { "main": [[{ "node": "Switch", "type": "main", "index": 0 }]] }, + "Switch": { + "main": [ + [{ "node": "Одобрено", "type": "main", "index": 0 }], + [{ "node": "Отклонено", "type": "main", "index": 0 }] + ] + } + }, + "settings": { "executionOrder": "v1" }, + "pinData": {} +} diff --git a/apps/docs/public/workflows/n8n/approval.json b/apps/docs/public/workflows/n8n/approval.json new file mode 100644 index 00000000..d06762de --- /dev/null +++ b/apps/docs/public/workflows/n8n/approval.json @@ -0,0 +1,38 @@ +{ + "name": "Согласование с кнопками", + "nodes": [ + { + "parameters": { + "httpMethod": "POST", + "path": "approval", + "responseMode": "onReceived", + "responseData": "allEntries" + }, + "name": "Webhook", + "type": "n8n-nodes-base.webhook", + "typeVersion": 2, + "position": [0, 0], + "webhookId": "approval-webhook" + }, + { + "parameters": { + "resource": "message", + "operation": "create", + "entityId": "CHAT_ID", + "content": "Запрос на согласование:\n\n{{ $json.body.text || 'Новый запрос' }}", + "additionalFields": { + "buttons": "[[{\"text\": \"Согласовать\", \"data\": \"approve\"}, {\"text\": \"Отклонить\", \"data\": \"reject\"}]]" + } + }, + "name": "Отправить с кнопками", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [220, 0] + } + ], + "connections": { + "Webhook": { "main": [[{ "node": "Отправить с кнопками", "type": "main", "index": 0 }]] } + }, + "settings": { "executionOrder": "v1" }, + "pinData": {} +} diff --git a/apps/docs/public/workflows/n8n/forward.json b/apps/docs/public/workflows/n8n/forward.json new file mode 100644 index 00000000..2e5df90f --- /dev/null +++ b/apps/docs/public/workflows/n8n/forward.json @@ -0,0 +1,52 @@ +{ + "name": "Пересылка сообщений", + "nodes": [ + { + "parameters": { + "events": ["new_message"] + }, + "name": "Pachca Trigger", + "type": "n8n-nodes-pachca.pachcaTrigger", + "typeVersion": 2, + "position": [0, 0] + }, + { + "parameters": { + "conditions": { + "options": { "caseSensitive": false, "leftValue": "", "typeValidation": "strict" }, + "conditions": [ + { + "id": "1", + "leftValue": "={{ $json.chat_id }}", + "rightValue": "CHAT_ID_ИСТОЧНИКА", + "operator": { "type": "number", "operation": "equals" } + } + ], + "combinator": "and" + } + }, + "name": "IF из нужного чата", + "type": "n8n-nodes-base.if", + "typeVersion": 2.2, + "position": [220, 0] + }, + { + "parameters": { + "resource": "message", + "operation": "create", + "entityId": "CHAT_ID_ЦЕЛЕВОГО", + "content": "**Пересылка от {{ $('Pachca Trigger').item.json.user_id }}:**\n\n{{ $('Pachca Trigger').item.json.content }}" + }, + "name": "Переслать", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [440, 0] + } + ], + "connections": { + "Pachca Trigger": { "main": [[{ "node": "IF из нужного чата", "type": "main", "index": 0 }]] }, + "IF из нужного чата": { "main": [[{ "node": "Переслать", "type": "main", "index": 0 }]] } + }, + "settings": { "executionOrder": "v1" }, + "pinData": {} +} diff --git a/apps/docs/public/workflows/n8n/monitoring.json b/apps/docs/public/workflows/n8n/monitoring.json new file mode 100644 index 00000000..bb4306ba --- /dev/null +++ b/apps/docs/public/workflows/n8n/monitoring.json @@ -0,0 +1,66 @@ +{ + "name": "Мониторинг + алерт", + "nodes": [ + { + "parameters": { + "rule": { + "interval": [{ "field": "minutes", "minutesInterval": 5 }] + } + }, + "name": "Schedule Trigger", + "type": "n8n-nodes-base.scheduleTrigger", + "typeVersion": 1.2, + "position": [0, 0] + }, + { + "parameters": { + "method": "GET", + "url": "https://YOUR_SERVICE/health", + "options": { "timeout": 10000 } + }, + "name": "HTTP Request", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [220, 0] + }, + { + "parameters": { + "conditions": { + "options": { "caseSensitive": false, "leftValue": "", "typeValidation": "strict" }, + "conditions": [ + { + "id": "1", + "leftValue": "={{ $response.statusCode }}", + "rightValue": "200", + "operator": { "type": "number", "operation": "notEquals" } + } + ], + "combinator": "and" + } + }, + "name": "IF не 200", + "type": "n8n-nodes-base.if", + "typeVersion": 2.2, + "position": [440, 0] + }, + { + "parameters": { + "resource": "message", + "operation": "create", + "entityId": "CHAT_ID_МОНИТОРИНГА", + "content": "**Алерт:** сервис недоступен!\n\nСтатус: {{ $('HTTP Request').item.json.statusCode }}\nВремя: {{ $now.format('HH:mm:ss') }}" + }, + "name": "Алерт в Пачку", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [660, 0] + } + ], + "connections": { + "Schedule Trigger": { "main": [[{ "node": "HTTP Request", "type": "main", "index": 0 }]] }, + "HTTP Request": { "main": [[{ "node": "IF не 200", "type": "main", "index": 0 }]] }, + "IF не 200": { "main": [[{ "node": "Алерт в Пачку", "type": "main", "index": 0 }]] } + }, + "settings": { "executionOrder": "v1" }, + "pinData": {} +} diff --git a/apps/docs/public/workflows/n8n/reminder.json b/apps/docs/public/workflows/n8n/reminder.json new file mode 100644 index 00000000..066fb958 --- /dev/null +++ b/apps/docs/public/workflows/n8n/reminder.json @@ -0,0 +1,66 @@ +{ + "name": "Напоминание о задачах", + "nodes": [ + { + "parameters": { + "rule": { + "interval": [{ "field": "cronExpression", "expression": "0 10 * * 1-5" }] + } + }, + "name": "Schedule Trigger", + "type": "n8n-nodes-base.scheduleTrigger", + "typeVersion": 1.2, + "position": [0, 0] + }, + { + "parameters": { + "resource": "task", + "operation": "getMany", + "returnAll": true + }, + "name": "Получить задачи", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [220, 0] + }, + { + "parameters": { + "conditions": { + "options": { "caseSensitive": false, "leftValue": "", "typeValidation": "strict" }, + "conditions": [ + { + "id": "1", + "leftValue": "={{ $json.due_at }}", + "rightValue": "={{ $now.toISO() }}", + "operator": { "type": "dateTime", "operation": "before" } + } + ], + "combinator": "and" + } + }, + "name": "IF просрочена", + "type": "n8n-nodes-base.if", + "typeVersion": 2.2, + "position": [440, 0] + }, + { + "parameters": { + "resource": "message", + "operation": "create", + "entityId": "CHAT_ID", + "content": "Просроченная задача: **{{ $json.content }}**\nДедлайн: {{ $json.due_at }}" + }, + "name": "Уведомление", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [660, 0] + } + ], + "connections": { + "Schedule Trigger": { "main": [[{ "node": "Получить задачи", "type": "main", "index": 0 }]] }, + "Получить задачи": { "main": [[{ "node": "IF просрочена", "type": "main", "index": 0 }]] }, + "IF просрочена": { "main": [[{ "node": "Уведомление", "type": "main", "index": 0 }]] } + }, + "settings": { "executionOrder": "v1" }, + "pinData": {} +} diff --git a/apps/docs/public/workflows/n8n/vacation-handler.json b/apps/docs/public/workflows/n8n/vacation-handler.json new file mode 100644 index 00000000..1762832b --- /dev/null +++ b/apps/docs/public/workflows/n8n/vacation-handler.json @@ -0,0 +1,71 @@ +{ + "name": "Обработка заявки на отпуск", + "nodes": [ + { + "parameters": { + "events": ["button_pressed"] + }, + "name": "Button Pressed", + "type": "n8n-nodes-pachca.pachcaTrigger", + "typeVersion": 2, + "position": [0, 0] + }, + { + "parameters": { + "resource": "form", + "operation": "create", + "triggerId": "={{ $json.trigger_id }}", + "title": "Заявка на отпуск", + "blocks": "[{\"type\":\"input\",\"element\":{\"type\":\"datepicker\",\"action_id\":\"date_from\"},\"label\":{\"text\":\"Дата начала\"}},{\"type\":\"input\",\"element\":{\"type\":\"datepicker\",\"action_id\":\"date_to\"},\"label\":{\"text\":\"Дата окончания\"}},{\"type\":\"input\",\"element\":{\"type\":\"plain_text_input\",\"multiline\":true,\"action_id\":\"comment\"},\"label\":{\"text\":\"Комментарий\"},\"optional\":true}]" + }, + "name": "Форма отпуска", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [260, 0] + }, + { + "parameters": { + "events": ["form_submitted"] + }, + "name": "Form Submitted", + "type": "n8n-nodes-pachca.pachcaTrigger", + "typeVersion": 2, + "position": [520, 0] + }, + { + "parameters": { + "resource": "thread", + "operation": "create", + "messageId": "={{ $(\"Form Submitted\").item.json.message_id }}", + "content": "**Заявка на отпуск**\n\n**С:** {{ $(\"Form Submitted\").item.json.values.date_from }}\n**По:** {{ $(\"Form Submitted\").item.json.values.date_to }}\n**Комментарий:** {{ $(\"Form Submitted\").item.json.values.comment || '—' }}" + }, + "name": "Тред с заявкой", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [780, 0] + }, + { + "parameters": { + "resource": "message", + "operation": "create", + "entityId": "CHAT_ID_HR", + "content": "Новая заявка на отпуск. Примите решение:", + "additionalFields": { + "buttons": "[[{\"text\": \"Согласовать\", \"data\": \"approve\"}, {\"text\": \"Отклонить\", \"data\": \"reject\"}]]" + } + }, + "name": "Кнопки решения", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [1040, 0] + } + ], + "connections": { + "Button Pressed": { "main": [[{ "node": "Форма отпуска", "type": "main", "index": 0 }]] }, + "Форма отпуска": { "main": [[{ "node": "Form Submitted", "type": "main", "index": 0 }]] }, + "Form Submitted": { "main": [[{ "node": "Тред с заявкой", "type": "main", "index": 0 }]] }, + "Тред с заявкой": { "main": [[{ "node": "Кнопки решения", "type": "main", "index": 0 }]] } + }, + "settings": { "executionOrder": "v1" }, + "pinData": {} +} diff --git a/apps/docs/public/workflows/n8n/vacation.json b/apps/docs/public/workflows/n8n/vacation.json new file mode 100644 index 00000000..95139550 --- /dev/null +++ b/apps/docs/public/workflows/n8n/vacation.json @@ -0,0 +1,55 @@ +{ + "name": "Заявка на отпуск", + "nodes": [ + { + "parameters": { + "events": ["new_message"] + }, + "name": "Pachca Trigger", + "type": "n8n-nodes-pachca.pachcaTrigger", + "typeVersion": 2, + "position": [0, 0] + }, + { + "parameters": { + "conditions": { + "options": { "caseSensitive": false, "leftValue": "", "typeValidation": "strict" }, + "conditions": [ + { + "id": "1", + "leftValue": "={{ $json.content }}", + "rightValue": "/отпуск", + "operator": { "type": "string", "operation": "contains" } + } + ], + "combinator": "and" + } + }, + "name": "IF /отпуск", + "type": "n8n-nodes-base.if", + "typeVersion": 2.2, + "position": [260, 0] + }, + { + "parameters": { + "resource": "message", + "operation": "create", + "entityId": "={{ $(\"Pachca Trigger\").item.json.chat_id }}", + "content": "Нажмите кнопку, чтобы оформить заявку на отпуск:", + "additionalFields": { + "buttons": "[[{\"text\": \"Создать заявку\", \"data\": \"vacation_request\"}]]" + } + }, + "name": "Кнопка заявки", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [520, 0] + } + ], + "connections": { + "Pachca Trigger": { "main": [[{ "node": "IF /отпуск", "type": "main", "index": 0 }]] }, + "IF /отпуск": { "main": [[{ "node": "Кнопка заявки", "type": "main", "index": 0 }]] } + }, + "settings": { "executionOrder": "v1" }, + "pinData": {} +} diff --git a/apps/docs/public/workflows/n8n/welcome.json b/apps/docs/public/workflows/n8n/welcome.json new file mode 100644 index 00000000..7d2e9e01 --- /dev/null +++ b/apps/docs/public/workflows/n8n/welcome.json @@ -0,0 +1,52 @@ +{ + "name": "Приветствие нового сотрудника", + "nodes": [ + { + "parameters": { + "events": ["new_message"] + }, + "name": "Pachca Trigger", + "type": "n8n-nodes-pachca.pachcaTrigger", + "typeVersion": 2, + "position": [0, 0] + }, + { + "parameters": { + "conditions": { + "options": { "caseSensitive": false, "leftValue": "", "typeValidation": "strict" }, + "conditions": [ + { + "id": "1", + "leftValue": "={{ $json.content }}", + "rightValue": "присоединил", + "operator": { "type": "string", "operation": "contains" } + } + ], + "combinator": "and" + } + }, + "name": "IF системное", + "type": "n8n-nodes-base.if", + "typeVersion": 2.2, + "position": [220, 0] + }, + { + "parameters": { + "resource": "message", + "operation": "create", + "entityId": "={{ $('Pachca Trigger').item.json.chat_id }}", + "content": "Добро пожаловать в команду! Если есть вопросы — пишите в этот чат." + }, + "name": "Приветствие", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [440, 0] + } + ], + "connections": { + "Pachca Trigger": { "main": [[{ "node": "IF системное", "type": "main", "index": 0 }]] }, + "IF системное": { "main": [[{ "node": "Приветствие", "type": "main", "index": 0 }]] } + }, + "settings": { "executionOrder": "v1" }, + "pinData": {} +} diff --git a/apps/docs/redirects.ts b/apps/docs/redirects.ts index 2a3a86c8..675aa407 100644 --- a/apps/docs/redirects.ts +++ b/apps/docs/redirects.ts @@ -13,6 +13,8 @@ const redirects: Redirect[] = [ // ===== Guides: accordion parent → first child ===== { source: '/guides/forms', destination: '/guides/forms/overview' }, { source: '/guides/forms.md', destination: '/guides/forms/overview.md' }, + { source: '/guides/n8n', destination: '/guides/n8n/overview' }, + { source: '/guides/n8n.md', destination: '/guides/n8n/overview.md' }, // ===== SDK → Guides ===== { source: '/api/sdk', destination: '/guides/sdk/overview' }, diff --git a/apps/docs/scripts/generate-llms.ts b/apps/docs/scripts/generate-llms.ts index 0b3f0258..4c23e998 100644 --- a/apps/docs/scripts/generate-llms.ts +++ b/apps/docs/scripts/generate-llms.ts @@ -12,7 +12,6 @@ import type { Endpoint } from '../lib/openapi/types'; import { generateRequestExample, generateExample } from '../lib/openapi/example-generator'; import { generateAllSkills } from './skills/generate'; import { SKILL_TAG_MAP, ROUTER_SKILL_CONFIG } from './skills/config'; -import { WORKFLOWS } from '@pachca/spec/workflows'; const SITE_URL = 'https://dev.pachca.com'; @@ -433,52 +432,6 @@ Error response body: \`{ "errors": [{ "key": "field", "value": "description" }] ].join('\n'); } -function generateScenariosJson() { - const scenarios: { - id: string; - title: string; - skill: string; - steps: { - description: string; - command?: string; - apiMethod?: string; - apiPath?: string; - notes?: string; - }[]; - notes?: string; - related?: string[]; - }[] = []; - const skillNames = new Set(SKILL_TAG_MAP.map((c) => c.name)); - - for (const [skillName, workflows] of Object.entries(WORKFLOWS)) { - if (!skillNames.has(skillName)) continue; - for (let i = 0; i < workflows.length; i++) { - const wf = workflows[i]; - scenarios.push({ - id: `${skillName}-${i}`, - title: wf.title, - skill: skillName, - steps: wf.steps.map((step) => { - const s: Record = { description: step.description }; - if (step.command) s.command = step.command; - if (step.apiMethod) s.apiMethod = step.apiMethod; - if (step.apiPath) s.apiPath = step.apiPath; - if (step.notes) s.notes = step.notes; - return s as (typeof scenarios)[0]['steps'][0]; - }), - ...(wf.notes ? { notes: wf.notes } : {}), - ...(wf.related?.length ? { related: wf.related } : {}), - }); - } - } - - return { - $schema: 'https://dev.pachca.com/scenarios.schema.json', - version: '1.0', - scenarios, - }; -} - function generatePostmanCollection(api: Awaited>) { const baseUrl = api.servers[0]?.url ?? 'https://api.pachca.com/api/shared/v1'; const grouped = groupByTag(api.endpoints); @@ -679,9 +632,7 @@ async function main() { } console.log(`✓ ${skillFiles.length} skill files`); - const scenarios = generateScenariosJson(); - writeFile('public/scenarios.json', JSON.stringify(scenarios, null, 2) + '\n'); - console.log(`✓ public/scenarios.json (${scenarios.scenarios.length} scenarios)`); + // scenarios.json removed — its role is covered by the n8n node (n8n-nodes-pachca) const postmanCollection = generatePostmanCollection(api); writeFile('public/pachca.postman_collection.json', JSON.stringify(postmanCollection, null, 2)); diff --git a/bun.lock b/bun.lock index c4efd1f1..ad0b7b54 100644 --- a/bun.lock +++ b/bun.lock @@ -5,6 +5,7 @@ "": { "name": "pachca-api", "devDependencies": { + "@playwright/test": "^1.50.0", "turbo": "^2.8.1", }, }, @@ -48,6 +49,22 @@ "tailwindcss": "^4", }, }, + "integrations/n8n": { + "name": "n8n-nodes-pachca", + "version": "0.0.0-dev", + "devDependencies": { + "@n8n/node-cli": "^0.23.0", + "@pachca/openapi-parser": "workspace:*", + "eslint": "^9.0.0", + "n8n-workflow": "*", + "tsx": "^4.0.0", + "typescript": "^5.9.0", + "vitest": "^3.0.0", + }, + "peerDependencies": { + "n8n-workflow": "*", + }, + }, "packages/cli": { "name": "@pachca/cli", "version": "0.0.0", @@ -106,11 +123,13 @@ "name": "@pachca/spec", "version": "1.0.0", "devDependencies": { + "@types/js-yaml": "^4.0.9", "@typespec/compiler": "^1.7.1", "@typespec/http": "^1.7.0", "@typespec/openapi": "^1.7.0", "@typespec/openapi3": "^1.7.0", "@typespec/rest": "^0.77.0", + "js-yaml": "^4.1.1", }, }, "sdk/csharp": { @@ -162,6 +181,8 @@ "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], + "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.27.3", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw=="], + "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="], "@aws-crypto/crc32c": ["@aws-crypto/crc32c@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag=="], @@ -176,75 +197,75 @@ "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], - "@aws-sdk/client-cloudfront": ["@aws-sdk/client-cloudfront@3.1001.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.16", "@aws-sdk/credential-provider-node": "^3.972.15", "@aws-sdk/middleware-host-header": "^3.972.6", "@aws-sdk/middleware-logger": "^3.972.6", "@aws-sdk/middleware-recursion-detection": "^3.972.6", "@aws-sdk/middleware-user-agent": "^3.972.16", "@aws-sdk/region-config-resolver": "^3.972.6", "@aws-sdk/types": "^3.973.4", "@aws-sdk/util-endpoints": "^3.996.3", "@aws-sdk/util-user-agent-browser": "^3.972.6", "@aws-sdk/util-user-agent-node": "^3.973.1", "@smithy/config-resolver": "^4.4.9", "@smithy/core": "^3.23.7", "@smithy/fetch-http-handler": "^5.3.12", "@smithy/hash-node": "^4.2.10", "@smithy/invalid-dependency": "^4.2.10", "@smithy/middleware-content-length": "^4.2.10", "@smithy/middleware-endpoint": "^4.4.21", "@smithy/middleware-retry": "^4.4.38", "@smithy/middleware-serde": "^4.2.11", "@smithy/middleware-stack": "^4.2.10", "@smithy/node-config-provider": "^4.3.10", "@smithy/node-http-handler": "^4.4.13", "@smithy/protocol-http": "^5.3.10", "@smithy/smithy-client": "^4.12.1", "@smithy/types": "^4.13.0", "@smithy/url-parser": "^4.2.10", "@smithy/util-base64": "^4.3.1", "@smithy/util-body-length-browser": "^4.2.1", "@smithy/util-body-length-node": "^4.2.2", "@smithy/util-defaults-mode-browser": "^4.3.37", "@smithy/util-defaults-mode-node": "^4.2.40", "@smithy/util-endpoints": "^3.3.1", "@smithy/util-middleware": "^4.2.10", "@smithy/util-retry": "^4.2.10", "@smithy/util-stream": "^4.5.16", "@smithy/util-utf8": "^4.2.1", "@smithy/util-waiter": "^4.2.10", "tslib": "^2.6.2" } }, "sha512-zp6+jzAvrfgct46xhUWNFWJApcVLoBNzjwfRUbPKKqkDj2NQd+wh6zy0JMLqdo948FD26fBtVojjeYqyh0EZmw=="], + "@aws-sdk/client-cloudfront": ["@aws-sdk/client-cloudfront@3.1009.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.20", "@aws-sdk/credential-provider-node": "^3.972.21", "@aws-sdk/middleware-host-header": "^3.972.8", "@aws-sdk/middleware-logger": "^3.972.8", "@aws-sdk/middleware-recursion-detection": "^3.972.8", "@aws-sdk/middleware-user-agent": "^3.972.21", "@aws-sdk/region-config-resolver": "^3.972.8", "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-endpoints": "^3.996.5", "@aws-sdk/util-user-agent-browser": "^3.972.8", "@aws-sdk/util-user-agent-node": "^3.973.7", "@smithy/config-resolver": "^4.4.11", "@smithy/core": "^3.23.11", "@smithy/fetch-http-handler": "^5.3.15", "@smithy/hash-node": "^4.2.12", "@smithy/invalid-dependency": "^4.2.12", "@smithy/middleware-content-length": "^4.2.12", "@smithy/middleware-endpoint": "^4.4.25", "@smithy/middleware-retry": "^4.4.42", "@smithy/middleware-serde": "^4.2.14", "@smithy/middleware-stack": "^4.2.12", "@smithy/node-config-provider": "^4.3.12", "@smithy/node-http-handler": "^4.4.16", "@smithy/protocol-http": "^5.3.12", "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", "@smithy/util-defaults-mode-browser": "^4.3.41", "@smithy/util-defaults-mode-node": "^4.2.44", "@smithy/util-endpoints": "^3.3.3", "@smithy/util-middleware": "^4.2.12", "@smithy/util-retry": "^4.2.12", "@smithy/util-stream": "^4.5.19", "@smithy/util-utf8": "^4.2.2", "@smithy/util-waiter": "^4.2.13", "tslib": "^2.6.2" } }, "sha512-KRac+gkuj3u49IyWkrudHRlP/q/faTto+1xRS7Aj6cDGewMIzgdQArrdZEJoVntbaVZHLM5s/NVmWORzBWNcSw=="], - "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.1001.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.16", "@aws-sdk/credential-provider-node": "^3.972.15", "@aws-sdk/middleware-bucket-endpoint": "^3.972.6", "@aws-sdk/middleware-expect-continue": "^3.972.6", "@aws-sdk/middleware-flexible-checksums": "^3.973.2", "@aws-sdk/middleware-host-header": "^3.972.6", "@aws-sdk/middleware-location-constraint": "^3.972.6", "@aws-sdk/middleware-logger": "^3.972.6", "@aws-sdk/middleware-recursion-detection": "^3.972.6", "@aws-sdk/middleware-sdk-s3": "^3.972.16", "@aws-sdk/middleware-ssec": "^3.972.6", "@aws-sdk/middleware-user-agent": "^3.972.16", "@aws-sdk/region-config-resolver": "^3.972.6", "@aws-sdk/signature-v4-multi-region": "^3.996.4", "@aws-sdk/types": "^3.973.4", "@aws-sdk/util-endpoints": "^3.996.3", "@aws-sdk/util-user-agent-browser": "^3.972.6", "@aws-sdk/util-user-agent-node": "^3.973.1", "@smithy/config-resolver": "^4.4.9", "@smithy/core": "^3.23.7", "@smithy/eventstream-serde-browser": "^4.2.10", "@smithy/eventstream-serde-config-resolver": "^4.3.10", "@smithy/eventstream-serde-node": "^4.2.10", "@smithy/fetch-http-handler": "^5.3.12", "@smithy/hash-blob-browser": "^4.2.11", "@smithy/hash-node": "^4.2.10", "@smithy/hash-stream-node": "^4.2.10", "@smithy/invalid-dependency": "^4.2.10", "@smithy/md5-js": "^4.2.10", "@smithy/middleware-content-length": "^4.2.10", "@smithy/middleware-endpoint": "^4.4.21", "@smithy/middleware-retry": "^4.4.38", "@smithy/middleware-serde": "^4.2.11", "@smithy/middleware-stack": "^4.2.10", "@smithy/node-config-provider": "^4.3.10", "@smithy/node-http-handler": "^4.4.13", "@smithy/protocol-http": "^5.3.10", "@smithy/smithy-client": "^4.12.1", "@smithy/types": "^4.13.0", "@smithy/url-parser": "^4.2.10", "@smithy/util-base64": "^4.3.1", "@smithy/util-body-length-browser": "^4.2.1", "@smithy/util-body-length-node": "^4.2.2", "@smithy/util-defaults-mode-browser": "^4.3.37", "@smithy/util-defaults-mode-node": "^4.2.40", "@smithy/util-endpoints": "^3.3.1", "@smithy/util-middleware": "^4.2.10", "@smithy/util-retry": "^4.2.10", "@smithy/util-stream": "^4.5.16", "@smithy/util-utf8": "^4.2.1", "@smithy/util-waiter": "^4.2.10", "tslib": "^2.6.2" } }, "sha512-uKgFjQuBjMcd0iigLQwnqIp9gOy/5TGBxa42rcb6l5byDt1mrwOe6fyWTEUEJaNHG2LKYSPUibteGvM1zfm0Rw=="], + "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.1014.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.23", "@aws-sdk/credential-provider-node": "^3.972.24", "@aws-sdk/middleware-bucket-endpoint": "^3.972.8", "@aws-sdk/middleware-expect-continue": "^3.972.8", "@aws-sdk/middleware-flexible-checksums": "^3.974.3", "@aws-sdk/middleware-host-header": "^3.972.8", "@aws-sdk/middleware-location-constraint": "^3.972.8", "@aws-sdk/middleware-logger": "^3.972.8", "@aws-sdk/middleware-recursion-detection": "^3.972.8", "@aws-sdk/middleware-sdk-s3": "^3.972.23", "@aws-sdk/middleware-ssec": "^3.972.8", "@aws-sdk/middleware-user-agent": "^3.972.24", "@aws-sdk/region-config-resolver": "^3.972.9", "@aws-sdk/signature-v4-multi-region": "^3.996.11", "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-endpoints": "^3.996.5", "@aws-sdk/util-user-agent-browser": "^3.972.8", "@aws-sdk/util-user-agent-node": "^3.973.10", "@smithy/config-resolver": "^4.4.13", "@smithy/core": "^3.23.12", "@smithy/eventstream-serde-browser": "^4.2.12", "@smithy/eventstream-serde-config-resolver": "^4.3.12", "@smithy/eventstream-serde-node": "^4.2.12", "@smithy/fetch-http-handler": "^5.3.15", "@smithy/hash-blob-browser": "^4.2.13", "@smithy/hash-node": "^4.2.12", "@smithy/hash-stream-node": "^4.2.12", "@smithy/invalid-dependency": "^4.2.12", "@smithy/md5-js": "^4.2.12", "@smithy/middleware-content-length": "^4.2.12", "@smithy/middleware-endpoint": "^4.4.27", "@smithy/middleware-retry": "^4.4.44", "@smithy/middleware-serde": "^4.2.15", "@smithy/middleware-stack": "^4.2.12", "@smithy/node-config-provider": "^4.3.12", "@smithy/node-http-handler": "^4.5.0", "@smithy/protocol-http": "^5.3.12", "@smithy/smithy-client": "^4.12.7", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", "@smithy/util-defaults-mode-browser": "^4.3.43", "@smithy/util-defaults-mode-node": "^4.2.47", "@smithy/util-endpoints": "^3.3.3", "@smithy/util-middleware": "^4.2.12", "@smithy/util-retry": "^4.2.12", "@smithy/util-stream": "^4.5.20", "@smithy/util-utf8": "^4.2.2", "@smithy/util-waiter": "^4.2.13", "tslib": "^2.6.2" } }, "sha512-0XLrOT4Cm3NEhhiME7l/8LbTXS4KdsbR4dSrY207KNKTcHLLTZ9EXt4ZpgnTfLvWQF3pGP2us4Zi1fYLo0N+Ow=="], - "@aws-sdk/core": ["@aws-sdk/core@3.973.16", "", { "dependencies": { "@aws-sdk/types": "^3.973.4", "@aws-sdk/xml-builder": "^3.972.9", "@smithy/core": "^3.23.7", "@smithy/node-config-provider": "^4.3.10", "@smithy/property-provider": "^4.2.10", "@smithy/protocol-http": "^5.3.10", "@smithy/signature-v4": "^5.3.10", "@smithy/smithy-client": "^4.12.1", "@smithy/types": "^4.13.0", "@smithy/util-base64": "^4.3.1", "@smithy/util-middleware": "^4.2.10", "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-Nasoyb5K4jfvncTKQyA13q55xHoz9as01NVYP05B0Kzux/X5UhMn3qXsZDyWOSXkfSCAIrMBKmVVWbI0vUapdQ=="], + "@aws-sdk/core": ["@aws-sdk/core@3.973.25", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@aws-sdk/xml-builder": "^3.972.16", "@smithy/core": "^3.23.12", "@smithy/node-config-provider": "^4.3.12", "@smithy/property-provider": "^4.2.12", "@smithy/protocol-http": "^5.3.12", "@smithy/signature-v4": "^5.3.12", "@smithy/smithy-client": "^4.12.7", "@smithy/types": "^4.13.1", "@smithy/util-base64": "^4.3.2", "@smithy/util-middleware": "^4.2.12", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-TNrx7eq6nKNOO62HWPqoBqPLXEkW6nLZQGwjL6lq1jZtigWYbK1NbCnT7mKDzbLMHZfuOECUt3n6CzxjUW9HWQ=="], - "@aws-sdk/crc64-nvme": ["@aws-sdk/crc64-nvme@3.972.3", "", { "dependencies": { "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-UExeK+EFiq5LAcbHm96CQLSia+5pvpUVSAsVApscBzayb7/6dJBJKwV4/onsk4VbWSmqxDMcfuTD+pC4RxgZHg=="], + "@aws-sdk/crc64-nvme": ["@aws-sdk/crc64-nvme@3.972.5", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg=="], - "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.14", "", { "dependencies": { "@aws-sdk/core": "^3.973.16", "@aws-sdk/types": "^3.973.4", "@smithy/property-provider": "^4.2.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-PvnBY9rwBuLh9MEsAng28DG+WKl+txerKgf4BU9IPAqYI7FBIo1x6q/utLf4KLyQYgSy1TLQnbQuXx5xfBGASg=="], + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.23", "", { "dependencies": { "@aws-sdk/core": "^3.973.25", "@aws-sdk/types": "^3.973.6", "@smithy/property-provider": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-EamaclJcCEaPHp6wiVknNMM2RlsPMjAHSsYSFLNENBM8Wz92QPc6cOn3dif6vPDQt0Oo4IEghDy3NMDCzY/IvA=="], - "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.16", "", { "dependencies": { "@aws-sdk/core": "^3.973.16", "@aws-sdk/types": "^3.973.4", "@smithy/fetch-http-handler": "^5.3.12", "@smithy/node-http-handler": "^4.4.13", "@smithy/property-provider": "^4.2.10", "@smithy/protocol-http": "^5.3.10", "@smithy/smithy-client": "^4.12.1", "@smithy/types": "^4.13.0", "@smithy/util-stream": "^4.5.16", "tslib": "^2.6.2" } }, "sha512-m/QAcvw5OahqGPjeAnKtgfWgjLxeWOYj7JSmxKK6PLyKp2S/t2TAHI6EELEzXnIz28RMgbQLukJkVAqPASVAGQ=="], + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.25", "", { "dependencies": { "@aws-sdk/core": "^3.973.25", "@aws-sdk/types": "^3.973.6", "@smithy/fetch-http-handler": "^5.3.15", "@smithy/node-http-handler": "^4.5.0", "@smithy/property-provider": "^4.2.12", "@smithy/protocol-http": "^5.3.12", "@smithy/smithy-client": "^4.12.7", "@smithy/types": "^4.13.1", "@smithy/util-stream": "^4.5.20", "tslib": "^2.6.2" } }, "sha512-qPymamdPcLp6ugoVocG1y5r69ScNiRzb0hogX25/ij+Wz7c7WnsgjLTaz7+eB5BfRxeyUwuw5hgULMuwOGOpcw=="], - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.972.14", "", { "dependencies": { "@aws-sdk/core": "^3.973.16", "@aws-sdk/credential-provider-env": "^3.972.14", "@aws-sdk/credential-provider-http": "^3.972.16", "@aws-sdk/credential-provider-login": "^3.972.14", "@aws-sdk/credential-provider-process": "^3.972.14", "@aws-sdk/credential-provider-sso": "^3.972.14", "@aws-sdk/credential-provider-web-identity": "^3.972.14", "@aws-sdk/nested-clients": "^3.996.4", "@aws-sdk/types": "^3.973.4", "@smithy/credential-provider-imds": "^4.2.10", "@smithy/property-provider": "^4.2.10", "@smithy/shared-ini-file-loader": "^4.4.5", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-EGA7ufqNpZKZcD0RwM6gRDEQgwAf19wQ99R1ptdWYDJAnpcMcWiFyT0RIrgiZFLD28CwJmYjnra75hChnEveWA=="], + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.972.26", "", { "dependencies": { "@aws-sdk/core": "^3.973.25", "@aws-sdk/credential-provider-env": "^3.972.23", "@aws-sdk/credential-provider-http": "^3.972.25", "@aws-sdk/credential-provider-login": "^3.972.26", "@aws-sdk/credential-provider-process": "^3.972.23", "@aws-sdk/credential-provider-sso": "^3.972.26", "@aws-sdk/credential-provider-web-identity": "^3.972.26", "@aws-sdk/nested-clients": "^3.996.16", "@aws-sdk/types": "^3.973.6", "@smithy/credential-provider-imds": "^4.2.12", "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-xKxEAMuP6GYx2y5GET+d3aGEroax3AgGfwBE65EQAUe090lzyJ/RzxPX9s8v7Z6qAk0XwfQl+LrmH05X7YvTeg=="], - "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.14", "", { "dependencies": { "@aws-sdk/core": "^3.973.16", "@aws-sdk/nested-clients": "^3.996.4", "@aws-sdk/types": "^3.973.4", "@smithy/property-provider": "^4.2.10", "@smithy/protocol-http": "^5.3.10", "@smithy/shared-ini-file-loader": "^4.4.5", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-P2kujQHAoV7irCTv6EGyReKFofkHCjIK+F0ZYf5UxeLeecrCwtrDkHoO2Vjsv/eRUumaKblD8czuk3CLlzwGDw=="], + "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.26", "", { "dependencies": { "@aws-sdk/core": "^3.973.25", "@aws-sdk/nested-clients": "^3.996.16", "@aws-sdk/types": "^3.973.6", "@smithy/property-provider": "^4.2.12", "@smithy/protocol-http": "^5.3.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-EFcM8RM3TUxnZOfMJo++3PnyxFu1fL/huzmn3Vh+8IWRgqZawUD3cRwwOr+/4bE9DpyHaLOWFAjY0lfK5X9ZkQ=="], - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.15", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.14", "@aws-sdk/credential-provider-http": "^3.972.16", "@aws-sdk/credential-provider-ini": "^3.972.14", "@aws-sdk/credential-provider-process": "^3.972.14", "@aws-sdk/credential-provider-sso": "^3.972.14", "@aws-sdk/credential-provider-web-identity": "^3.972.14", "@aws-sdk/types": "^3.973.4", "@smithy/credential-provider-imds": "^4.2.10", "@smithy/property-provider": "^4.2.10", "@smithy/shared-ini-file-loader": "^4.4.5", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-59NBJgTcQ2FC94T+SWkN5UQgViFtrLnkswSKhG5xbjPAotOXnkEF2Bf0bfUV1F3VaXzqAPZJoZ3bpg4rr8XD5Q=="], + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.27", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.23", "@aws-sdk/credential-provider-http": "^3.972.25", "@aws-sdk/credential-provider-ini": "^3.972.26", "@aws-sdk/credential-provider-process": "^3.972.23", "@aws-sdk/credential-provider-sso": "^3.972.26", "@aws-sdk/credential-provider-web-identity": "^3.972.26", "@aws-sdk/types": "^3.973.6", "@smithy/credential-provider-imds": "^4.2.12", "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-jXpxSolfFnPVj6GCTtx3xIdWNoDR7hYC/0SbetGZxOC9UnNmipHeX1k6spVstf7eWJrMhXNQEgXC0pD1r5tXIg=="], - "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.14", "", { "dependencies": { "@aws-sdk/core": "^3.973.16", "@aws-sdk/types": "^3.973.4", "@smithy/property-provider": "^4.2.10", "@smithy/shared-ini-file-loader": "^4.4.5", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-KAF5LBkJInUPaR9dJDw8LqmbPDRTLyXyRoWVGcJQ+DcN9rxVKBRzAK+O4dTIvQtQ7xaIDZ2kY7zUmDlz6CCXdw=="], + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.23", "", { "dependencies": { "@aws-sdk/core": "^3.973.25", "@aws-sdk/types": "^3.973.6", "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-IL/TFW59++b7MpHserjUblGrdP5UXy5Ekqqx1XQkERXBFJcZr74I7VaSrQT5dxdRMU16xGK4L0RQ5fQG1pMgnA=="], - "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.972.14", "", { "dependencies": { "@aws-sdk/core": "^3.973.16", "@aws-sdk/nested-clients": "^3.996.4", "@aws-sdk/token-providers": "3.1001.0", "@aws-sdk/types": "^3.973.4", "@smithy/property-provider": "^4.2.10", "@smithy/shared-ini-file-loader": "^4.4.5", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-LQzIYrNABnZzkyuIguFa3VVOox9UxPpRW6PL+QYtRHaGl1Ux/+Zi54tAVK31VdeBKPKU3cxqeu8dbOgNqy+naw=="], + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.972.26", "", { "dependencies": { "@aws-sdk/core": "^3.973.25", "@aws-sdk/nested-clients": "^3.996.16", "@aws-sdk/token-providers": "3.1019.0", "@aws-sdk/types": "^3.973.6", "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-c6ghvRb6gTlMznWhGxn/bpVCcp0HRaz4DobGVD9kI4vwHq186nU2xN/S7QGkm0lo0H2jQU8+dgpUFLxfTcwCOg=="], - "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.14", "", { "dependencies": { "@aws-sdk/core": "^3.973.16", "@aws-sdk/nested-clients": "^3.996.4", "@aws-sdk/types": "^3.973.4", "@smithy/property-provider": "^4.2.10", "@smithy/shared-ini-file-loader": "^4.4.5", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-rOwB3vXHHHnGvAOjTgQETxVAsWjgF61XlbGd/ulvYo7EpdXs8cbIHE3PGih9tTj/65ZOegSqZGFqLaKntaI9Kw=="], + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.26", "", { "dependencies": { "@aws-sdk/core": "^3.973.25", "@aws-sdk/nested-clients": "^3.996.16", "@aws-sdk/types": "^3.973.6", "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-cXcS3+XD3iwhoXkM44AmxjmbcKueoLCINr1e+IceMmCySda5ysNIfiGBGe9qn5EMiQ9Jd7pP0AGFtcd6OV3Lvg=="], - "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.972.6", "", { "dependencies": { "@aws-sdk/types": "^3.973.4", "@aws-sdk/util-arn-parser": "^3.972.2", "@smithy/node-config-provider": "^4.3.10", "@smithy/protocol-http": "^5.3.10", "@smithy/types": "^4.13.0", "@smithy/util-config-provider": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-3H2bhvb7Cb/S6WFsBy/Dy9q2aegC9JmGH1inO8Lb2sWirSqpLJlZmvQHPE29h2tIxzv6el/14X/tLCQ8BQU6ZQ=="], + "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-arn-parser": "^3.972.3", "@smithy/node-config-provider": "^4.3.12", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw=="], - "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.972.6", "", { "dependencies": { "@aws-sdk/types": "^3.973.4", "@smithy/protocol-http": "^5.3.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-QMdffpU+GkSGC+bz6WdqlclqIeCsOfgX8JFZ5xvwDtX+UTj4mIXm3uXu7Ko6dBseRcJz1FA6T9OmlAAY6JgJUg=="], + "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ=="], - "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.973.2", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "^3.973.16", "@aws-sdk/crc64-nvme": "^3.972.3", "@aws-sdk/types": "^3.973.4", "@smithy/is-array-buffer": "^4.2.1", "@smithy/node-config-provider": "^4.3.10", "@smithy/protocol-http": "^5.3.10", "@smithy/types": "^4.13.0", "@smithy/util-middleware": "^4.2.10", "@smithy/util-stream": "^4.5.16", "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-KM6QujWdasNjRLG+f7YEqEY5D36vR6Govm7nPIwxjILpb5rJ0pPJZpYY1nrzgtlxwJIYAznfBK5YXoLOHKHyfQ=="], + "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.974.5", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "^3.973.25", "@aws-sdk/crc64-nvme": "^3.972.5", "@aws-sdk/types": "^3.973.6", "@smithy/is-array-buffer": "^4.2.2", "@smithy/node-config-provider": "^4.3.12", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/util-middleware": "^4.2.12", "@smithy/util-stream": "^4.5.20", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-SPSvF0G1t8m8CcB0L+ClNFszzQOvXaxmRj25oRWDf6aU+TuN2PXPFAJ9A6lt1IvX4oGAqqbTdMPTYs/SSHUYYQ=="], - "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.972.6", "", { "dependencies": { "@aws-sdk/types": "^3.973.4", "@smithy/protocol-http": "^5.3.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-5XHwjPH1lHB+1q4bfC7T8Z5zZrZXfaLcjSMwTd1HPSPrCmPFMbg3UQ5vgNWcVj0xoX4HWqTGkSf2byrjlnRg5w=="], + "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ=="], - "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.972.6", "", { "dependencies": { "@aws-sdk/types": "^3.973.4", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-XdZ2TLwyj3Am6kvUc67vquQvs6+D8npXvXgyEUJAdkUDx5oMFJKOqpK+UpJhVDsEL068WAJl2NEGzbSik7dGJQ=="], + "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw=="], - "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.972.6", "", { "dependencies": { "@aws-sdk/types": "^3.973.4", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-iFnaMFMQdljAPrvsCVKYltPt2j40LQqukAbXvW7v0aL5I+1GO7bZ/W8m12WxW3gwyK5p5u1WlHg8TSAizC5cZw=="], + "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA=="], - "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.972.6", "", { "dependencies": { "@aws-sdk/types": "^3.973.4", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/protocol-http": "^5.3.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-dY4v3of5EEMvik6+UDwQ96KfUFDk8m1oZDdkSc5lwi4o7rFrjnv0A+yTV+gu230iybQZnKgDLg/rt2P3H+Vscw=="], + "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.972.9", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-/Wt5+CT8dpTFQxEJ9iGy/UGrXr7p2wlIOEHvIr/YcHYByzoLjrqkYqXdJjd9UIgWjv7eqV2HnFJen93UTuwfTQ=="], - "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.972.16", "", { "dependencies": { "@aws-sdk/core": "^3.973.16", "@aws-sdk/types": "^3.973.4", "@aws-sdk/util-arn-parser": "^3.972.2", "@smithy/core": "^3.23.7", "@smithy/node-config-provider": "^4.3.10", "@smithy/protocol-http": "^5.3.10", "@smithy/signature-v4": "^5.3.10", "@smithy/smithy-client": "^4.12.1", "@smithy/types": "^4.13.0", "@smithy/util-config-provider": "^4.2.1", "@smithy/util-middleware": "^4.2.10", "@smithy/util-stream": "^4.5.16", "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-U4K1rqyJYvT/zgTI3+rN+MToa51dFnnq1VSsVJuJWPNEKcEnuZVqf7yTpkJJMkYixVW5TTi1dgupd+nmJ0JyWw=="], + "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.972.26", "", { "dependencies": { "@aws-sdk/core": "^3.973.25", "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-arn-parser": "^3.972.3", "@smithy/core": "^3.23.12", "@smithy/node-config-provider": "^4.3.12", "@smithy/protocol-http": "^5.3.12", "@smithy/signature-v4": "^5.3.12", "@smithy/smithy-client": "^4.12.7", "@smithy/types": "^4.13.1", "@smithy/util-config-provider": "^4.2.2", "@smithy/util-middleware": "^4.2.12", "@smithy/util-stream": "^4.5.20", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-5q7UGSTtt7/KF0Os8wj2VZtlLxeWJVb0e2eDrDJlWot2EIxUNKDDMPFq/FowUqrwZ40rO2bu6BypxaKNvQhI+g=="], - "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.972.6", "", { "dependencies": { "@aws-sdk/types": "^3.973.4", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-acvMUX9jF4I2Ew+Z/EA6gfaFaz9ehci5wxBmXCZeulLuv8m+iGf6pY9uKz8TPjg39bdAz3hxoE0eLP8Qz+IYlA=="], + "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw=="], - "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.972.16", "", { "dependencies": { "@aws-sdk/core": "^3.973.16", "@aws-sdk/types": "^3.973.4", "@aws-sdk/util-endpoints": "^3.996.3", "@smithy/core": "^3.23.7", "@smithy/protocol-http": "^5.3.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-AmVxtxn8ZkNJbuPu3KKfW9IkJgTgcEtgSwbo0NVcAb31iGvLgHXj2nbbyrUDfh2fx8otXmqL+qw1lRaTi+V3vA=="], + "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.972.26", "", { "dependencies": { "@aws-sdk/core": "^3.973.25", "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-endpoints": "^3.996.5", "@smithy/core": "^3.23.12", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/util-retry": "^4.2.12", "tslib": "^2.6.2" } }, "sha512-AilFIh4rI/2hKyyGN6XrB0yN96W2o7e7wyrPWCM6QjZM1mcC/pVkW3IWWRvuBWMpVP8Fg+rMpbzeLQ6dTM4gig=="], - "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.996.4", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.16", "@aws-sdk/middleware-host-header": "^3.972.6", "@aws-sdk/middleware-logger": "^3.972.6", "@aws-sdk/middleware-recursion-detection": "^3.972.6", "@aws-sdk/middleware-user-agent": "^3.972.16", "@aws-sdk/region-config-resolver": "^3.972.6", "@aws-sdk/types": "^3.973.4", "@aws-sdk/util-endpoints": "^3.996.3", "@aws-sdk/util-user-agent-browser": "^3.972.6", "@aws-sdk/util-user-agent-node": "^3.973.1", "@smithy/config-resolver": "^4.4.9", "@smithy/core": "^3.23.7", "@smithy/fetch-http-handler": "^5.3.12", "@smithy/hash-node": "^4.2.10", "@smithy/invalid-dependency": "^4.2.10", "@smithy/middleware-content-length": "^4.2.10", "@smithy/middleware-endpoint": "^4.4.21", "@smithy/middleware-retry": "^4.4.38", "@smithy/middleware-serde": "^4.2.11", "@smithy/middleware-stack": "^4.2.10", "@smithy/node-config-provider": "^4.3.10", "@smithy/node-http-handler": "^4.4.13", "@smithy/protocol-http": "^5.3.10", "@smithy/smithy-client": "^4.12.1", "@smithy/types": "^4.13.0", "@smithy/url-parser": "^4.2.10", "@smithy/util-base64": "^4.3.1", "@smithy/util-body-length-browser": "^4.2.1", "@smithy/util-body-length-node": "^4.2.2", "@smithy/util-defaults-mode-browser": "^4.3.37", "@smithy/util-defaults-mode-node": "^4.2.40", "@smithy/util-endpoints": "^3.3.1", "@smithy/util-middleware": "^4.2.10", "@smithy/util-retry": "^4.2.10", "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-NowB1HfOnWC4kwZOnTg8E8rSL0U+RSjSa++UtEV4ipoH6JOjMLnHyGilqwl+Pe1f0Al6v9yMkSJ/8Ot0f578CQ=="], + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.996.16", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.25", "@aws-sdk/middleware-host-header": "^3.972.8", "@aws-sdk/middleware-logger": "^3.972.8", "@aws-sdk/middleware-recursion-detection": "^3.972.9", "@aws-sdk/middleware-user-agent": "^3.972.26", "@aws-sdk/region-config-resolver": "^3.972.10", "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-endpoints": "^3.996.5", "@aws-sdk/util-user-agent-browser": "^3.972.8", "@aws-sdk/util-user-agent-node": "^3.973.12", "@smithy/config-resolver": "^4.4.13", "@smithy/core": "^3.23.12", "@smithy/fetch-http-handler": "^5.3.15", "@smithy/hash-node": "^4.2.12", "@smithy/invalid-dependency": "^4.2.12", "@smithy/middleware-content-length": "^4.2.12", "@smithy/middleware-endpoint": "^4.4.27", "@smithy/middleware-retry": "^4.4.44", "@smithy/middleware-serde": "^4.2.15", "@smithy/middleware-stack": "^4.2.12", "@smithy/node-config-provider": "^4.3.12", "@smithy/node-http-handler": "^4.5.0", "@smithy/protocol-http": "^5.3.12", "@smithy/smithy-client": "^4.12.7", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", "@smithy/util-defaults-mode-browser": "^4.3.43", "@smithy/util-defaults-mode-node": "^4.2.47", "@smithy/util-endpoints": "^3.3.3", "@smithy/util-middleware": "^4.2.12", "@smithy/util-retry": "^4.2.12", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-L7Qzoj/qQU1cL5GnYLQP5LbI+wlLCLoINvcykR3htKcQ4tzrPf2DOs72x933BM7oArYj1SKrkb2lGlsJHIic3g=="], - "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.972.6", "", { "dependencies": { "@aws-sdk/types": "^3.973.4", "@smithy/config-resolver": "^4.4.9", "@smithy/node-config-provider": "^4.3.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-Aa5PusHLXAqLTX1UKDvI3pHQJtIsF7Q+3turCHqfz/1F61/zDMWfbTC8evjhrrYVAtz9Vsv3SJ/waSUeu7B6gw=="], + "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.972.10", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/config-resolver": "^4.4.13", "@smithy/node-config-provider": "^4.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-1dq9ToC6e070QvnVhhbAs3bb5r6cQ10gTVc6cyRV5uvQe7P138TV2uG2i6+Yok4bAkVAcx5AqkTEBUvWEtBlsQ=="], - "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.4", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "^3.972.16", "@aws-sdk/types": "^3.973.4", "@smithy/protocol-http": "^5.3.10", "@smithy/signature-v4": "^5.3.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-MGa8ro0onekYIiesHX60LwKdkxK3Kd61p7TTbLwZemBqlnD9OLrk9sXZdFOIxXanJ+3AaJnV/jiX866eD/4PDg=="], + "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.14", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "^3.972.26", "@aws-sdk/types": "^3.973.6", "@smithy/protocol-http": "^5.3.12", "@smithy/signature-v4": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-4nZSrBr1NO+48HCM/6BRU8mnRjuHZjcpziCvLXZk5QVftwWz5Mxqbhwdz4xf7WW88buaTB8uRO2MHklSX1m0vg=="], - "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1001.0", "", { "dependencies": { "@aws-sdk/core": "^3.973.16", "@aws-sdk/nested-clients": "^3.996.4", "@aws-sdk/types": "^3.973.4", "@smithy/property-provider": "^4.2.10", "@smithy/shared-ini-file-loader": "^4.4.5", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-09XAq/uIYgeZhohuGRrR/R+ek3+ljFNdzWCXdqb9rlIERDjSfNiLjTtpHgSK1xTPmC5G4yWoEAyMfTXiggS6wA=="], + "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1019.0", "", { "dependencies": { "@aws-sdk/core": "^3.973.25", "@aws-sdk/nested-clients": "^3.996.16", "@aws-sdk/types": "^3.973.6", "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-OF+2RfRmUKyjzrRWlDcyju3RBsuqcrYDQ8TwrJg8efcOotMzuZN4U9mpVTIdATpmEc4lWNZBMSjPzrGm6JPnAQ=="], - "@aws-sdk/types": ["@aws-sdk/types@3.973.4", "", { "dependencies": { "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-RW60aH26Bsc016Y9B98hC0Plx6fK5P2v/iQYwMzrSjiDh1qRMUCP6KrXHYEHe3uFvKiOC93Z9zk4BJsUi6Tj1Q=="], + "@aws-sdk/types": ["@aws-sdk/types@3.973.6", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw=="], - "@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.972.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg=="], + "@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.972.3", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA=="], - "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.996.3", "", { "dependencies": { "@aws-sdk/types": "^3.973.4", "@smithy/types": "^4.13.0", "@smithy/url-parser": "^4.2.10", "@smithy/util-endpoints": "^3.3.1", "tslib": "^2.6.2" } }, "sha512-yWIQSNiCjykLL+ezN5A+DfBb1gfXTytBxm57e64lYmwxDHNmInYHRJYYRAGWG1o77vKEiWaw4ui28e3yb1k5aQ=="], + "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.996.5", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-endpoints": "^3.3.3", "tslib": "^2.6.2" } }, "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw=="], - "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.965.4", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog=="], + "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.965.5", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ=="], - "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.972.6", "", { "dependencies": { "@aws-sdk/types": "^3.973.4", "@smithy/types": "^4.13.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-Fwr/llD6GOrFgQnKaI2glhohdGuBDfHfora6iG9qsBBBR8xv1SdCSwbtf5CWlUdCw5X7g76G/9Hf0Inh0EmoxA=="], + "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.972.8", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@smithy/types": "^4.13.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA=="], - "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.973.1", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "^3.972.16", "@aws-sdk/types": "^3.973.4", "@smithy/node-config-provider": "^4.3.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-kmgbDqT7aCBEVrqESM2JUjbf0zhDUQ7wnt3q1RuVS+3mglrcfVb2bwkbmf38npOyyPGtQPV5dWN3m+sSFAVAgQ=="], + "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.973.12", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "^3.972.26", "@aws-sdk/types": "^3.973.6", "@smithy/node-config-provider": "^4.3.12", "@smithy/types": "^4.13.1", "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-8phW0TS8ntENJgDcFewYT/Q8dOmarpvSxEjATu2GUBAutiHr++oEGCiBUwxslCMNvwW2cAPZNT53S/ym8zm/gg=="], - "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.9", "", { "dependencies": { "@smithy/types": "^4.13.0", "fast-xml-parser": "5.4.1", "tslib": "^2.6.2" } }, "sha512-ItnlMgSqkPrUfJs7EsvU/01zw5UeIb2tNPhD09LBLHbg+g+HDiKibSLwpkuz/ZIlz4F2IMn+5XgE4AK/pfPuog=="], + "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.16", "", { "dependencies": { "@smithy/types": "^4.13.1", "fast-xml-parser": "5.5.8", "tslib": "^2.6.2" } }, "sha512-iu2pyvaqmeatIJLURLqx9D+4jKAdTH20ntzB6BFwjyN7V960r4jK32mx0Zf7YbtOYAbmbtQfDNuL60ONinyw7A=="], - "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.3", "", {}, "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw=="], + "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.4", "", {}, "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ=="], - "@babel/code-frame": ["@babel/code-frame@7.28.6", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q=="], + "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="], @@ -266,9 +287,9 @@ "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="], + "@babel/helpers": ["@babel/helpers@7.29.2", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.29.0" } }, "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw=="], - "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="], + "@babel/parser": ["@babel/parser@7.29.2", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA=="], "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], @@ -276,105 +297,115 @@ "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "@borewit/text-codec": ["@borewit/text-codec@0.2.2", "", {}, "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ=="], + "@braintree/sanitize-url": ["@braintree/sanitize-url@7.1.2", "", {}, "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA=="], - "@chevrotain/cst-dts-gen": ["@chevrotain/cst-dts-gen@11.0.3", "", { "dependencies": { "@chevrotain/gast": "11.0.3", "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ=="], + "@browserbasehq/sdk": ["@browserbasehq/sdk@2.9.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-Xzm1+6suzQypXjley4Phqer++pjnYyST6S7CArUn3kWyGA8aruXjAV5wkmqE21lgXo9K3/OQJvCu48bKEZFNDQ=="], + + "@browserbasehq/stagehand": ["@browserbasehq/stagehand@1.14.0", "", { "dependencies": { "@anthropic-ai/sdk": "^0.27.3", "@browserbasehq/sdk": "^2.0.0", "ws": "^8.18.0", "zod-to-json-schema": "^3.23.5" }, "peerDependencies": { "@playwright/test": "^1.42.1", "deepmerge": "^4.3.1", "dotenv": "^16.4.5", "openai": "^4.62.1", "zod": "^3.23.8" } }, "sha512-Hi/EzgMFWz+FKyepxHTrqfTPjpsuBS4zRy3e9sbMpBgLPv+9c0R+YZEvS7Bw4mTS66QtvvURRT6zgDGFotthVQ=="], - "@chevrotain/gast": ["@chevrotain/gast@11.0.3", "", { "dependencies": { "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q=="], + "@cfworker/json-schema": ["@cfworker/json-schema@4.1.1", "", {}, "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og=="], - "@chevrotain/regexp-to-ast": ["@chevrotain/regexp-to-ast@11.0.3", "", {}, "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA=="], + "@chevrotain/cst-dts-gen": ["@chevrotain/cst-dts-gen@11.1.2", "", { "dependencies": { "@chevrotain/gast": "11.1.2", "@chevrotain/types": "11.1.2", "lodash-es": "4.17.23" } }, "sha512-XTsjvDVB5nDZBQB8o0o/0ozNelQtn2KrUVteIHSlPd2VAV2utEb6JzyCJaJ8tGxACR4RiBNWy5uYUHX2eji88Q=="], - "@chevrotain/types": ["@chevrotain/types@11.0.3", "", {}, "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ=="], + "@chevrotain/gast": ["@chevrotain/gast@11.1.2", "", { "dependencies": { "@chevrotain/types": "11.1.2", "lodash-es": "4.17.23" } }, "sha512-Z9zfXR5jNZb1Hlsd/p+4XWeUFugrHirq36bKzPWDSIacV+GPSVXdk+ahVWZTwjhNwofAWg/sZg58fyucKSQx5g=="], - "@chevrotain/utils": ["@chevrotain/utils@11.0.3", "", {}, "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ=="], + "@chevrotain/regexp-to-ast": ["@chevrotain/regexp-to-ast@11.1.2", "", {}, "sha512-nMU3Uj8naWer7xpZTYJdxbAs6RIv/dxYzkYU8GSwgUtcAAlzjcPfX1w+RKRcYG8POlzMeayOQ/znfwxEGo5ulw=="], + + "@chevrotain/types": ["@chevrotain/types@11.1.2", "", {}, "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw=="], + + "@chevrotain/utils": ["@chevrotain/utils@11.1.2", "", {}, "sha512-4mudFAQ6H+MqBTfqLmU7G1ZwRzCLfJEooL/fsF6rCX5eePMbGhoy5n4g+G4vlh2muDcsCTJtL+uKbOzWxs5LHA=="], "@clack/core": ["@clack/core@0.4.2", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg=="], "@clack/prompts": ["@clack/prompts@0.10.1", "", { "dependencies": { "@clack/core": "0.4.2", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw=="], - "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], + "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], + + "@emnapi/core": ["@emnapi/core@1.9.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" } }, "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA=="], - "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + "@emnapi/runtime": ["@emnapi/runtime@1.9.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.4", "", { "os": "android", "cpu": "arm" }, "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.4", "", { "os": "android", "cpu": "arm64" }, "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.4", "", { "os": "android", "cpu": "x64" }, "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.4", "", { "os": "linux", "cpu": "arm" }, "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.4", "", { "os": "linux", "cpu": "x64" }, "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.4", "", { "os": "none", "cpu": "x64" }, "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ=="], - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.4", "", { "os": "win32", "cpu": "x64" }, "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg=="], "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.3", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], - "@eslint/js": ["@eslint/js@9.39.2", "", {}, "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA=="], + "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], - "@floating-ui/core": ["@floating-ui/core@1.7.4", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg=="], + "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="], - "@floating-ui/dom": ["@floating-ui/dom@1.7.5", "", { "dependencies": { "@floating-ui/core": "^1.7.4", "@floating-ui/utils": "^0.2.10" } }, "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg=="], + "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="], - "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.7", "", { "dependencies": { "@floating-ui/dom": "^1.7.5" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg=="], + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="], - "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], + "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="], "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], @@ -384,11 +415,13 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + "@ibm-cloud/watsonx-ai": ["@ibm-cloud/watsonx-ai@1.7.10", "", { "dependencies": { "@types/node": "^18.0.0", "extend": "3.0.2", "form-data": "^4.0.4", "ibm-cloud-sdk-core": "^5.4.5", "ts-node": "^10.9.2" } }, "sha512-+ckgkR/qLQSG5hmVrD3OywWGEmY8Vgo3WR3T0jGJxcO9w89gPwgQENn3qFnhF0YlILGEl4zNPuTYYDj1MtNSng=="], + "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], "@iconify/utils": ["@iconify/utils@3.1.0", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.0", "mlly": "^1.8.0" } }, "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw=="], - "@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="], + "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], @@ -438,33 +471,33 @@ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], - "@inquirer/ansi": ["@inquirer/ansi@2.0.3", "", {}, "sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw=="], + "@inquirer/ansi": ["@inquirer/ansi@2.0.4", "", {}, "sha512-DpcZrQObd7S0R/U3bFdkcT5ebRwbTTC4D3tCc1vsJizmgPLxNJBo+AAFmrZwe8zk30P2QzgzGWZ3Q9uJwWuhIg=="], - "@inquirer/checkbox": ["@inquirer/checkbox@5.0.6", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/core": "^11.1.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-qLZ1gOpsqsieB5k98GQ9bWYggvMsCXTc7HUwhEQpTsxFQYGthqR9UysCwqB7L9h47THYdXhJegnYb1IqURMjng=="], + "@inquirer/checkbox": ["@inquirer/checkbox@5.1.2", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/core": "^11.1.7", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-PubpMPO2nJgMufkoB3P2wwxNXEMUXnBIKi/ACzDUYfaoPuM7gSTmuxJeMscoLVEsR4qqrCMf5p0SiYGWnVJ8kw=="], "@inquirer/confirm": ["@inquirer/confirm@3.2.0", "", { "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/type": "^1.5.3" } }, "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw=="], "@inquirer/core": ["@inquirer/core@9.2.1", "", { "dependencies": { "@inquirer/figures": "^1.0.6", "@inquirer/type": "^2.0.0", "@types/mute-stream": "^0.0.4", "@types/node": "^22.5.5", "@types/wrap-ansi": "^3.0.0", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^1.0.0", "signal-exit": "^4.1.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" } }, "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg=="], - "@inquirer/editor": ["@inquirer/editor@5.0.6", "", { "dependencies": { "@inquirer/core": "^11.1.3", "@inquirer/external-editor": "^2.0.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-dxTi/TB29NaW18u0pQl3B140695izGUMzr340a4Yhxll3oa0/iwxl6C88sX9LDUPFaaM4FDASEMnLm8XVk2VVg=="], + "@inquirer/editor": ["@inquirer/editor@5.0.10", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/external-editor": "^2.0.4", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-VJx4XyaKea7t8hEApTw5dxeIyMtWXre2OiyJcICCRZI4hkoHsMoCnl/KbUnJJExLbH9csLLHMVR144ZhFE1CwA=="], - "@inquirer/expand": ["@inquirer/expand@5.0.6", "", { "dependencies": { "@inquirer/core": "^11.1.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-HmgMzFdMk/gmPXfuFy4xgWkyIVbdH81otQkrFbhklFZcGauwDFD1EbgmZdgmYCN5pWhSEnYIadg1kysLgPIYag=="], + "@inquirer/expand": ["@inquirer/expand@5.0.10", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-fC0UHJPXsTRvY2fObiwuQYaAnHrp3aDqfwKUJSdfpgv18QUG054ezGbaRNStk/BKD5IPijeMKWej8VV8O5Q/eQ=="], - "@inquirer/external-editor": ["@inquirer/external-editor@2.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-LgyI7Agbda74/cL5MvA88iDpvdXI2KuMBCGRkbCl2Dg1vzHeOgs+s0SDcXV7b+WZJrv2+ERpWSM65Fpi9VfY3w=="], + "@inquirer/external-editor": ["@inquirer/external-editor@2.0.4", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Prenuv9C1PHj2Itx0BcAOVBTonz02Hc2Nd2DbU67PdGUaqn0nPCnV34oDyyoaZHnmfRxkpuhh/u51ThkrO+RdA=="], "@inquirer/figures": ["@inquirer/figures@1.0.15", "", {}, "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g=="], "@inquirer/input": ["@inquirer/input@2.3.0", "", { "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/type": "^1.5.3" } }, "sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw=="], - "@inquirer/number": ["@inquirer/number@4.0.6", "", { "dependencies": { "@inquirer/core": "^11.1.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-owMkAY+gR0BggomDTL+Z22x/yfE4ocFrmNyJacOiaDVA/d+iL4IWyk7Ds7JEuDMxuhHFB46Dubdxg1uiD7GlCA=="], + "@inquirer/number": ["@inquirer/number@4.0.10", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Ht8OQstxiS3APMGjHV0aYAjRAysidWdwurWEo2i8yI5xbhOBWqizT0+MU1S2GCcuhIBg+3SgWVjEoXgfhY+XaA=="], - "@inquirer/password": ["@inquirer/password@5.0.6", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/core": "^11.1.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-c4BT4SB79iYwPhtGVBSvrlTnn4oFSYnwocafmktpay8RK75T2c2+fLlR0i1Cxw0QOhdy/YULdmpHoy1sOrPzvA=="], + "@inquirer/password": ["@inquirer/password@5.0.10", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/core": "^11.1.7", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-QbNyvIE8q2GTqKLYSsA8ATG+eETo+m31DSR0+AU7x3d2FhaTWzqQek80dj3JGTo743kQc6mhBR0erMjYw5jQ0A=="], - "@inquirer/prompts": ["@inquirer/prompts@8.2.1", "", { "dependencies": { "@inquirer/checkbox": "^5.0.5", "@inquirer/confirm": "^6.0.5", "@inquirer/editor": "^5.0.5", "@inquirer/expand": "^5.0.5", "@inquirer/input": "^5.0.5", "@inquirer/number": "^4.0.5", "@inquirer/password": "^5.0.5", "@inquirer/rawlist": "^5.2.1", "@inquirer/search": "^4.1.1", "@inquirer/select": "^5.0.5" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-76knJFW2oXdI6If5YRmEoT5u7l+QroXYrMiINFcb97LsyECgsbO9m6iWlPuhBtaFgNITPHQCk3wbex38q8gsjg=="], + "@inquirer/prompts": ["@inquirer/prompts@8.3.2", "", { "dependencies": { "@inquirer/checkbox": "^5.1.2", "@inquirer/confirm": "^6.0.10", "@inquirer/editor": "^5.0.10", "@inquirer/expand": "^5.0.10", "@inquirer/input": "^5.0.10", "@inquirer/number": "^4.0.10", "@inquirer/password": "^5.0.10", "@inquirer/rawlist": "^5.2.6", "@inquirer/search": "^4.1.6", "@inquirer/select": "^5.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-yFroiSj2iiBFlm59amdTvAcQFvWS6ph5oKESls/uqPBect7rTU2GbjyZO2DqxMGuIwVA8z0P4K6ViPcd/cp+0w=="], - "@inquirer/rawlist": ["@inquirer/rawlist@5.2.2", "", { "dependencies": { "@inquirer/core": "^11.1.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-ld2EhLlf3fsBv7QfxR31NdBecGdS6eeFFZ+Nx88ApjtifeCEc9TNrw8x5tGe+gd6HG1ERczOb4B/bMojiGIp1g=="], + "@inquirer/rawlist": ["@inquirer/rawlist@5.2.6", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-jfw0MLJ5TilNsa9zlJ6nmRM0ZFVZhhTICt4/6CU2Dv1ndY7l3sqqo1gIYZyMMDw0LvE1u1nzJNisfHEhJIxq5w=="], - "@inquirer/search": ["@inquirer/search@4.1.2", "", { "dependencies": { "@inquirer/core": "^11.1.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-kdGbbbWYKldWxpxodKYPmFl/ctBi3DjWlA4LX48jXtqJ7NEeoEKlyFTbE4xNEFcGDi15tvaxRLzCV4A53zqYIw=="], + "@inquirer/search": ["@inquirer/search@4.1.6", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-3/6kTRae98hhDevENScy7cdFEuURnSpM3JbBNg8yfXLw88HgTOl+neUuy/l9W0No5NzGsLVydhBzTIxZP7yChQ=="], "@inquirer/select": ["@inquirer/select@2.5.0", "", { "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/figures": "^1.0.5", "@inquirer/type": "^1.5.3", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" } }, "sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA=="], @@ -484,17 +517,55 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + "@langchain/classic": ["@langchain/classic@1.0.5", "", { "dependencies": { "@langchain/openai": "1.1.3", "@langchain/textsplitters": "1.0.1", "handlebars": "^4.7.8", "js-yaml": "^4.1.1", "jsonpointer": "^5.0.1", "openapi-types": "^12.1.3", "p-retry": "^7.0.0", "uuid": "^10.0.0", "yaml": "^2.2.1", "zod": "^3.25.76 || ^4" }, "optionalDependencies": { "langsmith": "^0.3.64" }, "peerDependencies": { "@langchain/core": "^1.0.0", "cheerio": "*", "peggy": "^3.0.2", "typeorm": "*" }, "optionalPeers": ["cheerio", "peggy", "typeorm"] }, "sha512-yMlcuQ80iG0SAEzgym95oLS+bJZJlmsFrMb+qkwg5mzHfL9DzAIFyvaMPiDnwKM0iv52u7iwD/aucLljZul9mQ=="], + + "@langchain/community": ["@langchain/community@1.1.14", "", { "dependencies": { "@langchain/classic": "1.0.17", "@langchain/openai": "1.2.7", "binary-extensions": "^2.2.0", "flat": "^5.0.2", "js-yaml": "^4.1.1", "math-expression-evaluator": "^2.0.0", "uuid": "^10.0.0", "zod": "^3.25.76 || ^4" }, "peerDependencies": { "@arcjet/redact": "^v1.1.0", "@aws-crypto/sha256-js": "^5.0.0", "@aws-sdk/client-dynamodb": "^3.985.0", "@aws-sdk/client-lambda": "^3.985.0", "@aws-sdk/client-s3": "^3.985.0", "@aws-sdk/client-sagemaker-runtime": "^3.985.0", "@aws-sdk/client-sfn": "^3.985.0", "@aws-sdk/credential-provider-node": "^3.388.0", "@azure/search-documents": "^12.2.0", "@azure/storage-blob": "^12.30.0", "@browserbasehq/sdk": "*", "@browserbasehq/stagehand": "^1.0.0", "@clickhouse/client": "^0.2.5", "@datastax/astra-db-ts": "^1.0.0", "@elastic/elasticsearch": "^8.4.0", "@getmetal/metal-sdk": "*", "@getzep/zep-cloud": "^1.0.6", "@getzep/zep-js": "^0.9.0", "@gomomento/sdk-core": "^1.117.2", "@google-cloud/storage": "^6.10.1 || ^7.7.0", "@gradientai/nodejs-sdk": "^1.2.0", "@huggingface/inference": "^4.13.11", "@huggingface/transformers": "^3.8.1", "@ibm-cloud/watsonx-ai": "*", "@lancedb/lancedb": "^0.19.1", "@langchain/core": "^1.1.21", "@layerup/layerup-security": "^1.5.12", "@libsql/client": "^0.17.0", "@mendable/firecrawl-js": "^1.4.3", "@mlc-ai/web-llm": "*", "@mozilla/readability": "*", "@neondatabase/serverless": "*", "@notionhq/client": "^2.2.10", "@opensearch-project/opensearch": "*", "@planetscale/database": "^1.8.0", "@premai/prem-sdk": "^0.3.25", "@raycast/api": "^1.55.2", "@rockset/client": "^0.9.1", "@smithy/eventstream-codec": "^2.0.5", "@smithy/protocol-http": "^3.0.6", "@smithy/signature-v4": "^2.0.10", "@smithy/util-utf8": "^2.0.0", "@spider-cloud/spider-client": "^0.1.85", "@supabase/supabase-js": "^2.45.0", "@tensorflow-models/universal-sentence-encoder": "*", "@tensorflow/tfjs-core": "*", "@upstash/ratelimit": "^1.1.3 || ^2.0.3", "@upstash/redis": "^1.20.6", "@upstash/vector": "^1.1.1", "@vercel/kv": "*", "@vercel/postgres": "*", "@writerai/writer-sdk": "^0.40.2", "@xata.io/client": "^0.28.0", "@zilliz/milvus2-sdk-node": ">=2.3.5", "apify-client": "^2.22.0", "assemblyai": "^4.23.0", "azion": "^3.0.0", "better-sqlite3": ">=9.4.0 <12.0.0", "cassandra-driver": "^4.7.2", "cborg": "^4.5.8", "cheerio": "^1.0.0-rc.12", "chromadb": "*", "closevector-common": "0.1.3", "closevector-node": "0.1.6", "closevector-web": "0.1.6", "convex": "^1.3.1", "couchbase": "^4.6.0", "crypto-js": "^4.2.0", "d3-dsv": "^2.0.0", "discord.js": "^14.25.1", "duck-duck-scrape": "^2.2.5", "epub2": "^3.0.1", "faiss-node": "*", "fast-xml-parser": "*", "firebase-admin": "^13.6.1", "google-auth-library": "*", "googleapis": "*", "hnswlib-node": "^3.0.0", "html-to-text": "^9.0.5", "ibm-cloud-sdk-core": "*", "ignore": "^5.2.0", "interface-datastore": "^8.2.11", "ioredis": "^5.3.2", "it-all": "^3.0.4", "jsdom": "*", "jsonwebtoken": "^9.0.3", "lodash": "^4.17.23", "lunary": "^0.7.10", "mammoth": "^1.11.0", "mariadb": "^3.4.0", "mem0ai": "^2.1.8", "mysql2": "^3.16.3", "neo4j-driver": "*", "node-llama-cpp": ">=3.0.0", "notion-to-md": "^3.1.0", "officeparser": "^4.0.4", "openai": "*", "pdf-parse": "1.1.1", "pg": "^8.11.0", "pg-copy-streams": "^6.0.5", "pickleparser": "^0.2.1", "playwright": "^1.58.2", "portkey-ai": "^0.1.11", "puppeteer": "*", "pyodide": ">=0.24.1 <0.27.0", "replicate": "*", "sonix-speech-recognition": "^2.1.1", "srt-parser-2": "^1.2.3", "typeorm": "^0.3.28", "typesense": "^3.0.1", "usearch": "^1.1.1", "voy-search": "0.6.2", "word-extractor": "*", "ws": "^8.14.2", "youtubei.js": "*" }, "optionalPeers": ["@arcjet/redact", "@aws-crypto/sha256-js", "@aws-sdk/client-dynamodb", "@aws-sdk/client-lambda", "@aws-sdk/client-s3", "@aws-sdk/client-sagemaker-runtime", "@aws-sdk/client-sfn", "@aws-sdk/credential-provider-node", "@azure/search-documents", "@azure/storage-blob", "@browserbasehq/sdk", "@clickhouse/client", "@datastax/astra-db-ts", "@elastic/elasticsearch", "@getmetal/metal-sdk", "@getzep/zep-cloud", "@getzep/zep-js", "@gomomento/sdk-core", "@google-cloud/storage", "@gradientai/nodejs-sdk", "@huggingface/inference", "@huggingface/transformers", "@lancedb/lancedb", "@layerup/layerup-security", "@libsql/client", "@mendable/firecrawl-js", "@mlc-ai/web-llm", "@mozilla/readability", "@neondatabase/serverless", "@notionhq/client", "@opensearch-project/opensearch", "@planetscale/database", "@premai/prem-sdk", "@raycast/api", "@rockset/client", "@smithy/eventstream-codec", "@smithy/protocol-http", "@smithy/signature-v4", "@smithy/util-utf8", "@spider-cloud/spider-client", "@supabase/supabase-js", "@tensorflow-models/universal-sentence-encoder", "@tensorflow/tfjs-core", "@upstash/ratelimit", "@upstash/redis", "@upstash/vector", "@vercel/kv", "@vercel/postgres", "@writerai/writer-sdk", "@xata.io/client", "@zilliz/milvus2-sdk-node", "apify-client", "assemblyai", "azion", "better-sqlite3", "cassandra-driver", "cborg", "cheerio", "chromadb", "closevector-common", "closevector-node", "closevector-web", "convex", "couchbase", "crypto-js", "d3-dsv", "discord.js", "duck-duck-scrape", "epub2", "faiss-node", "fast-xml-parser", "firebase-admin", "google-auth-library", "googleapis", "hnswlib-node", "html-to-text", "ignore", "interface-datastore", "ioredis", "it-all", "jsdom", "jsonwebtoken", "lodash", "lunary", "mammoth", "mariadb", "mem0ai", "mysql2", "neo4j-driver", "node-llama-cpp", "notion-to-md", "officeparser", "pdf-parse", "pg", "pg-copy-streams", "pickleparser", "playwright", "portkey-ai", "puppeteer", "pyodide", "replicate", "sonix-speech-recognition", "srt-parser-2", "typeorm", "typesense", "usearch", "voy-search", "word-extractor", "ws", "youtubei.js"] }, "sha512-Jb64jqkjwocfK04RYW8oP9Z0VO3E1LfSlOx5QK3g7LJI7zQN8o1QzVvfXWigKQRuvMYue+X7DkunLaiEx/mohA=="], + + "@langchain/core": ["@langchain/core@1.1.31", "", { "dependencies": { "@cfworker/json-schema": "^4.0.2", "@standard-schema/spec": "^1.1.0", "ansi-styles": "^5.0.0", "camelcase": "6", "decamelize": "1.2.0", "js-tiktoken": "^1.0.12", "langsmith": ">=0.5.0 <1.0.0", "mustache": "^4.2.0", "p-queue": "^6.6.2", "uuid": "^11.1.0", "zod": "^3.25.76 || ^4" } }, "sha512-FxsgIUONjKaRpjx59sISgmb0OMCbAetPGyhzjGa2kX0y1f8LZ5xm9VB2db7W9HYWyLvzRWcMA51Uu4OSTJmtZQ=="], + + "@langchain/langgraph": ["@langchain/langgraph@1.2.6", "", { "dependencies": { "@langchain/langgraph-checkpoint": "^1.0.1", "@langchain/langgraph-sdk": "~1.8.1", "@standard-schema/spec": "1.1.0", "uuid": "^10.0.0" }, "peerDependencies": { "@langchain/core": "^1.1.16", "zod": "^3.25.32 || ^4.2.0", "zod-to-json-schema": "^3.x" }, "optionalPeers": ["zod-to-json-schema"] }, "sha512-5cX402dNGN6w9+0mlMU2dgUiKx6Y1tlENp7x05e9ByDbQCHSDc0kyqRWNFLGc7vatQ92S4ylxQrcCJvi8Fr4SQ=="], + + "@langchain/langgraph-checkpoint": ["@langchain/langgraph-checkpoint@1.0.1", "", { "dependencies": { "uuid": "^10.0.0" }, "peerDependencies": { "@langchain/core": "^1.0.1" } }, "sha512-HM0cJLRpIsSlWBQ/xuDC67l52SqZ62Bh2Y61DX+Xorqwoh5e1KxYvfCD7GnSTbWWhjBOutvnR0vPhu4orFkZfw=="], + + "@langchain/langgraph-sdk": ["@langchain/langgraph-sdk@1.8.1", "", { "dependencies": { "@types/json-schema": "^7.0.15", "p-queue": "^9.0.1", "p-retry": "^7.1.1", "uuid": "^13.0.0" }, "peerDependencies": { "@langchain/core": "^1.1.16", "react": "^18 || ^19", "react-dom": "^18 || ^19", "svelte": "^4.0.0 || ^5.0.0", "vue": "^3.0.0" }, "optionalPeers": ["@langchain/core", "react", "react-dom", "svelte", "vue"] }, "sha512-le+rRwCN3wK7CEqxepraFK/aO5dOQ0heLNHBOcWugC6P6k1UqrqUBX+dBHZxcIz5d6n0FqierFyv74Ky8XIBew=="], + + "@langchain/openai": ["@langchain/openai@1.1.3", "", { "dependencies": { "js-tiktoken": "^1.0.12", "openai": "^6.9.0", "zod": "^3.25.76 || ^4" }, "peerDependencies": { "@langchain/core": "^1.0.0" } }, "sha512-p+xR+4HRms5Ozjf5miC6U2AYRyNVSTdO7AMBkMYs1Tp6DWHBd+mQ72H8Ogd2dKrPuS5UDJ5dbpI1fS+OrTbgQQ=="], + + "@langchain/textsplitters": ["@langchain/textsplitters@1.0.1", "", { "dependencies": { "js-tiktoken": "^1.0.12" }, "peerDependencies": { "@langchain/core": "^1.0.0" } }, "sha512-rheJlB01iVtrOUzttscutRgLybPH9qR79EyzBEbf1u97ljWyuxQfCwIWK+SjoQTM9O8M7GGLLRBSYE26Jmcoww=="], + "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], "@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="], - "@mermaid-js/parser": ["@mermaid-js/parser@0.6.3", "", { "dependencies": { "langium": "3.3.1" } }, "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA=="], + "@mermaid-js/parser": ["@mermaid-js/parser@1.0.1", "", { "dependencies": { "langium": "^4.0.0" } }, "sha512-opmV19kN1JsK0T6HhhokHpcVkqKpF+x2pPDKKM2ThHtZAB5F4PROopk0amuVYK5qMrIA4erzpNm8gmPNJgMDxQ=="], + + "@n8n/ai-node-sdk": ["@n8n/ai-node-sdk@0.4.1", "", { "dependencies": { "@n8n/ai-utilities": "0.7.1" } }, "sha512-ntGncJGZJ37B2s8dGbMLEo9+KW2vAHLn+DhTDHPUYnNut/p7V2gQzzC4ltDLkefChcaMqL0P8l79ntCnJ2pIaA=="], + + "@n8n/ai-utilities": ["@n8n/ai-utilities@0.7.1", "", { "dependencies": { "@langchain/classic": "1.0.5", "@langchain/community": "1.1.14", "@langchain/core": "1.1.31", "@langchain/openai": "1.1.3", "@langchain/textsplitters": "1.0.1", "@n8n/config": "2.12.1", "@n8n/typescript-config": "1.3.0", "https-proxy-agent": "7.0.6", "js-tiktoken": "1.0.12", "langchain": "1.2.30", "proxy-from-env": "^1.1.0", "tmp-promise": "3.0.3", "undici": "^6.21.0", "zod": "3.25.67", "zod-to-json-schema": "3.23.3" }, "peerDependencies": { "n8n-workflow": "*" } }, "sha512-+VDOInOIh2M3W5o1O77oeip1NEpmhcR5GcEHaJpa9Cpw5B0pgU848WGmK3NDPwCZniOAuRFEqcvBu1W/+S5qLw=="], + + "@n8n/config": ["@n8n/config@2.12.1", "", { "dependencies": { "@n8n/di": "0.10.0", "reflect-metadata": "0.2.2", "zod": "3.25.67" } }, "sha512-rgNrFJvlheRT5rH8KPL589Xcc6B4gtcSRcFuEPuNVeJ1f0XLliKWf9M3ui120e4jtQ9AhRCVGwmIaGN538WrHw=="], + + "@n8n/di": ["@n8n/di@0.10.0", "", { "dependencies": { "reflect-metadata": "0.2.2" } }, "sha512-wqVjmb/tfE1Dyax6607K5InLM89pHZvmVTfakv6y17XJSwu2JbkT/+FI1z2tQswoSlhBIH3N1BZSiYsVbP58bw=="], + + "@n8n/errors": ["@n8n/errors@0.6.0", "", { "dependencies": { "callsites": "3.1.0" } }, "sha512-oVJ0lgRYJY6/aPOW2h37ea5T+nX7/wULRn5FymwYeaiYlsLdqwIQEtGwZrajpzxJB0Os74u4lSH3WWQgZCkgxQ=="], + + "@n8n/eslint-plugin-community-nodes": ["@n8n/eslint-plugin-community-nodes@0.9.0", "", { "dependencies": { "@typescript-eslint/utils": "^8.35.0", "fastest-levenshtein": "1.0.16" }, "peerDependencies": { "eslint": ">= 9" } }, "sha512-8PH129M3W34ihNTj79hXq95++puWUMGm7wTRH5NiLZZbiLyGwyv2CpZcT92uBehQ2pYc26TxzEbIvp8+MCU2Ow=="], + + "@n8n/expression-runtime": ["@n8n/expression-runtime@0.5.0", "", { "dependencies": { "@n8n/tournament": "1.0.6", "isolated-vm": "^6.0.2", "js-base64": "3.7.2", "jssha": "3.3.1", "lodash": "4.17.23", "luxon": "3.7.2", "md5": "2.3.0", "title-case": "3.0.3", "transliteration": "2.3.5" } }, "sha512-DqkF79FyuljdjlSz1i6PfbrQ47w5U/fIqjoyAbRVxr+YatiM3RAe0zhfQ1ur1lV5QTq0BHnY8zsfFQ+DIItPhA=="], + + "@n8n/node-cli": ["@n8n/node-cli@0.23.1", "", { "dependencies": { "@clack/prompts": "^0.11.0", "@n8n/ai-node-sdk": "0.4.1", "@n8n/eslint-plugin-community-nodes": "0.9.0", "@oclif/core": "^4.5.2", "change-case": "^5.4.4", "eslint-import-resolver-typescript": "^4.4.3", "eslint-plugin-import-x": "^4.15.2", "eslint-plugin-n8n-nodes-base": "1.16.5", "fast-glob": "3.2.12", "handlebars": "4.7.8", "picocolors": "1.0.1", "prettier": "3.6.2", "prompts": "^2.4.2", "rimraf": "6.0.1", "ts-morph": "^27.0.2", "typescript-eslint": "^8.35.0" }, "peerDependencies": { "eslint": ">= 9" }, "bin": { "n8n-node": "bin/n8n-node.mjs" } }, "sha512-bl5qL92Ymjl4+nkk4D57007W/+XbBHnuHlMiwMjKR68NQeolCYNqKwXlmAsAgEauZTWe0Rqueybr90FY2rML7w=="], + + "@n8n/tournament": ["@n8n/tournament@1.0.6", "", { "dependencies": { "@n8n_io/riot-tmpl": "^4.0.1", "ast-types": "^0.16.1", "esprima-next": "^5.8.4", "recast": "^0.22.0" } }, "sha512-UGSxYXXVuOX0yL6HTLBStKYwLIa0+JmRKiSZSCMcM2s2Wax984KWT6XIA1TR/27i7yYpDk1MY14KsTPnuEp27A=="], + + "@n8n/typescript-config": ["@n8n/typescript-config@1.3.0", "", {}, "sha512-wnrHUHdyfL8PgwwwBDWUaEnRRjszLYMVv5NzXnPtRaiewz2reOWeruhFTL0aPjJioYT2LcB9dLelCA44ytnXAA=="], + + "@n8n_io/riot-tmpl": ["@n8n_io/riot-tmpl@4.0.1", "", { "dependencies": { "eslint-config-riot": "^1.0.0" } }, "sha512-/zdRbEfTFjsm1NqnpPQHgZTkTdbp5v3VUxGeMA9098sps8jRCTraQkc3AQstJgHUm7ylBXJcIVhnVeLUMWAfwQ=="], "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], "@next/env": ["@next/env@16.0.10", "", {}, "sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang=="], - "@next/eslint-plugin-next": ["@next/eslint-plugin-next@16.1.6", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-/Qq3PTagA6+nYVfryAtQ7/9FEr/6YVyvOtl6rZnGsbReGLf0jZU6gkpr1FuChAQpvV46a78p4cmHOVP8mbfSMQ=="], + "@next/eslint-plugin-next": ["@next/eslint-plugin-next@16.2.1", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-r0epZGo24eT4g08jJlg2OEryBphXqO8aL18oajoTKLzHJ6jVr6P6FI58DLMug04MwD3j8Fj0YK0slyzneKVyzA=="], "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.0.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg=="], @@ -520,57 +591,57 @@ "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="], - "@oclif/core": ["@oclif/core@4.8.3", "", { "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.17.0", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", "debug": "^4.4.3", "ejs": "^3.1.10", "get-package-type": "^0.1.0", "indent-string": "^4.0.0", "is-wsl": "^2.2.0", "lilconfig": "^3.1.3", "minimatch": "^10.2.4", "semver": "^7.7.3", "string-width": "^4.2.3", "supports-color": "^8", "tinyglobby": "^0.2.14", "widest-line": "^3.1.0", "wordwrap": "^1.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-f7Rc1JBZO0wNMyDmNzP5IFOv5eM97S9pO4JUFdu2OLyk73YeBI9wog1Yyf666NOQvyptkbG1xh8inzMDQLNTyQ=="], + "@oclif/core": ["@oclif/core@4.10.3", "", { "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.17.0", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", "debug": "^4.4.3", "ejs": "^3.1.10", "get-package-type": "^0.1.0", "indent-string": "^4.0.0", "is-wsl": "^2.2.0", "lilconfig": "^3.1.3", "minimatch": "^10.2.4", "semver": "^7.7.3", "string-width": "^4.2.3", "supports-color": "^8", "tinyglobby": "^0.2.14", "widest-line": "^3.1.0", "wordwrap": "^1.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-0mD8vcrrX5uRsxzvI8tbWmSVGngvZA/Qo6O0ZGvLPAWEauSf5GFniwgirhY0SkszuHwu0S1J1ivj/jHmqtIDuA=="], - "@oclif/plugin-autocomplete": ["@oclif/plugin-autocomplete@3.2.40", "", { "dependencies": { "@oclif/core": "^4", "ansis": "^3.16.0", "debug": "^4.4.1", "ejs": "^3.1.10" } }, "sha512-HCfDuUV3l5F5Wz7SKkaoFb+OMQ5vKul8zvsPNgI0QbZcQuGHmn3svk+392wSfXboyA1gq8kzEmKPAoQK6r6UNw=="], + "@oclif/plugin-autocomplete": ["@oclif/plugin-autocomplete@3.2.42", "", { "dependencies": { "@oclif/core": "^4", "ansis": "^3.16.0", "debug": "^4.4.1", "ejs": "^3.1.10" } }, "sha512-VPL/XJDKhtDxZLTGdtbrAW3FQyCvTaFldBFs+u6XdeSN8PazmU+K8oPiVUsrm1jUYUx3HeVTopce7ap5t+8TFg=="], - "@oclif/plugin-help": ["@oclif/plugin-help@6.2.37", "", { "dependencies": { "@oclif/core": "^4" } }, "sha512-5N/X/FzlJaYfpaHwDC0YHzOzKDWa41s9t+4FpCDu4f9OMReds4JeNBaaWk9rlIzdKjh2M6AC5Q18ORfECRkHGA=="], + "@oclif/plugin-help": ["@oclif/plugin-help@6.2.40", "", { "dependencies": { "@oclif/core": "^4" } }, "sha512-sU/PMrz1LnnnNk4T3qvZU8dTUiSc0MZaL7woh2wfuNSXbCnxicJzx4kX1sYeY6eF0NmqFiYlpNEQJykBG0g1sA=="], - "@oclif/plugin-not-found": ["@oclif/plugin-not-found@3.2.74", "", { "dependencies": { "@inquirer/prompts": "^7.10.1", "@oclif/core": "^4.8.0", "ansis": "^3.17.0", "fast-levenshtein": "^3.0.0" } }, "sha512-6RD/EuIUGxAYR45nMQg+nw+PqwCXUxkR6Eyn+1fvbVjtb9d+60OPwB77LCRUI4zKNI+n0LOFaMniEdSpb+A7kQ=="], + "@oclif/plugin-not-found": ["@oclif/plugin-not-found@3.2.77", "", { "dependencies": { "@inquirer/prompts": "^7.10.1", "@oclif/core": "^4.10.2", "ansis": "^3.17.0", "fast-levenshtein": "^3.0.0" } }, "sha512-bU9lpYYk8aTafGFbsEoj88KLqJGFcY2w84abcuAUHsGgwpGA/G67Z3DwzaSkfuH6HZ58orC3ueEKGCMpF5nUDQ=="], - "@oclif/plugin-warn-if-update-available": ["@oclif/plugin-warn-if-update-available@3.1.55", "", { "dependencies": { "@oclif/core": "^4", "ansis": "^3.17.0", "debug": "^4.4.3", "http-call": "^5.2.2", "lodash": "^4.17.23", "registry-auth-token": "^5.1.1" } }, "sha512-VIEBoaoMOCjl3y+w/kdfZMODi0mVMnDuM0vkBf3nqeidhRXVXq87hBqYDdRwN1XoD+eDfE8tBbOP7qtSOONztQ=="], + "@oclif/plugin-warn-if-update-available": ["@oclif/plugin-warn-if-update-available@3.1.57", "", { "dependencies": { "@oclif/core": "^4", "ansis": "^3.17.0", "debug": "^4.4.3", "http-call": "^5.2.2", "lodash": "^4.17.23", "registry-auth-token": "^5.1.1" } }, "sha512-y8BiMMiX3gnDO3kSck7R61bB74N8SI38pN9LbpaDlhZcjcN27wuIR5trePFxTxx85iow1YC5qvzYtwUZsDVjXg=="], - "@oclif/test": ["@oclif/test@4.1.16", "", { "dependencies": { "ansis": "^3.17.0", "debug": "^4.4.3" }, "peerDependencies": { "@oclif/core": ">= 3.0.0" } }, "sha512-LPrF++WGGBE0pe3GUkzEteI5WrwTT7usGpIMSxkyJhYnFXKkwASyTcCmOhNH4QC65kqsLt1oBA88BMkCJqPtxg=="], + "@oclif/test": ["@oclif/test@4.1.17", "", { "dependencies": { "ansis": "^3.17.0", "debug": "^4.4.3" }, "peerDependencies": { "@oclif/core": ">= 3.0.0" } }, "sha512-OaD6/2vW9MqL58ZtaTGO1wc2vnPxZ/LLN0qp/+HVdMsBt/UDubxZreC3cxGR9rT8SMfyBvGIU8MzmZEBuiikAQ=="], - "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.17.1", "", { "os": "android", "cpu": "arm" }, "sha512-+VuZyMYYaap5uDAU1xDU3Kul0FekLqpBS8kI5JozlWfYQKnc/HsZg2gHPkQrj0SC9lt74WMNCfOzZZJlYXSdEQ=="], + "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.19.1", "", { "os": "android", "cpu": "arm" }, "sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg=="], - "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.17.1", "", { "os": "android", "cpu": "arm64" }, "sha512-YlDDTjvOEKhom/cRSVsXsMVeXVIAM9PJ/x2mfe08rfuS0iIEfJd8PngKbEIhG72WPxleUa+vkEZj9ncmC14z3Q=="], + "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.19.1", "", { "os": "android", "cpu": "arm64" }, "sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA=="], - "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.17.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HOYYLSY4JDk14YkXaz/ApgJYhgDP4KsG8EZpgpOxdszGW9HmIMMY/vXqVKYW74dSH+GQkIXYxBrEh3nv+XODVg=="], + "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.19.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ=="], - "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.17.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-JHPJbsa5HvPq2/RIdtGlqfaG9zV2WmgvHrKTYmlW0L5esqtKCBuetFudXTBzkNcyD69kSZLzH92AzTr6vFHMFg=="], + "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.19.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ=="], - "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.17.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UD1FRC8j8xZstFXYsXwQkNmmg7vUbee006IqxokwDUUA+xEgKZDpLhBEiVKM08Urb+bn7Q0gn6M1pyNR0ng5mg=="], + "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.19.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw=="], - "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.17.1", "", { "os": "linux", "cpu": "arm" }, "sha512-wFWC1wyf2ROFWTxK5x0Enm++DSof3EBQ/ypyAesMDLiYxOOASDoMOZG1ylWUnlKaCt5W7eNOWOzABpdfFf/ssA=="], + "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1", "", { "os": "linux", "cpu": "arm" }, "sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A=="], - "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.17.1", "", { "os": "linux", "cpu": "arm" }, "sha512-k/hUif0GEBk/csSqCfTPXb8AAVs1NNWCa/skBghvNbTtORcWfOVqJ3mM+2pE189+enRm4UnryLREu5ysI0kXEQ=="], + "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.19.1", "", { "os": "linux", "cpu": "arm" }, "sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ=="], - "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.17.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Cwm6A071ww60QouJ9LoHAwBgEoZzHQ0Qaqk2E7WLfBdiQN9mLXIDhnrpn04hlRElRPhLiu/dtg+o5PPLvaINXQ=="], + "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.19.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig=="], - "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.17.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+hwlE2v3m0r3sk93SchJL1uyaKcPjf+NGO/TD2DZUDo+chXx7FfaEj0nUMewigSt7oZ2sQN9Z4NJOtUa75HE5Q=="], + "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.19.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew=="], - "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.17.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-bO+rsaE5Ox8cFyeL5Ct5tzot1TnQpFa/Wmu5k+hqBYSH2dNVDGoi0NizBN5QV8kOIC6O5MZr81UG4yW/2FyDTA=="], + "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.19.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ=="], - "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.17.1", "", { "os": "linux", "cpu": "none" }, "sha512-B/P+hxKQ1oX4YstI9Lyh4PGzqB87Ddqj/A4iyRBbPdXTcxa+WW3oRLx1CsJKLmHPdDk461Hmbghq1Bm3pl+8Aw=="], + "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.19.1", "", { "os": "linux", "cpu": "none" }, "sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w=="], - "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.17.1", "", { "os": "linux", "cpu": "none" }, "sha512-ulp2H3bFXzd/th2maH+QNKj5qgOhJ3v9Yspdf1svTw3CDOuuTl6sRKsWQ7MUw0vnkSNvQndtflBwVXgzZvURsQ=="], + "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.19.1", "", { "os": "linux", "cpu": "none" }, "sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw=="], - "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.17.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-LAXYVe3rKk09Zo9YKF2ZLBcH8sz8Oj+JIyiUxiHtq0hiYLMsN6dOpCf2hzQEjPAmsSEA/hdC1PVKeXo+oma8mQ=="], + "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.19.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA=="], - "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.17.1", "", { "os": "linux", "cpu": "x64" }, "sha512-3RAhxipMKE8RCSPn7O//sj440i+cYTgYbapLeOoDvQEt6R1QcJjTsFgI4iz99FhVj3YbPxlZmcLB5VW+ipyRTA=="], + "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.19.1", "", { "os": "linux", "cpu": "x64" }, "sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ=="], - "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.17.1", "", { "os": "linux", "cpu": "x64" }, "sha512-wpjMEubGU8r9VjZTLdZR3aPHaBqTl8Jl8F4DBbgNoZ+yhkhQD1/MGvY70v2TLnAI6kAHSvcqgfvaqKDa2iWsPQ=="], + "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.19.1", "", { "os": "linux", "cpu": "x64" }, "sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw=="], - "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.17.1", "", { "os": "none", "cpu": "arm64" }, "sha512-XIE4w17RYAVIgx+9Gs3deTREq5tsmalbatYOOBGNdH7n0DfTE600c7wYXsp7ANc3BPDXsInnOzXDEPCvO1F6cg=="], + "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.19.1", "", { "os": "none", "cpu": "arm64" }, "sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA=="], - "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.17.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-Lqi5BlHX3zS4bpSOkIbOKVf7DIk6Gvmdifr2OuOI58eUUyP944M8/OyaB09cNpPy9Vukj7nmmhOzj8pwLgAkIg=="], + "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.19.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg=="], - "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.17.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-l6lTcLBQVj1HNquFpXSsrkCIM8X5Hlng5YNQJrg00z/KyovvDV5l3OFhoRyZ+aLBQ74zUnMRaJZC7xcBnHyeNg=="], + "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.19.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ=="], - "@oxc-resolver/binding-win32-ia32-msvc": ["@oxc-resolver/binding-win32-ia32-msvc@11.17.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-VTzVtfnCCsU/6GgvursWoyZrhe3Gj/RyXzDWmh4/U1Y3IW0u1FZbp+hCIlBL16pRPbDc5YvXVtCOnA41QOrOoQ=="], + "@oxc-resolver/binding-win32-ia32-msvc": ["@oxc-resolver/binding-win32-ia32-msvc@11.19.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA=="], - "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.17.1", "", { "os": "win32", "cpu": "x64" }, "sha512-jRPVU+6/12baj87q2+UGRh30FBVBzqKdJ7rP/mSqiL1kpNQB9yZ1j0+m3sru1m+C8hiFK7lBFwjUtYUBI7+UpQ=="], + "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.19.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw=="], "@pachca/cli": ["@pachca/cli@workspace:packages/cli"], @@ -594,6 +665,10 @@ "@pachca/swift": ["@pachca/swift@workspace:sdk/swift"], + "@package-json/types": ["@package-json/types@0.0.12", "", {}, "sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw=="], + + "@playwright/test": ["@playwright/test@1.58.2", "", { "dependencies": { "playwright": "1.58.2" }, "bin": { "playwright": "cli.js" } }, "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA=="], + "@pnpm/config.env-replace": ["@pnpm/config.env-replace@1.1.0", "", {}, "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w=="], "@pnpm/network.ca-file": ["@pnpm/network.ca-file@1.0.2", "", { "dependencies": { "graceful-fs": "4.2.10" } }, "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA=="], @@ -662,67 +737,67 @@ "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.0", "", { "os": "android", "cpu": "arm" }, "sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.59.0", "", { "os": "android", "cpu": "arm64" }, "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.0", "", { "os": "android", "cpu": "arm64" }, "sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.59.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.60.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.59.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.60.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.59.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.60.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.59.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.60.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.60.0", "", { "os": "linux", "cpu": "arm" }, "sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.60.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.60.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.60.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ=="], - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.60.0", "", { "os": "linux", "cpu": "none" }, "sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw=="], - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q=="], + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.60.0", "", { "os": "linux", "cpu": "none" }, "sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.60.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ=="], - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA=="], + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.60.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.60.0", "", { "os": "linux", "cpu": "none" }, "sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.60.0", "", { "os": "linux", "cpu": "none" }, "sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.59.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.60.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.60.0", "", { "os": "linux", "cpu": "x64" }, "sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.60.0", "", { "os": "linux", "cpu": "x64" }, "sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw=="], - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.59.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ=="], + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.60.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.59.0", "", { "os": "none", "cpu": "arm64" }, "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA=="], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.60.0", "", { "os": "none", "cpu": "arm64" }, "sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.59.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.60.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.59.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.60.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w=="], - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA=="], + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.60.0", "", { "os": "win32", "cpu": "x64" }, "sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.0", "", { "os": "win32", "cpu": "x64" }, "sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], - "@scalar/helpers": ["@scalar/helpers@0.2.11", "", {}, "sha512-Y7DLt1bIZF9dvHzJwSJTcC1lpSr1Tbf4VBhHOCRIHu23Rr7/lhQnddRxFmPV1tZXwEQKz7F7yRrubwCfKPCucw=="], + "@scalar/helpers": ["@scalar/helpers@0.2.18", "", {}, "sha512-w1d4tpNEVZ293oB2BAgLrS0kVPUtG3eByNmOCJA5eK9vcT4D3cmsGtWjUaaqit0BQCsBFHK51rasGvSWnApYTw=="], - "@scalar/json-magic": ["@scalar/json-magic@0.9.6", "", { "dependencies": { "@scalar/helpers": "0.2.11", "yaml": "^2.8.0" } }, "sha512-2TKoqkAophHti1nH+rvQlR4lhD6X9tqQpuNeAE0cytHSX/yndkSOE0yA7cep5T9tFjGN4Km0gMnelvY3LgWs4A=="], + "@scalar/json-magic": ["@scalar/json-magic@0.11.7", "", { "dependencies": { "@scalar/helpers": "0.2.18", "pathe": "^2.0.3", "yaml": "^2.8.0" } }, "sha512-GVz9E0vXu+ecypkdn0biK1gbQVkK4QTTX1Hq3eMgxlLQC91wwiqWfCqwfhuX0LRu+Z5OmYhLhufDJEEh56rVgA=="], - "@scalar/openapi-parser": ["@scalar/openapi-parser@0.24.10", "", { "dependencies": { "@scalar/helpers": "0.2.12", "@scalar/json-magic": "0.11.1", "@scalar/openapi-types": "0.5.3", "@scalar/openapi-upgrader": "0.1.8", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.8.0" } }, "sha512-E9K8OYD7XKHsvTyLTSdILKHbm4Q3n/MA3EGdDTEBLJHSJd1vLOwiJzrp3+h+xiqFxlX7vlecInZvFy/3c1fqPg=="], + "@scalar/openapi-parser": ["@scalar/openapi-parser@0.24.17", "", { "dependencies": { "@scalar/helpers": "0.2.18", "@scalar/json-magic": "0.11.7", "@scalar/openapi-types": "0.5.4", "@scalar/openapi-upgrader": "0.1.11", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.8.0" } }, "sha512-aM9UVrzlMreC3X/sZbyj+7XDZmat3ecGC3RpU8dqEO/HIH+CEX0xMLuP+41DhePCYg5+9TtDomSfWuMq4x1Z1A=="], - "@scalar/openapi-types": ["@scalar/openapi-types@0.5.3", "", { "dependencies": { "zod": "^4.1.11" } }, "sha512-m4n/Su3K01d15dmdWO1LlqecdSPKuNjuokrJLdiQ485kW/hRHbXW1QP6tJL75myhw/XhX5YhYAR+jrwnGjXiMw=="], + "@scalar/openapi-types": ["@scalar/openapi-types@0.5.4", "", { "dependencies": { "zod": "^4.3.5" } }, "sha512-2pEbhprh8lLGDfUI6mNm9EV104pjb3+aJsXrFaqfgOSre7r6NlgM5HcSbsLjzDAnTikjJhJ3IMal1Rz8WVwiOw=="], - "@scalar/openapi-upgrader": ["@scalar/openapi-upgrader@0.1.8", "", { "dependencies": { "@scalar/openapi-types": "0.5.3" } }, "sha512-2xuYLLs0fBadLIk4I1ObjMiCnOyLPEMPf24A1HtHQvhKGDnGlvT63F2rU2Xw8lxCjgHnzveMPnOJEbwIy64RCg=="], + "@scalar/openapi-upgrader": ["@scalar/openapi-upgrader@0.1.11", "", { "dependencies": { "@scalar/openapi-types": "0.5.4" } }, "sha512-ngJcHGoCHmpWgYtNy08vmzFfLdQEkMpvaCQqNPPMNKq0QEXOv89e/rn+TZJZgPnRlY7fDIoIhn9lNgr+azBW+w=="], "@shikijs/core": ["@shikijs/core@1.29.2", "", { "dependencies": { "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ=="], @@ -742,141 +817,169 @@ "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], - "@smithy/abort-controller": ["@smithy/abort-controller@4.2.10", "", { "dependencies": { "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-qocxM/X4XGATqQtUkbE9SPUB6wekBi+FyJOMbPj0AhvyvFGYEmOlz6VB22iMePCQsFmMIvFSeViDvA7mZJG47g=="], + "@smithy/abort-controller": ["@smithy/abort-controller@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q=="], - "@smithy/chunked-blob-reader": ["@smithy/chunked-blob-reader@5.2.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-y5d4xRiD6TzeP5BWlb+Ig/VFqF+t9oANNhGeMqyzU7obw7FYgTgVi50i5JqBTeKp+TABeDIeeXFZdz65RipNtA=="], + "@smithy/chunked-blob-reader": ["@smithy/chunked-blob-reader@5.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw=="], - "@smithy/chunked-blob-reader-native": ["@smithy/chunked-blob-reader-native@4.2.2", "", { "dependencies": { "@smithy/util-base64": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-QzzYIlf4yg0w5TQaC9VId3B3ugSk1MI/wb7tgcHtd7CBV9gNRKZrhc2EPSxSZuDy10zUZ0lomNMgkc6/VVe8xg=="], + "@smithy/chunked-blob-reader-native": ["@smithy/chunked-blob-reader-native@4.2.3", "", { "dependencies": { "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" } }, "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw=="], - "@smithy/config-resolver": ["@smithy/config-resolver@4.4.9", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.10", "@smithy/types": "^4.13.0", "@smithy/util-config-provider": "^4.2.1", "@smithy/util-endpoints": "^3.3.1", "@smithy/util-middleware": "^4.2.10", "tslib": "^2.6.2" } }, "sha512-ejQvXqlcU30h7liR9fXtj7PIAau1t/sFbJpgWPfiYDs7zd16jpH0IsSXKcba2jF6ChTXvIjACs27kNMc5xxE2Q=="], + "@smithy/config-resolver": ["@smithy/config-resolver@4.4.13", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.12", "@smithy/types": "^4.13.1", "@smithy/util-config-provider": "^4.2.2", "@smithy/util-endpoints": "^3.3.3", "@smithy/util-middleware": "^4.2.12", "tslib": "^2.6.2" } }, "sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg=="], - "@smithy/core": ["@smithy/core@3.23.7", "", { "dependencies": { "@smithy/middleware-serde": "^4.2.11", "@smithy/protocol-http": "^5.3.10", "@smithy/types": "^4.13.0", "@smithy/util-base64": "^4.3.1", "@smithy/util-body-length-browser": "^4.2.1", "@smithy/util-middleware": "^4.2.10", "@smithy/util-stream": "^4.5.16", "@smithy/util-utf8": "^4.2.1", "@smithy/uuid": "^1.1.1", "tslib": "^2.6.2" } }, "sha512-/+ldRdtiO5Cb26afAZOG1FZM0x7D4AYdjpyOv2OScJw+4C7X+OLdRnNKF5UyUE0VpPgSKr3rnF/kvprRA4h2kg=="], + "@smithy/core": ["@smithy/core@3.23.12", "", { "dependencies": { "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-middleware": "^4.2.12", "@smithy/util-stream": "^4.5.20", "@smithy/util-utf8": "^4.2.2", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" } }, "sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w=="], - "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.2.10", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.10", "@smithy/property-provider": "^4.2.10", "@smithy/types": "^4.13.0", "@smithy/url-parser": "^4.2.10", "tslib": "^2.6.2" } }, "sha512-3bsMLJJLTZGZqVGGeBVFfLzuRulVsGTj12BzRKODTHqUABpIr0jMN1vN3+u6r2OfyhAQ2pXaMZWX/swBK5I6PQ=="], + "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.2.12", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.12", "@smithy/property-provider": "^4.2.12", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "tslib": "^2.6.2" } }, "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg=="], - "@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.10", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.13.0", "@smithy/util-hex-encoding": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-A4ynrsFFfSXUHicfTcRehytppFBcY3HQxEGYiyGktPIOye3Ot7fxpiy4VR42WmtGI4Wfo6OXt/c1Ky1nUFxYYQ=="], + "@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.12", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.13.1", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA=="], - "@smithy/eventstream-serde-browser": ["@smithy/eventstream-serde-browser@4.2.10", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-0xupsu9yj9oDVuQ50YCTS9nuSYhGlrwqdaKQel9y2Fz7LU9fNErVlw9N0o4pm4qqvWEGbSTI4HKc6XJfB30MVw=="], + "@smithy/eventstream-serde-browser": ["@smithy/eventstream-serde-browser@4.2.12", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A=="], - "@smithy/eventstream-serde-config-resolver": ["@smithy/eventstream-serde-config-resolver@4.3.10", "", { "dependencies": { "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-8kn6sinrduk0yaYHMJDsNuiFpXwQwibR7n/4CDUqn4UgaG+SeBHu5jHGFdU9BLFAM7Q4/gvr9RYxBHz9/jKrhA=="], + "@smithy/eventstream-serde-config-resolver": ["@smithy/eventstream-serde-config-resolver@4.3.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q=="], - "@smithy/eventstream-serde-node": ["@smithy/eventstream-serde-node@4.2.10", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-uUrxPGgIffnYfvIOUmBM5i+USdEBRTdh7mLPttjphgtooxQ8CtdO1p6K5+Q4BBAZvKlvtJ9jWyrWpBJYzBKsyQ=="], + "@smithy/eventstream-serde-node": ["@smithy/eventstream-serde-node@4.2.12", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA=="], - "@smithy/eventstream-serde-universal": ["@smithy/eventstream-serde-universal@4.2.10", "", { "dependencies": { "@smithy/eventstream-codec": "^4.2.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-aArqzOEvcs2dK+xQVCgLbpJQGfZihw8SD4ymhkwNTtwKbnrzdhJsFDKuMQnam2kF69WzgJYOU5eJlCx+CA32bw=="], + "@smithy/eventstream-serde-universal": ["@smithy/eventstream-serde-universal@4.2.12", "", { "dependencies": { "@smithy/eventstream-codec": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ=="], - "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.3.12", "", { "dependencies": { "@smithy/protocol-http": "^5.3.10", "@smithy/querystring-builder": "^4.2.10", "@smithy/types": "^4.13.0", "@smithy/util-base64": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-muS5tFw+A/uo+U+yig06vk1776UFM+aAp9hFM8efI4ZcHhTcgv6NTeK4x7ltHeMPBwnhEjcf0MULTyxNkSNxDw=="], + "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.3.15", "", { "dependencies": { "@smithy/protocol-http": "^5.3.12", "@smithy/querystring-builder": "^4.2.12", "@smithy/types": "^4.13.1", "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" } }, "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A=="], - "@smithy/hash-blob-browser": ["@smithy/hash-blob-browser@4.2.11", "", { "dependencies": { "@smithy/chunked-blob-reader": "^5.2.1", "@smithy/chunked-blob-reader-native": "^4.2.2", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-DrcAx3PM6AEbWZxsKl6CWAGnVwiz28Wp1ZhNu+Hi4uI/6C1PIZBIaPM2VoqBDAsOWbM6ZVzOEQMxFLLdmb4eBQ=="], + "@smithy/hash-blob-browser": ["@smithy/hash-blob-browser@4.2.13", "", { "dependencies": { "@smithy/chunked-blob-reader": "^5.2.2", "@smithy/chunked-blob-reader-native": "^4.2.3", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g=="], - "@smithy/hash-node": ["@smithy/hash-node@4.2.10", "", { "dependencies": { "@smithy/types": "^4.13.0", "@smithy/util-buffer-from": "^4.2.1", "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-1VzIOI5CcsvMDvP3iv1vG/RfLJVVVc67dCRyLSB2Hn9SWCZrDO3zvcIzj3BfEtqRW5kcMg5KAeVf1K3dR6nD3w=="], + "@smithy/hash-node": ["@smithy/hash-node@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w=="], - "@smithy/hash-stream-node": ["@smithy/hash-stream-node@4.2.10", "", { "dependencies": { "@smithy/types": "^4.13.0", "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-w78xsYrOlwXKwN5tv1GnKIRbHb1HygSpeZMP6xDxCPGf1U/xDHjCpJu64c5T35UKyEPwa0bPeIcvU69VY3khUA=="], + "@smithy/hash-stream-node": ["@smithy/hash-stream-node@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw=="], - "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.2.10", "", { "dependencies": { "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-vy9KPNSFUU0ajFYk0sDZIYiUlAWGEAhRfehIr5ZkdFrRFTAuXEPUd41USuqHU6vvLX4r6Q9X7MKBco5+Il0Org=="], + "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g=="], - "@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.2.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Yfu664Qbf1B4IYIsYgKoABt010daZjkaCRvdU/sPnZG6TtHOB0md0RjNdLGzxe5UIdn9js4ftPICzmkRa9RJ4Q=="], + "@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow=="], - "@smithy/md5-js": ["@smithy/md5-js@4.2.10", "", { "dependencies": { "@smithy/types": "^4.13.0", "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-Op+Dh6dPLWTjWITChFayDllIaCXRofOed8ecpggTC5fkh8yXes0vAEX7gRUfjGK+TlyxoCAA05gHbZW/zB9JwQ=="], + "@smithy/md5-js": ["@smithy/md5-js@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ=="], - "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.2.10", "", { "dependencies": { "@smithy/protocol-http": "^5.3.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-TQZ9kX5c6XbjhaEBpvhSvMEZ0klBs1CFtOdPFwATZSbC9UeQfKHPLPN9Y+I6wZGMOavlYTOlHEPDrt42PMSH9w=="], + "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.2.12", "", { "dependencies": { "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA=="], - "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.4.21", "", { "dependencies": { "@smithy/core": "^3.23.7", "@smithy/middleware-serde": "^4.2.11", "@smithy/node-config-provider": "^4.3.10", "@smithy/shared-ini-file-loader": "^4.4.5", "@smithy/types": "^4.13.0", "@smithy/url-parser": "^4.2.10", "@smithy/util-middleware": "^4.2.10", "tslib": "^2.6.2" } }, "sha512-CoVGZaqIC0tEjz0ga3ciwCMA5fd/4lIOwO2wx0fH+cTi1zxSFZnMJbIiIF9G1d4vRSDyTupDrpS3FKBBJGkRZg=="], + "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.4.27", "", { "dependencies": { "@smithy/core": "^3.23.12", "@smithy/middleware-serde": "^4.2.15", "@smithy/node-config-provider": "^4.3.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-middleware": "^4.2.12", "tslib": "^2.6.2" } }, "sha512-T3TFfUgXQlpcg+UdzcAISdZpj4Z+XECZ/cefgA6wLBd6V4lRi0svN2hBouN/be9dXQ31X4sLWz3fAQDf+nt6BA=="], - "@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.38", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.10", "@smithy/protocol-http": "^5.3.10", "@smithy/service-error-classification": "^4.2.10", "@smithy/smithy-client": "^4.12.1", "@smithy/types": "^4.13.0", "@smithy/util-middleware": "^4.2.10", "@smithy/util-retry": "^4.2.10", "@smithy/uuid": "^1.1.1", "tslib": "^2.6.2" } }, "sha512-WdHvdhjE6Fj78vxFwDKFDwlqGOGRUWrwGeuENUbTVE46Su9mnQM+dXHtbnCaQvwuSYrRsjpe8zUsFpwUp/azlA=="], + "@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.44", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.12", "@smithy/protocol-http": "^5.3.12", "@smithy/service-error-classification": "^4.2.12", "@smithy/smithy-client": "^4.12.7", "@smithy/types": "^4.13.1", "@smithy/util-middleware": "^4.2.12", "@smithy/util-retry": "^4.2.12", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" } }, "sha512-Y1Rav7m5CFRPQyM4CI0koD/bXjyjJu3EQxZZhtLGD88WIrBrQ7kqXM96ncd6rYnojwOo/u9MXu57JrEvu/nLrA=="], - "@smithy/middleware-serde": ["@smithy/middleware-serde@4.2.11", "", { "dependencies": { "@smithy/protocol-http": "^5.3.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-STQdONGPwbbC7cusL60s7vOa6He6A9w2jWhoapL0mgVjmR19pr26slV+yoSP76SIssMTX/95e5nOZ6UQv6jolg=="], + "@smithy/middleware-serde": ["@smithy/middleware-serde@4.2.15", "", { "dependencies": { "@smithy/core": "^3.23.12", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-ExYhcltZSli0pgAKOpQQe1DLFBLryeZ22605y/YS+mQpdNWekum9Ujb/jMKfJKgjtz1AZldtwA/wCYuKJgjjlg=="], - "@smithy/middleware-stack": ["@smithy/middleware-stack@4.2.10", "", { "dependencies": { "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-pmts/WovNcE/tlyHa8z/groPeOtqtEpp61q3W0nW1nDJuMq/x+hWa/OVQBtgU0tBqupeXq0VBOLA4UZwE8I0YA=="], + "@smithy/middleware-stack": ["@smithy/middleware-stack@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw=="], - "@smithy/node-config-provider": ["@smithy/node-config-provider@4.3.10", "", { "dependencies": { "@smithy/property-provider": "^4.2.10", "@smithy/shared-ini-file-loader": "^4.4.5", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-UALRbJtVX34AdP2VECKVlnNgidLHA2A7YgcJzwSBg1hzmnO/bZBHl/LDQQyYifzUwp1UOODnl9JJ3KNawpUJ9w=="], + "@smithy/node-config-provider": ["@smithy/node-config-provider@4.3.12", "", { "dependencies": { "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw=="], - "@smithy/node-http-handler": ["@smithy/node-http-handler@4.4.13", "", { "dependencies": { "@smithy/abort-controller": "^4.2.10", "@smithy/protocol-http": "^5.3.10", "@smithy/querystring-builder": "^4.2.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-o8CP8w6tlUA0lk+Qfwm6Ed0jCWk3bEY6iBOJjdBaowbXKCSClk8zIHQvUL6RUZMvuNafF27cbRCMYqw6O1v4aA=="], + "@smithy/node-http-handler": ["@smithy/node-http-handler@4.5.0", "", { "dependencies": { "@smithy/abort-controller": "^4.2.12", "@smithy/protocol-http": "^5.3.12", "@smithy/querystring-builder": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-Rnq9vQWiR1+/I6NZZMNzJHV6pZYyEHt2ZnuV3MG8z2NNenC4i/8Kzttz7CjZiHSmsN5frhXhg17z3Zqjjhmz1A=="], - "@smithy/property-provider": ["@smithy/property-provider@4.2.10", "", { "dependencies": { "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-5jm60P0CU7tom0eNrZ7YrkgBaoLFXzmqB0wVS+4uK8PPGmosSrLNf6rRd50UBvukztawZ7zyA8TxlrKpF5z9jw=="], + "@smithy/property-provider": ["@smithy/property-provider@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A=="], - "@smithy/protocol-http": ["@smithy/protocol-http@5.3.10", "", { "dependencies": { "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-2NzVWpYY0tRdfeCJLsgrR89KE3NTWT2wGulhNUxYlRmtRmPwLQwKzhrfVaiNlA9ZpJvbW7cjTVChYKgnkqXj1A=="], + "@smithy/protocol-http": ["@smithy/protocol-http@5.3.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw=="], - "@smithy/querystring-builder": ["@smithy/querystring-builder@4.2.10", "", { "dependencies": { "@smithy/types": "^4.13.0", "@smithy/util-uri-escape": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-HeN7kEvuzO2DmAzLukE9UryiUvejD3tMp9a1D1NJETerIfKobBUCLfviP6QEk500166eD2IATaXM59qgUI+YDA=="], + "@smithy/querystring-builder": ["@smithy/querystring-builder@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "@smithy/util-uri-escape": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg=="], - "@smithy/querystring-parser": ["@smithy/querystring-parser@4.2.10", "", { "dependencies": { "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-4Mh18J26+ao1oX5wXJfWlTT+Q1OpDR8ssiC9PDOuEgVBGloqg18Fw7h5Ct8DyT9NBYwJgtJ2nLjKKFU6RP1G1Q=="], + "@smithy/querystring-parser": ["@smithy/querystring-parser@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw=="], - "@smithy/service-error-classification": ["@smithy/service-error-classification@4.2.10", "", { "dependencies": { "@smithy/types": "^4.13.0" } }, "sha512-0R/+/Il5y8nB/By90o8hy/bWVYptbIfvoTYad0igYQO5RefhNCDmNzqxaMx7K1t/QWo0d6UynqpqN5cCQt1MCg=="], + "@smithy/service-error-classification": ["@smithy/service-error-classification@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1" } }, "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ=="], - "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.4.5", "", { "dependencies": { "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-pHgASxl50rrtOztgQCPmOXFjRW+mCd7ALr/3uXNzRrRoGV5G2+78GOsQ3HlQuBVHCh9o6xqMNvlIKZjWn4Euug=="], + "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.4.7", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw=="], - "@smithy/signature-v4": ["@smithy/signature-v4@5.3.10", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.1", "@smithy/protocol-http": "^5.3.10", "@smithy/types": "^4.13.0", "@smithy/util-hex-encoding": "^4.2.1", "@smithy/util-middleware": "^4.2.10", "@smithy/util-uri-escape": "^4.2.1", "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-Wab3wW8468WqTKIxI+aZe3JYO52/RYT/8sDOdzkUhjnLakLe9qoQqIcfih/qxcF4qWEFoWBszY0mj5uxffaVXA=="], + "@smithy/signature-v4": ["@smithy/signature-v4@5.3.12", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.2", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/util-hex-encoding": "^4.2.2", "@smithy/util-middleware": "^4.2.12", "@smithy/util-uri-escape": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw=="], - "@smithy/smithy-client": ["@smithy/smithy-client@4.12.1", "", { "dependencies": { "@smithy/core": "^3.23.7", "@smithy/middleware-endpoint": "^4.4.21", "@smithy/middleware-stack": "^4.2.10", "@smithy/protocol-http": "^5.3.10", "@smithy/types": "^4.13.0", "@smithy/util-stream": "^4.5.16", "tslib": "^2.6.2" } }, "sha512-Xf9UFHlAihewfkmLNZ6I/Ek6kcYBKoU3cbRS9Z4q++9GWoW0YFbAHs7wMbuXm+nGuKHZ5OKheZMuDdaWPv8DJw=="], + "@smithy/smithy-client": ["@smithy/smithy-client@4.12.7", "", { "dependencies": { "@smithy/core": "^3.23.12", "@smithy/middleware-endpoint": "^4.4.27", "@smithy/middleware-stack": "^4.2.12", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/util-stream": "^4.5.20", "tslib": "^2.6.2" } }, "sha512-q3gqnwml60G44FECaEEsdQMplYhDMZYCtYhMCzadCnRnnHIobZJjegmdoUo6ieLQlPUzvrMdIJUpx6DoPmzANQ=="], - "@smithy/types": ["@smithy/types@4.13.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw=="], + "@smithy/types": ["@smithy/types@4.13.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g=="], - "@smithy/url-parser": ["@smithy/url-parser@4.2.10", "", { "dependencies": { "@smithy/querystring-parser": "^4.2.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-uypjF7fCDsRk26u3qHmFI/ePL7bxxB9vKkE+2WKEciHhz+4QtbzWiHRVNRJwU3cKhrYDYQE3b0MRFtqfLYdA4A=="], + "@smithy/url-parser": ["@smithy/url-parser@4.2.12", "", { "dependencies": { "@smithy/querystring-parser": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA=="], - "@smithy/util-base64": ["@smithy/util-base64@4.3.1", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.1", "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-BKGuawX4Doq/bI/uEmg+Zyc36rJKWuin3py89PquXBIBqmbnJwBBsmKhdHfNEp0+A4TDgLmT/3MSKZ1SxHcR6w=="], + "@smithy/util-base64": ["@smithy/util-base64@4.3.2", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ=="], - "@smithy/util-body-length-browser": ["@smithy/util-body-length-browser@4.2.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-SiJeLiozrAoCrgDBUgsVbmqHmMgg/2bA15AzcbcW+zan7SuyAVHN4xTSbq0GlebAIwlcaX32xacnrG488/J/6g=="], + "@smithy/util-body-length-browser": ["@smithy/util-body-length-browser@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ=="], - "@smithy/util-body-length-node": ["@smithy/util-body-length-node@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-4rHqBvxtJEBvsZcFQSPQqXP2b/yy/YlB66KlcEgcH2WNoOKCKB03DSLzXmOsXjbl8dJ4OEYTn31knhdznwk7zw=="], + "@smithy/util-body-length-node": ["@smithy/util-body-length-node@4.2.3", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g=="], - "@smithy/util-buffer-from": ["@smithy/util-buffer-from@4.2.1", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-/swhmt1qTiVkaejlmMPPDgZhEaWb/HWMGRBheaxwuVkusp/z+ErJyQxO6kaXumOciZSWlmq6Z5mNylCd33X7Ig=="], + "@smithy/util-buffer-from": ["@smithy/util-buffer-from@4.2.2", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q=="], - "@smithy/util-config-provider": ["@smithy/util-config-provider@4.2.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-462id/00U8JWFw6qBuTSWfN5TxOHvDu4WliI97qOIOnuC/g+NDAknTU8eoGXEPlLkRVgWEr03jJBLV4o2FL8+A=="], + "@smithy/util-config-provider": ["@smithy/util-config-provider@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ=="], - "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.37", "", { "dependencies": { "@smithy/property-provider": "^4.2.10", "@smithy/smithy-client": "^4.12.1", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-JlPZhV1kQCGNJgofRTU6E8kHrjCKsb6cps8gco8QDVaFl7biFYzHg0p1x89ytIWyVyCkY3nOpO8tJPM47Vqlww=="], + "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.43", "", { "dependencies": { "@smithy/property-provider": "^4.2.12", "@smithy/smithy-client": "^4.12.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-Qd/0wCKMaXxev/z00TvNzGCH2jlKKKxXP1aDxB6oKwSQthe3Og2dMhSayGCnsma1bK/kQX1+X7SMP99t6FgiiQ=="], - "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.40", "", { "dependencies": { "@smithy/config-resolver": "^4.4.9", "@smithy/credential-provider-imds": "^4.2.10", "@smithy/node-config-provider": "^4.3.10", "@smithy/property-provider": "^4.2.10", "@smithy/smithy-client": "^4.12.1", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-BM5cPEsyxHdYYO4Da77E94lenhaVPNUzBTyCGDkcw/n/mE8Q1cfHwr+n/w2bNPuUsPC30WaW5/hGKWOTKqw8kw=="], + "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.47", "", { "dependencies": { "@smithy/config-resolver": "^4.4.13", "@smithy/credential-provider-imds": "^4.2.12", "@smithy/node-config-provider": "^4.3.12", "@smithy/property-provider": "^4.2.12", "@smithy/smithy-client": "^4.12.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-qSRbYp1EQ7th+sPFuVcVO05AE0QH635hycdEXlpzIahqHHf2Fyd/Zl+8v0XYMJ3cgDVPa0lkMefU7oNUjAP+DQ=="], - "@smithy/util-endpoints": ["@smithy/util-endpoints@3.3.1", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-xyctc4klmjmieQiF9I1wssBWleRV0RhJ2DpO8+8yzi2LO1Z+4IWOZNGZGNj4+hq9kdo+nyfrRLmQTzc16Op2Vg=="], + "@smithy/util-endpoints": ["@smithy/util-endpoints@3.3.3", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig=="], - "@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.2.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-c1hHtkgAWmE35/50gmdKajgGAKV3ePJ7t6UtEmpfCWJmQE9BQAQPz0URUVI89eSkcDqCtzqllxzG28IQoZPvwA=="], + "@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg=="], - "@smithy/util-middleware": ["@smithy/util-middleware@4.2.10", "", { "dependencies": { "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-LxaQIWLp4y0r72eA8mwPNQ9va4h5KeLM0I3M/HV9klmFaY2kN766wf5vsTzmaOpNNb7GgXAd9a25P3h8T49PSA=="], + "@smithy/util-middleware": ["@smithy/util-middleware@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ=="], - "@smithy/util-retry": ["@smithy/util-retry@4.2.10", "", { "dependencies": { "@smithy/service-error-classification": "^4.2.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-HrBzistfpyE5uqTwiyLsFHscgnwB0kgv8vySp7q5kZ0Eltn/tjosaSGGDj/jJ9ys7pWzIP/icE2d+7vMKXLv7A=="], + "@smithy/util-retry": ["@smithy/util-retry@4.2.12", "", { "dependencies": { "@smithy/service-error-classification": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ=="], - "@smithy/util-stream": ["@smithy/util-stream@4.5.16", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.3.12", "@smithy/node-http-handler": "^4.4.13", "@smithy/types": "^4.13.0", "@smithy/util-base64": "^4.3.1", "@smithy/util-buffer-from": "^4.2.1", "@smithy/util-hex-encoding": "^4.2.1", "@smithy/util-utf8": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-c7awZV6cxY0czgDDSr+Bz0XfRtg8AwW2BWhrHhLJISrpmwv8QzA2qzTllWyMVNdy1+UJr9vCm29hzuh3l8TTFw=="], + "@smithy/util-stream": ["@smithy/util-stream@4.5.20", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.3.15", "@smithy/node-http-handler": "^4.5.0", "@smithy/types": "^4.13.1", "@smithy/util-base64": "^4.3.2", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-hex-encoding": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-4yXLm5n/B5SRBR2p8cZ90Sbv4zL4NKsgxdzCzp/83cXw2KxLEumt5p+GAVyRNZgQOSrzXn9ARpO0lUe8XSlSDw=="], - "@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.2.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-YmiUDn2eo2IOiWYYvGQkgX5ZkBSiTQu4FlDo5jNPpAxng2t6Sjb6WutnZV9l6VR4eJul1ABmCrnWBC9hKHQa6Q=="], + "@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.2.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw=="], - "@smithy/util-utf8": ["@smithy/util-utf8@4.2.1", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.1", "tslib": "^2.6.2" } }, "sha512-DSIwNaWtmzrNQHv8g7DBGR9mulSit65KSj5ymGEIAknmIN8IpbZefEep10LaMG/P/xquwbmJ1h9ectz8z6mV6g=="], + "@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="], - "@smithy/util-waiter": ["@smithy/util-waiter@4.2.10", "", { "dependencies": { "@smithy/abort-controller": "^4.2.10", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-4eTWph/Lkg1wZEDAyObwme0kmhEb7J/JjibY2znJdrYRgKbKqB7YoEhhJVJ4R1g/SYih4zuwX7LpJaM8RsnTVg=="], + "@smithy/util-waiter": ["@smithy/util-waiter@4.2.13", "", { "dependencies": { "@smithy/abort-controller": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-2zdZ9DTHngRtcYxJK1GUDxruNr53kv5W2Lupe0LMU+Imr6ohQg8M2T14MNkj1Y0wS3FFwpgpGQyvuaMF7CiTmQ=="], - "@smithy/uuid": ["@smithy/uuid@1.1.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-dSfDCeihDmZlV2oyr0yWPTUfh07suS+R5OB+FZGiv/hHyK3hrFBW5rR1UYjfa57vBsrP9lciFkRPzebaV1Qujw=="], + "@smithy/uuid": ["@smithy/uuid@1.1.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], "@szmarczak/http-timer": ["@szmarczak/http-timer@5.0.1", "", { "dependencies": { "defer-to-connect": "^2.0.1" } }, "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw=="], - "@tailwindcss/node": ["@tailwindcss/node@4.1.18", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.18" } }, "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="], + "@tailwindcss/node": ["@tailwindcss/node@4.2.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.2" } }, "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.2", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.2", "@tailwindcss/oxide-darwin-arm64": "4.2.2", "@tailwindcss/oxide-darwin-x64": "4.2.2", "@tailwindcss/oxide-freebsd-x64": "4.2.2", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", "@tailwindcss/oxide-linux-x64-musl": "4.2.2", "@tailwindcss/oxide-wasm32-wasi": "4.2.2", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" } }, "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg=="], - "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.18", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.18", "@tailwindcss/oxide-darwin-arm64": "4.1.18", "@tailwindcss/oxide-darwin-x64": "4.1.18", "@tailwindcss/oxide-freebsd-x64": "4.1.18", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", "@tailwindcss/oxide-linux-x64-musl": "4.1.18", "@tailwindcss/oxide-wasm32-wasi": "4.1.18", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" } }, "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A=="], + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.2", "", { "os": "android", "cpu": "arm64" }, "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg=="], - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.18", "", { "os": "android", "cpu": "arm64" }, "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q=="], + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg=="], - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.18", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A=="], + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw=="], - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.18", "", { "os": "darwin", "cpu": "x64" }, "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw=="], + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ=="], - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.18", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA=="], + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2", "", { "os": "linux", "cpu": "arm" }, "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ=="], - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18", "", { "os": "linux", "cpu": "arm" }, "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA=="], + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw=="], - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw=="], + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag=="], - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg=="], + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg=="], - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.18", "", { "os": "linux", "cpu": "x64" }, "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g=="], + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ=="], - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.18", "", { "os": "linux", "cpu": "x64" }, "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ=="], + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.2", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q=="], - "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.18", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.0", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.4.0" }, "cpu": "none" }, "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA=="], + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ=="], - "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.18", "", { "os": "win32", "cpu": "arm64" }, "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA=="], + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.2", "", { "os": "win32", "cpu": "x64" }, "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA=="], - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.18", "", { "os": "win32", "cpu": "x64" }, "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q=="], + "@tailwindcss/postcss": ["@tailwindcss/postcss@4.2.2", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.2.2", "@tailwindcss/oxide": "4.2.2", "postcss": "^8.5.6", "tailwindcss": "4.2.2" } }, "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ=="], - "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.18", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.18", "@tailwindcss/oxide": "4.1.18", "postcss": "^8.4.41", "tailwindcss": "4.1.18" } }, "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g=="], + "@tokenizer/inflate": ["@tokenizer/inflate@0.4.1", "", { "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" } }, "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA=="], + + "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], + + "@ts-morph/common": ["@ts-morph/common@0.28.1", "", { "dependencies": { "minimatch": "^10.0.1", "path-browserify": "^1.0.1", "tinyglobby": "^0.2.14" } }, "sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g=="], + + "@tsconfig/node10": ["@tsconfig/node10@1.0.12", "", {}, "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ=="], + + "@tsconfig/node12": ["@tsconfig/node12@1.0.11", "", {}, "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="], + + "@tsconfig/node14": ["@tsconfig/node14@1.0.3", "", {}, "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="], + + "@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="], + + "@turbo/darwin-64": ["@turbo/darwin-64@2.8.20", "", { "os": "darwin", "cpu": "x64" }, "sha512-FQ9EX1xMU5nbwjxXxM3yU88AQQ6Sqc6S44exPRroMcx9XZHqqppl5ymJF0Ig/z3nvQNwDmz1Gsnvxubo+nXWjQ=="], + + "@turbo/darwin-arm64": ["@turbo/darwin-arm64@2.8.20", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Gpyh9ATFGThD6/s9L95YWY54cizg/VRWl2B67h0yofG8BpHf67DFAh9nuJVKG7bY0+SBJDAo5cMur+wOl9YOYw=="], + + "@turbo/linux-64": ["@turbo/linux-64@2.8.20", "", { "os": "linux", "cpu": "x64" }, "sha512-p2QxWUYyYUgUFG0b0kR+pPi8t7c9uaVlRtjTTI1AbCvVqkpjUfCcReBn6DgG/Hu8xrWdKLuyQFaLYFzQskZbcA=="], + + "@turbo/linux-arm64": ["@turbo/linux-arm64@2.8.20", "", { "os": "linux", "cpu": "arm64" }, "sha512-Gn5yjlZGLRZWarLWqdQzv0wMqyBNIdq1QLi48F1oY5Lo9kiohuf7BPQWtWxeNVS2NgJ1+nb/DzK1JduYC4AWOA=="], + + "@turbo/windows-64": ["@turbo/windows-64@2.8.20", "", { "os": "win32", "cpu": "x64" }, "sha512-vyaDpYk/8T6Qz5V/X+ihKvKFEZFUoC0oxYpC1sZanK6gaESJlmV3cMRT3Qhcg4D2VxvtC2Jjs9IRkrZGL+exLw=="], + + "@turbo/windows-arm64": ["@turbo/windows-arm64@2.8.20", "", { "os": "win32", "cpu": "arm64" }, "sha512-voicVULvUV5yaGXo0Iue13BcHGYW3u0VgqSbfQwBaHbpj1zLjYV4KIe+7fYIo6DO8FVUJzxFps3ODCQG/Wy2Qw=="], "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], @@ -944,7 +1047,7 @@ "@types/d3-zoom": ["@types/d3-zoom@3.0.8", "", { "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw=="], - "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + "@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="], "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], @@ -974,7 +1077,9 @@ "@types/mute-stream": ["@types/mute-stream@0.0.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow=="], - "@types/node": ["@types/node@22.19.11", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w=="], + "@types/node": ["@types/node@22.19.15", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg=="], + + "@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="], "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], @@ -982,41 +1087,45 @@ "@types/semver": ["@types/semver@7.7.1", "", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="], + "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="], + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], "@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + "@types/uuid": ["@types/uuid@10.0.0", "", {}, "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ=="], + "@types/wrap-ansi": ["@types/wrap-ansi@3.0.0", "", {}, "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.56.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.56.0", "@typescript-eslint/type-utils": "8.56.0", "@typescript-eslint/utils": "8.56.0", "@typescript-eslint/visitor-keys": "8.56.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.56.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.57.2", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.57.2", "@typescript-eslint/type-utils": "8.57.2", "@typescript-eslint/utils": "8.57.2", "@typescript-eslint/visitor-keys": "8.57.2", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.57.2", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.56.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.56.0", "@typescript-eslint/types": "8.56.0", "@typescript-eslint/typescript-estree": "8.56.0", "@typescript-eslint/visitor-keys": "8.56.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.57.2", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.57.2", "@typescript-eslint/types": "8.57.2", "@typescript-eslint/typescript-estree": "8.57.2", "@typescript-eslint/visitor-keys": "8.57.2", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.56.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.56.0", "@typescript-eslint/types": "^8.56.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.57.2", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.57.2", "@typescript-eslint/types": "^8.57.2", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.56.0", "", { "dependencies": { "@typescript-eslint/types": "8.56.0", "@typescript-eslint/visitor-keys": "8.56.0" } }, "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.57.2", "", { "dependencies": { "@typescript-eslint/types": "8.57.2", "@typescript-eslint/visitor-keys": "8.57.2" } }, "sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.56.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.57.2", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.56.0", "", { "dependencies": { "@typescript-eslint/types": "8.56.0", "@typescript-eslint/typescript-estree": "8.56.0", "@typescript-eslint/utils": "8.56.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.57.2", "", { "dependencies": { "@typescript-eslint/types": "8.57.2", "@typescript-eslint/typescript-estree": "8.57.2", "@typescript-eslint/utils": "8.57.2", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.56.0", "", {}, "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.57.2", "", {}, "sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.56.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.56.0", "@typescript-eslint/tsconfig-utils": "8.56.0", "@typescript-eslint/types": "8.56.0", "@typescript-eslint/visitor-keys": "8.56.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.57.2", "", { "dependencies": { "@typescript-eslint/project-service": "8.57.2", "@typescript-eslint/tsconfig-utils": "8.57.2", "@typescript-eslint/types": "8.57.2", "@typescript-eslint/visitor-keys": "8.57.2", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.56.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.56.0", "@typescript-eslint/types": "8.56.0", "@typescript-eslint/typescript-estree": "8.56.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.57.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.57.2", "@typescript-eslint/types": "8.57.2", "@typescript-eslint/typescript-estree": "8.57.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.56.0", "", { "dependencies": { "@typescript-eslint/types": "8.56.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.57.2", "", { "dependencies": { "@typescript-eslint/types": "8.57.2", "eslint-visitor-keys": "^5.0.0" } }, "sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw=="], - "@typespec/asset-emitter": ["@typespec/asset-emitter@0.79.0", "", { "peerDependencies": { "@typespec/compiler": "^1.9.0" } }, "sha512-pNMtfSSwgmTQ2ex6bd1l6BUW2RLjSFnWQO5C5bNSleV62YEH5jMLn3THWDU9oUB0JoiBjgomV8cPqNRTJ+iV9w=="], + "@typespec/asset-emitter": ["@typespec/asset-emitter@0.79.1", "", { "peerDependencies": { "@typespec/compiler": "^1.10.0" } }, "sha512-53s3GLu5BwNkl7Itr/OizfhymTV2u7k5/cwjUOAt03AUDfiKlwbsp+iCIsq1vccJuoDOiXOceJOfL8rAf4/9LQ=="], - "@typespec/compiler": ["@typespec/compiler@1.9.0", "", { "dependencies": { "@babel/code-frame": "~7.28.6", "@inquirer/prompts": "^8.0.1", "ajv": "~8.17.1", "change-case": "~5.4.4", "env-paths": "^3.0.0", "globby": "~16.1.0", "is-unicode-supported": "^2.1.0", "mustache": "~4.2.0", "picocolors": "~1.1.1", "prettier": "~3.8.0", "semver": "^7.7.1", "tar": "^7.5.2", "temporal-polyfill": "^0.3.0", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.12", "yaml": "~2.8.2", "yargs": "~18.0.0" }, "bin": { "tsp": "cmd/tsp.js", "tsp-server": "cmd/tsp-server.js" } }, "sha512-Rz9fFWQSTJSnhBfZvtA/bDIuO82fknYdtyMsL9lZNJE82rquC6JByHPFsnbGH1VXA0HhMj9L7Oqyp3f0m/BTOA=="], + "@typespec/compiler": ["@typespec/compiler@1.10.0", "", { "dependencies": { "@babel/code-frame": "~7.29.0", "@inquirer/prompts": "^8.0.1", "ajv": "~8.18.0", "change-case": "~5.4.4", "env-paths": "^4.0.0", "globby": "~16.1.0", "is-unicode-supported": "^2.1.0", "mustache": "~4.2.0", "picocolors": "~1.1.1", "prettier": "~3.8.0", "semver": "^7.7.1", "tar": "^7.5.2", "temporal-polyfill": "^0.3.0", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.12", "yaml": "~2.8.2", "yargs": "~18.0.0" }, "bin": { "tsp": "cmd/tsp.js", "tsp-server": "cmd/tsp-server.js" } }, "sha512-R6BATDkughntPpaxeESJF+wxma5PEjgmnnKvH0/ByqUH8VyhIckQWE9kkP0Uc/EJ0o0VYhe8qCwWQvV70k5lTw=="], - "@typespec/http": ["@typespec/http@1.9.0", "", { "peerDependencies": { "@typespec/compiler": "^1.9.0", "@typespec/streams": "^0.79.0" }, "optionalPeers": ["@typespec/streams"] }, "sha512-JzlZZsgCo71f2KhWbf4BLOz5e+dVLj7gJJ4kvXvrmuG9QHoT41VaGPpCQamYgpZLMz2LQbsOtw34AmpovhuJSw=="], + "@typespec/http": ["@typespec/http@1.10.0", "", { "peerDependencies": { "@typespec/compiler": "^1.10.0", "@typespec/streams": "^0.80.0" }, "optionalPeers": ["@typespec/streams"] }, "sha512-/fj55fmUj4m/FmNdfH0V52menVrmS2r5Xj9d1H+pnjQbxvvaxS906RSRcoF8kbg3PvlibP/Py5u82TAk53AyqA=="], - "@typespec/openapi": ["@typespec/openapi@1.9.0", "", { "peerDependencies": { "@typespec/compiler": "^1.9.0", "@typespec/http": "^1.9.0" } }, "sha512-5ieXCWRLcyFLv3IFk26ena/RW/NxvT5KiHaoNVFRd79J0XZjFcE0Od6Lxxqj4dWmCo3C8oKtOwFoQuie18G3lQ=="], + "@typespec/openapi": ["@typespec/openapi@1.10.0", "", { "peerDependencies": { "@typespec/compiler": "^1.10.0", "@typespec/http": "^1.10.0" } }, "sha512-tukmyp+c9CFlA2FdF61XfT9eTe5WXWz6J8pOrJ9+IYg0BcBwhJkvDj6BYpDD6SjxbRr1wO5ZL2Whe6MequsyVw=="], - "@typespec/openapi3": ["@typespec/openapi3@1.9.0", "", { "dependencies": { "@scalar/json-magic": "^0.9.1", "@scalar/openapi-parser": "^0.24.1", "@scalar/openapi-types": "^0.5.0", "@typespec/asset-emitter": "^0.79.0", "yaml": "~2.8.2" }, "peerDependencies": { "@typespec/compiler": "^1.9.0", "@typespec/events": "^0.79.0", "@typespec/http": "^1.9.0", "@typespec/json-schema": "^1.9.0", "@typespec/openapi": "^1.9.0", "@typespec/sse": "^0.79.0", "@typespec/streams": "^0.79.0", "@typespec/versioning": "^0.79.0" }, "optionalPeers": ["@typespec/events", "@typespec/json-schema", "@typespec/sse", "@typespec/streams", "@typespec/versioning"], "bin": { "tsp-openapi3": "cmd/tsp-openapi3.js" } }, "sha512-htwhrGHQxuoNwAljeJE8CBt5yfKOv48T9Ugv91Y+4yNnlevJfDT29yrfD2mXYMujVOr3Kte1qilazClafkUIgg=="], + "@typespec/openapi3": ["@typespec/openapi3@1.10.0", "", { "dependencies": { "@scalar/json-magic": "^0.11.5", "@scalar/openapi-parser": "^0.24.1", "@scalar/openapi-types": "^0.5.0", "@typespec/asset-emitter": "^0.79.1", "yaml": "~2.8.2" }, "peerDependencies": { "@typespec/compiler": "^1.10.0", "@typespec/events": "^0.80.0", "@typespec/http": "^1.10.0", "@typespec/json-schema": "^1.10.0", "@typespec/openapi": "^1.10.0", "@typespec/sse": "^0.80.0", "@typespec/streams": "^0.80.0", "@typespec/versioning": "^0.80.0" }, "optionalPeers": ["@typespec/events", "@typespec/json-schema", "@typespec/sse", "@typespec/streams", "@typespec/versioning"], "bin": { "tsp-openapi3": "cmd/tsp-openapi3.js" } }, "sha512-G2UTfsDuUprvhFIymHiLKly6FoA9UkRmTImqgmROP4JkKCdY/Mo6Xo03sufY8urywVjIWE3dryXpy5DjpOt9Eg=="], "@typespec/rest": ["@typespec/rest@0.77.0", "", { "peerDependencies": { "@typespec/compiler": "^1.7.0", "@typespec/http": "^1.7.0" } }, "sha512-DEUMD9zYqUVUhKCGktV7Z+sFkzj+bcSpJRhEXxOrJxupWM4I3N4deMop+ulxezxlLxIRUz7ELc+6WucYXgOnAA=="], @@ -1060,6 +1169,8 @@ "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="], + "@upsetjs/venn.js": ["@upsetjs/venn.js@2.0.0", "", { "optionalDependencies": { "d3-selection": "^3.0.0", "d3-transition": "^3.0.1" } }, "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw=="], + "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], "@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], @@ -1074,11 +1185,19 @@ "@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], - "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "acorn-walk": ["acorn-walk@8.3.5", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw=="], + + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], + + "ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], "ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="], @@ -1092,6 +1211,8 @@ "ansis": ["ansis@3.17.0", "", {}, "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg=="], + "arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="], + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], @@ -1102,6 +1223,8 @@ "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], @@ -1114,8 +1237,12 @@ "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + "assert": ["assert@2.1.0", "", { "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", "object-is": "^1.1.5", "object.assign": "^4.1.4", "util": "^0.12.5" } }, "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw=="], + "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], + "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="], "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], @@ -1126,26 +1253,36 @@ "async-retry": ["async-retry@1.3.3", "", { "dependencies": { "retry": "0.13.1" } }, "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="], + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], "axe-core": ["axe-core@4.11.1", "", {}, "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A=="], + "axios": ["axios@1.14.0", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } }, "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ=="], + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], - "balanced-match": ["balanced-match@4.0.2", "", { "dependencies": { "jackspeak": "^4.2.3" } }, "sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg=="], + "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.9.19", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.11", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-DAKrHphkJyiGuau/cFieRYhcTFeK/lBuD++C7cZ6KZHbMhBrisoi+EvhQ5RZrIfV5qwsW8kgQ07JIC+MDJRAhg=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="], - "brace-expansion": ["brace-expansion@5.0.2", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw=="], + "brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], + "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], + "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], "cacheable-lookup": ["cacheable-lookup@7.0.0", "", {}, "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w=="], @@ -1162,7 +1299,9 @@ "camel-case": ["camel-case@4.1.2", "", { "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw=="], - "caniuse-lite": ["caniuse-lite@1.0.30001770", "", {}, "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw=="], + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001781", "", {}, "sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw=="], "capital-case": ["capital-case@1.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A=="], @@ -1184,9 +1323,11 @@ "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="], + "charenc": ["charenc@0.0.2", "", {}, "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="], + "check-error": ["check-error@2.1.3", "", {}, "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA=="], - "chevrotain": ["chevrotain@11.0.3", "", { "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", "@chevrotain/regexp-to-ast": "11.0.3", "@chevrotain/types": "11.0.3", "@chevrotain/utils": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw=="], + "chevrotain": ["chevrotain@11.1.2", "", { "dependencies": { "@chevrotain/cst-dts-gen": "11.1.2", "@chevrotain/gast": "11.1.2", "@chevrotain/regexp-to-ast": "11.1.2", "@chevrotain/types": "11.1.2", "@chevrotain/utils": "11.1.2", "lodash-es": "4.17.23" } }, "sha512-opLQzEVriiH1uUQ4Kctsd49bRoFDXGGSC4GUqj7pGyxM3RehRhvTlZJc1FL/Flew2p5uwxa1tUDWKzI4wNM8pg=="], "chevrotain-allstar": ["chevrotain-allstar@0.3.1", "", { "dependencies": { "lodash-es": "^4.17.21" }, "peerDependencies": { "chevrotain": "^11.0.0" } }, "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw=="], @@ -1202,22 +1343,30 @@ "cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], + "code-block-writer": ["code-block-writer@13.0.3", "", {}, "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="], + "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], "commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="], + "comment-parser": ["comment-parser@1.4.5", "", {}, "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw=="], + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], "config-chain": ["config-chain@1.1.13", "", { "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ=="], + "console-table-printer": ["console-table-printer@2.15.0", "", { "dependencies": { "simple-wcswidth": "^1.1.2" } }, "sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw=="], + "constant-case": ["constant-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case": "^2.0.2" } }, "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ=="], "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], @@ -1226,8 +1375,12 @@ "cose-base": ["cose-base@1.0.3", "", { "dependencies": { "layout-base": "^1.0.0" } }, "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg=="], + "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="], + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + "crypt": ["crypt@0.0.2", "", {}, "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="], + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], "cytoscape": ["cytoscape@3.33.1", "", {}, "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ=="], @@ -1300,7 +1453,7 @@ "d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="], - "dagre-d3-es": ["dagre-d3-es@7.0.13", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q=="], + "dagre-d3-es": ["dagre-d3-es@7.0.14", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg=="], "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="], @@ -1310,10 +1463,12 @@ "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], - "dayjs": ["dayjs@1.11.19", "", {}, "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw=="], + "dayjs": ["dayjs@1.11.20", "", {}, "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], + "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], @@ -1322,13 +1477,17 @@ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], - "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="], + "delaunator": ["delaunator@5.1.0", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], @@ -1342,25 +1501,33 @@ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + "diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], - "dompurify": ["dompurify@3.3.1", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q=="], + "dompurify": ["dompurify@3.3.3", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA=="], "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], + "dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], + "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], - "electron-to-chromium": ["electron-to-chromium@1.5.286", "", {}, "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A=="], + "electron-to-chromium": ["electron-to-chromium@1.5.328", "", {}, "sha512-QNQ5l45DzYytThO21403XN3FvK0hOkWDG8viNf6jqS42msJ8I4tGDSpBCgvDRRPnkffafiwAym2X2eHeGD2V0w=="], "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], - "enhanced-resolve": ["enhanced-resolve@5.19.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg=="], + "enhanced-resolve": ["enhanced-resolve@5.20.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA=="], - "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], + "env-paths": ["env-paths@4.0.0", "", { "dependencies": { "is-safe-filename": "^0.1.0" } }, "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw=="], "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], @@ -1370,7 +1537,7 @@ "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - "es-iterator-helpers": ["es-iterator-helpers@1.2.2", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.1", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", "safe-array-concat": "^1.1.3" } }, "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w=="], + "es-iterator-helpers": ["es-iterator-helpers@1.3.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.1", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", "math-intrinsics": "^1.1.0", "safe-array-concat": "^1.1.3" } }, "sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ=="], "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], @@ -1386,18 +1553,22 @@ "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], - "esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], + "esbuild": ["esbuild@0.27.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.4", "@esbuild/android-arm": "0.27.4", "@esbuild/android-arm64": "0.27.4", "@esbuild/android-x64": "0.27.4", "@esbuild/darwin-arm64": "0.27.4", "@esbuild/darwin-x64": "0.27.4", "@esbuild/freebsd-arm64": "0.27.4", "@esbuild/freebsd-x64": "0.27.4", "@esbuild/linux-arm": "0.27.4", "@esbuild/linux-arm64": "0.27.4", "@esbuild/linux-ia32": "0.27.4", "@esbuild/linux-loong64": "0.27.4", "@esbuild/linux-mips64el": "0.27.4", "@esbuild/linux-ppc64": "0.27.4", "@esbuild/linux-riscv64": "0.27.4", "@esbuild/linux-s390x": "0.27.4", "@esbuild/linux-x64": "0.27.4", "@esbuild/netbsd-arm64": "0.27.4", "@esbuild/netbsd-x64": "0.27.4", "@esbuild/openbsd-arm64": "0.27.4", "@esbuild/openbsd-x64": "0.27.4", "@esbuild/openharmony-arm64": "0.27.4", "@esbuild/sunos-x64": "0.27.4", "@esbuild/win32-arm64": "0.27.4", "@esbuild/win32-ia32": "0.27.4", "@esbuild/win32-x64": "0.27.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw=="], + "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], - "eslint-config-next": ["eslint-config-next@16.1.6", "", { "dependencies": { "@next/eslint-plugin-next": "16.1.6", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^7.0.0", "globals": "16.4.0", "typescript-eslint": "^8.46.0" }, "peerDependencies": { "eslint": ">=9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-vKq40io2B0XtkkNDYyleATwblNt8xuh3FWp8SpSz3pt7P01OkBFlKsJZ2mWt5WsCySlDQLckb1zMY9yE9Qy0LA=="], + "eslint-config-next": ["eslint-config-next@16.2.1", "", { "dependencies": { "@next/eslint-plugin-next": "16.2.1", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^7.0.0", "globals": "16.4.0", "typescript-eslint": "^8.46.0" }, "peerDependencies": { "eslint": ">=9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-qhabwjQZ1Mk53XzXvmogf8KQ0tG0CQXF0CZ56+2/lVhmObgmaqj7x5A1DSrWdZd3kwI7GTPGUjFne+krRxYmFg=="], "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], + "eslint-config-riot": ["eslint-config-riot@1.0.0", "", {}, "sha512-NB/L/1Y30qyJcG5xZxCJKW/+bqyj+llbcCwo9DEz8bESIP0SLTOQ8T1DWCCFc+wJ61AMEstj4511PSScqMMfCw=="], + + "eslint-import-context": ["eslint-import-context@0.1.9", "", { "dependencies": { "get-tsconfig": "^4.10.1", "stable-hash-x": "^0.2.0" }, "peerDependencies": { "unrs-resolver": "^1.0.0" }, "optionalPeers": ["unrs-resolver"] }, "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg=="], + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.10.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.13", "unrs-resolver": "^1.6.2" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ=="], @@ -1406,8 +1577,12 @@ "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="], + "eslint-plugin-import-x": ["eslint-plugin-import-x@4.16.2", "", { "dependencies": { "@package-json/types": "^0.0.12", "@typescript-eslint/types": "^8.56.0", "comment-parser": "^1.4.1", "debug": "^4.4.1", "eslint-import-context": "^0.1.9", "is-glob": "^4.0.3", "minimatch": "^9.0.3 || ^10.1.2", "semver": "^7.7.2", "stable-hash-x": "^0.2.0", "unrs-resolver": "^1.9.2" }, "peerDependencies": { "@typescript-eslint/utils": "^8.56.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "eslint-import-resolver-node": "*" }, "optionalPeers": ["@typescript-eslint/utils", "eslint-import-resolver-node"] }, "sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw=="], + "eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="], + "eslint-plugin-n8n-nodes-base": ["eslint-plugin-n8n-nodes-base@1.16.5", "", { "dependencies": { "@typescript-eslint/utils": "^6.21.0", "camel-case": "^4.1.2", "indefinite": "^2.5.1", "pascal-case": "^3.1.2", "pluralize": "^8.0.0", "sentence-case": "^3.0.4", "title-case": "^3.0.3" } }, "sha512-/Bx2xj1ZzwEN+KQmnf7i0QRzgNMuphythQI2qXHoJQd8nm6aJGC9ZyVmDBFkM9P1ZfVBgBK7bDdjNxcbIK8Hgw=="], + "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.0.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA=="], @@ -1420,6 +1595,8 @@ "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + "esprima-next": ["esprima-next@5.8.4", "", { "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" } }, "sha512-8nYVZ4ioIH4Msjb/XmhnBdz5WRRBaYqevKa1cv9nGJdCehMbzZCPNEEnqfLCZVetUVrUPEcb5IYyu1GG4hFqgg=="], + "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], @@ -1442,6 +1619,10 @@ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], @@ -1464,9 +1645,9 @@ "fast-wrap-ansi": ["fast-wrap-ansi@0.2.0", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w=="], - "fast-xml-builder": ["fast-xml-builder@1.0.0", "", {}, "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ=="], + "fast-xml-builder": ["fast-xml-builder@1.1.4", "", { "dependencies": { "path-expression-matcher": "^1.1.3" } }, "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg=="], - "fast-xml-parser": ["fast-xml-parser@5.4.1", "", { "dependencies": { "fast-xml-builder": "^1.0.0", "strnum": "^2.1.2" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A=="], + "fast-xml-parser": ["fast-xml-parser@5.5.8", "", { "dependencies": { "fast-xml-builder": "^1.1.4", "path-expression-matcher": "^1.2.0", "strnum": "^2.2.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ=="], "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="], @@ -1478,6 +1659,8 @@ "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + "file-type": ["file-type@21.3.4", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g=="], + "filelist": ["filelist@1.0.6", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], @@ -1486,18 +1669,28 @@ "find-yarn-workspace-root": ["find-yarn-workspace-root@2.0.0", "", { "dependencies": { "micromatch": "^4.0.2" } }, "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ=="], + "flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="], + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="], "flexsearch": ["flexsearch@0.7.43", "", {}, "sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg=="], + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + "form-data-encoder": ["form-data-encoder@2.1.4", "", {}, "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw=="], "formatly": ["formatly@0.3.0", "", { "dependencies": { "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w=="], + "formdata-node": ["formdata-node@4.4.1", "", { "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" } }, "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ=="], + "fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], @@ -1530,19 +1723,21 @@ "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], - "get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="], + "get-tsconfig": ["get-tsconfig@4.13.7", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q=="], "git-hooks-list": ["git-hooks-list@3.2.0", "", {}, "sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ=="], "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], + "glob": ["glob@11.1.0", "", { "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw=="], + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], "globals": ["globals@16.4.0", "", {}, "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw=="], "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], - "globby": ["globby@16.1.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "fast-glob": "^3.3.3", "ignore": "^7.0.5", "is-path-inside": "^4.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.4.0" } }, "sha512-+A4Hq7m7Ze592k9gZRy4gJ27DrXRNnC1vPjxTt1qQxEY8RxagBkBxivkCwg7FxSTG0iLLEMaUx13oOr0R2/qcQ=="], + "globby": ["globby@16.1.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "fast-glob": "^3.3.3", "ignore": "^7.0.5", "is-path-inside": "^4.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.4.0" } }, "sha512-dW7vl+yiAJSp6aCekaVnVJxurRv7DCOLyXqEG3RYMYUg7AuJ2jCqPkZTA8ooqC2vtnkaMcV5WfFBMuEnTu1OQg=="], "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], @@ -1556,6 +1751,8 @@ "hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="], + "handlebars": ["handlebars@4.7.8", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="], + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -1594,28 +1791,42 @@ "http2-wrapper": ["http2-wrapper@2.2.1", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" } }, "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ=="], + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], + + "ibm-cloud-sdk-core": ["ibm-cloud-sdk-core@5.4.9", "", { "dependencies": { "@types/debug": "^4.1.12", "@types/node": "^18.19.80", "@types/tough-cookie": "^4.0.0", "axios": "^1.13.5", "camelcase": "^6.3.0", "debug": "^4.3.4", "dotenv": "^16.4.5", "extend": "3.0.2", "file-type": "^21.3.2", "form-data": "^4.0.4", "isstream": "0.1.2", "jsonwebtoken": "^9.0.3", "load-esm": "^1.0.3", "mime-types": "2.1.35", "retry-axios": "^2.6.0", "tough-cookie": "^4.1.3" } }, "sha512-340fGcZEwUBdxBOPmn8V8fIiFRWF92yFqSFRNLwPQz4h+PS4jcAyd3JGqU6CpFqzUTt+PatVX/jHFwzUTVdmxQ=="], + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + "indefinite": ["indefinite@2.5.2", "", {}, "sha512-J3ELLIk835hmgDMUfNltTCrHz9+CteTnSuXJqvxZT18wo1U2M9/QeeJMw99QdZwPEEr1DE2aBYda101Ojjdw5g=="], + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], - "internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], + "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], @@ -1626,6 +1837,8 @@ "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + "is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="], + "is-bun-module": ["is-bun-module@2.0.0", "", { "dependencies": { "semver": "^7.7.1" } }, "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ=="], "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], @@ -1656,8 +1869,12 @@ "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + "is-nan": ["is-nan@1.3.2", "", { "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w=="], + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], + "is-network-error": ["is-network-error@1.3.1", "", {}, "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw=="], + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], @@ -1670,6 +1887,8 @@ "is-retry-allowed": ["is-retry-allowed@1.2.0", "", {}, "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="], + "is-safe-filename": ["is-safe-filename@0.1.1", "", {}, "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g=="], + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], @@ -1696,6 +1915,10 @@ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "isolated-vm": ["isolated-vm@6.1.2", "", { "dependencies": { "node-gyp-build": "^4.8.4" } }, "sha512-GGfsHqtlZiiurZaxB/3kY7LLAXR3sgzDul0fom4cSyBjx6ZbjpTrFWiH3z/nUfLJGJ8PIq9LQmQFiAxu24+I7A=="], + + "isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="], + "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], "jackspeak": ["jackspeak@4.2.3", "", { "dependencies": { "@isaacs/cliui": "^9.0.0" } }, "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg=="], @@ -1704,6 +1927,12 @@ "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + "jmespath": ["jmespath@0.16.0", "", {}, "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw=="], + + "js-base64": ["js-base64@3.7.2", "", {}, "sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ=="], + + "js-tiktoken": ["js-tiktoken@1.0.12", "", { "dependencies": { "base64-js": "^1.5.1" } }, "sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ=="], + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], @@ -1724,9 +1953,19 @@ "jsonpointer": ["jsonpointer@5.0.1", "", {}, "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ=="], + "jsonrepair": ["jsonrepair@3.13.2", "", { "bin": { "jsonrepair": "bin/cli.js" } }, "sha512-Leuly0nbM4R+S5SVJk3VHfw1oxnlEK9KygdZvfUtEtTawNDyzB4qa1xWTmFt1aeoA7sXZkVTRuIixJ8bAvqVUg=="], + + "jsonwebtoken": ["jsonwebtoken@9.0.3", "", { "dependencies": { "jws": "^4.0.1", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g=="], + + "jssha": ["jssha@3.3.1", "", {}, "sha512-VCMZj12FCFMQYcFLPRm/0lOBbLi8uM2BhXPTqw3U4YAfs4AZfiApOoBLoN8cQE60Z50m1MYMTQVCfgF/KaCVhQ=="], + "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], - "katex": ["katex@0.16.28", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg=="], + "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="], + + "jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="], + + "katex": ["katex@0.16.44", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-EkxoDTk8ufHqHlf9QxGwcxeLkWRR3iOuYfRpfORgYfqc8s13bgb+YtRY59NK5ZpRaCwq1kqA6a5lpX8C/eLphQ=="], "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], @@ -1734,9 +1973,15 @@ "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], - "knip": ["knip@5.83.1", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "jiti": "^2.6.0", "js-yaml": "^4.1.1", "minimist": "^1.2.8", "oxc-resolver": "^11.15.0", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", "strip-json-comments": "5.0.3", "zod": "^4.1.11" }, "peerDependencies": { "@types/node": ">=18", "typescript": ">=5.0.4 <7" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-av3ZG/Nui6S/BNL8Tmj12yGxYfTnwWnslouW97m40him7o8MwiMjZBY9TPvlEWUci45aVId0/HbgTwSKIDGpMw=="], + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "knip": ["knip@5.88.1", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "jiti": "^2.6.0", "minimist": "^1.2.8", "oxc-resolver": "^11.19.1", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", "strip-json-comments": "5.0.3", "unbash": "^2.2.0", "yaml": "^2.8.2", "zod": "^4.1.11" }, "peerDependencies": { "@types/node": ">=18", "typescript": ">=5.0.4 <7" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-tpy5o7zu1MjawVkLPuahymVJekYY3kYjvzcoInhIchgePxTlo+api90tBv2KfhAIe5uXh+mez1tAfmbv8/TiZg=="], - "langium": ["langium@3.3.1", "", { "dependencies": { "chevrotain": "~11.0.3", "chevrotain-allstar": "~0.3.0", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.0.8" } }, "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w=="], + "langchain": ["langchain@1.2.30", "", { "dependencies": { "@langchain/langgraph": "^1.1.2", "@langchain/langgraph-checkpoint": "^1.0.0", "langsmith": ">=0.5.0 <1.0.0", "uuid": "^11.1.0", "zod": "^3.25.76 || ^4" }, "peerDependencies": { "@langchain/core": "^1.1.31" } }, "sha512-Ofsk7LTGvIkyy3uesv7hpyerpTghdjNpYFJfIxJRGGLjd+4JgTVkT/Ax6Cjg0F6doEuO7VRID0NK2QwmT3A/bg=="], + + "langium": ["langium@4.2.1", "", { "dependencies": { "chevrotain": "~11.1.1", "chevrotain-allstar": "~0.3.1", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.1.0" } }, "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ=="], + + "langsmith": ["langsmith@0.3.87", "", { "dependencies": { "@types/uuid": "^10.0.0", "chalk": "^4.1.2", "console-table-printer": "^2.12.1", "p-queue": "^6.6.2", "semver": "^7.6.3", "uuid": "^10.0.0" }, "peerDependencies": { "@opentelemetry/api": "*", "@opentelemetry/exporter-trace-otlp-proto": "*", "@opentelemetry/sdk-trace-base": "*", "openai": "*" }, "optionalPeers": ["@opentelemetry/api", "@opentelemetry/exporter-trace-otlp-proto", "@opentelemetry/sdk-trace-base", "openai"] }, "sha512-XXR1+9INH8YX96FKWc5tie0QixWz6tOqAsAKfcJyPkE0xPep+NDz0IQLR32q4bn10QK3LqD2HN6T3n6z1YLW7Q=="], "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="], @@ -1748,33 +1993,35 @@ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], - "lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="], + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], - "lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="], + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], - "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA=="], + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], - "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ=="], + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], - "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA=="], + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], - "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.2", "", { "os": "linux", "cpu": "arm" }, "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA=="], + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], - "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A=="], + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], - "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA=="], + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], - "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w=="], + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], - "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA=="], + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], - "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ=="], + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], - "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="], + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], - "liquidjs": ["liquidjs@10.25.1", "", { "dependencies": { "commander": "^10.0.0" }, "bin": { "liquidjs": "bin/liquid.js", "liquid": "bin/liquid.js" } }, "sha512-D+jsJvkGigFn8qNUgh8U6XNHhGFBp+p8Dk26ea/Hl+XrjFVSg9OXlN31hGAfS3MYQ3Kr8Xi9sEVBVQa/VTVSmg=="], + "liquidjs": ["liquidjs@10.25.2", "", { "dependencies": { "commander": "^10.0.0" }, "bin": { "liquidjs": "bin/liquid.js", "liquid": "bin/liquid.js" } }, "sha512-ZbgcjEjGNlAIjqhuMzymO3lCpHgmVMftKfrq4/YLLxmKaFFeQMXRGrJTqKX7OXX1hKVPUDpTIrvL7lxt3X/hmw=="], + + "load-esm": ["load-esm@1.0.3", "", {}, "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA=="], "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], @@ -1782,8 +2029,22 @@ "lodash-es": ["lodash-es@4.17.23", "", {}, "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg=="], + "lodash.includes": ["lodash.includes@4.3.0", "", {}, "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="], + + "lodash.isboolean": ["lodash.isboolean@3.0.3", "", {}, "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="], + + "lodash.isinteger": ["lodash.isinteger@4.0.4", "", {}, "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="], + + "lodash.isnumber": ["lodash.isnumber@3.0.3", "", {}, "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="], + + "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="], + + "lodash.isstring": ["lodash.isstring@4.0.1", "", {}, "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "lodash.once": ["lodash.once@4.1.1", "", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="], + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], @@ -1798,19 +2059,27 @@ "lucide-react": ["lucide-react@0.469.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw=="], + "luxon": ["luxon@3.7.2", "", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="], + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], "marked": ["marked@16.4.2", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA=="], + "math-expression-evaluator": ["math-expression-evaluator@2.0.7", "", {}, "sha512-uwliJZ6BPHRq4eiqNWxZBDzKUiS5RIynFFcgchqhBOloVLVBpZpNG8jRYkedLcBvhph8TnRyWEuxPqiQcwIdog=="], + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + "md5": ["md5@2.3.0", "", { "dependencies": { "charenc": "0.0.2", "crypt": "0.0.2", "is-buffer": "~1.1.6" } }, "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g=="], + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], - "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], @@ -1842,7 +2111,7 @@ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], - "mermaid": ["mermaid@11.12.2", "", { "dependencies": { "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.1", "@mermaid-js/parser": "^0.6.3", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.13", "dayjs": "^1.11.18", "dompurify": "^3.2.5", "katex": "^0.16.22", "khroma": "^2.1.0", "lodash-es": "^4.17.21", "marked": "^16.2.1", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0" } }, "sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w=="], + "mermaid": ["mermaid@11.13.0", "", { "dependencies": { "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.2", "@mermaid-js/parser": "^1.0.1", "@types/d3": "^7.4.3", "@upsetjs/venn.js": "^2.0.0", "cytoscape": "^3.33.1", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.14", "dayjs": "^1.11.19", "dompurify": "^3.3.1", "katex": "^0.16.25", "khroma": "^2.1.0", "lodash-es": "^4.17.23", "marked": "^16.3.0", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0" } }, "sha512-fEnci+Immw6lKMFI8sqzjlATTyjLkRa6axrEgLV2yHTfv8r+h1wjFbV6xeRtd4rUV1cS4EpR9rwp3Rci7TRWDw=="], "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], @@ -1916,17 +2185,21 @@ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + "mimic-response": ["mimic-response@4.0.0", "", {}, "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="], "minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], - "mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="], + "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -1934,19 +2207,33 @@ "mute-stream": ["mute-stream@1.0.0", "", {}, "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA=="], + "n8n-nodes-pachca": ["n8n-nodes-pachca@workspace:integrations/n8n"], + + "n8n-workflow": ["n8n-workflow@2.13.1", "", { "dependencies": { "@n8n/errors": "0.6.0", "@n8n/expression-runtime": "0.5.0", "@n8n/tournament": "1.0.6", "ast-types": "0.16.1", "callsites": "3.1.0", "esprima-next": "5.8.4", "form-data": "4.0.4", "jmespath": "0.16.0", "js-base64": "3.7.2", "jsonrepair": "3.13.2", "jssha": "3.3.1", "lodash": "4.17.23", "luxon": "3.7.2", "md5": "2.3.0", "recast": "0.22.0", "title-case": "3.0.3", "transliteration": "2.3.5", "uuid": "10.0.0", "xml2js": "0.6.2", "zod": "3.25.67" } }, "sha512-79qJU7aIwtzZY1bhYhFwjLs83yu4Cb+ZFC7+hjN9N+9+mRV0CObHTR9tg5/EwD1HURfztwdCK+N/dlfjO8xDlw=="], + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], "napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], + "next": ["next@16.0.10", "", { "dependencies": { "@next/env": "16.0.10", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.0.10", "@next/swc-darwin-x64": "16.0.10", "@next/swc-linux-arm64-gnu": "16.0.10", "@next/swc-linux-arm64-musl": "16.0.10", "@next/swc-linux-x64-gnu": "16.0.10", "@next/swc-linux-x64-musl": "16.0.10", "@next/swc-win32-arm64-msvc": "16.0.10", "@next/swc-win32-x64-msvc": "16.0.10", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA=="], "next-mdx-remote": ["next-mdx-remote@5.0.0", "", { "dependencies": { "@babel/code-frame": "^7.23.5", "@mdx-js/mdx": "^3.0.1", "@mdx-js/react": "^3.0.1", "unist-util-remove": "^3.1.0", "vfile": "^6.0.1", "vfile-matter": "^5.0.0" }, "peerDependencies": { "react": ">=16" } }, "sha512-RNNbqRpK9/dcIFZs/esQhuLA8jANqlH694yqoDBK8hkVdJUndzzGmnPHa2nyi90N4Z9VmzuSWNRpr5ItT3M7xQ=="], "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], - "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], + + "node-exports-info": ["node-exports-info@1.6.0", "", { "dependencies": { "array.prototype.flatmap": "^1.3.3", "es-errors": "^1.3.0", "object.entries": "^1.1.9", "semver": "^6.3.1" } }, "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + + "node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="], "normalize-package-data": ["normalize-package-data@6.0.2", "", { "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g=="], @@ -1956,6 +2243,8 @@ "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + "object-is": ["object-is@1.1.6", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" } }, "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q=="], + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], @@ -1968,22 +2257,36 @@ "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], - "oclif": ["oclif@4.22.81", "", { "dependencies": { "@aws-sdk/client-cloudfront": "^3.995.0", "@aws-sdk/client-s3": "^3.995.0", "@inquirer/confirm": "^3.1.22", "@inquirer/input": "^2.2.4", "@inquirer/select": "^2.5.0", "@oclif/core": "^4.8.0", "@oclif/plugin-help": "^6.2.37", "@oclif/plugin-not-found": "^3.2.74", "@oclif/plugin-warn-if-update-available": "^3.1.55", "ansis": "^3.16.0", "async-retry": "^1.3.3", "change-case": "^4", "debug": "^4.4.0", "ejs": "^3.1.10", "find-yarn-workspace-root": "^2.0.0", "fs-extra": "^8.1", "github-slugger": "^2", "got": "^13", "lodash": "^4.17.23", "normalize-package-data": "^6", "semver": "^7.7.4", "sort-package-json": "^2.15.1", "tiny-jsonc": "^1.0.2", "validate-npm-package-name": "^5.0.1" }, "bin": { "oclif": "bin/run.js" } }, "sha512-MO2bupt/3wWYqt05F8ZLwMYKN58YqDfRVdJxAvCdg/wZJg6/sDXVKoMSTSzwqsnIaJGjru2LBNvk8lH+p+1uMQ=="], + "oclif": ["oclif@4.22.96", "", { "dependencies": { "@aws-sdk/client-cloudfront": "3.1009.0", "@aws-sdk/client-s3": "3.1014.0", "@inquirer/confirm": "^3.1.22", "@inquirer/input": "^2.2.4", "@inquirer/select": "^2.5.0", "@oclif/core": "4.9.0", "@oclif/plugin-help": "^6.2.38", "@oclif/plugin-not-found": "^3.2.76", "@oclif/plugin-warn-if-update-available": "^3.1.57", "ansis": "^3.16.0", "async-retry": "^1.3.3", "change-case": "^4", "debug": "^4.4.0", "ejs": "^3.1.10", "find-yarn-workspace-root": "^2.0.0", "fs-extra": "^8.1", "github-slugger": "^2", "got": "^13", "lodash": "^4.17.23", "normalize-package-data": "^6", "semver": "^7.7.4", "sort-package-json": "^2.15.1", "tiny-jsonc": "^1.0.2", "validate-npm-package-name": "^5.0.1" }, "bin": { "oclif": "bin/run.js" } }, "sha512-aWM9cMb7Q3KW09qi5Mkw0Hq9sIM7DjVlyMAUl8Q2FP3+e5afBlUU9vmL3EJazVPhqcbg5u18E3z+6kCMk72KYw=="], "oniguruma-to-es": ["oniguruma-to-es@2.3.0", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^5.1.1", "regex-recursion": "^5.1.1" } }, "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g=="], + "openai": ["openai@6.33.0", "", { "peerDependencies": { "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-xAYN1W3YsDXJWA5F277135YfkEk6H7D3D6vWwRhJ3OEkzRgcyK8z/P5P9Gyi/wB4N8kK9kM5ZjprfvyHagKmpw=="], + + "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], - "oxc-resolver": ["oxc-resolver@11.17.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.17.1", "@oxc-resolver/binding-android-arm64": "11.17.1", "@oxc-resolver/binding-darwin-arm64": "11.17.1", "@oxc-resolver/binding-darwin-x64": "11.17.1", "@oxc-resolver/binding-freebsd-x64": "11.17.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.17.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.17.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.17.1", "@oxc-resolver/binding-linux-arm64-musl": "11.17.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.17.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.17.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.17.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.17.1", "@oxc-resolver/binding-linux-x64-gnu": "11.17.1", "@oxc-resolver/binding-linux-x64-musl": "11.17.1", "@oxc-resolver/binding-openharmony-arm64": "11.17.1", "@oxc-resolver/binding-wasm32-wasi": "11.17.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.17.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.17.1", "@oxc-resolver/binding-win32-x64-msvc": "11.17.1" } }, "sha512-pyRXK9kH81zKlirHufkFhOFBZRks8iAMLwPH8gU7lvKFiuzUH9L8MxDEllazwOb8fjXMcWjY1PMDfMJ2/yh5cw=="], + "oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="], "p-cancelable": ["p-cancelable@3.0.0", "", {}, "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="], + "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + "p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="], + + "p-retry": ["p-retry@7.1.1", "", { "dependencies": { "is-network-error": "^1.1.0" } }, "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w=="], + + "p-timeout": ["p-timeout@3.2.0", "", { "dependencies": { "p-finally": "^1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], "param-case": ["param-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="], @@ -1996,46 +2299,68 @@ "pascal-case": ["pascal-case@3.1.2", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="], + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + "path-case": ["path-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg=="], "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="], "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + "path-expression-matcher": ["path-expression-matcher@1.2.0", "", {}, "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ=="], + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "pathval": ["pathval@2.0.1", "", {}, "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + "playwright": ["playwright@1.58.2", "", { "dependencies": { "playwright-core": "1.58.2" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A=="], + + "playwright-core": ["playwright-core@1.58.2", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg=="], + + "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], + "points-on-curve": ["points-on-curve@0.2.0", "", {}, "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A=="], "points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="], "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="], "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], "proto-list": ["proto-list@1.2.4", "", {}, "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA=="], + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + "querystringify": ["querystringify@2.2.0", "", {}, "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="], + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], @@ -2052,6 +2377,8 @@ "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + "recast": ["recast@0.22.0", "", { "dependencies": { "assert": "^2.0.0", "ast-types": "0.15.2", "esprima": "~4.0.0", "source-map": "~0.6.1", "tslib": "^2.0.1" } }, "sha512-5AAx+mujtXijsEavc5lWXBPQqrM4+Dl5qNH96N2aNeuJFUzpiiToKPsxQD/zAIJHspz7zz0maX0PCtCTFVlixQ=="], + "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], @@ -2060,6 +2387,8 @@ "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], + "reflect-metadata": ["reflect-metadata@0.2.2", "", {}, "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q=="], + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], "regex": ["regex@5.1.1", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw=="], @@ -2084,8 +2413,12 @@ "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="], + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], @@ -2098,11 +2431,15 @@ "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], + "retry-axios": ["retry-axios@2.6.0", "", { "peerDependencies": { "axios": "*" } }, "sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ=="], + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], + "rimraf": ["rimraf@6.0.1", "", { "dependencies": { "glob": "^11.0.0", "package-json-from-dist": "^1.0.0" }, "bin": { "rimraf": "dist/esm/bin.mjs" } }, "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A=="], + + "robust-predicates": ["robust-predicates@3.0.3", "", {}, "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA=="], - "rollup": ["rollup@4.59.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.59.0", "@rollup/rollup-android-arm64": "4.59.0", "@rollup/rollup-darwin-arm64": "4.59.0", "@rollup/rollup-darwin-x64": "4.59.0", "@rollup/rollup-freebsd-arm64": "4.59.0", "@rollup/rollup-freebsd-x64": "4.59.0", "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", "@rollup/rollup-linux-arm-musleabihf": "4.59.0", "@rollup/rollup-linux-arm64-gnu": "4.59.0", "@rollup/rollup-linux-arm64-musl": "4.59.0", "@rollup/rollup-linux-loong64-gnu": "4.59.0", "@rollup/rollup-linux-loong64-musl": "4.59.0", "@rollup/rollup-linux-ppc64-gnu": "4.59.0", "@rollup/rollup-linux-ppc64-musl": "4.59.0", "@rollup/rollup-linux-riscv64-gnu": "4.59.0", "@rollup/rollup-linux-riscv64-musl": "4.59.0", "@rollup/rollup-linux-s390x-gnu": "4.59.0", "@rollup/rollup-linux-x64-gnu": "4.59.0", "@rollup/rollup-linux-x64-musl": "4.59.0", "@rollup/rollup-openbsd-x64": "4.59.0", "@rollup/rollup-openharmony-arm64": "4.59.0", "@rollup/rollup-win32-arm64-msvc": "4.59.0", "@rollup/rollup-win32-ia32-msvc": "4.59.0", "@rollup/rollup-win32-x64-gnu": "4.59.0", "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg=="], + "rollup": ["rollup@4.60.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.0", "@rollup/rollup-android-arm64": "4.60.0", "@rollup/rollup-darwin-arm64": "4.60.0", "@rollup/rollup-darwin-x64": "4.60.0", "@rollup/rollup-freebsd-arm64": "4.60.0", "@rollup/rollup-freebsd-x64": "4.60.0", "@rollup/rollup-linux-arm-gnueabihf": "4.60.0", "@rollup/rollup-linux-arm-musleabihf": "4.60.0", "@rollup/rollup-linux-arm64-gnu": "4.60.0", "@rollup/rollup-linux-arm64-musl": "4.60.0", "@rollup/rollup-linux-loong64-gnu": "4.60.0", "@rollup/rollup-linux-loong64-musl": "4.60.0", "@rollup/rollup-linux-ppc64-gnu": "4.60.0", "@rollup/rollup-linux-ppc64-musl": "4.60.0", "@rollup/rollup-linux-riscv64-gnu": "4.60.0", "@rollup/rollup-linux-riscv64-musl": "4.60.0", "@rollup/rollup-linux-s390x-gnu": "4.60.0", "@rollup/rollup-linux-x64-gnu": "4.60.0", "@rollup/rollup-linux-x64-musl": "4.60.0", "@rollup/rollup-openbsd-x64": "4.60.0", "@rollup/rollup-openharmony-arm64": "4.60.0", "@rollup/rollup-win32-arm64-msvc": "4.60.0", "@rollup/rollup-win32-ia32-msvc": "4.60.0", "@rollup/rollup-win32-x64-gnu": "4.60.0", "@rollup/rollup-win32-x64-msvc": "4.60.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ=="], "roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="], @@ -2120,6 +2457,8 @@ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], @@ -2154,11 +2493,13 @@ "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "simple-wcswidth": ["simple-wcswidth@1.1.2", "", {}, "sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw=="], + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], "slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="], - "smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="], + "smol-toml": ["smol-toml@1.6.1", "", {}, "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg=="], "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="], @@ -2184,6 +2525,8 @@ "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="], + "stable-hash-x": ["stable-hash-x@0.2.0", "", {}, "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ=="], + "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], @@ -2206,7 +2549,7 @@ "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], - "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], @@ -2216,7 +2559,9 @@ "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="], - "strnum": ["strnum@2.2.0", "", {}, "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg=="], + "strnum": ["strnum@2.2.2", "", {}, "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA=="], + + "strtok3": ["strtok3@10.3.5", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA=="], "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], @@ -2230,15 +2575,15 @@ "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - "tailwindcss": ["tailwindcss@4.1.18", "", {}, "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw=="], + "tailwindcss": ["tailwindcss@4.2.2", "", {}, "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q=="], - "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], + "tapable": ["tapable@2.3.2", "", {}, "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA=="], - "tar": ["tar@7.5.9", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg=="], + "tar": ["tar@7.5.13", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng=="], - "temporal-polyfill": ["temporal-polyfill@0.3.0", "", { "dependencies": { "temporal-spec": "0.3.0" } }, "sha512-qNsTkX9K8hi+FHDfHmf22e/OGuXmfBm9RqNismxBrnSmZVJKegQ+HYYXT+R7Ha8F/YSm2Y34vmzD4cxMu2u95g=="], + "temporal-polyfill": ["temporal-polyfill@0.3.2", "", { "dependencies": { "temporal-spec": "0.3.1" } }, "sha512-TzHthD/heRK947GNiSu3Y5gSPpeUDH34+LESnfsq8bqpFhsB79HFBX8+Z834IVX68P3EUyRPZK5bL/1fh437Eg=="], - "temporal-spec": ["temporal-spec@0.3.0", "", {}, "sha512-n+noVpIqz4hYgFSMOSiINNOUOMFtV5cZQNCmmszA6GiVFVRt3G7AqVyhXjhCSmowvQn+NsGn+jMDMKJYHd3bSQ=="], + "temporal-spec": ["temporal-spec@0.3.1", "", {}, "sha512-B4TUhezh9knfSIMwt7RVggApDRJZo73uZdj8AacL2mZ8RP5KtLianh2MXxL06GN9ESYiIsiuoLQhgVfwe55Yhw=="], "tiny-jsonc": ["tiny-jsonc@1.0.2", "", {}, "sha512-f5QDAfLq6zIVSyCZQZhhyl0QS6MvAyTxgz4X4x3+EoCktNWEYJ6PeoEA97fyb98njpBNNi88ybpD7m+BDFXaCw=="], @@ -2254,16 +2599,34 @@ "tinyspy": ["tinyspy@4.0.4", "", {}, "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q=="], + "title-case": ["title-case@3.0.3", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA=="], + + "tmp": ["tmp@0.2.5", "", {}, "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow=="], + + "tmp-promise": ["tmp-promise@3.0.3", "", { "dependencies": { "tmp": "^0.2.0" } }, "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ=="], + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + "token-types": ["token-types@6.1.2", "", { "dependencies": { "@borewit/text-codec": "^0.2.1", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww=="], + + "tough-cookie": ["tough-cookie@4.1.4", "", { "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" } }, "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "transliteration": ["transliteration@2.3.5", "", { "dependencies": { "yargs": "^17.5.1" }, "bin": { "slugify": "dist/bin/slugify", "transliterate": "dist/bin/transliterate" } }, "sha512-HAGI4Lq4Q9dZ3Utu2phaWgtm3vB6PkLUFqWAScg/UW+1eZ/Tg6Exo4oC0/3VUol/w4BlefLhUUSVBr/9/ZGQOw=="], + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], - "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="], + "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], + "ts-morph": ["ts-morph@27.0.2", "", { "dependencies": { "@ts-morph/common": "~0.28.1", "code-block-writer": "^13.0.3" } }, "sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w=="], + + "ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="], + "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -2272,19 +2635,7 @@ "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], - "turbo": ["turbo@2.8.9", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.9", "turbo-darwin-arm64": "2.8.9", "turbo-linux-64": "2.8.9", "turbo-linux-arm64": "2.8.9", "turbo-windows-64": "2.8.9", "turbo-windows-arm64": "2.8.9" }, "bin": { "turbo": "bin/turbo" } }, "sha512-G+Mq8VVQAlpz/0HTsxiNNk/xywaHGl+dk1oiBREgOEVCCDjXInDlONWUn5srRnC9s5tdHTFD1bx1N19eR4hI+g=="], - - "turbo-darwin-64": ["turbo-darwin-64@2.8.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-KnCw1ZI9KTnEAhdI9avZrnZ/z4wsM++flMA1w8s8PKOqi5daGpFV36qoPafg4S8TmYMe52JPWEoFr0L+lQ5JIw=="], - - "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-CbD5Y2NKJKBXTOZ7z7Cc7vGlFPZkYjApA7ri9lH4iFwKV1X7MoZswh9gyRLetXYWImVX1BqIvP8KftulJg/wIA=="], - - "turbo-linux-64": ["turbo-linux-64@2.8.9", "", { "os": "linux", "cpu": "x64" }, "sha512-OXC9HdCtsHvyH+5KUoH8ds+p5WU13vdif0OPbsFzZca4cUXMwKA3HWwUuCgQetk0iAE4cscXpi/t8A263n3VTg=="], - - "turbo-linux-arm64": ["turbo-linux-arm64@2.8.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-yI5n8jNXiFA6+CxnXG0gO7h5ZF1+19K8uO3/kXPQmyl37AdiA7ehKJQOvf9OPAnmkGDHcF2HSCPltabERNRmug=="], - - "turbo-windows-64": ["turbo-windows-64@2.8.9", "", { "os": "win32", "cpu": "x64" }, "sha512-/OztzeGftJAg258M/9vK2ZCkUKUzqrWXJIikiD2pm8TlqHcIYUmepDbyZSDfOiUjMy6NzrLFahpNLnY7b5vNgg=="], - - "turbo-windows-arm64": ["turbo-windows-arm64@2.8.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-xZ2VTwVTjIqpFZKN4UBxDHCPM3oJ2J5cpRzCBSmRpJ/Pn33wpiYjs+9FB2E03svKaD04/lSSLlEUej0UYsugfg=="], + "turbo": ["turbo@2.8.20", "", { "optionalDependencies": { "@turbo/darwin-64": "2.8.20", "@turbo/darwin-arm64": "2.8.20", "@turbo/linux-64": "2.8.20", "@turbo/linux-arm64": "2.8.20", "@turbo/windows-64": "2.8.20", "@turbo/windows-arm64": "2.8.20" }, "bin": { "turbo": "bin/turbo" } }, "sha512-Rb4qk5YT8RUwwdXtkLpkVhNEe/lor6+WV7S5tTlLpxSz6MjV5Qi8jGNn4gS6NAvrYGA/rNrE6YUQM85sCZUDbQ=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], @@ -2300,12 +2651,20 @@ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "typescript-eslint": ["typescript-eslint@8.56.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.56.0", "@typescript-eslint/parser": "8.56.0", "@typescript-eslint/typescript-estree": "8.56.0", "@typescript-eslint/utils": "8.56.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg=="], + "typescript-eslint": ["typescript-eslint@8.57.2", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.57.2", "@typescript-eslint/parser": "8.57.2", "@typescript-eslint/typescript-estree": "8.57.2", "@typescript-eslint/utils": "8.57.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-VEPQ0iPgWO/sBaZOU1xo4nuNdODVOajPnTIbog2GKYr31nIlZ0fWPoCQgGfF3ETyBl1vn63F/p50Um9Z4J8O8A=="], "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], + "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], + + "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="], + + "unbash": ["unbash@2.2.0", "", {}, "sha512-X2wH19RAPZE3+ldGicOkoj/SIA83OIxcJ6Cuaw23hf8Xc6fQpvZXY0SftE2JgS0QhYLUG4uwodSI3R53keyh7w=="], + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + "undici": ["undici@6.24.1", "", {}, "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA=="], + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], "unicorn-magic": ["unicorn-magic@0.4.0", "", {}, "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw=="], @@ -2338,12 +2697,18 @@ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + "url-parse": ["url-parse@1.5.10", "", { "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ=="], + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], + "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], "validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], @@ -2370,10 +2735,16 @@ "vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], - "vscode-uri": ["vscode-uri@3.0.8", "", {}, "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw=="], + "vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="], "walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="], + "web-streams-polyfill": ["web-streams-polyfill@4.0.0-beta.3", "", {}, "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], @@ -2394,27 +2765,41 @@ "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "ws": ["ws@8.20.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA=="], + + "xml2js": ["xml2js@0.6.2", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA=="], + + "xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], - "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + "yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="], "yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], + "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="], + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], "yoctocolors-cjs": ["yoctocolors-cjs@2.1.3", "", {}, "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw=="], "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + "zod-to-json-schema": ["zod-to-json-schema@3.23.3", "", { "peerDependencies": { "zod": "^3.23.3" } }, "sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog=="], + "zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="], "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@antfu/install-pkg/tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], + "@antfu/install-pkg/tinyexec": ["tinyexec@1.0.4", "", {}, "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw=="], + + "@anthropic-ai/sdk/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], + + "@anthropic-ai/sdk/form-data-encoder": ["form-data-encoder@1.7.2", "", {}, "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="], "@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], @@ -2422,8 +2807,6 @@ "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], - "@babel/core/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], - "@babel/core/json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -2432,29 +2815,33 @@ "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/template/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + "@browserbasehq/sdk/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], + + "@browserbasehq/sdk/form-data-encoder": ["form-data-encoder@1.7.2", "", {}, "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="], - "@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + "@browserbasehq/stagehand/zod": ["zod@3.25.67", "", {}, "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw=="], - "@chevrotain/cst-dts-gen/lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + "@browserbasehq/stagehand/zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], - "@chevrotain/gast/lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "@eslint/config-array/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "@eslint/config-array/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "@eslint/eslintrc/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "@eslint/eslintrc/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "@eslint/eslintrc/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - "@inquirer/checkbox/@inquirer/core": ["@inquirer/core@11.1.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-TBAGPDGvpwFSQ4nkawQzq5/X7DhElANjvKeUtcjpVnBIfuH/OEu4M+79R3+bGPtwxST4DOIGRtF933mUH2bRVw=="], + "@ibm-cloud/watsonx-ai/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], - "@inquirer/checkbox/@inquirer/figures": ["@inquirer/figures@2.0.3", "", {}, "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g=="], + "@inquirer/checkbox/@inquirer/core": ["@inquirer/core@11.1.7", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-1BiBNDk9btIwYIzNZpkikIHXWeNzNncJePPqwDyVMhXhD1ebqbpn1mKGctpoqAbzywZfdG0O4tvmsGIcOevAPQ=="], - "@inquirer/checkbox/@inquirer/type": ["@inquirer/type@4.0.3", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw=="], + "@inquirer/checkbox/@inquirer/figures": ["@inquirer/figures@2.0.4", "", {}, "sha512-eLBsjlS7rPS3WEhmOmh1znQ5IsQrxWzxWDxO51e4urv+iVrSnIHbq4zqJIOiyNdYLa+BVjwOtdetcQx1lWPpiQ=="], + + "@inquirer/checkbox/@inquirer/type": ["@inquirer/type@4.0.4", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA=="], "@inquirer/core/@inquirer/type": ["@inquirer/type@2.0.0", "", { "dependencies": { "mute-stream": "^1.0.0" } }, "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag=="], @@ -2462,39 +2849,75 @@ "@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], - "@inquirer/editor/@inquirer/core": ["@inquirer/core@11.1.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-TBAGPDGvpwFSQ4nkawQzq5/X7DhElANjvKeUtcjpVnBIfuH/OEu4M+79R3+bGPtwxST4DOIGRtF933mUH2bRVw=="], + "@inquirer/editor/@inquirer/core": ["@inquirer/core@11.1.7", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-1BiBNDk9btIwYIzNZpkikIHXWeNzNncJePPqwDyVMhXhD1ebqbpn1mKGctpoqAbzywZfdG0O4tvmsGIcOevAPQ=="], - "@inquirer/editor/@inquirer/type": ["@inquirer/type@4.0.3", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw=="], + "@inquirer/editor/@inquirer/type": ["@inquirer/type@4.0.4", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA=="], - "@inquirer/expand/@inquirer/core": ["@inquirer/core@11.1.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-TBAGPDGvpwFSQ4nkawQzq5/X7DhElANjvKeUtcjpVnBIfuH/OEu4M+79R3+bGPtwxST4DOIGRtF933mUH2bRVw=="], + "@inquirer/expand/@inquirer/core": ["@inquirer/core@11.1.7", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-1BiBNDk9btIwYIzNZpkikIHXWeNzNncJePPqwDyVMhXhD1ebqbpn1mKGctpoqAbzywZfdG0O4tvmsGIcOevAPQ=="], - "@inquirer/expand/@inquirer/type": ["@inquirer/type@4.0.3", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw=="], + "@inquirer/expand/@inquirer/type": ["@inquirer/type@4.0.4", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA=="], "@inquirer/external-editor/iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], - "@inquirer/number/@inquirer/core": ["@inquirer/core@11.1.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-TBAGPDGvpwFSQ4nkawQzq5/X7DhElANjvKeUtcjpVnBIfuH/OEu4M+79R3+bGPtwxST4DOIGRtF933mUH2bRVw=="], + "@inquirer/number/@inquirer/core": ["@inquirer/core@11.1.7", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-1BiBNDk9btIwYIzNZpkikIHXWeNzNncJePPqwDyVMhXhD1ebqbpn1mKGctpoqAbzywZfdG0O4tvmsGIcOevAPQ=="], + + "@inquirer/number/@inquirer/type": ["@inquirer/type@4.0.4", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA=="], + + "@inquirer/password/@inquirer/core": ["@inquirer/core@11.1.7", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-1BiBNDk9btIwYIzNZpkikIHXWeNzNncJePPqwDyVMhXhD1ebqbpn1mKGctpoqAbzywZfdG0O4tvmsGIcOevAPQ=="], + + "@inquirer/password/@inquirer/type": ["@inquirer/type@4.0.4", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA=="], + + "@inquirer/prompts/@inquirer/confirm": ["@inquirer/confirm@6.0.10", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-tiNyA73pgpQ0FQ7axqtoLUe4GDYjNCDcVsbgcA5anvwg2z6i+suEngLKKJrWKJolT//GFPZHwN30binDIHgSgQ=="], + + "@inquirer/prompts/@inquirer/input": ["@inquirer/input@5.0.10", "", { "dependencies": { "@inquirer/core": "^11.1.7", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-nvZ6qEVeX/zVtZ1dY2hTGDQpVGD3R7MYPLODPgKO8Y+RAqxkrP3i/3NwF3fZpLdaMiNuK0z2NaYIx9tPwiSegQ=="], + + "@inquirer/prompts/@inquirer/select": ["@inquirer/select@5.1.2", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/core": "^11.1.7", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-kTK8YIkHV+f02y7bWCh7E0u2/11lul5WepVTclr3UMBtBr05PgcZNWfMa7FY57ihpQFQH/spLMHTcr0rXy50tA=="], + + "@inquirer/rawlist/@inquirer/core": ["@inquirer/core@11.1.7", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-1BiBNDk9btIwYIzNZpkikIHXWeNzNncJePPqwDyVMhXhD1ebqbpn1mKGctpoqAbzywZfdG0O4tvmsGIcOevAPQ=="], + + "@inquirer/rawlist/@inquirer/type": ["@inquirer/type@4.0.4", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA=="], + + "@inquirer/search/@inquirer/core": ["@inquirer/core@11.1.7", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-1BiBNDk9btIwYIzNZpkikIHXWeNzNncJePPqwDyVMhXhD1ebqbpn1mKGctpoqAbzywZfdG0O4tvmsGIcOevAPQ=="], + + "@inquirer/search/@inquirer/figures": ["@inquirer/figures@2.0.4", "", {}, "sha512-eLBsjlS7rPS3WEhmOmh1znQ5IsQrxWzxWDxO51e4urv+iVrSnIHbq4zqJIOiyNdYLa+BVjwOtdetcQx1lWPpiQ=="], + + "@inquirer/search/@inquirer/type": ["@inquirer/type@4.0.4", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA=="], + + "@langchain/classic/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], - "@inquirer/number/@inquirer/type": ["@inquirer/type@4.0.3", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw=="], + "@langchain/community/@langchain/classic": ["@langchain/classic@1.0.17", "", { "dependencies": { "@langchain/openai": "1.2.7", "@langchain/textsplitters": "1.0.1", "handlebars": "^4.7.8", "js-yaml": "^4.1.1", "jsonpointer": "^5.0.1", "openapi-types": "^12.1.3", "uuid": "^10.0.0", "yaml": "^2.2.1", "zod": "^3.25.76 || ^4" }, "optionalDependencies": { "langsmith": ">=0.4.0 <1.0.0" }, "peerDependencies": { "@langchain/core": "^1.0.0", "cheerio": "*", "peggy": "^3.0.2", "typeorm": "*" }, "optionalPeers": ["cheerio", "peggy", "typeorm"] }, "sha512-GgcmDILxl26E0Oo09Q/fotJB3EZrTnU4MuJGR2zQXPMZnZ1CCQqyecXjKDRdI6sZkfc8Kxg+ezT+0kIMtKV10A=="], - "@inquirer/password/@inquirer/core": ["@inquirer/core@11.1.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-TBAGPDGvpwFSQ4nkawQzq5/X7DhElANjvKeUtcjpVnBIfuH/OEu4M+79R3+bGPtwxST4DOIGRtF933mUH2bRVw=="], + "@langchain/community/@langchain/openai": ["@langchain/openai@1.2.7", "", { "dependencies": { "js-tiktoken": "^1.0.12", "openai": "^6.18.0", "zod": "^3.25.76 || ^4" }, "peerDependencies": { "@langchain/core": "^1.0.0" } }, "sha512-vR9zoF0/EZ03X0Tc6woIEWRDSDSr2l64n+MQCW8NduScJtBJs5r/Ng3Lrp2bjtJQywEMQoOhcrV2DMmAIPWgnw=="], - "@inquirer/password/@inquirer/type": ["@inquirer/type@4.0.3", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw=="], + "@langchain/community/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], - "@inquirer/prompts/@inquirer/confirm": ["@inquirer/confirm@6.0.6", "", { "dependencies": { "@inquirer/core": "^11.1.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-9ZkrGYiWnOKQPc3xfLIORE3lZW1qvtgRoJcoqopr5zssBn7yk4yONmzGynEOjc16FnUXzkAejj/I29BbfcoUfQ=="], + "@langchain/core/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - "@inquirer/prompts/@inquirer/input": ["@inquirer/input@5.0.6", "", { "dependencies": { "@inquirer/core": "^11.1.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RZsJcjMJA3QNI9q9OiAi1fAom+Pb8on6alJB1Teh5jjKaiG5C79P69cG955ZRfgPdxTmI4uyhf33+94Xj7xWig=="], + "@langchain/core/langsmith": ["langsmith@0.5.15", "", { "dependencies": { "@types/uuid": "^10.0.0", "chalk": "^5.6.2", "console-table-printer": "^2.12.1", "p-queue": "^6.6.2", "semver": "^7.6.3", "uuid": "^10.0.0" }, "peerDependencies": { "@opentelemetry/api": "*", "@opentelemetry/exporter-trace-otlp-proto": "*", "@opentelemetry/sdk-trace-base": "*", "openai": "*", "ws": ">=7" }, "optionalPeers": ["@opentelemetry/api", "@opentelemetry/exporter-trace-otlp-proto", "@opentelemetry/sdk-trace-base", "openai", "ws"] }, "sha512-S20JnYmIgqGBjA/WEn12ZZJjqd03O5wd8K9KgGBvsKXQBn0bYuFrr1w20L37PpcMmX3/cftpgJ6g2y8KoEmHLw=="], - "@inquirer/prompts/@inquirer/select": ["@inquirer/select@5.0.6", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/core": "^11.1.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-9DyVbNCo4q0C3CkGd6zW0SW3NQuuk4Hy0NSbP6zErz2YNWF4EHHJCRzcV34/CDQLraeAQXbHYlMofuUrs6BBZQ=="], + "@langchain/langgraph/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], - "@inquirer/rawlist/@inquirer/core": ["@inquirer/core@11.1.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-TBAGPDGvpwFSQ4nkawQzq5/X7DhElANjvKeUtcjpVnBIfuH/OEu4M+79R3+bGPtwxST4DOIGRtF933mUH2bRVw=="], + "@langchain/langgraph-checkpoint/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], - "@inquirer/rawlist/@inquirer/type": ["@inquirer/type@4.0.3", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw=="], + "@langchain/langgraph-sdk/p-queue": ["p-queue@9.1.0", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^7.0.0" } }, "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw=="], - "@inquirer/search/@inquirer/core": ["@inquirer/core@11.1.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-TBAGPDGvpwFSQ4nkawQzq5/X7DhElANjvKeUtcjpVnBIfuH/OEu4M+79R3+bGPtwxST4DOIGRtF933mUH2bRVw=="], + "@langchain/langgraph-sdk/uuid": ["uuid@13.0.0", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w=="], - "@inquirer/search/@inquirer/figures": ["@inquirer/figures@2.0.3", "", {}, "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g=="], + "@n8n/ai-utilities/zod": ["zod@3.25.67", "", {}, "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw=="], - "@inquirer/search/@inquirer/type": ["@inquirer/type@4.0.3", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw=="], + "@n8n/config/zod": ["zod@3.25.67", "", {}, "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw=="], + + "@n8n/node-cli/@clack/prompts": ["@clack/prompts@0.11.0", "", { "dependencies": { "@clack/core": "0.5.0", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw=="], + + "@n8n/node-cli/change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="], + + "@n8n/node-cli/eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@4.4.4", "", { "dependencies": { "debug": "^4.4.1", "eslint-import-context": "^0.1.8", "get-tsconfig": "^4.10.1", "is-bun-module": "^2.0.0", "stable-hash-x": "^0.2.0", "tinyglobby": "^0.2.14", "unrs-resolver": "^1.7.11" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw=="], + + "@n8n/node-cli/fast-glob": ["fast-glob@3.2.12", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w=="], + + "@n8n/node-cli/picocolors": ["picocolors@1.0.1", "", {}, "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="], + + "@n8n/node-cli/prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], "@next/eslint-plugin-next/fast-glob": ["fast-glob@3.3.1", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="], @@ -2504,17 +2927,13 @@ "@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], - "@scalar/openapi-parser/@scalar/helpers": ["@scalar/helpers@0.2.12", "", {}, "sha512-Ig/H1Je8nqcDiY+YwFIpATxF2ko7zKrjIZFWK2gGeNTYK4Np9XnqDHg56jM3Xru439Eh4qHq9P/lX7Se5nnxFA=="], - - "@scalar/openapi-parser/@scalar/json-magic": ["@scalar/json-magic@0.11.1", "", { "dependencies": { "@scalar/helpers": "0.2.12", "yaml": "^2.8.0" } }, "sha512-JsugkVpZ9SmKW6fDhamcmkttc9YOPGgb9Azbwc7hXTlZgG6YeYXx8qFvYr5eJE4cfzCqalodS/9w7moZnVG3cw=="], + "@scalar/openapi-parser/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], - "@scalar/openapi-parser/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.9.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.9.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], - - "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="], "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], @@ -2526,23 +2945,25 @@ "@types/mdast/@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "@types/node-fetch/form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.0", "", {}, "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q=="], + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - "@typespec/compiler/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "@typespec/compiler/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], "@typespec/compiler/change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="], "@unrs/resolver-binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], - "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "ajv-formats/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], - "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "axios/form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], - "chevrotain/lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + "axios/proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="], + + "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "cliui/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], @@ -2558,7 +2979,7 @@ "decompress-response/mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], - "eslint/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "eslint/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -2566,17 +2987,19 @@ "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - "eslint-plugin-import/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "eslint-plugin-import/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "eslint-plugin-jsx-a11y/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - "eslint-plugin-jsx-a11y/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "eslint-plugin-jsx-a11y/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="], - "eslint-plugin-react/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "eslint-plugin-react/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], - "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], + "eslint-plugin-react/resolve": ["resolve@2.0.0-next.6", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA=="], "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -2584,18 +3007,26 @@ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - "filelist/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + "filelist/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], "globby/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], "gray-matter/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + "handlebars/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "hast-util-to-html/@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], "hast-util-to-jsx-runtime/@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + "ibm-cloud-sdk-core/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], + "katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + "langchain/langsmith": ["langsmith@0.5.15", "", { "dependencies": { "@types/uuid": "^10.0.0", "chalk": "^5.6.2", "console-table-printer": "^2.12.1", "p-queue": "^6.6.2", "semver": "^7.6.3", "uuid": "^10.0.0" }, "peerDependencies": { "@opentelemetry/api": "*", "@opentelemetry/exporter-trace-otlp-proto": "*", "@opentelemetry/sdk-trace-base": "*", "openai": "*", "ws": ">=7" }, "optionalPeers": ["@opentelemetry/api", "@opentelemetry/exporter-trace-otlp-proto", "@opentelemetry/sdk-trace-base", "openai", "ws"] }, "sha512-S20JnYmIgqGBjA/WEn12ZZJjqd03O5wd8K9KgGBvsKXQBn0bYuFrr1w20L37PpcMmX3/cftpgJ6g2y8KoEmHLw=="], + + "langsmith/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], + "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "mdast-util-find-and-replace/unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], @@ -2612,14 +3043,34 @@ "micromark-util-events-to-acorn/@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + + "n8n-workflow/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], + + "n8n-workflow/zod": ["zod@3.25.67", "", {}, "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw=="], "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], + "node-exports-info/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "oclif/@oclif/core": ["@oclif/core@4.9.0", "", { "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.17.0", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", "debug": "^4.4.3", "ejs": "^3.1.10", "get-package-type": "^0.1.0", "indent-string": "^4.0.0", "is-wsl": "^2.2.0", "lilconfig": "^3.1.3", "minimatch": "^10.2.4", "semver": "^7.7.3", "string-width": "^4.2.3", "supports-color": "^8", "tinyglobby": "^0.2.14", "widest-line": "^3.1.0", "wordwrap": "^1.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-k/ntRgDcUprTT+aaNoF+whk3cY3f9fRD2lkF6ul7JeCUg2MaMXVXZXfbRhJCfsiX51X8/5Pqo0LGdO9SLYXNHg=="], + "optionator/fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + "path-scurry/lru-cache": ["lru-cache@11.2.7", "", {}, "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA=="], + + "playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], + + "recast/ast-types": ["ast-types@0.15.2", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg=="], + + "recast/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + "tough-cookie/universalify": ["universalify@0.2.0", "", {}, "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="], + + "transliteration/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + "unified/@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], "unist-util-position/@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], @@ -2646,6 +3097,10 @@ "yargs/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "zod-to-json-schema/zod": ["zod@3.25.67", "", {}, "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw=="], + + "@anthropic-ai/sdk/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], @@ -2654,9 +3109,13 @@ "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "@browserbasehq/sdk/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="], + + "@eslint/eslintrc/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="], - "@eslint/eslintrc/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "@ibm-cloud/watsonx-ai/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], "@inquirer/checkbox/@inquirer/core/mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], @@ -2664,42 +3123,58 @@ "@inquirer/core/wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "@inquirer/editor/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.3", "", {}, "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g=="], + "@inquirer/editor/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.4", "", {}, "sha512-eLBsjlS7rPS3WEhmOmh1znQ5IsQrxWzxWDxO51e4urv+iVrSnIHbq4zqJIOiyNdYLa+BVjwOtdetcQx1lWPpiQ=="], "@inquirer/editor/@inquirer/core/mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], - "@inquirer/expand/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.3", "", {}, "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g=="], + "@inquirer/expand/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.4", "", {}, "sha512-eLBsjlS7rPS3WEhmOmh1znQ5IsQrxWzxWDxO51e4urv+iVrSnIHbq4zqJIOiyNdYLa+BVjwOtdetcQx1lWPpiQ=="], "@inquirer/expand/@inquirer/core/mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], - "@inquirer/number/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.3", "", {}, "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g=="], + "@inquirer/number/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.4", "", {}, "sha512-eLBsjlS7rPS3WEhmOmh1znQ5IsQrxWzxWDxO51e4urv+iVrSnIHbq4zqJIOiyNdYLa+BVjwOtdetcQx1lWPpiQ=="], "@inquirer/number/@inquirer/core/mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], - "@inquirer/password/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.3", "", {}, "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g=="], + "@inquirer/password/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.4", "", {}, "sha512-eLBsjlS7rPS3WEhmOmh1znQ5IsQrxWzxWDxO51e4urv+iVrSnIHbq4zqJIOiyNdYLa+BVjwOtdetcQx1lWPpiQ=="], "@inquirer/password/@inquirer/core/mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], - "@inquirer/prompts/@inquirer/confirm/@inquirer/core": ["@inquirer/core@11.1.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-TBAGPDGvpwFSQ4nkawQzq5/X7DhElANjvKeUtcjpVnBIfuH/OEu4M+79R3+bGPtwxST4DOIGRtF933mUH2bRVw=="], + "@inquirer/prompts/@inquirer/confirm/@inquirer/core": ["@inquirer/core@11.1.7", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-1BiBNDk9btIwYIzNZpkikIHXWeNzNncJePPqwDyVMhXhD1ebqbpn1mKGctpoqAbzywZfdG0O4tvmsGIcOevAPQ=="], - "@inquirer/prompts/@inquirer/confirm/@inquirer/type": ["@inquirer/type@4.0.3", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw=="], + "@inquirer/prompts/@inquirer/confirm/@inquirer/type": ["@inquirer/type@4.0.4", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA=="], - "@inquirer/prompts/@inquirer/input/@inquirer/core": ["@inquirer/core@11.1.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-TBAGPDGvpwFSQ4nkawQzq5/X7DhElANjvKeUtcjpVnBIfuH/OEu4M+79R3+bGPtwxST4DOIGRtF933mUH2bRVw=="], + "@inquirer/prompts/@inquirer/input/@inquirer/core": ["@inquirer/core@11.1.7", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-1BiBNDk9btIwYIzNZpkikIHXWeNzNncJePPqwDyVMhXhD1ebqbpn1mKGctpoqAbzywZfdG0O4tvmsGIcOevAPQ=="], - "@inquirer/prompts/@inquirer/input/@inquirer/type": ["@inquirer/type@4.0.3", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw=="], + "@inquirer/prompts/@inquirer/input/@inquirer/type": ["@inquirer/type@4.0.4", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA=="], - "@inquirer/prompts/@inquirer/select/@inquirer/core": ["@inquirer/core@11.1.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-TBAGPDGvpwFSQ4nkawQzq5/X7DhElANjvKeUtcjpVnBIfuH/OEu4M+79R3+bGPtwxST4DOIGRtF933mUH2bRVw=="], + "@inquirer/prompts/@inquirer/select/@inquirer/core": ["@inquirer/core@11.1.7", "", { "dependencies": { "@inquirer/ansi": "^2.0.4", "@inquirer/figures": "^2.0.4", "@inquirer/type": "^4.0.4", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-1BiBNDk9btIwYIzNZpkikIHXWeNzNncJePPqwDyVMhXhD1ebqbpn1mKGctpoqAbzywZfdG0O4tvmsGIcOevAPQ=="], - "@inquirer/prompts/@inquirer/select/@inquirer/figures": ["@inquirer/figures@2.0.3", "", {}, "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g=="], + "@inquirer/prompts/@inquirer/select/@inquirer/figures": ["@inquirer/figures@2.0.4", "", {}, "sha512-eLBsjlS7rPS3WEhmOmh1znQ5IsQrxWzxWDxO51e4urv+iVrSnIHbq4zqJIOiyNdYLa+BVjwOtdetcQx1lWPpiQ=="], - "@inquirer/prompts/@inquirer/select/@inquirer/type": ["@inquirer/type@4.0.3", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw=="], + "@inquirer/prompts/@inquirer/select/@inquirer/type": ["@inquirer/type@4.0.4", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-PamArxO3cFJZoOzspzo6cxVlLeIftyBsZw/S9bKY5DzxqJVZgjoj1oP8d0rskKtp7sZxBycsoer1g6UeJV1BBA=="], - "@inquirer/rawlist/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.3", "", {}, "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g=="], + "@inquirer/rawlist/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.4", "", {}, "sha512-eLBsjlS7rPS3WEhmOmh1znQ5IsQrxWzxWDxO51e4urv+iVrSnIHbq4zqJIOiyNdYLa+BVjwOtdetcQx1lWPpiQ=="], "@inquirer/rawlist/@inquirer/core/mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], "@inquirer/search/@inquirer/core/mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], + "@langchain/community/@langchain/classic/langsmith": ["langsmith@0.5.15", "", { "dependencies": { "@types/uuid": "^10.0.0", "chalk": "^5.6.2", "console-table-printer": "^2.12.1", "p-queue": "^6.6.2", "semver": "^7.6.3", "uuid": "^10.0.0" }, "peerDependencies": { "@opentelemetry/api": "*", "@opentelemetry/exporter-trace-otlp-proto": "*", "@opentelemetry/sdk-trace-base": "*", "openai": "*", "ws": ">=7" }, "optionalPeers": ["@opentelemetry/api", "@opentelemetry/exporter-trace-otlp-proto", "@opentelemetry/sdk-trace-base", "openai", "ws"] }, "sha512-S20JnYmIgqGBjA/WEn12ZZJjqd03O5wd8K9KgGBvsKXQBn0bYuFrr1w20L37PpcMmX3/cftpgJ6g2y8KoEmHLw=="], + + "@langchain/core/langsmith/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "@langchain/core/langsmith/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], + + "@langchain/langgraph-sdk/p-queue/eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + + "@langchain/langgraph-sdk/p-queue/p-timeout": ["p-timeout@7.0.1", "", {}, "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg=="], + + "@n8n/node-cli/@clack/prompts/@clack/core": ["@clack/core@0.5.0", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow=="], + + "@n8n/node-cli/@clack/prompts/picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "@n8n/node-cli/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "@next/eslint-plugin-next/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "@oclif/core/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -2726,48 +3201,64 @@ "@scalar/openapi-parser/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "@typespec/compiler/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "cliui/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], - "cliui/string-width/get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], - "cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="], + "d3-sankey/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], + "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="], - "eslint-plugin-import/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "eslint-plugin-import/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="], + + "eslint-plugin-jsx-a11y/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="], + + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], - "eslint-plugin-jsx-a11y/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - "eslint-plugin-react/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - "eslint/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "eslint-plugin-react/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="], - "filelist/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="], + + "filelist/minimatch/brace-expansion": ["brace-expansion@2.0.3", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA=="], "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + "ibm-cloud-sdk-core/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "langchain/langsmith/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "langchain/langsmith/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], + "mdast-util-find-and-replace/unist-util-is/@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], "mdast-util-find-and-replace/unist-util-visit-parents/@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], "mdast-util-phrasing/unist-util-is/@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + "oclif/@oclif/core/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "transliteration/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "transliteration/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "transliteration/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "widest-line/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "yargs/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], - "yargs/string-width/get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], - "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], @@ -2778,16 +3269,18 @@ "@eslint/eslintrc/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "@inquirer/prompts/@inquirer/confirm/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.3", "", {}, "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g=="], + "@inquirer/prompts/@inquirer/confirm/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.4", "", {}, "sha512-eLBsjlS7rPS3WEhmOmh1znQ5IsQrxWzxWDxO51e4urv+iVrSnIHbq4zqJIOiyNdYLa+BVjwOtdetcQx1lWPpiQ=="], "@inquirer/prompts/@inquirer/confirm/@inquirer/core/mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], - "@inquirer/prompts/@inquirer/input/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.3", "", {}, "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g=="], + "@inquirer/prompts/@inquirer/input/@inquirer/core/@inquirer/figures": ["@inquirer/figures@2.0.4", "", {}, "sha512-eLBsjlS7rPS3WEhmOmh1znQ5IsQrxWzxWDxO51e4urv+iVrSnIHbq4zqJIOiyNdYLa+BVjwOtdetcQx1lWPpiQ=="], "@inquirer/prompts/@inquirer/input/@inquirer/core/mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], "@inquirer/prompts/@inquirer/select/@inquirer/core/mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], + "@langchain/community/@langchain/classic/langsmith/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "@oclif/core/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "@oclif/plugin-not-found/@inquirer/prompts/@inquirer/checkbox/@inquirer/ansi": ["@inquirer/ansi@1.0.2", "", {}, "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ=="], @@ -2838,18 +3331,32 @@ "@oclif/plugin-not-found/@inquirer/prompts/@inquirer/select/@inquirer/type": ["@inquirer/type@3.0.10", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA=="], - "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "eslint-plugin-import/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "eslint-plugin-jsx-a11y/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], + + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], + + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils/@typescript-eslint/typescript-estree/globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], + + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], + "eslint-plugin-react/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "filelist/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "oclif/@oclif/core/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "transliteration/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "transliteration/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "widest-line/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "@oclif/plugin-not-found/@inquirer/prompts/@inquirer/checkbox/@inquirer/core/mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="], @@ -2908,6 +3415,20 @@ "@oclif/plugin-not-found/@inquirer/prompts/@inquirer/select/@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils/@typescript-eslint/typescript-estree/globby/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.3", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA=="], + + "oclif/@oclif/core/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "transliteration/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "transliteration/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "@oclif/plugin-not-found/@inquirer/prompts/@inquirer/checkbox/@inquirer/core/wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "@oclif/plugin-not-found/@inquirer/prompts/@inquirer/checkbox/@inquirer/core/wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -2948,6 +3469,8 @@ "@oclif/plugin-not-found/@inquirer/prompts/@inquirer/select/@inquirer/core/wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "eslint-plugin-n8n-nodes-base/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "@oclif/plugin-not-found/@inquirer/prompts/@inquirer/checkbox/@inquirer/core/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "@oclif/plugin-not-found/@inquirer/prompts/@inquirer/confirm/@inquirer/core/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], diff --git a/integrations/n8n/.gitignore b/integrations/n8n/.gitignore new file mode 100644 index 00000000..4390784d --- /dev/null +++ b/integrations/n8n/.gitignore @@ -0,0 +1,11 @@ +# Build output (covered by root .gitignore, explicit for clarity) +dist/ + +# E2e tests (local only, not run in CI) +e2e/ + +# Test artifacts +test-results/ + +# npm pack output +*.tgz diff --git a/integrations/n8n/.npmrc b/integrations/n8n/.npmrc new file mode 100644 index 00000000..521a9f7c --- /dev/null +++ b/integrations/n8n/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true diff --git a/integrations/n8n/CHANGELOG.md b/integrations/n8n/CHANGELOG.md new file mode 100644 index 00000000..094e501c --- /dev/null +++ b/integrations/n8n/CHANGELOG.md @@ -0,0 +1,26 @@ +# Changelog + +## 2.0.0 (2026-04-01) + +### New + +- **Auto-generated from OpenAPI** with full v1 backward compatibility +- **New resources:** Member, Read Member, Link Preview, Search, Security +- **Task resource** now supports full CRUD (was create-only) +- **Auto-pagination** with Return All / Limit (cursor-based) +- **AI Tool Use** support (`usableAsTool: true`) +- **Pachca Trigger** node with automatic webhook registration +- **English descriptions** for common fields +- **Bot update** with dedicated webhookUrl field + +### v1 Compatibility + +All v1 workflows continue to work without changes: + +- Resource values preserved: `reactions`, `status`, `customFields` +- Operation values preserved: `send`, `getById`, `addReaction`, etc. +- Parameter names preserved: `reactionsMessageId`, `threadMessageId`, etc. +- Legacy pagination (`per`/`page`) supported alongside cursor-based +- v1 alias operations: `getMembers`, `addUsers`, `removeUser`, `updateRole`, `leaveChat`, `getReadMembers`, `unfurl` +- v1 collections: `paginationOptions`, `filterOptions`, `additionalOptions` +- v1 hidden params: `getAllUsersNoLimit`, `buttonLayout` diff --git a/integrations/n8n/LICENSE b/integrations/n8n/LICENSE new file mode 100644 index 00000000..a69869f3 --- /dev/null +++ b/integrations/n8n/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Pachca + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/integrations/n8n/README.md b/integrations/n8n/README.md new file mode 100644 index 00000000..a35c4a62 --- /dev/null +++ b/integrations/n8n/README.md @@ -0,0 +1,269 @@ +# n8n-nodes-pachca + +Community node for [n8n](https://n8n.io/) to interact with the [Pachca API](https://dev.pachca.com/). + +Auto-generated from the [OpenAPI spec](https://github.com/pachca/openapi) — always in sync with the latest API. + +## Installation + +In your n8n instance: + +1. Go to **Settings > Community Nodes** +2. Enter `n8n-nodes-pachca` +3. Click **Install** + +Or install via CLI: + +```bash +npm install n8n-nodes-pachca +``` + +Or install from archive: + +```bash +wget https://github.com/pachca/openapi/releases/latest/download/n8n-nodes-pachca.tar.gz +tar -xzf n8n-nodes-pachca.tar.gz -C ~/.n8n/nodes/ +# Restart n8n +``` + +## Nodes + +### Pachca + +Main node for interacting with the Pachca API. Supports 18 resources and 60+ operations: + +| Resource | Operations | +|----------|-----------| +| Bot | Update, Get Many Events, Remove Events | +| Chat | Create, Get, Get Many, Update, Archive, Unarchive | +| Chat Export | Create, Get | +| Chat Member | Get Many, Create, Delete, Update, Leave, Add/Remove Group Tags | +| Custom Property | Get | +| File | Create (S3 two-stage upload) | +| Form | Create (visual builder, templates, or JSON) | +| Group Tag | Create, Get, Get Many, Update, Delete, Get Many Users | +| Link Preview | Create | +| Message | Create, Get, Get Many, Update, Delete, Pin, Unpin | +| Profile | Get Info, Get, Get/Update/Delete Status | +| Reaction | Create, Delete, Get Many | +| Read Member | Get Many | +| Search | Chats, Messages, Users | +| Security | Get Many | +| Task | Create, Get, Get Many, Update, Delete | +| Thread | Create, Get | +| User | Create, Get, Get Many, Update, Delete, Get/Update/Delete Status | + +### Pachca Trigger + +Webhook-based trigger that listens for 16 Pachca event types: + +| Category | Events | +|----------|--------| +| Messages | new, updated, deleted | +| Reactions | new, deleted | +| Interactive | button pressed, form submitted, link shared | +| Chat members | added, removed | +| Users | invited, confirmed, activated, suspended, updated, deleted | +| Wildcard | all events | + +Automatically registers webhooks via the Bot API when workflow is activated. Deactivation removes the webhook. + +## Credentials + +Create a **Pachca API** credential with: + +| Field | Required | Description | +|-------|----------|-------------| +| **Base URL** | no | Default: `https://api.pachca.com/api/shared/v1`. Change only for on-premise. | +| **Access Token** | yes | Bot or personal API token | +| **Bot ID** | no | For automatic webhook registration in Trigger. Auto-detected from bot tokens. Set explicitly for admin tokens. | +| **Signing Secret** | no | For HMAC-SHA256 verification of incoming webhooks | + +**Where to get tokens:** + +- **Bot token** — Bot settings > API tab +- **Personal token** — Settings > Automations > API + +Credentials are tested by calling `GET /oauth/token/info`. + +## Key Features + +### Pagination + +All list operations (Get Many) support automatic cursor-based pagination: + +- **Return All** = true — fetches all pages automatically +- **Return All** = false — returns up to **Limit** results (default: 50) + +### Simplify + +Toggle **Simplify** (on by default) to return only key fields from API responses. Turn off for full response. + +- **Message** — id, entity_id, chat_id, content, user_id, created_at +- **Chat** — id, name, channel, public, members_count, created_at +- **User** — id, first_name, last_name, nickname, email, role, suspended +- **Task** — id, content, kind, status, priority, due_at, created_at + +### Searchable Dropdowns + +Chat ID and User ID fields support search by name — type to find instead of entering numeric IDs. + +### Message Buttons + +Create messages with interactive buttons via JSON: + +```json +[[{"text": "Approve", "data": "approve"}, {"text": "Reject", "data": "reject"}]] +``` + +Button types: **URL** (opens link) and **Data** (sends `button_pressed` webhook event). + +### Forms + +Create modal forms with three builder modes: + +- **Visual Builder** — add blocks (text input, select, radio, checkboxes, date/time, file upload) +- **Templates** — predefined forms (Feedback, Time Off, Survey, Bug Report) +- **JSON** — paste blocks from the visual playground + +Forms require a `trigger_id` from a `button_pressed` webhook event (valid for 3 seconds). + +### File Upload + +Two-stage S3 upload with automatic retry. Sources: **URL** or **Binary Data** from previous workflow nodes. + +### AI Tool Use + +Both nodes have `usableAsTool: true` — they can be used as tools for AI Agent nodes in n8n. + +### Error Handling + +- **5xx/429 retry** — exponential backoff with jitter, respects `Retry-After` header (up to 5 attempts) +- **continueOnFail** — supported on all operations + +## v1 Compatibility + +Version 2 is fully backward compatible with v1. Existing v1 workflows continue to work without modification. + +The node uses the **VersionedNodeType** pattern with `defaultVersion: 2`: + +- Existing nodes keep `typeVersion: 1` with v1 UI and parameter names +- New nodes get `typeVersion: 2` with cleaner naming and new resources +- A shared router translates v1 names to v2 at runtime + +**Renamed resources:** `reactions` → `reaction`, `status` → `profile`, `customFields` → `customProperty` + +**Renamed operations:** `send` → `create`, `getById` → `get`, `addReaction` → `create`, etc. + +**New v2 resources:** Chat Member, Custom Property, Read Member, Link Preview, Search, Chat Export, Security + +To upgrade a v1 node: delete it, add a new Pachca node (defaults to v2), reconfigure with v2 names. API calls are identical. + +## Usage Examples + +### Send a message + +Set **Resource** = Message, **Operation** = Create: + +- **Entity ID** — chat ID (use searchable dropdown or enter number) +- **Content** — message text (supports Markdown) + +### Send a message with buttons + +Set **Resource** = Message, **Operation** = Create, then in **Additional Fields** add **Buttons**: + +```json +[[{"text": "Approve", "data": "approve"}, {"text": "Reject", "data": "reject"}]] +``` + +When a user clicks a Data button, the Pachca Trigger node receives a `button_pressed` event with the button's `data` value. + +### Upload a file and attach to message + +1. **Pachca** (File > Create) — upload file from URL or binary data, get `key` in response +2. **Pachca** (Message > Create) — send message with the file key in the `files` field + +### Search and process results + +Set **Resource** = Search, **Operation** = Get Many Messages: + +- **Query** — search text +- **Return All** = false, **Limit** = 10 + +### Open a modal form + +1. **Pachca Trigger** — event `Button Pressed` (provides `trigger_id`) +2. **Pachca** (Form > Create) — set **Title**, **Trigger ID**, choose builder mode +3. **Pachca Trigger** — event `Form Submitted` (in a separate workflow) + +### Bot echo workflow + +1. **Pachca Trigger** — event `New Message` +2. **IF** — filter: `message.user_id` ≠ bot ID +3. **Pachca** (Message > Create) — echo the message back + +## Troubleshooting + +### 401 Unauthorized + +Token is invalid or expired. Check **Access Token** in Credentials. For bot tokens: Bot settings > API tab. For personal tokens: Settings > Automations > API. + +### 403 Forbidden + +Token lacks required scopes for this operation. Check available scopes in your token settings. Admin operations (managing users, tags, security log) require admin-level scopes. + +### 429 Too Many Requests + +Rate limit exceeded (~4 req/sec for messages, ~50 req/sec for other operations). The node retries automatically with exponential backoff. For bulk operations, add a **Wait** node between steps. + +### Webhook not received (Trigger) + +1. **Bot not in chat** — bot only receives events from chats it's a member of +2. **Workflow not activated** — click **Activate** in the top right +3. **Bot ID missing** — set Bot ID in Credentials for auto-registration, or configure webhook URL manually in bot settings +4. **n8n not reachable** — Pachca can't send webhooks to `localhost`. Use a tunnel (ngrok, Cloudflare Tunnel) or deploy to a server with a public IP + +### Form not opening + +`trigger_id` from a `button_pressed` event expires in **3 seconds**. Place the Form > Create node immediately after the Trigger, with no Wait nodes or long operations in between. + +### Node not showing in n8n + +1. Restart n8n after installing the package +2. Check n8n logs for loading errors +3. Verify the package is in the correct directory (`~/.n8n/nodes/` or `~/.n8n/custom/node_modules/`) + +## Support + +- **GitHub Issues** — [github.com/pachca/openapi/issues](https://github.com/pachca/openapi/issues) +- **Pachca API docs** — [dev.pachca.com](https://dev.pachca.com) +- **n8n Community** — [community.n8n.io](https://community.n8n.io) + +## Development + +This node is auto-generated from the OpenAPI specification: + +```bash +# Generate node files from OpenAPI +bun run integrations/n8n/scripts/generate-n8n.ts + +# Run tests +cd integrations/n8n && npx vitest run + +# Type check +cd integrations/n8n && npx tsc --noEmit + +# Build for distribution +cd integrations/n8n && npx n8n-node build + +# Full CI check (from repo root) +npx turbo check +``` + +See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for architecture, local testing, and adding new endpoints. + +See [docs/CONTRIBUTORS.md](docs/CONTRIBUTORS.md) for project structure and contribution guidelines. + +## License + +MIT diff --git a/integrations/n8n/changelog.json b/integrations/n8n/changelog.json new file mode 100644 index 00000000..995e2390 --- /dev/null +++ b/integrations/n8n/changelog.json @@ -0,0 +1,16 @@ +[ + { + "version": "2.0.0", + "date": "2026-03-29", + "changes": [ + { "type": "+", "scope": "all", "description": "Auto-generated from OpenAPI with full v1 backward compatibility" }, + { "type": "+", "scope": "resource", "description": "New: Member, Read Member, Link Preview, Search, Security" }, + { "type": "+", "scope": "resource", "description": "Task resource now supports full CRUD (was create-only)" }, + { "type": "+", "scope": "feature", "description": "Auto-pagination with Return All / Limit (cursor-based)" }, + { "type": "+", "scope": "feature", "description": "AI Tool Use support (usableAsTool: true)" }, + { "type": "+", "scope": "trigger", "description": "Pachca Trigger with automatic webhook registration" }, + { "type": "+", "scope": "feature", "description": "English descriptions for common fields" }, + { "type": "+", "scope": "feature", "description": "Bot update with dedicated webhookUrl field" } + ] + } +] diff --git a/integrations/n8n/credentials/PachcaApi.credentials.ts b/integrations/n8n/credentials/PachcaApi.credentials.ts new file mode 100644 index 00000000..dd2ca2f9 --- /dev/null +++ b/integrations/n8n/credentials/PachcaApi.credentials.ts @@ -0,0 +1,64 @@ +import type { + IAuthenticateGeneric, + ICredentialTestRequest, + ICredentialType, + INodeProperties, +} from 'n8n-workflow'; + +export class PachcaApi implements ICredentialType { + name = 'pachcaApi'; + displayName = 'Pachca API'; + icon = { light: 'file:pachca.svg', dark: 'file:pachca.dark.svg' } as const; + documentationUrl = 'https://dev.pachca.com/api/authorization'; + + properties: INodeProperties[] = [ + { + displayName: 'Base URL', + name: 'baseUrl', + type: 'string', + default: 'https://api.pachca.com/api/shared/v1', + description: 'Base URL of the Pachca API. Change only for on-premise installations or API proxies.', + }, + { + displayName: 'Access Token', + name: 'accessToken', + type: 'string', + typeOptions: { password: true }, + default: '', + }, + { + displayName: 'Bot ID', + name: 'botId', + type: 'number', + default: 0, + description: 'Bot ID for automatic webhook registration (found in bot settings). Leave empty to auto-detect from token. Only needed for Pachca Trigger node.', + hint: 'Only required when using a bot token with the Pachca Trigger node', + }, + { + displayName: 'Webhook Signing Secret', + name: 'signingSecret', + type: 'string', + typeOptions: { password: true }, + default: '', + description: 'Used to verify incoming webhook requests from Pachca. Found in bot settings under the Webhook section.', + hint: 'Only required when using the Pachca Trigger node', + }, + ]; + + authenticate: IAuthenticateGeneric = { + type: 'generic', + properties: { + headers: { + Authorization: '=Bearer {{$credentials.accessToken}}', + }, + }, + }; + + test: ICredentialTestRequest = { + request: { + baseURL: '={{$credentials.baseUrl}}', + url: '/oauth/token/info', + method: 'GET', + }, + }; +} diff --git a/integrations/n8n/credentials/pachca.dark.svg b/integrations/n8n/credentials/pachca.dark.svg new file mode 100644 index 00000000..b34b4743 --- /dev/null +++ b/integrations/n8n/credentials/pachca.dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/n8n/credentials/pachca.svg b/integrations/n8n/credentials/pachca.svg new file mode 100644 index 00000000..21b5d0d2 --- /dev/null +++ b/integrations/n8n/credentials/pachca.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/n8n/docs/CONTRIBUTORS.md b/integrations/n8n/docs/CONTRIBUTORS.md new file mode 100644 index 00000000..be0779ef --- /dev/null +++ b/integrations/n8n/docs/CONTRIBUTORS.md @@ -0,0 +1,72 @@ +# Contributors + +## How to Contribute + +1. Fork the repository +2. Create a feature branch from `main` +3. Make your changes +4. Run `npx turbo build && npx turbo check` to verify +5. Submit a pull request + +## Project Structure + +``` +integrations/n8n/ +├── scripts/ # Generator code +│ ├── generate-n8n.ts # Main generator (~1000 lines) +│ ├── freeze-v1.ts # Captures V1 snapshot from npm +│ └── utils.ts # Body field extraction helpers +├── nodes/Pachca/ # Node files +│ ├── Pachca.node.ts # VersionedNodeType wrapper (generated) +│ ├── SharedRouter.ts # Shared router with V1→V2 translation (generated) +│ ├── GenericFunctions.ts # Utilities (hand-written) +│ ├── PachcaTrigger.node.ts # Trigger node (hand-written) +│ ├── V1/ +│ │ ├── PachcaV1.node.ts # Frozen V1 class +│ │ └── *Description.ts # 12 frozen V1 descriptions +│ └── V2/ +│ ├── PachcaV2.node.ts # Generated V2 class +│ ├── FormDescription.ts # Form resource (hand-written) +│ └── *Description.ts # 18 generated V2 descriptions +├── credentials/ # Credential type (generated) +├── icons/ # Node icons (SVG adaptive + PNG) +├── tests/ # Unit + contract tests (vitest) +├── e2e/ # Playwright E2E tests +├── examples/ # Example workflow JSON files +├── docs/ # Documentation +└── changelog.json # Version history +``` + +## Key Guidelines + +- **Do not manually edit generated files** — modify the generator instead +- **Do not edit V1/ files** — they are frozen from npm v1.0.27 and ensure backward compatibility +- **GenericFunctions.ts**, **V2/FormDescription.ts**, and **PachcaTrigger.node.ts** are hand-written — edit directly +- **Always run tests** after changes: `cd integrations/n8n && npx vitest run` +- **Follow n8n conventions**: ESLint with `@n8n/node-cli` rules +- **Update changelog.json** when making changes that warrant a release + +## Generated vs Hand-Written + +The generator (`scripts/generate-n8n.ts`) reads the OpenAPI spec and produces: +- VersionedNodeType wrapper (`Pachca.node.ts`) with V1/V2 class references +- Shared router (`SharedRouter.ts`) with V1 name translation maps and route table +- V2 resource descriptions with operations, parameters, and routing +- Credential type with fields and authentication + +Hand-written files handle logic that can't be expressed declaratively: +- Cursor-based pagination with retry +- S3 two-stage file upload +- Webhook signature verification +- Form template resolution +- Button layout transformation +- Error message extraction and formatting +- 5xx/429 retry with exponential backoff and jitter + +## Maintainers + +- [Pachca](https://github.com/pachca) — API specification and node generator + +## License + +MIT License — see [LICENSE](../LICENSE) for details. diff --git a/integrations/n8n/docs/DEVELOPMENT.md b/integrations/n8n/docs/DEVELOPMENT.md new file mode 100644 index 00000000..9c17f156 --- /dev/null +++ b/integrations/n8n/docs/DEVELOPMENT.md @@ -0,0 +1,136 @@ +# Development Guide + +## Architecture + +The n8n node is **auto-generated** from the Pachca OpenAPI specification using the **VersionedNodeType** pattern (same as Slack, Gmail, HTTP Request in n8n-nodes-base): + +``` +TypeSpec (typespec.tsp) + | +OpenAPI YAML (openapi.yaml + overlay.en.yaml) + | +n8n Node Generator (scripts/generate-n8n.ts) + | +nodes/Pachca/ +|- Pachca.node.ts <- VersionedNodeType wrapper (defaultVersion: 2) +|- SharedRouter.ts <- Shared router with V1->V2 name translation +|- V1/ +| |- PachcaV1.node.ts <- Frozen V1 class (from npm v1.0.27) +| +- *Description.ts <- 12 frozen V1 description files ++- V2/ + |- PachcaV2.node.ts <- Generated V2 class + +- *Description.ts <- 18 generated V2 description files +``` + +- Existing workflows keep `typeVersion: 1` -> load PachcaV1 with V1 UI +- New workflows get `typeVersion: 2` -> load PachcaV2 with clean V2 UI +- Node Creator shows only V2 operations (no duplicates) +- V1 nodes show a yellow "New node version available" banner + +### Generated Files (do not edit manually) + +| File | What is generated | +|------|-------------------| +| `Pachca.node.ts` | VersionedNodeType wrapper with V1/V2 classes | +| `SharedRouter.ts` | Shared router with V1_RESOURCE_MAP, V1_OP_MAP, and ROUTES | +| `V2/PachcaV2.node.ts` | V2 node class with resource list | +| `V2/*Description.ts` | 18 V2 resource descriptions (operations, fields, routing) | +| `PachcaApi.credentials.ts` | Credential type with fields and test endpoint | + +### Frozen V1 Files (do not edit) + +| File | What it contains | +|------|-----------------| +| `V1/PachcaV1.node.ts` | Frozen V1 node class from npm v1.0.27 | +| `V1/*Description.ts` | 12 frozen V1 resource descriptions | + +These files were captured by `scripts/freeze-v1.ts` and must not be modified. They ensure existing V1 workflows continue to work. + +### Hand-Written Files + +| File | Purpose | +|------|---------| +| `GenericFunctions.ts` | Cursor paginator, body wrapper, S3 upload, error handler, button transformer, form resolver, webhook signature verification, 5xx/429 retry with backoff | +| `PachcaTrigger.node.ts` | Webhook trigger with auto-registration, 16 event types, signature verification | +| `V2/FormDescription.ts` | Form resource with template/JSON builder modes | + +### Source Data + +| Source | What it provides | +|--------|-----------------| +| `@pachca/openapi-parser` | API endpoints, schemas, parameters | +| `packages/spec/workflows.ts` | English descriptions for operations | +| `packages/spec/examples.ts` | Form templates (Feedback, Time Off, Survey, Bug Report) | +| `packages/generator/src/naming.ts` | Case conversion utilities | +| `apps/docs/lib/openapi/mapper.ts` | URL generation for API docs | + +## Local Development + +```bash +# Install dependencies +bun install + +# Generate the node from OpenAPI +bun run integrations/n8n/scripts/generate-n8n.ts + +# Run unit + contract tests (excludes e2e) +cd integrations/n8n && npx vitest run + +# Type check +cd integrations/n8n && npx tsc --noEmit + +# Lint (n8n community node rules) +cd integrations/n8n && npx eslint nodes/ credentials/ + +# Build for distribution +cd integrations/n8n && npx n8n-node build + +# Full CI check (from repo root) +npx turbo check +``` + +## Testing Locally in n8n + +```bash +# Build the node +cd integrations/n8n && npx n8n-node build + +# Symlink into n8n's custom extensions directory +mkdir -p ~/.n8n/custom/node_modules +ln -sf "$(pwd)" ~/.n8n/custom/node_modules/n8n-nodes-pachca + +# Restart n8n +pkill -f n8n; npx n8n start +``` + +> **Note:** `~/.n8n/custom/node_modules/` is scanned on startup without needing a DB record. +> Community nodes installed via UI (`~/.n8n/node_modules/`) require a record in `installed_packages` table — manual `npm install` there won't work. + +## Adding New API Endpoints + +1. Add the endpoint to `packages/spec/typespec.tsp` +2. Run `npx turbo build --filter=@pachca/spec --force` to regenerate OpenAPI YAML +3. Run `bun run integrations/n8n/scripts/generate-n8n.ts` to regenerate V2 node files +4. Add English descriptions to `packages/spec/workflows.ts` if needed +5. Run tests: `cd integrations/n8n && npx vitest run` +6. Run full check: `npx turbo check` + +> V1 files are frozen and never regenerated. New endpoints appear only in V2. + +## Test Structure + +| Test File | What it covers | +|-----------|---------------| +| `tests/contract.test.ts` | Generated output matches OpenAPI spec (endpoints, methods, parameters) | +| `tests/compatibility.test.ts` | V1 backward compatibility (operations, parameters, pagination) | +| `tests/generic-functions.test.ts` | Unit tests for GenericFunctions.ts (paginator, buttons, forms, upload) | +| `e2e/` | Playwright E2E tests against a real n8n instance (mock + integration) | + +## Versioning + +- **npm version**: SemVer (`MAJOR.MINOR.PATCH`), current: `2.0.0` +- **n8n node version**: VersionedNodeType with `defaultVersion: 2` + - `typeVersion: 1` — loads PachcaV1 (frozen V1 class) + - `typeVersion: 2` — loads PachcaV2 (generated V2 class) +- **Source of truth**: `changelog.json` +- **CI**: Reads version from `changelog.json[0].version`, compares with npm, publishes if new diff --git a/integrations/n8n/eslint.config.mjs b/integrations/n8n/eslint.config.mjs new file mode 100644 index 00000000..c2643cfe --- /dev/null +++ b/integrations/n8n/eslint.config.mjs @@ -0,0 +1,26 @@ +import { config } from '@n8n/node-cli/eslint'; + +export default [ + ...config, + { ignores: ['scripts/', 'tests/', 'dist/', 'e2e/', 'nodes/Pachca/V1/'] }, + { + rules: { + // Optional filter query params use empty default to mean "no filter" + 'n8n-nodes-base/node-param-default-wrong-for-options': 'off', + }, + }, + { + files: ['nodes/Pachca/V2/PachcaV2.node.ts'], + rules: { + // Icon is set in baseDescription (VersionedNodeType wrapper), not in version class + '@n8n/community-nodes/icon-validation': 'off', + }, + }, + { + files: ['credentials/**/*.ts'], + rules: { + // tokenType is a dropdown (options), not a secret — false positive on "token" in name + '@n8n/community-nodes/credential-password-field': 'off', + }, + }, +]; diff --git a/integrations/n8n/examples/basic-usage.json b/integrations/n8n/examples/basic-usage.json new file mode 100644 index 00000000..09d308a7 --- /dev/null +++ b/integrations/n8n/examples/basic-usage.json @@ -0,0 +1,69 @@ +{ + "name": "Pachca Basic Usage", + "nodes": [ + { + "parameters": {}, + "id": "trigger", + "name": "When clicking 'Test workflow'", + "type": "n8n-nodes-base.manualTrigger", + "typeVersion": 1, + "position": [0, 0] + }, + { + "parameters": { + "resource": "message", + "operation": "create", + "entityId": 123, + "content": "Hello from n8n!" + }, + "id": "send-message", + "name": "Send Message", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [220, 0], + "credentials": { + "pachcaApi": { + "id": "1", + "name": "Pachca API" + } + } + }, + { + "parameters": { + "resource": "chat", + "operation": "getAll", + "returnAll": false, + "limit": 10 + }, + "id": "list-chats", + "name": "List Chats", + "type": "n8n-nodes-pachca.pachca", + "typeVersion": 2, + "position": [220, 200], + "credentials": { + "pachcaApi": { + "id": "1", + "name": "Pachca API" + } + } + } + ], + "connections": { + "When clicking 'Test workflow'": { + "main": [ + [ + { + "node": "Send Message", + "type": "main", + "index": 0 + }, + { + "node": "List Chats", + "type": "main", + "index": 0 + } + ] + ] + } + } +} diff --git a/integrations/n8n/icons/pachca.dark.svg b/integrations/n8n/icons/pachca.dark.svg new file mode 100644 index 00000000..b34b4743 --- /dev/null +++ b/integrations/n8n/icons/pachca.dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/n8n/icons/pachca.svg b/integrations/n8n/icons/pachca.svg new file mode 100644 index 00000000..21b5d0d2 --- /dev/null +++ b/integrations/n8n/icons/pachca.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/n8n/index.js b/integrations/n8n/index.js new file mode 100644 index 00000000..f053ebf7 --- /dev/null +++ b/integrations/n8n/index.js @@ -0,0 +1 @@ +module.exports = {}; diff --git a/integrations/n8n/nodes/Pachca/GenericFunctions.ts b/integrations/n8n/nodes/Pachca/GenericFunctions.ts new file mode 100644 index 00000000..332619de --- /dev/null +++ b/integrations/n8n/nodes/Pachca/GenericFunctions.ts @@ -0,0 +1,812 @@ +import type { + ICredentialDataDecryptedObject, + IDataObject, + IExecuteFunctions, + IHookFunctions, + IHttpRequestMethods, + IHttpRequestOptions, + INodeExecutionData, + IN8nHttpFullResponse, + JsonObject, +} from 'n8n-workflow'; +import { NodeApiError, NodeOperationError } from 'n8n-workflow'; +import * as crypto from 'crypto'; + +// ============================================================================ +// SHARED CONSTANTS +// ============================================================================ + +/** Human-readable field name mapping for error messages */ +const FIELD_DISPLAY_NAMES: Record = { + entity_id: 'Entity ID', + entity_type: 'Entity Type', + member_ids: 'Member IDs', + group_tag_ids: 'Group Tag IDs', + performer_ids: 'Performer IDs', + parent_message_id: 'Parent Message ID', + chat_id: 'Chat ID', + user_id: 'User ID', + first_name: 'First Name', + last_name: 'Last Name', + file_type: 'File Type', + due_at: 'Due Date', + callback_id: 'Callback ID', + trigger_id: 'Trigger ID', + outgoing_url: 'Webhook URL', +}; + +/** Friendly descriptions for common HTTP status codes */ +const STATUS_HINTS: Record = { + 401: 'Authentication failed. Check your API token in Pachca credentials.', + 403: 'Insufficient permissions. This operation may require an admin token or additional scopes.', + 404: 'The requested resource was not found. Check the ID value.', + 422: 'Validation error. Check the field values below.', + 429: 'Rate limit exceeded. Please wait and try again.', +}; + +/** Key fields per resource for Simplify mode — only these fields are returned */ +const SIMPLIFY_FIELDS: Record = { + message: ['id', 'entity_id', 'chat_id', 'content', 'user_id', 'created_at'], + chat: ['id', 'name', 'channel', 'public', 'members_count', 'created_at'], + user: ['id', 'first_name', 'last_name', 'nickname', 'email', 'role', 'suspended'], + task: ['id', 'content', 'kind', 'status', 'priority', 'due_at', 'created_at'], + bot: ['id', 'name', 'created_at'], + groupTag: ['id', 'name', 'users_count'], + reaction: ['id', 'code', 'user_id', 'created_at'], + export: ['id', 'status', 'created_at'], +}; + +// ============================================================================ +// FORM TEMPLATES +// ============================================================================ + +/** + * Predefined form templates for the template builder mode. + * Each template is an array of ViewBlock objects matching the Pachca forms API. + */ +export const FORM_TEMPLATES: Record = { + feedback: [ + { type: 'header', text: 'Обратная связь' }, + { + type: 'input', + name: 'feedback', + label: 'Ваш отзыв', + multiline: true, + required: true, + placeholder: 'Опишите ваш опыт...', + }, + { + type: 'select', + name: 'rating', + label: 'Оценка', + required: true, + options: [ + { text: '⭐ Отлично', value: '5' }, + { text: '👍 Хорошо', value: '4' }, + { text: '👌 Нормально', value: '3' }, + { text: '👎 Плохо', value: '2' }, + { text: '❌ Ужасно', value: '1' }, + ], + }, + ], + timeoff: [ + { type: 'header', text: 'Заявка на отпуск' }, + { type: 'date', name: 'date_start', label: 'Дата начала', required: true }, + { type: 'date', name: 'date_end', label: 'Дата окончания', required: true }, + { + type: 'radio', + name: 'accessibility', + label: 'Доступность', + options: [ + { text: 'Только телефон', value: 'phone_only' }, + { text: 'Телефон и мессенджер', value: 'phone_and_messenger' }, + { text: 'Недоступен', value: 'unavailable' }, + ], + }, + { + type: 'input', + name: 'info', + label: 'Комментарий', + multiline: true, + placeholder: 'Дополнительная информация...', + }, + { + type: 'file_input', + name: 'documents', + label: 'Документы', + max_files: 5, + }, + ], + survey: [ + { type: 'header', text: 'Опрос' }, + { + type: 'radio', + name: 'satisfaction', + label: 'Насколько вы довольны?', + required: true, + options: [ + { text: 'Полностью доволен', value: 'very_satisfied' }, + { text: 'Скорее доволен', value: 'satisfied' }, + { text: 'Скорее недоволен', value: 'dissatisfied' }, + { text: 'Совсем не доволен', value: 'very_dissatisfied' }, + ], + }, + { + type: 'checkbox', + name: 'features', + label: 'Какие функции вы используете?', + options: [ + { text: 'Чаты', value: 'chats' }, + { text: 'Задачи', value: 'tasks' }, + { text: 'Боты', value: 'bots' }, + { text: 'Формы', value: 'forms' }, + ], + }, + { + type: 'input', + name: 'suggestions', + label: 'Предложения по улучшению', + multiline: true, + }, + ], + bug_report: [ + { type: 'header', text: 'Отчёт об ошибке' }, + { + type: 'input', + name: 'title', + label: 'Краткое описание', + required: true, + placeholder: 'Что произошло?', + }, + { + type: 'input', + name: 'steps', + label: 'Шаги воспроизведения', + multiline: true, + required: true, + placeholder: '1. Открыть...\n2. Нажать...\n3. Увидеть ошибку', + }, + { + type: 'select', + name: 'severity', + label: 'Серьёзность', + required: true, + options: [ + { text: 'Критическая', value: 'critical' }, + { text: 'Высокая', value: 'high' }, + { text: 'Средняя', value: 'medium' }, + { text: 'Низкая', value: 'low' }, + ], + }, + { + type: 'file_input', + name: 'screenshots', + label: 'Скриншоты', + filetypes: ['png', 'jpg', 'gif', 'webp'], + max_files: 5, + }, + ], +}; + +// v1 backward compat: old template keys → same blocks as v2 equivalents +FORM_TEMPLATES.timeoff_request = FORM_TEMPLATES.timeoff; +FORM_TEMPLATES.feedback_form = FORM_TEMPLATES.feedback; +FORM_TEMPLATES.survey_form = FORM_TEMPLATES.survey; +FORM_TEMPLATES.task_request = FORM_TEMPLATES.bug_report; +FORM_TEMPLATES.access_request = FORM_TEMPLATES.feedback; + +// ============================================================================ +// WEBHOOK SIGNATURE VERIFICATION +// ============================================================================ + +/** + * Verifies HMAC-SHA256 signature of incoming webhook requests. + * Uses timing-safe comparison to prevent timing attacks. + */ +export function verifyWebhookSignature( + body: string, + signature: string, + secret: string, +): boolean { + const hmac = crypto.createHmac('sha256', secret); + hmac.update(body); + const expected = hmac.digest('hex'); + try { + return crypto.timingSafeEqual( + Buffer.from(signature), + Buffer.from(expected), + ); + } catch { + return false; + } +} + +// ============================================================================ +// S3 FILE UPLOAD UTILITIES +// ============================================================================ + +/** Detect MIME type from file extension */ +export function detectMimeType(filename: string): string { + const ext = filename.split('.').pop()?.toLowerCase() ?? ''; + const MIME_TYPES: Record = { + pdf: 'application/pdf', + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + png: 'image/png', + gif: 'image/gif', + webp: 'image/webp', + doc: 'application/msword', + docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + xls: 'application/vnd.ms-excel', + xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + zip: 'application/zip', + mp4: 'video/mp4', + mp3: 'audio/mpeg', + txt: 'text/plain', + csv: 'text/csv', + json: 'application/json', + }; + return MIME_TYPES[ext] ?? 'application/octet-stream'; +} + +/** + * Build multipart/form-data body for S3 upload. + * Field order matters for S3: all policy fields first, then file last. + */ +export function buildMultipartBody( + fields: Record, + fileBuffer: Buffer, + fileName: string, + contentType: string, +): { body: Buffer; contentType: string } { + const boundary = `----WebKitFormBoundary${crypto.randomBytes(16).toString('hex')}`; + const parts: Buffer[] = []; + + // Policy fields first (order matters for S3) + for (const [key, value] of Object.entries(fields)) { + parts.push( + Buffer.from( + `--${boundary}\r\nContent-Disposition: form-data; name="${key}"\r\n\r\n${value}\r\n`, + ), + ); + } + + // File last + parts.push( + Buffer.from( + `--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${fileName}"\r\nContent-Type: ${contentType}\r\n\r\n`, + ), + ); + parts.push(fileBuffer); + parts.push(Buffer.from(`\r\n--${boundary}--\r\n`)); + + return { + body: Buffer.concat(parts), + contentType: `multipart/form-data; boundary=${boundary}`, + }; +} + +// ============================================================================ +// BOT ID AUTO-DETECTION +// ============================================================================ + +/** + * Resolve bot ID: use explicit credential value, or auto-detect via /oauth/token/info. + * Returns the bot's user_id if the token belongs to a bot, or 0 if it's a personal token. + */ +export async function resolveBotId( + context: IHookFunctions, + credentials: ICredentialDataDecryptedObject, +): Promise { + if (credentials.botId && Number(credentials.botId) > 0) { + return Number(credentials.botId); + } + try { + const response = (await context.helpers.httpRequestWithAuthentication.call( + context, + 'pachcaApi', + { + method: 'GET', + url: `${credentials.baseUrl}/oauth/token/info`, + }, + )) as IDataObject; + const data = response.data as IDataObject | undefined; + // Bot tokens have name: null, personal tokens have a user-defined name + if (data && data.name === null && data.user_id) { + return Number(data.user_id); + } + return 0; + } catch { + return 0; + } +} + +// ============================================================================ +// EXECUTE() MODE HELPERS +// ============================================================================ + +/** + * Make an authenticated API request to Pachca. + * Handles error responses with rich context (field names, status hints). + */ +export async function makeApiRequest( + this: IExecuteFunctions, + method: IHttpRequestMethods, + endpoint: string, + body?: IDataObject, + qs?: IDataObject, + itemIndex?: number, +): Promise { + const credentials = await this.getCredentials('pachcaApi'); + const options: IHttpRequestOptions = { + method, + url: `${credentials.baseUrl}${endpoint}`, + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + qs, + body, + returnFullResponse: true, + }; + + const response = (await this.helpers.httpRequestWithAuthentication.call( + this, 'pachcaApi', options, + )) as IN8nHttpFullResponse; + + if (response.statusCode >= 400) { + const resBody = response.body as IDataObject; + const errors = resBody.errors as Array<{ key: string; value: string }> | undefined; + + let message: string; + if (errors?.length) { + message = errors.map(e => { + const displayName = FIELD_DISPLAY_NAMES[e.key] || e.key; + return `${displayName}: ${e.value}`; + }).join('; '); + } else { + message = ((resBody.message || resBody.error || `Request failed with status ${response.statusCode}`) as string); + } + + const hint = STATUS_HINTS[response.statusCode]; + const description = hint ? `${hint}\n${message}` : message; + + throw new NodeApiError(this.getNode(), resBody as JsonObject, { + message, + httpCode: String(response.statusCode), + description, + itemIndex, + }); + } + + return response.body as IDataObject; +} + +/** + * Paginated API request with cursor-based pagination and 429 retry. + * Handles returnAll/limit, v1 legacy per/page, and simplify. + */ +export async function makeApiRequestAllPages( + this: IExecuteFunctions, + method: IHttpRequestMethods, + endpoint: string, + qs: IDataObject, + itemIndex: number, + resource: string, + nodeVersion: number, +): Promise { + // v1 legacy offset-based pagination + if (nodeVersion === 1) { + let legacyPer: number | undefined; + let legacyPage: number | undefined; + try { + const paginationOptions = this.getNodeParameter('paginationOptions', itemIndex, null) as + | { per?: number; page?: number } + | null; + if (paginationOptions) { + legacyPer = paginationOptions.per; + legacyPage = paginationOptions.page; + } + } catch { /* parameter doesn't exist */ } + + if (legacyPer || legacyPage) { + const pageQs = { ...qs, per: legacyPer ?? 25, page: legacyPage ?? 1 }; + const response = await makeApiRequest.call(this, method, endpoint, undefined, pageQs, itemIndex); + const items = (response.data as IDataObject[]) ?? []; + return items.map(item => ({ json: item })); + } + } + + // Check returnAll / getAllUsersNoLimit (v1 alias) + let returnAll = false; + try { returnAll = this.getNodeParameter('returnAll', itemIndex, false) as boolean; } catch { /* */ } + if (!returnAll) { + try { returnAll = this.getNodeParameter('getAllUsersNoLimit', itemIndex, false) as boolean; } catch { /* */ } + } + + const limit = returnAll ? 0 : ((this.getNodeParameter('limit', itemIndex, 50) as number) || 50); + const results: IDataObject[] = []; + let cursor: string | undefined; + let retryCount = 0; + const MAX_RETRIES = 5; + + do { + const pageQs: IDataObject = { ...qs, limit: 50 }; + if (cursor) pageQs.cursor = cursor; + + let response: IDataObject; + try { + response = await makeApiRequest.call(this, method, endpoint, undefined, pageQs, itemIndex); + retryCount = 0; + } catch (error: unknown) { + const err = error as { httpCode?: string; response?: { headers?: Record } }; + if (err.httpCode === '429' && retryCount < MAX_RETRIES) { + retryCount++; + const retryAfter = parseInt(err.response?.headers?.['retry-after'] ?? '1', 10); + // eslint-disable-next-line @n8n/community-nodes/no-restricted-globals + await new Promise(r => setTimeout(r, retryAfter * 1000)); + continue; + } + throw error; + } + + const items = (response.data as IDataObject[]) ?? []; + results.push(...items); + const meta = response.meta as IDataObject | undefined; + const paginate = meta?.paginate as IDataObject | undefined; + cursor = (paginate?.next_page as string) ?? undefined; + } while (cursor && (returnAll || results.length < limit)); + + const finalResults = returnAll ? results : results.slice(0, limit); + + // Apply simplify if enabled (v2 only) + if (nodeVersion >= 2) { + let simplify = false; + try { simplify = this.getNodeParameter('simplify', itemIndex, false) as boolean; } catch { /* */ } + if (simplify) { + const keyFields = SIMPLIFY_FIELDS[resource]; + if (keyFields) { + return finalResults.map(item => ({ + json: Object.fromEntries(Object.entries(item).filter(([k]) => keyFields.includes(k))), + })); + } + } + } + + return finalResults.map(item => ({ json: item })); +} + +/** Simplify a single item by keeping only key fields for the resource */ +export function simplifyItem(item: IDataObject, resource: string): IDataObject { + const keyFields = SIMPLIFY_FIELDS[resource]; + if (!keyFields) return item; + return Object.fromEntries(Object.entries(item).filter(([k]) => keyFields.includes(k))); +} + +/** + * Extract value from resourceLocator parameter (v2) or plain number/string (v1). + * ResourceLocator returns { mode, value, __rl: true }. + */ +export function resolveResourceLocator( + ctx: IExecuteFunctions, + paramName: string, + itemIndex: number, + fallbackParam?: string, +): number | string { + let value: unknown; + try { + value = ctx.getNodeParameter(paramName, itemIndex); + } catch { + if (fallbackParam) { + value = ctx.getNodeParameter(fallbackParam, itemIndex); + } else { + throw new NodeOperationError(ctx.getNode(), `Missing required parameter: ${paramName}`, { itemIndex }); + } + } + if (typeof value === 'object' && value !== null && (value as IDataObject).__rl) { + return (value as IDataObject).value as number | string; + } + return value as number | string; +} + +/** + * Build button rows from visual builder or raw JSON parameters. + * Returns Button[][] ready for API body. + */ +export function buildButtonRows( + ctx: IExecuteFunctions, + itemIndex: number, +): IDataObject[][] { + let buttonLayout: string; + try { buttonLayout = ctx.getNodeParameter('buttonLayout', itemIndex, 'none') as string; } catch { return []; } + if (buttonLayout === 'none') return []; + + if (buttonLayout === 'raw_json') { + let rawJson: string; + try { rawJson = ctx.getNodeParameter('rawJsonButtons', itemIndex, '') as string; } catch { return []; } + if (!rawJson || rawJson.trim() === '' || rawJson.trim() === '[]') return []; + + let parsed: unknown; + try { parsed = JSON.parse(rawJson); } catch { + throw new NodeOperationError(ctx.getNode(), + 'The buttons JSON is not valid. Expected format: [{"text": "Click me"}] or [[{"text": "Row 1"}, {"text": "Row 2"}]]', + { itemIndex }, + ); + } + if (!Array.isArray(parsed)) { + throw new NodeOperationError(ctx.getNode(), 'Buttons JSON must be an array', { itemIndex }); + } + if (parsed.length > 0 && parsed.every((item: unknown) => Array.isArray(item))) { + return parsed as IDataObject[][]; + } + return [parsed as IDataObject[]]; + } + + // Visual mode (single_row / multiple_rows) + let buttonsParam: { button?: IDataObject[]; buttonRow?: IDataObject[] } | undefined; + try { buttonsParam = ctx.getNodeParameter('buttons', itemIndex, {}) as typeof buttonsParam; } catch { return []; } + const items = buttonsParam?.button ?? buttonsParam?.buttonRow ?? []; + if (items.length === 0) return []; + + if (buttonLayout === 'single_row') { + return [items.map(btn => buildButton(btn))]; + } + // multiple_rows + return items.map(btn => [buildButton(btn)]); +} + +function buildButton(btn: IDataObject): IDataObject { + const result: IDataObject = { text: btn.text as string }; + if (btn.type === 'url' && btn.url) { + result.url = btn.url as string; + } else if (btn.data) { + result.data = btn.data as string; + } + return result; +} + +/** + * Clean up file attachments from fixedCollection format. + * Removes empty/zero fields and maps camelCase to snake_case. + */ +export function cleanFileAttachments( + ctx: IExecuteFunctions, + itemIndex: number, +): IDataObject[] { + let filesRaw: unknown; + try { + const additional = ctx.getNodeParameter('additionalFields', itemIndex, {}) as IDataObject; + filesRaw = additional.files; + } catch { return []; } + if (!filesRaw) return []; + + let files: IDataObject[]; + if (Array.isArray(filesRaw)) { + files = filesRaw as IDataObject[]; + } else if (typeof filesRaw === 'object' && (filesRaw as IDataObject).file) { + files = (filesRaw as IDataObject).file as IDataObject[]; + } else { + return []; + } + + const keyMap: Record = { fileType: 'file_type' }; + return files.map(f => { + const clean: IDataObject = {}; + for (const [k, v] of Object.entries(f)) { + if ((k === 'height' || k === 'width') && (v === 0 || v === '')) continue; + if (v === '' || v === undefined || v === null) continue; + clean[keyMap[k] || k] = v; + } + return clean; + }); +} + +/** + * Resolve form blocks from builder mode, template, or JSON input. + * Works with IExecuteFunctions context (execute() mode). + */ +export function resolveFormBlocksFromParams( + ctx: IExecuteFunctions, + itemIndex: number, +): IDataObject[] { + let builderMode: string; + try { builderMode = ctx.getNodeParameter('formBuilderMode', itemIndex, 'json') as string; } catch { builderMode = 'json'; } + + if (builderMode === 'builder') { + let rawBlocks: IDataObject | undefined; + try { rawBlocks = ctx.getNodeParameter('formBlocks', itemIndex, {}) as IDataObject; } catch { return []; } + const blockEntries = (rawBlocks?.block ?? []) as IDataObject[]; + if (blockEntries.length === 0) return []; + + const blocks: IDataObject[] = []; + for (const entry of blockEntries) { + const block: IDataObject = { type: entry.type }; + const blockType = entry.type as string; + + if (['header', 'plain_text', 'markdown'].includes(blockType)) { + if (entry.text) block.text = entry.text; + } + if (blockType === 'divider') { blocks.push(block); continue; } + + if (['input', 'select', 'radio', 'checkbox', 'date', 'time', 'file_input'].includes(blockType)) { + if (entry.name) block.name = entry.name; + if (entry.label) block.label = entry.label; + if (entry.required === true) block.required = true; + if (entry.hint && (entry.hint as string).trim()) block.hint = entry.hint; + } + + if (blockType === 'input') { + if (entry.placeholder && (entry.placeholder as string).trim()) block.placeholder = entry.placeholder; + if (entry.multiline === true) block.multiline = true; + if (entry.initial_value && (entry.initial_value as string).trim()) block.initial_value = entry.initial_value; + if (entry.min_length && (entry.min_length as number) > 0) block.min_length = entry.min_length; + if (entry.max_length && (entry.max_length as number) > 0) block.max_length = entry.max_length; + } + + if (['select', 'radio', 'checkbox'].includes(blockType) && entry.options) { + const optionsData = entry.options as IDataObject; + const optionEntries = (optionsData?.option ?? []) as IDataObject[]; + if (optionEntries.length > 0) { + block.options = optionEntries.map(opt => { + const cleanOpt: IDataObject = { text: opt.text, value: opt.value }; + if (opt.description && (opt.description as string).trim()) cleanOpt.description = opt.description; + if (blockType === 'select' && opt.selected === true) cleanOpt.selected = true; + if (['radio', 'checkbox'].includes(blockType) && opt.checked === true) cleanOpt.checked = true; + return cleanOpt; + }); + } + } + + if (blockType === 'date' && entry.initial_date && (entry.initial_date as string).trim()) { + block.initial_date = entry.initial_date; + } + if (blockType === 'time' && entry.initial_time && (entry.initial_time as string).trim()) { + block.initial_time = entry.initial_time; + } + + if (blockType === 'file_input') { + if (entry.filetypes && (entry.filetypes as string).trim()) { + block.filetypes = (entry.filetypes as string).split(',').map(s => s.trim()).filter(Boolean); + } + if (entry.max_files && (entry.max_files as number) > 0) block.max_files = entry.max_files; + } + + blocks.push(block); + } + return blocks; + } + + if (builderMode === 'template') { + let templateName: string; + try { templateName = ctx.getNodeParameter('formTemplate', itemIndex, '') as string; } catch { return []; } + return FORM_TEMPLATES[templateName] ?? []; + } + + // JSON mode + let rawBlocks: string; + try { rawBlocks = ctx.getNodeParameter('formBlocks', itemIndex, '') as string; } catch { rawBlocks = ''; } + // v1 compat: old parameter name was customFormJson + if (!rawBlocks || !rawBlocks.trim()) { + try { rawBlocks = ctx.getNodeParameter('customFormJson', itemIndex, '') as string; } catch { rawBlocks = ''; } + } + if (!rawBlocks || !rawBlocks.trim()) return []; + + let parsed: unknown; + try { parsed = JSON.parse(rawBlocks); } catch { + throw new NodeOperationError(ctx.getNode(), + 'The JSON is not valid. Paste an array of blocks or the full form JSON from the playground at https://dev.pachca.com/guides/forms/overview', + { itemIndex }, + ); + } + if (Array.isArray(parsed)) return parsed as IDataObject[]; + if (parsed && typeof parsed === 'object' && Array.isArray((parsed as IDataObject).blocks)) { + return (parsed as IDataObject).blocks as IDataObject[]; + } + throw new NodeOperationError(ctx.getNode(), + 'Expected a JSON array of blocks or a form object with a "blocks" array', + { itemIndex }, + ); +} + +/** + * Upload file to S3 using presigned params from POST /uploads. + * Supports URL and binary data sources. Retries on S3 failure. + */ +export async function uploadFileToS3( + ctx: IExecuteFunctions, + itemIndex: number, +): Promise { + // Step 1: Get presigned S3 params + const uploadParams = await makeApiRequest.call(ctx, 'POST', '/uploads', undefined, undefined, itemIndex); + const presigned = uploadParams as IDataObject; + + const fileSource = ctx.getNodeParameter('fileSource', itemIndex, 'binary') as string; + // V2 stores in additionalFields collection; V1 stores as top-level params + const additional = ctx.getNodeParameter('additionalFields', itemIndex, {}) as IDataObject; + const userFileName = (additional.fileName ?? ctx.getNodeParameter('fileName', itemIndex, '')) as string; + const userContentType = (additional.contentType ?? ctx.getNodeParameter('contentType', itemIndex, '')) as string; + + let fileBuffer: Buffer; + let resolvedFileName: string; + + if (fileSource === 'url') { + const fileUrl = ctx.getNodeParameter('fileUrl', itemIndex, '') as string; + fileBuffer = (await ctx.helpers.httpRequest({ + method: 'GET', + url: fileUrl, + encoding: 'arraybuffer', + })) as Buffer; + resolvedFileName = userFileName || fileUrl.split('/').pop()?.split('?')[0] || 'file'; + } else { + const binaryProperty = ctx.getNodeParameter('binaryProperty', itemIndex, 'data') as string; + const binaryData = ctx.helpers.assertBinaryData(itemIndex, binaryProperty); + fileBuffer = await ctx.helpers.getBinaryDataBuffer(itemIndex, binaryProperty); + resolvedFileName = userFileName || binaryData.fileName || 'file'; + } + + const contentType = userContentType || detectMimeType(resolvedFileName); + + // Step 2: Upload to S3 with retry + const MAX_RETRIES = 3; + for (let attempt = 0; attempt < MAX_RETRIES; attempt++) { + const s3Fields: Record = { + 'Content-Type': contentType, + 'Content-Disposition': String(presigned['Content-Disposition']), + acl: String(presigned.acl), + policy: String(presigned.policy), + 'x-amz-credential': String(presigned['x-amz-credential']), + 'x-amz-algorithm': String(presigned['x-amz-algorithm']), + 'x-amz-date': String(presigned['x-amz-date']), + 'x-amz-signature': String(presigned['x-amz-signature']), + key: String(presigned.key).replace('${filename}', resolvedFileName), + }; + + const multipart = buildMultipartBody(s3Fields, fileBuffer, resolvedFileName, contentType); + + try { + await ctx.helpers.httpRequest({ + method: 'POST', + url: String(presigned.direct_url), + body: multipart.body, + headers: { 'Content-Type': multipart.contentType }, + ignoreHttpStatusErrors: false, + }); + break; + } catch (error) { + if (attempt === MAX_RETRIES - 1) throw error; + // Re-request presigned URL on retry (it may have expired) + const retryParams = await makeApiRequest.call(ctx, 'POST', '/uploads', undefined, undefined, itemIndex); + Object.assign(presigned, retryParams); + } + } + + const fileKey = String(presigned.key).replace('${filename}', resolvedFileName); + return { + key: fileKey, + file_name: resolvedFileName, + content_type: contentType, + size: fileBuffer.length, + }; +} + +/** + * Validate and split a comma-separated string into a typed array. + * Throws NodeOperationError with descriptive message for invalid values. + */ +export function splitAndValidateCommaList( + ctx: IExecuteFunctions, + value: string, + fieldName: string, + type: 'int' | 'string', + itemIndex: number, +): (number | string)[] { + const arr = value.split(',').map(s => s.trim()).filter(Boolean); + if (type === 'int') { + const invalid = arr.filter(id => isNaN(Number(id))); + if (invalid.length) { + throw new NodeOperationError(ctx.getNode(), + `${fieldName} must be numbers. Invalid values: ${invalid.join(', ')}`, + { itemIndex }, + ); + } + return arr.map(Number); + } + return arr; +} diff --git a/integrations/n8n/nodes/Pachca/Pachca.node.json b/integrations/n8n/nodes/Pachca/Pachca.node.json new file mode 100644 index 00000000..df9dc174 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/Pachca.node.json @@ -0,0 +1,24 @@ +{ + "categories": [ + "Communication" + ], + "subcategories": { + "Communication": [ + "Team Messaging" + ] + }, + "resources": { + "primaryDocumentation": [ + { + "url": "https://dev.pachca.com/guides/n8n/overview" + } + ] + }, + "alias": [ + "pachca", + "messenger", + "chat", + "team", + "corporate messenger" + ] +} diff --git a/integrations/n8n/nodes/Pachca/Pachca.node.ts b/integrations/n8n/nodes/Pachca/Pachca.node.ts new file mode 100644 index 00000000..159ab020 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/Pachca.node.ts @@ -0,0 +1,25 @@ +import { VersionedNodeType } from 'n8n-workflow'; +import type { INodeTypeBaseDescription } from 'n8n-workflow'; +import { PachcaV1 } from './V1/PachcaV1.node'; +import { PachcaV2 } from './V2/PachcaV2.node'; + +export class Pachca extends VersionedNodeType { + constructor() { + const baseDescription: INodeTypeBaseDescription = { + displayName: 'Pachca', + name: 'pachca', + icon: { light: 'file:pachca.svg', dark: 'file:pachca.dark.svg' }, + group: ['transform'], + subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', + description: 'Interact with Pachca API', + defaultVersion: 2, + }; + + const nodeVersions = { + 1: new PachcaV1(baseDescription), + 2: new PachcaV2(baseDescription), + }; + + super(nodeVersions, baseDescription); + } +} diff --git a/integrations/n8n/nodes/Pachca/PachcaTrigger.node.json b/integrations/n8n/nodes/Pachca/PachcaTrigger.node.json new file mode 100644 index 00000000..df9dc174 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/PachcaTrigger.node.json @@ -0,0 +1,24 @@ +{ + "categories": [ + "Communication" + ], + "subcategories": { + "Communication": [ + "Team Messaging" + ] + }, + "resources": { + "primaryDocumentation": [ + { + "url": "https://dev.pachca.com/guides/n8n/overview" + } + ] + }, + "alias": [ + "pachca", + "messenger", + "chat", + "team", + "corporate messenger" + ] +} diff --git a/integrations/n8n/nodes/Pachca/PachcaTrigger.node.ts b/integrations/n8n/nodes/Pachca/PachcaTrigger.node.ts new file mode 100644 index 00000000..7d8157c3 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/PachcaTrigger.node.ts @@ -0,0 +1,183 @@ +import type { + IDataObject, + IHookFunctions, + INodeType, + INodeTypeDescription, + IWebhookFunctions, + IWebhookResponseData, +} from 'n8n-workflow'; +import { NodeConnectionTypes } from 'n8n-workflow'; +import { verifyWebhookSignature, resolveBotId } from './GenericFunctions'; + +/** Maps n8n event value to webhook payload { type, event } for filtering */ +const EVENT_FILTER: Record = { + 'button_pressed': { type: 'button', event: 'click' }, + 'chat_member_added': { type: 'chat_member', event: 'add' }, + 'chat_member_removed': { type: 'chat_member', event: 'remove' }, + 'form_submitted': { type: 'view', event: 'submit' }, + 'link_shared': { type: 'message', event: 'link_shared' }, + 'message_deleted': { type: 'message', event: 'delete' }, + 'message_updated': { type: 'message', event: 'update' }, + 'new_message': { type: 'message', event: 'new' }, + 'new_reaction': { type: 'reaction', event: 'new' }, + 'reaction_deleted': { type: 'reaction', event: 'delete' }, + 'company_member_activate': { type: 'company_member', event: 'activate' }, + 'company_member_confirm': { type: 'company_member', event: 'confirm' }, + 'company_member_delete': { type: 'company_member', event: 'delete' }, + 'company_member_invite': { type: 'company_member', event: 'invite' }, + 'company_member_suspend': { type: 'company_member', event: 'suspend' }, + 'company_member_update': { type: 'company_member', event: 'update' }, +}; + +export class PachcaTrigger implements INodeType { + description: INodeTypeDescription = { + displayName: 'Pachca Trigger', + name: 'pachcaTrigger', + icon: { light: 'file:pachca.svg', dark: 'file:pachca.dark.svg' }, + group: ['trigger'], + version: 1, + subtitle: '={{$parameter["event"]}}', + description: 'Starts workflow when Pachca events occur', + defaults: { name: 'Pachca Trigger' }, + inputs: [], + outputs: [NodeConnectionTypes.Main], + credentials: [{ name: 'pachcaApi', required: true }], + webhooks: [ + { + name: 'default', + httpMethod: 'POST', + responseMode: 'onReceived', + path: 'webhook', + }, + ], + properties: [ + { + displayName: 'Event', + name: 'event', + type: 'options', + noDataExpression: true, + options: [ + { name: 'All Events', value: '*' }, + { name: 'Button Pressed', value: 'button_pressed' }, + { name: 'Chat Member Added', value: 'chat_member_added' }, + { name: 'Chat Member Removed', value: 'chat_member_removed' }, + { name: 'Form Submitted', value: 'form_submitted' }, + { name: 'Link Shared', value: 'link_shared' }, + { name: 'Message Deleted', value: 'message_deleted' }, + { name: 'Message Updated', value: 'message_updated' }, + { name: 'New Message', value: 'new_message' }, + { name: 'New Reaction', value: 'new_reaction' }, + { name: 'Reaction Deleted', value: 'reaction_deleted' }, + { name: 'User Activated', value: 'company_member_activate' }, + { name: 'User Confirmed', value: 'company_member_confirm' }, + { name: 'User Deleted', value: 'company_member_delete' }, + { name: 'User Invited', value: 'company_member_invite' }, + { name: 'User Suspended', value: 'company_member_suspend' }, + { name: 'User Updated', value: 'company_member_update' }, + ], + default: 'new_message', + description: 'The event to listen for', + }, + ], + usableAsTool: true, + }; + + webhookMethods = { + default: { + async checkExists(this: IHookFunctions): Promise { + const credentials = await this.getCredentials('pachcaApi'); + const botId = await resolveBotId(this, credentials); + if (!botId) return false; + const webhookUrl = this.getNodeWebhookUrl('default'); + try { + const response = (await this.helpers.httpRequestWithAuthentication.call( + this, + 'pachcaApi', + { + method: 'GET', + url: `${credentials.baseUrl}/bots/${botId}`, + }, + )) as IDataObject; + const data = response.data as IDataObject | undefined; + const webhook = data?.webhook as IDataObject | undefined; + return webhook?.outgoing_url === webhookUrl; + } catch { + return false; + } + }, + + async create(this: IHookFunctions): Promise { + const credentials = await this.getCredentials('pachcaApi'); + const botId = await resolveBotId(this, credentials); + if (!botId) return true; // Not a bot token → manual mode + const webhookUrl = this.getNodeWebhookUrl('default'); + await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { + method: 'PUT', + url: `${credentials.baseUrl}/bots/${botId}`, + body: { bot: { webhook: { outgoing_url: webhookUrl } } }, + }); + return true; + }, + + async delete(this: IHookFunctions): Promise { + const credentials = await this.getCredentials('pachcaApi'); + const botId = await resolveBotId(this, credentials); + if (!botId) return true; + try { + await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { + method: 'PUT', + url: `${credentials.baseUrl}/bots/${botId}`, + body: { bot: { webhook: { outgoing_url: '' } } }, + }); + } catch { + // Ignore errors on cleanup + } + return true; + }, + }, + }; + + async webhook(this: IWebhookFunctions): Promise { + const body = this.getBodyData() as IDataObject; + const headerData = this.getHeaderData() as IDataObject; + const credentials = await this.getCredentials('pachcaApi'); + const event = this.getNodeParameter('event') as string; + + // Signing secret verification (use raw body bytes for accurate HMAC) + if (credentials.signingSecret) { + const signature = headerData['x-pachca-signature'] as string; + if (!signature) { + return { webhookResponse: 'Missing signature' }; + } + const request = this.getRequestObject(); + const rawBody = request.rawBody + ? request.rawBody.toString() + : JSON.stringify(body); + if ( + !verifyWebhookSignature( + rawBody, + signature, + credentials.signingSecret as string, + ) + ) { + return { webhookResponse: 'Invalid signature' }; + } + } + + // Event filtering using type+event from payload + if (event !== '*') { + const filter = EVENT_FILTER[event]; + if (filter) { + const bodyType = body.type as string | undefined; + const bodyEvent = body.event as string | undefined; + if (bodyType !== filter.type || bodyEvent !== filter.event) { + return { webhookResponse: 'Event filtered' }; + } + } + } + + return { + workflowData: [this.helpers.returnJsonArray(body)], + }; + } +} diff --git a/integrations/n8n/nodes/Pachca/SharedRouter.ts b/integrations/n8n/nodes/Pachca/SharedRouter.ts new file mode 100644 index 00000000..79b7984f --- /dev/null +++ b/integrations/n8n/nodes/Pachca/SharedRouter.ts @@ -0,0 +1,968 @@ +// ============================================================================ +// SharedRouter.ts — Generated execute() dispatcher for Pachca node (shared by V1 and V2) +// DO NOT EDIT — this file is auto-generated by generate-n8n.ts +// ============================================================================ + +import type { IExecuteFunctions, INodeExecutionData, IDataObject, IHttpRequestMethods } from 'n8n-workflow'; +import { + makeApiRequest, + makeApiRequestAllPages, + resolveResourceLocator, + buildButtonRows, + cleanFileAttachments, + resolveFormBlocksFromParams, + uploadFileToS3, + splitAndValidateCommaList, + simplifyItem, + FORM_TEMPLATES, +} from './GenericFunctions'; + +// ============================================================================ +// Types +// ============================================================================ + +interface PathParam { + api: string; + n8n: string; + locator?: boolean; + v1Fallback?: string; +} + +interface FieldMap { + api: string; + n8n: string; + isArray?: boolean; + arrayType?: 'int' | 'string'; + locator?: boolean; + subKey?: string; +} + +interface QueryMap { + api: string; + n8n: string; + locator?: boolean; +} + +interface RouteConfig { + method: IHttpRequestMethods; + path: string; + pathParams?: PathParam[]; + wrapperKey?: string; + siblingFields?: string[]; + paginated?: boolean; + noDataWrapper?: boolean; + bodyMap?: FieldMap[]; + optionalBodyMap?: FieldMap[]; + queryMap?: QueryMap[]; + optionalQueryMap?: QueryMap[]; + v1Collection?: string; + special?: string; +} + +// ============================================================================ +// V1 Compatibility Maps +// ============================================================================ + +/** v1 resource name → v2 resource name */ +const V1_RESOURCE_MAP: Record = { + customFields: 'customProperty', + status: 'profile', + reactions: 'reaction', +}; + +/** v1 operation name → v2 operation name (per v2 resource) */ +const V1_OP_MAP: Record> = { + message: { send: 'create', getById: 'get' }, + user: { getById: 'get' }, + chat: { getById: 'get' }, + groupTag: { getById: 'get', getUsers: 'getAllUsers' }, + profile: { getProfile: 'get' }, + customProperty: { getCustomProperties: 'get' }, + reaction: { addReaction: 'create', deleteReaction: 'delete', getReactions: 'getAll' }, + thread: { createThread: 'create', getThread: 'get' }, + form: { createView: 'create' }, + file: { upload: 'create' }, +}; + +// ============================================================================ +// Routes Table +// ============================================================================ + +const ROUTES: Record> = { + security: { + getAll: { + method: 'GET' as IHttpRequestMethods, + path: '/audit_events', + paginated: true, + optionalQueryMap: [{ api: 'start_time', n8n: 'startTime' }, { api: 'end_time', n8n: 'endTime' }, { api: 'event_key', n8n: 'eventKey' }, { api: 'actor_id', n8n: 'actorId' }, { api: 'actor_type', n8n: 'actorType' }, { api: 'entity_id', n8n: 'entityId' }, { api: 'entity_type', n8n: 'entityType' }], + }, + }, + bot: { + update: { + method: 'PUT' as IHttpRequestMethods, + path: '/bots/{id}', + pathParams: [{ api: 'id', n8n: 'botId' }], + wrapperKey: 'bot', + special: 'botWebhook', + }, + getAllEvents: { + method: 'GET' as IHttpRequestMethods, + path: '/webhooks/events', + paginated: true, + }, + removeEvents: { + method: 'DELETE' as IHttpRequestMethods, + path: '/webhooks/events/{id}', + pathParams: [{ api: 'id', n8n: 'id' }], + }, + }, + chat: { + create: { + method: 'POST' as IHttpRequestMethods, + path: '/chats', + wrapperKey: 'chat', + bodyMap: [ + { api: 'name', n8n: 'chatName' }, + ], + optionalBodyMap: [ + { api: 'member_ids', n8n: 'memberIds', isArray: true, arrayType: 'int' }, + { api: 'group_tag_ids', n8n: 'groupTagIds', isArray: true, arrayType: 'int' }, + { api: 'channel', n8n: 'channel' }, + { api: 'public', n8n: 'public' }, + ], + }, + getAll: { + method: 'GET' as IHttpRequestMethods, + path: '/chats', + paginated: true, + queryMap: [{ api: 'availability', n8n: 'availability' }, { api: 'last_message_at_after', n8n: 'lastMessageAtAfter' }, { api: 'last_message_at_before', n8n: 'lastMessageAtBefore' }, { api: 'personal', n8n: 'personal' }], + }, + get: { + method: 'GET' as IHttpRequestMethods, + path: '/chats/{id}', + pathParams: [{ api: 'id', n8n: 'id', locator: true, v1Fallback: 'chatId' }], + }, + update: { + method: 'PUT' as IHttpRequestMethods, + path: '/chats/{id}', + pathParams: [{ api: 'id', n8n: 'id', locator: true, v1Fallback: 'chatId' }], + wrapperKey: 'chat', + optionalBodyMap: [ + { api: 'name', n8n: 'chatName' }, + { api: 'public', n8n: 'public' }, + ], + }, + archive: { + method: 'PUT' as IHttpRequestMethods, + path: '/chats/{id}/archive', + pathParams: [{ api: 'id', n8n: 'id', locator: true, v1Fallback: 'chatId' }], + }, + unarchive: { + method: 'PUT' as IHttpRequestMethods, + path: '/chats/{id}/unarchive', + pathParams: [{ api: 'id', n8n: 'id', locator: true, v1Fallback: 'chatId' }], + }, + getMembers: { + method: 'GET' as IHttpRequestMethods, + path: '/chats/{chatId}/members', + pathParams: [{ api: 'chatId', n8n: 'chatId' }], + paginated: true, + v1Collection: 'chatMembersOptions', + optionalQueryMap: [{ api: 'role', n8n: 'role' }], + }, + addUsers: { + method: 'POST' as IHttpRequestMethods, + path: '/chats/{chatId}/members', + pathParams: [{ api: 'chatId', n8n: 'chatId' }], + bodyMap: [{ api: 'member_ids', n8n: 'memberIds', isArray: true, arrayType: 'int' }, { api: 'silent', n8n: 'silent' }], + }, + removeUser: { + method: 'DELETE' as IHttpRequestMethods, + path: '/chats/{chatId}/members/{userId}', + pathParams: [{ api: 'chatId', n8n: 'chatId' }, { api: 'userId', n8n: 'userId' }], + }, + updateRole: { + method: 'PUT' as IHttpRequestMethods, + path: '/chats/{chatId}/members/{userId}', + pathParams: [{ api: 'chatId', n8n: 'chatId' }, { api: 'userId', n8n: 'userId' }], + bodyMap: [{ api: 'role', n8n: 'newRole' }], + }, + leaveChat: { + method: 'DELETE' as IHttpRequestMethods, + path: '/chats/{chatId}/leave', + pathParams: [{ api: 'chatId', n8n: 'chatId' }], + }, + }, + member: { + addGroupTags: { + method: 'POST' as IHttpRequestMethods, + path: '/chats/{id}/group_tags', + pathParams: [{ api: 'id', n8n: 'id', locator: true }], + bodyMap: [ + { api: 'group_tag_ids', n8n: 'groupTagIds', isArray: true, arrayType: 'int' }, + ], + }, + removeGroupTags: { + method: 'DELETE' as IHttpRequestMethods, + path: '/chats/{id}/group_tags/{tag_id}', + pathParams: [{ api: 'id', n8n: 'id', locator: true }, { api: 'tag_id', n8n: 'tagId' }], + }, + leave: { + method: 'DELETE' as IHttpRequestMethods, + path: '/chats/{id}/leave', + pathParams: [{ api: 'id', n8n: 'id', locator: true }], + }, + getAll: { + method: 'GET' as IHttpRequestMethods, + path: '/chats/{id}/members', + pathParams: [{ api: 'id', n8n: 'id', locator: true }], + paginated: true, + queryMap: [{ api: 'role', n8n: 'role' }], + }, + create: { + method: 'POST' as IHttpRequestMethods, + path: '/chats/{id}/members', + pathParams: [{ api: 'id', n8n: 'id', locator: true }], + bodyMap: [ + { api: 'member_ids', n8n: 'memberIds', isArray: true, arrayType: 'int' }, + ], + optionalBodyMap: [ + { api: 'silent', n8n: 'silent' }, + ], + }, + delete: { + method: 'DELETE' as IHttpRequestMethods, + path: '/chats/{id}/members/{user_id}', + pathParams: [{ api: 'id', n8n: 'id', locator: true }, { api: 'user_id', n8n: 'userId', locator: true }], + }, + update: { + method: 'PUT' as IHttpRequestMethods, + path: '/chats/{id}/members/{user_id}', + pathParams: [{ api: 'id', n8n: 'id', locator: true }, { api: 'user_id', n8n: 'userId', locator: true }], + bodyMap: [ + { api: 'role', n8n: 'role' }, + ], + }, + }, + groupTag: { + create: { + method: 'POST' as IHttpRequestMethods, + path: '/group_tags', + wrapperKey: 'group_tag', + bodyMap: [ + { api: 'name', n8n: 'groupTagName' }, + ], + optionalBodyMap: [ + { api: 'color', n8n: 'groupTagColor' }, + ], + }, + getAll: { + method: 'GET' as IHttpRequestMethods, + path: '/group_tags', + paginated: true, + queryMap: [{ api: 'names', n8n: 'names' }], + }, + get: { + method: 'GET' as IHttpRequestMethods, + path: '/group_tags/{id}', + pathParams: [{ api: 'id', n8n: 'groupTagId' }], + }, + update: { + method: 'PUT' as IHttpRequestMethods, + path: '/group_tags/{id}', + pathParams: [{ api: 'id', n8n: 'groupTagId' }], + wrapperKey: 'group_tag', + bodyMap: [ + { api: 'name', n8n: 'groupTagName' }, + ], + optionalBodyMap: [ + { api: 'color', n8n: 'groupTagColor' }, + ], + }, + delete: { + method: 'DELETE' as IHttpRequestMethods, + path: '/group_tags/{id}', + pathParams: [{ api: 'id', n8n: 'groupTagId' }], + }, + getAllUsers: { + method: 'GET' as IHttpRequestMethods, + path: '/group_tags/{id}/users', + pathParams: [{ api: 'id', n8n: 'groupTagId' }], + paginated: true, + }, + addTags: { + method: 'POST' as IHttpRequestMethods, + path: '/chats/{groupTagChatId}/group_tags', + pathParams: [{ api: 'groupTagChatId', n8n: 'groupTagChatId' }], + bodyMap: [{ api: 'group_tag_ids', n8n: 'groupTagIds', isArray: true, arrayType: 'int' }], + }, + removeTag: { + method: 'DELETE' as IHttpRequestMethods, + path: '/chats/{groupTagChatId}/group_tags/{tagId}', + pathParams: [{ api: 'groupTagChatId', n8n: 'groupTagChatId' }, { api: 'tagId', n8n: 'tagId' }], + }, + }, + message: { + create: { + method: 'POST' as IHttpRequestMethods, + path: '/messages', + wrapperKey: 'message', + siblingFields: ['link_preview'], + special: 'messageButtons', + bodyMap: [ + { api: 'entity_type', n8n: 'entityType' }, + { api: 'entity_id', n8n: 'entityId', locator: true }, + { api: 'content', n8n: 'content' }, + ], + optionalBodyMap: [ + { api: 'files', n8n: 'files', subKey: 'file' }, + { api: 'parent_message_id', n8n: 'parentMessageId' }, + { api: 'display_avatar_url', n8n: 'displayAvatarUrl' }, + { api: 'display_name', n8n: 'displayName' }, + { api: 'skip_invite_mentions', n8n: 'skipInviteMentions' }, + { api: 'link_preview', n8n: 'linkPreview' }, + ], + }, + getAll: { + method: 'GET' as IHttpRequestMethods, + path: '/messages', + paginated: true, + queryMap: [{ api: 'chat_id', n8n: 'chatId', locator: true }], + }, + get: { + method: 'GET' as IHttpRequestMethods, + path: '/messages/{id}', + pathParams: [{ api: 'id', n8n: 'id', v1Fallback: 'messageId' }], + }, + update: { + method: 'PUT' as IHttpRequestMethods, + path: '/messages/{id}', + pathParams: [{ api: 'id', n8n: 'id', v1Fallback: 'messageId' }], + wrapperKey: 'message', + special: 'messageButtons', + optionalBodyMap: [ + { api: 'content', n8n: 'content' }, + { api: 'files', n8n: 'files', subKey: 'file' }, + { api: 'display_avatar_url', n8n: 'displayAvatarUrl' }, + { api: 'display_name', n8n: 'displayName' }, + ], + }, + delete: { + method: 'DELETE' as IHttpRequestMethods, + path: '/messages/{id}', + pathParams: [{ api: 'id', n8n: 'id', v1Fallback: 'messageId' }], + }, + pin: { + method: 'POST' as IHttpRequestMethods, + path: '/messages/{id}/pin', + pathParams: [{ api: 'id', n8n: 'id', v1Fallback: 'messageId' }], + }, + unpin: { + method: 'DELETE' as IHttpRequestMethods, + path: '/messages/{id}/pin', + pathParams: [{ api: 'id', n8n: 'id', v1Fallback: 'messageId' }], + }, + getReadMembers: { + method: 'GET' as IHttpRequestMethods, + path: '/messages/{messageId}/read_member_ids', + pathParams: [{ api: 'messageId', n8n: 'messageId' }], + paginated: true, + v1Collection: 'readMembersOptions', + }, + unfurl: { + method: 'POST' as IHttpRequestMethods, + path: '/messages/{messageId}/link_previews', + pathParams: [{ api: 'messageId', n8n: 'messageId' }], + special: 'unfurlLinkPreviews', + bodyMap: [{ api: 'link_previews', n8n: 'linkPreviews' }], + }, + }, + linkPreview: { + create: { + method: 'POST' as IHttpRequestMethods, + path: '/messages/{id}/link_previews', + pathParams: [{ api: 'id', n8n: 'id' }], + bodyMap: [ + { api: 'link_previews', n8n: 'linkPreviews' }, + ], + }, + }, + reaction: { + create: { + method: 'POST' as IHttpRequestMethods, + path: '/messages/{id}/reactions', + pathParams: [{ api: 'id', n8n: 'reactionsMessageId' }], + bodyMap: [ + { api: 'code', n8n: 'reactionsReactionCode' }, + ], + optionalBodyMap: [ + { api: 'name', n8n: 'name' }, + ], + }, + delete: { + method: 'DELETE' as IHttpRequestMethods, + path: '/messages/{id}/reactions', + pathParams: [{ api: 'id', n8n: 'reactionsMessageId' }], + queryMap: [{ api: 'code', n8n: 'reactionsReactionCode' }, { api: 'name', n8n: 'name' }], + }, + getAll: { + method: 'GET' as IHttpRequestMethods, + path: '/messages/{id}/reactions', + pathParams: [{ api: 'id', n8n: 'reactionsMessageId' }], + paginated: true, + v1Collection: 'reactionsOptions', + }, + }, + readMember: { + getAllReadMemberIds: { + method: 'GET' as IHttpRequestMethods, + path: '/messages/{id}/read_member_ids', + pathParams: [{ api: 'id', n8n: 'id' }], + paginated: true, + }, + }, + thread: { + create: { + method: 'POST' as IHttpRequestMethods, + path: '/messages/{id}/thread', + pathParams: [{ api: 'id', n8n: 'threadMessageId' }], + }, + get: { + method: 'GET' as IHttpRequestMethods, + path: '/threads/{id}', + pathParams: [{ api: 'id', n8n: 'threadThreadId' }], + }, + }, + profile: { + getInfo: { + method: 'GET' as IHttpRequestMethods, + path: '/oauth/token/info', + }, + get: { + method: 'GET' as IHttpRequestMethods, + path: '/profile', + }, + getStatus: { + method: 'GET' as IHttpRequestMethods, + path: '/profile/status', + }, + updateStatus: { + method: 'PUT' as IHttpRequestMethods, + path: '/profile/status', + wrapperKey: 'status', + bodyMap: [ + { api: 'emoji', n8n: 'statusEmoji' }, + { api: 'title', n8n: 'statusTitle' }, + ], + optionalBodyMap: [ + { api: 'expires_at', n8n: 'statusExpiresAt' }, + { api: 'is_away', n8n: 'isAway' }, + { api: 'away_message', n8n: 'awayMessage' }, + ], + }, + deleteStatus: { + method: 'DELETE' as IHttpRequestMethods, + path: '/profile/status', + }, + }, + search: { + getAllChats: { + method: 'GET' as IHttpRequestMethods, + path: '/search/chats', + paginated: true, + queryMap: [{ api: 'query', n8n: 'query' }], + optionalQueryMap: [{ api: 'order', n8n: 'order' }, { api: 'created_from', n8n: 'createdFrom' }, { api: 'created_to', n8n: 'createdTo' }, { api: 'active', n8n: 'active' }, { api: 'chat_subtype', n8n: 'chatSubtype' }, { api: 'personal', n8n: 'personal' }], + }, + getAllMessages: { + method: 'GET' as IHttpRequestMethods, + path: '/search/messages', + paginated: true, + queryMap: [{ api: 'query', n8n: 'query' }], + optionalQueryMap: [{ api: 'order', n8n: 'order' }, { api: 'created_from', n8n: 'createdFrom' }, { api: 'created_to', n8n: 'createdTo' }, { api: 'chat_ids', n8n: 'chatIds' }, { api: 'user_ids', n8n: 'userIds' }, { api: 'active', n8n: 'active' }], + }, + getAllUsers: { + method: 'GET' as IHttpRequestMethods, + path: '/search/users', + paginated: true, + queryMap: [{ api: 'query', n8n: 'query' }], + optionalQueryMap: [{ api: 'sort', n8n: 'sort' }, { api: 'order', n8n: 'order' }, { api: 'created_from', n8n: 'createdFrom' }, { api: 'created_to', n8n: 'createdTo' }, { api: 'company_roles', n8n: 'companyRoles' }], + }, + }, + task: { + create: { + method: 'POST' as IHttpRequestMethods, + path: '/tasks', + wrapperKey: 'task', + bodyMap: [ + { api: 'kind', n8n: 'taskKind' }, + ], + optionalBodyMap: [ + { api: 'content', n8n: 'taskContent' }, + { api: 'due_at', n8n: 'taskDueAt' }, + { api: 'priority', n8n: 'taskPriority' }, + { api: 'performer_ids', n8n: 'performerIds', isArray: true, arrayType: 'int' }, + { api: 'chat_id', n8n: 'chatId' }, + { api: 'all_day', n8n: 'allDay' }, + { api: 'custom_properties', n8n: 'customProperties', subKey: 'property' }, + ], + }, + getAll: { + method: 'GET' as IHttpRequestMethods, + path: '/tasks', + paginated: true, + }, + get: { + method: 'GET' as IHttpRequestMethods, + path: '/tasks/{id}', + pathParams: [{ api: 'id', n8n: 'id' }], + }, + update: { + method: 'PUT' as IHttpRequestMethods, + path: '/tasks/{id}', + pathParams: [{ api: 'id', n8n: 'id' }], + wrapperKey: 'task', + optionalBodyMap: [ + { api: 'kind', n8n: 'kind' }, + { api: 'content', n8n: 'content' }, + { api: 'due_at', n8n: 'dueAt' }, + { api: 'priority', n8n: 'priority' }, + { api: 'performer_ids', n8n: 'performerIds', isArray: true, arrayType: 'int' }, + { api: 'status', n8n: 'status' }, + { api: 'all_day', n8n: 'allDay' }, + { api: 'done_at', n8n: 'doneAt' }, + { api: 'custom_properties', n8n: 'customProperties', subKey: 'property' }, + ], + }, + delete: { + method: 'DELETE' as IHttpRequestMethods, + path: '/tasks/{id}', + pathParams: [{ api: 'id', n8n: 'id' }], + }, + }, + user: { + create: { + method: 'POST' as IHttpRequestMethods, + path: '/users', + wrapperKey: 'user', + siblingFields: ['skip_email_notify'], + bodyMap: [ + { api: 'email', n8n: 'email' }, + ], + optionalBodyMap: [ + { api: 'first_name', n8n: 'firstName' }, + { api: 'last_name', n8n: 'lastName' }, + { api: 'phone_number', n8n: 'phoneNumber' }, + { api: 'nickname', n8n: 'nickname' }, + { api: 'department', n8n: 'department' }, + { api: 'title', n8n: 'title' }, + { api: 'role', n8n: 'role' }, + { api: 'suspended', n8n: 'suspended' }, + { api: 'list_tags', n8n: 'listTags', isArray: true, arrayType: 'string' }, + { api: 'custom_properties', n8n: 'customProperties', subKey: 'property' }, + { api: 'skip_email_notify', n8n: 'skipEmailNotify' }, + ], + }, + getAll: { + method: 'GET' as IHttpRequestMethods, + path: '/users', + paginated: true, + special: 'userGetAllFilters', + v1Collection: 'additionalOptions', + optionalQueryMap: [{ api: 'query', n8n: 'query' }], + }, + get: { + method: 'GET' as IHttpRequestMethods, + path: '/users/{id}', + pathParams: [{ api: 'id', n8n: 'id', locator: true, v1Fallback: 'userId' }], + }, + update: { + method: 'PUT' as IHttpRequestMethods, + path: '/users/{id}', + pathParams: [{ api: 'id', n8n: 'id', locator: true, v1Fallback: 'userId' }], + wrapperKey: 'user', + optionalBodyMap: [ + { api: 'first_name', n8n: 'firstName' }, + { api: 'last_name', n8n: 'lastName' }, + { api: 'email', n8n: 'email' }, + { api: 'phone_number', n8n: 'phoneNumber' }, + { api: 'nickname', n8n: 'nickname' }, + { api: 'department', n8n: 'department' }, + { api: 'title', n8n: 'title' }, + { api: 'role', n8n: 'role' }, + { api: 'suspended', n8n: 'suspended' }, + { api: 'list_tags', n8n: 'listTags', isArray: true, arrayType: 'string' }, + { api: 'custom_properties', n8n: 'customProperties', subKey: 'property' }, + ], + }, + delete: { + method: 'DELETE' as IHttpRequestMethods, + path: '/users/{id}', + pathParams: [{ api: 'id', n8n: 'id', locator: true, v1Fallback: 'userId' }], + }, + getStatus: { + method: 'GET' as IHttpRequestMethods, + path: '/users/{user_id}/status', + pathParams: [{ api: 'user_id', n8n: 'userId' }], + }, + updateStatus: { + method: 'PUT' as IHttpRequestMethods, + path: '/users/{user_id}/status', + pathParams: [{ api: 'user_id', n8n: 'userId' }], + wrapperKey: 'status', + bodyMap: [ + { api: 'emoji', n8n: 'emoji' }, + { api: 'title', n8n: 'title' }, + ], + optionalBodyMap: [ + { api: 'expires_at', n8n: 'expiresAt' }, + { api: 'is_away', n8n: 'isAway' }, + { api: 'away_message', n8n: 'awayMessage' }, + ], + }, + deleteStatus: { + method: 'DELETE' as IHttpRequestMethods, + path: '/users/{user_id}/status', + pathParams: [{ api: 'user_id', n8n: 'userId' }], + }, + }, + form: { + create: { + method: 'POST' as IHttpRequestMethods, + path: '/views/open', + wrapperKey: 'view', + siblingFields: ['type', 'trigger_id', 'private_metadata', 'callback_id'], + special: 'formBlocks', + bodyMap: [ + { api: 'title', n8n: 'formTitle' }, + { api: 'type', n8n: 'type' }, + { api: 'trigger_id', n8n: 'triggerId' }, + ], + optionalBodyMap: [ + { api: 'close_text', n8n: 'closeText' }, + { api: 'submit_text', n8n: 'submitText' }, + { api: 'private_metadata', n8n: 'privateMetadata' }, + { api: 'callback_id', n8n: 'callbackId' }, + ], + }, + processSubmission: { + method: 'GET' as IHttpRequestMethods, + path: '/profile', + special: 'formProcessSubmission', + }, + getTemplates: { + method: 'GET' as IHttpRequestMethods, + path: '/profile', + special: 'formGetTemplates', + }, + }, + export: { + create: { + method: 'POST' as IHttpRequestMethods, + path: '/chats/exports', + noDataWrapper: true, + bodyMap: [ + { api: 'start_at', n8n: 'startAt' }, + { api: 'end_at', n8n: 'endAt' }, + { api: 'webhook_url', n8n: 'webhookUrl' }, + ], + optionalBodyMap: [ + { api: 'chat_ids', n8n: 'chatIds', isArray: true, arrayType: 'int' }, + { api: 'skip_chats_file', n8n: 'skipChatsFile' }, + ], + }, + get: { + method: 'GET' as IHttpRequestMethods, + path: '/chats/exports/{id}', + pathParams: [{ api: 'id', n8n: 'id' }], + noDataWrapper: true, + }, + }, + customProperty: { + get: { + method: 'GET' as IHttpRequestMethods, + path: '/custom_properties', + queryMap: [{ api: 'entity_type', n8n: 'entityType' }], + }, + }, + file: { + create: { + method: 'POST' as IHttpRequestMethods, + path: '/uploads', + special: 'fileUpload', + }, + }, +}; + +// ============================================================================ +// Router Entry Point +// ============================================================================ + +export async function router(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const returnData: INodeExecutionData[] = []; + const nodeVersion = this.getNode().typeVersion; + + for (let i = 0; i < items.length; i++) { + try { + let resource = this.getNodeParameter('resource', i) as string; + let operation = this.getNodeParameter('operation', i) as string; + + // v1 compat: map old resource/operation names to v2 + if (nodeVersion === 1) { + resource = V1_RESOURCE_MAP[resource] ?? resource; + operation = V1_OP_MAP[resource]?.[operation] ?? operation; + } + + const route = ROUTES[resource]?.[operation]; + if (!route) { + throw new Error(`Unknown operation: ${resource}.${operation}`); + } + + const result = await executeRoute.call(this, route, resource, i, nodeVersion); + returnData.push(...result.map(item => ({ ...item, pairedItem: { item: i } }))); + } catch (error) { + if (this.continueOnFail()) { + returnData.push({ json: { error: (error as Error).message }, pairedItem: { item: i } }); + } else { + throw error; + } + } + } + + return [returnData]; +} + +// ============================================================================ +// Generic Route Executor +// ============================================================================ + +async function executeRoute( + this: IExecuteFunctions, + route: RouteConfig, + resource: string, + i: number, + nodeVersion: number, +): Promise { + // === Special-only operations (no API call needed) === + if (route.special === 'fileUpload') { + const result = await uploadFileToS3(this, i); + return [{ json: result }]; + } + if (route.special === 'formProcessSubmission') { + // v1 only: pass through form submission data from webhook input + const inputData = this.getInputData()[i].json; + return [{ json: inputData }]; + } + if (route.special === 'formGetTemplates') { + return Object.entries(FORM_TEMPLATES).map(([key, blocks]) => ({ + json: { name: key, blocks } as unknown as IDataObject, + })); + } + + // === Build URL with path params === + let url = route.path; + for (const pp of route.pathParams ?? []) { + let value: number | string; + if (pp.locator) { + value = resolveResourceLocator(this, pp.n8n, i, pp.v1Fallback); + } else { + try { + value = this.getNodeParameter(pp.n8n, i) as number; + } catch (e) { + if (pp.v1Fallback) { + value = this.getNodeParameter(pp.v1Fallback, i) as number; + } else { + throw e; + } + } + } + url = url.replace(`{${pp.api}}`, String(value)); + } + + // === Build body from required fields === + const body: IDataObject = {}; + for (const fm of route.bodyMap ?? []) { + let raw: unknown; + if (fm.locator) { + raw = resolveResourceLocator(this, fm.n8n, i); + } else { + raw = this.getNodeParameter(fm.n8n, i); + } + if (fm.isArray && typeof raw === 'string') { + body[fm.api] = splitAndValidateCommaList(this, raw, fm.n8n, fm.arrayType!, i); + } else { + body[fm.api] = raw as IDataObject; + } + } + + // === Read optional body fields from collection === + const collectionName = (nodeVersion === 1 && route.v1Collection) ? route.v1Collection : 'additionalFields'; + let additional: IDataObject = {}; + try { additional = this.getNodeParameter(collectionName, i, {}) as IDataObject; } catch { /* no collection */ } + + for (const fm of route.optionalBodyMap ?? []) { + let val: unknown = additional[fm.n8n]; + + // If not in collection, try as top-level param (v1 compat for V1_TOP_LEVEL_PARAMS) + if (val === undefined) { + try { val = this.getNodeParameter(fm.n8n, i, undefined); } catch { /* not present */ } + } + + if (val === undefined || val === null || val === '') continue; + + // fixedCollection: extract inner array using subKey + if (fm.subKey && typeof val === 'object' && !Array.isArray(val)) { + val = (val as IDataObject)[fm.subKey] ?? val; + } + if (fm.isArray && typeof val === 'string') { + body[fm.api] = splitAndValidateCommaList(this, val, fm.n8n, fm.arrayType!, i); + } else if (fm.locator && typeof val === 'object' && val !== null && (val as IDataObject).__rl) { + body[fm.api] = (val as IDataObject).value; + } else { + body[fm.api] = val as IDataObject; + } + } + + // === Read top-level query params === + const qs: IDataObject = {}; + for (const qm of route.queryMap ?? []) { + try { + let val: unknown; + if (qm.locator) { + val = resolveResourceLocator(this, qm.n8n, i); + } else { + val = this.getNodeParameter(qm.n8n, i); + } + if (val !== undefined && val !== null && val !== '') qs[qm.api] = val as IDataObject; + } catch { /* param not shown / not filled */ } + } + + // Read query params from collection, with top-level fallback (same pattern as optionalBodyMap) + for (const qm of route.optionalQueryMap ?? []) { + let val: unknown = additional[qm.n8n]; + if (val === undefined) { + try { val = this.getNodeParameter(qm.n8n, i, undefined); } catch { /* not present */ } + } + if (val !== undefined && val !== null && val !== '') qs[qm.api] = val; + } + + // === Special handlers === + if (route.special === 'messageButtons') { + const buttons = buildButtonRows(this, i); + if (buttons.length) body.buttons = buttons; + const files = cleanFileAttachments(this, i); + if (files.length) body.files = files; + } + if (route.special === 'formBlocks') { + const blocks = resolveFormBlocksFromParams(this, i); + if (blocks.length) body.blocks = blocks; + } + if (route.special === 'unfurlLinkPreviews') { + // v1 compat: linkPreviews was a fixedCollection { preview: [{ url, title, description, imageUrl }] } + // v2: linkPreviews is a JSON string. API expects { "url": { title, description, image_url } } + const raw = body.link_previews; + if (raw && typeof raw === 'object' && !Array.isArray(raw) && (raw as IDataObject).preview) { + const previews = (raw as IDataObject).preview as IDataObject[]; + const converted: IDataObject = {}; + for (const p of previews) { + if (!p.url) continue; + const entry: IDataObject = {}; + if (p.title) entry.title = p.title; + if (p.description) entry.description = p.description; + if (p.imageUrl) entry.image_url = p.imageUrl; + converted[p.url as string] = entry; + } + body.link_previews = converted; + } else if (typeof raw === 'string') { + try { body.link_previews = JSON.parse(raw); } catch { /* leave as-is */ } + } + } + if (route.special === 'botWebhook') { + let webhookUrl: string | undefined; + try { webhookUrl = this.getNodeParameter('webhookUrl', i, '') as string; } catch { /* */ } + if (webhookUrl) { + body.webhook = { outgoing_url: webhookUrl }; + } + } + + // === Wrap body in key === + let finalBody: IDataObject | undefined; + if (Object.keys(body).length > 0) { + if (route.wrapperKey) { + const inner: IDataObject = {}; + const outer: IDataObject = {}; + const siblingSet = new Set(route.siblingFields ?? []); + for (const [k, v] of Object.entries(body)) { + if (siblingSet.has(k)) { + outer[k] = v; + } else { + inner[k] = v; + } + } + finalBody = { [route.wrapperKey]: inner, ...outer }; + } else { + finalBody = body; + } + } + + // === Execute API call === + if (route.paginated) { + let results = await makeApiRequestAllPages.call( + this, route.method, url, qs, i, resource, nodeVersion, + ); + + // v1 client-side post-filters for user.getAll + if (route.special === 'userGetAllFilters' && nodeVersion === 1) { + let filterOptions: IDataObject = {}; + try { filterOptions = this.getNodeParameter('filterOptions', i, {}) as IDataObject; } catch { /* */ } + + const filterRole = filterOptions.filterRole as string[] | undefined; + const filterBot = filterOptions.filterBot as string | undefined; + const filterSuspended = filterOptions.filterSuspended as string | undefined; + const filterInviteStatus = filterOptions.filterInviteStatus as string[] | undefined; + + if (filterRole?.length || (filterBot && filterBot !== 'all') || + (filterSuspended && filterSuspended !== 'all') || filterInviteStatus?.length) { + results = results.filter(item => { + const d = item.json; + if (filterRole?.length && !filterRole.includes(d.role as string)) return false; + if (filterBot === 'users' && d.bot === true) return false; + if (filterBot === 'bots' && d.bot !== true) return false; + if (filterSuspended === 'active' && d.suspended === true) return false; + if (filterSuspended === 'suspended' && d.suspended !== true) return false; + if (filterInviteStatus?.length && !filterInviteStatus.includes(d.invite_status as string)) return false; + return true; + }); + } + } + + return results; + } + + const response = await makeApiRequest.call( + this, route.method, url, finalBody, + Object.keys(qs).length > 0 ? qs : undefined, i, + ); + + // === Handle response === + if (route.method === 'DELETE') { + return [{ json: { success: true } }]; + } + + if (route.noDataWrapper) { + return [{ json: response }]; + } + + const data = (response.data as IDataObject) ?? response; + + // Simplify for GET single item (v2 only) + if (nodeVersion >= 2 && route.method === 'GET' && !route.paginated) { + let doSimplify = false; + try { doSimplify = this.getNodeParameter('simplify', i, false) as boolean; } catch { /* */ } + if (doSimplify) { + return [{ json: simplifyItem(data, resource) }]; + } + } + + return [{ json: data }]; +} diff --git a/integrations/n8n/nodes/Pachca/V1/BotDescription.ts b/integrations/n8n/nodes/Pachca/V1/BotDescription.ts new file mode 100644 index 00000000..aff3e9a0 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V1/BotDescription.ts @@ -0,0 +1,58 @@ +// ============================================================================ +// BotDescription.ts — FROZEN V1 description (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { INodeProperties } from 'n8n-workflow'; + +export const botOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + options: [ + { + name: 'Update a bot', + value: 'update', + action: 'Update a bot', + description: 'Edit bot settings', + }, + ], + default: 'update', + displayOptions: { + show: { + resource: ['bot'], + }, + }, + }, +]; + +export const botFields: INodeProperties[] = [ + { + displayName: 'Bot ID', + name: 'botId', + type: 'number', + default: 1, + description: 'Bot ID to edit', + displayOptions: { + show: { + resource: ['bot'], + operation: ['update'], + }, + }, + }, + { + displayName: 'Webhook URL', + name: 'webhookUrl', + type: 'string', + default: '', + description: 'Outgoing webhook URL', + displayOptions: { + show: { + resource: ['bot'], + operation: ['update'], + }, + }, + }, +]; diff --git a/integrations/n8n/nodes/Pachca/V1/ChatDescription.ts b/integrations/n8n/nodes/Pachca/V1/ChatDescription.ts new file mode 100644 index 00000000..8d1b8eb6 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V1/ChatDescription.ts @@ -0,0 +1,305 @@ +// ============================================================================ +// ChatDescription.ts — FROZEN V1 description (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { INodeProperties } from 'n8n-workflow'; + +export const chatOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + options: [ + { + name: 'Get all chats', + value: 'getAll', + action: 'Get all chats', + description: 'Get list of all chats', + }, + { + name: 'Get a chat', + value: 'getById', + action: 'Get a chat', + description: 'Get chat by ID', + }, + { + name: 'Create a chat', + value: 'create', + action: 'Create a chat', + description: 'Create new chat', + }, + { + name: 'Update a chat', + value: 'update', + action: 'Update a chat', + description: 'Update chat', + }, + { + name: 'Archive a chat', + value: 'archive', + action: 'Archive a chat', + description: 'Archive chat', + }, + { + name: 'Unarchive a chat', + value: 'unarchive', + action: 'Unarchive a chat', + description: 'Unarchive chat', + }, + { + name: 'Get chat members', + value: 'getMembers', + action: 'Get chat members', + description: 'Get chat members list', + }, + { + name: 'Add users to chat', + value: 'addUsers', + action: 'Add users to chat', + description: 'Add users to chat', + }, + { + name: 'Remove user from chat', + value: 'removeUser', + action: 'Remove user from chat', + description: 'Remove user from chat', + }, + { + name: 'Update user role in chat', + value: 'updateRole', + action: 'Update user role in chat', + description: 'Change user role in chat', + }, + { + name: 'Leave a chat', + value: 'leaveChat', + action: 'Leave a chat', + description: 'Leave chat', + }, + ], + default: 'getAll', + displayOptions: { + show: { + resource: ['chat'], + }, + }, + }, +]; + +export const chatFields: INodeProperties[] = [ + { + displayName: 'Additional Options', + name: 'paginationOptions', + type: 'collection', + options: [ + { + displayName: 'Per Page', + name: 'per', + type: 'number', + default: 25, + description: 'Items per page (max 50)', + }, + { + displayName: 'Page', + name: 'page', + type: 'number', + default: 1, + description: 'Page number', + }, + ], + default: {}, + placeholder: 'Add option', + displayOptions: { + show: { + resource: ['message', 'chat', 'groupTag', 'customFields'], + operation: ['getAll', 'getUsers'], + }, + }, + }, + { + displayName: 'Chat ID', + name: 'chatId', + type: 'number', + default: 1, + description: 'Chat ID', + displayOptions: { + show: { + resource: ['chat'], + operation: ['getById', 'update', 'archive', 'unarchive', 'getMembers', 'addUsers', 'removeUser', 'updateRole', 'leaveChat'], + }, + }, + }, + { + displayName: 'Chat Name', + name: 'chatName', + type: 'string', + default: '', + description: 'Chat name', + displayOptions: { + show: { + resource: ['chat'], + operation: ['create', 'update'], + }, + }, + }, + { + displayName: 'Channel', + name: 'channel', + type: 'boolean', + default: false, + description: 'Create channel (true) or chat (false)', + displayOptions: { + show: { + resource: ['chat'], + operation: ['create'], + }, + }, + }, + { + displayName: 'Public', + name: 'public', + type: 'boolean', + default: false, + description: 'Open (true) or closed (false) access', + displayOptions: { + show: { + resource: ['chat'], + operation: ['create'], + }, + }, + }, + { + displayName: 'Additional Options', + name: 'chatMembersOptions', + type: 'collection', + options: [ + { + displayName: 'Role', + name: 'role', + type: 'options', + options: [ + { + name: 'All', + value: 'all', + description: 'Any role', + }, + { + name: 'Owner', + value: 'owner', + description: 'Creator', + }, + { + name: 'Admin', + value: 'admin', + description: 'Administrator', + }, + { + name: 'Editor', + value: 'editor', + description: 'Editor', + }, + { + name: 'Member', + value: 'member', + description: 'Member/Subscriber', + }, + ], + default: 'all', + description: 'Chat role filter', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Number of members to return (max 50)', + }, + { + displayName: 'Cursor', + name: 'cursor', + type: 'string', + default: '', + description: 'Pagination cursor (from meta.paginate.next_page)', + }, + ], + default: {}, + placeholder: 'Add option', + displayOptions: { + show: { + resource: ['chat'], + operation: ['getMembers'], + }, + }, + }, + { + displayName: 'Member IDs', + name: 'memberIds', + type: 'string', + default: '', + description: 'Comma-separated user IDs (e.g. 186,187)', + displayOptions: { + show: { + resource: ['chat'], + operation: ['addUsers'], + }, + }, + }, + { + displayName: 'Silent', + name: 'silent', + type: 'boolean', + default: false, + description: 'Do not create system message about adding member', + displayOptions: { + show: { + resource: ['chat'], + operation: ['addUsers'], + }, + }, + }, + { + displayName: 'User ID', + name: 'userId', + type: 'number', + default: 1, + description: 'User ID', + displayOptions: { + show: { + resource: ['chat'], + operation: ['removeUser', 'updateRole'], + }, + }, + }, + { + displayName: 'New Role', + name: 'newRole', + type: 'options', + options: [ + { + name: 'Admin', + value: 'admin', + description: 'Administrator', + }, + { + name: 'Editor', + value: 'editor', + description: 'Editor (channels only)', + }, + { + name: 'Member', + value: 'member', + description: 'Member/Subscriber', + }, + ], + default: 'member', + description: 'New user role', + displayOptions: { + show: { + resource: ['chat'], + operation: ['updateRole'], + }, + }, + }, +]; diff --git a/integrations/n8n/nodes/Pachca/V1/CustomFieldsDescription.ts b/integrations/n8n/nodes/Pachca/V1/CustomFieldsDescription.ts new file mode 100644 index 00000000..811ef841 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V1/CustomFieldsDescription.ts @@ -0,0 +1,86 @@ +// ============================================================================ +// CustomFieldsDescription.ts — FROZEN V1 description (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { INodeProperties } from 'n8n-workflow'; + +export const customFieldsOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + options: [ + { + name: 'Get custom properties', + value: 'getCustomProperties', + action: 'Get custom properties', + description: 'Get list of custom fields for entity', + }, + ], + default: 'getCustomProperties', + displayOptions: { + show: { + resource: ['customFields'], + }, + }, + }, +]; + +export const customFieldsFields: INodeProperties[] = [ + { + displayName: 'Additional Options', + name: 'paginationOptions', + type: 'collection', + options: [ + { + displayName: 'Per Page', + name: 'per', + type: 'number', + default: 25, + description: 'Items per page (max 50)', + }, + { + displayName: 'Page', + name: 'page', + type: 'number', + default: 1, + description: 'Page number', + }, + ], + default: {}, + placeholder: 'Add option', + displayOptions: { + show: { + resource: ['message', 'chat', 'groupTag', 'customFields'], + operation: ['getAll', 'getUsers'], + }, + }, + }, + { + displayName: 'Entity Type', + name: 'entityType', + type: 'options', + options: [ + { + name: 'User', + value: 'User', + description: 'Member', + }, + { + name: 'Task', + value: 'Task', + description: 'Reminder', + }, + ], + default: 'User', + description: 'Entity type for custom fields', + displayOptions: { + show: { + resource: ['customFields'], + operation: ['getCustomProperties'], + }, + }, + }, +]; diff --git a/integrations/n8n/nodes/Pachca/V1/FileDescription.ts b/integrations/n8n/nodes/Pachca/V1/FileDescription.ts new file mode 100644 index 00000000..dcd47439 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V1/FileDescription.ts @@ -0,0 +1,111 @@ +// ============================================================================ +// FileDescription.ts — FROZEN V1 description (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { INodeProperties } from 'n8n-workflow'; + +export const fileOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + options: [ + { + name: 'Upload a file', + value: 'upload', + action: 'Upload a file', + description: 'Upload file (full flow: get params + upload)', + }, + ], + default: 'upload', + displayOptions: { + show: { + resource: ['file'], + }, + }, + }, +]; + +export const fileFields: INodeProperties[] = [ + { + displayName: 'File Source', + name: 'fileSource', + type: 'options', + options: [ + { + name: 'URL', + value: 'url', + description: 'Download file from URL', + }, + { + name: 'Binary Data', + value: 'binary', + description: 'Use binary data from previous node', + }, + ], + default: 'url', + description: 'File source for upload', + displayOptions: { + show: { + resource: ['file'], + operation: ['upload'], + }, + }, + }, + { + displayName: 'File URL', + name: 'fileUrl', + type: 'string', + default: '', + description: 'File URL to download and upload to Pachca', + displayOptions: { + show: { + resource: ['file'], + operation: ['upload'], + fileSource: ['url'], + }, + }, + }, + { + displayName: 'Binary Property', + name: 'binaryProperty', + type: 'string', + default: 'data', + description: 'Binary property name from previous node', + displayOptions: { + show: { + resource: ['file'], + operation: ['upload'], + fileSource: ['binary'], + }, + }, + }, + { + displayName: 'File Name', + name: 'fileName', + type: 'string', + default: '', + description: 'File name (if not set, taken from URL or binary data)', + displayOptions: { + show: { + resource: ['file'], + operation: ['upload'], + }, + }, + }, + { + displayName: 'Content Type', + name: 'contentType', + type: 'string', + default: 'application/octet-stream', + description: 'File MIME type (auto-detected if not set)', + displayOptions: { + show: { + resource: ['file'], + operation: ['upload'], + }, + }, + }, +]; diff --git a/integrations/n8n/nodes/Pachca/V1/FormDescription.ts b/integrations/n8n/nodes/Pachca/V1/FormDescription.ts new file mode 100644 index 00000000..05426271 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V1/FormDescription.ts @@ -0,0 +1,569 @@ +// ============================================================================ +// FormDescription.ts — FROZEN V1 description (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { INodeProperties } from 'n8n-workflow'; + +export const formOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + options: [ + { + name: 'Create a form', + value: 'createView', + action: 'Create a form', + description: 'Create and open modal with form', + }, + { + name: 'Process form submission', + value: 'processSubmission', + action: 'Process form submission', + description: 'Handle form submit and send response', + }, + { + name: 'Get form templates', + value: 'getTemplates', + action: 'Get form templates', + description: 'Get list of available form templates', + }, + ], + default: 'createView', + displayOptions: { + show: { + resource: ['form'], + }, + }, + }, +]; + +export const formFields: INodeProperties[] = [ + { + displayName: 'Form Builder Mode', + name: 'formBuilderMode', + type: 'options', + options: [ + { + name: '📋 Use Template', + value: 'template', + description: 'Use preset template', + }, + { + name: '🎨 Visual Builder', + value: 'builder', + description: 'Visual form builder', + }, + { + name: '🔧 Raw JSON', + value: 'json', + description: 'Edit JSON directly', + }, + ], + default: 'template', + description: 'Form creation method', + displayOptions: { + show: { + resource: ['form'], + operation: ['createView'], + }, + }, + }, + { + displayName: 'Form Template', + name: 'formTemplate', + type: 'options', + options: [ + { + name: '📋 Timeoff Request', + value: 'timeoff_request', + description: 'Time-off request form', + }, + { + name: '💬 Feedback Form', + value: 'feedback_form', + description: 'Feedback form', + }, + { + name: '📝 Task Request', + value: 'task_request', + description: 'Task creation form', + }, + { + name: '📊 Survey Form', + value: 'survey_form', + description: 'Survey form', + }, + { + name: '🔐 Access Request', + value: 'access_request', + description: 'Access request form', + }, + ], + default: 'timeoff_request', + description: 'Select form template', + displayOptions: { + show: { + resource: ['form'], + operation: ['createView'], + formBuilderMode: ['template'], + }, + }, + }, + { + displayName: 'Form Title', + name: 'formTitle', + type: 'string', + default: 'My form', + description: 'Form title (max 24 characters)', + displayOptions: { + show: { + resource: ['form'], + operation: ['createView'], + formBuilderMode: ['builder'], + }, + }, + }, + { + displayName: 'Close Button Text', + name: 'closeText', + type: 'string', + default: 'Cancel', + description: 'Close button text (max 24 characters)', + displayOptions: { + show: { + resource: ['form'], + operation: ['createView'], + formBuilderMode: ['builder'], + }, + }, + }, + { + displayName: 'Submit Button Text', + name: 'submitText', + type: 'string', + default: 'Submit', + description: 'Submit button text (max 24 characters)', + displayOptions: { + show: { + resource: ['form'], + operation: ['createView'], + formBuilderMode: ['builder'], + }, + }, + }, + { + displayName: 'Form Blocks', + name: 'formBlocks', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + sortable: true, + }, + options: [ + { + name: 'block', + displayName: 'Block', + values: [ + { + displayName: 'Block Type', + name: 'type', + type: 'options', + options: [ + { + name: '📝 Header', + value: 'header', + description: 'Section header', + }, + { + name: '📄 Plain Text', + value: 'plain_text', + description: 'Plain text', + }, + { + name: '📝 Markdown Text', + value: 'markdown', + description: 'Formatted text', + }, + { + name: '➖ Divider', + value: 'divider', + description: 'Divider', + }, + { + name: '📝 Text Input', + value: 'input', + description: 'Text input', + }, + { + name: '📋 Select Dropdown', + value: 'select', + description: 'Dropdown', + }, + { + name: '🔘 Radio Buttons', + value: 'radio', + description: 'Radio buttons', + }, + { + name: '☑️ Checkboxes', + value: 'checkbox', + description: 'Checkboxes', + }, + { + name: '📅 Date Picker', + value: 'date', + description: 'Date picker', + }, + { + name: '🕐 Time Picker', + value: 'time', + description: 'Time picker', + }, + { + name: '📎 File Upload', + value: 'file_input', + description: 'File upload', + }, + ], + default: 'header', + }, + { + displayName: 'Text Content', + name: 'text', + type: 'string', + default: '', + displayOptions: { + show: { + type: ['header', 'plain_text', 'markdown'], + }, + }, + description: 'Display text', + }, + { + displayName: 'Field Name', + name: 'name', + type: 'string', + default: '', + displayOptions: { + show: { + type: ['input', 'select', 'radio', 'checkbox', 'date', 'time', 'file_input'], + }, + }, + description: 'Field name (sent in webhook)', + }, + { + displayName: 'Field Label', + name: 'label', + type: 'string', + default: '', + displayOptions: { + show: { + type: ['input', 'select', 'radio', 'checkbox', 'date', 'time', 'file_input'], + }, + }, + description: 'Field label', + }, + { + displayName: 'Required', + name: 'required', + type: 'boolean', + default: false, + displayOptions: { + show: { + type: ['input', 'select', 'radio', 'checkbox', 'date', 'time', 'file_input'], + }, + }, + description: 'Required field', + }, + { + displayName: 'Hint', + name: 'hint', + type: 'string', + default: '', + displayOptions: { + show: { + type: ['input', 'select', 'radio', 'checkbox', 'date', 'time', 'file_input'], + }, + }, + description: 'Hint below field', + }, + { + displayName: 'Placeholder', + name: 'placeholder', + type: 'string', + default: '', + displayOptions: { + show: { + type: ['input'], + }, + }, + description: 'Placeholder text', + }, + { + displayName: 'Multiline', + name: 'multiline', + type: 'boolean', + default: false, + displayOptions: { + show: { + type: ['input'], + }, + }, + description: 'Multiline field', + }, + { + displayName: 'Initial Value', + name: 'initial_value', + type: 'string', + default: '', + displayOptions: { + show: { + type: ['input'], + }, + }, + description: 'Default value', + }, + { + displayName: 'Min Length', + name: 'min_length', + type: 'number', + default: 0, + displayOptions: { + show: { + type: ['input'], + }, + }, + description: 'Min text length', + }, + { + displayName: 'Max Length', + name: 'max_length', + type: 'number', + default: 3000, + displayOptions: { + show: { + type: ['input'], + }, + }, + description: 'Max text length', + }, + { + displayName: 'Options', + name: 'options', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + default: [], + displayOptions: { + show: { + type: ['select', 'radio', 'checkbox'], + }, + }, + options: [ + { + name: 'option', + displayName: 'Option', + values: [ + { + displayName: 'Text', + name: 'text', + type: 'string', + default: '', + description: 'Display text', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: '', + description: 'Value to submit', + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'Option description (radio/checkbox)', + }, + { + displayName: 'Selected', + name: 'selected', + type: 'boolean', + default: false, + description: 'Selected by default (select/radio)', + }, + { + displayName: 'Checked', + name: 'checked', + type: 'boolean', + default: false, + description: 'Checked by default (checkbox)', + }, + ], + }, + ], + description: 'Choice options', + }, + { + displayName: 'Initial Date', + name: 'initial_date', + type: 'string', + default: '', + displayOptions: { + show: { + type: ['date'], + }, + }, + description: 'Initial date (YYYY-MM-DD)', + }, + { + displayName: 'Initial Time', + name: 'initial_time', + type: 'string', + default: '', + displayOptions: { + show: { + type: ['time'], + }, + }, + description: 'Initial time (HH:mm)', + }, + { + displayName: 'File Types', + name: 'filetypes', + type: 'string', + default: '', + displayOptions: { + show: { + type: ['file_input'], + }, + }, + description: 'Allowed file types (comma-separated, e.g. pdf,jpg,png)', + }, + { + displayName: 'Max Files', + name: 'max_files', + type: 'number', + default: 10, + displayOptions: { + show: { + type: ['file_input'], + }, + }, + description: 'Max number of files', + }, + ], + }, + ], + default: [], + description: 'Form blocks - add elements to build the form', + displayOptions: { + show: { + resource: ['form'], + operation: ['createView'], + formBuilderMode: ['builder'], + }, + }, + }, + { + displayName: 'Custom Form JSON', + name: 'customFormJson', + type: 'json', + default: '{\n "title": "My form",\n "close_text": "Cancel",\n "submit_text": "Submit",\n "blocks": [\n {\n "type": "header",\n "text": "Form title"\n },\n {\n "type": "input",\n "name": "field1",\n "label": "Input field",\n "placeholder": "Enter text",\n "required": true\n },\n {\n "type": "select",\n "name": "choice",\n "label": "Choose option",\n "options": [\n {"text": "Option 1", "value": "option1", "selected": true},\n {"text": "Option 2", "value": "option2"}\n ],\n "required": true\n }\n ]\n}', + description: 'JSON structure for custom form. Use blocks: header, plain_text, markdown, divider, input, select, radio, checkbox, date, time, file_input', + displayOptions: { + show: { + resource: ['form'], + operation: ['createView'], + formBuilderMode: ['json'], + }, + }, + }, + { + displayName: 'Trigger ID', + name: 'triggerId', + type: 'string', + default: '', + description: 'Unique event ID (from button webhook)', + displayOptions: { + show: { + resource: ['form'], + operation: ['createView'], + }, + }, + }, + { + displayName: 'Private Metadata', + name: 'privateMetadata', + type: 'string', + default: '', + description: 'Extra data to send on form submit (JSON string)', + displayOptions: { + show: { + resource: ['form'], + operation: ['createView'], + }, + }, + }, + { + displayName: 'Callback ID', + name: 'callbackId', + type: 'string', + default: '', + description: 'Form identifier for matching submitted results', + displayOptions: { + show: { + resource: ['form'], + operation: ['createView'], + }, + }, + }, + { + displayName: 'Form Type', + name: 'formType', + type: 'options', + options: [ + { + name: '🤖 Auto-detect (recommended)', + value: 'auto', + }, + { + name: '📋 Timeoff Request', + value: 'timeoff_request', + }, + { + name: '💬 Feedback Form', + value: 'feedback_form', + }, + { + name: '📝 Task Request', + value: 'task_request', + }, + ], + default: 'auto', + description: 'Form type for processing data', + displayOptions: { + show: { + resource: ['form'], + operation: ['processSubmission'], + }, + }, + }, + { + displayName: 'Validation Errors', + name: 'validationErrors', + type: 'json', + default: '{}', + description: 'Validation errors to send to user (JSON object with field names and messages)', + displayOptions: { + show: { + resource: ['form'], + operation: ['processSubmission'], + }, + }, + }, +]; diff --git a/integrations/n8n/nodes/Pachca/V1/GroupTagDescription.ts b/integrations/n8n/nodes/Pachca/V1/GroupTagDescription.ts new file mode 100644 index 00000000..29e56075 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V1/GroupTagDescription.ts @@ -0,0 +1,181 @@ +// ============================================================================ +// GroupTagDescription.ts — FROZEN V1 description (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { INodeProperties } from 'n8n-workflow'; + +export const groupTagOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + options: [ + { + name: 'Get all group tags', + value: 'getAll', + action: 'Get all group tags', + description: 'Get list of all group tags', + }, + { + name: 'Get a group tag', + value: 'getById', + action: 'Get a group tag', + description: 'Get group tag by ID', + }, + { + name: 'Create a group tag', + value: 'create', + action: 'Create a group tag', + description: 'Create new group tag', + }, + { + name: 'Update a group tag', + value: 'update', + action: 'Update a group tag', + description: 'Update group tag', + }, + { + name: 'Delete a group tag', + value: 'delete', + action: 'Delete a group tag', + description: 'Delete group tag', + }, + { + name: 'Get users in group tag', + value: 'getUsers', + action: 'Get users in group tag', + description: 'Get users in group tag', + }, + { + name: 'Add tags to chat', + value: 'addTags', + action: 'Add tags to chat', + description: 'Add tags to chat', + }, + { + name: 'Remove tag from chat', + value: 'removeTag', + action: 'Remove tag from chat', + description: 'Remove tag from chat', + }, + ], + default: 'getAll', + displayOptions: { + show: { + resource: ['groupTag'], + }, + }, + }, +]; + +export const groupTagFields: INodeProperties[] = [ + { + displayName: 'Additional Options', + name: 'paginationOptions', + type: 'collection', + options: [ + { + displayName: 'Per Page', + name: 'per', + type: 'number', + default: 25, + description: 'Items per page (max 50)', + }, + { + displayName: 'Page', + name: 'page', + type: 'number', + default: 1, + description: 'Page number', + }, + ], + default: {}, + placeholder: 'Add option', + displayOptions: { + show: { + resource: ['message', 'chat', 'groupTag', 'customFields'], + operation: ['getAll', 'getUsers'], + }, + }, + }, + { + displayName: 'Group Tag ID', + name: 'groupTagId', + type: 'number', + default: 1, + description: 'Group tag ID', + displayOptions: { + show: { + resource: ['groupTag'], + operation: ['getById', 'update', 'delete', 'getUsers', 'removeTag'], + }, + }, + }, + { + displayName: 'Group Tag Name', + name: 'groupTagName', + type: 'string', + default: '', + description: 'Group tag name', + displayOptions: { + show: { + resource: ['groupTag'], + operation: ['create', 'update'], + }, + }, + }, + { + displayName: 'Group Tag Color', + name: 'groupTagColor', + type: 'string', + default: '#000000', + description: 'Group tag color (hex code)', + displayOptions: { + show: { + resource: ['groupTag'], + operation: ['create', 'update'], + }, + }, + }, + { + displayName: 'Chat ID', + name: 'groupTagChatId', + type: 'number', + default: 1, + description: 'Chat ID for tag operations', + displayOptions: { + show: { + resource: ['groupTag'], + operation: ['addTags', 'removeTag'], + }, + }, + }, + { + displayName: 'Group Tag IDs', + name: 'groupTagIds', + type: 'string', + default: '', + description: 'Comma-separated tag IDs (e.g. 86,18)', + displayOptions: { + show: { + resource: ['groupTag'], + operation: ['addTags'], + }, + }, + }, + { + displayName: 'Tag ID', + name: 'tagId', + type: 'number', + default: 1, + description: 'Tag ID to remove', + displayOptions: { + show: { + resource: ['groupTag'], + operation: ['removeTag'], + }, + }, + }, +]; diff --git a/integrations/n8n/nodes/Pachca/V1/MessageDescription.ts b/integrations/n8n/nodes/Pachca/V1/MessageDescription.ts new file mode 100644 index 00000000..d945a8aa --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V1/MessageDescription.ts @@ -0,0 +1,502 @@ +// ============================================================================ +// MessageDescription.ts — FROZEN V1 description (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { INodeProperties } from 'n8n-workflow'; + +export const messageOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + options: [ + { + name: 'Send a message', + value: 'send', + action: 'Send a message', + description: 'Send message', + }, + { + name: 'Get a message', + value: 'getById', + action: 'Get a message', + description: 'Get message by ID', + }, + { + name: 'Get messages from a chat', + value: 'getAll', + action: 'Get messages from a chat', + description: 'Get chat messages', + }, + { + name: 'Update a message', + value: 'update', + action: 'Update a message', + description: 'Edit message', + }, + { + name: 'Delete a message', + value: 'delete', + action: 'Delete a message', + description: 'Delete message (Admin/Owner tokens only)', + }, + { + name: 'Pin a message', + value: 'pin', + action: 'Pin a message', + description: 'Pin message', + }, + { + name: 'Unpin a message', + value: 'unpin', + action: 'Unpin a message', + description: 'Unpin message', + }, + { + name: 'Get message readers', + value: 'getReadMembers', + action: 'Get message readers', + description: 'Get list of message readers', + }, + { + name: 'Unfurl message links', + value: 'unfurl', + action: 'Unfurl message links', + description: 'Create link previews in message (unfurl)', + }, + ], + default: 'send', + displayOptions: { + show: { + resource: ['message'], + }, + }, + }, +]; + +export const messageFields: INodeProperties[] = [ + { + displayName: 'Entity Type', + name: 'entityType', + type: 'options', + options: [ + { + name: 'Discussion', + value: 'discussion', + description: 'Chat or channel', + }, + { + name: 'User', + value: 'user', + description: 'Direct message to user', + }, + { + name: 'Thread', + value: 'thread', + description: 'Thread comment', + }, + ], + default: 'discussion', + description: 'Entity type for sending message', + displayOptions: { + show: { + resource: ['message'], + operation: ['send'], + }, + }, + }, + { + displayName: 'Entity ID', + name: 'entityId', + type: 'number', + default: '', + description: 'Chat, user or thread ID', + displayOptions: { + show: { + resource: ['message'], + operation: ['send'], + }, + }, + }, + { + displayName: 'Content', + name: 'content', + type: 'string', + typeOptions: { + rows: 4, + }, + default: '', + description: 'Message text', + displayOptions: { + show: { + resource: ['message'], + operation: ['send', 'update'], + }, + }, + }, + { + displayName: 'Files', + name: 'files', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + options: [ + { + name: 'file', + displayName: 'File', + values: [ + { + displayName: 'File Key', + name: 'key', + type: 'string', + default: '', + description: 'File path/key from file upload result', + required: true, + }, + { + displayName: 'File Name', + name: 'name', + type: 'string', + default: '', + description: 'File name shown to user', + required: true, + }, + { + displayName: 'File Type', + name: 'fileType', + type: 'options', + options: [ + { + name: 'File', + value: 'file', + }, + { + name: 'Image', + value: 'image', + }, + ], + default: 'file', + description: 'File type', + required: true, + }, + { + displayName: 'File Size (bytes)', + name: 'size', + type: 'number', + default: 0, + description: 'File size in bytes', + required: true, + }, + { + displayName: 'Width (px)', + name: 'width', + type: 'number', + default: '', + displayOptions: { + show: { + fileType: ['image'], + }, + }, + description: 'Image width in pixels (images only)', + }, + { + displayName: 'Height (px)', + name: 'height', + type: 'number', + default: '', + displayOptions: { + show: { + fileType: ['image'], + }, + }, + description: 'Image height in pixels (images only)', + }, + ], + }, + ], + default: [], + description: 'Attached files', + displayOptions: { + show: { + resource: ['message'], + operation: ['send', 'update'], + }, + }, + }, + { + displayName: 'Button Layout', + name: 'buttonLayout', + type: 'options', + options: [ + { + name: 'Single Row (all buttons in one row)', + value: 'single_row', + }, + { + name: 'Multiple Rows (each button on its own row)', + value: 'multiple_rows', + }, + { + name: 'Raw JSON', + value: 'raw_json', + description: 'Enter button JSON directly', + }, + ], + default: 'single_row', + description: 'Button layout style', + displayOptions: { + show: { + resource: ['message'], + operation: ['send', 'update'], + }, + }, + }, + { + displayName: 'Buttons', + name: 'buttons', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + options: [ + { + name: 'button', + displayName: 'Button', + values: [ + { + displayName: 'Button Text', + name: 'text', + type: 'string', + default: '', + description: 'Button text', + }, + { + displayName: 'Button Type', + name: 'type', + type: 'options', + options: [ + { + name: 'Data Button (for forms)', + value: 'data', + }, + { + name: 'URL Button', + value: 'url', + }, + ], + default: 'data', + }, + { + displayName: 'Data Value', + name: 'data', + type: 'string', + default: '', + displayOptions: { + show: { + type: ['data'], + }, + }, + description: 'Value for Data button (sent in webhook)', + }, + { + displayName: 'URL', + name: 'url', + type: 'string', + default: '', + displayOptions: { + show: { + type: ['url'], + }, + }, + description: 'URL to open', + }, + ], + }, + ], + default: [], + description: 'Message buttons (Data buttons for forms, URL buttons for links)', + displayOptions: { + show: { + resource: ['message'], + operation: ['send', 'update'], + buttonLayout: ['single_row', 'multiple_rows'], + }, + }, + }, + { + displayName: 'Raw JSON Buttons', + name: 'rawJsonButtons', + type: 'json', + default: '[\n [\n {"text": "👍 Agree", "data": "vote_yes"},\n {"text": "❌ Decline", "data": "vote_no"}\n ],\n [\n {"text": "🕒 Postpone by a week", "data": "pause_week"}\n ],\n [\n {"text": "My projects", "url": "https://projects.com/list"}\n ]\n]', + description: 'Raw JSON for buttons in API format: array of arrays (each row is an array of buttons). Use button array [{...}, {...}] or rows [[{...}, {...}], [{...}]]. See example above.', + displayOptions: { + show: { + resource: ['message'], + operation: ['send', 'update'], + buttonLayout: ['raw_json'], + }, + }, + }, + { + displayName: 'Message ID', + name: 'messageId', + type: 'number', + default: '', + description: 'Message ID', + displayOptions: { + show: { + resource: ['message'], + operation: ['getById', 'update', 'delete', 'pin', 'unpin', 'getReadMembers'], + }, + }, + }, + { + displayName: 'Chat ID', + name: 'chatId', + type: 'number', + default: '', + description: 'Chat ID to get messages from', + displayOptions: { + show: { + resource: ['message'], + operation: ['getAll'], + }, + }, + }, + { + displayName: 'Additional Options', + name: 'paginationOptions', + type: 'collection', + options: [ + { + displayName: 'Per Page', + name: 'per', + type: 'number', + default: 25, + description: 'Items per page (max 50)', + }, + { + displayName: 'Page', + name: 'page', + type: 'number', + default: 1, + description: 'Page number', + }, + ], + default: {}, + placeholder: 'Add option', + displayOptions: { + show: { + resource: ['message', 'chat', 'groupTag', 'customFields'], + operation: ['getAll', 'getUsers'], + }, + }, + }, + { + displayName: 'Additional Options', + name: 'readMembersOptions', + type: 'collection', + options: [ + { + displayName: 'Per Page', + name: 'readMembersPer', + type: 'number', + default: 300, + description: 'Number of users to return (max 300)', + }, + { + displayName: 'Page', + name: 'readMembersPage', + type: 'number', + default: 1, + description: 'Page of readers to fetch', + }, + ], + default: {}, + placeholder: 'Add option', + displayOptions: { + show: { + resource: ['message'], + operation: ['getReadMembers'], + }, + }, + }, + { + displayName: 'Message ID', + name: 'messageId', + type: 'number', + default: '', + description: 'Message ID for creating link previews (unfurl)', + displayOptions: { + show: { + resource: ['message'], + operation: ['unfurl'], + }, + }, + }, + { + displayName: 'Link Previews', + name: 'linkPreviews', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + options: [ + { + name: 'preview', + displayName: 'Preview', + values: [ + { + displayName: 'URL', + name: 'url', + type: 'string', + default: '', + description: 'Link URL for preview (unfurl)', + required: true, + }, + { + displayName: 'Title', + name: 'title', + type: 'string', + default: '', + description: 'Link preview title', + required: true, + }, + { + displayName: 'Description', + name: 'description', + type: 'string', + default: '', + description: 'Link preview description', + required: true, + }, + { + displayName: 'Image URL', + name: 'imageUrl', + type: 'string', + default: '', + description: 'Public image URL (used when no file is provided)', + }, + { + displayName: 'Binary Property', + name: 'image', + type: 'string', + default: '', + description: 'Binary property with image (overrides Image URL)', + }, + ], + }, + ], + default: {}, + description: 'Link previews to create (unfurl). Each URL must be from the message the preview is created for.', + displayOptions: { + show: { + resource: ['message'], + operation: ['unfurl'], + }, + }, + }, +]; diff --git a/integrations/n8n/nodes/Pachca/V1/PachcaV1.node.ts b/integrations/n8n/nodes/Pachca/V1/PachcaV1.node.ts new file mode 100644 index 00000000..7aa89e43 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V1/PachcaV1.node.ts @@ -0,0 +1,206 @@ +// ============================================================================ +// PachcaV1.node.ts — FROZEN V1 node class (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { + INodeType, + INodeTypeBaseDescription, + INodeTypeDescription, + IExecuteFunctions, + INodeExecutionData, + ILoadOptionsFunctions, + INodeListSearchResult, + INodePropertyOptions, +} from 'n8n-workflow'; +import { NodeConnectionTypes } from 'n8n-workflow'; +import { router } from '../SharedRouter'; + +import { messageOperations, messageFields } from './MessageDescription'; +import { threadOperations, threadFields } from './ThreadDescription'; +import { reactionsOperations, reactionsFields } from './ReactionsDescription'; +import { chatOperations, chatFields } from './ChatDescription'; +import { userOperations, userFields } from './UserDescription'; +import { groupTagOperations, groupTagFields } from './GroupTagDescription'; +import { statusOperations, statusFields } from './StatusDescription'; +import { customFieldsOperations, customFieldsFields } from './CustomFieldsDescription'; +import { taskOperations, taskFields } from './TaskDescription'; +import { botOperations, botFields } from './BotDescription'; +import { fileOperations, fileFields } from './FileDescription'; +import { formOperations, formFields } from './FormDescription'; + +function formatUserName(u: { first_name: string; last_name: string; nickname: string }): string { + const fullName = [u.first_name, u.last_name] + .filter((v) => v != null && v !== '' && v !== 'null') + .join(' '); + const display = fullName || u.nickname || 'User'; + return u.nickname ? `${display} (@${u.nickname})` : display; +} + +export class PachcaV1 implements INodeType { + description: INodeTypeDescription; + + constructor(baseDescription: INodeTypeBaseDescription) { + this.description = { + ...baseDescription, + version: 1, + defaults: { name: 'Pachca' }, + inputs: [NodeConnectionTypes.Main], + outputs: [NodeConnectionTypes.Main], + credentials: [{ name: 'pachcaApi', required: true }], + properties: [ + { + displayName: + 'New node version available: get the latest version with added features from the nodes panel.', + name: 'oldVersionNotice', + type: 'notice', + default: '', + }, + { + displayName: 'Resource', + name: 'resource', + type: 'options', + noDataExpression: true, + options: [ + { name: 'Message', value: 'message' }, + { name: 'Thread', value: 'thread' }, + { name: 'Reactions', value: 'reactions' }, + { name: 'Chat', value: 'chat' }, + { name: 'User', value: 'user' }, + { name: 'Group Tag', value: 'groupTag' }, + { name: 'Status', value: 'status' }, + { name: 'Custom Fields', value: 'customFields' }, + { name: 'Task', value: 'task' }, + { name: 'Bot', value: 'bot' }, + { name: 'File', value: 'file' }, + { name: 'Form', value: 'form' }, + ], + default: 'message', + }, + ...messageOperations, + ...messageFields, + ...threadOperations, + ...threadFields, + ...reactionsOperations, + ...reactionsFields, + ...chatOperations, + ...chatFields, + ...userOperations, + ...userFields, + ...groupTagOperations, + ...groupTagFields, + ...statusOperations, + ...statusFields, + ...customFieldsOperations, + ...customFieldsFields, + ...taskOperations, + ...taskFields, + ...botOperations, + ...botFields, + ...fileOperations, + ...fileFields, + ...formOperations, + ...formFields, + ], + }; + } + + async execute(this: IExecuteFunctions): Promise { + return router.call(this); + } + + methods = { + listSearch: { + async searchChats(this: ILoadOptionsFunctions, filter?: string): Promise { + const credentials = await this.getCredentials('pachcaApi'); + const url = filter + ? `${credentials.baseUrl}/search/chats?query=${encodeURIComponent(filter)}` + : `${credentials.baseUrl}/chats?per=50`; + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { + method: 'GET', + url, + }); + const items = response.data ?? []; + return { + results: items.map((c: { id: number; name: string }) => ({ + name: c.name, + value: c.id, + })), + }; + }, + async searchUsers(this: ILoadOptionsFunctions, filter?: string): Promise { + const credentials = await this.getCredentials('pachcaApi'); + if (!filter) return { results: [] }; + const url = `${credentials.baseUrl}/search/users?query=${encodeURIComponent(filter)}`; + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { + method: 'GET', + url, + }); + const items = response.data ?? []; + return { + results: items.map((u: { id: number; first_name: string; last_name: string; nickname: string }) => ({ + name: formatUserName(u), + value: u.id, + })), + }; + }, + async searchEntities(this: ILoadOptionsFunctions, filter?: string): Promise { + let entityType = 'discussion'; + try { + entityType = (this.getNodeParameter('entityType') as string) || 'discussion'; + } catch { + try { + entityType = (this.getCurrentNodeParameter('entityType') as string) || 'discussion'; + } catch { /* parameter may not exist yet */ } + } + const credentials = await this.getCredentials('pachcaApi'); + if (entityType === 'user') { + if (!filter) return { results: [] }; + const url = `${credentials.baseUrl}/search/users?query=${encodeURIComponent(filter)}`; + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { method: 'GET', url }); + const items = response.data ?? []; + return { + results: items.map((u: { id: number; first_name: string; last_name: string; nickname: string }) => ({ + name: formatUserName(u), + value: u.id, + })), + }; + } + if (entityType === 'thread') { + return { results: [] }; + } + const url = filter + ? `${credentials.baseUrl}/search/chats?query=${encodeURIComponent(filter)}` + : `${credentials.baseUrl}/chats?per=50`; + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { method: 'GET', url }); + const items = response.data ?? []; + return { + results: items.map((c: { id: number; name: string }) => ({ + name: c.name, + value: c.id, + })), + }; + }, + }, + loadOptions: { + async getCustomProperties(this: ILoadOptionsFunctions): Promise { + const credentials = await this.getCredentials('pachcaApi'); + const resource = this.getNodeParameter('resource') as string; + const entityType = resource === 'task' ? 'Task' : 'User'; + try { + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { + method: 'GET', + url: `${credentials.baseUrl}/custom_properties?entity_type=${entityType}`, + }); + const items = response.data ?? []; + return items.map((p: { id: number; name: string }) => ({ + name: p.name, + value: p.id, + })); + } catch { + return []; + } + }, + }, + }; +} diff --git a/integrations/n8n/nodes/Pachca/V1/ReactionsDescription.ts b/integrations/n8n/nodes/Pachca/V1/ReactionsDescription.ts new file mode 100644 index 00000000..158c6f21 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V1/ReactionsDescription.ts @@ -0,0 +1,99 @@ +// ============================================================================ +// ReactionsDescription.ts — FROZEN V1 description (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { INodeProperties } from 'n8n-workflow'; + +export const reactionsOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + options: [ + { + name: 'Add a reaction', + value: 'addReaction', + action: 'Add a reaction', + description: 'Add reaction to message', + }, + { + name: 'Remove a reaction', + value: 'deleteReaction', + action: 'Remove a reaction', + description: 'Remove reaction from message', + }, + { + name: 'Get message reactions', + value: 'getReactions', + action: 'Get message reactions', + description: 'Get list of reactions on message', + }, + ], + default: 'addReaction', + displayOptions: { + show: { + resource: ['reactions'], + }, + }, + }, +]; + +export const reactionsFields: INodeProperties[] = [ + { + displayName: 'Message ID', + name: 'reactionsMessageId', + type: 'number', + default: '', + description: 'Message ID', + displayOptions: { + show: { + resource: ['reactions'], + operation: ['addReaction', 'deleteReaction', 'getReactions'], + }, + }, + }, + { + displayName: 'Reaction Code', + name: 'reactionsReactionCode', + type: 'string', + default: '👍', + description: 'Reaction emoji (e.g. 👍, 🔥, ⭐)', + displayOptions: { + show: { + resource: ['reactions'], + operation: ['addReaction', 'deleteReaction'], + }, + }, + }, + { + displayName: 'Additional Options', + name: 'reactionsOptions', + type: 'collection', + options: [ + { + displayName: 'Limit', + name: 'reactionsPer', + type: 'number', + default: 50, + description: 'Items per request (API limit, 1–50). See https://dev.pachca.com/api/reactions/list', + }, + { + displayName: 'Cursor', + name: 'reactionsCursor', + type: 'string', + default: '', + description: 'Pagination cursor from meta.paginate.next_page (optional)', + }, + ], + default: {}, + placeholder: 'Add option', + displayOptions: { + show: { + resource: ['reactions'], + operation: ['getReactions'], + }, + }, + }, +]; diff --git a/integrations/n8n/nodes/Pachca/V1/StatusDescription.ts b/integrations/n8n/nodes/Pachca/V1/StatusDescription.ts new file mode 100644 index 00000000..9fa3bd0b --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V1/StatusDescription.ts @@ -0,0 +1,89 @@ +// ============================================================================ +// StatusDescription.ts — FROZEN V1 description (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { INodeProperties } from 'n8n-workflow'; + +export const statusOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + options: [ + { + name: 'Get my profile', + value: 'getProfile', + action: 'Get my profile', + description: 'Get own profile info', + }, + { + name: 'Get my status', + value: 'getStatus', + action: 'Get my status', + description: 'Get own status info', + }, + { + name: 'Set my status', + value: 'updateStatus', + action: 'Set my status', + description: 'Set new status', + }, + { + name: 'Clear my status', + value: 'deleteStatus', + action: 'Clear my status', + description: 'Delete own status', + }, + ], + default: 'getProfile', + displayOptions: { + show: { + resource: ['status'], + }, + }, + }, +]; + +export const statusFields: INodeProperties[] = [ + { + displayName: 'Status Emoji', + name: 'statusEmoji', + type: 'string', + default: '🎮', + description: 'Status emoji', + displayOptions: { + show: { + resource: ['status'], + operation: ['updateStatus'], + }, + }, + }, + { + displayName: 'Status Title', + name: 'statusTitle', + type: 'string', + default: '', + description: 'Status text', + displayOptions: { + show: { + resource: ['status'], + operation: ['updateStatus'], + }, + }, + }, + { + displayName: 'Status Expires At', + name: 'statusExpiresAt', + type: 'dateTime', + default: '', + description: 'Status TTL (optional)', + displayOptions: { + show: { + resource: ['status'], + operation: ['updateStatus'], + }, + }, + }, +]; diff --git a/integrations/n8n/nodes/Pachca/V1/TaskDescription.ts b/integrations/n8n/nodes/Pachca/V1/TaskDescription.ts new file mode 100644 index 00000000..d96a769a --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V1/TaskDescription.ts @@ -0,0 +1,182 @@ +// ============================================================================ +// TaskDescription.ts — FROZEN V1 description (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { INodeProperties } from 'n8n-workflow'; + +export const taskOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + options: [ + { + name: 'Create a task', + value: 'create', + action: 'Create a task', + description: 'Create new reminder', + }, + ], + default: 'create', + displayOptions: { + show: { + resource: ['task'], + }, + }, + }, +]; + +export const taskFields: INodeProperties[] = [ + { + displayName: 'Task Kind', + name: 'taskKind', + type: 'options', + options: [ + { + name: 'Call', + value: 'call', + description: 'Call contact', + }, + { + name: 'Meeting', + value: 'meeting', + description: 'Meeting', + }, + { + name: 'Reminder', + value: 'reminder', + description: 'Simple reminder', + }, + { + name: 'Event', + value: 'event', + description: 'Event', + }, + { + name: 'Email', + value: 'email', + description: 'Send email', + }, + ], + default: 'reminder', + description: 'Reminder type', + displayOptions: { + show: { + resource: ['task'], + operation: ['create'], + }, + }, + }, + { + displayName: 'Content', + name: 'taskContent', + type: 'string', + typeOptions: { + rows: 3, + }, + default: '', + description: 'Reminder description (uses type name if not set)', + displayOptions: { + show: { + resource: ['task'], + operation: ['create'], + }, + }, + }, + { + displayName: 'Due At', + name: 'taskDueAt', + type: 'dateTime', + default: '', + description: 'Reminder due date (ISO-8601 format)', + displayOptions: { + show: { + resource: ['task'], + operation: ['create'], + }, + }, + }, + { + displayName: 'Priority', + name: 'taskPriority', + type: 'options', + options: [ + { + name: 'Normal', + value: 1, + description: 'Normal priority', + }, + { + name: 'Important', + value: 2, + description: 'Important', + }, + { + name: 'Very Important', + value: 3, + description: 'Very important', + }, + ], + default: 1, + description: 'Reminder priority', + displayOptions: { + show: { + resource: ['task'], + operation: ['create'], + }, + }, + }, + { + displayName: 'Performer IDs', + name: 'performerIds', + type: 'string', + default: '', + description: 'Comma-separated responsible user IDs (if empty, you are set as responsible)', + displayOptions: { + show: { + resource: ['task'], + operation: ['create'], + }, + }, + }, + { + displayName: 'Custom Properties', + name: 'customProperties', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + options: [ + { + name: 'property', + displayName: 'Property', + values: [ + { + displayName: 'Field ID', + name: 'id', + type: 'number', + default: 0, + description: 'Custom field ID', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: '', + description: 'Field value', + }, + ], + }, + ], + default: [], + description: 'Reminder custom fields', + displayOptions: { + show: { + resource: ['task'], + operation: ['create'], + }, + }, + }, +]; diff --git a/integrations/n8n/nodes/Pachca/V1/ThreadDescription.ts b/integrations/n8n/nodes/Pachca/V1/ThreadDescription.ts new file mode 100644 index 00000000..b3266841 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V1/ThreadDescription.ts @@ -0,0 +1,64 @@ +// ============================================================================ +// ThreadDescription.ts — FROZEN V1 description (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { INodeProperties } from 'n8n-workflow'; + +export const threadOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + options: [ + { + name: 'Create a thread', + value: 'createThread', + action: 'Create a thread', + description: 'Create thread to message', + }, + { + name: 'Get a thread', + value: 'getThread', + action: 'Get a thread', + description: 'Get thread info', + }, + ], + default: 'createThread', + displayOptions: { + show: { + resource: ['thread'], + }, + }, + }, +]; + +export const threadFields: INodeProperties[] = [ + { + displayName: 'Message ID', + name: 'threadMessageId', + type: 'number', + default: '', + description: 'Message ID for creating thread', + displayOptions: { + show: { + resource: ['thread'], + operation: ['createThread'], + }, + }, + }, + { + displayName: 'Thread ID', + name: 'threadThreadId', + type: 'number', + default: '', + description: 'Thread ID to get info for', + displayOptions: { + show: { + resource: ['thread'], + operation: ['getThread'], + }, + }, + }, +]; diff --git a/integrations/n8n/nodes/Pachca/V1/UserDescription.ts b/integrations/n8n/nodes/Pachca/V1/UserDescription.ts new file mode 100644 index 00000000..84111bc4 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V1/UserDescription.ts @@ -0,0 +1,367 @@ +// ============================================================================ +// UserDescription.ts — FROZEN V1 description (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { INodeProperties } from 'n8n-workflow'; + +export const userOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + options: [ + { + name: 'Get all users', + value: 'getAll', + action: 'Get all users', + description: 'Get list of all users', + }, + { + name: 'Get a user', + value: 'getById', + action: 'Get a user', + description: 'Get user by ID', + }, + { + name: 'Create a user', + value: 'create', + action: 'Create a user', + description: 'Create new user (Admin/Owner tokens only)', + }, + { + name: 'Update a user', + value: 'update', + action: 'Update a user', + description: 'Update user (Admin/Owner tokens only)', + }, + { + name: 'Delete a user', + value: 'delete', + action: 'Delete a user', + description: 'Delete user (Admin/Owner tokens only)', + }, + ], + default: 'getAll', + displayOptions: { + show: { + resource: ['user'], + }, + }, + }, +]; + +export const userFields: INodeProperties[] = [ + { + displayName: 'Get All Users (No Limit)', + name: 'getAllUsersNoLimit', + type: 'boolean', + default: false, + description: 'Get all users with full pagination (ignores per/page)', + displayOptions: { + show: { + resource: ['user'], + operation: ['getAll'], + }, + }, + }, + { + displayName: 'Additional Options', + name: 'additionalOptions', + type: 'collection', + options: [ + { + displayName: 'Per Page', + name: 'per', + type: 'number', + default: 25, + description: 'Items per page (max 50)', + }, + { + displayName: 'Page', + name: 'page', + type: 'number', + default: 1, + description: 'Page number', + }, + { + displayName: 'Query', + name: 'query', + type: 'string', + default: '', + description: 'Search phrase to filter users', + }, + ], + default: {}, + placeholder: 'Add option', + displayOptions: { + show: { + resource: ['user'], + operation: ['getAll'], + getAllUsersNoLimit: [false], + }, + }, + }, + { + displayName: 'User ID', + name: 'userId', + type: 'number', + default: 1, + description: 'User ID', + displayOptions: { + show: { + resource: ['user'], + operation: ['getById', 'update', 'delete'], + }, + }, + }, + { + displayName: 'Email', + name: 'email', + type: 'string', + default: '', + description: 'User email', + displayOptions: { + show: { + resource: ['user'], + operation: ['create', 'update'], + }, + }, + }, + { + displayName: 'First Name', + name: 'firstName', + type: 'string', + default: '', + description: 'User first name', + displayOptions: { + show: { + resource: ['user'], + operation: ['create', 'update'], + }, + }, + }, + { + displayName: 'Last Name', + name: 'lastName', + type: 'string', + default: '', + description: 'User last name', + displayOptions: { + show: { + resource: ['user'], + operation: ['create', 'update'], + }, + }, + }, + { + displayName: 'Additional Options', + name: 'filterOptions', + type: 'collection', + options: [ + { + displayName: 'Filter Role', + name: 'filterRole', + type: 'multiOptions', + options: [ + { + name: 'Admin', + value: 'admin', + }, + { + name: 'User', + value: 'user', + }, + { + name: 'Multi Guest', + value: 'multi_guest', + }, + ], + default: [], + description: 'Filter by user roles (if not set - all roles)', + }, + { + displayName: 'Filter Bot', + name: 'filterBot', + type: 'options', + options: [ + { + name: 'All', + value: 'all', + }, + { + name: 'Users Only', + value: 'users', + }, + { + name: 'Bots Only', + value: 'bots', + }, + ], + default: 'all', + description: 'Filter by type: users or bots', + }, + { + displayName: 'Filter Suspended', + name: 'filterSuspended', + type: 'options', + options: [ + { + name: 'All', + value: 'all', + }, + { + name: 'Active Only (suspended=false)', + value: 'active', + }, + { + name: 'Suspended Only (suspended=true)', + value: 'suspended', + }, + ], + default: 'all', + description: 'Filter by block status', + }, + { + displayName: 'Filter Invite Status', + name: 'filterInviteStatus', + type: 'multiOptions', + options: [ + { + name: 'Confirmed', + value: 'confirmed', + }, + { + name: 'Sent', + value: 'sent', + }, + ], + default: [], + description: 'Filter by invitation status (if not set - all statuses)', + }, + ], + default: {}, + placeholder: 'Add option', + displayOptions: { + show: { + resource: ['user'], + operation: ['getAll'], + getAllUsersNoLimit: [true], + }, + }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + options: [ + { + displayName: 'Nickname', + name: 'nickname', + type: 'string', + default: '', + description: 'User nickname', + }, + { + displayName: 'Phone Number', + name: 'phoneNumber', + type: 'string', + default: '', + description: 'Phone number', + }, + { + displayName: 'Department', + name: 'department', + type: 'string', + default: '', + description: 'Department', + }, + { + displayName: 'Title', + name: 'title', + type: 'string', + default: '', + description: 'Job title', + }, + { + displayName: 'Role', + name: 'role', + type: 'options', + options: [ + { + name: 'Admin', + value: 'admin', + description: 'Administrator', + }, + { + name: 'User', + value: 'user', + description: 'Employee', + }, + { + name: 'Multi Guest', + value: 'multi_guest', + description: 'Multi-guest', + }, + ], + default: 'user', + description: 'Access level', + }, + { + displayName: 'Suspended', + name: 'suspended', + type: 'boolean', + default: false, + description: 'User deactivation', + }, + { + displayName: 'List Tags', + name: 'listTags', + type: 'string', + default: '', + description: 'User tags (comma-separated)', + }, + { + displayName: 'Custom Properties', + name: 'customProperties', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + default: {}, + options: [ + { + name: 'property', + displayName: 'Property', + values: [ + { + displayName: 'Field ID', + name: 'id', + type: 'number', + default: 0, + description: 'Custom field identifier', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: '', + description: 'Field value', + }, + ], + }, + ], + description: 'User custom fields', + }, + ], + default: {}, + placeholder: 'Add field', + displayOptions: { + show: { + resource: ['user'], + operation: ['create', 'update'], + }, + }, + }, +]; diff --git a/integrations/n8n/nodes/Pachca/V2/BotDescription.ts b/integrations/n8n/nodes/Pachca/V2/BotDescription.ts new file mode 100644 index 00000000..c54528c9 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/BotDescription.ts @@ -0,0 +1,85 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const botOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['bot'] } }, + options: [ + { + name: 'Get Many Events', + value: 'getAllEvents', + action: 'Get many bot events', + }, + { + name: 'Remove Events', + value: 'removeEvents', + action: 'Remove events from bot', + }, + { + name: 'Update', + value: 'update', + action: 'Update a bot', + }, + ], + default: 'update', + }, +]; + +export const botFields: INodeProperties[] = [ + { + displayName: 'ID', + name: 'botId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['bot'], operation: ['update'] } }, + description: 'Bot ID', + }, + { + displayName: 'Webhook URL', + name: 'webhookUrl', + type: 'string', + required: true, + default: '', + placeholder: 'https://example.com/webhook', + description: 'URL for the outgoing webhook', + displayOptions: { show: { resource: ['bot'], operation: ['update'] } }, + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['bot'], operation: ['getAllEvents'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['bot'], operation: ['getAllEvents'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['bot'], operation: ['getAllEvents'] } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['bot'], operation: ['removeEvents'] } }, + description: 'Event ID', + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts b/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts new file mode 100644 index 00000000..53b313d1 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts @@ -0,0 +1,322 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const chatOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['chat'] } }, + options: [ + { + name: 'Archive', + value: 'archive', + action: 'Archive a chat', + }, + { + name: 'Create', + value: 'create', + action: 'Create a chat', + }, + { + name: 'Get', + value: 'get', + action: 'Get a chat', + }, + { + name: 'Get Many', + value: 'getAll', + action: 'Get many chats', + }, + { + name: 'Unarchive', + value: 'unarchive', + action: 'Unarchive a chat', + }, + { + name: 'Update', + value: 'update', + action: 'Update a chat', + }, + ], + default: 'getAll', + }, +]; + +export const chatFields: INodeProperties[] = [ + { + displayName: 'Name', + name: 'chatName', + type: 'string', + required: true, + default: "", + displayOptions: { show: { resource: ['chat'], operation: ['create'] } }, + placeholder: '🤿 aqua', + routing: { send: { type: 'body', property: 'name' } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['chat'], operation: ['create'] } }, + options: [ + { + displayName: 'Channel', + name: 'channel', + type: 'boolean', + default: false, + description: 'Whether this is a channel', + routing: { send: { type: 'body', property: 'channel' } }, + }, + { + displayName: 'Group Tag IDs', + name: 'groupTagIds', + type: 'string', + default: "", + description: 'Array of tag IDs to be added as members', + placeholder: '86,18', + }, + { + displayName: 'Member IDs', + name: 'memberIds', + type: 'string', + default: "", + description: 'Array of user IDs who will become members', + placeholder: '186,187', + }, + { + displayName: 'Public', + name: 'public', + type: 'boolean', + default: false, + description: 'Whether to publicly accessible', + routing: { send: { type: 'body', property: 'public' } }, + }, + ], + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['chat'], operation: ['getAll'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['chat'], operation: ['getAll'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['chat'], operation: ['getAll'] } }, + }, + { + displayName: 'Availability', + name: 'availability', + type: 'options', + options: [{ name: 'Is Member', value: 'is_member', description: 'Chats where the user is a member' }, +{ name: 'Public', value: 'public', description: 'All public chats in the workspace, regardless of user membership' }], + default: "", + description: 'Parameter that controls chat availability and filtering for the user', + displayOptions: { show: { resource: ['chat'], operation: ['getAll'] } }, + routing: { send: { type: 'query', property: 'availability' } }, + }, + { + displayName: 'Last Message At After', + name: 'lastMessageAtAfter', + type: 'dateTime', + default: "", + description: 'Filter by last message creation time. Returns chats where the last message was created no earlier than the specified time (in YYYY-MM-DDThh:mm:ss.sssZ format).', + placeholder: '2025-01-01T00:00:00.000Z', + displayOptions: { show: { resource: ['chat'], operation: ['getAll'] } }, + routing: { send: { type: 'query', property: 'last_message_at_after' } }, + }, + { + displayName: 'Last Message At Before', + name: 'lastMessageAtBefore', + type: 'dateTime', + default: "", + description: 'Filter by last message creation time. Returns chats where the last message was created no later than the specified time (in YYYY-MM-DDThh:mm:ss.sssZ format).', + placeholder: '2025-02-01T00:00:00.000Z', + displayOptions: { show: { resource: ['chat'], operation: ['getAll'] } }, + routing: { send: { type: 'query', property: 'last_message_at_before' } }, + }, + { + displayName: 'Personal', + name: 'personal', + type: 'boolean', + default: false, + description: 'Whether to filter by direct and group chats. If not specified, all chats are returned.', + displayOptions: { show: { resource: ['chat'], operation: ['getAll'] } }, + routing: { send: { type: 'query', property: 'personal' } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'Chat ID', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchChats', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 334', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/chats/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/chats/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/chats/(\\d+)', errorMessage: 'Not a valid Pachca chat URL' } }], + }, + ], + displayOptions: { show: { resource: ['chat'], operation: ['get'] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['chat'], operation: ['get'] } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'Chat ID', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchChats', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 334', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/chats/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/chats/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/chats/(\\d+)', errorMessage: 'Not a valid Pachca chat URL' } }], + }, + ], + displayOptions: { show: { resource: ['chat'], operation: ['update'] } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['chat'], operation: ['update'] } }, + options: [ + { + displayName: 'Name', + name: 'chatName', + type: 'string', + default: "", + placeholder: 'Pool', + routing: { send: { type: 'body', property: 'name' } }, + }, + { + displayName: 'Public', + name: 'public', + type: 'boolean', + default: false, + description: 'Whether to publicly accessible', + routing: { send: { type: 'body', property: 'public' } }, + }, + ], + }, + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'Chat ID', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchChats', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 334', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/chats/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/chats/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/chats/(\\d+)', errorMessage: 'Not a valid Pachca chat URL' } }], + }, + ], + displayOptions: { show: { resource: ['chat'], operation: ['archive'] } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'Chat ID', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchChats', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 334', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/chats/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/chats/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/chats/(\\d+)', errorMessage: 'Not a valid Pachca chat URL' } }], + }, + ], + displayOptions: { show: { resource: ['chat'], operation: ['unarchive'] } }, + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/CustomPropertyDescription.ts b/integrations/n8n/nodes/Pachca/V2/CustomPropertyDescription.ts new file mode 100644 index 00000000..05970015 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/CustomPropertyDescription.ts @@ -0,0 +1,40 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const customPropertyOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['customProperty'] } }, + options: [ + { + name: 'Get', + value: 'get', + action: 'Get a custom property', + }, + ], + default: 'get', + }, +]; + +export const customPropertyFields: INodeProperties[] = [ + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['customProperty'], operation: ['get'] } }, + }, + { + displayName: 'Entity Type', + name: 'entityType', + type: 'options', + options: [{ name: 'Task', value: 'Task' }, +{ name: 'User', value: 'User' }], + default: "", + displayOptions: { show: { resource: ['customProperty'], operation: ['get'] } }, + routing: { send: { type: 'query', property: 'entity_type' } }, + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/ExportDescription.ts b/integrations/n8n/nodes/Pachca/V2/ExportDescription.ts new file mode 100644 index 00000000..5379c29c --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/ExportDescription.ts @@ -0,0 +1,118 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const exportOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['export'] } }, + options: [ + { + name: 'Create', + value: 'create', + action: 'Create a chat export', + }, + { + name: 'Get', + value: 'get', + action: 'Get a chat export', + }, + ], + default: 'create', + }, +]; + +export const exportFields: INodeProperties[] = [ + { + displayName: 'Requires owner role and the "Corporation" plan', + name: 'exportCreateNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['export'], operation: ['create'] } }, + }, + { + displayName: 'Start At', + name: 'startAt', + type: 'string', + required: true, + default: "", + description: 'Export start date (ISO-8601, UTC+0) in YYYY-MM-DD format', + displayOptions: { show: { resource: ['export'], operation: ['create'] } }, + placeholder: '2025-03-20', + routing: { send: { type: 'body', property: 'start_at' } }, + }, + { + displayName: 'End At', + name: 'endAt', + type: 'string', + required: true, + default: "", + description: 'Export end date (ISO-8601, UTC+0) in YYYY-MM-DD format', + displayOptions: { show: { resource: ['export'], operation: ['create'] } }, + placeholder: '2025-03-20', + routing: { send: { type: 'body', property: 'end_at' } }, + }, + { + displayName: 'Webhook URL', + name: 'webhookUrl', + type: 'string', + required: true, + default: "", + description: 'URL to receive a webhook when the export is complete', + hint: 'Set this to a Webhook node URL in another workflow to receive the export-ready notification', + displayOptions: { show: { resource: ['export'], operation: ['create'] } }, + placeholder: 'https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2', + routing: { send: { type: 'body', property: 'webhook_url' } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['export'], operation: ['create'] } }, + options: [ + { + displayName: 'Chat IDs', + name: 'chatIds', + type: 'string', + default: "", + description: 'Array of chat IDs. Specify to export messages from specific chats only.', + placeholder: '1381521', + }, + { + displayName: 'Skip Chats File', + name: 'skipChatsFile', + type: 'boolean', + default: false, + description: 'Whether to skip generating the chat list file (chats.JSON)', + routing: { send: { type: 'body', property: 'skip_chats_file' } }, + }, + ], + }, + { + displayName: 'ID', + name: 'id', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['export'], operation: ['get'] } }, + description: 'Export ID', + }, + { + displayName: 'Requires owner role and the "Corporation" plan', + name: 'exportGetNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['export'], operation: ['get'] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['export'], operation: ['get'] } }, + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/FileDescription.ts b/integrations/n8n/nodes/Pachca/V2/FileDescription.ts new file mode 100644 index 00000000..fcf318ff --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/FileDescription.ts @@ -0,0 +1,76 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const fileOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['file'] } }, + options: [ + { + name: 'Create', + value: 'create', + action: 'Create a file', + }, + ], + default: 'create', + }, +]; + +export const fileFields: INodeProperties[] = [ + { + displayName: 'File Source', + name: 'fileSource', + type: 'options', + options: [ + { name: 'Binary Data', value: 'binary' }, + { name: 'URL', value: 'url' }, + ], + default: 'binary', + description: 'Where to get the file to upload', + displayOptions: { show: { resource: ['file'], operation: ['create', 'upload'] } }, + }, + { + displayName: 'File URL', + name: 'fileUrl', + type: 'string', + required: true, + default: '', + description: 'URL of the file to upload', + displayOptions: { show: { resource: ['file'], operation: ['create', 'upload'], fileSource: ['url'] } }, + }, + { + displayName: 'Input Binary Field', + name: 'binaryProperty', + type: 'string', + required: true, + default: 'data', + hint: 'The name of the input binary field containing the file to be uploaded', + displayOptions: { show: { resource: ['file'], operation: ['create', 'upload'], fileSource: ['binary'] } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['file'], operation: ['create', 'upload'] } }, + options: [ + { + displayName: 'Content Type', + name: 'contentType', + type: 'string', + default: '', + description: 'MIME type of the file (e.g. image/png). If not set, auto-detected from file extension.', + }, + { + displayName: 'File Name', + name: 'fileName', + type: 'string', + default: '', + description: 'Name of the file. If not set, auto-detected from source.', + }, + ], + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/FormDescription.ts b/integrations/n8n/nodes/Pachca/V2/FormDescription.ts new file mode 100644 index 00000000..3120065f --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/FormDescription.ts @@ -0,0 +1,337 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const formOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['form'] } }, + options: [ + { + name: 'Create', + value: 'create', + action: 'Create a form', + }, + ], + default: 'create', + }, +]; + +export const formFields: INodeProperties[] = [ + { + displayName: 'Title', + name: 'formTitle', + type: 'string', + required: true, + default: "", + description: 'View title', + displayOptions: { show: { resource: ['form'], operation: ['create'] } }, + placeholder: 'Vacation notification', + routing: { send: { type: 'body', property: 'title' } }, + }, + { + displayName: 'Type', + name: 'type', + type: 'options', + required: true, + options: [{ name: 'Modal', value: 'modal', description: 'Modal window' }], + default: "modal", + description: 'View opening method', + displayOptions: { show: { resource: ['form'], operation: ['create'] } }, + routing: { send: { type: 'body', property: 'type' } }, + }, + { + displayName: 'Trigger ID', + name: 'triggerId', + type: 'string', + required: true, + default: "", + description: 'Unique event identifier (received, for example, in the outgoing webhook for a button click)', + hint: 'Trigger ID from a button press webhook event — expires in 3 seconds', + displayOptions: { show: { resource: ['form'], operation: ['create'] } }, + placeholder: '791a056b-006c-49dd-834b-c633fde52fe8', + routing: { send: { type: 'body', property: 'trigger_id' } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['form'], operation: ['create'] } }, + options: [ + { + displayName: 'Callback ID', + name: 'callbackId', + type: 'string', + default: "", + description: 'Optional identifier for recognizing this view, which will be sent to your application when the user submits the form. Use this field, for example, to determine which form the user was supposed to fill out.', + placeholder: 'timeoff_reguest_form', + routing: { send: { type: 'body', property: 'callback_id' } }, + }, + { + displayName: 'Close Text', + name: 'closeText', + type: 'string', + default: "Cancel", + description: 'Close button text', + placeholder: 'Close', + routing: { send: { type: 'body', property: 'close_text' } }, + }, + { + displayName: 'Private Metadata', + name: 'privateMetadata', + type: 'string', + default: "", + description: 'Optional string that will be sent to your application when the user submits the form. Use this field, for example, to pass additional information in `JSON` format along with the form data.', + placeholder: '{"timeoff_id":4378}', + routing: { send: { type: 'body', property: 'private_metadata' } }, + }, + { + displayName: 'Submit Text', + name: 'submitText', + type: 'string', + default: "Submit", + description: 'Submit button text', + placeholder: 'Submit request', + routing: { send: { type: 'body', property: 'submit_text' } }, + }, + ], + }, + { + displayName: 'Builder Mode', + name: 'formBuilderMode', + type: 'options', + options: [ + { name: 'Template', value: 'template', displayOptions: { show: { '@version': [1] } } }, + { name: 'Visual Builder', value: 'builder' }, + { name: 'JSON', value: 'json' }, + ], + default: 'builder', + description: 'Build form visually, use a template, or paste JSON', + displayOptions: { show: { resource: ['form'], operation: ['create'] } }, + }, + { + displayName: 'Template', + name: 'formTemplate', + type: 'options', + options: [ + { name: 'Access Request (V1)', value: 'access_request', description: 'Access request form' }, + { name: 'Bug Report', value: 'bug_report', description: 'Bug report with severity and screenshots' }, + { name: 'Feedback', value: 'feedback', description: 'Collect user feedback with rating' }, + { name: 'Feedback Form (V1)', value: 'feedback_form', description: 'Feedback form' }, + { name: 'Survey', value: 'survey', description: 'Multi-question survey with radio and checkboxes' }, + { name: 'Survey Form (V1)', value: 'survey_form', description: 'Survey form' }, + { name: 'Task Request (V1)', value: 'task_request', description: 'Task creation form' }, + { name: 'Time Off Request', value: 'timeoff', description: 'Vacation request with dates and documents' }, + { name: 'Time-Off Request (V1)', value: 'timeoff_request', description: 'Time-off request form' }, + ], + default: 'feedback', + description: 'Select a predefined form template', + displayOptions: { show: { resource: ['form'], operation: ['create'], formBuilderMode: ['template'] } }, + }, + { + displayName: 'Form Blocks', + name: 'formBlocks', + type: 'fixedCollection', + typeOptions: { multipleValues: true, sortable: true }, + default: {}, + description: 'Add form blocks using the visual builder', + displayOptions: { show: { resource: ['form'], operation: ['create'], formBuilderMode: ['builder'] } }, + options: [{ + name: 'block', + displayName: 'Block', + values: [ + { + displayName: 'Allowed File Types', + name: 'filetypes', + type: 'string', + default: '', + placeholder: 'png,jpg,pdf', + description: 'Comma-separated list of allowed file extensions', + displayOptions: { show: { type: ['file_input'] } }, + }, + { + displayName: 'Field Name', + name: 'name', + type: 'string', + default: '', + description: 'Unique field identifier (used in form submission data)', + displayOptions: { show: { type: ['input', 'select', 'radio', 'checkbox', 'date', 'time', 'file_input'] } }, + }, + { + displayName: 'Hint', + name: 'hint', + type: 'string', + default: '', + displayOptions: { show: { type: ['input', 'select', 'radio', 'checkbox', 'date', 'time', 'file_input'] } }, + }, + { + displayName: 'Initial Date', + name: 'initial_date', + type: 'string', + default: '', + placeholder: '2024-01-01', + displayOptions: { show: { type: ['date'] } }, + }, + { + displayName: 'Initial Time', + name: 'initial_time', + type: 'string', + default: '', + placeholder: '09:00', + displayOptions: { show: { type: ['time'] } }, + }, + { + displayName: 'Initial Value', + name: 'initial_value', + type: 'string', + default: '', + displayOptions: { show: { type: ['input'] } }, + }, + { + displayName: 'Label', + name: 'label', + type: 'string', + default: '', + displayOptions: { show: { type: ['input', 'select', 'radio', 'checkbox', 'date', 'time', 'file_input'] } }, + }, + { + displayName: 'Max Files', + name: 'max_files', + type: 'number', + default: 10, + displayOptions: { show: { type: ['file_input'] } }, + }, + { + displayName: 'Max Length', + name: 'max_length', + type: 'number', + default: 0, + displayOptions: { show: { type: ['input'] } }, + }, + { + displayName: 'Min Length', + name: 'min_length', + type: 'number', + default: 0, + displayOptions: { show: { type: ['input'] } }, + }, + { + displayName: 'Multiline', + name: 'multiline', + type: 'boolean', + default: false, + displayOptions: { show: { type: ['input'] } }, + }, + { + displayName: 'Options', + name: 'options', + type: 'fixedCollection', + typeOptions: { multipleValues: true }, + default: {}, + displayOptions: { show: { type: ['select', 'radio', 'checkbox'] } }, + options: [{ + name: 'option', + displayName: 'Option', + values: [ + { displayName: 'Checked by Default', name: 'checked', type: 'boolean', default: false }, + { displayName: 'Description', name: 'description', type: 'string', default: '' }, + { displayName: 'Selected by Default', name: 'selected', type: 'boolean', default: false }, + { displayName: 'Text', name: 'text', type: 'string', default: '' }, + { displayName: 'Value', name: 'value', type: 'string', default: '' }, + ], + }], + }, + { + displayName: 'Placeholder', + name: 'placeholder', + type: 'string', + default: '', + displayOptions: { show: { type: ['input'] } }, + }, + { + displayName: 'Required', + name: 'required', + type: 'boolean', + default: false, + displayOptions: { show: { type: ['input', 'select', 'radio', 'checkbox', 'date', 'time', 'file_input'] } }, + }, + { + displayName: 'Text', + name: 'text', + type: 'string', + default: '', + displayOptions: { show: { type: ['header', 'plain_text', 'markdown'] } }, + }, + { + displayName: 'Type', + name: 'type', + type: 'options', + options: [ + { name: '☑️ Checkboxes', value: 'checkbox' }, + { name: '➖ Divider', value: 'divider' }, + { name: '📄 Plain Text', value: 'plain_text' }, + { name: '📅 Date Picker', value: 'date' }, + { name: '📋 Select Dropdown', value: 'select' }, + { name: '📎 File Upload', value: 'file_input' }, + { name: '📝 Header', value: 'header' }, + { name: '📝 Markdown', value: 'markdown' }, + { name: '📝 Text Input', value: 'input' }, + { name: '🔘 Radio Buttons', value: 'radio' }, + { name: '🕐 Time Picker', value: 'time' }, + ], + default: 'input', + }, + ], + }], + }, + { + displayName: 'Blocks (JSON)', + name: 'formBlocks', + type: 'json', + required: true, + default: '[]', + description: 'Paste an array of blocks or the full form JSON from the visual form builder', + hint: 'Build your form visually at dev.pachca.com/guides/forms/overview, then paste the JSON here', + placeholder: '{"title":"My form","blocks":[{"type":"input","name":"field_1","label":"Your name"}]}', + displayOptions: { show: { resource: ['form'], operation: ['create'], formBuilderMode: ['json'] } }, + }, + { + displayName: 'This operation is deprecated. In v2, use the Pachca Trigger node to receive form submissions via webhook, then process the data with standard n8n nodes.', + name: 'processSubmissionNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['form'], operation: ['processSubmission'] } }, + }, + { + displayName: 'Form Type', + name: 'formType', + type: 'options', + options: [ + { name: 'Auto-Detect', value: 'auto' }, + { name: 'Feedback Form', value: 'feedback_form' }, + { name: 'Task Request', value: 'task_request' }, + { name: 'Timeoff Request', value: 'timeoff_request' }, + ], + default: 'auto', + description: 'Form type for processing data', + displayOptions: { show: { resource: ['form'], operation: ['processSubmission'] } }, + }, + { + displayName: 'Validation Errors', + name: 'validationErrors', + type: 'json', + default: '{}', + description: 'Validation errors to send to user (JSON object with field names and messages)', + displayOptions: { show: { resource: ['form'], operation: ['processSubmission'] } }, + }, + { + displayName: 'This operation is deprecated. In v2, form templates are available directly in the Visual Builder mode when creating a form.', + name: 'getTemplatesNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['form'], operation: ['getTemplates'] } }, + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/GroupTagDescription.ts b/integrations/n8n/nodes/Pachca/V2/GroupTagDescription.ts new file mode 100644 index 00000000..e334ce58 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/GroupTagDescription.ts @@ -0,0 +1,215 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const groupTagOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['groupTag'] } }, + options: [ + { + name: 'Create', + value: 'create', + action: 'Create a group tag', + }, + { + name: 'Delete', + value: 'delete', + action: 'Delete a group tag', + }, + { + name: 'Get', + value: 'get', + action: 'Get a group tag', + }, + { + name: 'Get Many', + value: 'getAll', + action: 'Get many group tags', + }, + { + name: 'Get Many Users', + value: 'getAllUsers', + action: 'Get many group tag users', + }, + { + name: 'Update', + value: 'update', + action: 'Update a group tag', + }, + ], + default: 'getAll', + }, +]; + +export const groupTagFields: INodeProperties[] = [ + { + displayName: 'Requires admin permissions', + name: 'groupTagCreateNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['groupTag'], operation: ['create'] } }, + }, + { + displayName: 'Name', + name: 'groupTagName', + type: 'string', + required: true, + default: "", + description: 'Tag name', + displayOptions: { show: { resource: ['groupTag'], operation: ['create'] } }, + placeholder: 'New tag name', + routing: { send: { type: 'body', property: 'name' } }, + }, + { + displayName: 'Requires admin permissions', + name: 'groupTagGetAllNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['groupTag'], operation: ['getAll'] } }, + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['groupTag'], operation: ['getAll'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['groupTag'], operation: ['getAll'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['groupTag'], operation: ['getAll'] } }, + }, + { + displayName: 'Names', + name: 'names', + type: 'string', + default: "", + description: 'Array of tag names to filter by', + placeholder: 'Design,Product', + displayOptions: { show: { resource: ['groupTag'], operation: ['getAll'] } }, + routing: { send: { type: 'query', property: 'names' } }, + }, + { + displayName: 'ID', + name: 'groupTagId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['groupTag'], operation: ['get'] } }, + description: 'Tag ID', + }, + { + displayName: 'Requires admin permissions', + name: 'groupTagGetNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['groupTag'], operation: ['get'] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['groupTag'], operation: ['get'] } }, + }, + { + displayName: 'ID', + name: 'groupTagId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['groupTag'], operation: ['update'] } }, + description: 'Tag ID', + }, + { + displayName: 'Requires admin permissions', + name: 'groupTagUpdateNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['groupTag'], operation: ['update'] } }, + }, + { + displayName: 'Name', + name: 'groupTagName', + type: 'string', + required: true, + default: "", + description: 'Tag name', + displayOptions: { show: { resource: ['groupTag'], operation: ['update'] } }, + placeholder: 'New tag name', + routing: { send: { type: 'body', property: 'name' } }, + }, + { + displayName: 'ID', + name: 'groupTagId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['groupTag'], operation: ['delete'] } }, + description: 'Tag ID', + }, + { + displayName: 'Requires admin permissions', + name: 'groupTagDeleteNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['groupTag'], operation: ['delete'] } }, + }, + { + displayName: 'ID', + name: 'groupTagId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['groupTag'], operation: ['getAllUsers'] } }, + description: 'Tag ID', + }, + { + displayName: 'Requires admin permissions', + name: 'groupTagGetAllUsersNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['groupTag'], operation: ['getAllUsers'] } }, + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['groupTag'], operation: ['getAllUsers'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['groupTag'], operation: ['getAllUsers'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['groupTag'], operation: ['getAllUsers'] } }, + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/LinkPreviewDescription.ts b/integrations/n8n/nodes/Pachca/V2/LinkPreviewDescription.ts new file mode 100644 index 00000000..63a1af17 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/LinkPreviewDescription.ts @@ -0,0 +1,41 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const linkPreviewOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['linkPreview'] } }, + options: [ + { + name: 'Create', + value: 'create', + action: 'Create a link preview', + }, + ], + default: 'create', + }, +]; + +export const linkPreviewFields: INodeProperties[] = [ + { + displayName: 'ID', + name: 'id', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['linkPreview'], operation: ['create'] } }, + description: 'Message ID', + }, + { + displayName: 'Link Previews', + name: 'linkPreviews', + type: 'string', + required: true, + default: "", + description: 'JSON map of link previews, where each key is a `URL` received in the outgoing webhook about a new message', + displayOptions: { show: { resource: ['linkPreview'], operation: ['create'] } }, + routing: { send: { type: 'body', property: 'link_previews' } }, + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/MemberDescription.ts b/integrations/n8n/nodes/Pachca/V2/MemberDescription.ts new file mode 100644 index 00000000..6f65b6b5 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/MemberDescription.ts @@ -0,0 +1,426 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const memberOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['member'] } }, + options: [ + { + name: 'Add Group Tags', + value: 'addGroupTags', + action: 'Add group tags to chat member', + }, + { + name: 'Create', + value: 'create', + action: 'Create a chat member', + }, + { + name: 'Delete', + value: 'delete', + action: 'Delete a chat member', + }, + { + name: 'Get Many', + value: 'getAll', + action: 'Get many chat members', + }, + { + name: 'Leave', + value: 'leave', + action: 'Leave chat', + }, + { + name: 'Remove Group Tags', + value: 'removeGroupTags', + action: 'Remove group tags from chat member', + }, + { + name: 'Update', + value: 'update', + action: 'Update a chat member', + }, + ], + default: 'getAll', + }, +]; + +export const memberFields: INodeProperties[] = [ + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'Chat ID', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchChats', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 334', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/chats/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/chats/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/chats/(\\d+)', errorMessage: 'Not a valid Pachca chat URL' } }], + }, + ], + displayOptions: { show: { resource: ['member'], operation: ['addGroupTags'] } }, + }, + { + displayName: 'Group Tag IDs', + name: 'groupTagIds', + type: 'string', + required: true, + default: "", + description: 'Array of tag IDs to be added as members', + displayOptions: { show: { resource: ['member'], operation: ['addGroupTags'] } }, + placeholder: '86,18', + }, + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'Chat ID', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchChats', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 334', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/chats/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/chats/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/chats/(\\d+)', errorMessage: 'Not a valid Pachca chat URL' } }], + }, + ], + displayOptions: { show: { resource: ['member'], operation: ['removeGroupTags'] } }, + }, + { + displayName: 'Tag ID', + name: 'tagId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['member'], operation: ['removeGroupTags'] } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'Chat ID', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchChats', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 334', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/chats/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/chats/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/chats/(\\d+)', errorMessage: 'Not a valid Pachca chat URL' } }], + }, + ], + displayOptions: { show: { resource: ['member'], operation: ['leave'] } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'Chat ID', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchChats', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 334', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/chats/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/chats/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/chats/(\\d+)', errorMessage: 'Not a valid Pachca chat URL' } }], + }, + ], + displayOptions: { show: { resource: ['member'], operation: ['getAll'] } }, + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['member'], operation: ['getAll'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['member'], operation: ['getAll'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['member'], operation: ['getAll'] } }, + }, + { + displayName: 'Role', + name: 'role', + type: 'options', + options: [{ name: 'Admin', value: 'admin' }, +{ name: 'All', value: 'all', description: 'Any role' }, +{ name: 'Editor', value: 'editor' }, +{ name: 'Member', value: 'member', description: 'Member/subscriber' }, +{ name: 'Owner', value: 'owner' }], + default: "", + description: 'Role in the chat', + displayOptions: { show: { resource: ['member'], operation: ['getAll'] } }, + routing: { send: { type: 'query', property: 'role' } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'Chat ID (conversation, channel, or thread chat)', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchChats', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 334', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/chats/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/chats/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/chats/(\\d+)', errorMessage: 'Not a valid Pachca chat URL' } }], + }, + ], + displayOptions: { show: { resource: ['member'], operation: ['create'] } }, + }, + { + displayName: 'Member IDs', + name: 'memberIds', + type: 'string', + required: true, + default: "", + description: 'Array of user IDs who will become members', + displayOptions: { show: { resource: ['member'], operation: ['create'] } }, + placeholder: '186,187', + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['member'], operation: ['create'] } }, + options: [ + { + displayName: 'Silent', + name: 'silent', + type: 'boolean', + default: false, + description: 'Whether to do not create a system message in the chat about adding a member', + routing: { send: { type: 'body', property: 'silent' } }, + }, + ], + }, + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'Chat ID', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchChats', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 334', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/chats/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/chats/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/chats/(\\d+)', errorMessage: 'Not a valid Pachca chat URL' } }], + }, + ], + displayOptions: { show: { resource: ['member'], operation: ['delete'] } }, + }, + { + displayName: 'User ID', + name: 'userId', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchUsers', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 186', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/users/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/users/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/users/(\\d+)', errorMessage: 'Not a valid Pachca user URL' } }], + }, + ], + displayOptions: { show: { resource: ['member'], operation: ['delete'] } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'Chat ID', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchChats', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 334', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/chats/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/chats/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/chats/(\\d+)', errorMessage: 'Not a valid Pachca chat URL' } }], + }, + ], + displayOptions: { show: { resource: ['member'], operation: ['update'] } }, + }, + { + displayName: 'User ID', + name: 'userId', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchUsers', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 186', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/users/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/users/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/users/(\\d+)', errorMessage: 'Not a valid Pachca user URL' } }], + }, + ], + displayOptions: { show: { resource: ['member'], operation: ['update'] } }, + }, + { + displayName: 'Role', + name: 'role', + type: 'options', + required: true, + options: [{ name: 'Admin', value: 'admin' }, +{ name: 'Editor', value: 'editor', description: 'Editor (available for channels only)' }, +{ name: 'Member', value: 'member', description: 'Member or subscriber' }], + default: "member", + displayOptions: { show: { resource: ['member'], operation: ['update'] } }, + routing: { send: { type: 'body', property: 'role' } }, + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/MessageDescription.ts b/integrations/n8n/nodes/Pachca/V2/MessageDescription.ts new file mode 100644 index 00000000..daa58d20 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/MessageDescription.ts @@ -0,0 +1,566 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const messageOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['message'] } }, + options: [ + { + name: 'Create', + value: 'create', + action: 'Create a message', + }, + { + name: 'Delete', + value: 'delete', + action: 'Delete a message', + }, + { + name: 'Get', + value: 'get', + action: 'Get a message', + }, + { + name: 'Get Many', + value: 'getAll', + action: 'Get many messages', + }, + { + name: 'Pin', + value: 'pin', + action: 'Pin a message', + }, + { + name: 'Unpin', + value: 'unpin', + action: 'Unpin a message', + }, + { + name: 'Update', + value: 'update', + action: 'Update a message', + }, + ], + default: 'create', + }, +]; + +export const messageFields: INodeProperties[] = [ + { + displayName: 'Entity Type', + name: 'entityType', + type: 'options', + required: true, + options: [{ name: 'Discussion', value: 'discussion', description: 'Conversation or channel' }, +{ name: 'Thread', value: 'thread' }, +{ name: 'User', value: 'user' }], + default: "discussion", + displayOptions: { show: { resource: ['message'], operation: ['create'] } }, + routing: { send: { type: 'body', property: 'entity_type' } }, + }, + { + displayName: 'Entity ID', + name: 'entityId', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchEntities', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 334', + }, + ], + displayOptions: { show: { resource: ['message'], operation: ['create'] } }, + routing: { send: { type: 'body', property: 'entity_id' } }, + }, + { + displayName: 'Content', + name: 'content', + type: 'string', + required: true, + typeOptions: { rows: 4 }, + default: "", + description: 'Message text', + displayOptions: { show: { resource: ['message'], operation: ['create'] } }, + placeholder: 'Yesterday we sold 756 t-shirts (10% more than last Sunday)', + routing: { send: { type: 'body', property: 'content' } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['message'], operation: ['create'] } }, + options: [ + { + displayName: 'Display Avatar URL', + name: 'displayAvatarUrl', + type: 'string', + default: "", + description: 'Custom sender avatar URL for this message. This field can only be used with a bot access_token.', + placeholder: 'https://example.com/avatar.png', + routing: { send: { type: 'body', property: 'display_avatar_url' } }, + }, + { + displayName: 'Display Name', + name: 'displayName', + type: 'string', + default: "", + description: 'Custom sender display name for this message. This field can only be used with a bot access_token.', + placeholder: 'Support Bot', + routing: { send: { type: 'body', property: 'display_name' } }, + }, + { + displayName: 'Files', + name: 'files', + type: 'fixedCollection', + typeOptions: { multipleValues: true }, + options: [{ + name: 'file', + displayName: 'File', + values: [ + { + displayName: 'File Type', + name: 'file_type', + type: 'options', + options: [{ name: 'File', value: 'file', description: 'Regular file' }, +{ name: 'Image', value: 'image' }], + default: "", + }, + { + displayName: 'Height', + name: 'height', + type: 'number', + default: 0, + description: 'Image height in px (used when file_type is set to image)', + }, + { + displayName: 'Key', + name: 'key', + type: 'string', + default: "", + description: 'File path obtained from [file upload](POST /direct_url)', + }, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: "", + description: 'File name to display to the user (recommended to include the file extension)', + }, + { + displayName: 'Size', + name: 'size', + type: 'number', + default: 0, + description: 'File size in bytes, displayed to the user', + }, + { + displayName: 'Width', + name: 'width', + type: 'number', + default: 0, + description: 'Image width in px (used when file_type is set to image)', + }, + ], + }], + default: [], + description: 'Files to attach', + hint: 'Upload a file first using File > Create, then use the returned key here', + routing: { send: { type: 'body', property: 'files' } }, + }, + { + displayName: 'Link Preview', + name: 'linkPreview', + type: 'boolean', + default: false, + description: 'Whether to display a preview of the first link found in the message text', + routing: { send: { type: 'body', property: 'link_preview' } }, + }, + { + displayName: 'Parent Message ID', + name: 'parentMessageId', + type: 'number', + default: 0, + description: 'Message ID. Specify when sending a reply to another message.', + placeholder: '194270', + routing: { send: { type: 'body', property: 'parent_message_id' } }, + }, + { + displayName: 'Skip Invite Mentions', + name: 'skipInviteMentions', + type: 'boolean', + default: false, + description: 'Whether to skip adding mentioned users to the thread. Only works when sending a message to a thread.', + routing: { send: { type: 'body', property: 'skip_invite_mentions' } }, + }, + ], + }, + { + displayName: 'Button Layout', + name: 'buttonLayout', + type: 'options', + options: [ + { name: 'None', value: 'none' }, + { name: 'Single Row', value: 'single_row' }, + { name: 'Multiple Rows', value: 'multiple_rows' }, + { name: 'Raw JSON', value: 'raw_json' }, + ], + default: 'none', + description: 'How to layout buttons in the message', + displayOptions: { show: { resource: ['message'], operation: ['create'] } }, + }, + { + displayName: 'Buttons', + name: 'buttons', + type: 'fixedCollection', + typeOptions: { multipleValues: true }, + options: [{ + name: 'button', + displayName: 'Button', + values: [ + { + displayName: 'Text', + name: 'text', + type: 'string', + default: '', + description: 'Button label (max 255 characters)', + placeholder: 'Click me', + }, + { + displayName: 'Type', + name: 'type', + type: 'options', + options: [ + { name: 'Data (Webhook)', value: 'data' }, + { name: 'URL (Link)', value: 'url' }, + ], + default: 'data', + description: 'Data sends a webhook on click, URL opens a link', + }, + { + displayName: 'Data', + name: 'data', + type: 'string', + default: '', + description: 'Data sent via webhook when button is clicked (max 255 characters)', + placeholder: 'action_confirm', + displayOptions: { show: { type: ['data'] } }, + }, + { + displayName: 'URL', + name: 'url', + type: 'string', + default: '', + description: 'URL to open when button is clicked', + placeholder: 'https://example.com', + displayOptions: { show: { type: ['url'] } }, + }, + ], + }], + default: {}, + description: 'Buttons to add to the message. Max 100 buttons, up to 8 per row.', + displayOptions: { show: { resource: ['message'], operation: ['create'], buttonLayout: ['single_row', 'multiple_rows'] } }, + }, + { + displayName: 'Buttons (JSON)', + name: 'rawJsonButtons', + type: 'json', + default: '[]', + description: 'Buttons as JSON: array of rows, each row is an array of buttons. To remove all buttons, send [].', + placeholder: '[[{"text":"OK","data":"confirm"}],[{"text":"Link","url":"https://example.com"}]]', + displayOptions: { show: { resource: ['message'], operation: ['create'], buttonLayout: ['raw_json'] } }, + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['message'], operation: ['getAll'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['message'], operation: ['getAll'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['message'], operation: ['getAll'] } }, + }, + { + displayName: 'Chat ID', + name: 'chatId', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + description: 'Chat ID (conversation, channel, direct message, or thread chat)', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchChats', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 198', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/chats/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/chats/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/chats/(\\d+)', errorMessage: 'Not a valid Pachca chat URL' } }], + }, + ], + displayOptions: { show: { resource: ['message'], operation: ['getAll'] } }, + routing: { send: { type: 'query', property: 'chat_id' } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['message'], operation: ['get'] } }, + description: 'Message ID', + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['message'], operation: ['get'] } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['message'], operation: ['update'] } }, + description: 'Message ID', + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['message'], operation: ['update'] } }, + options: [ + { + displayName: 'Content', + name: 'content', + type: 'string', + typeOptions: { rows: 4 }, + default: "", + description: 'Message text', + placeholder: 'Try to spell these correctly on the first attempt: bureaucracy, accommodate, definitely, entrepreneur, liaison, necessary, surveillance, questionnaire.', + routing: { send: { type: 'body', property: 'content' } }, + }, + { + displayName: 'Display Avatar URL', + name: 'displayAvatarUrl', + type: 'string', + default: "", + description: 'Custom sender avatar URL for this message. This field can only be used with a bot access_token.', + placeholder: 'https://example.com/avatar.png', + routing: { send: { type: 'body', property: 'display_avatar_url' } }, + }, + { + displayName: 'Display Name', + name: 'displayName', + type: 'string', + default: "", + description: 'Custom sender display name for this message. This field can only be used with a bot access_token.', + placeholder: 'Support Bot', + routing: { send: { type: 'body', property: 'display_name' } }, + }, + { + displayName: 'Files', + name: 'files', + type: 'fixedCollection', + typeOptions: { multipleValues: true }, + options: [{ + name: 'file', + displayName: 'File', + values: [ + { + displayName: 'File Type', + name: 'file_type', + type: 'string', + default: "", + description: 'File type: file (file), image (image)', + }, + { + displayName: 'Height', + name: 'height', + type: 'number', + default: 0, + description: 'Image height in px (used when file_type is set to image)', + }, + { + displayName: 'Key', + name: 'key', + type: 'string', + default: "", + description: 'File path obtained from [file upload](POST /direct_url)', + }, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: "", + description: 'File name to display to the user (recommended to include the file extension)', + }, + { + displayName: 'Size', + name: 'size', + type: 'number', + default: 0, + description: 'File size in bytes, displayed to the user', + }, + { + displayName: 'Width', + name: 'width', + type: 'number', + default: 0, + description: 'Image width in px (used when file_type is set to image)', + }, + ], + }], + default: [], + description: 'Files to attach', + hint: 'Upload a file first using File > Create, then use the returned key here', + routing: { send: { type: 'body', property: 'files' } }, + }, + ], + }, + { + displayName: 'Button Layout', + name: 'buttonLayout', + type: 'options', + options: [ + { name: 'None', value: 'none' }, + { name: 'Single Row', value: 'single_row' }, + { name: 'Multiple Rows', value: 'multiple_rows' }, + { name: 'Raw JSON', value: 'raw_json' }, + ], + default: 'none', + description: 'How to layout buttons in the message', + displayOptions: { show: { resource: ['message'], operation: ['update'] } }, + }, + { + displayName: 'Buttons', + name: 'buttons', + type: 'fixedCollection', + typeOptions: { multipleValues: true }, + options: [{ + name: 'button', + displayName: 'Button', + values: [ + { + displayName: 'Text', + name: 'text', + type: 'string', + default: '', + description: 'Button label (max 255 characters)', + placeholder: 'Click me', + }, + { + displayName: 'Type', + name: 'type', + type: 'options', + options: [ + { name: 'Data (Webhook)', value: 'data' }, + { name: 'URL (Link)', value: 'url' }, + ], + default: 'data', + description: 'Data sends a webhook on click, URL opens a link', + }, + { + displayName: 'Data', + name: 'data', + type: 'string', + default: '', + description: 'Data sent via webhook when button is clicked (max 255 characters)', + placeholder: 'action_confirm', + displayOptions: { show: { type: ['data'] } }, + }, + { + displayName: 'URL', + name: 'url', + type: 'string', + default: '', + description: 'URL to open when button is clicked', + placeholder: 'https://example.com', + displayOptions: { show: { type: ['url'] } }, + }, + ], + }], + default: {}, + description: 'Buttons to add to the message. Max 100 buttons, up to 8 per row.', + displayOptions: { show: { resource: ['message'], operation: ['update'], buttonLayout: ['single_row', 'multiple_rows'] } }, + }, + { + displayName: 'Buttons (JSON)', + name: 'rawJsonButtons', + type: 'json', + default: '[]', + description: 'Buttons as JSON: array of rows, each row is an array of buttons. To remove all buttons, send [].', + placeholder: '[[{"text":"OK","data":"confirm"}],[{"text":"Link","url":"https://example.com"}]]', + displayOptions: { show: { resource: ['message'], operation: ['update'], buttonLayout: ['raw_json'] } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['message'], operation: ['delete'] } }, + description: 'Message ID', + }, + { + displayName: 'ID', + name: 'id', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['message'], operation: ['pin'] } }, + description: 'Message ID', + }, + { + displayName: 'ID', + name: 'id', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['message'], operation: ['unpin'] } }, + description: 'Message ID', + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/PachcaV2.node.ts b/integrations/n8n/nodes/Pachca/V2/PachcaV2.node.ts new file mode 100644 index 00000000..0ec0aae8 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/PachcaV2.node.ts @@ -0,0 +1,218 @@ +import type { + INodeType, + INodeTypeBaseDescription, + INodeTypeDescription, + IExecuteFunctions, + INodeExecutionData, + ILoadOptionsFunctions, + INodeListSearchResult, + INodePropertyOptions, +} from 'n8n-workflow'; +import { NodeConnectionTypes } from 'n8n-workflow'; +import { router } from '../SharedRouter'; +function formatUserName(u: { first_name: string; last_name: string; nickname: string }): string { + const fullName = [u.first_name, u.last_name] + .filter((v) => v != null && v !== '' && v !== 'null') + .join(' '); + const display = fullName || u.nickname || 'User'; + return u.nickname ? `${display} (@${u.nickname})` : display; +} + +import { securityOperations, securityFields } from './SecurityDescription'; +import { botOperations, botFields } from './BotDescription'; +import { chatOperations, chatFields } from './ChatDescription'; +import { memberOperations, memberFields } from './MemberDescription'; +import { groupTagOperations, groupTagFields } from './GroupTagDescription'; +import { messageOperations, messageFields } from './MessageDescription'; +import { linkPreviewOperations, linkPreviewFields } from './LinkPreviewDescription'; +import { reactionOperations, reactionFields } from './ReactionDescription'; +import { readMemberOperations, readMemberFields } from './ReadMemberDescription'; +import { threadOperations, threadFields } from './ThreadDescription'; +import { profileOperations, profileFields } from './ProfileDescription'; +import { searchOperations, searchFields } from './SearchDescription'; +import { taskOperations, taskFields } from './TaskDescription'; +import { userOperations, userFields } from './UserDescription'; +import { formOperations, formFields } from './FormDescription'; +import { exportOperations, exportFields } from './ExportDescription'; +import { customPropertyOperations, customPropertyFields } from './CustomPropertyDescription'; +import { fileOperations, fileFields } from './FileDescription'; + +export class PachcaV2 implements INodeType { + description: INodeTypeDescription; + + constructor(baseDescription: INodeTypeBaseDescription) { + this.description = { + ...baseDescription, + version: 2, + defaults: { name: 'Pachca' }, + usableAsTool: true, + inputs: [NodeConnectionTypes.Main], + outputs: [NodeConnectionTypes.Main], + credentials: [{ name: 'pachcaApi', required: true }], + properties: [ + { + displayName: 'Resource', + name: 'resource', + type: 'options', + noDataExpression: true, + options: [ + { name: 'Bot', value: 'bot' }, + { name: 'Chat', value: 'chat' }, + { name: 'Chat Export', value: 'export' }, + { name: 'Chat Member', value: 'member' }, + { name: 'Custom Property', value: 'customProperty' }, + { name: 'File', value: 'file' }, + { name: 'Form', value: 'form' }, + { name: 'Group Tag', value: 'groupTag' }, + { name: 'Link Preview', value: 'linkPreview' }, + { name: 'Message', value: 'message' }, + { name: 'Profile', value: 'profile' }, + { name: 'Reaction', value: 'reaction' }, + { name: 'Read Member', value: 'readMember' }, + { name: 'Search', value: 'search' }, + { name: 'Security', value: 'security' }, + { name: 'Task', value: 'task' }, + { name: 'Thread', value: 'thread' }, + { name: 'User', value: 'user' }, + ], + default: 'message', + }, + ...securityOperations, + ...securityFields, + ...botOperations, + ...botFields, + ...chatOperations, + ...chatFields, + ...memberOperations, + ...memberFields, + ...groupTagOperations, + ...groupTagFields, + ...messageOperations, + ...messageFields, + ...linkPreviewOperations, + ...linkPreviewFields, + ...reactionOperations, + ...reactionFields, + ...readMemberOperations, + ...readMemberFields, + ...threadOperations, + ...threadFields, + ...profileOperations, + ...profileFields, + ...searchOperations, + ...searchFields, + ...taskOperations, + ...taskFields, + ...userOperations, + ...userFields, + ...formOperations, + ...formFields, + ...exportOperations, + ...exportFields, + ...customPropertyOperations, + ...customPropertyFields, + ...fileOperations, + ...fileFields, + ], + }; + } + + async execute(this: IExecuteFunctions): Promise { + return router.call(this); + } + + methods = { + listSearch: { + async searchChats(this: ILoadOptionsFunctions, filter?: string): Promise { + const credentials = await this.getCredentials('pachcaApi'); + const url = filter + ? `${credentials.baseUrl}/search/chats?query=${encodeURIComponent(filter)}` + : `${credentials.baseUrl}/chats?per=50`; + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { + method: 'GET', + url, + }); + const items = response.data ?? []; + return { + results: items.map((c: { id: number; name: string }) => ({ + name: c.name, + value: c.id, + })), + }; + }, + async searchUsers(this: ILoadOptionsFunctions, filter?: string): Promise { + const credentials = await this.getCredentials('pachcaApi'); + if (!filter) return { results: [] }; + const url = `${credentials.baseUrl}/search/users?query=${encodeURIComponent(filter)}`; + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { + method: 'GET', + url, + }); + const items = response.data ?? []; + return { + results: items.map((u: { id: number; first_name: string; last_name: string; nickname: string }) => ({ + name: formatUserName(u), + value: u.id, + })), + }; + }, + async searchEntities(this: ILoadOptionsFunctions, filter?: string): Promise { + let entityType = 'discussion'; + try { + entityType = (this.getNodeParameter('entityType') as string) || 'discussion'; + } catch { + try { + entityType = (this.getCurrentNodeParameter('entityType') as string) || 'discussion'; + } catch { /* parameter may not exist yet */ } + } + const credentials = await this.getCredentials('pachcaApi'); + if (entityType === 'user') { + if (!filter) return { results: [] }; + const url = `${credentials.baseUrl}/search/users?query=${encodeURIComponent(filter)}`; + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { method: 'GET', url }); + const items = response.data ?? []; + return { + results: items.map((u: { id: number; first_name: string; last_name: string; nickname: string }) => ({ + name: formatUserName(u), + value: u.id, + })), + }; + } + if (entityType === 'thread') { + return { results: [] }; + } + const url = filter + ? `${credentials.baseUrl}/search/chats?query=${encodeURIComponent(filter)}` + : `${credentials.baseUrl}/chats?per=50`; + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { method: 'GET', url }); + const items = response.data ?? []; + return { + results: items.map((c: { id: number; name: string }) => ({ + name: c.name, + value: c.id, + })), + }; + }, + }, + loadOptions: { + async getCustomProperties(this: ILoadOptionsFunctions): Promise { + const credentials = await this.getCredentials('pachcaApi'); + const resource = this.getNodeParameter('resource') as string; + const entityType = resource === 'task' ? 'Task' : 'User'; + try { + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { + method: 'GET', + url: `${credentials.baseUrl}/custom_properties?entity_type=${entityType}`, + }); + const items = response.data ?? []; + return items.map((p: { id: number; name: string }) => ({ + name: p.name, + value: p.id, + })); + } catch { + return []; + } + }, + }, + }; +} diff --git a/integrations/n8n/nodes/Pachca/V2/ProfileDescription.ts b/integrations/n8n/nodes/Pachca/V2/ProfileDescription.ts new file mode 100644 index 00000000..21af5acf --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/ProfileDescription.ts @@ -0,0 +1,124 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const profileOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['profile'] } }, + options: [ + { + name: 'Delete Status', + value: 'deleteStatus', + action: 'Delete profile status', + }, + { + name: 'Get', + value: 'get', + action: 'Get a profile', + }, + { + name: 'Get Info', + value: 'getInfo', + action: 'Get profile info', + }, + { + name: 'Get Status', + value: 'getStatus', + action: 'Get profile status', + }, + { + name: 'Update Status', + value: 'updateStatus', + action: 'Update profile status', + }, + ], + default: 'getInfo', + }, +]; + +export const profileFields: INodeProperties[] = [ + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['profile'], operation: ['getInfo'] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['profile'], operation: ['get'] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['profile'], operation: ['getStatus'] } }, + }, + { + displayName: 'Emoji', + name: 'statusEmoji', + type: 'string', + required: true, + default: "", + description: 'Status emoji character', + displayOptions: { show: { resource: ['profile'], operation: ['updateStatus'] } }, + placeholder: '🎮', + routing: { send: { type: 'body', property: 'emoji' } }, + }, + { + displayName: 'Title', + name: 'statusTitle', + type: 'string', + required: true, + default: "", + description: 'Status text', + displayOptions: { show: { resource: ['profile'], operation: ['updateStatus'] } }, + placeholder: 'Very busy', + routing: { send: { type: 'body', property: 'title' } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['profile'], operation: ['updateStatus'] } }, + options: [ + { + displayName: 'Away Message', + name: 'awayMessage', + type: 'string', + default: "", + description: 'Away mode message text. Displayed in the profile and in direct messages/mentions.', + placeholder: 'Back after 3 PM', + routing: { send: { type: 'body', property: 'away_message' } }, + }, + { + displayName: 'Expires At', + name: 'statusExpiresAt', + type: 'dateTime', + default: "", + description: 'Status expiration date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format', + placeholder: '2024-04-08T10:00:00.000Z', + routing: { send: { type: 'body', property: 'expires_at' } }, + }, + { + displayName: 'Is Away', + name: 'isAway', + type: 'boolean', + default: false, + description: 'Whether to "Away" mode', + routing: { send: { type: 'body', property: 'is_away' } }, + }, + ], + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/ReactionDescription.ts b/integrations/n8n/nodes/Pachca/V2/ReactionDescription.ts new file mode 100644 index 00000000..32dac435 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/ReactionDescription.ts @@ -0,0 +1,134 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const reactionOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['reaction'] } }, + options: [ + { + name: 'Create', + value: 'create', + action: 'Create a reaction', + }, + { + name: 'Delete', + value: 'delete', + action: 'Delete a reaction', + }, + { + name: 'Get Many', + value: 'getAll', + action: 'Get many reactions', + }, + ], + default: 'create', + }, +]; + +export const reactionFields: INodeProperties[] = [ + { + displayName: 'ID', + name: 'reactionsMessageId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['reaction'], operation: ['create'] } }, + description: 'Message ID', + }, + { + displayName: 'Code', + name: 'reactionsReactionCode', + type: 'string', + required: true, + default: "", + description: 'Reaction emoji character', + displayOptions: { show: { resource: ['reaction'], operation: ['create'] } }, + placeholder: '👍', + routing: { send: { type: 'body', property: 'code' } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['reaction'], operation: ['create'] } }, + options: [ + { + displayName: 'Name', + name: 'name', + type: 'string', + default: "", + description: 'Emoji text name (used for custom emoji)', + placeholder: ':+1:', + routing: { send: { type: 'body', property: 'name' } }, + }, + ], + }, + { + displayName: 'ID', + name: 'reactionsMessageId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['reaction'], operation: ['delete'] } }, + description: 'Message ID', + }, + { + displayName: 'Code', + name: 'reactionsReactionCode', + type: 'string', + default: "", + description: 'Emoji character of the reaction', + placeholder: '👍', + displayOptions: { show: { resource: ['reaction'], operation: ['delete'] } }, + routing: { send: { type: 'query', property: 'code' } }, + }, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: "", + description: 'Text name of the emoji (used for custom emoji)', + placeholder: ':+1:', + displayOptions: { show: { resource: ['reaction'], operation: ['delete'] } }, + routing: { send: { type: 'query', property: 'name' } }, + }, + { + displayName: 'ID', + name: 'reactionsMessageId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['reaction'], operation: ['getAll'] } }, + description: 'Message ID', + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['reaction'], operation: ['getAll'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['reaction'], operation: ['getAll'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['reaction'], operation: ['getAll'] } }, + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/ReadMemberDescription.ts b/integrations/n8n/nodes/Pachca/V2/ReadMemberDescription.ts new file mode 100644 index 00000000..0386fda5 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/ReadMemberDescription.ts @@ -0,0 +1,56 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const readMemberOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['readMember'] } }, + options: [ + { + name: 'Get Many Read Member IDs', + value: 'getAllReadMemberIds', + action: 'Get many read member ids', + }, + ], + default: 'getAllReadMemberIds', + }, +]; + +export const readMemberFields: INodeProperties[] = [ + { + displayName: 'ID', + name: 'id', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['readMember'], operation: ['getAllReadMemberIds'] } }, + description: 'Message ID', + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['readMember'], operation: ['getAllReadMemberIds'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['readMember'], operation: ['getAllReadMemberIds'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['readMember'], operation: ['getAllReadMemberIds'] } }, + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/SearchDescription.ts b/integrations/n8n/nodes/Pachca/V2/SearchDescription.ts new file mode 100644 index 00000000..b551fc55 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/SearchDescription.ts @@ -0,0 +1,322 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const searchOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['search'] } }, + options: [ + { + name: 'Get Many Chats', + value: 'getAllChats', + action: 'Search chats', + }, + { + name: 'Get Many Messages', + value: 'getAllMessages', + action: 'Search messages', + }, + { + name: 'Get Many Users', + value: 'getAllUsers', + action: 'Search users', + }, + ], + default: 'getAllChats', + }, +]; + +export const searchFields: INodeProperties[] = [ + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['search'], operation: ['getAllChats'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['search'], operation: ['getAllChats'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['search'], operation: ['getAllChats'] } }, + }, + { + displayName: 'Query', + name: 'query', + type: 'string', + default: "", + description: 'Search query text', + placeholder: 'Development', + displayOptions: { show: { resource: ['search'], operation: ['getAllChats'] } }, + routing: { send: { type: 'query', property: 'query' } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['search'], operation: ['getAllChats'] } }, + options: [ + { + displayName: 'Active', + name: 'active', + type: 'boolean', + default: false, + description: 'Whether to filter by chat activity', + routing: { send: { type: 'query', property: 'active' } }, + }, + { + displayName: 'Chat Subtype', + name: 'chatSubtype', + type: 'options', + options: [{ name: 'Discussion', value: 'discussion', description: 'Channel or conversation' }, +{ name: 'Thread', value: 'thread' }], + default: "", + description: 'Filter by chat type', + routing: { send: { type: 'query', property: 'chat_subtype' } }, + }, + { + displayName: 'Created From', + name: 'createdFrom', + type: 'dateTime', + default: "", + description: 'Filter by creation date (from)', + placeholder: '2025-01-01T00:00:00.000Z', + routing: { send: { type: 'query', property: 'created_from' } }, + }, + { + displayName: 'Created To', + name: 'createdTo', + type: 'dateTime', + default: "", + description: 'Filter by creation date (to)', + placeholder: '2025-02-01T00:00:00.000Z', + routing: { send: { type: 'query', property: 'created_to' } }, + }, + { + displayName: 'Order', + name: 'order', + type: 'options', + options: [{ name: 'Asc', value: 'asc', description: 'Ascending' }, +{ name: 'Desc', value: 'desc', description: 'Descending' }], + default: "", + description: 'Sort direction', + routing: { send: { type: 'query', property: 'order' } }, + }, + { + displayName: 'Personal', + name: 'personal', + type: 'boolean', + default: false, + description: 'Whether to filter by direct chats', + routing: { send: { type: 'query', property: 'personal' } }, + }, + ], + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['search'], operation: ['getAllMessages'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['search'], operation: ['getAllMessages'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['search'], operation: ['getAllMessages'] } }, + }, + { + displayName: 'Query', + name: 'query', + type: 'string', + default: "", + description: 'Search query text', + placeholder: 't-shirts', + displayOptions: { show: { resource: ['search'], operation: ['getAllMessages'] } }, + routing: { send: { type: 'query', property: 'query' } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['search'], operation: ['getAllMessages'] } }, + options: [ + { + displayName: 'Active', + name: 'active', + type: 'boolean', + default: false, + description: 'Whether to filter by chat activity', + routing: { send: { type: 'query', property: 'active' } }, + }, + { + displayName: 'Chat IDs', + name: 'chatIds', + type: 'string', + default: "", + description: 'Filter by chat IDs', + placeholder: '198,334', + routing: { send: { type: 'query', property: 'chat_ids' } }, + }, + { + displayName: 'Created From', + name: 'createdFrom', + type: 'dateTime', + default: "", + description: 'Filter by creation date (from)', + placeholder: '2025-01-01T00:00:00.000Z', + routing: { send: { type: 'query', property: 'created_from' } }, + }, + { + displayName: 'Created To', + name: 'createdTo', + type: 'dateTime', + default: "", + description: 'Filter by creation date (to)', + placeholder: '2025-02-01T00:00:00.000Z', + routing: { send: { type: 'query', property: 'created_to' } }, + }, + { + displayName: 'Order', + name: 'order', + type: 'options', + options: [{ name: 'Asc', value: 'asc', description: 'Ascending' }, +{ name: 'Desc', value: 'desc', description: 'Descending' }], + default: "", + description: 'Sort direction', + routing: { send: { type: 'query', property: 'order' } }, + }, + { + displayName: 'User IDs', + name: 'userIds', + type: 'string', + default: "", + description: 'Filter by message author IDs', + placeholder: '12,185', + routing: { send: { type: 'query', property: 'user_ids' } }, + }, + ], + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['search'], operation: ['getAllUsers'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['search'], operation: ['getAllUsers'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['search'], operation: ['getAllUsers'] } }, + }, + { + displayName: 'Query', + name: 'query', + type: 'string', + default: "", + description: 'Search query text', + placeholder: 'Oleg', + displayOptions: { show: { resource: ['search'], operation: ['getAllUsers'] } }, + routing: { send: { type: 'query', property: 'query' } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['search'], operation: ['getAllUsers'] } }, + options: [ + { + displayName: 'Company Roles', + name: 'companyRoles', + type: 'string', + default: "", + description: 'Filter by employee roles', + placeholder: 'admin,user', + routing: { send: { type: 'query', property: 'company_roles' } }, + }, + { + displayName: 'Created From', + name: 'createdFrom', + type: 'dateTime', + default: "", + description: 'Filter by creation date (from)', + placeholder: '2025-01-01T00:00:00.000Z', + routing: { send: { type: 'query', property: 'created_from' } }, + }, + { + displayName: 'Created To', + name: 'createdTo', + type: 'dateTime', + default: "", + description: 'Filter by creation date (to)', + placeholder: '2025-02-01T00:00:00.000Z', + routing: { send: { type: 'query', property: 'created_to' } }, + }, + { + displayName: 'Order', + name: 'order', + type: 'options', + options: [{ name: 'Asc', value: 'asc', description: 'Ascending' }, +{ name: 'Desc', value: 'desc', description: 'Descending' }], + default: "", + description: 'Sort direction', + routing: { send: { type: 'query', property: 'order' } }, + }, + { + displayName: 'Sort', + name: 'sort', + type: 'options', + options: [{ name: 'Alphabetical', value: 'alphabetical', description: 'Alphabetically' }, +{ name: 'By Score', value: 'by_score', description: 'By relevance' }], + default: "", + description: 'Sort results by', + routing: { send: { type: 'query', property: 'sort' } }, + }, + ], + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/SecurityDescription.ts b/integrations/n8n/nodes/Pachca/V2/SecurityDescription.ts new file mode 100644 index 00000000..19fca03e --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/SecurityDescription.ts @@ -0,0 +1,159 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const securityOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['security'] } }, + options: [ + { + name: 'Get Many', + value: 'getAll', + action: 'Get many audit events', + }, + ], + default: 'getAll', + }, +]; + +export const securityFields: INodeProperties[] = [ + { + displayName: 'Requires owner role and the "Corporation" plan', + name: 'securityGetAllNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['security'], operation: ['getAll'] } }, + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['security'], operation: ['getAll'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['security'], operation: ['getAll'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['security'], operation: ['getAll'] } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['security'], operation: ['getAll'] } }, + options: [ + { + displayName: 'Actor ID', + name: 'actorId', + type: 'string', + default: "", + description: 'ID of the user who performed the action', + placeholder: '98765', + routing: { send: { type: 'query', property: 'actor_id' } }, + }, + { + displayName: 'Actor Type', + name: 'actorType', + type: 'string', + default: "", + placeholder: 'User', + routing: { send: { type: 'query', property: 'actor_type' } }, + }, + { + displayName: 'End Time', + name: 'endTime', + type: 'dateTime', + default: "", + description: 'End timestamp (exclusive)', + placeholder: '2025-05-02T09:11:00Z', + routing: { send: { type: 'query', property: 'end_time' } }, + }, + { + displayName: 'Entity ID', + name: 'entityId', + type: 'string', + default: "", + description: 'ID of the affected entity', + placeholder: '98765', + routing: { send: { type: 'query', property: 'entity_id' } }, + }, + { + displayName: 'Entity Type', + name: 'entityType', + type: 'string', + default: "", + placeholder: 'User', + routing: { send: { type: 'query', property: 'entity_type' } }, + }, + { + displayName: 'Event Key', + name: 'eventKey', + type: 'options', + options: [{ name: 'Access Token Created', value: 'access_token_created', description: 'New access token created' }, +{ name: 'Access Token Destroy', value: 'access_token_destroy', description: 'Access token deleted' }, +{ name: 'Access Token Updated', value: 'access_token_updated' }, +{ name: 'Audit Events Accessed', value: 'audit_events_accessed', description: 'Audit logs accessed' }, +{ name: 'Chat Created', value: 'chat_created', description: 'New chat created' }, +{ name: 'Chat Permission Changed', value: 'chat_permission_changed', description: 'Chat access permissions changed' }, +{ name: 'Chat Renamed', value: 'chat_renamed' }, +{ name: 'Dlp Violation Detected', value: 'dlp_violation_detected', description: 'DLP rule violation detected' }, +{ name: 'Kms Decrypt', value: 'kms_decrypt', description: 'Data decrypted' }, +{ name: 'Kms Encrypt', value: 'kms_encrypt', description: 'Data encrypted' }, +{ name: 'Message Created', value: 'message_created' }, +{ name: 'Message Deleted', value: 'message_deleted' }, +{ name: 'Message Updated', value: 'message_updated', description: 'Message edited' }, +{ name: 'Reaction Created', value: 'reaction_created', description: 'Reaction added' }, +{ name: 'Reaction Deleted', value: 'reaction_deleted', description: 'Reaction removed' }, +{ name: 'Search Chats Api', value: 'search_chats_api', description: 'Chat search via API' }, +{ name: 'Search Messages Api', value: 'search_messages_api', description: 'Message search via API' }, +{ name: 'Search Users Api', value: 'search_users_api', description: 'Employee search via API' }, +{ name: 'Tag Added To Chat', value: 'tag_added_to_chat' }, +{ name: 'Tag Created', value: 'tag_created', description: 'New tag created' }, +{ name: 'Tag Deleted', value: 'tag_deleted' }, +{ name: 'Tag Removed From Chat', value: 'tag_removed_from_chat' }, +{ name: 'Thread Created', value: 'thread_created' }, +{ name: 'User 2fa Fail', value: 'user_2fa_fail', description: 'Failed two-factor authentication attempt' }, +{ name: 'User 2fa Success', value: 'user_2fa_success', description: 'Successful two-factor authentication' }, +{ name: 'User Added To Tag', value: 'user_added_to_tag' }, +{ name: 'User Chat Join', value: 'user_chat_join', description: 'User joined the chat' }, +{ name: 'User Chat Leave', value: 'user_chat_leave', description: 'User left the chat' }, +{ name: 'User Created', value: 'user_created', description: 'New user account created' }, +{ name: 'User Deleted', value: 'user_deleted', description: 'User account deleted' }, +{ name: 'User Login', value: 'user_login', description: 'User logged in successfully' }, +{ name: 'User Logout', value: 'user_logout', description: 'User logged out' }, +{ name: 'User Removed From Tag', value: 'user_removed_from_tag' }, +{ name: 'User Role Changed', value: 'user_role_changed' }, +{ name: 'User Updated', value: 'user_updated', description: 'User data updated' }], + default: "", + description: 'Filter by specific event type', + routing: { send: { type: 'query', property: 'event_key' } }, + }, + { + displayName: 'Start Time', + name: 'startTime', + type: 'dateTime', + default: "", + description: 'Start timestamp (inclusive)', + placeholder: '2025-05-01T09:11:00Z', + routing: { send: { type: 'query', property: 'start_time' } }, + }, + ], + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/TaskDescription.ts b/integrations/n8n/nodes/Pachca/V2/TaskDescription.ts new file mode 100644 index 00000000..1e35a83a --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/TaskDescription.ts @@ -0,0 +1,323 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const taskOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['task'] } }, + options: [ + { + name: 'Create', + value: 'create', + action: 'Create a task', + }, + { + name: 'Delete', + value: 'delete', + action: 'Delete a task', + }, + { + name: 'Get', + value: 'get', + action: 'Get a task', + }, + { + name: 'Get Many', + value: 'getAll', + action: 'Get many tasks', + }, + { + name: 'Update', + value: 'update', + action: 'Update a task', + }, + ], + default: 'create', + }, +]; + +export const taskFields: INodeProperties[] = [ + { + displayName: 'Kind', + name: 'taskKind', + type: 'options', + required: true, + options: [{ name: 'Call', value: 'call', description: 'Call a contact' }, +{ name: 'Email', value: 'email', description: 'Send an email' }, +{ name: 'Event', value: 'event' }, +{ name: 'Meeting', value: 'meeting' }, +{ name: 'Reminder', value: 'reminder', description: 'Simple reminder' }], + default: "call", + displayOptions: { show: { resource: ['task'], operation: ['create'] } }, + routing: { send: { type: 'body', property: 'kind' } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['task'], operation: ['create'] } }, + options: [ + { + displayName: 'All Day', + name: 'allDay', + type: 'boolean', + default: false, + description: 'Whether to all-day task (without specific time)', + routing: { send: { type: 'body', property: 'all_day' } }, + }, + { + displayName: 'Chat ID', + name: 'chatId', + type: 'number', + default: 0, + description: 'ID of the chat to link the task to', + placeholder: '456', + routing: { send: { type: 'body', property: 'chat_id' } }, + }, + { + displayName: 'Content', + name: 'taskContent', + type: 'string', + typeOptions: { rows: 4 }, + default: "", + description: 'Description (defaults to the kind name)', + placeholder: 'Pick up 21 orders from the warehouse', + routing: { send: { type: 'body', property: 'content' } }, + }, + { + displayName: 'Custom Properties', + name: 'customProperties', + type: 'fixedCollection', + typeOptions: { multipleValues: true }, + options: [{ + name: 'property', + displayName: 'Custom Property', + values: [ + { + displayName: 'Custom Property Name or ID', + name: 'id', + type: 'options', + typeOptions: { loadOptionsMethod: 'getCustomProperties' }, + default: '', + description: 'Choose from the list, or specify an ID using an expression', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: "", + description: 'Value to set', + }, + ], + }], + default: [], + description: 'Custom properties to set', + routing: { send: { type: 'body', property: 'custom_properties' } }, + }, + { + displayName: 'Due At', + name: 'taskDueAt', + type: 'dateTime', + default: "", + description: 'Task due date (ISO-8601) in YYYY-MM-DDThh:mm:ss.sssTZD format. If the time is set to 23:59:59.000, the task will be created as an all-day task (without specific time).', + placeholder: '2020-06-05T12:00:00.000+03:00', + routing: { send: { type: 'body', property: 'due_at' } }, + }, + { + displayName: 'Performer IDs', + name: 'performerIds', + type: 'string', + default: "", + description: 'Array of user IDs to assign as task performers (defaults to you)', + placeholder: '12,13', + }, + { + displayName: 'Priority', + name: 'taskPriority', + type: 'number', + default: 1, + description: 'Priority: 1, 2 (important), or 3 (very important)', + placeholder: '2', + routing: { send: { type: 'body', property: 'priority' } }, + }, + ], + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['task'], operation: ['getAll'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['task'], operation: ['getAll'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['task'], operation: ['getAll'] } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['task'], operation: ['get'] } }, + description: 'Task ID', + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['task'], operation: ['get'] } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['task'], operation: ['update'] } }, + description: 'Task ID', + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['task'], operation: ['update'] } }, + options: [ + { + displayName: 'All Day', + name: 'allDay', + type: 'boolean', + default: false, + description: 'Whether to all-day task (without specific time)', + routing: { send: { type: 'body', property: 'all_day' } }, + }, + { + displayName: 'Content', + name: 'content', + type: 'string', + typeOptions: { rows: 4 }, + default: "", + description: 'Description', + placeholder: 'Pick up 21 orders from the warehouse', + routing: { send: { type: 'body', property: 'content' } }, + }, + { + displayName: 'Custom Properties', + name: 'customProperties', + type: 'fixedCollection', + typeOptions: { multipleValues: true }, + options: [{ + name: 'property', + displayName: 'Custom Property', + values: [ + { + displayName: 'Custom Property Name or ID', + name: 'id', + type: 'options', + typeOptions: { loadOptionsMethod: 'getCustomProperties' }, + default: '', + description: 'Choose from the list, or specify an ID using an expression', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: "", + description: 'Value to set', + }, + ], + }], + default: [], + description: 'Custom properties to set', + routing: { send: { type: 'body', property: 'custom_properties' } }, + }, + { + displayName: 'Done At', + name: 'doneAt', + type: 'dateTime', + default: "", + description: 'Task completion date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format', + placeholder: '2020-06-05T12:00:00.000Z', + routing: { send: { type: 'body', property: 'done_at' } }, + }, + { + displayName: 'Due At', + name: 'dueAt', + type: 'dateTime', + default: "", + description: 'Task due date (ISO-8601) in YYYY-MM-DDThh:mm:ss.sssTZD format. If the time is set to 23:59:59.000, the task will be created as an all-day task (without specific time).', + placeholder: '2020-06-05T12:00:00.000+03:00', + routing: { send: { type: 'body', property: 'due_at' } }, + }, + { + displayName: 'Kind', + name: 'kind', + type: 'options', + options: [{ name: 'Call', value: 'call', description: 'Call a contact' }, +{ name: 'Email', value: 'email', description: 'Send an email' }, +{ name: 'Event', value: 'event' }, +{ name: 'Meeting', value: 'meeting' }, +{ name: 'Reminder', value: 'reminder', description: 'Simple reminder' }], + default: "call", + routing: { send: { type: 'body', property: 'kind' } }, + }, + { + displayName: 'Performer IDs', + name: 'performerIds', + type: 'string', + default: "", + description: 'Array of user IDs to assign as task performers', + placeholder: '12', + }, + { + displayName: 'Priority', + name: 'priority', + type: 'number', + default: 0, + description: 'Priority: 1, 2 (important), or 3 (very important)', + placeholder: '2', + routing: { send: { type: 'body', property: 'priority' } }, + }, + { + displayName: 'Status', + name: 'status', + type: 'options', + options: [{ name: 'Done', value: 'done' }, +{ name: 'Undone', value: 'undone', description: 'Active' }], + default: "done", + routing: { send: { type: 'body', property: 'status' } }, + }, + ], + }, + { + displayName: 'ID', + name: 'id', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['task'], operation: ['delete'] } }, + description: 'Task ID', + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/ThreadDescription.ts b/integrations/n8n/nodes/Pachca/V2/ThreadDescription.ts new file mode 100644 index 00000000..cdf99d27 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/ThreadDescription.ts @@ -0,0 +1,53 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const threadOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['thread'] } }, + options: [ + { + name: 'Create', + value: 'create', + action: 'Create a thread', + }, + { + name: 'Get', + value: 'get', + action: 'Get a thread', + }, + ], + default: 'create', + }, +]; + +export const threadFields: INodeProperties[] = [ + { + displayName: 'ID', + name: 'threadMessageId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['thread'], operation: ['create'] } }, + description: 'Message ID', + }, + { + displayName: 'ID', + name: 'threadThreadId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['thread'], operation: ['get'] } }, + description: 'Thread ID', + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['thread'], operation: ['get'] } }, + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/UserDescription.ts b/integrations/n8n/nodes/Pachca/V2/UserDescription.ts new file mode 100644 index 00000000..310a2b62 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/V2/UserDescription.ts @@ -0,0 +1,585 @@ +import type { INodeProperties } from 'n8n-workflow'; + +export const userOperations: INodeProperties[] = [ + { + displayName: 'Operation', + name: 'operation', + type: 'options', + noDataExpression: true, + displayOptions: { show: { resource: ['user'] } }, + options: [ + { + name: 'Create', + value: 'create', + action: 'Create a user', + }, + { + name: 'Delete', + value: 'delete', + action: 'Delete a user', + }, + { + name: 'Delete Status', + value: 'deleteStatus', + action: 'Delete user status', + }, + { + name: 'Get', + value: 'get', + action: 'Get a user', + }, + { + name: 'Get Many', + value: 'getAll', + action: 'Get many users', + }, + { + name: 'Get Status', + value: 'getStatus', + action: 'Get user status', + }, + { + name: 'Update', + value: 'update', + action: 'Update a user', + }, + { + name: 'Update Status', + value: 'updateStatus', + action: 'Update user status', + }, + ], + default: 'getAll', + }, +]; + +export const userFields: INodeProperties[] = [ + { + displayName: 'Requires admin permissions', + name: 'userCreateNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['user'], operation: ['create'] } }, + }, + { + displayName: 'Email', + name: 'email', + type: 'string', + required: true, + default: "", + displayOptions: { show: { resource: ['user'], operation: ['create'] } }, + placeholder: 'olegp@example.com', + routing: { send: { type: 'body', property: 'email' } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['user'], operation: ['create'] } }, + options: [ + { + displayName: 'Custom Properties', + name: 'customProperties', + type: 'fixedCollection', + typeOptions: { multipleValues: true }, + options: [{ + name: 'property', + displayName: 'Custom Property', + values: [ + { + displayName: 'Custom Property Name or ID', + name: 'id', + type: 'options', + typeOptions: { loadOptionsMethod: 'getCustomProperties' }, + default: '', + description: 'Choose from the list, or specify an ID using an expression', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: "", + description: 'Value to set', + }, + ], + }], + default: [], + description: 'Custom properties to set', + routing: { send: { type: 'body', property: 'custom_properties' } }, + }, + { + displayName: 'Department', + name: 'department', + type: 'string', + default: "", + placeholder: 'Product', + routing: { send: { type: 'body', property: 'department' } }, + }, + { + displayName: 'First Name', + name: 'firstName', + type: 'string', + default: "", + placeholder: 'Oleg', + routing: { send: { type: 'body', property: 'first_name' } }, + }, + { + displayName: 'Last Name', + name: 'lastName', + type: 'string', + default: "", + placeholder: 'Petrov', + routing: { send: { type: 'body', property: 'last_name' } }, + }, + { + displayName: 'List Tags', + name: 'listTags', + type: 'string', + default: "", + description: 'Array of tags to assign to the employee', + placeholder: 'Product,Design', + }, + { + displayName: 'Nickname', + name: 'nickname', + type: 'string', + default: "", + description: 'Username', + placeholder: 'olegpetrov', + routing: { send: { type: 'body', property: 'nickname' } }, + }, + { + displayName: 'Phone Number', + name: 'phoneNumber', + type: 'string', + default: "", + placeholder: '+79001234567', + routing: { send: { type: 'body', property: 'phone_number' } }, + }, + { + displayName: 'Role', + name: 'role', + type: 'options', + options: [{ name: 'Admin', value: 'admin', description: 'Administrator' }, +{ name: 'Multi Guest', value: 'multi_guest', description: 'Multi-guest' }, +{ name: 'User', value: 'user', description: 'Employee' }], + default: "user", + description: 'Access level', + routing: { send: { type: 'body', property: 'role' } }, + }, + { + displayName: 'Skip Email Notify', + name: 'skipEmailNotify', + type: 'boolean', + default: false, + description: 'Whether to skip sending an invitation to the employee. The employee will not receive an email invitation to create an account. Useful when pre-creating accounts before SSO login.', + routing: { send: { type: 'body', property: 'skip_email_notify' } }, + }, + { + displayName: 'Suspended', + name: 'suspended', + type: 'boolean', + default: false, + description: 'Whether to user deactivated', + routing: { send: { type: 'body', property: 'suspended' } }, + }, + { + displayName: 'Title', + name: 'title', + type: 'string', + default: "", + description: 'Job title', + placeholder: 'CIO', + routing: { send: { type: 'body', property: 'title' } }, + }, + ], + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + default: false, + description: 'Whether to return all results or only up to a given limit', + displayOptions: { show: { resource: ['user'], operation: ['getAll'] } }, + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + default: 50, + description: 'Max number of results to return', + typeOptions: { minValue: 1, maxValue: 50 }, + displayOptions: { show: { resource: ['user'], operation: ['getAll'], returnAll: [false] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['user'], operation: ['getAll'] } }, + }, + { + displayName: 'Query', + name: 'query', + type: 'string', + default: "", + description: 'Search phrase to filter results. Search works on the following fields: `first_name`, `last_name`, `email`, `phone_number`, and `nickname`.', + placeholder: 'Oleg', + displayOptions: { show: { resource: ['user'], operation: ['getAll'] } }, + routing: { send: { type: 'query', property: 'query' } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'User ID', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchUsers', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 12', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/users/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/users/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/users/(\\d+)', errorMessage: 'Not a valid Pachca user URL' } }], + }, + ], + displayOptions: { show: { resource: ['user'], operation: ['get'] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['user'], operation: ['get'] } }, + }, + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'User ID', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchUsers', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 12', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/users/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/users/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/users/(\\d+)', errorMessage: 'Not a valid Pachca user URL' } }], + }, + ], + displayOptions: { show: { resource: ['user'], operation: ['update'] } }, + }, + { + displayName: 'Requires admin permissions', + name: 'userUpdateNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['user'], operation: ['update'] } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['user'], operation: ['update'] } }, + options: [ + { + displayName: 'Custom Properties', + name: 'customProperties', + type: 'fixedCollection', + typeOptions: { multipleValues: true }, + options: [{ + name: 'property', + displayName: 'Custom Property', + values: [ + { + displayName: 'Custom Property Name or ID', + name: 'id', + type: 'options', + typeOptions: { loadOptionsMethod: 'getCustomProperties' }, + default: '', + description: 'Choose from the list, or specify an ID using an expression', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + default: "", + description: 'Value to set', + }, + ], + }], + default: [], + description: 'Custom properties to set', + routing: { send: { type: 'body', property: 'custom_properties' } }, + }, + { + displayName: 'Department', + name: 'department', + type: 'string', + default: "", + placeholder: 'Engineering', + routing: { send: { type: 'body', property: 'department' } }, + }, + { + displayName: 'Email', + name: 'email', + type: 'string', + default: "", + placeholder: 'olegpetrov@example.com', + routing: { send: { type: 'body', property: 'email' } }, + }, + { + displayName: 'First Name', + name: 'firstName', + type: 'string', + default: "", + placeholder: 'Oleg', + routing: { send: { type: 'body', property: 'first_name' } }, + }, + { + displayName: 'Last Name', + name: 'lastName', + type: 'string', + default: "", + placeholder: 'Petrov', + routing: { send: { type: 'body', property: 'last_name' } }, + }, + { + displayName: 'List Tags', + name: 'listTags', + type: 'string', + default: "", + description: 'Array of tags to assign to the employee', + placeholder: 'Product', + }, + { + displayName: 'Nickname', + name: 'nickname', + type: 'string', + default: "", + description: 'Username', + placeholder: 'olegpetrov', + routing: { send: { type: 'body', property: 'nickname' } }, + }, + { + displayName: 'Phone Number', + name: 'phoneNumber', + type: 'string', + default: "", + placeholder: '+79001234567', + routing: { send: { type: 'body', property: 'phone_number' } }, + }, + { + displayName: 'Role', + name: 'role', + type: 'options', + options: [{ name: 'Admin', value: 'admin', description: 'Administrator' }, +{ name: 'Multi Guest', value: 'multi_guest', description: 'Multi-guest' }, +{ name: 'User', value: 'user', description: 'Employee' }], + default: "user", + description: 'Access level', + routing: { send: { type: 'body', property: 'role' } }, + }, + { + displayName: 'Suspended', + name: 'suspended', + type: 'boolean', + default: false, + description: 'Whether to user deactivated', + routing: { send: { type: 'body', property: 'suspended' } }, + }, + { + displayName: 'Title', + name: 'title', + type: 'string', + default: "", + description: 'Job title', + placeholder: 'Senior Developer', + routing: { send: { type: 'body', property: 'title' } }, + }, + ], + }, + { + displayName: 'ID', + name: 'id', + type: 'resourceLocator', + default: { mode: 'list', value: '' }, + required: true, + description: 'User ID', + modes: [ + { + displayName: 'From List', + name: 'list', + type: 'list', + typeOptions: { searchListMethod: 'searchUsers', searchable: true }, + }, + { + displayName: 'By ID', + name: 'id', + type: 'string', + placeholder: 'e.g. 12', + }, + { + displayName: 'By URL', + name: 'url', + type: 'string', + placeholder: 'https://app.pachca.com/users/12345', + extractValue: { type: 'regex', regex: 'https?://[^/]+/users/(\\d+)' }, + validation: [{ type: 'regex', properties: { regex: 'https?://[^/]+/users/(\\d+)', errorMessage: 'Not a valid Pachca user URL' } }], + }, + ], + displayOptions: { show: { resource: ['user'], operation: ['delete'] } }, + }, + { + displayName: 'Requires admin permissions', + name: 'userDeleteNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['user'], operation: ['delete'] } }, + }, + { + displayName: 'User ID', + name: 'userId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['user'], operation: ['getStatus'] } }, + }, + { + displayName: 'Requires admin permissions', + name: 'userGetStatusNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['user'], operation: ['getStatus'] } }, + }, + { + displayName: 'Simplify', + name: 'simplify', + type: 'boolean', + default: true, + description: 'Whether to return a simplified version of the response instead of all fields', + displayOptions: { show: { resource: ['user'], operation: ['getStatus'] } }, + }, + { + displayName: 'User ID', + name: 'userId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['user'], operation: ['updateStatus'] } }, + }, + { + displayName: 'Requires admin permissions', + name: 'userUpdateStatusNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['user'], operation: ['updateStatus'] } }, + }, + { + displayName: 'Emoji', + name: 'emoji', + type: 'string', + required: true, + default: "", + description: 'Status emoji character', + displayOptions: { show: { resource: ['user'], operation: ['updateStatus'] } }, + placeholder: '🎮', + routing: { send: { type: 'body', property: 'emoji' } }, + }, + { + displayName: 'Title', + name: 'title', + type: 'string', + required: true, + default: "", + description: 'Status text', + displayOptions: { show: { resource: ['user'], operation: ['updateStatus'] } }, + placeholder: 'Very busy', + routing: { send: { type: 'body', property: 'title' } }, + }, + { + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, + displayOptions: { show: { resource: ['user'], operation: ['updateStatus'] } }, + options: [ + { + displayName: 'Away Message', + name: 'awayMessage', + type: 'string', + default: "", + description: 'Away mode message text. Displayed in the profile and in direct messages/mentions.', + placeholder: 'Back after 3 PM', + routing: { send: { type: 'body', property: 'away_message' } }, + }, + { + displayName: 'Expires At', + name: 'expiresAt', + type: 'dateTime', + default: "", + description: 'Status expiration date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format', + placeholder: '2024-04-08T10:00:00.000Z', + routing: { send: { type: 'body', property: 'expires_at' } }, + }, + { + displayName: 'Is Away', + name: 'isAway', + type: 'boolean', + default: false, + description: 'Whether to "Away" mode', + routing: { send: { type: 'body', property: 'is_away' } }, + }, + ], + }, + { + displayName: 'User ID', + name: 'userId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['user'], operation: ['deleteStatus'] } }, + }, + { + displayName: 'Requires admin permissions', + name: 'userDeleteStatusNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['user'], operation: ['deleteStatus'] } }, + }, +]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/pachca.dark.svg b/integrations/n8n/nodes/Pachca/pachca.dark.svg new file mode 100644 index 00000000..b34b4743 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/pachca.dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/n8n/nodes/Pachca/pachca.svg b/integrations/n8n/nodes/Pachca/pachca.svg new file mode 100644 index 00000000..21b5d0d2 --- /dev/null +++ b/integrations/n8n/nodes/Pachca/pachca.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/n8n/package.json b/integrations/n8n/package.json new file mode 100644 index 00000000..610e3768 --- /dev/null +++ b/integrations/n8n/package.json @@ -0,0 +1,79 @@ +{ + "name": "n8n-nodes-pachca", + "version": "2.0.0", + "description": "Pachca node for n8n workflow automation", + "license": "MIT", + "main": "index.js", + "author": { + "name": "Pachca", + "email": "dev@pachca.com" + }, + "keywords": [ + "n8n-community-node-package", + "pachca", + "messenger", + "automation", + "workflow", + "chat", + "messages", + "users", + "files", + "api", + "integration" + ], + "homepage": "https://github.com/pachca/openapi/tree/main/integrations/n8n#readme", + "bugs": { + "url": "https://github.com/pachca/openapi/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/pachca/openapi.git", + "directory": "integrations/n8n" + }, + "files": [ + "dist/", + "index.js", + "icons/", + "docs/", + "examples/" + ], + "n8n": { + "n8nNodesApiVersion": 1, + "strict": true, + "credentials": [ + "dist/credentials/PachcaApi.credentials.js" + ], + "nodes": [ + "dist/nodes/Pachca/Pachca.node.js", + "dist/nodes/Pachca/PachcaTrigger.node.js" + ] + }, + "scripts": { + "generate-n8n": "tsx scripts/generate-n8n.ts && eslint --fix nodes/Pachca/V2/ nodes/Pachca/SharedRouter.ts nodes/Pachca/Pachca.node.ts credentials/ || true", + "build": "n8n-node build", + "dev:n8n": "n8n-node dev", + "lint": "eslint .", + "lint:fix": "eslint --fix .", + "test": "vitest run --exclude 'e2e/**'", + "e2e": "playwright test -c e2e/playwright.config.ts", + "e2e:headed": "playwright test -c e2e/playwright.config.ts --headed", + "e2e:debug": "playwright test -c e2e/playwright.config.ts --debug", + "release": "n8n-node release", + "prepublishOnly": "n8n-node prerelease" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "n8n-workflow": "*" + }, + "devDependencies": { + "@n8n/node-cli": "^0.23.0", + "eslint": "^9.0.0", + "@pachca/openapi-parser": "workspace:*", + "n8n-workflow": "*", + "typescript": "^5.9.0", + "tsx": "^4.0.0", + "vitest": "^3.0.0" + } +} diff --git a/integrations/n8n/scripts/freeze-v1.ts b/integrations/n8n/scripts/freeze-v1.ts new file mode 100644 index 00000000..1211abf8 --- /dev/null +++ b/integrations/n8n/scripts/freeze-v1.ts @@ -0,0 +1,312 @@ +#!/usr/bin/env tsx +/** + * One-time script: generates frozen V1 description files from v1 compiled node. + * Reads /tmp/v1-description.json (extracted from n8n-nodes-pachca@1.0.27) + * and outputs nodes/Pachca/V1/*Description.ts files. + * + * Run: npx tsx scripts/freeze-v1.ts + * Then delete this script — V1 files are frozen forever. + */ + +import * as fs from 'fs'; +import * as path from 'path'; + +const V1_DIR = path.resolve(__dirname, '../nodes/Pachca/V1'); +const description = JSON.parse(fs.readFileSync('/tmp/v1-description.json', 'utf-8')); +const properties: any[] = description.properties; + +// Resource name → PascalCase for file naming +const RESOURCE_FILE_NAMES: Record = { + message: 'Message', + thread: 'Thread', + reactions: 'Reactions', + chat: 'Chat', + user: 'User', + groupTag: 'GroupTag', + status: 'Status', + customFields: 'CustomFields', + task: 'Task', + bot: 'Bot', + file: 'File', + form: 'Form', +}; + +// Serialize a value to TypeScript literal +function toTS(value: unknown, indent: number = 0): string { + const pad = '\t'.repeat(indent); + const pad1 = '\t'.repeat(indent + 1); + + if (value === null || value === undefined) return 'undefined'; + if (typeof value === 'string') { + // Use single quotes, escape internal single quotes + const escaped = value.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/\n/g, '\\n'); + return `'${escaped}'`; + } + if (typeof value === 'number' || typeof value === 'boolean') return String(value); + + if (Array.isArray(value)) { + if (value.length === 0) return '[]'; + // Check if it's a simple array (all primitives) + const allPrimitive = value.every(v => typeof v !== 'object' || v === null); + if (allPrimitive) { + return `[${value.map(v => toTS(v)).join(', ')}]`; + } + const items = value.map(v => `${pad1}${toTS(v, indent + 1)},`).join('\n'); + return `[\n${items}\n${pad}]`; + } + + if (typeof value === 'object') { + const obj = value as Record; + const keys = Object.keys(obj); + if (keys.length === 0) return '{}'; + + const entries = keys.map(k => { + const key = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(k) ? k : `'${k}'`; + return `${pad1}${key}: ${toTS(obj[k], indent + 1)},`; + }).join('\n'); + return `{\n${entries}\n${pad}}`; + } + + return String(value); +} + +// Clean up property for output — remove undefined fields, normalize +function cleanProp(prop: any): any { + const clean: any = {}; + // Ordered keys for n8n convention + const keyOrder = [ + 'displayName', 'name', 'type', 'required', 'noDataExpression', + 'typeOptions', 'options', 'default', 'description', 'placeholder', + 'displayOptions', 'routing', 'modes', + ]; + for (const key of keyOrder) { + if (prop[key] !== undefined) { + clean[key] = prop[key]; + } + } + // Any remaining keys + for (const key of Object.keys(prop)) { + if (!(key in clean) && prop[key] !== undefined) { + clean[key] = prop[key]; + } + } + return clean; +} + +// Group properties by resource +const resourceProp = properties.find((p: any) => p.name === 'resource'); +const resources: string[] = resourceProp.options.map((o: any) => o.value); + +for (const resource of resources) { + const pascalName = RESOURCE_FILE_NAMES[resource]; + if (!pascalName) { + console.error(`Unknown resource: ${resource}, skipping`); + continue; + } + + // Find operation definition for this resource + const operationProps = properties.filter( + (p: any) => p.name === 'operation' && p.displayOptions?.show?.resource?.includes(resource), + ); + + // Find field definitions for this resource + const fieldProps = properties.filter( + (p: any) => + p.name !== 'resource' && + p.name !== 'operation' && + p.displayOptions?.show?.resource?.includes(resource), + ); + + // Build the operations export + const opsVarName = `${resource}Operations`; + const fieldsVarName = `${resource}Fields`; + + let output = `// ============================================================================\n`; + output += `// ${pascalName}Description.ts — FROZEN V1 description (from n8n-nodes-pachca@1.0.27)\n`; + output += `// DO NOT EDIT — this file is frozen for backward compatibility\n`; + output += `// ============================================================================\n\n`; + output += `import type { INodeProperties } from 'n8n-workflow';\n\n`; + + // Operations + output += `export const ${opsVarName}: INodeProperties[] = [\n`; + for (const op of operationProps) { + output += `\t${toTS(cleanProp(op), 1)},\n`; + } + output += `];\n\n`; + + // Fields + output += `export const ${fieldsVarName}: INodeProperties[] = [\n`; + for (const field of fieldProps) { + output += `\t${toTS(cleanProp(field), 1)},\n`; + } + output += `];\n`; + + const filePath = path.join(V1_DIR, `${pascalName}Description.ts`); + fs.writeFileSync(filePath, output); + console.log(` ${pascalName}Description.ts — ${operationProps.length} ops, ${fieldProps.length} fields`); +} + +// Now generate PachcaV1.node.ts +const v1NodeContent = `// ============================================================================ +// PachcaV1.node.ts — FROZEN V1 node class (from n8n-nodes-pachca@1.0.27) +// DO NOT EDIT — this file is frozen for backward compatibility +// ============================================================================ + +import type { +\tINodeType, +\tINodeTypeBaseDescription, +\tINodeTypeDescription, +\tIExecuteFunctions, +\tINodeExecutionData, +\tILoadOptionsFunctions, +\tINodeListSearchResult, +\tINodePropertyOptions, +} from 'n8n-workflow'; +import { NodeConnectionTypes } from 'n8n-workflow'; +import { router } from '../SharedRouter'; + +${resources.map(r => { + const pascal = RESOURCE_FILE_NAMES[r]; + return `import { ${r}Operations, ${r}Fields } from './${pascal}Description';`; +}).join('\n')} + +function formatUserName(u: { first_name: string; last_name: string; nickname: string }): string { +\tconst fullName = [u.first_name, u.last_name] +\t\t.filter((v) => v != null && v !== '' && v !== 'null') +\t\t.join(' '); +\tconst display = fullName || u.nickname || 'User'; +\treturn u.nickname ? \`\${display} (@\${u.nickname})\` : display; +} + +export class PachcaV1 implements INodeType { +\tdescription: INodeTypeDescription; + +\tconstructor(baseDescription: INodeTypeBaseDescription) { +\t\tthis.description = { +\t\t\t...baseDescription, +\t\t\tversion: 1, +\t\t\tdefaults: { name: 'Pachca' }, +\t\t\tinputs: [NodeConnectionTypes.Main], +\t\t\toutputs: [NodeConnectionTypes.Main], +\t\t\tcredentials: [{ name: 'pachcaApi', required: true }], +\t\t\tproperties: [ +\t\t\t\t{ +\t\t\t\t\tdisplayName: 'Resource', +\t\t\t\t\tname: 'resource', +\t\t\t\t\ttype: 'options', +\t\t\t\t\tnoDataExpression: true, +\t\t\t\t\toptions: [ +${resourceProp.options.map((o: any) => `\t\t\t\t\t\t{ name: ${toTS(o.name)}, value: ${toTS(o.value)} },`).join('\n')} +\t\t\t\t\t], +\t\t\t\t\tdefault: 'message', +\t\t\t\t}, +${resources.map(r => `\t\t\t\t...${r}Operations,\n\t\t\t\t...${r}Fields,`).join('\n')} +\t\t\t], +\t\t}; +\t} + +\tasync execute(this: IExecuteFunctions): Promise { +\t\treturn router.call(this); +\t} + +\tmethods = { +\t\tlistSearch: { +\t\t\tasync searchChats(this: ILoadOptionsFunctions, filter?: string): Promise { +\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); +\t\t\t\tconst url = filter +\t\t\t\t\t? \`\${credentials.baseUrl}/search/chats?query=\${encodeURIComponent(filter)}\` +\t\t\t\t\t: \`\${credentials.baseUrl}/chats?per=50\`; +\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { +\t\t\t\t\tmethod: 'GET', +\t\t\t\t\turl, +\t\t\t\t}); +\t\t\t\tconst items = response.data ?? []; +\t\t\t\treturn { +\t\t\t\t\tresults: items.map((c: { id: number; name: string }) => ({ +\t\t\t\t\t\tname: c.name, +\t\t\t\t\t\tvalue: c.id, +\t\t\t\t\t})), +\t\t\t\t}; +\t\t\t}, +\t\t\tasync searchUsers(this: ILoadOptionsFunctions, filter?: string): Promise { +\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); +\t\t\t\tif (!filter) return { results: [] }; +\t\t\t\tconst url = \`\${credentials.baseUrl}/search/users?query=\${encodeURIComponent(filter)}\`; +\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { +\t\t\t\t\tmethod: 'GET', +\t\t\t\t\turl, +\t\t\t\t}); +\t\t\t\tconst items = response.data ?? []; +\t\t\t\treturn { +\t\t\t\t\tresults: items.map((u: { id: number; first_name: string; last_name: string; nickname: string }) => ({ +\t\t\t\t\t\tname: formatUserName(u), +\t\t\t\t\t\tvalue: u.id, +\t\t\t\t\t})), +\t\t\t\t}; +\t\t\t}, +\t\t\tasync searchEntities(this: ILoadOptionsFunctions, filter?: string): Promise { +\t\t\t\tlet entityType = 'discussion'; +\t\t\t\ttry { +\t\t\t\t\tentityType = (this.getNodeParameter('entityType') as string) || 'discussion'; +\t\t\t\t} catch { +\t\t\t\t\ttry { +\t\t\t\t\t\tentityType = (this.getCurrentNodeParameter('entityType') as string) || 'discussion'; +\t\t\t\t\t} catch { /* parameter may not exist yet */ } +\t\t\t\t} +\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); +\t\t\t\tif (entityType === 'user') { +\t\t\t\t\tif (!filter) return { results: [] }; +\t\t\t\t\tconst url = \`\${credentials.baseUrl}/search/users?query=\${encodeURIComponent(filter)}\`; +\t\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { method: 'GET', url }); +\t\t\t\t\tconst items = response.data ?? []; +\t\t\t\t\treturn { +\t\t\t\t\t\tresults: items.map((u: { id: number; first_name: string; last_name: string; nickname: string }) => ({ +\t\t\t\t\t\t\tname: formatUserName(u), +\t\t\t\t\t\t\tvalue: u.id, +\t\t\t\t\t\t})), +\t\t\t\t\t}; +\t\t\t\t} +\t\t\t\tif (entityType === 'thread') { +\t\t\t\t\treturn { results: [] }; +\t\t\t\t} +\t\t\t\tconst url = filter +\t\t\t\t\t? \`\${credentials.baseUrl}/search/chats?query=\${encodeURIComponent(filter)}\` +\t\t\t\t\t: \`\${credentials.baseUrl}/chats?per=50\`; +\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { method: 'GET', url }); +\t\t\t\tconst items = response.data ?? []; +\t\t\t\treturn { +\t\t\t\t\tresults: items.map((c: { id: number; name: string }) => ({ +\t\t\t\t\t\tname: c.name, +\t\t\t\t\t\tvalue: c.id, +\t\t\t\t\t})), +\t\t\t\t}; +\t\t\t}, +\t\t}, +\t\tloadOptions: { +\t\t\tasync getCustomProperties(this: ILoadOptionsFunctions): Promise { +\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); +\t\t\t\tconst resource = this.getNodeParameter('resource') as string; +\t\t\t\tconst entityType = resource === 'task' ? 'Task' : 'User'; +\t\t\t\ttry { +\t\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { +\t\t\t\t\t\tmethod: 'GET', +\t\t\t\t\t\turl: \`\${credentials.baseUrl}/custom_properties?entity_type=\${entityType}\`, +\t\t\t\t\t}); +\t\t\t\t\tconst items = response.data ?? []; +\t\t\t\t\treturn items.map((p: { id: number; name: string }) => ({ +\t\t\t\t\t\tname: p.name, +\t\t\t\t\t\tvalue: p.id, +\t\t\t\t\t})); +\t\t\t\t} catch { +\t\t\t\t\treturn []; +\t\t\t\t} +\t\t\t}, +\t\t}, +\t}; +} +`; + +fs.writeFileSync(path.join(V1_DIR, 'PachcaV1.node.ts'), v1NodeContent); +console.log(' PachcaV1.node.ts — wrapper with execute + loadOptions'); + +console.log('\nDone! V1 files frozen in', V1_DIR); diff --git a/integrations/n8n/scripts/generate-n8n.ts b/integrations/n8n/scripts/generate-n8n.ts new file mode 100644 index 00000000..0eb7aa7a --- /dev/null +++ b/integrations/n8n/scripts/generate-n8n.ts @@ -0,0 +1,3239 @@ +#!/usr/bin/env tsx +/** + * n8n Node Generator — produces declarative n8n node files from OpenAPI spec. + * + * Sources: + * - @pachca/openapi-parser → ParsedAPI (endpoints, schemas, tags) + * - packages/spec/workflows.ts → English descriptions + * - packages/generator/src/naming.ts → case conversion utilities + * - apps/docs/lib/openapi/mapper.ts → groupEndpointsByTag + * + * Output: + * - nodes/Pachca/*Description.ts (16 resource files) + * - nodes/Pachca/Pachca.node.ts (main node) + * - credentials/PachcaApi.credentials.ts + */ + +import * as fs from 'fs'; +import * as path from 'path'; +import { parseOpenAPI, resolveAllOf, getSchemaType } from '@pachca/openapi-parser'; +import type { Endpoint, Schema, Parameter } from '@pachca/openapi-parser'; +import { snakeToCamel, snakeToPascal } from '../../../packages/generator/src/naming.js'; +import { extractBodyFields, getWrapperKey, type BodyField } from './utils.js'; +import { generateUrlFromOperation } from '../../../apps/docs/lib/openapi/mapper.js'; +import { generateExample } from '../../../apps/docs/lib/openapi/example-generator.js'; + +// ============================================================================ +// PATHS +// ============================================================================ +const ROOT = path.resolve(__dirname, '../../..'); +const EN_SPEC_PATH = path.join(ROOT, 'packages/spec/openapi.en.yaml'); +const OUTPUT_DIR = path.resolve(__dirname, '../nodes/Pachca/V2'); +const CREDS_DIR = path.resolve(__dirname, '../credentials'); + +// ============================================================================ +// V1 COMPATIBILITY TABLES +// ============================================================================ + +/** v2 resource value → v1 resource value (for resources that were renamed) */ +const V1_COMPAT_RESOURCES: Record = { + customProperty: 'customFields', + profile: 'status', + reaction: 'reactions', +}; + +/** v2 operation value → v1 operation value (per resource) */ +const V1_COMPAT_OPS: Record> = { + message: { create: 'send', get: 'getById' }, + user: { get: 'getById' }, + chat: { get: 'getById' }, + groupTag: { get: 'getById', getAllUsers: 'getUsers' }, + profile: { get: 'getProfile' }, + customProperty: { get: 'getCustomProperties' }, + reaction: { create: 'addReaction', delete: 'deleteReaction', getAll: 'getReactions' }, + thread: { create: 'createThread', get: 'getThread' }, + form: { create: 'createView' }, + file: { create: 'upload' }, +}; + +/** Alias operations in old resources — shown only for @version:[1] */ +const V1_ALIAS_OPS: Record = { + message: ['getReadMembers', 'unfurl'], + chat: ['getMembers', 'addUsers', 'removeUser', 'updateRole', 'leaveChat'], + groupTag: ['addTags', 'removeTag'], +}; + +/** v1 parameter name overrides (resource-prefixed names) */ +const V1_COMPAT_PARAMS: Record>> = { + reactions: { + '*': { id: 'reactionsMessageId', code: 'reactionsReactionCode' }, + }, + thread: { + createThread: { id: 'threadMessageId' }, + getThread: { id: 'threadThreadId' }, + }, + groupTag: { + '*': { id: 'groupTagId' }, + create: { name: 'groupTagName', color: 'groupTagColor' }, + update: { name: 'groupTagName', color: 'groupTagColor' }, + addTags: { chatId: 'groupTagChatId', groupTagIds: 'groupTagIds' }, + removeTag: { chatId: 'groupTagChatId', tagId: 'tagId' }, + getUsers: { id: 'groupTagId' }, + }, + chat: { + create: { name: 'chatName' }, + update: { name: 'chatName' }, + }, + task: { + create: { kind: 'taskKind', content: 'taskContent', dueAt: 'taskDueAt', priority: 'taskPriority' }, + }, + status: { + updateStatus: { emoji: 'statusEmoji', title: 'statusTitle', expiresAt: 'statusExpiresAt' }, + }, + bot: { + update: { id: 'botId', outgoingUrl: 'webhookUrl' }, + }, + form: { + createView: { title: 'formTitle', blocks: 'formBlocks', builderMode: 'formBuilderMode', template: 'formTemplate' }, + }, +}; + +/** v1 collection name overrides */ +const V1_COMPAT_COLLECTIONS: Record>> = { + user: { + getAll: { additionalFields: 'additionalOptions' }, + }, + chat: { + getMembers: { additionalFields: 'chatMembersOptions' }, + }, + message: { + getReadMembers: { additionalFields: 'readMembersOptions' }, + }, + reactions: { + getReactions: { additionalFields: 'reactionsOptions' }, + }, +}; + +/** v1 sub-collection names for fixedCollections */ +const V1_COMPAT_SUBCOLLECTIONS: Record = { + buttons: 'button', + files: 'file', + customProperties: 'property', + formBlocks: 'block', + linkPreviews: 'preview', + options: 'option', +}; + +/** v1 alias operations: optional query params (not from OpenAPI) */ +const V1_ALIAS_QUERY_PARAMS: Record> = { + chat: { + getMembers: [['role', 'role']], + }, +}; + +/** v1 alias operations: special handlers */ +const V1_ALIAS_SPECIALS: Record> = { + message: { + unfurl: 'unfurlLinkPreviews', + }, +}; + +/** Extra body fields for v2 operations not in OpenAPI (v1 compat, e.g. groupTag color) */ +const V1_EXTRA_BODY_FIELDS: Record> = { + groupTag: { + create: [['color', 'groupTagColor']], + update: [['color', 'groupTagColor']], + }, +}; + +/** Resources only visible in v2 (new, not in v1) */ +const V2_ONLY_RESOURCES = new Set(['member', 'readMember', 'linkPreview', 'search', 'security', 'export']); + +/** Resources whose endpoints are sub-paths of another resource but should use standard CRUD names */ +const STANDARD_CRUD_SUBRESOURCES = new Set(['reaction', 'member', 'readMember', 'linkPreview', 'thread', 'export']); + +/** Preferred default operation per resource (for better UX — list-first resources default to getAll) */ +const PREFERRED_DEFAULT_OPS: Record = { + chat: 'getAll', + groupTag: 'getAll', + user: 'getAll', + member: 'getAll', +}; + +/** v1 ID parameter fallback — shared ops where v1 used prefixed names (chatId, messageId, userId) */ +const V1_ID_FALLBACKS: Record = { + chat: { v1Name: 'chatId', sharedOps: ['get', 'getById', 'update', 'archive', 'unarchive'] }, + message: { v1Name: 'messageId', sharedOps: ['get', 'getById', 'update', 'delete', 'pin', 'unpin'] }, + user: { v1Name: 'userId', sharedOps: ['get', 'getById', 'update', 'delete'] }, +}; + +/** Routing for v1 alias operations (cross-resource, @version:[1] only) */ +const V1_ALIAS_ROUTING: Record> = { + chat: { + getMembers: { method: 'GET', url: '=/chats/{{$parameter["chatId"]}}/members', pagination: true }, + addUsers: { method: 'POST', url: '=/chats/{{$parameter["chatId"]}}/members', splitComma: [['memberIds', 'member_ids', 'int']] }, + removeUser: { method: 'DELETE', url: '=/chats/{{$parameter["chatId"]}}/members/{{$parameter["userId"]}}' }, + updateRole: { method: 'PUT', url: '=/chats/{{$parameter["chatId"]}}/members/{{$parameter["userId"]}}' }, + leaveChat: { method: 'DELETE', url: '=/chats/{{$parameter["chatId"]}}/leave' }, + }, + message: { + getReadMembers: { method: 'GET', url: '=/messages/{{$parameter["messageId"]}}/read_member_ids', pagination: true }, + unfurl: { method: 'POST', url: '=/messages/{{$parameter["messageId"]}}/link_previews' }, + }, + groupTag: { + addTags: { method: 'POST', url: '=/chats/{{$parameter["groupTagChatId"]}}/group_tags', splitComma: [['groupTagIds', 'group_tag_ids', 'int']] }, + removeTag: { method: 'DELETE', url: '=/chats/{{$parameter["groupTagChatId"]}}/group_tags/{{$parameter["tagId"]}}' }, + }, +}; + +/** Field definitions for V1_ALIAS_OPS — these operations get no fields from the OpenAPI loop */ +type AliasFieldDef = { + name: string; + displayName: string; + type: 'number' | 'string' | 'boolean' | 'options'; + required?: boolean; + default?: unknown; + description?: string; + placeholder?: string; + options?: { name: string; value: string }[]; + routing?: { send: { type: 'body' | 'query'; property: string } }; +}; + +const V1_ALIAS_FIELDS: Record> = { + chat: { + getMembers: { + pagination: true, + fields: [ + { name: 'chatId', displayName: 'Chat ID', type: 'number', required: true, default: 0, description: 'ID of the chat' }, + ], + }, + addUsers: { + fields: [ + { name: 'chatId', displayName: 'Chat ID', type: 'number', required: true, default: 0, description: 'ID of the chat' }, + { name: 'memberIds', displayName: 'Member IDs', type: 'string', required: true, default: '', description: 'Comma-separated list of user IDs to add', placeholder: '186,187' }, + { name: 'silent', displayName: 'Silent', type: 'boolean', default: false, description: 'Whether to skip creating a system message about adding members', routing: { send: { type: 'body', property: 'silent' } } }, + ], + }, + removeUser: { + fields: [ + { name: 'chatId', displayName: 'Chat ID', type: 'number', required: true, default: 0, description: 'ID of the chat' }, + { name: 'userId', displayName: 'User ID', type: 'number', required: true, default: 0, description: 'ID of the user to remove' }, + ], + }, + updateRole: { + fields: [ + { name: 'chatId', displayName: 'Chat ID', type: 'number', required: true, default: 0, description: 'ID of the chat' }, + { name: 'userId', displayName: 'User ID', type: 'number', required: true, default: 0, description: 'ID of the user' }, + { name: 'newRole', displayName: 'Role', type: 'options', required: true, default: 'member', + options: [{ name: 'Admin', value: 'admin' }, { name: 'Editor', value: 'editor' }, { name: 'Member', value: 'member' }], + routing: { send: { type: 'body', property: 'role' } } }, + ], + }, + leaveChat: { + fields: [ + { name: 'chatId', displayName: 'Chat ID', type: 'number', required: true, default: 0, description: 'ID of the chat' }, + ], + }, + }, + message: { + getReadMembers: { + pagination: true, + fields: [ + { name: 'messageId', displayName: 'Message ID', type: 'number', required: true, default: 0, description: 'ID of the message' }, + ], + }, + unfurl: { + fields: [ + { name: 'messageId', displayName: 'Message ID', type: 'number', required: true, default: 0, description: 'ID of the message' }, + { name: 'linkPreviews', displayName: 'Link Previews', type: 'string', required: true, default: '', + description: 'JSON map of link previews where each key is a URL', + placeholder: '{"https://example.com":{"title":"Example","description":"Desc"}}', + routing: { send: { type: 'body', property: 'link_previews' } } }, + ], + }, + }, + groupTag: { + addTags: { + fields: [ + { name: 'groupTagChatId', displayName: 'Chat ID', type: 'number', required: true, default: 0, description: 'ID of the chat to add tags to' }, + { name: 'groupTagIds', displayName: 'Tag IDs', type: 'string', required: true, default: '', description: 'Comma-separated list of group tag IDs', placeholder: '1,2,3' }, + ], + }, + removeTag: { + fields: [ + { name: 'groupTagChatId', displayName: 'Chat ID', type: 'number', required: true, default: 0, description: 'ID of the chat' }, + { name: 'tagId', displayName: 'Tag ID', type: 'number', required: true, default: 0, description: 'ID of the tag to remove' }, + ], + }, + }, +}; + +/** Optional fields promoted to top-level (not inside additionalFields) for ALL versions */ +const PROMOTED_TOP_LEVEL_FIELDS: Record>> = { + message: { create: new Set(['entity_type']), send: new Set(['entity_type']) }, +}; + +// ============================================================================ +// WEBHOOK EVENT MAPPING (for PachcaTrigger generation) +// ============================================================================ + +/** Maps (type:event) from webhook payload schemas to user-friendly n8n event options */ +const WEBHOOK_EVENT_MAP: Record = { + 'message:new': { name: 'New Message', value: 'new_message' }, + 'message:update': { name: 'Message Updated', value: 'message_updated' }, + 'message:delete': { name: 'Message Deleted', value: 'message_deleted' }, + 'message:link_shared': { name: 'Link Shared', value: 'link_shared' }, + 'reaction:new': { name: 'New Reaction', value: 'new_reaction' }, + 'reaction:delete': { name: 'Reaction Deleted', value: 'reaction_deleted' }, + 'button:click': { name: 'Button Pressed', value: 'button_pressed' }, + 'view:submit': { name: 'Form Submitted', value: 'form_submitted' }, + 'chat_member:add': { name: 'Chat Member Added', value: 'chat_member_added' }, + 'chat_member:remove': { name: 'Chat Member Removed', value: 'chat_member_removed' }, + 'company_member:invite': { name: 'User Invited', value: 'company_member_invite' }, + 'company_member:confirm': { name: 'User Confirmed', value: 'company_member_confirm' }, + 'company_member:update': { name: 'User Updated', value: 'company_member_update' }, + 'company_member:suspend': { name: 'User Suspended', value: 'company_member_suspend' }, + 'company_member:activate': { name: 'User Activated', value: 'company_member_activate' }, + 'company_member:delete': { name: 'User Deleted', value: 'company_member_delete' }, +}; + +/** Fallback placeholders for fields without OpenAPI examples */ +const FIELD_PLACEHOLDERS: Record = { + blocks: '[{"type":"input","name":"field_1","label":"Your name"}]', +}; + +/** fixedCollection sub-fields that should use loadOptions instead of manual input */ +const LOAD_OPTIONS_SUBFIELDS: Record> = { + custom_properties: { + id: { method: 'getCustomProperties', displayName: 'Custom Property Name or ID', description: 'Choose from the list, or specify an ID using an expression' }, + }, +}; + +/** Notices shown above operation fields — informational tips for specific operations */ +// Scope-to-roles mapping — loaded from x-scope-roles in TokenScope schema at runtime +let scopeRolesMap = new Map(); +const ALL_ROLES = ['owner', 'admin', 'user', 'bot']; + +/** Build a notice from endpoint requirements (scope → roles, plan) */ +function buildOperationNotice(ep: Endpoint): string | undefined { + const scope = ep.requirements?.scope; + const plan = ep.requirements?.plan; + if (!scope && !plan) return undefined; + + let rolePart = ''; + if (scope) { + const scopeKey = scope.replace(/:/g, '_'); + const roles = scopeRolesMap.get(scopeKey); + if (roles && roles.length < ALL_ROLES.length) { + if (roles.length === 1 && roles[0] === 'owner') { + rolePart = 'owner role'; + } else { + const missing = ALL_ROLES.filter(r => !roles.includes(r)); + if (missing.includes('user') && missing.includes('bot')) { + rolePart = 'admin permissions'; + } else { + rolePart = `${roles.join(', ')} roles`; + } + } + } + } + + let planPart = ''; + if (plan) { + const planName = plan.charAt(0).toUpperCase() + plan.slice(1); + planPart = `"${planName}" plan`; + } + + if (!rolePart && !planPart) return undefined; + + if (rolePart && planPart) return `Requires ${rolePart} and the ${planPart}`; + if (rolePart) return `Requires ${rolePart}`; + return `Requires the ${planPart}`; +} + +/** URL extraction patterns for resourceLocator url mode (search method → regex + placeholder) */ +const URL_PATTERNS: Record = { + searchChats: { + regex: 'https?://[^/]+/chats/(\\d+)', + placeholder: 'https://app.pachca.com/chats/12345', + error: 'Not a valid Pachca chat URL', + }, + searchUsers: { + regex: 'https?://[^/]+/users/(\\d+)', + placeholder: 'https://app.pachca.com/users/12345', + error: 'Not a valid Pachca user URL', + }, +}; + +/** Body fields that should use resourceLocator with searchable dropdown (resource.field → searchMethod) */ +const BODY_FIELD_SEARCH: Record> = { + message: { entity_id: 'searchEntities' }, // dynamic: searches chats or users based on entityType +}; + +/** Path parameters that use resourceLocator with searchable dropdown */ +const PATH_PARAM_SEARCH: Record> = { + chat: { id: 'searchChats' }, + user: { id: 'searchUsers' }, + member: { id: 'searchChats', user_id: 'searchUsers' }, // member's `id` is chat_id, `user_id` is user +}; + +/** Query parameters that use resourceLocator in v2 */ +const SEARCHABLE_QUERY_PARAMS: Record = { + chat_id: { method: 'searchChats' }, + user_id: { method: 'searchUsers' }, +}; + +/** Hints for fields — contextual tips for no-code users (resource.field → hint) */ +const FIELD_HINTS: Record> = { + message: { + files: 'Upload a file first using File > Create, then use the returned key here', + }, + form: { + trigger_id: 'Trigger ID from a button press webhook event — expires in 3 seconds', + }, + export: { + webhook_url: 'Set this to a Webhook node URL in another workflow to receive the export-ready notification', + }, +}; + +// EN description lookup maps (populated from openapi.en.yaml in main()) +let enParamDescs = new Map(); // key: `${endpointId}:${paramName}` +let enBodyDescs = new Map(); // key: `${endpointId}:${fieldName}` +let enSubFieldDescs = new Map(); // key: `${endpointId}:${fieldName}:${subName}` +let enEnumDescs = new Map>(); // key: `${endpointId}:${fieldName}` +let enEndpoints = new Map(); // key: endpointId + +/** Get English enum descriptions for a field from EN spec */ +function getEnumDescriptions(fieldName: string, endpointId: string): Record | undefined { + return enEnumDescs.get(`${endpointId}:${fieldName}`); +} + +/** Get English field description from EN spec, with fallback to original (Russian) description */ +function getFieldDescription(fieldName: string, fallback: string | undefined, endpointId: string, parentField?: string): string | undefined { + if (parentField) { + const desc = enSubFieldDescs.get(`${endpointId}:${parentField}:${fieldName}`); + if (desc) return desc; + } + return enParamDescs.get(`${endpointId}:${fieldName}`) + ?? enBodyDescs.get(`${endpointId}:${fieldName}`) + ?? fallback; +} + +// ============================================================================ +// TAG → RESOURCE MAPPING +// ============================================================================ + +/** OpenAPI tag → n8n resource value (singular, camelCase) */ +function tagToResource(tag: string): string { + const MAP: Record = { + 'Users': 'user', + 'Messages': 'message', + 'Chats': 'chat', + 'Members': 'member', + 'Threads': 'thread', + 'Reactions': 'reaction', + 'Group tags': 'groupTag', + 'Profile': 'profile', + 'Common': 'common', + 'Tasks': 'task', + 'Bots': 'bot', + 'Views': 'form', + 'Read members': 'readMember', + 'Link Previews': 'linkPreview', + 'Search': 'search', + 'Security': 'security', + }; + return MAP[tag] || tag.toLowerCase().replace(/s$/, ''); +} + +/** Resource value → display name (Title Case, singular) */ +function resourceDisplayName(resource: string): string { + const MAP: Record = { + user: 'User', message: 'Message', chat: 'Chat', member: 'Chat Member', + thread: 'Thread', reaction: 'Reaction', groupTag: 'Group Tag', + profile: 'Profile', customProperty: 'Custom Property', task: 'Task', + bot: 'Bot', file: 'File', form: 'Form', readMember: 'Read Member', + linkPreview: 'Link Preview', search: 'Search', security: 'Security', + export: 'Chat Export', + }; + return MAP[resource] || snakeToPascal(resource); +} + +// ============================================================================ +// OPERATION MAPPING +// ============================================================================ + +/** Map HTTP method + path pattern → n8n operation value */ +function endpointToOperation(ep: Endpoint, resource: string): string { + const method = ep.method; + const segments = ep.path.split('/').filter(Boolean); + const staticSegments = segments.filter(s => !s.startsWith('{')); + const lastStatic = staticSegments[staticSegments.length - 1]; + const hasTrailingParam = segments[segments.length - 1]?.startsWith('{') && staticSegments.length > 1; + + // Special action paths + if (lastStatic === 'pin') return method === 'POST' ? 'pin' : 'unpin'; + if (lastStatic === 'archive') return 'archive'; + if (lastStatic === 'unarchive') return 'unarchive'; + if (lastStatic === 'leave') return 'leave'; + // /views/open is the primary create operation for forms + if (ep.path === '/views/open' && method === 'POST') return 'create'; + + // Sub-resource action paths (e.g., /users/{id}/status → getStatus, updateStatus) + // When last static segment differs from the resource root and is NOT a CRUD collection + if (staticSegments.length > 1) { + const resourceRoot = staticSegments[0]; + if (lastStatic !== resourceRoot) { + // Check if this is a "standard CRUD sub-resource" — endpoints live under another + // resource's path but should use simple CRUD names (e.g., /messages/{id}/reactions → create/delete/getAll) + const lastStaticCamel = snakeToCamel(lastStatic); + const resourcePlural = resource.endsWith('y') ? resource.slice(0, -1) + 'ies' : resource + 's'; + if (STANDARD_CRUD_SUBRESOURCES.has(resource) && (lastStaticCamel === resourcePlural || lastStaticCamel === resource)) { + if (hasTrailingParam) { + if (method === 'DELETE') return 'delete'; + if (method === 'PUT' || method === 'PATCH') return 'update'; + return 'get'; + } + if (method === 'GET') return 'getAll'; + if (method === 'POST') return 'create'; + if (method === 'PUT') return 'update'; + if (method === 'DELETE') return 'delete'; + } + + const subName = snakeToPascal(lastStatic); + + // Single item sub-resource with trailing param (e.g., /chats/{id}/members/{user_id}) + if (hasTrailingParam) { + if (method === 'DELETE') return `remove${subName}`; + if (method === 'PUT' || method === 'PATCH') return `update${subName}`; + return `get${subName}`; + } + + // Collection sub-resource (e.g., /chats/{id}/members, /users/{id}/status) + if (method === 'GET') { + const hasCursor = ep.parameters.some(p => p.in === 'query' && p.name === 'cursor'); + return hasCursor ? `getAll${subName}` : `get${subName}`; + } + if (method === 'POST') return `add${subName}`; + if (method === 'PUT') return `update${subName}`; + if (method === 'DELETE') return `delete${subName}`; + } + } + + // Standard CRUD + if (method === 'GET' && !segments.some(s => s.startsWith('{'))) { + const hasCursor = ep.parameters.some(p => p.in === 'query' && p.name === 'cursor'); + return hasCursor ? 'getAll' : 'get'; + } + if (method === 'GET') return 'get'; + if (method === 'POST') return 'create'; + if (method === 'PUT' || method === 'PATCH') return 'update'; + if (method === 'DELETE') return 'delete'; + + return 'execute'; +} + +/** Get the v1-compatible operation value */ +function getV1OpValue(resource: string, v2Op: string): string { + return V1_COMPAT_OPS[resource]?.[v2Op] ?? v2Op; +} + +/** Generate n8n operation display name */ +function operationDisplayName(op: string): string { + const MAP: Record = { + getAll: 'Get Many', get: 'Get', create: 'Create', update: 'Update', delete: 'Delete', + add: 'Add', remove: 'Remove', pin: 'Pin', unpin: 'Unpin', + archive: 'Archive', unarchive: 'Unarchive', leave: 'Leave', updateRole: 'Update Role', + }; + if (MAP[op]) return MAP[op]; + // Sub-resource operations: "getAllStatus" → "Get Many Status", "updateMembers" → "Update Members" + return op.replace(/([A-Z])/g, ' $1').replace(/^\s/, '').replace(/^(get All|get|add|update|delete|remove)/i, (m) => { + const lower = m.toLowerCase(); + if (lower === 'get all') return 'Get Many'; + return m.charAt(0).toUpperCase() + m.slice(1); + }).replace(/\bIds?\b/g, m => m === 'Id' ? 'ID' : 'IDs'); +} + +/** Generate n8n action label (eslint format: "Get many users") */ +function actionLabel(op: string, resourceName: string, resource?: string): string { + const singular = resourceName.toLowerCase(); + const plural = singular.endsWith('y') ? singular.slice(0, -1) + 'ies' : singular + 's'; + + // Resource-specific overrides for better semantics + const RESOURCE_PLURAL_OVERRIDES: Record = { + security: 'audit events', + }; + const overriddenPlural = RESOURCE_PLURAL_OVERRIDES[singular] ?? plural; + + // Standard CRUD + if (op === 'getAll') return `Get many ${overriddenPlural}`; + if (op === 'get') return `Get a ${singular}`; + if (op === 'create') return `Create a ${singular}`; + if (op === 'update') return `Update a ${singular}`; + if (op === 'delete') return `Delete a ${singular}`; + if (op === 'add') return `Add a ${singular}`; + if (op === 'remove') return `Remove a ${singular}`; + if (op === 'pin') return `Pin a ${singular}`; + if (op === 'unpin') return `Unpin a ${singular}`; + if (op === 'archive') return `Archive a ${singular}`; + if (op === 'unarchive') return `Unarchive a ${singular}`; + if (op === 'leave') { + if (resource === 'member') return 'Leave chat'; + return `Leave ${singular}`; + } + + // Alias operations with readable labels + const ALIAS_LABELS: Record = { + getMembers: 'Get members', + addUsers: 'Add users', + removeUser: 'Remove user', + updateRole: 'Update member role', + leaveChat: 'Leave chat', + getReadMembers: 'Get read members', + unfurl: 'Unfurl link preview', + addTags: 'Add tags to chat', + removeTag: 'Remove tag from chat', + }; + if (ALIAS_LABELS[op]) return ALIAS_LABELS[op]; + + // Sub-resource operations: extract action + sub-resource name + const subMatch = op.match(/^(getAll|get|add|update|delete|remove)(.+)$/); + if (subMatch) { + const [, action, subPascal] = subMatch; + let subWords = subPascal.replace(/([A-Z])/g, ' $1').trim().toLowerCase(); + + // Remove resource name prefix from sub-resource to avoid stutter + // e.g., readMember.getAllReadMemberIds → "read member ids" not "read member read member ids" + if (subWords.startsWith(singular + ' ')) { + subWords = subWords.slice(singular.length + 1); + } + + if (action === 'getAll') { + if (resource === 'search') return `Search ${subWords}`; + return `Get many ${singular} ${subWords}`; + } + if (action === 'get') return `Get ${singular} ${subWords}`; + if (action === 'update') return `Update ${singular} ${subWords}`; + if (action === 'delete') return `Delete ${singular} ${subWords}`; + if (action === 'add') return `Add ${subWords} to ${singular}`; + if (action === 'remove') return `Remove ${subWords} from ${singular}`; + } + + // Fallback + return `${operationDisplayName(op)} a ${singular}`; +} + +// ============================================================================ +// PARAMETER NAME RESOLUTION +// ============================================================================ + +/** Get the v1-compatible parameter name */ +function getParamName(resource: string, op: string, fieldName: string): string { + // Use v1 resource name for lookup (e.g., "reactions" not "reaction") + const v1Resource = V1_COMPAT_RESOURCES[resource] ?? resource; + const opMap = V1_COMPAT_PARAMS[v1Resource]; + if (opMap) { + const wildcard = opMap['*']?.[snakeToCamel(fieldName)]; + if (wildcard) return wildcard; + const specific = opMap[op]?.[snakeToCamel(fieldName)]; + if (specific) return specific; + } + return snakeToCamel(fieldName); +} + +// ============================================================================ +// n8n TYPE MAPPING +// ============================================================================ + +/** Map OpenAPI type → n8n field type */ +function toN8nType(field: BodyField): string { + if (field.enum && field.enum.length > 0) return 'options'; + if (field.format === 'date-time') return 'dateTime'; + if (field.type === 'boolean') return 'boolean'; + if (field.type === 'integer' || field.type === 'number') return 'number'; + if (field.type === 'array' && field.items?.properties) return 'fixedCollection'; + // Array of primitives → comma-separated string (transformed via splitCommaToArray) + if (field.type === 'array' && !field.items?.properties) return 'string'; + if (field.type === 'object' && field.properties) return 'json'; + return 'string'; +} + +/** Resolve allOf wrapper on query parameter schemas so enums are visible */ +function resolveQuerySchema(schema: Schema): Schema { + if (schema.allOf) return resolveAllOf(schema); + return schema; +} + +/** Map OpenAPI query parameter schema → n8n field type */ +function queryParamN8nType(schema: Schema): string { + const resolved = resolveQuerySchema(schema); + if (resolved.enum) return 'options'; + const type = getSchemaType(resolved); + if (type === 'boolean') return 'boolean'; + if (resolved.format === 'date-time') return 'dateTime'; + if (type === 'integer' || type === 'number') return 'number'; + return 'string'; +} + +/** Check if a field is an array of primitives (needs splitCommaToArray preSend) */ +function isPrimitiveArray(field: BodyField): boolean { + return field.type === 'array' && !field.items?.properties; +} + +/** Get the item type for primitive arrays */ +function getArrayItemType(field: BodyField): 'int' | 'string' { + const itemType = field.items ? getSchemaType(field.items) : 'string'; + return (itemType === 'integer' || itemType === 'number') ? 'int' : 'string'; +} + +/** Ensure boolean descriptions start with "Whether" (eslint requirement) */ +function booleanDescription(desc?: string): string { + if (!desc) return 'Whether to enable this option'; + if (desc.startsWith('Whether')) return desc; + return `Whether to ${desc.charAt(0).toLowerCase()}${desc.slice(1)}`; +} + +// ============================================================================ +// CODE GENERATION HELPERS +// ============================================================================ + + + +function quote(s: string): string { + return `'${s.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`; +} + +function generateEnumOptions(values: unknown[], enumDescriptions?: Record): string { + return values + .map(v => { + const val = String(v); + const name = val.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase()); + const desc = enumDescriptions?.[val]; + if (desc && desc.toLowerCase() !== name.toLowerCase()) { + return { name, val, str: `{ name: ${quote(name)}, value: ${quote(val)}, description: ${quote(desc)} }` }; + } + return { name, val, str: `{ name: ${quote(name)}, value: ${quote(val)} }` }; + }) + .sort((a, b) => a.name.localeCompare(b.name)) + .map(o => o.str) + .join(',\n'); +} + +// ============================================================================ +// GENERATE RESOURCE DESCRIPTION FILE +// ============================================================================ + +interface OperationInfo { + v2Op: string; + v1Op: string; + endpoint: Endpoint; + fields: BodyField[]; + queryParams: Parameter[]; + pathParams: Parameter[]; + hasPagination: boolean; + wrapperKey: string | null; + description: string; +} + +function generateResourceDescription( + resource: string, + operations: OperationInfo[], +): string { + const displayName = resourceDisplayName(resource); + + const allResourceValues = [resource]; + + const lines: string[] = []; + // Description files are now UI-only — no routing imports needed (execute() handles it) + lines.push(`import type { INodeProperties } from 'n8n-workflow';`); + lines.push(''); + lines.push(`export const ${snakeToCamel(resource)}Operations: INodeProperties[] = [`); + + // --- Operation dropdown --- + lines.push('\t{'); + lines.push(`\t\tdisplayName: 'Operation',`); + lines.push(`\t\tname: 'operation',`); + lines.push(`\t\ttype: 'options',`); + lines.push(`\t\tnoDataExpression: true,`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}] } },`); + lines.push(`\t\toptions: [`); + + // Collect all operation option objects, then sort alphabetically by name + const opItems: { name: string; lines: string[] }[] = []; + + for (const op of operations) { + const displayOpName = operationDisplayName(op.v2Op); + const action = actionLabel(op.v2Op, displayName, resource); + + opItems.push({ name: displayOpName, lines: [ + `\t\t\t{`, + `\t\t\t\tname: ${quote(displayOpName)},`, + `\t\t\t\tvalue: ${quote(op.v2Op)},`, + `\t\t\t\taction: ${quote(action)},`, + `\t\t\t},`, + ]}); + } + + // Sort alphabetically by display name (n8n lint rule: node-param-options-type-unsorted-items) + opItems.sort((a, b) => a.name.localeCompare(b.name)); + for (const item of opItems) { + lines.push(...item.lines); + } + + lines.push(`\t\t],`); + const preferredDefault = PREFERRED_DEFAULT_OPS[resource]; + const defaultOp = preferredDefault && operations.some(o => o.v2Op === preferredDefault) + ? preferredDefault + : (operations[0]?.v2Op ?? operations[0]?.v1Op ?? 'getAll'); + lines.push(`\t\tdefault: ${quote(defaultOp)},`); + lines.push(`\t},`); + lines.push(`];`); + + // --- Fields --- + lines.push(''); + lines.push(`export const ${snakeToCamel(resource)}Fields: INodeProperties[] = [`); + + for (const op of operations) { + const allOpValues = [op.v2Op]; + + // Path parameters — with resourceLocator for searchable resources + // When V1_ID_FALLBACKS exists for this resource and op is a shared op, + // the v2 field should only show for v2 (legacy ID field handles v1). + const pathOpValues = allOpValues; + const pathVersionConstraint = ''; + + for (const param of op.pathParams) { + const paramName = getParamName(resource, op.v1Op, param.name); + const paramDesc = getFieldDescription(param.name, param.description, op.endpoint.id); + const searchMethod = PATH_PARAM_SEARCH[resource]?.[param.name]; + + if (searchMethod) { + // v2: resourceLocator with searchable dropdown + lines.push(`\t{`); + lines.push(`\t\tdisplayName: ${quote(formatDisplayName(param.name))},`); + lines.push(`\t\tname: ${quote(paramName)},`); + lines.push(`\t\ttype: 'resourceLocator',`); + lines.push(`\t\tdefault: { mode: 'list', value: '' },`); + lines.push(`\t\trequired: true,`); + if (paramDesc && paramDesc.toLowerCase() !== formatDisplayName(param.name).toLowerCase()) lines.push(`\t\tdescription: ${quote(sanitizeDescription(paramDesc))},`); + lines.push(`\t\tmodes: [`); + lines.push(`\t\t\t{`); + lines.push(`\t\t\t\tdisplayName: 'From List',`); + lines.push(`\t\t\t\tname: 'list',`); + lines.push(`\t\t\t\ttype: 'list',`); + lines.push(`\t\t\t\ttypeOptions: { searchListMethod: ${quote(searchMethod)}, searchable: true },`); + lines.push(`\t\t\t},`); + lines.push(`\t\t\t{`); + lines.push(`\t\t\t\tdisplayName: 'By ID',`); + lines.push(`\t\t\t\tname: 'id',`); + lines.push(`\t\t\t\ttype: 'string',`); + const pathEx = getPlaceholder(param.example ?? param.schema?.example); + lines.push(`\t\t\t\tplaceholder: ${quote(pathEx ? `e.g. ${pathEx}` : 'e.g. 12345')},`); + lines.push(`\t\t\t},`); + const urlPattern = URL_PATTERNS[searchMethod]; + if (urlPattern) { + lines.push(`\t\t\t{`); + lines.push(`\t\t\t\tdisplayName: 'By URL',`); + lines.push(`\t\t\t\tname: 'url',`); + lines.push(`\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\tplaceholder: ${quote(urlPattern.placeholder)},`); + lines.push(`\t\t\t\textractValue: { type: 'regex', regex: ${quote(urlPattern.regex)} },`); + lines.push(`\t\t\t\tvalidation: [{ type: 'regex', properties: { regex: ${quote(urlPattern.regex)}, errorMessage: ${quote(urlPattern.error)} } }],`); + lines.push(`\t\t\t},`); + } + lines.push(`\t\t],`); + lines.push(`\t\tdisplayOptions: { show: { ${pathVersionConstraint}resource: [${allResourceValues.map(quote).join(', ')}], operation: [${pathOpValues.map(quote).join(', ')}] } },`); + lines.push(`\t},`); + } else { + lines.push(`\t{`); + lines.push(`\t\tdisplayName: ${quote(formatDisplayName(param.name))},`); + lines.push(`\t\tname: ${quote(paramName)},`); + lines.push(`\t\ttype: 'number',`); + lines.push(`\t\trequired: true,`); + lines.push(`\t\tdefault: 0,`); + lines.push(`\t\tdisplayOptions: { show: { ${pathVersionConstraint}resource: [${allResourceValues.map(quote).join(', ')}], operation: [${pathOpValues.map(quote).join(', ')}] } },`); + if (paramDesc && paramDesc.toLowerCase() !== formatDisplayName(param.name).toLowerCase()) { + lines.push(`\t\tdescription: ${quote(sanitizeDescription(paramDesc))},`); + } + lines.push(`\t},`); + } + } + + // Operation notice — auto-generated from scope roles + plan requirements + const noticeText = buildOperationNotice(op.endpoint); + if (noticeText) { + lines.push(`\t{`); + lines.push(`\t\tdisplayName: ${quote(noticeText)},`); + lines.push(`\t\tname: ${quote(`${resource}${snakeToPascal(op.v2Op)}Notice`)},`); + lines.push(`\t\ttype: 'notice',`); + lines.push(`\t\tdefault: '',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); + lines.push(`\t},`); + } + + // Pagination: returnAll + limit + if (op.hasPagination) { + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Return All',`); + lines.push(`\t\tname: 'returnAll',`); + lines.push(`\t\ttype: 'boolean',`); + lines.push(`\t\tdefault: false,`); + lines.push(`\t\tdescription: 'Whether to return all results or only up to a given limit',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); + lines.push(`\t},`); + + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Limit',`); + lines.push(`\t\tname: 'limit',`); + lines.push(`\t\ttype: 'number',`); + lines.push(`\t\tdefault: 50,`); + lines.push(`\t\tdescription: 'Max number of results to return',`); + lines.push(`\t\ttypeOptions: { minValue: 1, maxValue: 50 },`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}], returnAll: [false] } },`); + lines.push(`\t},`); + + } + + // Simplify toggle for GET operations (v2 only) + if (op.endpoint.method === 'GET') { + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Simplify',`); + lines.push(`\t\tname: 'simplify',`); + lines.push(`\t\ttype: 'boolean',`); + lines.push(`\t\tdefault: true,`); + lines.push(`\t\tdescription: 'Whether to return a simplified version of the response instead of all fields',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); + lines.push(`\t},`); + } + + // Required body fields + promoted optional fields (for v1 compat) + const promotedSet = PROMOTED_TOP_LEVEL_FIELDS[resource]?.[op.v2Op] ?? PROMOTED_TOP_LEVEL_FIELDS[resource]?.[op.v1Op]; + let requiredFields = op.fields.filter(f => (f.required || promotedSet?.has(f.name)) && !f.readOnly); + const optionalFields = op.fields.filter(f => !f.required && !promotedSet?.has(f.name) && !f.readOnly); + + // Bot update: replace webhook json field with webhookUrl string field + if (resource === 'bot' && (op.v2Op === 'update' || op.v1Op === 'update')) { + requiredFields = requiredFields.filter(f => f.name !== 'webhook'); + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Webhook URL',`); + lines.push(`\t\tname: 'webhookUrl',`); + lines.push(`\t\ttype: 'string',`); + lines.push(`\t\trequired: true,`); + lines.push(`\t\tdefault: '',`); + lines.push(`\t\tplaceholder: 'https://example.com/webhook',`); + lines.push(`\t\tdescription: 'URL for the outgoing webhook',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); + lines.push(`\t},`); + } + + // Form create: skip `blocks` from required fields — handled by form builder below + if (resource === 'form') { + requiredFields = requiredFields.filter(f => f.name !== 'blocks'); + } + + for (const field of requiredFields) { + lines.push(generateFieldProperty(field, resource, op, allResourceValues, allOpValues, true)); + } + + // Optional fields in "Additional Fields" collection + // Skip `buttons` for message ops — handled by visual button constructor above + const filteredOptionalFields = resource === 'message' + ? optionalFields.filter(f => f.name !== 'buttons') + : optionalFields; + if (filteredOptionalFields.length > 0) { + const collectionName = getCollectionName(resource, op.v1Op, 'additionalFields'); + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Additional Fields',`); + lines.push(`\t\tname: ${quote(collectionName)},`); + lines.push(`\t\ttype: 'collection',`); + lines.push(`\t\tplaceholder: 'Add Field',`); + lines.push(`\t\tdefault: {},`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); + lines.push(`\t\toptions: [`); + const sortedOptionalFields = [...filteredOptionalFields].sort((a, b) => formatDisplayName(a.name).localeCompare(formatDisplayName(b.name))); + for (const field of sortedOptionalFields) { + lines.push(generateFieldProperty(field, resource, op, allResourceValues, allOpValues, false, true)); + } + lines.push(`\t\t],`); + lines.push(`\t},`); + } + + // Query parameters (non-pagination, skip template params with {}) + // Primary query params are required or named 'query' (shown top-level for all resources) + const PRIMARY_QUERY_PARAMS = new Set(['query']); + // Resources where optional query params should be wrapped in Additional Fields + const QUERY_FILTER_RESOURCES = new Set(['search', 'security']); + + const nonPaginationParams = op.queryParams.filter( + p => !['limit', 'cursor', 'per', 'page'].includes(p.name) && !p.name.includes('{') + ); + + // Split into primary (top-level) and filter (collection) params + const shouldWrapFilters = QUERY_FILTER_RESOURCES.has(resource); + const primaryParams = shouldWrapFilters + ? nonPaginationParams.filter(p => p.required || PRIMARY_QUERY_PARAMS.has(p.name)) + : nonPaginationParams; + const filterParams = shouldWrapFilters + ? nonPaginationParams.filter(p => !p.required && !PRIMARY_QUERY_PARAMS.has(p.name)) + : []; + + for (const param of primaryParams) { + const paramName = getParamName(resource, op.v1Op, param.name); + const searchable = SEARCHABLE_QUERY_PARAMS[param.name]; + const queryDesc = getFieldDescription(param.name, param.description, op.endpoint.id); + + if (searchable) { + // v2: resourceLocator with searchable dropdown + lines.push(`\t{`); + lines.push(`\t\tdisplayName: ${quote(formatDisplayName(param.name))},`); + lines.push(`\t\tname: ${quote(paramName)},`); + lines.push(`\t\ttype: 'resourceLocator',`); + lines.push(`\t\tdefault: { mode: 'list', value: '' },`); + if (queryDesc && queryDesc.toLowerCase() !== formatDisplayName(param.name).toLowerCase()) lines.push(`\t\tdescription: ${quote(sanitizeDescription(queryDesc))},`); + lines.push(`\t\tmodes: [`); + lines.push(`\t\t\t{`); + lines.push(`\t\t\t\tdisplayName: 'From List',`); + lines.push(`\t\t\t\tname: 'list',`); + lines.push(`\t\t\t\ttype: 'list',`); + lines.push(`\t\t\t\ttypeOptions: { searchListMethod: ${quote(searchable.method)}, searchable: true },`); + lines.push(`\t\t\t},`); + lines.push(`\t\t\t{`); + lines.push(`\t\t\t\tdisplayName: 'By ID',`); + lines.push(`\t\t\t\tname: 'id',`); + lines.push(`\t\t\t\ttype: 'string',`); + const qPathEx = getPlaceholder(param.example ?? param.schema?.example); + lines.push(`\t\t\t\tplaceholder: ${quote(qPathEx ? `e.g. ${qPathEx}` : 'e.g. 12345')},`); + lines.push(`\t\t\t},`); + const qUrlPattern = URL_PATTERNS[searchable.method]; + if (qUrlPattern) { + lines.push(`\t\t\t{`); + lines.push(`\t\t\t\tdisplayName: 'By URL',`); + lines.push(`\t\t\t\tname: 'url',`); + lines.push(`\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\tplaceholder: ${quote(qUrlPattern.placeholder)},`); + lines.push(`\t\t\t\textractValue: { type: 'regex', regex: ${quote(qUrlPattern.regex)} },`); + lines.push(`\t\t\t\tvalidation: [{ type: 'regex', properties: { regex: ${quote(qUrlPattern.regex)}, errorMessage: ${quote(qUrlPattern.error)} } }],`); + lines.push(`\t\t\t},`); + } + lines.push(`\t\t],`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); + lines.push(`\t\trouting: { send: { type: 'query', property: ${quote(param.name)} } },`); + lines.push(`\t},`); + + continue; + } + + lines.push(generateQueryParamField(param, paramName, queryDesc, op.endpoint.id, allResourceValues, allOpValues, '\t')); + } + + // Optional query params wrapped in Additional Fields (for search/security resources) + if (filterParams.length > 0) { + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Additional Fields',`); + lines.push(`\t\tname: 'additionalFields',`); + lines.push(`\t\ttype: 'collection',`); + lines.push(`\t\tplaceholder: 'Add Field',`); + lines.push(`\t\tdefault: {},`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); + lines.push(`\t\toptions: [`); + const sortedFilterParams = [...filterParams].sort((a, b) => formatDisplayName(a.name).localeCompare(formatDisplayName(b.name))); + for (const param of sortedFilterParams) { + const paramName = getParamName(resource, op.v1Op, param.name); + const queryDesc = getFieldDescription(param.name, param.description, op.endpoint.id); + lines.push(generateQueryParamField(param, paramName, queryDesc, op.endpoint.id, allResourceValues, allOpValues, '\t\t\t', true)); + } + lines.push(`\t\t],`); + lines.push(`\t},`); + } + + // Visual button constructor for message create/send/update + if (resource === 'message' && (op.v2Op === 'create' || op.v1Op === 'send' || op.v2Op === 'update')) { + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Button Layout',`); + lines.push(`\t\tname: 'buttonLayout',`); + lines.push(`\t\ttype: 'options',`); + lines.push(`\t\toptions: [`); + lines.push(`\t\t\t{ name: 'None', value: 'none' },`); + lines.push(`\t\t\t{ name: 'Single Row', value: 'single_row' },`); + lines.push(`\t\t\t{ name: 'Multiple Rows', value: 'multiple_rows' },`); + lines.push(`\t\t\t{ name: 'Raw JSON', value: 'raw_json' },`); + lines.push(`\t\t],`); + lines.push(`\t\tdefault: 'none',`); + lines.push(`\t\tdescription: 'How to layout buttons in the message',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); + lines.push(`\t},`); + // Visual button fixedCollection (shown for single_row / multiple_rows) + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Buttons',`); + lines.push(`\t\tname: 'buttons',`); + lines.push(`\t\ttype: 'fixedCollection',`); + lines.push(`\t\ttypeOptions: { multipleValues: true },`); + lines.push(`\t\toptions: [{`); + lines.push(`\t\t\tname: 'button',`); + lines.push(`\t\t\tdisplayName: 'Button',`); + lines.push(`\t\t\tvalues: [`); + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Text',`); + lines.push(`\t\t\t\t\tname: 'text',`); + lines.push(`\t\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\t\tdefault: '',`); + lines.push(`\t\t\t\t\tdescription: 'Button label (max 255 characters)',`); + lines.push(`\t\t\t\t\tplaceholder: 'Click me',`); + lines.push(`\t\t\t\t},`); + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Type',`); + lines.push(`\t\t\t\t\tname: 'type',`); + lines.push(`\t\t\t\t\ttype: 'options',`); + lines.push(`\t\t\t\t\toptions: [`); + lines.push(`\t\t\t\t\t\t{ name: 'Data (Webhook)', value: 'data' },`); + lines.push(`\t\t\t\t\t\t{ name: 'URL (Link)', value: 'url' },`); + lines.push(`\t\t\t\t\t],`); + lines.push(`\t\t\t\t\tdefault: 'data',`); + lines.push(`\t\t\t\t\tdescription: 'Data sends a webhook on click, URL opens a link',`); + lines.push(`\t\t\t\t},`); + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Data',`); + lines.push(`\t\t\t\t\tname: 'data',`); + lines.push(`\t\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\t\tdefault: '',`); + lines.push(`\t\t\t\t\tdescription: 'Data sent via webhook when button is clicked (max 255 characters)',`); + lines.push(`\t\t\t\t\tplaceholder: 'action_confirm',`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['data'] } },`); + lines.push(`\t\t\t\t},`); + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'URL',`); + lines.push(`\t\t\t\t\tname: 'url',`); + lines.push(`\t\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\t\tdefault: '',`); + lines.push(`\t\t\t\t\tdescription: 'URL to open when button is clicked',`); + lines.push(`\t\t\t\t\tplaceholder: 'https://example.com',`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['url'] } },`); + lines.push(`\t\t\t\t},`); + lines.push(`\t\t\t],`); + lines.push(`\t\t}],`); + lines.push(`\t\tdefault: {},`); + lines.push(`\t\tdescription: 'Buttons to add to the message. Max 100 buttons, up to 8 per row.',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}], buttonLayout: ['single_row', 'multiple_rows'] } },`); + lines.push(`\t},`); + // Raw JSON field (shown for raw_json mode) + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Buttons (JSON)',`); + lines.push(`\t\tname: 'rawJsonButtons',`); + lines.push(`\t\ttype: 'json',`); + lines.push(`\t\tdefault: '[]',`); + lines.push(`\t\tdescription: 'Buttons as JSON: array of rows, each row is an array of buttons. To remove all buttons, send [].',`); + lines.push(`\t\tplaceholder: '[[{"text":"OK","data":"confirm"}],[{"text":"Link","url":"https://example.com"}]]',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}], buttonLayout: ['raw_json'] } },`); + lines.push(`\t},`); + } + + // Form builder for form create/createView (Phase 13) + if (resource === 'form' && (op.v2Op === 'create' || op.v1Op === 'createView')) { + // Builder mode selector: Template (v1 only) / Visual Builder / JSON + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Builder Mode',`); + lines.push(`\t\tname: 'formBuilderMode',`); + lines.push(`\t\ttype: 'options',`); + lines.push(`\t\toptions: [`); + lines.push(`\t\t\t{ name: 'Template', value: 'template', displayOptions: { show: { '@version': [1] } } },`); + lines.push(`\t\t\t{ name: 'Visual Builder', value: 'builder' },`); + lines.push(`\t\t\t{ name: 'JSON', value: 'json' },`); + lines.push(`\t\t],`); + lines.push(`\t\tdefault: 'builder',`); + lines.push(`\t\tdescription: 'Build form visually, use a template, or paste JSON',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); + lines.push(`\t},`); + // Template selector (v1 only, shown in template mode) + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Template',`); + lines.push(`\t\tname: 'formTemplate',`); + lines.push(`\t\ttype: 'options',`); + lines.push(`\t\toptions: [`); + // Sorted alphabetically by name (n8n lint: node-param-options-type-unsorted-items) + // All option names must be title-cased (n8n lint: node-param-display-name-miscased) + lines.push(`\t\t\t{ name: 'Access Request (V1)', value: 'access_request', description: 'Access request form' },`); + lines.push(`\t\t\t{ name: 'Bug Report', value: 'bug_report', description: 'Bug report with severity and screenshots' },`); + lines.push(`\t\t\t{ name: 'Feedback', value: 'feedback', description: 'Collect user feedback with rating' },`); + lines.push(`\t\t\t{ name: 'Feedback Form (V1)', value: 'feedback_form', description: 'Feedback form' },`); + lines.push(`\t\t\t{ name: 'Survey', value: 'survey', description: 'Multi-question survey with radio and checkboxes' },`); + lines.push(`\t\t\t{ name: 'Survey Form (V1)', value: 'survey_form', description: 'Survey form' },`); + lines.push(`\t\t\t{ name: 'Task Request (V1)', value: 'task_request', description: 'Task creation form' },`); + lines.push(`\t\t\t{ name: 'Time Off Request', value: 'timeoff', description: 'Vacation request with dates and documents' },`); + lines.push(`\t\t\t{ name: 'Time-Off Request (V1)', value: 'timeoff_request', description: 'Time-off request form' },`); + lines.push(`\t\t],`); + lines.push(`\t\tdefault: 'feedback',`); + lines.push(`\t\tdescription: 'Select a predefined form template',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}], formBuilderMode: ['template'] } },`); + lines.push(`\t},`); + // Visual builder — fixedCollection with all block types (shown in builder mode) + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Form Blocks',`); + lines.push(`\t\tname: 'formBlocks',`); + lines.push(`\t\ttype: 'fixedCollection',`); + lines.push(`\t\ttypeOptions: { multipleValues: true, sortable: true },`); + lines.push(`\t\tdefault: {},`); + lines.push(`\t\tdescription: 'Add form blocks using the visual builder',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}], formBuilderMode: ['builder'] } },`); + lines.push(`\t\toptions: [{`); + lines.push(`\t\t\tname: 'block',`); + lines.push(`\t\t\tdisplayName: 'Block',`); + lines.push(`\t\t\tvalues: [`); + // Fields in alphabetical order by displayName (required by n8n eslint rule) + // Allowed File Types (file_input only) + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Allowed File Types',`); + lines.push(`\t\t\t\t\tname: 'filetypes',`); + lines.push(`\t\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\t\tdefault: '',`); + lines.push(`\t\t\t\t\tplaceholder: 'png,jpg,pdf',`); + lines.push(`\t\t\t\t\tdescription: 'Comma-separated list of allowed file extensions',`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['file_input'] } },`); + lines.push(`\t\t\t\t},`); + // Field Name (for input fields) + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Field Name',`); + lines.push(`\t\t\t\t\tname: 'name',`); + lines.push(`\t\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\t\tdefault: '',`); + lines.push(`\t\t\t\t\tdescription: 'Unique field identifier (used in form submission data)',`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['input', 'select', 'radio', 'checkbox', 'date', 'time', 'file_input'] } },`); + lines.push(`\t\t\t\t},`); + // Hint + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Hint',`); + lines.push(`\t\t\t\t\tname: 'hint',`); + lines.push(`\t\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\t\tdefault: '',`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['input', 'select', 'radio', 'checkbox', 'date', 'time', 'file_input'] } },`); + lines.push(`\t\t\t\t},`); + // Initial Date (date only) + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Initial Date',`); + lines.push(`\t\t\t\t\tname: 'initial_date',`); + lines.push(`\t\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\t\tdefault: '',`); + lines.push(`\t\t\t\t\tplaceholder: '2024-01-01',`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['date'] } },`); + lines.push(`\t\t\t\t},`); + // Initial Time (time only) + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Initial Time',`); + lines.push(`\t\t\t\t\tname: 'initial_time',`); + lines.push(`\t\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\t\tdefault: '',`); + lines.push(`\t\t\t\t\tplaceholder: '09:00',`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['time'] } },`); + lines.push(`\t\t\t\t},`); + // Initial Value (input only) + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Initial Value',`); + lines.push(`\t\t\t\t\tname: 'initial_value',`); + lines.push(`\t\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\t\tdefault: '',`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['input'] } },`); + lines.push(`\t\t\t\t},`); + // Label + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Label',`); + lines.push(`\t\t\t\t\tname: 'label',`); + lines.push(`\t\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\t\tdefault: '',`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['input', 'select', 'radio', 'checkbox', 'date', 'time', 'file_input'] } },`); + lines.push(`\t\t\t\t},`); + // Max Files (file_input only) + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Max Files',`); + lines.push(`\t\t\t\t\tname: 'max_files',`); + lines.push(`\t\t\t\t\ttype: 'number',`); + lines.push(`\t\t\t\t\tdefault: 10,`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['file_input'] } },`); + lines.push(`\t\t\t\t},`); + // Max Length (input only) + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Max Length',`); + lines.push(`\t\t\t\t\tname: 'max_length',`); + lines.push(`\t\t\t\t\ttype: 'number',`); + lines.push(`\t\t\t\t\tdefault: 0,`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['input'] } },`); + lines.push(`\t\t\t\t},`); + // Min Length (input only) + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Min Length',`); + lines.push(`\t\t\t\t\tname: 'min_length',`); + lines.push(`\t\t\t\t\ttype: 'number',`); + lines.push(`\t\t\t\t\tdefault: 0,`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['input'] } },`); + lines.push(`\t\t\t\t},`); + // Multiline (input only) + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Multiline',`); + lines.push(`\t\t\t\t\tname: 'multiline',`); + lines.push(`\t\t\t\t\ttype: 'boolean',`); + lines.push(`\t\t\t\t\tdefault: false,`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['input'] } },`); + lines.push(`\t\t\t\t},`); + // Options (for select, radio, checkbox) — nested fixedCollection + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Options',`); + lines.push(`\t\t\t\t\tname: 'options',`); + lines.push(`\t\t\t\t\ttype: 'fixedCollection',`); + lines.push(`\t\t\t\t\ttypeOptions: { multipleValues: true },`); + lines.push(`\t\t\t\t\tdefault: {},`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['select', 'radio', 'checkbox'] } },`); + lines.push(`\t\t\t\t\toptions: [{`); + lines.push(`\t\t\t\t\t\tname: 'option',`); + lines.push(`\t\t\t\t\t\tdisplayName: 'Option',`); + lines.push(`\t\t\t\t\t\tvalues: [`); + lines.push(`\t\t\t\t\t\t\t{ displayName: 'Checked by Default', name: 'checked', type: 'boolean', default: false },`); + lines.push(`\t\t\t\t\t\t\t{ displayName: 'Description', name: 'description', type: 'string', default: '' },`); + lines.push(`\t\t\t\t\t\t\t{ displayName: 'Selected by Default', name: 'selected', type: 'boolean', default: false },`); + lines.push(`\t\t\t\t\t\t\t{ displayName: 'Text', name: 'text', type: 'string', default: '' },`); + lines.push(`\t\t\t\t\t\t\t{ displayName: 'Value', name: 'value', type: 'string', default: '' },`); + lines.push(`\t\t\t\t\t\t],`); + lines.push(`\t\t\t\t\t}],`); + lines.push(`\t\t\t\t},`); + // Placeholder (input only) + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Placeholder',`); + lines.push(`\t\t\t\t\tname: 'placeholder',`); + lines.push(`\t\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\t\tdefault: '',`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['input'] } },`); + lines.push(`\t\t\t\t},`); + // Required + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Required',`); + lines.push(`\t\t\t\t\tname: 'required',`); + lines.push(`\t\t\t\t\ttype: 'boolean',`); + lines.push(`\t\t\t\t\tdefault: false,`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['input', 'select', 'radio', 'checkbox', 'date', 'time', 'file_input'] } },`); + lines.push(`\t\t\t\t},`); + // Text (for header, plain_text, markdown) + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Text',`); + lines.push(`\t\t\t\t\tname: 'text',`); + lines.push(`\t\t\t\t\ttype: 'string',`); + lines.push(`\t\t\t\t\tdefault: '',`); + lines.push(`\t\t\t\t\tdisplayOptions: { show: { type: ['header', 'plain_text', 'markdown'] } },`); + lines.push(`\t\t\t\t},`); + // Block type selector + lines.push(`\t\t\t\t{`); + lines.push(`\t\t\t\t\tdisplayName: 'Type',`); + lines.push(`\t\t\t\t\tname: 'type',`); + lines.push(`\t\t\t\t\ttype: 'options',`); + lines.push(`\t\t\t\t\toptions: [`); + lines.push(`\t\t\t\t\t\t{ name: '☑️ Checkboxes', value: 'checkbox' },`); + lines.push(`\t\t\t\t\t\t{ name: '➖ Divider', value: 'divider' },`); + lines.push(`\t\t\t\t\t\t{ name: '📄 Plain Text', value: 'plain_text' },`); + lines.push(`\t\t\t\t\t\t{ name: '📅 Date Picker', value: 'date' },`); + lines.push(`\t\t\t\t\t\t{ name: '📋 Select Dropdown', value: 'select' },`); + lines.push(`\t\t\t\t\t\t{ name: '📎 File Upload', value: 'file_input' },`); + lines.push(`\t\t\t\t\t\t{ name: '📝 Header', value: 'header' },`); + lines.push(`\t\t\t\t\t\t{ name: '📝 Markdown', value: 'markdown' },`); + lines.push(`\t\t\t\t\t\t{ name: '📝 Text Input', value: 'input' },`); + lines.push(`\t\t\t\t\t\t{ name: '🔘 Radio Buttons', value: 'radio' },`); + lines.push(`\t\t\t\t\t\t{ name: '🕐 Time Picker', value: 'time' },`); + lines.push(`\t\t\t\t\t],`); + lines.push(`\t\t\t\t\tdefault: 'input',`); + lines.push(`\t\t\t\t},`); + lines.push(`\t\t\t],`); + lines.push(`\t\t}],`); + lines.push(`\t},`); + // Raw JSON blocks (shown in json mode) + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Blocks (JSON)',`); + lines.push(`\t\tname: 'formBlocks',`); + lines.push(`\t\ttype: 'json',`); + lines.push(`\t\trequired: true,`); + lines.push(`\t\tdefault: '[]',`); + lines.push(`\t\tdescription: 'Paste an array of blocks or the full form JSON from the visual form builder',`); + lines.push(`\t\thint: 'Build your form visually at dev.pachca.com/guides/forms/overview, then paste the JSON here',`); + lines.push(`\t\tplaceholder: '{"title":"My form","blocks":[{"type":"input","name":"field_1","label":"Your name"}]}',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}], formBuilderMode: ['json'] } },`); + lines.push(`\t},`); + + // v1-only processSubmission parameters + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'This operation is deprecated. In v2, use the Pachca Trigger node to receive form submissions via webhook, then process the data with standard n8n nodes.',`); + lines.push(`\t\tname: 'processSubmissionNotice',`); + lines.push(`\t\ttype: 'notice',`); + lines.push(`\t\tdefault: '',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: ['processSubmission'] } },`); + lines.push(`\t},`); + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Form Type',`); + lines.push(`\t\tname: 'formType',`); + lines.push(`\t\ttype: 'options',`); + lines.push(`\t\toptions: [`); + lines.push(`\t\t\t{ name: 'Auto-Detect', value: 'auto' },`); + lines.push(`\t\t\t{ name: 'Feedback Form', value: 'feedback_form' },`); + lines.push(`\t\t\t{ name: 'Task Request', value: 'task_request' },`); + lines.push(`\t\t\t{ name: 'Timeoff Request', value: 'timeoff_request' },`); + lines.push(`\t\t],`); + lines.push(`\t\tdefault: 'auto',`); + lines.push(`\t\tdescription: 'Form type for processing data',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: ['processSubmission'] } },`); + lines.push(`\t},`); + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Validation Errors',`); + lines.push(`\t\tname: 'validationErrors',`); + lines.push(`\t\ttype: 'json',`); + lines.push(`\t\tdefault: '{}',`); + lines.push(`\t\tdescription: 'Validation errors to send to user (JSON object with field names and messages)',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: ['processSubmission'] } },`); + lines.push(`\t},`); + + // v1-only getTemplates notice + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'This operation is deprecated. In v2, form templates are available directly in the Visual Builder mode when creating a form.',`); + lines.push(`\t\tname: 'getTemplatesNotice',`); + lines.push(`\t\ttype: 'notice',`); + lines.push(`\t\tdefault: '',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: ['getTemplates'] } },`); + lines.push(`\t},`); + } + + } + + lines.push(`];`); + + return lines.join('\n'); +} + +// ============================================================================ +// FIELD GENERATION +// ============================================================================ + +function generateFieldProperty( + field: BodyField, + resource: string, + op: OperationInfo, + allResourceValues: string[], + allOpValues: string[], + isRequired: boolean, + isInsideCollection = false, +): string { + const paramName = getParamName(resource, op.v1Op, field.name); + const n8nType = toN8nType(field); + const displayName = formatDisplayName(field.name); + + const lines: string[] = []; + const tab = isInsideCollection ? '\t\t\t' : '\t'; + + // Check if this body field should be a resourceLocator (searchable dropdown) + const bodySearchMethod = !isInsideCollection ? BODY_FIELD_SEARCH[resource]?.[field.name] : undefined; + if (bodySearchMethod) { + lines.push(`${tab}{`); + lines.push(`${tab}\tdisplayName: ${quote(displayName)},`); + lines.push(`${tab}\tname: ${quote(paramName)},`); + lines.push(`${tab}\ttype: 'resourceLocator',`); + lines.push(`${tab}\tdefault: { mode: 'list', value: '' },`); + if (isRequired) lines.push(`${tab}\trequired: true,`); + const rawDesc = getFieldDescription(field.name, field.description, op.endpoint.id); + if (rawDesc && rawDesc.toLowerCase() !== displayName.toLowerCase()) lines.push(`${tab}\tdescription: ${quote(sanitizeDescription(rawDesc))},`); + const fieldHint = FIELD_HINTS[resource]?.[field.name]; + if (fieldHint) lines.push(`${tab}\thint: ${quote(fieldHint)},`); + lines.push(`${tab}\tmodes: [`); + lines.push(`${tab}\t\t{`); + lines.push(`${tab}\t\t\tdisplayName: 'From List',`); + lines.push(`${tab}\t\t\tname: 'list',`); + lines.push(`${tab}\t\t\ttype: 'list',`); + lines.push(`${tab}\t\t\ttypeOptions: { searchListMethod: ${quote(bodySearchMethod)}, searchable: true },`); + lines.push(`${tab}\t\t},`); + lines.push(`${tab}\t\t{`); + lines.push(`${tab}\t\t\tdisplayName: 'By ID',`); + lines.push(`${tab}\t\t\tname: 'id',`); + lines.push(`${tab}\t\t\ttype: 'string',`); + const bodyEx = getPlaceholder(field.schema?.example); + lines.push(`${tab}\t\t\tplaceholder: ${quote(bodyEx ? `e.g. ${bodyEx}` : 'e.g. 12345')},`); + lines.push(`${tab}\t\t},`); + const bUrlPattern = URL_PATTERNS[bodySearchMethod]; + if (bUrlPattern) { + lines.push(`${tab}\t\t{`); + lines.push(`${tab}\t\t\tdisplayName: 'By URL',`); + lines.push(`${tab}\t\t\tname: 'url',`); + lines.push(`${tab}\t\t\ttype: 'string',`); + lines.push(`${tab}\t\t\tplaceholder: ${quote(bUrlPattern.placeholder)},`); + lines.push(`${tab}\t\t\textractValue: { type: 'regex', regex: ${quote(bUrlPattern.regex)} },`); + lines.push(`${tab}\t\t\tvalidation: [{ type: 'regex', properties: { regex: ${quote(bUrlPattern.regex)}, errorMessage: ${quote(bUrlPattern.error)} } }],`); + lines.push(`${tab}\t\t},`); + } + lines.push(`${tab}\t],`); + lines.push(`${tab}\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); + lines.push(`${tab}\trouting: { send: { type: 'body', property: ${quote(field.name)} } },`); + lines.push(`${tab}},`); + return lines.join('\n'); + } + + lines.push(`${tab}{`); + lines.push(`${tab}\tdisplayName: ${quote(displayName)},`); + lines.push(`${tab}\tname: ${quote(paramName)},`); + lines.push(`${tab}\ttype: ${quote(n8nType)},`); + + if (isRequired) { + lines.push(`${tab}\trequired: true,`); + } + + // Type-specific options + if (n8nType === 'options' && field.enum) { + const enumDescs = getEnumDescriptions(field.name, op.endpoint.id); + lines.push(`${tab}\toptions: [${generateEnumOptions(field.enum, enumDescs)}],`); + } + + if (n8nType === 'fixedCollection' && field.items?.properties) { + const subName = V1_COMPAT_SUBCOLLECTIONS[paramName] ?? `${paramName}Values`; + lines.push(`${tab}\ttypeOptions: { multipleValues: true },`); + lines.push(`${tab}\toptions: [{`); + lines.push(`${tab}\t\tname: ${quote(subName)},`); + lines.push(`${tab}\t\tdisplayName: ${quote(formatDisplayName(singularize(field.name)))},`); + lines.push(`${tab}\t\tvalues: [`); + const subSchema = resolveAllOf(field.items); + if (subSchema.properties) { + const sortedSubEntries = Object.entries(subSchema.properties).sort((a, b) => formatDisplayName(a[0]).localeCompare(formatDisplayName(b[0]))); + for (const [subName2, rawSubProp] of sortedSubEntries) { + const subProp = rawSubProp.allOf ? resolveAllOf(rawSubProp) : rawSubProp; + const subSchemaType = getSchemaType(subProp); + + // Check if this sub-field should use loadOptions + const loadOpt = LOAD_OPTIONS_SUBFIELDS[field.name]?.[subName2]; + if (loadOpt) { + lines.push(`${tab}\t\t\t{`); + lines.push(`${tab}\t\t\t\tdisplayName: ${quote(loadOpt.displayName)},`); + lines.push(`${tab}\t\t\t\tname: ${quote(subName2)},`); + lines.push(`${tab}\t\t\t\ttype: 'options',`); + lines.push(`${tab}\t\t\t\ttypeOptions: { loadOptionsMethod: ${quote(loadOpt.method)} },`); + lines.push(`${tab}\t\t\t\tdefault: '',`); + lines.push(`${tab}\t\t\t\tdescription: ${quote(loadOpt.description)},`); + lines.push(`${tab}\t\t\t},`); + continue; + } + + const subType = subProp.enum ? 'options' : (subSchemaType === 'boolean' ? 'boolean' : ((subSchemaType === 'integer' || subSchemaType === 'number') ? 'number' : 'string')); + lines.push(`${tab}\t\t\t{`); + lines.push(`${tab}\t\t\t\tdisplayName: ${quote(formatDisplayName(subName2))},`); + lines.push(`${tab}\t\t\t\tname: ${quote(subName2)},`); + lines.push(`${tab}\t\t\t\ttype: ${quote(subType)},`); + if (subType === 'options' && subProp.enum) { + const subEnumDescs = subProp['x-enum-descriptions'] as Record | undefined; + lines.push(`${tab}\t\t\t\toptions: [${generateEnumOptions(subProp.enum, subEnumDescs)}],`); + } + const subDefaultFallback = subType === 'number' ? 0 : (subType === 'boolean' ? false : ''); + const subDefault = (typeof subProp.default === 'string' && /[а-яА-ЯёЁ]/.test(subProp.default)) ? subDefaultFallback : (subProp.default ?? subDefaultFallback); + lines.push(`${tab}\t\t\t\tdefault: ${JSON.stringify(subDefault)},`); + if (subProp.description) { + const subDisplayName = formatDisplayName(subName2); + const subDesc = getFieldDescription(subName2, subProp.description, op.endpoint.id, field.name); + if (subDesc && subDesc.toLowerCase() !== subDisplayName.toLowerCase()) { + lines.push(`${tab}\t\t\t\tdescription: ${quote(sanitizeDescription(subDesc))},`); + } + } + lines.push(`${tab}\t\t\t},`); + } + } + lines.push(`${tab}\t\t],`); + lines.push(`${tab}\t}],`); + } + + if (field.type === 'string' && field.name === 'content') { + lines.push(`${tab}\ttypeOptions: { rows: 4 },`); + } + + // Default value + const defaultVal = getDefaultValue(field, resource, op.v1Op, paramName); + lines.push(`${tab}\tdefault: ${JSON.stringify(defaultVal)},`); + + // Description — EN spec first, then RU fallback + // Skip if identical to displayName (n8n lint: node-param-description-identical-to-display-name) + const rawDesc = getFieldDescription(field.name, field.description, op.endpoint.id); + if (rawDesc && rawDesc.toLowerCase() !== displayName.toLowerCase()) { + const desc = sanitizeDescription(n8nType === 'boolean' ? booleanDescription(rawDesc) : rawDesc); + lines.push(`${tab}\tdescription: ${quote(desc)},`); + } + + // Hint — contextual tips for no-code users + const fieldHint = FIELD_HINTS[resource]?.[field.name]; + if (fieldHint) { + lines.push(`${tab}\thint: ${quote(fieldHint)},`); + } + + // displayOptions (only for top-level fields, not inside collections) + if (!isInsideCollection) { + lines.push(`${tab}\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); + } + + // Placeholder from OpenAPI example + if (n8nType !== 'fixedCollection' && n8nType !== 'options' && n8nType !== 'boolean') { + const example = field.schema?.example; + const placeholder = getPlaceholder(example); + if (placeholder && !isPrimitiveArray(field)) { + lines.push(`${tab}\tplaceholder: ${quote(placeholder)},`); + } + } + + // routing.send + if (n8nType === 'fixedCollection') { + // fixedCollection fields need routing on the collection itself + lines.push(`${tab}\trouting: { send: { type: 'body', property: ${quote(field.name)} } },`); + } else if (isPrimitiveArray(field)) { + // Primitive arrays: routing handled by splitCommaToArray preSend, not inline routing + const example = field.schema?.example; + const placeholder = getPlaceholder(example) ?? FIELD_PLACEHOLDERS[field.name]; + if (placeholder) { + lines.push(`${tab}\tplaceholder: ${quote(placeholder)},`); + } else { + const arrayItemType = getArrayItemType(field); + lines.push(`${tab}\tplaceholder: ${quote(arrayItemType === 'int' ? '1,2,3' : 'tag1,tag2')},`); + } + // No routing here — splitCommaToArray preSend handles it + } else { + lines.push(`${tab}\trouting: { send: { type: 'body', property: ${quote(field.name)} } },`); + } + + lines.push(`${tab}},`); + return lines.join('\n'); +} + +/** Generate a single query parameter field (reused for top-level and inside collection) */ +function generateQueryParamField( + param: Parameter, + paramName: string, + queryDesc: string | undefined, + endpointId: string, + allResourceValues: string[], + allOpValues: string[], + tab: string, + isInsideCollection = false, +): string { + const lines: string[] = []; + const resolvedSchema = resolveQuerySchema(param.schema); + const n8nType = queryParamN8nType(param.schema); + lines.push(`${tab}{`); + lines.push(`${tab}\tdisplayName: ${quote(formatDisplayName(param.name))},`); + lines.push(`${tab}\tname: ${quote(paramName)},`); + lines.push(`${tab}\ttype: ${quote(n8nType)},`); + if (n8nType === 'options' && resolvedSchema.enum) { + const qEnumDescs = getEnumDescriptions(param.name, endpointId); + lines.push(`${tab}\toptions: [${generateEnumOptions(resolvedSchema.enum, qEnumDescs)}],`); + } + const qDefault = (typeof resolvedSchema.default === 'string' && /[а-яА-ЯёЁ]/.test(resolvedSchema.default)) ? '' : (resolvedSchema.default ?? (n8nType === 'boolean' ? false : (n8nType === 'number' ? 0 : ''))); + lines.push(`${tab}\tdefault: ${JSON.stringify(qDefault)},`); + if (queryDesc && queryDesc.toLowerCase() !== formatDisplayName(param.name).toLowerCase()) { + const desc = sanitizeDescription(n8nType === 'boolean' ? booleanDescription(queryDesc) : queryDesc); + lines.push(`${tab}\tdescription: ${quote(desc)},`); + } + const qPlaceholder = getPlaceholder(param.example ?? param.schema.example); + if (qPlaceholder && n8nType !== 'options' && n8nType !== 'boolean') { + lines.push(`${tab}\tplaceholder: ${quote(qPlaceholder)},`); + } + if (!isInsideCollection) { + lines.push(`${tab}\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); + } + lines.push(`${tab}\trouting: { send: { type: 'query', property: ${quote(param.name)} } },`); + lines.push(`${tab}},`); + return lines.join('\n'); +} + +/** Safe defaults for enum fields where alphabetical first value is dangerous. + * Multiple values: first match in the enum wins. E.g., 'role' tries 'member' then 'user'. */ +const SAFE_ENUM_DEFAULTS: Record = { + role: ['member', 'user'], +}; + +function getDefaultValue(field: BodyField, resource: string, op: string, paramName: string): unknown { + // Use OpenAPI default if set and not Russian text + if (field.default !== undefined && !(typeof field.default === 'string' && /[а-яА-ЯёЁ]/.test(field.default))) return field.default; + if (field.enum && field.enum.length > 0) { + // Use safe default if the field has one (e.g., role → 'member'/'user' instead of 'admin') + const safeCandidates = SAFE_ENUM_DEFAULTS[field.name]; + if (safeCandidates) { + const safe = safeCandidates.find(c => field.enum!.includes(c)); + if (safe) return safe; + } + return field.enum[0]; + } + + // Safe type-based defaults (examples go into placeholder, not default) + // Use n8n type to determine default — OpenAPI type may differ from n8n type + // (e.g., object without properties → string in n8n → default should be '' not {}) + const n8nFieldType = toN8nType(field); + if (field.type === 'boolean') return false; + if (field.type === 'integer' || field.type === 'number') return 0; + if (field.type === 'array' && !field.items?.properties) return ''; + if (field.type === 'array') return []; + if (field.type === 'object' && n8nFieldType === 'string') return ''; + if (field.type === 'object') return {}; + return ''; +} + +/** Extract placeholder string from OpenAPI example (body field or query param) */ +function getPlaceholder(example: unknown): string | undefined { + if (example === undefined || example === null) return undefined; + if (typeof example === 'string') { + if (/[а-яА-ЯёЁ]/.test(example)) return undefined; // skip Russian + return example; + } + if (typeof example === 'number' || typeof example === 'boolean') return String(example); + if (Array.isArray(example)) { + // [1, 2, 3] → "1,2,3", [{...}] → JSON + if (example.length === 0) return undefined; + if (typeof example[0] === 'object') return JSON.stringify(example); + return example.join(','); + } + if (typeof example === 'object') return JSON.stringify(example); + return undefined; +} + +function getCollectionName(resource: string, op: string, defaultName: string): string { + const v1Resource = V1_COMPAT_RESOURCES[resource] ?? resource; + return V1_COMPAT_COLLECTIONS[v1Resource]?.[op]?.[defaultName] ?? defaultName; +} + +function singularize(name: string): string { + if (name.endsWith('ies')) return name.slice(0, -3) + 'y'; + if (name.endsWith('s')) return name.slice(0, -1); + return name; +} + +function formatDisplayName(name: string): string { + return name + .replace(/_/g, ' ') + .replace(/\b\w/g, c => c.toUpperCase()) + .replace(/\bIds?\b/g, m => m === 'Id' ? 'ID' : 'IDs') + .replace(/\bUrl\b/g, 'URL'); +} + +/** Sanitize description for n8n lint compliance: + * - Single-sentence: strip trailing period (node-param-description-excess-final-period) + * - Multi-sentence: ensure trailing period (node-param-description-missing-final-period) + * - Uppercase "json" to "JSON" (node-param-description-miscased-json) + * + * The n8n lint rules count sentences by splitting on ". " (after removing "e.g."). + */ +function sanitizeDescription(desc: string): string { + let result = desc; + // Uppercase all occurrences of "json" (any case) to "JSON" — n8n lint requires uppercase + result = result.replace(/\bjson\b/gi, 'JSON'); + // Strip leading quoted/backticked word so description starts with a letter (n8n lint) + result = result.replace(/^`([^`]+)`\s*/, (_m, w: string) => w + ' '); + result = result.replace(/^"([^"]+)"\s*/, (_m, w: string) => w + ' '); + // Ensure first character is uppercase + result = result.replace(/^([a-z])/, (_m, c: string) => c.toUpperCase()); + // Count sentences: split on ". " after removing "e.g." + const egLess = result.replace(/e\.g\./g, ''); + const sentenceCount = egLess.split('. ').length; + if (sentenceCount === 1) { + // Single sentence — must NOT end with period + result = result.replace(/\.\s*$/, ''); + } else if (sentenceCount >= 2) { + // Multi-sentence — MUST end with period + if (!result.endsWith('.')) result += '.'; + } + return result; +} + +// ============================================================================ +// GENERATE MAIN NODE FILE +// ============================================================================ + +function generateV2Node(resources: string[]): string { + const imports = resources.map(r => { + const camel = snakeToCamel(r); + return `import { ${camel}Operations, ${camel}Fields } from './${snakeToPascal(r)}Description';`; + }); + + const sortedResources = [...resources].sort((a, b) => resourceDisplayName(a).localeCompare(resourceDisplayName(b))); + const resourceOptions = sortedResources.map(r => { + const display = resourceDisplayName(r); + return `\t\t\t\t\t{ name: ${quote(display)}, value: ${quote(r)} },`; + }); + + const properties = resources.map(r => `\t\t\t\t...${snakeToCamel(r)}Operations,\n\t\t\t\t...${snakeToCamel(r)}Fields,`); + + return `import type { +\tINodeType, +\tINodeTypeBaseDescription, +\tINodeTypeDescription, +\tIExecuteFunctions, +\tINodeExecutionData, +\tILoadOptionsFunctions, +\tINodeListSearchResult, +\tINodePropertyOptions, +} from 'n8n-workflow'; +import { NodeConnectionTypes } from 'n8n-workflow'; +import { router } from '../SharedRouter'; +function formatUserName(u: { first_name: string; last_name: string; nickname: string }): string { + const fullName = [u.first_name, u.last_name] + .filter((v) => v != null && v !== '' && v !== 'null') + .join(' '); + const display = fullName || u.nickname || 'User'; + return u.nickname ? \`\${display} (@\${u.nickname})\` : display; +} + +${imports.join('\n')} + +export class PachcaV2 implements INodeType { +\tdescription: INodeTypeDescription; + +\tconstructor(baseDescription: INodeTypeBaseDescription) { +\t\tthis.description = { +\t\t\t...baseDescription, +\t\t\tversion: 2, +\t\t\tdefaults: { name: 'Pachca' }, +\t\t\tusableAsTool: true, +\t\t\tinputs: [NodeConnectionTypes.Main], +\t\t\toutputs: [NodeConnectionTypes.Main], +\t\t\tcredentials: [{ name: 'pachcaApi', required: true }], +\t\t\tproperties: [ +\t\t\t\t{ +\t\t\t\t\tdisplayName: 'Resource', +\t\t\t\t\tname: 'resource', +\t\t\t\t\ttype: 'options', +\t\t\t\t\tnoDataExpression: true, +\t\t\t\t\toptions: [ +${resourceOptions.join('\n')} +\t\t\t\t\t], +\t\t\t\t\tdefault: 'message', +\t\t\t\t}, +${properties.join('\n')} +\t\t\t], +\t\t}; +\t} + +\tasync execute(this: IExecuteFunctions): Promise { +\t\treturn router.call(this); +\t} + +\tmethods = { +\t\tlistSearch: { +\t\t\tasync searchChats(this: ILoadOptionsFunctions, filter?: string): Promise { +\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); +\t\t\t\tconst url = filter +\t\t\t\t\t? \`\${credentials.baseUrl}/search/chats?query=\${encodeURIComponent(filter)}\` +\t\t\t\t\t: \`\${credentials.baseUrl}/chats?per=50\`; +\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { +\t\t\t\t\tmethod: 'GET', +\t\t\t\t\turl, +\t\t\t\t}); +\t\t\t\tconst items = response.data ?? []; +\t\t\t\treturn { +\t\t\t\t\tresults: items.map((c: { id: number; name: string }) => ({ +\t\t\t\t\t\tname: c.name, +\t\t\t\t\t\tvalue: c.id, +\t\t\t\t\t})), +\t\t\t\t}; +\t\t\t}, +\t\t\tasync searchUsers(this: ILoadOptionsFunctions, filter?: string): Promise { +\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); +\t\t\t\tif (!filter) return { results: [] }; +\t\t\t\tconst url = \`\${credentials.baseUrl}/search/users?query=\${encodeURIComponent(filter)}\`; +\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { +\t\t\t\t\tmethod: 'GET', +\t\t\t\t\turl, +\t\t\t\t}); +\t\t\t\tconst items = response.data ?? []; +\t\t\t\treturn { +\t\t\t\t\tresults: items.map((u: { id: number; first_name: string; last_name: string; nickname: string }) => ({ +\t\t\t\t\t\tname: formatUserName(u), +\t\t\t\t\t\tvalue: u.id, +\t\t\t\t\t})), +\t\t\t\t}; +\t\t\t}, +\t\t\tasync searchEntities(this: ILoadOptionsFunctions, filter?: string): Promise { +\t\t\t\tlet entityType = 'discussion'; +\t\t\t\ttry { +\t\t\t\t entityType = (this.getNodeParameter('entityType') as string) || 'discussion'; +\t\t\t\t} catch { +\t\t\t\t try { +\t\t\t\t entityType = (this.getCurrentNodeParameter('entityType') as string) || 'discussion'; +\t\t\t\t } catch { /* parameter may not exist yet */ } +\t\t\t\t} +\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); +\t\t\t\tif (entityType === 'user') { +\t\t\t\t\tif (!filter) return { results: [] }; +\t\t\t\t\tconst url = \`\${credentials.baseUrl}/search/users?query=\${encodeURIComponent(filter)}\`; +\t\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { method: 'GET', url }); +\t\t\t\t\tconst items = response.data ?? []; +\t\t\t\t\treturn { +\t\t\t\t\t\tresults: items.map((u: { id: number; first_name: string; last_name: string; nickname: string }) => ({ +\t\t\t\t\t\t\tname: formatUserName(u), +\t\t\t\t\t\t\tvalue: u.id, +\t\t\t\t\t\t})), +\t\t\t\t\t}; +\t\t\t\t} +\t\t\t\tif (entityType === 'thread') { +\t\t\t\t\treturn { results: [] }; +\t\t\t\t} +\t\t\t\tconst url = filter +\t\t\t\t\t? \`\${credentials.baseUrl}/search/chats?query=\${encodeURIComponent(filter)}\` +\t\t\t\t\t: \`\${credentials.baseUrl}/chats?per=50\`; +\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { method: 'GET', url }); +\t\t\t\tconst items = response.data ?? []; +\t\t\t\treturn { +\t\t\t\t\tresults: items.map((c: { id: number; name: string }) => ({ +\t\t\t\t\t\tname: c.name, +\t\t\t\t\t\tvalue: c.id, +\t\t\t\t\t})), +\t\t\t\t}; +\t\t\t}, +\t\t}, +\t\tloadOptions: { +\t\t\tasync getCustomProperties(this: ILoadOptionsFunctions): Promise { +\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); +\t\t\t\tconst resource = this.getNodeParameter('resource') as string; +\t\t\t\tconst entityType = resource === 'task' ? 'Task' : 'User'; +\t\t\t\ttry { +\t\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { +\t\t\t\t\t\tmethod: 'GET', +\t\t\t\t\t\turl: \`\${credentials.baseUrl}/custom_properties?entity_type=\${entityType}\`, +\t\t\t\t\t}); +\t\t\t\t\tconst items = response.data ?? []; +\t\t\t\t\treturn items.map((p: { id: number; name: string }) => ({ +\t\t\t\t\t\tname: p.name, +\t\t\t\t\t\tvalue: p.id, +\t\t\t\t\t})); +\t\t\t\t} catch { +\t\t\t\t\treturn []; +\t\t\t\t} +\t\t\t}, +\t\t}, +\t}; +} +`; +} + +function generateVersionedWrapper(): string { + return `import { VersionedNodeType } from 'n8n-workflow'; +import type { INodeTypeBaseDescription } from 'n8n-workflow'; +import { PachcaV1 } from './V1/PachcaV1.node'; +import { PachcaV2 } from './V2/PachcaV2.node'; + +export class Pachca extends VersionedNodeType { +\tconstructor() { +\t\tconst baseDescription: INodeTypeBaseDescription = { +\t\t\tdisplayName: 'Pachca', +\t\t\tname: 'pachca', +\t\t\ticon: { light: 'file:pachca.svg', dark: 'file:pachca.dark.svg' }, +\t\t\tgroup: ['transform'], +\t\t\tsubtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', +\t\t\tdescription: 'Interact with Pachca API', +\t\t\tdefaultVersion: 2, +\t\t}; + +\t\tconst nodeVersions = { +\t\t\t1: new PachcaV1(baseDescription), +\t\t\t2: new PachcaV2(baseDescription), +\t\t}; + +\t\tsuper(nodeVersions, baseDescription); +\t} +} +`; +} + +// ============================================================================ +// GENERATE CREDENTIALS +// ============================================================================ + +function generateCredentials(): string { + return `import type { +\tIAuthenticateGeneric, +\tICredentialTestRequest, +\tICredentialType, +\tINodeProperties, +} from 'n8n-workflow'; + +export class PachcaApi implements ICredentialType { +\tname = 'pachcaApi'; +\tdisplayName = 'Pachca API'; +\ticon = { light: 'file:pachca.svg', dark: 'file:pachca.dark.svg' } as const; +\tdocumentationUrl = 'https://dev.pachca.com/api/authorization'; + +\tproperties: INodeProperties[] = [ +\t\t{ +\t\t\tdisplayName: 'Base URL', +\t\t\tname: 'baseUrl', +\t\t\ttype: 'string', +\t\t\tdefault: 'https://api.pachca.com/api/shared/v1', +\t\t\tdescription: 'Base URL of the Pachca API. Change only for on-premise installations or API proxies.', +\t\t}, +\t\t{ +\t\t\tdisplayName: 'Access Token', +\t\t\tname: 'accessToken', +\t\t\ttype: 'string', +\t\t\ttypeOptions: { password: true }, +\t\t\tdefault: '', +\t\t}, +\t\t{ +\t\t\tdisplayName: 'Bot ID', +\t\t\tname: 'botId', +\t\t\ttype: 'number', +\t\t\tdefault: 0, +\t\t\tdescription: 'Bot ID for automatic webhook registration (found in bot settings). Leave empty to auto-detect from token. Only needed for Pachca Trigger node.', +\t\t\thint: 'Only required when using a bot token with the Pachca Trigger node', +\t\t}, +\t\t{ +\t\t\tdisplayName: 'Webhook Signing Secret', +\t\t\tname: 'signingSecret', +\t\t\ttype: 'string', +\t\t\ttypeOptions: { password: true }, +\t\t\tdefault: '', +\t\t\tdescription: 'Used to verify incoming webhook requests from Pachca. Found in bot settings under the Webhook section.', +\t\t\thint: 'Only required when using the Pachca Trigger node', +\t\t}, +\t]; + +\tauthenticate: IAuthenticateGeneric = { +\t\ttype: 'generic', +\t\tproperties: { +\t\t\theaders: { +\t\t\t\tAuthorization: '=Bearer {{$credentials.accessToken}}', +\t\t\t}, +\t\t}, +\t}; + +\ttest: ICredentialTestRequest = { +\t\trequest: { +\t\t\tbaseURL: '={{$credentials.baseUrl}}', +\t\t\turl: '/oauth/token/info', +\t\t\tmethod: 'GET', +\t\t}, +\t}; +} +`; +} + +// ============================================================================ +// WORKFLOW DESCRIPTIONS (English, from packages/spec/workflows.ts) +// ============================================================================ + +interface WorkflowStep { + descriptionEn?: string; + apiMethod?: string; + apiPath?: string; + notesEn?: string; +} + +interface Workflow { + titleEn?: string; + steps: WorkflowStep[]; +} + +interface SkillConfig { + name: string; + tags: string[]; +} + +let WORKFLOWS: Record = {}; +let SKILL_TAG_MAP: SkillConfig[] = []; + +async function loadWorkflowsAndSkills(): Promise { + try { + const workflowsPath = path.join(ROOT, 'packages', 'spec', 'workflows.ts'); + if (fs.existsSync(workflowsPath)) { + const mod = await import(workflowsPath); + WORKFLOWS = mod.WORKFLOWS ?? {}; + } + } catch { /* workflows optional */ } + + try { + const configPath = path.join(ROOT, 'apps', 'docs', 'scripts', 'skills', 'config.ts'); + if (fs.existsSync(configPath)) { + const mod = await import(configPath); + SKILL_TAG_MAP = mod.SKILL_TAG_MAP ?? []; + } + } catch { /* skill config optional */ } +} + +/** + * Get English description from workflows.ts for a given tag + API path. + * Falls back to undefined if no matching workflow found. + */ +function getWorkflowDescription(tag: string, operationPath: string): string | undefined { + const skill = SKILL_TAG_MAP.find(s => s.tags.includes(tag)); + if (!skill) return undefined; + + const workflows = WORKFLOWS[skill.name] ?? []; + for (const wf of workflows) { + for (const step of wf.steps) { + if (step.apiPath === operationPath && step.descriptionEn) { + return step.descriptionEn; + } + } + } + return undefined; +} + +/** + * Get a documentation URL for an endpoint (links to dev.pachca.com). + */ +function getDocUrl(endpoint: Endpoint): string { + try { + return `https://dev.pachca.com${generateUrlFromOperation(endpoint)}`; + } catch { + return ''; + } +} + +/** + * Get a schema-aware default value using example-generator. + */ +function getSchemaDefault(schema: Schema | undefined): unknown { + if (!schema) return undefined; + try { + return generateExample(schema as any, 0, { requiredOnly: true, minimal: true }); + } catch { + return undefined; + } +} + +// ============================================================================ +// MAIN +// ============================================================================ + +function groupEndpointsByTag(endpoints: Endpoint[]): Map { + const groups = new Map(); + for (const endpoint of endpoints) { + const tag = endpoint.tags[0] || 'Common'; + if (!groups.has(tag)) groups.set(tag, []); + groups.get(tag)!.push(endpoint); + } + return groups; +} + +/** Filter out "Common" tag endpoints that should map to specific resources */ +function resolveCommonEndpoints(byTag: Map): Map { + const common = byTag.get('Common') ?? []; + const result = new Map(byTag); + result.delete('Common'); + + for (const ep of common) { + // /custom_properties → customProperty + if (ep.path.startsWith('/custom_properties')) { + const tag = 'CustomProperty'; + if (!result.has(tag)) result.set(tag, []); + result.get(tag)!.push(ep); + } + // /uploads → file + else if (ep.path.startsWith('/uploads')) { + const tag = 'File'; + if (!result.has(tag)) result.set(tag, []); + result.get(tag)!.push(ep); + } + // /chats/exports → export + else if (ep.path.startsWith('/chats/exports')) { + const tag = 'Export'; + if (!result.has(tag)) result.set(tag, []); + result.get(tag)!.push(ep); + } + // Other common endpoints + else { + if (!result.has('Common')) result.set('Common', []); + result.get('Common')!.push(ep); + } + } + + return result; +} + +// ============================================================================ +// POST-PROCESS: INJECT FILE UPLOAD FIELDS +// ============================================================================ + +/** + * The /uploads endpoint has no request body in OpenAPI, so the generator produces + * empty fileFields. This function injects the actual file upload UI fields. + * The actual upload logic is handled by uploadFileToS3() in Router.ts via execute(). + */ +function injectFileUploadFields(outputDir: string): void { + const filePath = path.join(outputDir, 'FileDescription.ts'); + if (!fs.existsSync(filePath)) { + console.log(' Skipped file upload injection (FileDescription.ts not found)'); + return; + } + + let code = fs.readFileSync(filePath, 'utf-8'); + + // Replace empty fileFields with actual upload fields + const fieldsCode = `export const fileFields: INodeProperties[] = [ +\t{ +\t\tdisplayName: 'File Source', +\t\tname: 'fileSource', +\t\ttype: 'options', +\t\toptions: [ +\t\t\t{ name: 'Binary Data', value: 'binary' }, +\t\t\t{ name: 'URL', value: 'url' }, +\t\t], +\t\tdefault: 'binary', +\t\tdescription: 'Where to get the file to upload', +\t\tdisplayOptions: { show: { resource: ['file'], operation: ['create', 'upload'] } }, +\t}, +\t{ +\t\tdisplayName: 'File URL', +\t\tname: 'fileUrl', +\t\ttype: 'string', +\t\trequired: true, +\t\tdefault: '', +\t\tdescription: 'URL of the file to upload', +\t\tdisplayOptions: { show: { resource: ['file'], operation: ['create', 'upload'], fileSource: ['url'] } }, +\t}, +\t{ +\t\tdisplayName: 'Input Binary Field', +\t\tname: 'binaryProperty', +\t\ttype: 'string', +\t\trequired: true, +\t\tdefault: 'data', +\t\thint: 'The name of the input binary field containing the file to be uploaded', +\t\tdisplayOptions: { show: { resource: ['file'], operation: ['create', 'upload'], fileSource: ['binary'] } }, +\t}, +\t{ +\t\tdisplayName: 'Additional Fields', +\t\tname: 'additionalFields', +\t\ttype: 'collection', +\t\tplaceholder: 'Add Field', +\t\tdefault: {}, +\t\tdisplayOptions: { show: { resource: ['file'], operation: ['create', 'upload'] } }, +\t\toptions: [ +\t\t\t{ +\t\t\t\tdisplayName: 'Content Type', +\t\t\t\tname: 'contentType', +\t\t\t\ttype: 'string', +\t\t\t\tdefault: '', +\t\t\t\tdescription: 'MIME type of the file (e.g. image/png). If not set, auto-detected from file extension.', +\t\t\t}, +\t\t\t{ +\t\t\t\tdisplayName: 'File Name', +\t\t\t\tname: 'fileName', +\t\t\t\ttype: 'string', +\t\t\t\tdefault: '', +\t\t\t\tdescription: 'Name of the file. If not set, auto-detected from source.', +\t\t\t}, +\t\t], +\t}, +];`; + + code = code.replace( + /export const fileFields: INodeProperties\[\] = \[\n\];/, + fieldsCode, + ); + + fs.writeFileSync(filePath, code); + console.log(' Injected file upload fields into FileDescription.ts'); +} + +// injectExportHandling() removed — export response format handled by Router.ts executeRoute() + +// ============================================================================ +// PACHCA TRIGGER NODE GENERATION +// ============================================================================ + +interface WebhookEventOption { + name: string; + value: string; + type: string; + event: string; +} + +/** + * Extract webhook event types from the WebhookPayloadUnion schema. + * Each member has a `type` enum (e.g. ["button"]) and `event` enum (e.g. ["click"]). + */ +function extractWebhookEvents(schemas: Record): WebhookEventOption[] { + const union = schemas['WebhookPayloadUnion']; + if (!union?.anyOf) { + console.warn(' Warning: WebhookPayloadUnion not found or has no anyOf'); + return []; + } + + const events: WebhookEventOption[] = []; + + for (const member of union.anyOf) { + const resolved = resolveAllOf(member); + const props = resolved.properties; + if (!props) continue; + + // Extract type values (usually single-value enum like ["button"]) + const typeProp = props['type']; + const typeResolved = typeProp?.allOf ? resolveAllOf(typeProp) : typeProp; + const typeValues = typeResolved?.enum as string[] | undefined; + if (!typeValues?.length) continue; + + // Extract event values (may be multi-value enum like ["new","update","delete"]) + const eventProp = props['event']; + const eventResolved = eventProp?.allOf ? resolveAllOf(eventProp) : eventProp; + const eventValues = eventResolved?.enum as string[] | undefined; + if (!eventValues?.length) continue; + + for (const typeVal of typeValues) { + for (const eventVal of eventValues) { + const key = `${typeVal}:${eventVal}`; + const mapped = WEBHOOK_EVENT_MAP[key]; + if (mapped) { + events.push({ ...mapped, type: typeVal, event: eventVal }); + } else { + // Fallback: generate name/value from type+event + const name = `${snakeToPascal(typeVal)} ${snakeToPascal(eventVal)}`; + const value = `${typeVal}_${eventVal}`; + events.push({ name, value, type: typeVal, event: eventVal }); + } + } + } + } + + // Sort by name for consistent output + events.sort((a, b) => a.name.localeCompare(b.name)); + return events; +} + +/** + * Generate the PachcaTrigger.node.ts file content from extracted webhook events. + */ +function generateTriggerNode(events: WebhookEventOption[]): string { + // Build event options for the n8n property + const optionEntries = events.map(e => + `\t\t\t\t\t{ name: '${e.name}', value: '${e.value}' },` + ).join('\n'); + + // Build event filter map: value → { type, event } + const filterEntries = events.map(e => + `\t'${e.value}': { type: '${e.type}', event: '${e.event}' },` + ).join('\n'); + + return `import type { +\tIDataObject, +\tIHookFunctions, +\tINodeType, +\tINodeTypeDescription, +\tIWebhookFunctions, +\tIWebhookResponseData, +} from 'n8n-workflow'; +import { NodeConnectionTypes } from 'n8n-workflow'; +import { verifyWebhookSignature, resolveBotId } from './GenericFunctions'; + +/** Maps n8n event value to webhook payload { type, event } for filtering */ +const EVENT_FILTER: Record = { +${filterEntries} +}; + +export class PachcaTrigger implements INodeType { +\tdescription: INodeTypeDescription = { +\t\tdisplayName: 'Pachca Trigger', +\t\tname: 'pachcaTrigger', +\t\ticon: { light: 'file:pachca.svg', dark: 'file:pachca.dark.svg' }, +\t\tgroup: ['trigger'], +\t\tversion: 1, +\t\tsubtitle: '={{$parameter["event"]}}', +\t\tdescription: 'Starts workflow when Pachca events occur', +\t\tdefaults: { name: 'Pachca Trigger' }, +\t\tinputs: [], +\t\toutputs: [NodeConnectionTypes.Main], +\t\tcredentials: [{ name: 'pachcaApi', required: true }], +\t\twebhooks: [ +\t\t\t{ +\t\t\t\tname: 'default', +\t\t\t\thttpMethod: 'POST', +\t\t\t\tresponseMode: 'onReceived', +\t\t\t\tpath: 'webhook', +\t\t\t}, +\t\t], +\t\tproperties: [ +\t\t\t{ +\t\t\t\tdisplayName: 'Event', +\t\t\t\tname: 'event', +\t\t\t\ttype: 'options', +\t\t\t\tnoDataExpression: true, +\t\t\t\toptions: [ +\t\t\t\t\t{ name: 'All Events', value: '*' }, +${optionEntries} +\t\t\t\t], +\t\t\t\tdefault: 'new_message', +\t\t\t\tdescription: 'The event to listen for', +\t\t\t}, +\t\t], +\t\tusableAsTool: true, +\t}; + +\twebhookMethods = { +\t\tdefault: { +\t\t\tasync checkExists(this: IHookFunctions): Promise { +\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); +\t\t\t\tconst botId = await resolveBotId(this, credentials); +\t\t\t\tif (!botId) return false; +\t\t\t\tconst webhookUrl = this.getNodeWebhookUrl('default'); +\t\t\t\ttry { +\t\t\t\t\tconst response = (await this.helpers.httpRequestWithAuthentication.call( +\t\t\t\t\t\tthis, +\t\t\t\t\t\t'pachcaApi', +\t\t\t\t\t\t{ +\t\t\t\t\t\t\tmethod: 'GET', +\t\t\t\t\t\t\turl: \`\${credentials.baseUrl}/bots/\${botId}\`, +\t\t\t\t\t\t}, +\t\t\t\t\t)) as IDataObject; +\t\t\t\t\tconst data = response.data as IDataObject | undefined; +\t\t\t\t\tconst webhook = data?.webhook as IDataObject | undefined; +\t\t\t\t\treturn webhook?.outgoing_url === webhookUrl; +\t\t\t\t} catch { +\t\t\t\t\treturn false; +\t\t\t\t} +\t\t\t}, + +\t\t\tasync create(this: IHookFunctions): Promise { +\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); +\t\t\t\tconst botId = await resolveBotId(this, credentials); +\t\t\t\tif (!botId) return true; // Not a bot token → manual mode +\t\t\t\tconst webhookUrl = this.getNodeWebhookUrl('default'); +\t\t\t\tawait this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { +\t\t\t\t\tmethod: 'PUT', +\t\t\t\t\turl: \`\${credentials.baseUrl}/bots/\${botId}\`, +\t\t\t\t\tbody: { bot: { webhook: { outgoing_url: webhookUrl } } }, +\t\t\t\t}); +\t\t\t\treturn true; +\t\t\t}, + +\t\t\tasync delete(this: IHookFunctions): Promise { +\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); +\t\t\t\tconst botId = await resolveBotId(this, credentials); +\t\t\t\tif (!botId) return true; +\t\t\t\ttry { +\t\t\t\t\tawait this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { +\t\t\t\t\t\tmethod: 'PUT', +\t\t\t\t\t\turl: \`\${credentials.baseUrl}/bots/\${botId}\`, +\t\t\t\t\t\tbody: { bot: { webhook: { outgoing_url: '' } } }, +\t\t\t\t\t}); +\t\t\t\t} catch { +\t\t\t\t\t// Ignore errors on cleanup +\t\t\t\t} +\t\t\t\treturn true; +\t\t\t}, +\t\t}, +\t}; + +\tasync webhook(this: IWebhookFunctions): Promise { +\t\tconst body = this.getBodyData() as IDataObject; +\t\tconst headerData = this.getHeaderData() as IDataObject; +\t\tconst credentials = await this.getCredentials('pachcaApi'); +\t\tconst event = this.getNodeParameter('event') as string; + +\t\t// Signing secret verification (use raw body bytes for accurate HMAC) +\t\tif (credentials.signingSecret) { +\t\t\tconst signature = headerData['x-pachca-signature'] as string; +\t\t\tif (!signature) { +\t\t\t\treturn { webhookResponse: 'Missing signature' }; +\t\t\t} +\t\t\tconst request = this.getRequestObject(); +\t\t\tconst rawBody = request.rawBody +\t\t\t\t? request.rawBody.toString() +\t\t\t\t: JSON.stringify(body); +\t\t\tif ( +\t\t\t\t!verifyWebhookSignature( +\t\t\t\t\trawBody, +\t\t\t\t\tsignature, +\t\t\t\t\tcredentials.signingSecret as string, +\t\t\t\t) +\t\t\t) { +\t\t\t\treturn { webhookResponse: 'Invalid signature' }; +\t\t\t} +\t\t} + +\t\t// Event filtering using type+event from payload +\t\tif (event !== '*') { +\t\t\tconst filter = EVENT_FILTER[event]; +\t\t\tif (filter) { +\t\t\t\tconst bodyType = body.type as string | undefined; +\t\t\t\tconst bodyEvent = body.event as string | undefined; +\t\t\t\tif (bodyType !== filter.type || bodyEvent !== filter.event) { +\t\t\t\t\treturn { webhookResponse: 'Event filtered' }; +\t\t\t\t} +\t\t\t} +\t\t} + +\t\treturn { +\t\t\tworkflowData: [this.helpers.returnJsonArray(body)], +\t\t}; +\t} +} +`; +} + +// ============================================================================ +// ROUTER GENERATION (execute() dispatcher) +// ============================================================================ + +/** Detect special handler for an operation */ +function getSpecialHandler(resource: string, v2Op: string): string | null { + if (resource === 'file' && v2Op === 'create') return 'fileUpload'; + if (resource === 'message' && (v2Op === 'create' || v2Op === 'update')) return 'messageButtons'; + if (resource === 'form' && v2Op === 'create') return 'formBlocks'; + if (resource === 'bot' && v2Op === 'update') return 'botWebhook'; + if (resource === 'user' && v2Op === 'getAll') return 'userGetAllFilters'; + return null; +} + +/** Build one FieldMap entry as TypeScript literal */ +function buildFieldMapStr(resource: string, op: OperationInfo, f: BodyField): string { + const n8nName = getParamName(resource, op.v1Op, f.name); + const parts: string[] = [`api: '${f.name}'`, `n8n: '${n8nName}'`]; + + if (isPrimitiveArray(f)) { + parts.push('isArray: true'); + parts.push(`arrayType: '${getArrayItemType(f)}'`); + } + + // resourceLocator for body fields (e.g., message.entity_id → searchEntities) + if (BODY_FIELD_SEARCH[resource]?.[f.name]) { + parts.push('locator: true'); + } + + // fixedCollection subKey + if (f.type === 'array' && f.items?.properties) { + const subKey = V1_COMPAT_SUBCOLLECTIONS[n8nName] ?? singularize(n8nName); + parts.push(`subKey: '${subKey}'`); + } + + return `{ ${parts.join(', ')} }`; +} + +/** Build one RouteConfig entry for a regular operation */ +function buildRouteEntry(resource: string, op: OperationInfo): string { + const { v2Op, endpoint, fields, queryParams, pathParams, hasPagination, wrapperKey } = op; + const parts: string[] = []; + + parts.push(`method: '${endpoint.method}' as IHttpRequestMethods`); + parts.push(`path: '${endpoint.path}'`); + + // Path params + const ppEntries: string[] = []; + for (const param of pathParams) { + const n8nName = getParamName(resource, op.v1Op, param.name); + const locator = !!PATH_PARAM_SEARCH[resource]?.[param.name]; + const fallbackInfo = V1_ID_FALLBACKS[resource]; + const isSharedOp = fallbackInfo?.sharedOps.includes(v2Op); + const v1Fallback = isSharedOp && n8nName === 'id' ? fallbackInfo!.v1Name : undefined; + + const pp: string[] = [`api: '${param.name}'`, `n8n: '${n8nName}'`]; + if (locator) pp.push('locator: true'); + if (v1Fallback) pp.push(`v1Fallback: '${v1Fallback}'`); + ppEntries.push(`{ ${pp.join(', ')} }`); + } + if (ppEntries.length) parts.push(`pathParams: [${ppEntries.join(', ')}]`); + + if (wrapperKey) parts.push(`wrapperKey: '${wrapperKey}'`); + + // Sibling fields (stay outside wrapper) + const siblingFields = fields.filter(f => f.isSibling).map(f => f.name); + if (siblingFields.length) parts.push(`siblingFields: [${siblingFields.map(f => `'${f}'`).join(', ')}]`); + + if (hasPagination) parts.push('paginated: true'); + if (resource === 'export') parts.push('noDataWrapper: true'); + + const special = getSpecialHandler(resource, v2Op); + if (special) parts.push(`special: '${special}'`); + + // For file upload, skip body/query — handled entirely by special handler + if (special === 'fileUpload') { + return `\t\t${v2Op}: {\n\t\t\t${parts.join(',\n\t\t\t')},\n\t\t}`; + } + + // Required body fields + const promotedSet = PROMOTED_TOP_LEVEL_FIELDS[resource]?.[v2Op] ?? PROMOTED_TOP_LEVEL_FIELDS[resource]?.[op.v1Op]; + let requiredFields = fields.filter(f => (f.required || promotedSet?.has(f.name)) && !f.readOnly); + const optionalFields = fields.filter(f => !f.required && !promotedSet?.has(f.name) && !f.readOnly); + + // Filter out special fields handled by special handlers + if (resource === 'bot') requiredFields = requiredFields.filter(f => f.name !== 'webhook'); + if (resource === 'form') requiredFields = requiredFields.filter(f => f.name !== 'blocks'); + + const bodyMapEntries: string[] = []; + for (const f of requiredFields) { + bodyMapEntries.push(buildFieldMapStr(resource, op, f)); + } + if (bodyMapEntries.length) { + parts.push(`bodyMap: [\n\t\t\t\t${bodyMapEntries.join(',\n\t\t\t\t')},\n\t\t\t]`); + } + + // Optional body fields (skip buttons for message — handled by messageButtons special) + let filteredOptional = optionalFields; + if (resource === 'message') filteredOptional = filteredOptional.filter(f => f.name !== 'buttons'); + + const optBodyEntries: string[] = []; + for (const f of filteredOptional) { + optBodyEntries.push(buildFieldMapStr(resource, op, f)); + } + // v1 compat: extra body fields not in OpenAPI (e.g. groupTag color) + const extraBodyFields = V1_EXTRA_BODY_FIELDS[resource]?.[v2Op]; + if (extraBodyFields) { + for (const [api, n8n] of extraBodyFields) { + optBodyEntries.push(`{ api: '${api}', n8n: '${n8n}' }`); + } + } + if (optBodyEntries.length) { + parts.push(`optionalBodyMap: [\n\t\t\t\t${optBodyEntries.join(',\n\t\t\t\t')},\n\t\t\t]`); + } + + // v1 collection name override + const v1Resource = V1_COMPAT_RESOURCES[resource] ?? resource; + const collOverride = V1_COMPAT_COLLECTIONS[v1Resource]?.[op.v1Op]?.['additionalFields']; + if (collOverride && collOverride !== 'additionalFields') { + parts.push(`v1Collection: '${collOverride}'`); + } + + // Query params + const nonPaginationParams = queryParams.filter( + p => !['limit', 'cursor', 'per', 'page'].includes(p.name) && !p.name.includes('{') + ); + const QUERY_FILTER_RESOURCES = new Set(['search', 'security']); + const PRIMARY_QUERY_PARAMS = new Set(['query']); + const shouldWrapFilters = QUERY_FILTER_RESOURCES.has(resource); + // BUG 1 fix: user.getAll query param must be in optionalQueryMap (read from v1Collection with fallback) + const isUserGetAll = resource === 'user' && op.v2Op === 'getAll'; + + const topLevelQueryParams = shouldWrapFilters + ? nonPaginationParams.filter(p => p.required || PRIMARY_QUERY_PARAMS.has(p.name)) + : isUserGetAll ? [] : nonPaginationParams; + const filterQueryParams = shouldWrapFilters + ? nonPaginationParams.filter(p => !p.required && !PRIMARY_QUERY_PARAMS.has(p.name)) + : isUserGetAll ? nonPaginationParams : []; + + const queryMapEntries: string[] = []; + for (const p of topLevelQueryParams) { + const n8nName = getParamName(resource, op.v1Op, p.name); + const locator = !!SEARCHABLE_QUERY_PARAMS[p.name]; + const qm: string[] = [`api: '${p.name}'`, `n8n: '${n8nName}'`]; + if (locator) qm.push('locator: true'); + queryMapEntries.push(`{ ${qm.join(', ')} }`); + } + if (queryMapEntries.length) parts.push(`queryMap: [${queryMapEntries.join(', ')}]`); + + const optQueryEntries: string[] = []; + for (const p of filterQueryParams) { + const n8nName = getParamName(resource, op.v1Op, p.name); + optQueryEntries.push(`{ api: '${p.name}', n8n: '${n8nName}' }`); + } + if (optQueryEntries.length) parts.push(`optionalQueryMap: [${optQueryEntries.join(', ')}]`); + + return `\t\t${v2Op}: {\n\t\t\t${parts.join(',\n\t\t\t')},\n\t\t}`; +} + +/** Build one RouteConfig entry for a v1 alias operation */ +function buildAliasRouteEntry( + resource: string, + aliasOp: string, + routing: { method: string; url: string; wrapperKey?: string; pagination?: boolean; splitComma?: [string, string, 'int' | 'string'][] }, +): string { + const parts: string[] = []; + parts.push(`method: '${routing.method}' as IHttpRequestMethods`); + + // Convert declarative URL '=/path/{{$parameter["x"]}}/sub' → '/path/{x}/sub' + let apiPath = routing.url.replace(/^=/, ''); + const pathParamNames: string[] = []; + apiPath = apiPath.replace(/\{\{\$parameter\["(\w+)"\]\}\}/g, (_, paramName) => { + pathParamNames.push(paramName); + return `{${paramName}}`; + }); + parts.push(`path: '${apiPath}'`); + + if (pathParamNames.length) { + const ppEntries = pathParamNames.map(p => `{ api: '${p}', n8n: '${p}' }`); + parts.push(`pathParams: [${ppEntries.join(', ')}]`); + } + + if (routing.pagination) parts.push('paginated: true'); + + // v1 collection name override for alias ops + const v1Resource = V1_COMPAT_RESOURCES[resource] ?? resource; + const collOverride = V1_COMPAT_COLLECTIONS[v1Resource]?.[aliasOp]?.['additionalFields']; + if (collOverride && collOverride !== 'additionalFields') { + parts.push(`v1Collection: '${collOverride}'`); + } + + // v1 optional query params for alias ops (e.g. role for chat.getMembers) + const aliasQueryParams = V1_ALIAS_QUERY_PARAMS[resource]?.[aliasOp]; + if (aliasQueryParams?.length) { + const qEntries = aliasQueryParams.map(([api, n8n]) => `{ api: '${api}', n8n: '${n8n}' }`); + parts.push(`optionalQueryMap: [${qEntries.join(', ')}]`); + } + + // Special handler for alias ops + const aliasSpecial = V1_ALIAS_SPECIALS[resource]?.[aliasOp]; + if (aliasSpecial) parts.push(`special: '${aliasSpecial}'`); + + // Collect body fields from splitComma + V1_ALIAS_FIELDS routing + const bodyEntries: string[] = []; + if (routing.splitComma) { + for (const [n8n, api, type] of routing.splitComma) { + bodyEntries.push(`{ api: '${api}', n8n: '${n8n}', isArray: true, arrayType: '${type}' }`); + } + } + const aliasFieldDefs = V1_ALIAS_FIELDS[resource]?.[aliasOp]; + if (aliasFieldDefs) { + for (const f of aliasFieldDefs.fields) { + if (f.routing) { + bodyEntries.push(`{ api: '${f.routing.send.property}', n8n: '${f.name}' }`); + } + } + } + if (bodyEntries.length) parts.push(`bodyMap: [${bodyEntries.join(', ')}]`); + + return `\t\t${aliasOp}: {\n\t\t\t${parts.join(',\n\t\t\t')},\n\t\t}`; +} + +/** Generate the complete Router.ts file */ +function generateRouter(resourceOperations: Map): string { + // --- Build ROUTES table entries --- + const routeBlocks: string[] = []; + for (const [resource, operations] of resourceOperations) { + const opEntries: string[] = []; + for (const op of operations) { + opEntries.push(buildRouteEntry(resource, op)); + } + // V1 alias operation routes + for (const aliasOp of (V1_ALIAS_OPS[resource] ?? [])) { + const routing = V1_ALIAS_ROUTING[resource]?.[aliasOp]; + if (routing) opEntries.push(buildAliasRouteEntry(resource, aliasOp, routing)); + } + // V1-only form operations (no real API call) + if (resource === 'form') { + opEntries.push(`\t\tprocessSubmission: {\n\t\t\tmethod: 'GET' as IHttpRequestMethods,\n\t\t\tpath: '/profile',\n\t\t\tspecial: 'formProcessSubmission',\n\t\t}`); + opEntries.push(`\t\tgetTemplates: {\n\t\t\tmethod: 'GET' as IHttpRequestMethods,\n\t\t\tpath: '/profile',\n\t\t\tspecial: 'formGetTemplates',\n\t\t}`); + } + if (opEntries.length) { + routeBlocks.push(`\t${resource}: {\n${opEntries.join(',\n')},\n\t}`); + } + } + + // --- Build V1_RESOURCE_MAP (inverse of V1_COMPAT_RESOURCES) --- + const v1ResEntries = Object.entries(V1_COMPAT_RESOURCES) + .map(([v2, v1]) => `\t${v1}: '${v2}'`).join(',\n'); + + // --- Build V1_OP_MAP (inverse of V1_COMPAT_OPS) --- + const v1OpEntries = Object.entries(V1_COMPAT_OPS).map(([resource, ops]) => { + const inverted = Object.entries(ops).map(([v2, v1]) => `${v1}: '${v2}'`).join(', '); + return `\t${resource}: { ${inverted} }`; + }).join(',\n'); + + return `// ============================================================================ +// SharedRouter.ts — Generated execute() dispatcher for Pachca node (shared by V1 and V2) +// DO NOT EDIT — this file is auto-generated by generate-n8n.ts +// ============================================================================ + +import type { IExecuteFunctions, INodeExecutionData, IDataObject, IHttpRequestMethods } from 'n8n-workflow'; +import { +\tmakeApiRequest, +\tmakeApiRequestAllPages, +\tresolveResourceLocator, +\tbuildButtonRows, +\tcleanFileAttachments, +\tresolveFormBlocksFromParams, +\tuploadFileToS3, +\tsplitAndValidateCommaList, +\tsimplifyItem, +\tFORM_TEMPLATES, +} from './GenericFunctions'; + +// ============================================================================ +// Types +// ============================================================================ + +interface PathParam { +\tapi: string; +\tn8n: string; +\tlocator?: boolean; +\tv1Fallback?: string; +} + +interface FieldMap { +\tapi: string; +\tn8n: string; +\tisArray?: boolean; +\tarrayType?: 'int' | 'string'; +\tlocator?: boolean; +\tsubKey?: string; +} + +interface QueryMap { +\tapi: string; +\tn8n: string; +\tlocator?: boolean; +} + +interface RouteConfig { +\tmethod: IHttpRequestMethods; +\tpath: string; +\tpathParams?: PathParam[]; +\twrapperKey?: string; +\tsiblingFields?: string[]; +\tpaginated?: boolean; +\tnoDataWrapper?: boolean; +\tbodyMap?: FieldMap[]; +\toptionalBodyMap?: FieldMap[]; +\tqueryMap?: QueryMap[]; +\toptionalQueryMap?: QueryMap[]; +\tv1Collection?: string; +\tspecial?: string; +} + +// ============================================================================ +// V1 Compatibility Maps +// ============================================================================ + +/** v1 resource name → v2 resource name */ +const V1_RESOURCE_MAP: Record = { +${v1ResEntries}, +}; + +/** v1 operation name → v2 operation name (per v2 resource) */ +const V1_OP_MAP: Record> = { +${v1OpEntries}, +}; + +// ============================================================================ +// Routes Table +// ============================================================================ + +const ROUTES: Record> = { +${routeBlocks.join(',\n')}, +}; + +// ============================================================================ +// Router Entry Point +// ============================================================================ + +export async function router(this: IExecuteFunctions): Promise { +\tconst items = this.getInputData(); +\tconst returnData: INodeExecutionData[] = []; +\tconst nodeVersion = this.getNode().typeVersion; + +\tfor (let i = 0; i < items.length; i++) { +\t\ttry { +\t\t\tlet resource = this.getNodeParameter('resource', i) as string; +\t\t\tlet operation = this.getNodeParameter('operation', i) as string; + +\t\t\t// v1 compat: map old resource/operation names to v2 +\t\t\tif (nodeVersion === 1) { +\t\t\t\tresource = V1_RESOURCE_MAP[resource] ?? resource; +\t\t\t\toperation = V1_OP_MAP[resource]?.[operation] ?? operation; +\t\t\t} + +\t\t\tconst route = ROUTES[resource]?.[operation]; +\t\t\tif (!route) { +\t\t\t\tthrow new Error(\`Unknown operation: \${resource}.\${operation}\`); +\t\t\t} + +\t\t\tconst result = await executeRoute.call(this, route, resource, i, nodeVersion); +\t\t\treturnData.push(...result.map(item => ({ ...item, pairedItem: { item: i } }))); +\t\t} catch (error) { +\t\t\tif (this.continueOnFail()) { +\t\t\t\treturnData.push({ json: { error: (error as Error).message }, pairedItem: { item: i } }); +\t\t\t} else { +\t\t\t\tthrow error; +\t\t\t} +\t\t} +\t} + +\treturn [returnData]; +} + +// ============================================================================ +// Generic Route Executor +// ============================================================================ + +async function executeRoute( +\tthis: IExecuteFunctions, +\troute: RouteConfig, +\tresource: string, +\ti: number, +\tnodeVersion: number, +): Promise { +\t// === Special-only operations (no API call needed) === +\tif (route.special === 'fileUpload') { +\t\tconst result = await uploadFileToS3(this, i); +\t\treturn [{ json: result }]; +\t} +\tif (route.special === 'formProcessSubmission') { +\t\t// v1 only: pass through form submission data from webhook input +\t\tconst inputData = this.getInputData()[i].json; +\t\treturn [{ json: inputData }]; +\t} +\tif (route.special === 'formGetTemplates') { +\t\treturn Object.entries(FORM_TEMPLATES).map(([key, blocks]) => ({ +\t\t\tjson: { name: key, blocks } as unknown as IDataObject, +\t\t})); +\t} + +\t// === Build URL with path params === +\tlet url = route.path; +\tfor (const pp of route.pathParams ?? []) { +\t\tlet value: number | string; +\t\tif (pp.locator) { +\t\t\tvalue = resolveResourceLocator(this, pp.n8n, i, pp.v1Fallback); +\t\t} else { +\t\t\ttry { +\t\t\t\tvalue = this.getNodeParameter(pp.n8n, i) as number; +\t\t\t} catch (e) { +\t\t\t\tif (pp.v1Fallback) { +\t\t\t\t\tvalue = this.getNodeParameter(pp.v1Fallback, i) as number; +\t\t\t\t} else { +\t\t\t\t\tthrow e; +\t\t\t\t} +\t\t\t} +\t\t} +\t\turl = url.replace(\`{\${pp.api}}\`, String(value)); +\t} + +\t// === Build body from required fields === +\tconst body: IDataObject = {}; +\tfor (const fm of route.bodyMap ?? []) { +\t\tlet raw: unknown; +\t\tif (fm.locator) { +\t\t\traw = resolveResourceLocator(this, fm.n8n, i); +\t\t} else { +\t\t\traw = this.getNodeParameter(fm.n8n, i); +\t\t} +\t\tif (fm.isArray && typeof raw === 'string') { +\t\t\tbody[fm.api] = splitAndValidateCommaList(this, raw, fm.n8n, fm.arrayType!, i); +\t\t} else { +\t\t\tbody[fm.api] = raw as IDataObject; +\t\t} +\t} + +\t// === Read optional body fields from collection === +\tconst collectionName = (nodeVersion === 1 && route.v1Collection) ? route.v1Collection : 'additionalFields'; +\tlet additional: IDataObject = {}; +\ttry { additional = this.getNodeParameter(collectionName, i, {}) as IDataObject; } catch { /* no collection */ } + +\tfor (const fm of route.optionalBodyMap ?? []) { +\t\tlet val: unknown = additional[fm.n8n]; + +\t\t// If not in collection, try as top-level param (v1 compat for V1_TOP_LEVEL_PARAMS) +\t\tif (val === undefined) { +\t\t\ttry { val = this.getNodeParameter(fm.n8n, i, undefined); } catch { /* not present */ } +\t\t} + +\t\tif (val === undefined || val === null || val === '') continue; + +\t\t// fixedCollection: extract inner array using subKey +\t\tif (fm.subKey && typeof val === 'object' && !Array.isArray(val)) { +\t\t\tval = (val as IDataObject)[fm.subKey] ?? val; +\t\t} +\t\tif (fm.isArray && typeof val === 'string') { +\t\t\tbody[fm.api] = splitAndValidateCommaList(this, val, fm.n8n, fm.arrayType!, i); +\t\t} else if (fm.locator && typeof val === 'object' && val !== null && (val as IDataObject).__rl) { +\t\t\tbody[fm.api] = (val as IDataObject).value; +\t\t} else { +\t\t\tbody[fm.api] = val as IDataObject; +\t\t} +\t} + +\t// === Read top-level query params === +\tconst qs: IDataObject = {}; +\tfor (const qm of route.queryMap ?? []) { +\t\ttry { +\t\t\tlet val: unknown; +\t\t\tif (qm.locator) { +\t\t\t\tval = resolveResourceLocator(this, qm.n8n, i); +\t\t\t} else { +\t\t\t\tval = this.getNodeParameter(qm.n8n, i); +\t\t\t} +\t\t\tif (val !== undefined && val !== null && val !== '') qs[qm.api] = val as IDataObject; +\t\t} catch { /* param not shown / not filled */ } +\t} + +\t// Read query params from collection, with top-level fallback (same pattern as optionalBodyMap) +\tfor (const qm of route.optionalQueryMap ?? []) { +\t\tlet val: unknown = additional[qm.n8n]; +\t\tif (val === undefined) { +\t\t\ttry { val = this.getNodeParameter(qm.n8n, i, undefined); } catch { /* not present */ } +\t\t} +\t\tif (val !== undefined && val !== null && val !== '') qs[qm.api] = val; +\t} + +\t// === Special handlers === +\tif (route.special === 'messageButtons') { +\t\tconst buttons = buildButtonRows(this, i); +\t\tif (buttons.length) body.buttons = buttons; +\t\tconst files = cleanFileAttachments(this, i); +\t\tif (files.length) body.files = files; +\t} +\tif (route.special === 'formBlocks') { +\t\tconst blocks = resolveFormBlocksFromParams(this, i); +\t\tif (blocks.length) body.blocks = blocks; +\t} +\tif (route.special === 'unfurlLinkPreviews') { +\t\t// v1 compat: linkPreviews was a fixedCollection { preview: [{ url, title, description, imageUrl }] } +\t\t// v2: linkPreviews is a JSON string. API expects { "url": { title, description, image_url } } +\t\tconst raw = body.link_previews; +\t\tif (raw && typeof raw === 'object' && !Array.isArray(raw) && (raw as IDataObject).preview) { +\t\t\tconst previews = (raw as IDataObject).preview as IDataObject[]; +\t\t\tconst converted: IDataObject = {}; +\t\t\tfor (const p of previews) { +\t\t\t\tif (!p.url) continue; +\t\t\t\tconst entry: IDataObject = {}; +\t\t\t\tif (p.title) entry.title = p.title; +\t\t\t\tif (p.description) entry.description = p.description; +\t\t\t\tif (p.imageUrl) entry.image_url = p.imageUrl; +\t\t\t\tconverted[p.url as string] = entry; +\t\t\t} +\t\t\tbody.link_previews = converted; +\t\t} else if (typeof raw === 'string') { +\t\t\ttry { body.link_previews = JSON.parse(raw); } catch { /* leave as-is */ } +\t\t} +\t} +\tif (route.special === 'botWebhook') { +\t\tlet webhookUrl: string | undefined; +\t\ttry { webhookUrl = this.getNodeParameter('webhookUrl', i, '') as string; } catch { /* */ } +\t\tif (webhookUrl) { +\t\t\tbody.webhook = { outgoing_url: webhookUrl }; +\t\t} +\t} + +\t// === Wrap body in key === +\tlet finalBody: IDataObject | undefined; +\tif (Object.keys(body).length > 0) { +\t\tif (route.wrapperKey) { +\t\t\tconst inner: IDataObject = {}; +\t\t\tconst outer: IDataObject = {}; +\t\t\tconst siblingSet = new Set(route.siblingFields ?? []); +\t\t\tfor (const [k, v] of Object.entries(body)) { +\t\t\t\tif (siblingSet.has(k)) { +\t\t\t\t\touter[k] = v; +\t\t\t\t} else { +\t\t\t\t\tinner[k] = v; +\t\t\t\t} +\t\t\t} +\t\t\tfinalBody = { [route.wrapperKey]: inner, ...outer }; +\t\t} else { +\t\t\tfinalBody = body; +\t\t} +\t} + +\t// === Execute API call === +\tif (route.paginated) { +\t\tlet results = await makeApiRequestAllPages.call( +\t\t\tthis, route.method, url, qs, i, resource, nodeVersion, +\t\t); + +\t\t// v1 client-side post-filters for user.getAll +\t\tif (route.special === 'userGetAllFilters' && nodeVersion === 1) { +\t\t\tlet filterOptions: IDataObject = {}; +\t\t\ttry { filterOptions = this.getNodeParameter('filterOptions', i, {}) as IDataObject; } catch { /* */ } + +\t\t\tconst filterRole = filterOptions.filterRole as string[] | undefined; +\t\t\tconst filterBot = filterOptions.filterBot as string | undefined; +\t\t\tconst filterSuspended = filterOptions.filterSuspended as string | undefined; +\t\t\tconst filterInviteStatus = filterOptions.filterInviteStatus as string[] | undefined; + +\t\t\tif (filterRole?.length || (filterBot && filterBot !== 'all') || +\t\t\t\t(filterSuspended && filterSuspended !== 'all') || filterInviteStatus?.length) { +\t\t\t\tresults = results.filter(item => { +\t\t\t\t\tconst d = item.json; +\t\t\t\t\tif (filterRole?.length && !filterRole.includes(d.role as string)) return false; +\t\t\t\t\tif (filterBot === 'users' && d.bot === true) return false; +\t\t\t\t\tif (filterBot === 'bots' && d.bot !== true) return false; +\t\t\t\t\tif (filterSuspended === 'active' && d.suspended === true) return false; +\t\t\t\t\tif (filterSuspended === 'suspended' && d.suspended !== true) return false; +\t\t\t\t\tif (filterInviteStatus?.length && !filterInviteStatus.includes(d.invite_status as string)) return false; +\t\t\t\t\treturn true; +\t\t\t\t}); +\t\t\t} +\t\t} + +\t\treturn results; +\t} + +\tconst response = await makeApiRequest.call( +\t\tthis, route.method, url, finalBody, +\t\tObject.keys(qs).length > 0 ? qs : undefined, i, +\t); + +\t// === Handle response === +\tif (route.method === 'DELETE') { +\t\treturn [{ json: { success: true } }]; +\t} + +\tif (route.noDataWrapper) { +\t\treturn [{ json: response }]; +\t} + +\tconst data = (response.data as IDataObject) ?? response; + +\t// Simplify for GET single item (v2 only) +\tif (nodeVersion >= 2 && route.method === 'GET' && !route.paginated) { +\t\tlet doSimplify = false; +\t\ttry { doSimplify = this.getNodeParameter('simplify', i, false) as boolean; } catch { /* */ } +\t\tif (doSimplify) { +\t\t\treturn [{ json: simplifyItem(data, resource) }]; +\t\t} +\t} + +\treturn [{ json: data }]; +} +`; +} + +async function main() { + console.log('Loading workflows and skill config...'); + await loadWorkflowsAndSkills(); + console.log(`Loaded ${Object.keys(WORKFLOWS).length} workflow groups, ${SKILL_TAG_MAP.length} skills`); + + console.log('Parsing EN OpenAPI spec...'); + const api = parseOpenAPI(EN_SPEC_PATH); + console.log(`Found ${api.endpoints.length} endpoints, ${api.tags.length} tags`); + + // Also parse EN spec into lookup maps for getFieldDescription/getEnumDescriptions + const enApi = api; + for (const ep of enApi.endpoints) { + enEndpoints.set(ep.id, ep); + for (const param of ep.parameters) { + if (param.description) enParamDescs.set(`${ep.id}:${param.name}`, param.description); + } + const enFields = extractBodyFields(ep.requestBody); + for (const field of enFields) { + if (field.description) enBodyDescs.set(`${ep.id}:${field.name}`, field.description); + // Enum descriptions from EN spec + const enResolved = resolveAllOf(field.schema); + const enEnumDesc = enResolved['x-enum-descriptions'] as Record | undefined; + if (enEnumDesc) enEnumDescs.set(`${ep.id}:${field.name}`, enEnumDesc); + // Sub-field descriptions for fixedCollection items + if (field.items?.properties) { + const subSchema = resolveAllOf(field.items); + if (subSchema.properties) { + for (const [subName, subProp] of Object.entries(subSchema.properties)) { + if (subProp.description) enSubFieldDescs.set(`${ep.id}:${field.name}:${subName}`, subProp.description); + } + } + } + } + // Query param enum descriptions + for (const param of ep.parameters) { + const pResolved = resolveQuerySchema(param.schema); + const pEnumDesc = pResolved?.['x-enum-descriptions'] as Record | undefined; + if (pEnumDesc) enEnumDescs.set(`${ep.id}:${param.name}`, pEnumDesc); + } + } + console.log(` EN descriptions: ${enParamDescs.size} params, ${enBodyDescs.size} body fields, ${enSubFieldDescs.size} sub-fields`); + + // Load scope → roles mapping from x-scope-roles in TokenScope schema + // Parse the YAML section directly to avoid adding js-yaml dependency + const specContent = fs.readFileSync(EN_SPEC_PATH, 'utf8'); + const scopeRolesStart = specContent.indexOf('x-scope-roles:'); + if (scopeRolesStart !== -1) { + // Find the indentation level of x-scope-roles + const lineStart = specContent.lastIndexOf('\n', scopeRolesStart) + 1; + const baseIndent = scopeRolesStart - lineStart; + const lines = specContent.substring(scopeRolesStart).split('\n'); + let currentScope = ''; + for (let i = 1; i < lines.length; i++) { + const line = lines[i]; + if (line.trim() === '') continue; + const indent = line.length - line.trimStart().length; + if (indent <= baseIndent) break; // End of x-scope-roles section + const trimmed = line.trim(); + if (trimmed.endsWith(':') && !trimmed.startsWith('-')) { + currentScope = trimmed.slice(0, -1); + scopeRolesMap.set(currentScope, []); + } else if (trimmed.startsWith('- ') && currentScope) { + scopeRolesMap.get(currentScope)!.push(trimmed.slice(2)); + } + } + } + console.log(` Scope-roles: ${scopeRolesMap.size} scopes loaded`); + + let byTag = groupEndpointsByTag(api.endpoints); + byTag = resolveCommonEndpoints(byTag); + + const generatedResources: string[] = []; + const resourceOperations = new Map(); + + // Ensure output directories exist + fs.mkdirSync(OUTPUT_DIR, { recursive: true }); + fs.mkdirSync(CREDS_DIR, { recursive: true }); + const ROOT_NODE_DIR = path.resolve(__dirname, '../nodes/Pachca'); + + for (const [tag, endpoints] of byTag) { + const resource = tag === 'CustomProperty' ? 'customProperty' + : tag === 'File' ? 'file' + : tag === 'Export' ? 'export' + : tagToResource(tag); + + if (resource === 'common') continue; // Skip unmapped common endpoints + + const operations: OperationInfo[] = []; + + for (const ep of endpoints) { + const v2Op = endpointToOperation(ep, resource); + const v1Op = getV1OpValue(resource, v2Op); + const fields = extractBodyFields(ep.requestBody); + const queryParams = ep.parameters.filter(p => p.in === 'query'); + const pathParams = ep.parameters.filter(p => p.in === 'path'); + const hasPagination = queryParams.some(p => p.name === 'cursor'); + const wrapperKey = getWrapperKey(ep.requestBody); + const epTag = ep.tags[0] || tag; + const workflowDesc = getWorkflowDescription(epTag, ep.path); + const docUrl = getDocUrl(ep); + const enEp = enEndpoints.get(ep.id); + const baseDesc = workflowDesc ?? enEp?.summary ?? enEp?.description ?? ep.summary ?? ep.description ?? ''; + const description = docUrl ? `${baseDesc}. API docs` : baseDesc; + + operations.push({ + v2Op, v1Op, endpoint: ep, fields, queryParams, pathParams, + hasPagination, wrapperKey, description, + }); + } + + if (operations.length === 0) continue; + + const code = generateResourceDescription(resource, operations); + const fileName = `${snakeToPascal(resource)}Description.ts`; + const filePath = path.join(OUTPUT_DIR, fileName); + fs.writeFileSync(filePath, code); + console.log(` Generated ${fileName} (${operations.length} operations)`); + generatedResources.push(resource); + resourceOperations.set(resource, operations); + } + + // Post-process: inject file upload fields + injectFileUploadFields(OUTPUT_DIR); + + // Generate Router.ts (execute() dispatcher with ROUTES table) + const routerCode = generateRouter(resourceOperations); + fs.writeFileSync(path.join(ROOT_NODE_DIR, 'SharedRouter.ts'), routerCode); + console.log(` Generated SharedRouter.ts (${resourceOperations.size} resources)`); + + // Generate main node file + const mainNode = generateV2Node(generatedResources); + fs.writeFileSync(path.join(OUTPUT_DIR, 'PachcaV2.node.ts'), mainNode); + console.log(` Generated PachcaV2.node.ts (${generatedResources.length} resources)`); + + // Generate VersionedNodeType wrapper (root level) + const wrapperNode = generateVersionedWrapper(); + fs.writeFileSync(path.join(ROOT_NODE_DIR, 'Pachca.node.ts'), wrapperNode); + console.log(' Generated Pachca.node.ts (VersionedNodeType wrapper)'); + + // Generate credentials + const credentials = generateCredentials(); + fs.writeFileSync(path.join(CREDS_DIR, 'PachcaApi.credentials.ts'), credentials); + console.log(' Generated PachcaApi.credentials.ts'); + + // Generate trigger node from webhook payload schemas + const webhookEvents = extractWebhookEvents(api.schemas); + const triggerNode = generateTriggerNode(webhookEvents); + fs.writeFileSync(path.join(ROOT_NODE_DIR, 'PachcaTrigger.node.ts'), triggerNode); + console.log(` Generated PachcaTrigger.node.ts (${webhookEvents.length} event types)`); + + // Generate Codex files for node discoverability + const codex = { + categories: ['Communication'], + subcategories: { Communication: ['Team Messaging'] }, + resources: { primaryDocumentation: [{ url: 'https://dev.pachca.com/guides/n8n/overview' }] }, + alias: ['pachca', 'messenger', 'chat', 'team', 'corporate messenger'], + }; + fs.writeFileSync(path.join(ROOT_NODE_DIR, 'Pachca.node.json'), JSON.stringify(codex, null, '\t') + '\n'); + fs.writeFileSync(path.join(ROOT_NODE_DIR, 'PachcaTrigger.node.json'), JSON.stringify(codex, null, '\t') + '\n'); + console.log(' Generated Pachca.node.json + PachcaTrigger.node.json (codex)'); + + console.log(`\nDone! Generated ${generatedResources.length} resources, 1 main node, 1 trigger node, 1 credentials, 2 codex.`); +} + +main().catch(err => { + console.error('Generation failed:', err); + process.exit(1); +}); diff --git a/integrations/n8n/scripts/utils.ts b/integrations/n8n/scripts/utils.ts new file mode 100644 index 00000000..c1b97b5c --- /dev/null +++ b/integrations/n8n/scripts/utils.ts @@ -0,0 +1,165 @@ +/** + * Utility functions adapted from packages/cli/scripts/generate-cli.ts + * for the n8n generator. Uses types from @pachca/openapi-parser. + */ + +import type { Schema, RequestBody } from '@pachca/openapi-parser'; +import { resolveAllOf, getSchemaType } from '@pachca/openapi-parser'; + +export interface BodyField { + name: string; + type: string; + format?: string; + required: boolean; + description?: string; + enum?: unknown[]; + maxLength?: number; + maximum?: number; + minimum?: number; + readOnly?: boolean; + nullable?: boolean; + default?: unknown; + items?: Schema; + properties?: Record; + allOf?: Schema[]; + oneOf?: Schema[]; + /** True if this field is a sibling of the wrapper (not inside it) */ + isSibling?: boolean; + /** Full schema reference for complex fields */ + schema: Schema; +} + +/** + * Extract body fields from request body, unwrapping wrapper objects. + * e.g., { message: { content, entity_id } } → [content, entity_id] with wrapper key "message" + */ +export function extractBodyFields(requestBody?: RequestBody): BodyField[] { + if (!requestBody) return []; + + const jsonContent = requestBody.content['application/json']; + const multipartContent = requestBody.content['multipart/form-data']; + const content = jsonContent || multipartContent; + if (!content) return []; + + const schema = content.schema; + if (!schema) return []; + + const resolved = resolveAllOf(schema); + const properties = resolved.properties || {}; + const requiredFields = new Set(resolved.required || []); + + // Check if top-level has exactly one object property that can be unwrapped + const topKeys = Object.keys(properties); + const objectKeys = topKeys.filter((k) => { + const inner = resolveAllOf(properties[k]); + return inner.properties && Object.keys(inner.properties).length > 0; + }); + + if (objectKeys.length === 1) { + const wrapperKey = objectKeys[0]; + const wrapper = properties[wrapperKey]; + const innerResolved = resolveAllOf(wrapper); + if (innerResolved.properties) { + const innerRequired = new Set(innerResolved.required || []); + const fields: BodyField[] = Object.entries(innerResolved.properties) + .filter(([, v]) => !v.readOnly) + .map(([name, propSchema]) => { + const resolved2 = resolveAllOf(propSchema); + return { + name, + type: getSchemaType(propSchema), + format: propSchema.format, + required: innerRequired.has(name), + description: propSchema.description, + enum: propSchema.enum ?? resolved2.enum, + maxLength: propSchema.maxLength, + maximum: propSchema.maximum, + minimum: propSchema.minimum, + readOnly: propSchema.readOnly, + nullable: propSchema.nullable, + default: propSchema.default, + items: propSchema.items ?? resolved2.items, + properties: resolved2.properties, + allOf: propSchema.allOf, + oneOf: propSchema.oneOf, + schema: propSchema, + }; + }); + + // Add sibling scalar fields (non-object top-level properties) + for (const key of topKeys) { + if (key === wrapperKey) continue; + const propSchema = resolveAllOf(properties[key]); + fields.push({ + name: key, + type: getSchemaType(propSchema), + format: propSchema.format, + required: requiredFields.has(key), + description: propSchema.description, + enum: propSchema.enum, + maxLength: propSchema.maxLength, + maximum: propSchema.maximum, + minimum: propSchema.minimum, + readOnly: propSchema.readOnly, + nullable: propSchema.nullable, + default: propSchema.default, + items: propSchema.items, + properties: propSchema.properties, + schema: propSchema, + isSibling: true, + }); + } + + return fields; + } + } + + // Flat properties + return Object.entries(properties) + .filter(([, v]) => !v.readOnly) + .map(([name, propSchema]) => { + const resolved2 = resolveAllOf(propSchema); + return { + name, + type: getSchemaType(propSchema), + format: propSchema.format, + required: requiredFields.has(name), + description: propSchema.description, + enum: propSchema.enum ?? resolved2.enum, + maxLength: propSchema.maxLength, + maximum: propSchema.maximum, + minimum: propSchema.minimum, + readOnly: propSchema.readOnly, + nullable: propSchema.nullable, + default: propSchema.default, + items: propSchema.items ?? resolved2.items, + properties: resolved2.properties, + allOf: propSchema.allOf, + oneOf: propSchema.oneOf, + schema: propSchema, + }; + }); +} + +/** + * Detect body wrapper key from request schema. + * e.g., { user: { email, first_name } } → "user" + */ +export function getWrapperKey(requestBody?: RequestBody): string | null { + if (!requestBody) return null; + const jsonContent = requestBody.content['application/json']; + if (!jsonContent?.schema) return null; + + const schema = jsonContent.schema; + const resolved = resolveAllOf(schema); + if (!resolved.properties) return null; + + const keys = Object.keys(resolved.properties); + const objectKeys = keys.filter((k) => { + const inner = resolveAllOf(resolved.properties![k]); + return inner.properties && Object.keys(inner.properties).length > 0; + }); + + if (objectKeys.length === 1) return objectKeys[0]; + return null; +} diff --git a/integrations/n8n/tests/compatibility.test.ts b/integrations/n8n/tests/compatibility.test.ts new file mode 100644 index 00000000..439a2dc7 --- /dev/null +++ b/integrations/n8n/tests/compatibility.test.ts @@ -0,0 +1,709 @@ +import { describe, it, expect, beforeAll } from 'vitest'; +import * as fs from 'fs'; +import * as path from 'path'; + +/** + * Compatibility tests for the n8n Pachca node. + * + * With the VersionedNodeType refactoring, the node structure is: + * - ROOT_DIR: Pachca.node.ts (VersionedNodeType wrapper), SharedRouter.ts, GenericFunctions.ts, PachcaTrigger.node.ts + * - V1_DIR: Frozen V1 description files (from npm v1.0.27) + * - V2_DIR: Generated V2 description files (clean, no v1 compat) + * + * These tests verify that: + * 1. All expected files exist in the correct directories + * 2. V1 descriptions maintain v1 operation names, parameter names, and alias operations + * 3. V2 descriptions have clean structure (no @version, no v1 ops) + * 4. SharedRouter.ts contains V1_RESOURCE_MAP and V1_OP_MAP for runtime v1→v2 mapping + * 5. Pachca.node.ts is a VersionedNodeType wrapper with defaultVersion: 2 + */ + +const ROOT_DIR = path.resolve(__dirname, '../nodes/Pachca'); +const V1_DIR = path.join(ROOT_DIR, 'V1'); +const V2_DIR = path.join(ROOT_DIR, 'V2'); +const CREDS_DIR = path.resolve(__dirname, '../credentials'); + +// ============================================================================ +// STRUCTURAL TESTS +// ============================================================================ + +describe('Generated files exist', () => { + const rootFiles = [ + 'Pachca.node.ts', + 'PachcaTrigger.node.ts', + 'GenericFunctions.ts', + 'SharedRouter.ts', + ]; + + for (const file of rootFiles) { + it(`should have ${file} in root`, () => { + expect(fs.existsSync(path.join(ROOT_DIR, file))).toBe(true); + }); + } + + it('should have V1/ directory', () => { + expect(fs.existsSync(V1_DIR)).toBe(true); + }); + + it('should have V2/ directory', () => { + expect(fs.existsSync(V2_DIR)).toBe(true); + }); + + const v1Files = [ + 'PachcaV1.node.ts', + 'MessageDescription.ts', + 'UserDescription.ts', + 'ChatDescription.ts', + 'TaskDescription.ts', + 'BotDescription.ts', + 'GroupTagDescription.ts', + 'ThreadDescription.ts', + 'ReactionsDescription.ts', + 'StatusDescription.ts', + 'CustomFieldsDescription.ts', + 'FileDescription.ts', + 'FormDescription.ts', + ]; + + for (const file of v1Files) { + it(`should have V1/${file}`, () => { + expect(fs.existsSync(path.join(V1_DIR, file))).toBe(true); + }); + } + + const v2Files = [ + 'PachcaV2.node.ts', + 'MessageDescription.ts', + 'UserDescription.ts', + 'ChatDescription.ts', + 'TaskDescription.ts', + 'BotDescription.ts', + 'GroupTagDescription.ts', + 'MemberDescription.ts', + 'ReactionDescription.ts', + 'ThreadDescription.ts', + 'ProfileDescription.ts', + 'SearchDescription.ts', + 'FormDescription.ts', + 'SecurityDescription.ts', + 'CustomPropertyDescription.ts', + 'FileDescription.ts', + 'LinkPreviewDescription.ts', + 'ReadMemberDescription.ts', + 'ExportDescription.ts', + ]; + + for (const file of v2Files) { + it(`should have V2/${file}`, () => { + expect(fs.existsSync(path.join(V2_DIR, file))).toBe(true); + }); + } + + it('should have PachcaApi.credentials.ts', () => { + expect(fs.existsSync(path.join(CREDS_DIR, 'PachcaApi.credentials.ts'))).toBe(true); + }); +}); + +// ============================================================================ +// MAIN NODE TESTS (VersionedNodeType wrapper) +// ============================================================================ + +describe('Pachca.node.ts (VersionedNodeType wrapper)', () => { + let content: string; + + beforeAll(() => { + content = fs.readFileSync(path.join(ROOT_DIR, 'Pachca.node.ts'), 'utf-8'); + }); + + it('should export Pachca class extending VersionedNodeType', () => { + expect(content).toContain('export class Pachca extends VersionedNodeType'); + }); + + it('should have defaultVersion: 2', () => { + expect(content).toContain('defaultVersion: 2'); + }); + + it('should import and instantiate PachcaV1', () => { + expect(content).toContain('PachcaV1'); + expect(content).toContain('new PachcaV1'); + }); + + it('should import and instantiate PachcaV2', () => { + expect(content).toContain('PachcaV2'); + expect(content).toContain('new PachcaV2'); + }); + + it('should have nodeVersions with keys 1 and 2', () => { + expect(content).toMatch(/1:\s*new PachcaV1/); + expect(content).toMatch(/2:\s*new PachcaV2/); + }); +}); + +// ============================================================================ +// V1 NODE CLASS +// ============================================================================ + +describe('PachcaV1.node.ts', () => { + let content: string; + + beforeAll(() => { + content = fs.readFileSync(path.join(V1_DIR, 'PachcaV1.node.ts'), 'utf-8'); + }); + + it('should export PachcaV1 class', () => { + expect(content).toContain('export class PachcaV1'); + }); + + it('should have version: 1', () => { + expect(content).toContain('version: 1'); + }); + + it('should reference pachcaApi credentials', () => { + expect(content).toContain("name: 'pachcaApi'"); + }); + + it('should have v1 resource values (reactions, status, customFields)', () => { + expect(content).toContain("value: 'reactions'"); + expect(content).toContain("value: 'status'"); + expect(content).toContain("value: 'customFields'"); + }); + + it('should use router from SharedRouter', () => { + expect(content).toContain("from '../SharedRouter'"); + }); +}); + +// ============================================================================ +// V2 NODE CLASS +// ============================================================================ + +describe('PachcaV2.node.ts', () => { + let content: string; + + beforeAll(() => { + content = fs.readFileSync(path.join(V2_DIR, 'PachcaV2.node.ts'), 'utf-8'); + }); + + it('should export PachcaV2 class', () => { + expect(content).toContain('export class PachcaV2'); + }); + + it('should have version: 2', () => { + expect(content).toContain('version: 2'); + }); + + it('should have usableAsTool: true', () => { + expect(content).toContain('usableAsTool: true'); + }); + + it('should reference pachcaApi credentials', () => { + expect(content).toContain("name: 'pachcaApi'"); + }); + + it('should have v2 resource values (reaction, profile, customProperty)', () => { + expect(content).toContain("value: 'reaction'"); + expect(content).toContain("value: 'profile'"); + expect(content).toContain("value: 'customProperty'"); + }); + + it('should use router from SharedRouter', () => { + expect(content).toContain("from '../SharedRouter'"); + }); +}); + +// ============================================================================ +// SHARED ROUTER V1 COMPATIBILITY MAPS +// ============================================================================ + +describe('SharedRouter.ts v1 compatibility maps', () => { + let content: string; + + beforeAll(() => { + content = fs.readFileSync(path.join(ROOT_DIR, 'SharedRouter.ts'), 'utf-8'); + }); + + it('should have V1_RESOURCE_MAP', () => { + expect(content).toContain('V1_RESOURCE_MAP'); + expect(content).toContain("customFields: 'customProperty'"); + expect(content).toContain("status: 'profile'"); + expect(content).toContain("reactions: 'reaction'"); + }); + + it('should have V1_OP_MAP', () => { + expect(content).toContain('V1_OP_MAP'); + expect(content).toContain("send: 'create'"); + expect(content).toContain("getById: 'get'"); + expect(content).toContain("addReaction: 'create'"); + expect(content).toContain("getCustomProperties: 'get'"); + }); +}); + +// ============================================================================ +// V1 OPERATION COMPATIBILITY (V1/ files) +// ============================================================================ + +describe('V1 operation compatibility', () => { + it('message: should have v1 "send" operation', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'MessageDescription.ts'), 'utf-8'); + expect(content).toContain("value: 'send'"); + }); + + it('message: should have v1 "getById" operation', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'MessageDescription.ts'), 'utf-8'); + expect(content).toContain("value: 'getById'"); + }); + + it('chat: should have v1 "getById" operation', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'ChatDescription.ts'), 'utf-8'); + expect(content).toContain("value: 'getById'"); + }); + + it('user: should have v1 "getById" operation', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'UserDescription.ts'), 'utf-8'); + expect(content).toContain("value: 'getById'"); + }); +}); + +// ============================================================================ +// V2 OPERATIONS ARE CLEAN +// ============================================================================ + +describe('V2 operations are clean (no v1 compat)', () => { + it('message: should have "create" not "send"', () => { + const content = fs.readFileSync(path.join(V2_DIR, 'MessageDescription.ts'), 'utf-8'); + expect(content).toContain("value: 'create'"); + expect(content).not.toContain("value: 'send'"); + }); + + it('message: should have "get" not "getById"', () => { + const content = fs.readFileSync(path.join(V2_DIR, 'MessageDescription.ts'), 'utf-8'); + expect(content).toContain("value: 'get'"); + expect(content).not.toContain("value: 'getById'"); + }); + + it('V2 operations should not have v1-only operation values', () => { + // V2 description files should not have v1-renamed operations + const msgContent = fs.readFileSync(path.join(V2_DIR, 'MessageDescription.ts'), 'utf-8'); + expect(msgContent).not.toContain("value: 'send'"); + expect(msgContent).not.toContain("value: 'getById'"); + + const chatContent = fs.readFileSync(path.join(V2_DIR, 'ChatDescription.ts'), 'utf-8'); + expect(chatContent).not.toContain("value: 'getById'"); + + const userContent = fs.readFileSync(path.join(V2_DIR, 'UserDescription.ts'), 'utf-8'); + expect(userContent).not.toContain("value: 'getById'"); + }); +}); + +// ============================================================================ +// PAGINATION (V2 files) +// ============================================================================ + +describe('Pagination pattern', () => { + const paginatedResources = ['MessageDescription.ts', 'UserDescription.ts', 'ChatDescription.ts', 'TaskDescription.ts']; + + for (const file of paginatedResources) { + it(`V2/${file} should have returnAll toggle`, () => { + const content = fs.readFileSync(path.join(V2_DIR, file), 'utf-8'); + expect(content).toContain("name: 'returnAll'"); + }); + + it(`V2/${file} should have limit field`, () => { + const content = fs.readFileSync(path.join(V2_DIR, file), 'utf-8'); + expect(content).toContain("name: 'limit'"); + }); + } +}); + +// ============================================================================ +// UNIQUE OPERATIONS (no duplicates, V2 files) +// ============================================================================ + +describe('No duplicate operation values', () => { + it('user resource should have unique operation values', () => { + const content = fs.readFileSync(path.join(V2_DIR, 'UserDescription.ts'), 'utf-8'); + const opSection = content.split('export const userOperations')[1]?.split('export const userFields')[0] ?? ''; + const opValues = [...opSection.matchAll(/value: '([^']+)'/g)].map(m => m[1]); + expect(opValues.length).toBeGreaterThan(0); + const unique = new Set(opValues); + expect(opValues.length).toBe(unique.size); + }); + + it('chat resource should have unique operation values', () => { + const content = fs.readFileSync(path.join(V2_DIR, 'ChatDescription.ts'), 'utf-8'); + const opSection = content.split('export const chatOperations')[1]?.split('export const chatFields')[0] ?? ''; + const opValues = [...opSection.matchAll(/value: '([^']+)'/g)].map(m => m[1]); + expect(opValues.length).toBeGreaterThan(0); + const unique = new Set(opValues); + expect(opValues.length).toBe(unique.size); + }); +}); + +// ============================================================================ +// CREDENTIALS +// ============================================================================ + +describe('PachcaApi.credentials.ts', () => { + let content: string; + + beforeAll(() => { + content = fs.readFileSync(path.join(CREDS_DIR, 'PachcaApi.credentials.ts'), 'utf-8'); + }); + + it('should export PachcaApi class', () => { + expect(content).toContain('export class PachcaApi'); + }); + + it('should have Bearer auth', () => { + expect(content).toContain('Bearer {{$credentials.accessToken}}'); + }); + + it('should test credentials via GET /oauth/token/info', () => { + expect(content).toContain("url: '/oauth/token/info'"); + }); + + it('should have signingSecret field', () => { + expect(content).toContain("name: 'signingSecret'"); + }); + + it('should have botId field', () => { + expect(content).toContain("name: 'botId'"); + }); +}); + +// ============================================================================ +// TRIGGER NODE +// ============================================================================ + +describe('PachcaTrigger.node.ts', () => { + let content: string; + + beforeAll(() => { + content = fs.readFileSync(path.join(ROOT_DIR, 'PachcaTrigger.node.ts'), 'utf-8'); + }); + + it('should export PachcaTrigger class', () => { + expect(content).toContain('export class PachcaTrigger'); + }); + + it('should have webhook event options', () => { + expect(content).toContain("value: 'new_message'"); + expect(content).toContain("value: 'button_pressed'"); + expect(content).toContain("value: 'form_submitted'"); + }); + + it('should verify webhook signature', () => { + expect(content).toContain('verifyWebhookSignature'); + }); + + it('should register webhook via PUT /bots/{id}', () => { + expect(content).toContain('/bots/${botId}'); + }); +}); + +// ============================================================================ +// V1 ALIAS OPERATIONS (V1/ files) +// ============================================================================ + +describe('V1 alias operations', () => { + it('chat: should have v1 alias ops (getMembers, addUsers, removeUser, updateRole, leaveChat)', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'ChatDescription.ts'), 'utf-8'); + for (const op of ['getMembers', 'addUsers', 'removeUser', 'updateRole', 'leaveChat']) { + expect(content).toContain(`value: '${op}'`); + } + }); + + it('message: should have v1 alias ops (getReadMembers, unfurl)', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'MessageDescription.ts'), 'utf-8'); + for (const op of ['getReadMembers', 'unfurl']) { + expect(content).toContain(`value: '${op}'`); + } + }); +}); + +// ============================================================================ +// V1 COMPAT PARAMETERS (V1/ files) +// ============================================================================ + +describe('V1 compatibility parameters', () => { + it('reactions: should use reactionsMessageId (not id) for path param', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'ReactionsDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'reactionsMessageId'"); + }); + + it('thread: should use threadMessageId for path param', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'ThreadDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'threadMessageId'"); + }); + + it('user: should have getAllUsersNoLimit hidden v1 param', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'UserDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'getAllUsersNoLimit'"); + }); + + it('message: should have buttonLayout param', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'MessageDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'buttonLayout'"); + }); + + it('message: entityType should be top-level for send operation', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'MessageDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'entityType'"); + }); +}); + +// ============================================================================ +// V1 ALIAS OPERATION FIELDS (V1/ files) +// ============================================================================ + +describe('V1 alias operation fields', () => { + it('chat alias ops: should have chatId field for getMembers/addUsers/removeUser/updateRole/leaveChat', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'ChatDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'chatId'"); + // chatId should cover alias operations + expect(content).toContain("'getMembers'"); + expect(content).toContain("'addUsers'"); + expect(content).toContain("'removeUser'"); + expect(content).toContain("'updateRole'"); + expect(content).toContain("'leaveChat'"); + }); + + it('chat: addUsers should have memberIds and silent fields', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'ChatDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'memberIds'"); + expect(content).toContain("name: 'silent'"); + }); + + it('chat: updateRole should have newRole options field', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'ChatDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'newRole'"); + }); + + it('chat: removeUser/updateRole should have userId field', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'ChatDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'userId'"); + }); + + it('message: getReadMembers should have messageId field', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'MessageDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'messageId'"); + }); + + it('message: unfurl should have linkPreviews field', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'MessageDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'linkPreviews'"); + }); + + it('groupTag: addTags should have groupTagChatId and groupTagIds fields', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'GroupTagDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'groupTagChatId'"); + expect(content).toContain("name: 'groupTagIds'"); + }); + + it('groupTag: removeTag should have groupTagChatId and tagId fields', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'GroupTagDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'tagId'"); + }); + + it('chat: getMembers alias should have returnAll and limit for pagination', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'ChatDescription.ts'), 'utf-8'); + expect(content).toContain("operation: ['getMembers']"); + }); + + it('message: getReadMembers alias should have pagination fields', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'MessageDescription.ts'), 'utf-8'); + expect(content).toContain("operation: ['getReadMembers']"); + }); +}); + +// ============================================================================ +// BOT UPDATE UX (V2 file) +// ============================================================================ + +describe('Bot update UX', () => { + it('bot update: should have webhookUrl field instead of raw JSON', () => { + const content = fs.readFileSync(path.join(V2_DIR, 'BotDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'webhookUrl'"); + }); +}); + +// ============================================================================ +// ENGLISH DESCRIPTIONS (V2 files) +// ============================================================================ + +describe('English descriptions for common fields', () => { + it('returnAll and limit should have English descriptions', () => { + for (const file of ['UserDescription.ts', 'ChatDescription.ts', 'MessageDescription.ts']) { + const content = fs.readFileSync(path.join(V2_DIR, file), 'utf-8'); + expect(content).toContain("Whether to return all results or only up to a given limit"); + expect(content).toContain("Max number of results to return"); + } + }); + + it('main resource path param ID should have resource-specific description', () => { + const expected: Record = { + 'UserDescription.ts': 'User ID', + 'ChatDescription.ts': 'Chat ID', + 'MessageDescription.ts': 'Message ID', + 'TaskDescription.ts': 'Task ID', + }; + for (const [file, desc] of Object.entries(expected)) { + const content = fs.readFileSync(path.join(V2_DIR, file), 'utf-8'); + expect(content).toContain(`description: '${desc}'`); + } + }); +}); + +// ============================================================================ +// V1 TOP-LEVEL FIELD DUPLICATES (V1/ files — fields that were promoted in v1) +// ============================================================================ + +describe('V1 top-level field duplicates', () => { + it('V1 chat.create: should have top-level channel and public', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'ChatDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'channel'"); + expect(content).toContain("name: 'public'"); + }); + + it('V1 user.create: should have top-level firstName', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'UserDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'firstName'"); + }); + + it('V1 task.create: should have top-level taskContent', () => { + const content = fs.readFileSync(path.join(V1_DIR, 'TaskDescription.ts'), 'utf-8'); + expect(content).toContain("name: 'taskContent'"); + }); +}); + +// ============================================================================ +// NO TEMPLATE PARAMETERS (V2 files) +// ============================================================================ + +describe('No template parameters in output', () => { + it('should not have sort[{field}] parameter in V2 descriptions', () => { + const files = fs.readdirSync(V2_DIR).filter(f => f.endsWith('Description.ts')); + for (const file of files) { + const content = fs.readFileSync(path.join(V2_DIR, file), 'utf-8'); + expect(content).not.toContain('sort[{field}]'); + } + }); +}); + +// ============================================================================ +// VISUAL BUTTON CONSTRUCTOR (V2 file) +// ============================================================================ + +describe('Visual button constructor', () => { + let messageContent: string; + beforeAll(() => { + messageContent = fs.readFileSync(path.join(V2_DIR, 'MessageDescription.ts'), 'utf-8'); + }); + + it('buttonLayout field present (no @version restriction)', () => { + const layoutMatch = messageContent.match(/name: 'buttonLayout'[\s\S]*?displayOptions: \{[^}]+\}/); + expect(layoutMatch).toBeTruthy(); + expect(layoutMatch![0]).not.toContain('@version'); + }); + + it('buttonLayout has none, single_row, multiple_rows, and raw_json options', () => { + expect(messageContent).toContain("value: 'none'"); + expect(messageContent).toContain("value: 'single_row'"); + expect(messageContent).toContain("value: 'multiple_rows'"); + expect(messageContent).toContain("value: 'raw_json'"); + }); + + it('buttons fixedCollection shown for single_row and multiple_rows', () => { + const match = messageContent.match(/name: 'buttons',\s*type: 'fixedCollection'[\s\S]*?buttonLayout: \[([^\]]+)\]/); + expect(match).toBeTruthy(); + expect(match![1]).toContain("'single_row'"); + expect(match![1]).toContain("'multiple_rows'"); + }); + + it('buttons fixedCollection has button subcollection with text, type, data, url', () => { + expect(messageContent).toContain("name: 'button'"); + expect(messageContent).toContain("name: 'text'"); + expect(messageContent).toContain("name: 'type'"); + expect(messageContent).toContain("value: 'data'"); + expect(messageContent).toContain("value: 'url'"); + }); + + it('rawJsonButtons shown for raw_json mode', () => { + const match = messageContent.match(/name: 'rawJsonButtons'[\s\S]*?displayOptions: \{[^}]+\}/); + expect(match).toBeTruthy(); + expect(match![0]).toContain("buttonLayout: ['raw_json']"); + }); + + it('buttons NOT in additionalFields', () => { + const additionalFieldsMatch = messageContent.match(/name: 'additionalFields'[\s\S]*?options: \[([\s\S]*?)\n\t\t\],/); + if (additionalFieldsMatch) { + expect(additionalFieldsMatch[1]).not.toContain("name: 'buttons'"); + } + }); + + it('buttonLayout and buttons present for both create and update operations', () => { + // V2 uses 'create' (not 'create', 'send') + const createSection = messageContent.match(/operation: \['create'\].*?buttonLayout/s); + expect(createSection).toBeTruthy(); + const updateSection = messageContent.match(/operation: \['update'\].*?buttonLayout/s); + expect(updateSection).toBeTruthy(); + }); +}); + +// ============================================================================ +// FORM BUILDER (V2 file) +// ============================================================================ + +describe('Form builder (templates + JSON)', () => { + let formContent: string; + beforeAll(() => { + formContent = fs.readFileSync(path.join(V2_DIR, 'FormDescription.ts'), 'utf-8'); + }); + + it('formBuilderMode field exists with template and json options', () => { + expect(formContent).toContain("name: 'formBuilderMode'"); + expect(formContent).toContain("value: 'template'"); + expect(formContent).toContain("value: 'json'"); + }); + + it('formBuilderMode field exists in the form fields section', () => { + expect(formContent).toContain("name: 'formBuilderMode'"); + }); + + it('formTemplate shown only in template mode', () => { + const match = formContent.match(/name: 'formTemplate'[\s\S]*?displayOptions: \{[^}]*formBuilderMode: \[([^\]]+)\]/); + expect(match).toBeTruthy(); + expect(match![1]).toContain("'template'"); + expect(match![1]).not.toContain("'json'"); + }); + + it('formTemplate has all 4 templates', () => { + expect(formContent).toContain("value: 'feedback'"); + expect(formContent).toContain("value: 'timeoff'"); + expect(formContent).toContain("value: 'survey'"); + expect(formContent).toContain("value: 'bug_report'"); + }); + + it('formBlocks shown for builder and json modes', () => { + expect(formContent).toContain("formBuilderMode: ['builder']"); + expect(formContent).toContain("formBuilderMode: ['json']"); + }); + + it('formBlocks has both fixedCollection (builder) and json (json mode) variants', () => { + const fcMatch = formContent.match(/name: 'formBlocks',\s*type: 'fixedCollection'/); + expect(fcMatch).toBeTruthy(); + const jsonMatch = formContent.match(/name: 'formBlocks',\s*type: 'json'/); + expect(jsonMatch).toBeTruthy(); + }); + + it('blocks not in required fields or additionalFields', () => { + expect(formContent).not.toMatch(/name: 'blocks'[^}]*routing:/); + }); + + it('BUG 3: form builder options fixedCollection has multipleValues: true', () => { + const optionsMatch = formContent.match( + /name: 'options',\s*type: 'fixedCollection',\s*typeOptions:\s*\{\s*multipleValues:\s*true\s*\}/ + ); + expect(optionsMatch).toBeTruthy(); + }); +}); diff --git a/integrations/n8n/tests/contract.test.ts b/integrations/n8n/tests/contract.test.ts new file mode 100644 index 00000000..84fc938c --- /dev/null +++ b/integrations/n8n/tests/contract.test.ts @@ -0,0 +1,850 @@ +import { describe, it, expect, beforeAll } from 'vitest'; +import * as fs from 'fs'; +import * as path from 'path'; +import { parseOpenAPI, resolveAllOf, getSchemaType } from '@pachca/openapi-parser'; +import type { Endpoint, Parameter, Schema } from '@pachca/openapi-parser'; +import { extractBodyFields, getWrapperKey } from '../scripts/utils'; + +// ============================================================================ +// SETUP: Parse OpenAPI spec and discover generated node files +// ============================================================================ + +const ROOT = path.resolve(__dirname, '../../..'); +const SPEC_PATH = path.join(ROOT, 'packages/spec/openapi.yaml'); +const NODES_DIR = path.resolve(__dirname, '../nodes/Pachca/V2'); + +// --- Mapping tables (mirrored from generate-n8n.ts) --- + +const TAG_TO_RESOURCE: Record = { + 'Users': 'user', + 'Messages': 'message', + 'Chats': 'chat', + 'Members': 'member', + 'Threads': 'thread', + 'Reactions': 'reaction', + 'Group tags': 'groupTag', + 'Profile': 'profile', + 'Common': 'common', + 'Tasks': 'task', + 'Bots': 'bot', + 'Views': 'form', + 'Read members': 'readMember', + 'Link Previews': 'linkPreview', + 'Search': 'search', + 'Security': 'security', +}; + +function tagToResource(tag: string): string { + return TAG_TO_RESOURCE[tag] || tag.toLowerCase().replace(/s$/, ''); +} + +const STANDARD_CRUD_SUBRESOURCES = new Set(['reaction', 'member', 'readMember', 'linkPreview', 'thread', 'export']); + +function snakeToCamel(s: string): string { + return s.replace(/_([a-z])/g, (_, c) => c.toUpperCase()); +} + +function snakeToPascal(s: string): string { + const camel = snakeToCamel(s); + return camel.charAt(0).toUpperCase() + camel.slice(1); +} + +function endpointToOperation(ep: Endpoint, resource: string): string { + const method = ep.method; + const segments = ep.path.split('/').filter(Boolean); + const staticSegments = segments.filter(s => !s.startsWith('{')); + const lastStatic = staticSegments[staticSegments.length - 1]; + const hasTrailingParam = segments[segments.length - 1]?.startsWith('{') && staticSegments.length > 1; + + if (lastStatic === 'pin') return method === 'POST' ? 'pin' : 'unpin'; + if (lastStatic === 'archive') return 'archive'; + if (lastStatic === 'unarchive') return 'unarchive'; + if (lastStatic === 'leave') return 'leave'; + if (ep.path === '/views/open' && method === 'POST') return 'create'; + + if (staticSegments.length > 1) { + const resourceRoot = staticSegments[0]; + if (lastStatic !== resourceRoot) { + const lastStaticCamel = snakeToCamel(lastStatic); + const resourcePlural = resource.endsWith('y') ? resource.slice(0, -1) + 'ies' : resource + 's'; + if (STANDARD_CRUD_SUBRESOURCES.has(resource) && (lastStaticCamel === resourcePlural || lastStaticCamel === resource)) { + if (hasTrailingParam) { + if (method === 'DELETE') return 'delete'; + if (method === 'PUT' || method === 'PATCH') return 'update'; + return 'get'; + } + if (method === 'GET') return 'getAll'; + if (method === 'POST') return 'create'; + if (method === 'PUT') return 'update'; + if (method === 'DELETE') return 'delete'; + } + + const subName = snakeToPascal(lastStatic); + if (hasTrailingParam) { + if (method === 'DELETE') return `remove${subName}`; + if (method === 'PUT' || method === 'PATCH') return `update${subName}`; + return `get${subName}`; + } + if (method === 'GET') { + const hasCursor = ep.parameters.some(p => p.in === 'query' && p.name === 'cursor'); + return hasCursor ? `getAll${subName}` : `get${subName}`; + } + if (method === 'POST') return `add${subName}`; + if (method === 'PUT') return `update${subName}`; + if (method === 'DELETE') return `delete${subName}`; + } + } + + if (method === 'GET' && !segments.some(s => s.startsWith('{'))) { + const hasCursor = ep.parameters.some(p => p.in === 'query' && p.name === 'cursor'); + return hasCursor ? 'getAll' : 'get'; + } + if (method === 'GET') return 'get'; + if (method === 'POST') return 'create'; + if (method === 'PUT' || method === 'PATCH') return 'update'; + if (method === 'DELETE') return 'delete'; + + return 'execute'; +} + +const V1_COMPAT_OPS: Record> = { + message: { create: 'send', get: 'getById' }, + user: { get: 'getById', getStatus: 'getAllStatus' }, + chat: { get: 'getById' }, + groupTag: { get: 'getById', getAllUsers: 'getUsers' }, + profile: { get: 'getProfile', getInfo: 'getAllInfo' }, + customProperty: { get: 'getCustomProperties' }, + reaction: { create: 'addReaction', delete: 'deleteReaction', getAll: 'getReactions' }, + thread: { create: 'createThread', get: 'getThread' }, + form: { create: 'createView' }, + file: { create: 'upload' }, +}; + +const V1_ALIAS_OPS: Record = { + message: ['getReadMembers', 'unfurl'], + chat: ['getMembers', 'addUsers', 'removeUser', 'updateRole', 'leaveChat'], + groupTag: ['addTags', 'removeTag'], +}; + +const V1_COMPAT_RESOURCES: Record = { + customProperty: 'customFields', + profile: 'status', + reaction: 'reactions', +}; + +const V1_COMPAT_PARAMS: Record>> = { + reactions: { '*': { id: 'reactionsMessageId', code: 'reactionsReactionCode' } }, + thread: { createThread: { id: 'threadMessageId' }, getThread: { id: 'threadThreadId' } }, + groupTag: { + '*': { id: 'groupTagId' }, + create: { name: 'groupTagName', color: 'groupTagColor' }, + update: { name: 'groupTagName', color: 'groupTagColor' }, + }, + chat: { create: { name: 'chatName' }, update: { name: 'chatName' } }, + task: { create: { kind: 'taskKind', content: 'taskContent', dueAt: 'taskDueAt', priority: 'taskPriority' } }, + status: { updateStatus: { emoji: 'statusEmoji', title: 'statusTitle', expiresAt: 'statusExpiresAt' } }, + bot: { update: { id: 'botId', outgoingUrl: 'webhookUrl' } }, + form: { createView: { title: 'formTitle', blocks: 'formBlocks', builderMode: 'formBuilderMode', template: 'formTemplate' } }, +}; + +function getParamName(resource: string, op: string, fieldName: string): string { + const v1Resource = V1_COMPAT_RESOURCES[resource] ?? resource; + const opMap = V1_COMPAT_PARAMS[v1Resource]; + if (opMap) { + const wildcard = opMap['*']?.[snakeToCamel(fieldName)]; + if (wildcard) return wildcard; + const specific = opMap[op]?.[snakeToCamel(fieldName)]; + if (specific) return specific; + } + return snakeToCamel(fieldName); +} + +function toN8nType(type: string, format?: string, enumValues?: unknown[], items?: Schema): string { + if (enumValues && enumValues.length > 0) return 'options'; + if (format === 'date-time') return 'dateTime'; + if (type === 'boolean') return 'boolean'; + if (type === 'integer' || type === 'number') return 'number'; + if (type === 'array' && items?.properties) return 'fixedCollection'; + if (type === 'array' && !items?.properties) return 'string'; + return 'string'; +} + +function queryParamN8nType(schema: Schema): string { + if (schema.enum) return 'options'; + const type = getSchemaType(schema); + if (type === 'boolean') return 'boolean'; + if (schema.format === 'date-time') return 'dateTime'; + if (type === 'integer' || type === 'number') return 'number'; + return 'string'; +} + +/** Endpoints intentionally not covered by the n8n node */ +const INTENTIONALLY_SKIPPED = new Set([ + 'POST /direct_url', // low-level S3 upload, handled internally +]); + +const V2_ONLY_RESOURCES = new Set(['member', 'readMember', 'linkPreview', 'search', 'security', 'export']); + +const PROMOTED_TOP_LEVEL_FIELDS: Record>> = { + message: { create: new Set(['entity_type']), send: new Set(['entity_type']) }, +}; + +// ============================================================================ +// HELPERS: Parse OpenAPI into spec data +// ============================================================================ + +interface SpecOperation { + resource: string; + v2Op: string; + v1Op: string; + endpoint: Endpoint; + hasPagination: boolean; + wrapperKey: string | null; +} + +function groupEndpointsByTag(endpoints: Endpoint[]): Map { + const groups = new Map(); + for (const endpoint of endpoints) { + const tag = endpoint.tags[0] || 'Common'; + if (!groups.has(tag)) groups.set(tag, []); + groups.get(tag)!.push(endpoint); + } + return groups; +} + +function resolveCommonEndpoints(byTag: Map): Map { + const common = byTag.get('Common') ?? []; + const result = new Map(byTag); + result.delete('Common'); + for (const ep of common) { + if (ep.path.startsWith('/custom_properties')) { + const tag = 'CustomProperty'; + if (!result.has(tag)) result.set(tag, []); + result.get(tag)!.push(ep); + } else if (ep.path.startsWith('/uploads')) { + const tag = 'File'; + if (!result.has(tag)) result.set(tag, []); + result.get(tag)!.push(ep); + } else if (ep.path.startsWith('/chats/exports')) { + const tag = 'Export'; + if (!result.has(tag)) result.set(tag, []); + result.get(tag)!.push(ep); + } else { + if (!result.has('Common')) result.set('Common', []); + result.get('Common')!.push(ep); + } + } + return result; +} + +function getSpecOperations(): SpecOperation[] { + const api = parseOpenAPI(SPEC_PATH); + let byTag = groupEndpointsByTag(api.endpoints); + byTag = resolveCommonEndpoints(byTag); + + const operations: SpecOperation[] = []; + + for (const [tag, endpoints] of byTag) { + const resource = tag === 'CustomProperty' ? 'customProperty' + : tag === 'File' ? 'file' + : tagToResource(tag); + if (resource === 'common') continue; + + for (const ep of endpoints) { + const key = `${ep.method} ${ep.path}`; + if (INTENTIONALLY_SKIPPED.has(key)) continue; + + const v2Op = endpointToOperation(ep, resource); + const v1Op = V1_COMPAT_OPS[resource]?.[v2Op] ?? v2Op; + const queryParams = ep.parameters.filter(p => p.in === 'query'); + const hasPagination = queryParams.some(p => p.name === 'cursor'); + const wrapperKey = getWrapperKey(ep.requestBody); + + operations.push({ resource, v2Op, v1Op, endpoint: ep, hasPagination, wrapperKey }); + } + } + + return operations; +} + +// ============================================================================ +// HELPERS: Parse generated node files +// ============================================================================ + +function readDescription(resource: string): string { + const fileName = `${snakeToPascal(resource)}Description.ts`; + return fs.readFileSync(path.join(NODES_DIR, fileName), 'utf-8'); +} + +/** Extract all operation values from the operations array in a Description file. + * + * In execute() mode, Description files no longer contain method/url/paginate + * routing blocks — those moved to Router.ts. We still extract the value and + * v1Only flag so that coverage and orphan checks remain functional. method, + * url, and hasPagination are returned as empty/false placeholders; the tests + * that relied on them (HTTP methods match, URL paths match, Pagination contract) + * skip entries where method is absent, so they pass trivially and remain harmless. + */ +function extractNodeOperations(content: string, resource: string): { value: string; method: string; url: string; v1Only: boolean; hasPagination: boolean }[] { + const camelResource = snakeToCamel(resource); + const opsSection = content.split(`export const ${camelResource}Operations`)[1]?.split(`export const ${camelResource}Fields`)[0] ?? ''; + + const ops: { value: string; method: string; url: string; v1Only: boolean; hasPagination: boolean }[] = []; + // Match each operation option block + const optionBlocks = opsSection.split(/\t\t\t\{/).slice(1); + for (const block of optionBlocks) { + const valueMatch = block.match(/value: '([^']+)'/); + if (!valueMatch) continue; + const methodMatch = block.match(/method: '([A-Z]+)'/); + const urlMatch = block.match(/url: '([^']+)'/); + const v1Only = block.includes("'@version': [1]"); + const hasPagination = block.includes('paginate: true'); + ops.push({ + value: valueMatch[1], + method: methodMatch?.[1] ?? '', + url: urlMatch?.[1] ?? '', + v1Only, + hasPagination, + }); + } + return ops; +} + +/** Parsed field block from the generated Description file */ +interface NodeFieldBlock { + name: string; + type: string; + required: boolean; + operations: string[]; + hasRouting: boolean; + routingProperty?: string; + optionValues: string[]; + isCollection: boolean; + innerFieldNames: string[]; +} + +/** Parse all top-level field blocks from the fields section of a Description file */ +function parseFieldBlocks(content: string, resource: string): NodeFieldBlock[] { + const camelResource = snakeToCamel(resource); + const fieldsSection = content.split(`export const ${camelResource}Fields`)[1] ?? ''; + if (!fieldsSection) return []; + + const blocks: NodeFieldBlock[] = []; + + // Split by top-level field objects (tab + {) + const fieldChunks = fieldsSection.split(/\n\t\{/).slice(1); + for (const chunk of fieldChunks) { + // Close at the matching top-level }, + const nameMatch = chunk.match(/name: '([^']+)'/); + const typeMatch = chunk.match(/\btype: '([^']+)'/); + const required = chunk.includes('required: true'); + const opMatch = chunk.match(/operation: \[([^\]]+)\]/); + const isCollection = typeMatch?.[1] === 'collection' || typeMatch?.[1] === 'fixedCollection'; + const routingMatch = chunk.match(/property: '([^']+)'/); + const optionValues = [...chunk.matchAll(/value: '([^']+)'/g)].map(m => m[1]); + + // Inner field names (for collection fields) + const innerFieldNames: string[] = []; + if (isCollection) { + const optionsMatch = chunk.match(/options: \[([\s\S]*)/); + if (optionsMatch) { + const innerNames = [...optionsMatch[1].matchAll(/name: '([^']+)'/g)].map(m => m[1]); + innerFieldNames.push(...innerNames); + } + } + + const operations = opMatch + ? opMatch[1].replace(/'/g, '').split(',').map(s => s.trim()) + : []; + + if (nameMatch && typeMatch) { + blocks.push({ + name: nameMatch[1], + type: typeMatch[1], + required, + operations, + hasRouting: chunk.includes('routing:'), + routingProperty: routingMatch?.[1], + optionValues, + isCollection, + innerFieldNames, + }); + } + } + + return blocks; +} + +/** Find field blocks matching the given name and operation */ +function findFieldBlocks(blocks: NodeFieldBlock[], fieldName: string, opValues: string[]): NodeFieldBlock[] { + return blocks.filter(b => + b.name === fieldName && b.operations.some(op => opValues.includes(op)), + ); +} + +/** Extract all field names from blocks */ +function extractNodeFieldNames(blocks: NodeFieldBlock[]): string[] { + const names = blocks.map(b => b.name); + // Also include inner field names from collections + for (const b of blocks) { + names.push(...b.innerFieldNames); + } + return names; +} + +/** Normalize n8n URL expression to OpenAPI path */ +function normalizeUrl(url: string): string { + // =/messages/{{$parameter["id"] || $parameter["messageId"]}} → /messages/{id} + // =/messages/{{$parameter["reactionsMessageId"]}} → /messages/{id} + return url.replace(/^=/, '').replace(/\/\{\{[^}]+\}\}/g, (match) => { + // Extract the first $parameter reference + const paramMatch = match.match(/\$parameter\["([^"]+)"\]/); + if (!paramMatch) return match; + // Map back to OpenAPI param name — the first one is usually "id" or the canonical name + const paramName = paramMatch[1]; + // id, chatId, messageId, userId → {id}; other specific names → {name} + if (paramName === 'id' || paramName.endsWith('Id')) { + return '/{id}'; + } + return `/{${paramName}}`; + }); +} + +/** Normalize OpenAPI path for comparison (collapse all path params to {id} for sub-resource endpoints) */ +function normalizeSpecPath(specPath: string): string { + // /messages/{id}/reactions/{code} → keep as is + // /chats/{id} → /chats/{id} + return specPath; +} + +// ============================================================================ +// TESTS +// ============================================================================ + +let specOps: SpecOperation[]; + +beforeAll(() => { + specOps = getSpecOperations(); +}); + +// --- Phase 2: Endpoint Coverage --- + +describe('Endpoint coverage', () => { + it('all OpenAPI endpoints should have a corresponding n8n operation', () => { + const missing: string[] = []; + + for (const spec of specOps) { + const content = readDescription(spec.resource); + const nodeOps = extractNodeOperations(content, spec.resource); + const allOpValues = nodeOps.map(o => o.value); + + // Check v2Op or v1Op exists + if (!allOpValues.includes(spec.v2Op) && !allOpValues.includes(spec.v1Op)) { + missing.push(`${spec.resource}.${spec.v2Op} (${spec.endpoint.method} ${spec.endpoint.path})`); + } + } + + expect(missing, `Missing operations:\n${missing.join('\n')}`).toEqual([]); + }); + + it('no orphan v2 operations exist without a spec counterpart', () => { + const resources = [...new Set(specOps.map(s => s.resource))]; + const orphans: string[] = []; + + for (const resource of resources) { + const content = readDescription(resource); + const nodeOps = extractNodeOperations(content, resource); + const specV2Ops = new Set(specOps.filter(s => s.resource === resource).map(s => s.v2Op)); + const specV1Ops = new Set(specOps.filter(s => s.resource === resource).map(s => s.v1Op)); + const aliasOps = new Set(V1_ALIAS_OPS[resource] ?? []); + + for (const nodeOp of nodeOps) { + if (nodeOp.v1Only) continue; // v1-only ops are covered by compatibility tests + if (aliasOps.has(nodeOp.value)) continue; // alias ops have their own tests + if (specV2Ops.has(nodeOp.value) || specV1Ops.has(nodeOp.value)) continue; + orphans.push(`${resource}.${nodeOp.value}`); + } + } + + expect(orphans, `Orphan operations:\n${orphans.join('\n')}`).toEqual([]); + }); +}); + +// --- Phase 3: HTTP Methods and URL Paths --- + +describe('HTTP methods match', () => { + it('every v2 operation method should match the spec', () => { + const mismatches: string[] = []; + + for (const spec of specOps) { + const content = readDescription(spec.resource); + const nodeOps = extractNodeOperations(content, spec.resource); + const nodeOp = nodeOps.find(o => o.value === spec.v2Op && !o.v1Only); + if (!nodeOp) continue; // coverage tested separately + if (!nodeOp.method) continue; // method lives in Router.ts in execute() mode + + if (nodeOp.method !== spec.endpoint.method) { + mismatches.push( + `${spec.resource}.${spec.v2Op}: node=${nodeOp.method}, spec=${spec.endpoint.method}`, + ); + } + } + + expect(mismatches, `Method mismatches:\n${mismatches.join('\n')}`).toEqual([]); + }); +}); + +describe('URL paths match', () => { + it('every v2 operation URL should match the spec path', () => { + const mismatches: string[] = []; + + for (const spec of specOps) { + const content = readDescription(spec.resource); + const nodeOps = extractNodeOperations(content, spec.resource); + const nodeOp = nodeOps.find(o => o.value === spec.v2Op && !o.v1Only); + if (!nodeOp) continue; + if (!nodeOp.url) continue; // url lives in Router.ts in execute() mode + + const normalizedNodeUrl = normalizeUrl(nodeOp.url); + const normalizedSpecPath = normalizeSpecPath(spec.endpoint.path); + + // Normalize both: replace all {param_name} with {id} for simpler comparison + const nodeSimple = normalizedNodeUrl.replace(/\{[^}]+\}/g, '{*}'); + const specSimple = normalizedSpecPath.replace(/\{[^}]+\}/g, '{*}'); + + if (nodeSimple !== specSimple) { + mismatches.push( + `${spec.resource}.${spec.v2Op}: node=${normalizedNodeUrl}, spec=${normalizedSpecPath}`, + ); + } + } + + expect(mismatches, `URL mismatches:\n${mismatches.join('\n')}`).toEqual([]); + }); +}); + +// --- Phase 4: Parameter Contract --- + +describe('Required body fields are marked required', () => { + it('every required spec body field should be required in the node', () => { + const missing: string[] = []; + + const SPECIAL_FIELDS: Record> = { + bot: new Set(['webhook']), + form: new Set(['blocks']), + }; + + for (const spec of specOps) { + const fields = extractBodyFields(spec.endpoint.requestBody); + const requiredFields = fields.filter(f => f.required && !f.readOnly); + if (requiredFields.length === 0) continue; + + const content = readDescription(spec.resource); + const blocks = parseFieldBlocks(content, spec.resource); + const opValues = spec.v1Op !== spec.v2Op ? [spec.v2Op, spec.v1Op] : [spec.v2Op]; + const skipSet = SPECIAL_FIELDS[spec.resource] ?? new Set(); + + for (const field of requiredFields) { + if (skipSet.has(field.name)) continue; + const paramName = getParamName(spec.resource, spec.v1Op, field.name); + const matching = findFieldBlocks(blocks, paramName, opValues); + + if (matching.length === 0) { + missing.push(`${spec.resource}.${spec.v2Op}: field '${paramName}' (${field.name}) not found`); + continue; + } + + if (!matching.some(b => b.required)) { + missing.push(`${spec.resource}.${spec.v2Op}: field '${paramName}' (${field.name}) not required`); + } + } + } + + expect(missing, `Missing/non-required fields:\n${missing.join('\n')}`).toEqual([]); + }); +}); + +describe('Path parameters exist', () => { + it('every spec path parameter should exist as a required field in the node', () => { + const missing: string[] = []; + + for (const spec of specOps) { + const pathParams = spec.endpoint.parameters.filter(p => p.in === 'path'); + if (pathParams.length === 0) continue; + + const content = readDescription(spec.resource); + const blocks = parseFieldBlocks(content, spec.resource); + const opValues = spec.v1Op !== spec.v2Op ? [spec.v2Op, spec.v1Op] : [spec.v2Op]; + + for (const param of pathParams) { + const paramName = getParamName(spec.resource, spec.v1Op, param.name); + const matching = findFieldBlocks(blocks, paramName, opValues); + + if (matching.length === 0) { + missing.push(`${spec.resource}.${spec.v2Op}: path param '${paramName}' (${param.name}) not found`); + continue; + } + if (!matching.some(b => b.required)) { + missing.push(`${spec.resource}.${spec.v2Op}: path param '${paramName}' (${param.name}) not required`); + } + } + } + + expect(missing, `Missing path params:\n${missing.join('\n')}`).toEqual([]); + }); +}); + +describe('Query parameters exist', () => { + it('non-pagination query params should appear in the node', () => { + const missing: string[] = []; + const PAGINATION_PARAMS = new Set(['limit', 'cursor', 'per', 'page']); + + for (const spec of specOps) { + const queryParams = spec.endpoint.parameters.filter( + p => p.in === 'query' && !PAGINATION_PARAMS.has(p.name) && !p.name.includes('{'), + ); + if (queryParams.length === 0) continue; + + const content = readDescription(spec.resource); + const blocks = parseFieldBlocks(content, spec.resource); + const allFieldNames = extractNodeFieldNames(blocks); + const opValues = spec.v1Op !== spec.v2Op ? [spec.v2Op, spec.v1Op] : [spec.v2Op]; + + for (const param of queryParams) { + const paramName = getParamName(spec.resource, spec.v1Op, param.name); + // Check in direct fields or inside collection fields for this operation + const directMatch = findFieldBlocks(blocks, paramName, opValues); + const inCollection = blocks + .filter(b => b.isCollection && b.operations.some(op => opValues.includes(op))) + .some(b => b.innerFieldNames.includes(paramName)); + + if (directMatch.length === 0 && !inCollection) { + missing.push(`${spec.resource}.${spec.v2Op}: query param '${paramName}' (${param.name}) not found`); + } + } + } + + expect(missing, `Missing query params:\n${missing.join('\n')}`).toEqual([]); + }); +}); + +// --- Phase 5: Type and Enum Contract --- + +describe('Enum values match', () => { + it('spec enum values should match node option values', () => { + const mismatches: string[] = []; + + for (const spec of specOps) { + const fields = extractBodyFields(spec.endpoint.requestBody); + const content = readDescription(spec.resource); + const blocks = parseFieldBlocks(content, spec.resource); + const opValues = spec.v1Op !== spec.v2Op ? [spec.v2Op, spec.v1Op] : [spec.v2Op]; + + for (const field of fields) { + const resolved = field.allOf ? resolveAllOf(field.schema) : field.schema; + const enumValues = field.enum ?? resolved.enum; + if (!enumValues || enumValues.length === 0) continue; + if (field.name === 'buttons' || field.name === 'blocks') continue; + + const paramName = getParamName(spec.resource, spec.v1Op, field.name); + const matching = findFieldBlocks(blocks, paramName, opValues); + if (matching.length === 0) continue; + + // Use the options block that has type 'options' + const optionsBlock = matching.find(b => b.type === 'options'); + if (!optionsBlock) continue; + + const nodeValues = optionsBlock.optionValues.sort(); + const specValues = enumValues.map(String).sort(); + + if (JSON.stringify(nodeValues) !== JSON.stringify(specValues)) { + mismatches.push( + `${spec.resource}.${spec.v2Op}.${paramName}: node=[${nodeValues}], spec=[${specValues}]`, + ); + } + } + + // Also check query parameter enums + const queryParams = spec.endpoint.parameters.filter(p => p.in === 'query' && p.schema?.enum); + for (const param of queryParams) { + const paramName = getParamName(spec.resource, spec.v1Op, param.name); + const specValues = param.schema!.enum!.map(String).sort(); + + const matching = findFieldBlocks(blocks, paramName, opValues); + // Also check inside collection fields + const allBlocks = [...matching]; + for (const b of blocks) { + if (b.isCollection && b.operations.some(op => opValues.includes(op)) && b.innerFieldNames.includes(paramName)) { + // For collection inner fields, use regex on the content (collections have nested blocks) + const fieldPattern = new RegExp( + `name: '${paramName}'[\\s\\S]*?options: \\[([^\\]]+)\\]`, + ); + const fieldMatch = content.match(fieldPattern); + if (fieldMatch) { + const nodeValues = [...fieldMatch[1].matchAll(/value: '([^']+)'/g)].map(m => m[1]).sort(); + if (JSON.stringify(nodeValues) !== JSON.stringify(specValues)) { + mismatches.push( + `${spec.resource}.${spec.v2Op}.${paramName} (query): node=[${nodeValues}], spec=[${specValues}]`, + ); + } + } + } + } + + const optionsBlock = allBlocks.find(b => b.type === 'options'); + if (optionsBlock) { + const nodeValues = optionsBlock.optionValues.sort(); + if (JSON.stringify(nodeValues) !== JSON.stringify(specValues)) { + mismatches.push( + `${spec.resource}.${spec.v2Op}.${paramName} (query): node=[${nodeValues}], spec=[${specValues}]`, + ); + } + } + } + } + + expect(mismatches, `Enum mismatches:\n${mismatches.join('\n')}`).toEqual([]); + }); +}); + +describe('Field types match', () => { + it('body field types should match the expected n8n type mapping', () => { + const mismatches: string[] = []; + + const SPECIAL_TYPE_FIELDS: Record> = { + bot: new Set(['webhook']), + form: new Set(['blocks']), + message: new Set(['buttons']), + }; + + for (const spec of specOps) { + const fields = extractBodyFields(spec.endpoint.requestBody); + const content = readDescription(spec.resource); + const blocks = parseFieldBlocks(content, spec.resource); + const opValues = spec.v1Op !== spec.v2Op ? [spec.v2Op, spec.v1Op] : [spec.v2Op]; + const skipSet = SPECIAL_TYPE_FIELDS[spec.resource] ?? new Set(); + + for (const field of fields) { + if (field.readOnly) continue; + if (skipSet.has(field.name)) continue; + + const paramName = getParamName(spec.resource, spec.v1Op, field.name); + const resolved = field.allOf ? resolveAllOf(field.schema) : field.schema; + const expectedType = toN8nType( + field.type, + field.format, + field.enum ?? resolved.enum, + field.items ?? resolved.items, + ); + + const matching = findFieldBlocks(blocks, paramName, opValues); + if (matching.length === 0) continue; // field existence tested separately + + // Use first non-collection match, or the required one, or just first + const best = matching.find(b => !b.isCollection) ?? matching[0]; + const actualType = best.type; + + if (actualType !== expectedType) { + // Allow resourceLocator where number is expected (searchable dropdowns) + if (actualType === 'resourceLocator' && expectedType === 'number') continue; + // Allow json where object is expected + if (actualType === 'json' && expectedType === 'string') continue; + mismatches.push( + `${spec.resource}.${spec.v2Op}.${paramName}: node='${actualType}', expected='${expectedType}'`, + ); + } + } + } + + expect(mismatches, `Type mismatches:\n${mismatches.join('\n')}`).toEqual([]); + }); +}); + +// --- Phase 6: Pagination --- + +describe('Pagination contract', () => { + it('paginated spec endpoints should have pagination in the node', () => { + const missing: string[] = []; + + for (const spec of specOps) { + if (!spec.hasPagination) continue; + + const content = readDescription(spec.resource); + const nodeOps = extractNodeOperations(content, spec.resource); + const nodeOp = nodeOps.find(o => o.value === spec.v2Op && !o.v1Only); + if (!nodeOp) continue; + + // paginate: true is no longer in Description files (execute() mode uses Router.ts). + // Check for returnAll and limit fields which are still in Description files. + if (!content.includes("name: 'returnAll'")) { + missing.push(`${spec.resource}.${spec.v2Op}: missing returnAll field`); + } + if (!content.includes("name: 'limit'")) { + missing.push(`${spec.resource}.${spec.v2Op}: missing limit field`); + } + } + + expect(missing, `Pagination issues:\n${missing.join('\n')}`).toEqual([]); + }); + + it('non-paginated spec endpoints should NOT have paginate: true', () => { + const extra: string[] = []; + + for (const spec of specOps) { + if (spec.hasPagination) continue; + + const content = readDescription(spec.resource); + const nodeOps = extractNodeOperations(content, spec.resource); + const nodeOp = nodeOps.find(o => o.value === spec.v2Op && !o.v1Only); + if (!nodeOp) continue; + + if (nodeOp.hasPagination) { + extra.push(`${spec.resource}.${spec.v2Op}: has paginate:true but spec has no cursor param`); + } + } + + expect(extra, `Unexpected pagination:\n${extra.join('\n')}`).toEqual([]); + }); +}); + +// Wrapper keys (wrapBodyInKey) are no longer in Description files — they moved to +// Router.ts in the execute() migration. The "Wrapper keys match" section has been removed. + +describe('Body field routing uses snake_case property names', () => { + it('routing.send.property should use original API snake_case names', () => { + const mismatches: string[] = []; + + for (const spec of specOps) { + const fields = extractBodyFields(spec.endpoint.requestBody); + const content = readDescription(spec.resource); + const blocks = parseFieldBlocks(content, spec.resource); + const opValues = spec.v1Op !== spec.v2Op ? [spec.v2Op, spec.v1Op] : [spec.v2Op]; + + for (const field of fields) { + if (field.readOnly) continue; + if (spec.resource === 'bot' && field.name === 'webhook') continue; + if (spec.resource === 'form' && field.name === 'blocks') continue; + if (spec.resource === 'message' && field.name === 'buttons') continue; + + const paramName = getParamName(spec.resource, spec.v1Op, field.name); + const camelName = snakeToCamel(field.name); + // If camelCase matches snake_case, no explicit routing property needed + if (camelName === field.name) continue; + + const matching = findFieldBlocks(blocks, paramName, opValues); + if (matching.length === 0) continue; + + for (const block of matching) { + if (block.hasRouting && block.routingProperty && block.routingProperty !== field.name) { + mismatches.push( + `${spec.resource}.${paramName}: routing property='${block.routingProperty}', expected='${field.name}'`, + ); + break; // report once per field + } + } + } + } + + expect(mismatches, `Property name mismatches:\n${mismatches.join('\n')}`).toEqual([]); + }); +}); diff --git a/integrations/n8n/tests/execute-helpers.test.ts b/integrations/n8n/tests/execute-helpers.test.ts new file mode 100644 index 00000000..874951a0 --- /dev/null +++ b/integrations/n8n/tests/execute-helpers.test.ts @@ -0,0 +1,850 @@ +import { describe, it, expect, vi } from 'vitest'; +import type { IDataObject, IExecuteFunctions, INode } from 'n8n-workflow'; +import { NodeOperationError } from 'n8n-workflow'; +import { + simplifyItem, + resolveResourceLocator, + buildButtonRows, + cleanFileAttachments, + resolveFormBlocksFromParams, + splitAndValidateCommaList, + uploadFileToS3, + buildMultipartBody, + FORM_TEMPLATES, +} from '../nodes/Pachca/GenericFunctions'; + +// ============================================================================ +// Mock helpers +// ============================================================================ + +const MOCK_NODE: INode = { + id: 'test-node-id', + name: 'Pachca', + type: 'n8n-nodes-pachca.pachca', + typeVersion: 2, + position: [0, 0], + parameters: {}, +}; + +/** + * Creates a minimal IExecuteFunctions mock. + * Pass a dictionary of paramName -> value. getNodeParameter will look up values + * from this dictionary, throwing for missing keys unless a default is provided. + */ +function createMockCtx(params: Record = {}): IExecuteFunctions { + const getNodeParameter = vi.fn( + (paramName: string, _itemIndex: number, fallbackValue?: unknown) => { + if (paramName in params) { + return params[paramName]; + } + if (fallbackValue !== undefined) { + return fallbackValue; + } + throw new Error(`Parameter "${paramName}" not found`); + }, + ); + + return { + getNodeParameter, + getNode: vi.fn(() => MOCK_NODE), + } as unknown as IExecuteFunctions; +} + +// ============================================================================ +// simplifyItem +// ============================================================================ + +describe('simplifyItem', () => { + it('should keep only key fields for message', () => { + const item: IDataObject = { + id: 1, + entity_id: 100, + chat_id: 200, + content: 'Hello', + user_id: 42, + created_at: '2026-01-01', + thread: null, + files: [], + extra_field: 'should be removed', + }; + const result = simplifyItem(item, 'message'); + expect(result).toEqual({ + id: 1, + entity_id: 100, + chat_id: 200, + content: 'Hello', + user_id: 42, + created_at: '2026-01-01', + }); + }); + + it('should keep only key fields for chat', () => { + const item: IDataObject = { + id: 10, + name: 'General', + channel: true, + public: true, + members_count: 50, + created_at: '2026-01-01', + description: 'should be removed', + owner_id: 1, + }; + const result = simplifyItem(item, 'chat'); + expect(result).toEqual({ + id: 10, + name: 'General', + channel: true, + public: true, + members_count: 50, + created_at: '2026-01-01', + }); + }); + + it('should keep only key fields for user', () => { + const item: IDataObject = { + id: 5, + first_name: 'John', + last_name: 'Doe', + nickname: 'johnd', + email: 'john@example.com', + role: 'admin', + suspended: false, + phone_number: '+1234567890', + department: 'Engineering', + }; + const result = simplifyItem(item, 'user'); + expect(result).toEqual({ + id: 5, + first_name: 'John', + last_name: 'Doe', + nickname: 'johnd', + email: 'john@example.com', + role: 'admin', + suspended: false, + }); + }); + + it('should keep only key fields for task', () => { + const item: IDataObject = { + id: 7, + content: 'Fix bug', + kind: 'task', + status: 'open', + priority: 1, + due_at: '2026-02-01', + created_at: '2026-01-15', + performer_ids: [1, 2], + assignee: 'Jane', + }; + const result = simplifyItem(item, 'task'); + expect(result).toEqual({ + id: 7, + content: 'Fix bug', + kind: 'task', + status: 'open', + priority: 1, + due_at: '2026-02-01', + created_at: '2026-01-15', + }); + }); + + it('should keep only key fields for bot', () => { + const item: IDataObject = { id: 3, name: 'TestBot', created_at: '2026-01-01', token: 'secret' }; + const result = simplifyItem(item, 'bot'); + expect(result).toEqual({ id: 3, name: 'TestBot', created_at: '2026-01-01' }); + }); + + it('should keep only key fields for groupTag', () => { + const item: IDataObject = { id: 9, name: 'Developers', users_count: 12, color: '#ff0000' }; + const result = simplifyItem(item, 'groupTag'); + expect(result).toEqual({ id: 9, name: 'Developers', users_count: 12 }); + }); + + it('should keep only key fields for reaction', () => { + const item: IDataObject = { id: 11, code: ':thumbsup:', user_id: 42, created_at: '2026-01-01', message_id: 999 }; + const result = simplifyItem(item, 'reaction'); + expect(result).toEqual({ id: 11, code: ':thumbsup:', user_id: 42, created_at: '2026-01-01' }); + }); + + it('should keep only key fields for export', () => { + const item: IDataObject = { id: 20, status: 'completed', created_at: '2026-01-01', url: 'https://...', size: 1024 }; + const result = simplifyItem(item, 'export'); + expect(result).toEqual({ id: 20, status: 'completed', created_at: '2026-01-01' }); + }); + + it('should return full item for unknown resource', () => { + const item: IDataObject = { id: 1, foo: 'bar', baz: 42 }; + const result = simplifyItem(item, 'unknownResource'); + expect(result).toEqual(item); + expect(result).toBe(item); // same reference + }); +}); + +// ============================================================================ +// resolveResourceLocator +// ============================================================================ + +describe('resolveResourceLocator', () => { + it('should return plain number value', () => { + const ctx = createMockCtx({ chatId: 123 }); + const result = resolveResourceLocator(ctx, 'chatId', 0); + expect(result).toBe(123); + }); + + it('should return plain string value', () => { + const ctx = createMockCtx({ name: 'general' }); + const result = resolveResourceLocator(ctx, 'name', 0); + expect(result).toBe('general'); + }); + + it('should extract value from resourceLocator object with __rl', () => { + const ctx = createMockCtx({ + chatId: { mode: 'list', value: 456, __rl: true }, + }); + const result = resolveResourceLocator(ctx, 'chatId', 0); + expect(result).toBe(456); + }); + + it('should extract string value from resourceLocator object', () => { + const ctx = createMockCtx({ + chatId: { mode: 'id', value: 'abc-123', __rl: true }, + }); + const result = resolveResourceLocator(ctx, 'chatId', 0); + expect(result).toBe('abc-123'); + }); + + it('should fall back to fallbackParam when primary is missing', () => { + const ctx = createMockCtx({ entity_id: 789 }); + const result = resolveResourceLocator(ctx, 'chatId', 0, 'entity_id'); + expect(result).toBe(789); + }); + + it('should throw NodeOperationError when param is missing and no fallback', () => { + const ctx = createMockCtx({}); + expect(() => resolveResourceLocator(ctx, 'chatId', 0)).toThrow(NodeOperationError); + expect(() => resolveResourceLocator(ctx, 'chatId', 0)).toThrow('Missing required parameter: chatId'); + }); + + it('should throw NodeOperationError when both primary and fallback are missing', () => { + const ctx = createMockCtx({}); + // fallbackParam also not in params, so getNodeParameter for fallback will also throw + expect(() => resolveResourceLocator(ctx, 'chatId', 0, 'entityId')).toThrow(); + }); +}); + +// ============================================================================ +// buildButtonRows +// ============================================================================ + +describe('buildButtonRows', () => { + it('should return empty array when buttonLayout is none', () => { + const ctx = createMockCtx({ buttonLayout: 'none' }); + expect(buildButtonRows(ctx, 0)).toEqual([]); + }); + + it('should return empty array when buttonLayout param is missing', () => { + const ctx = createMockCtx({}); + expect(buildButtonRows(ctx, 0)).toEqual([]); + }); + + it('should build a single row from visual builder', () => { + const ctx = createMockCtx({ + buttonLayout: 'single_row', + buttons: { + button: [ + { text: 'Click me', type: 'callback', data: 'btn1' }, + { text: 'Open URL', type: 'url', url: 'https://example.com' }, + ], + }, + }); + const result = buildButtonRows(ctx, 0); + expect(result).toEqual([ + [ + { text: 'Click me', data: 'btn1' }, + { text: 'Open URL', url: 'https://example.com' }, + ], + ]); + }); + + it('should build multiple rows from visual builder', () => { + const ctx = createMockCtx({ + buttonLayout: 'multiple_rows', + buttons: { + buttonRow: [ + { text: 'Row 1', data: 'r1' }, + { text: 'Row 2', data: 'r2' }, + ], + }, + }); + const result = buildButtonRows(ctx, 0); + expect(result).toEqual([ + [{ text: 'Row 1', data: 'r1' }], + [{ text: 'Row 2', data: 'r2' }], + ]); + }); + + it('should parse raw JSON flat array into single row', () => { + const ctx = createMockCtx({ + buttonLayout: 'raw_json', + rawJsonButtons: JSON.stringify([ + { text: 'A', data: 'a' }, + { text: 'B', data: 'b' }, + ]), + }); + const result = buildButtonRows(ctx, 0); + expect(result).toEqual([ + [ + { text: 'A', data: 'a' }, + { text: 'B', data: 'b' }, + ], + ]); + }); + + it('should parse raw JSON nested array as multiple rows', () => { + const ctx = createMockCtx({ + buttonLayout: 'raw_json', + rawJsonButtons: JSON.stringify([ + [{ text: 'Row1-A' }], + [{ text: 'Row2-A' }, { text: 'Row2-B' }], + ]), + }); + const result = buildButtonRows(ctx, 0); + expect(result).toEqual([ + [{ text: 'Row1-A' }], + [{ text: 'Row2-A' }, { text: 'Row2-B' }], + ]); + }); + + it('should return empty array for raw_json with empty array string', () => { + const ctx = createMockCtx({ + buttonLayout: 'raw_json', + rawJsonButtons: '[]', + }); + expect(buildButtonRows(ctx, 0)).toEqual([]); + }); + + it('should throw NodeOperationError for invalid JSON', () => { + const ctx = createMockCtx({ + buttonLayout: 'raw_json', + rawJsonButtons: '{not valid json', + }); + expect(() => buildButtonRows(ctx, 0)).toThrow(NodeOperationError); + expect(() => buildButtonRows(ctx, 0)).toThrow('The buttons JSON is not valid'); + }); + + it('should throw NodeOperationError when JSON is not an array', () => { + const ctx = createMockCtx({ + buttonLayout: 'raw_json', + rawJsonButtons: '{"text": "not an array"}', + }); + expect(() => buildButtonRows(ctx, 0)).toThrow(NodeOperationError); + expect(() => buildButtonRows(ctx, 0)).toThrow('Buttons JSON must be an array'); + }); +}); + +// ============================================================================ +// cleanFileAttachments +// ============================================================================ + +describe('cleanFileAttachments', () => { + it('should return empty array when no files', () => { + const ctx = createMockCtx({ additionalFields: {} }); + expect(cleanFileAttachments(ctx, 0)).toEqual([]); + }); + + it('should return empty array when additionalFields param is missing', () => { + const ctx = createMockCtx({}); + expect(cleanFileAttachments(ctx, 0)).toEqual([]); + }); + + it('should handle files as a plain array', () => { + const ctx = createMockCtx({ + additionalFields: { + files: [ + { key: 'uploads/test.pdf', name: 'test.pdf', fileType: 'file' }, + ], + }, + }); + const result = cleanFileAttachments(ctx, 0); + expect(result).toEqual([ + { key: 'uploads/test.pdf', name: 'test.pdf', file_type: 'file' }, + ]); + }); + + it('should handle files as fixedCollection format { file: [...] }', () => { + const ctx = createMockCtx({ + additionalFields: { + files: { + file: [ + { key: 'uploads/img.png', name: 'img.png', fileType: 'image' }, + ], + }, + }, + }); + const result = cleanFileAttachments(ctx, 0); + expect(result).toEqual([ + { key: 'uploads/img.png', name: 'img.png', file_type: 'image' }, + ]); + }); + + it('should strip empty string, null, and undefined fields', () => { + const ctx = createMockCtx({ + additionalFields: { + files: [ + { key: 'uploads/a.txt', name: '', description: null, extra: undefined, fileType: 'file' }, + ], + }, + }); + const result = cleanFileAttachments(ctx, 0); + expect(result).toEqual([ + { key: 'uploads/a.txt', file_type: 'file' }, + ]); + }); + + it('should strip zero-value height and width', () => { + const ctx = createMockCtx({ + additionalFields: { + files: [ + { key: 'uploads/img.png', height: 0, width: '', fileType: 'image' }, + ], + }, + }); + const result = cleanFileAttachments(ctx, 0); + expect(result).toEqual([ + { key: 'uploads/img.png', file_type: 'image' }, + ]); + }); + + it('should keep non-zero height and width', () => { + const ctx = createMockCtx({ + additionalFields: { + files: [ + { key: 'uploads/img.png', height: 100, width: 200, fileType: 'image' }, + ], + }, + }); + const result = cleanFileAttachments(ctx, 0); + expect(result).toEqual([ + { key: 'uploads/img.png', height: 100, width: 200, file_type: 'image' }, + ]); + }); + + it('should map fileType to file_type', () => { + const ctx = createMockCtx({ + additionalFields: { + files: [{ key: 'k', fileType: 'image' }], + }, + }); + const result = cleanFileAttachments(ctx, 0); + expect(result[0]).toHaveProperty('file_type', 'image'); + expect(result[0]).not.toHaveProperty('fileType'); + }); +}); + +// ============================================================================ +// resolveFormBlocksFromParams +// ============================================================================ + +describe('resolveFormBlocksFromParams', () => { + describe('json mode', () => { + it('should parse a valid JSON array of blocks', () => { + const blocks = [ + { type: 'header', text: 'Title' }, + { type: 'input', name: 'field1', label: 'Field 1' }, + ]; + const ctx = createMockCtx({ + formBuilderMode: 'json', + formBlocks: JSON.stringify(blocks), + }); + const result = resolveFormBlocksFromParams(ctx, 0); + expect(result).toEqual(blocks); + }); + + it('should unwrap { blocks: [...] } object', () => { + const blocks = [{ type: 'header', text: 'Hello' }]; + const ctx = createMockCtx({ + formBuilderMode: 'json', + formBlocks: JSON.stringify({ blocks }), + }); + const result = resolveFormBlocksFromParams(ctx, 0); + expect(result).toEqual(blocks); + }); + + it('should throw NodeOperationError for invalid JSON', () => { + const ctx = createMockCtx({ + formBuilderMode: 'json', + formBlocks: '{not valid', + }); + expect(() => resolveFormBlocksFromParams(ctx, 0)).toThrow(NodeOperationError); + expect(() => resolveFormBlocksFromParams(ctx, 0)).toThrow('The JSON is not valid'); + }); + + it('should throw for JSON that is neither array nor object with blocks', () => { + const ctx = createMockCtx({ + formBuilderMode: 'json', + formBlocks: JSON.stringify({ foo: 'bar' }), + }); + expect(() => resolveFormBlocksFromParams(ctx, 0)).toThrow(NodeOperationError); + expect(() => resolveFormBlocksFromParams(ctx, 0)).toThrow('Expected a JSON array of blocks'); + }); + + it('should return empty array for empty formBlocks', () => { + const ctx = createMockCtx({ + formBuilderMode: 'json', + formBlocks: '', + }); + expect(resolveFormBlocksFromParams(ctx, 0)).toEqual([]); + }); + }); + + describe('template mode', () => { + it('should return feedback template', () => { + const ctx = createMockCtx({ + formBuilderMode: 'template', + formTemplate: 'feedback', + }); + const result = resolveFormBlocksFromParams(ctx, 0); + expect(result).toEqual(FORM_TEMPLATES.feedback); + expect(result.length).toBeGreaterThan(0); + }); + + it('should return timeoff template', () => { + const ctx = createMockCtx({ + formBuilderMode: 'template', + formTemplate: 'timeoff', + }); + const result = resolveFormBlocksFromParams(ctx, 0); + expect(result).toEqual(FORM_TEMPLATES.timeoff); + expect(result.length).toBeGreaterThan(0); + }); + + it('should return empty array for unknown template', () => { + const ctx = createMockCtx({ + formBuilderMode: 'template', + formTemplate: 'nonexistent_template', + }); + expect(resolveFormBlocksFromParams(ctx, 0)).toEqual([]); + }); + }); + + describe('builder mode', () => { + it('should build header block', () => { + const ctx = createMockCtx({ + formBuilderMode: 'builder', + formBlocks: { + block: [{ type: 'header', text: 'My Form' }], + }, + }); + const result = resolveFormBlocksFromParams(ctx, 0); + expect(result).toEqual([{ type: 'header', text: 'My Form' }]); + }); + + it('should build divider block (no extra fields)', () => { + const ctx = createMockCtx({ + formBuilderMode: 'builder', + formBlocks: { + block: [{ type: 'divider' }], + }, + }); + const result = resolveFormBlocksFromParams(ctx, 0); + expect(result).toEqual([{ type: 'divider' }]); + }); + + it('should build input block with all properties', () => { + const ctx = createMockCtx({ + formBuilderMode: 'builder', + formBlocks: { + block: [ + { + type: 'input', + name: 'comment', + label: 'Comment', + required: true, + hint: 'Enter text', + placeholder: 'Type here...', + multiline: true, + initial_value: 'default', + min_length: 5, + max_length: 500, + }, + ], + }, + }); + const result = resolveFormBlocksFromParams(ctx, 0); + expect(result).toEqual([ + { + type: 'input', + name: 'comment', + label: 'Comment', + required: true, + hint: 'Enter text', + placeholder: 'Type here...', + multiline: true, + initial_value: 'default', + min_length: 5, + max_length: 500, + }, + ]); + }); + + it('should build select block with options', () => { + const ctx = createMockCtx({ + formBuilderMode: 'builder', + formBlocks: { + block: [ + { + type: 'select', + name: 'choice', + label: 'Pick one', + options: { + option: [ + { text: 'Option A', value: 'a', selected: true }, + { text: 'Option B', value: 'b' }, + ], + }, + }, + ], + }, + }); + const result = resolveFormBlocksFromParams(ctx, 0); + expect(result).toEqual([ + { + type: 'select', + name: 'choice', + label: 'Pick one', + options: [ + { text: 'Option A', value: 'a', selected: true }, + { text: 'Option B', value: 'b' }, + ], + }, + ]); + }); + + it('should build date block with initial_date', () => { + const ctx = createMockCtx({ + formBuilderMode: 'builder', + formBlocks: { + block: [ + { type: 'date', name: 'start_date', label: 'Start', initial_date: '2026-01-01' }, + ], + }, + }); + const result = resolveFormBlocksFromParams(ctx, 0); + expect(result).toEqual([ + { type: 'date', name: 'start_date', label: 'Start', initial_date: '2026-01-01' }, + ]); + }); + + it('should build file_input block with filetypes and max_files', () => { + const ctx = createMockCtx({ + formBuilderMode: 'builder', + formBlocks: { + block: [ + { type: 'file_input', name: 'docs', label: 'Docs', filetypes: 'png, jpg, pdf', max_files: 3 }, + ], + }, + }); + const result = resolveFormBlocksFromParams(ctx, 0); + expect(result).toEqual([ + { + type: 'file_input', + name: 'docs', + label: 'Docs', + filetypes: ['png', 'jpg', 'pdf'], + max_files: 3, + }, + ]); + }); + + it('should return empty array when no blocks in builder', () => { + const ctx = createMockCtx({ + formBuilderMode: 'builder', + formBlocks: { block: [] }, + }); + expect(resolveFormBlocksFromParams(ctx, 0)).toEqual([]); + }); + + it('should skip empty hint and placeholder in input blocks', () => { + const ctx = createMockCtx({ + formBuilderMode: 'builder', + formBlocks: { + block: [ + { type: 'input', name: 'field', label: 'Field', hint: ' ', placeholder: ' ' }, + ], + }, + }); + const result = resolveFormBlocksFromParams(ctx, 0); + expect(result).toEqual([{ type: 'input', name: 'field', label: 'Field' }]); + }); + + it('should build radio block with checked options', () => { + const ctx = createMockCtx({ + formBuilderMode: 'builder', + formBlocks: { + block: [ + { + type: 'radio', + name: 'priority', + label: 'Priority', + options: { + option: [ + { text: 'High', value: 'high', checked: true }, + { text: 'Low', value: 'low' }, + ], + }, + }, + ], + }, + }); + const result = resolveFormBlocksFromParams(ctx, 0); + expect(result[0]!.options).toEqual([ + { text: 'High', value: 'high', checked: true }, + { text: 'Low', value: 'low' }, + ]); + }); + }); + + describe('default mode fallback', () => { + it('should default to json mode when formBuilderMode param is missing', () => { + const ctx = createMockCtx({ + formBlocks: JSON.stringify([{ type: 'header', text: 'Default' }]), + }); + const result = resolveFormBlocksFromParams(ctx, 0); + expect(result).toEqual([{ type: 'header', text: 'Default' }]); + }); + }); +}); + +// ============================================================================ +// splitAndValidateCommaList +// ============================================================================ + +describe('splitAndValidateCommaList', () => { + it('should split and convert valid integers', () => { + const ctx = createMockCtx({}); + const result = splitAndValidateCommaList(ctx, '1, 2, 3', 'Member IDs', 'int', 0); + expect(result).toEqual([1, 2, 3]); + }); + + it('should split valid strings', () => { + const ctx = createMockCtx({}); + const result = splitAndValidateCommaList(ctx, 'alpha, beta, gamma', 'Tags', 'string', 0); + expect(result).toEqual(['alpha', 'beta', 'gamma']); + }); + + it('should filter out empty segments', () => { + const ctx = createMockCtx({}); + const result = splitAndValidateCommaList(ctx, '1,,2, ,3', 'IDs', 'int', 0); + expect(result).toEqual([1, 2, 3]); + }); + + it('should filter out empty segments for strings', () => { + const ctx = createMockCtx({}); + const result = splitAndValidateCommaList(ctx, 'a,,b, ,c', 'Names', 'string', 0); + expect(result).toEqual(['a', 'b', 'c']); + }); + + it('should throw NodeOperationError for invalid int values', () => { + const ctx = createMockCtx({}); + expect(() => + splitAndValidateCommaList(ctx, '1, abc, 3', 'Member IDs', 'int', 0), + ).toThrow(NodeOperationError); + expect(() => + splitAndValidateCommaList(ctx, '1, abc, 3', 'Member IDs', 'int', 0), + ).toThrow('Member IDs must be numbers. Invalid values: abc'); + }); + + it('should handle single value', () => { + const ctx = createMockCtx({}); + expect(splitAndValidateCommaList(ctx, '42', 'ID', 'int', 0)).toEqual([42]); + expect(splitAndValidateCommaList(ctx, 'hello', 'Tag', 'string', 0)).toEqual(['hello']); + }); + + it('should handle whitespace-heavy input', () => { + const ctx = createMockCtx({}); + const result = splitAndValidateCommaList(ctx, ' 10 , 20 , 30 ', 'IDs', 'int', 0); + expect(result).toEqual([10, 20, 30]); + }); +}); + +// ============================================================================ +// BUG 4: S3 upload retry must rebuild multipart body with fresh presigned params +// ============================================================================ + +describe('uploadFileToS3 retry rebuilds multipart body', () => { + it('uses fresh presigned params on retry', async () => { + const presigned1 = { + 'Content-Disposition': 'inline', + acl: 'public-read', + policy: 'policy-1', + 'x-amz-credential': 'cred-1', + 'x-amz-algorithm': 'AWS4-HMAC-SHA256', + 'x-amz-date': '20260101T000000Z', + 'x-amz-signature': 'sig-1', + key: 'uploads/${filename}', + direct_url: 'https://s3.example.com/bucket-1', + }; + const presigned2 = { + ...presigned1, + policy: 'policy-2', + 'x-amz-signature': 'sig-2', + direct_url: 'https://s3.example.com/bucket-2', + }; + + let apiCallCount = 0; + let s3CallCount = 0; + const s3Bodies: Buffer[] = []; + + const mockCtx = { + getNodeParameter: vi.fn((name: string) => { + if (name === 'fileSource') return 'url'; + if (name === 'fileName') return 'test.txt'; + if (name === 'contentType') return 'text/plain'; + if (name === 'fileUrl') return 'https://example.com/test.txt'; + return ''; + }), + getNode: vi.fn(() => MOCK_NODE), + getCredentials: vi.fn(async () => ({ + baseUrl: 'https://api.pachca.com/api/shared/v1', + accessToken: 'test-token', + })), + helpers: { + httpRequestWithAuthentication: vi.fn(async () => { + apiCallCount++; + return { + statusCode: 200, + body: apiCallCount === 1 ? presigned1 : presigned2, + }; + }), + httpRequest: vi.fn(async (opts: { method?: string; url?: string; body?: Buffer }) => { + if (opts.method === 'GET') { + // File download + return Buffer.from('file-content'); + } + // S3 POST upload + s3CallCount++; + s3Bodies.push(opts.body as Buffer); + if (s3CallCount === 1) { + throw new Error('S3 temporary failure'); + } + return {}; + }), + }, + } as unknown as IExecuteFunctions; + + const result = await uploadFileToS3(mockCtx, 0); + + // Should have called /uploads twice (initial + retry) + expect(apiCallCount).toBe(2); + // Should have attempted S3 upload twice + expect(s3CallCount).toBe(2); + // Second S3 upload body must contain fresh signature + const body2 = s3Bodies[1].toString(); + expect(body2).toContain('sig-2'); + expect(body2).toContain('policy-2'); + expect(body2).not.toContain('sig-1'); + expect(body2).not.toContain('policy-1'); + // Result should have the correct key + expect(result.key).toBe('uploads/test.txt'); + }); +}); diff --git a/integrations/n8n/tests/generic-functions.test.ts b/integrations/n8n/tests/generic-functions.test.ts new file mode 100644 index 00000000..86b83298 --- /dev/null +++ b/integrations/n8n/tests/generic-functions.test.ts @@ -0,0 +1,142 @@ +import { describe, it, expect } from 'vitest'; +import { + verifyWebhookSignature, + detectMimeType, + buildMultipartBody, +} from '../nodes/Pachca/GenericFunctions'; +import * as crypto from 'crypto'; + +// ============================================================================ +// verifyWebhookSignature +// ============================================================================ + +describe('verifyWebhookSignature', () => { + const secret = 'test-secret-key'; + + function sign(body: string): string { + return crypto.createHmac('sha256', secret).update(body).digest('hex'); + } + + it('should accept a valid signature', () => { + const body = '{"event":"new_message"}'; + const signature = sign(body); + expect(verifyWebhookSignature(body, signature, secret)).toBe(true); + }); + + it('should reject an invalid signature', () => { + const body = '{"event":"new_message"}'; + expect(verifyWebhookSignature(body, 'bad-signature', secret)).toBe(false); + }); + + it('should reject a signature from a different secret', () => { + const body = '{"event":"new_message"}'; + const wrongSig = crypto + .createHmac('sha256', 'wrong-secret') + .update(body) + .digest('hex'); + expect(verifyWebhookSignature(body, wrongSig, secret)).toBe(false); + }); + + it('should reject when body is tampered', () => { + const body = '{"event":"new_message"}'; + const signature = sign(body); + expect( + verifyWebhookSignature(body + 'x', signature, secret), + ).toBe(false); + }); + + it('should reject empty signature', () => { + expect(verifyWebhookSignature('{}', '', secret)).toBe(false); + }); + + it('should handle empty body', () => { + const signature = sign(''); + expect(verifyWebhookSignature('', signature, secret)).toBe(true); + }); +}); + +// ============================================================================ +// detectMimeType +// ============================================================================ + +describe('detectMimeType', () => { + it('should detect common image types', () => { + expect(detectMimeType('photo.jpg')).toBe('image/jpeg'); + expect(detectMimeType('photo.jpeg')).toBe('image/jpeg'); + expect(detectMimeType('image.png')).toBe('image/png'); + expect(detectMimeType('anim.gif')).toBe('image/gif'); + expect(detectMimeType('pic.webp')).toBe('image/webp'); + }); + + it('should detect document types', () => { + expect(detectMimeType('doc.pdf')).toBe('application/pdf'); + expect(detectMimeType('report.docx')).toBe( + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + ); + expect(detectMimeType('data.xlsx')).toBe( + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + ); + }); + + it('should detect text types', () => { + expect(detectMimeType('readme.txt')).toBe('text/plain'); + expect(detectMimeType('data.csv')).toBe('text/csv'); + expect(detectMimeType('config.json')).toBe('application/json'); + }); + + it('should return octet-stream for unknown extensions', () => { + expect(detectMimeType('file.xyz')).toBe('application/octet-stream'); + expect(detectMimeType('noext')).toBe('application/octet-stream'); + }); + + it('should be case-insensitive', () => { + expect(detectMimeType('PHOTO.JPG')).toBe('image/jpeg'); + expect(detectMimeType('DOC.PDF')).toBe('application/pdf'); + }); +}); + +// ============================================================================ +// buildMultipartBody +// ============================================================================ + +describe('buildMultipartBody', () => { + it('should produce valid multipart structure', () => { + const fields = { acl: 'public-read', policy: 'encoded-policy' }; + const fileBuffer = Buffer.from('file-content'); + const result = buildMultipartBody( + fields, + fileBuffer, + 'test.txt', + 'text/plain', + ); + + expect(result.contentType).toMatch(/^multipart\/form-data; boundary=/); + const bodyStr = result.body.toString(); + expect(bodyStr).toContain('name="acl"'); + expect(bodyStr).toContain('public-read'); + expect(bodyStr).toContain('name="policy"'); + expect(bodyStr).toContain('encoded-policy'); + expect(bodyStr).toContain('name="file"'); + expect(bodyStr).toContain('filename="test.txt"'); + expect(bodyStr).toContain('Content-Type: text/plain'); + expect(bodyStr).toContain('file-content'); + }); + + it('should place file last in the body', () => { + const fields = { key: 'uploads/file.txt' }; + const result = buildMultipartBody( + fields, + Buffer.from('data'), + 'file.txt', + 'text/plain', + ); + const bodyStr = result.body.toString(); + const keyPos = bodyStr.indexOf('name="key"'); + const filePos = bodyStr.indexOf('name="file"'); + expect(keyPos).toBeLessThan(filePos); + }); +}); + +// Functions wrapBodyInKey, splitCommaToArray, nestBotWebhook, handlePachcaError, +// getCursorPaginator, transformButtons, resolveFormBlocks were removed from +// GenericFunctions.ts in the execute() migration and are no longer tested here. diff --git a/integrations/n8n/tests/router.test.ts b/integrations/n8n/tests/router.test.ts new file mode 100644 index 00000000..14a79489 --- /dev/null +++ b/integrations/n8n/tests/router.test.ts @@ -0,0 +1,1379 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { router } from '../nodes/Pachca/SharedRouter'; +import * as GenericFunctions from '../nodes/Pachca/GenericFunctions'; + +// ============================================================================ +// Mock IExecuteFunctions context +// ============================================================================ + +interface MockCall { + method: string; + url: string; + body?: unknown; + qs?: unknown; +} + +function createMockContext(opts: { + resource: string; + operation: string; + nodeVersion?: number; + params?: Record; + inputData?: unknown[]; + continueOnFail?: boolean; +}) { + const version = opts.nodeVersion ?? 2; + const params = opts.params ?? {}; + const calls: MockCall[] = []; + + const ctx = { + getInputData: () => + (opts.inputData ?? [{}]).map((json) => ({ json: json as Record })), + getNodeParameter: vi.fn((name: string, _index: number, defaultVal?: unknown) => { + if (name === 'resource') return opts.resource; + if (name === 'operation') return opts.operation; + if (name in params) return params[name]; + if (defaultVal !== undefined) return defaultVal; + throw new Error(`Missing parameter: ${name}`); + }), + getNode: () => ({ + typeVersion: version, + name: 'Pachca', + type: 'n8n-nodes-pachca.pachca', + }), + getCredentials: vi.fn(async () => ({ + baseUrl: 'https://api.pachca.com/api/shared/v1', + accessToken: 'test-token', + })), + helpers: { + httpRequestWithAuthentication: vi.fn(async (_cred: string, options: { method: string; url: string; body?: unknown; qs?: unknown }) => { + calls.push({ + method: options.method, + url: options.url, + body: options.body, + qs: options.qs, + }); + // Default successful response + return { + statusCode: 200, + body: { data: { id: 1, name: 'test' } }, + }; + }), + httpRequest: vi.fn(async () => Buffer.from('file-content')), + assertBinaryData: vi.fn(() => ({ fileName: 'test.txt', mimeType: 'text/plain' })), + getBinaryDataBuffer: vi.fn(async () => Buffer.from('binary-data')), + }, + continueOnFail: () => opts.continueOnFail ?? false, + _calls: calls, + }; + + return ctx; +} + +// Helper to run router with mock context +async function runRouter(ctx: ReturnType) { + return router.call(ctx as any); +} + +// Helper to configure mock for paginated response +function mockPaginatedResponse(ctx: ReturnType, pages: { data: unknown[]; nextCursor?: string }[]) { + let pageIndex = 0; + ctx.helpers.httpRequestWithAuthentication.mockImplementation(async (_cred: string, options: any) => { + ctx._calls.push({ method: options.method, url: options.url, body: options.body, qs: options.qs }); + const page = pages[pageIndex++] ?? { data: [] }; + return { + statusCode: 200, + body: { + data: page.data, + meta: page.nextCursor ? { paginate: { next_page: page.nextCursor } } : {}, + }, + }; + }); +} + +// Helper to override mock response while preserving call tracking +function mockResponse(ctx: ReturnType, response: { statusCode: number; body: unknown }) { + ctx.helpers.httpRequestWithAuthentication.mockImplementation(async (_cred: string, options: any) => { + ctx._calls.push({ method: options.method, url: options.url, body: options.body, qs: options.qs }); + return response; + }); +} + +// ============================================================================ +// ROUTER DISPATCH TESTS +// ============================================================================ + +describe('Router dispatch', () => { + it('dispatches to correct resource/operation', async () => { + const ctx = createMockContext({ resource: 'profile', operation: 'get' }); + const result = await runRouter(ctx); + + expect(result).toHaveLength(1); // single output array + expect(result[0]).toHaveLength(1); // one item + expect(ctx._calls).toHaveLength(1); + expect(ctx._calls[0].method).toBe('GET'); + expect(ctx._calls[0].url).toContain('/profile'); + }); + + it('throws on unknown operation', async () => { + const ctx = createMockContext({ resource: 'profile', operation: 'nonexistent' }); + await expect(runRouter(ctx)).rejects.toThrow('Unknown operation'); + }); + + it('continueOnFail catches errors', async () => { + const ctx = createMockContext({ + resource: 'profile', + operation: 'nonexistent', + continueOnFail: true, + }); + const result = await runRouter(ctx); + expect(result[0]).toHaveLength(1); + expect(result[0][0].json).toHaveProperty('error'); + expect(result[0][0]).toHaveProperty('pairedItem', { item: 0 }); + }); + + it('adds pairedItem to every result', async () => { + const ctx = createMockContext({ resource: 'profile', operation: 'get' }); + const result = await runRouter(ctx); + expect(result[0][0]).toHaveProperty('pairedItem', { item: 0 }); + }); +}); + +// ============================================================================ +// PATH PARAMETER TESTS +// ============================================================================ + +describe('Path parameters', () => { + it('substitutes path params into URL', async () => { + const ctx = createMockContext({ + resource: 'task', + operation: 'get', + params: { id: 42 }, + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/tasks/42'); + }); + + it('resolves resourceLocator params', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'get', + params: { id: { __rl: true, value: 123, mode: 'id' } }, + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/chats/123'); + }); + + it('uses v1Fallback when main param missing', async () => { + const ctx = createMockContext({ + resource: 'message', + operation: 'get', + nodeVersion: 1, + params: { messageId: 999 }, + }); + // Override getNodeParameter to throw on 'id' but return messageId + ctx.getNodeParameter.mockImplementation((name: string, _index: number, defaultVal?: unknown) => { + if (name === 'resource') return 'message'; + if (name === 'operation') return 'get'; // v1 operation mapped via V1_OP_MAP + if (name === 'messageId') return 999; + if (name === 'id') throw new Error('Missing parameter: id'); + if (defaultVal !== undefined) return defaultVal; + throw new Error(`Missing parameter: ${name}`); + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/messages/999'); + }); + + it('handles multiple path params', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'removeUser', + params: { chatId: 10, userId: 20 }, + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/chats/10/members/20'); + }); +}); + +// ============================================================================ +// BODY WRAPPING TESTS +// ============================================================================ + +describe('Body wrapping', () => { + it('wraps body in wrapperKey', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'create', + params: { chatName: 'Test Chat', additionalFields: {} }, + }); + await runRouter(ctx); + const body = ctx._calls[0].body as Record; + expect(body).toHaveProperty('chat'); + expect((body.chat as Record).name).toBe('Test Chat'); + }); + + it('keeps sibling fields outside wrapper', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'create', + params: { + email: 'test@test.com', + additionalFields: { skipEmailNotify: true, firstName: 'John' }, + }, + }); + await runRouter(ctx); + const body = ctx._calls[0].body as Record; + expect(body).toHaveProperty('user'); + expect(body).toHaveProperty('skip_email_notify', true); + expect((body.user as Record)).toHaveProperty('first_name', 'John'); + expect((body.user as Record)).not.toHaveProperty('skip_email_notify'); + }); + + it('sends body without wrapper when no wrapperKey', async () => { + const ctx = createMockContext({ + resource: 'reaction', + operation: 'create', + params: { reactionsMessageId: 100, reactionsReactionCode: '👍', additionalFields: {} }, + }); + await runRouter(ctx); + const body = ctx._calls[0].body as Record; + expect(body).toHaveProperty('code', '👍'); + expect(body).not.toHaveProperty('reaction'); + }); +}); + +// ============================================================================ +// QUERY PARAMETER TESTS +// ============================================================================ + +describe('Query parameters', () => { + it('sends query params from queryMap', async () => { + const ctx = createMockContext({ + resource: 'customProperty', + operation: 'get', + params: { entityType: 'User' }, + }); + await runRouter(ctx); + expect(ctx._calls[0].qs).toEqual({ entity_type: 'User' }); + }); + + it('sends optional query params from additionalFields', async () => { + const ctx = createMockContext({ + resource: 'security', + operation: 'getAll', + params: { + returnAll: true, + additionalFields: { eventKey: 'login', actorType: 'user' }, + }, + }); + mockPaginatedResponse(ctx, [{ data: [{ id: 1 }] }]); + await runRouter(ctx); + const qs = ctx._calls[0].qs as Record; + expect(qs).toHaveProperty('event_key', 'login'); + expect(qs).toHaveProperty('actor_type', 'user'); + }); + + it('skips empty/null query params', async () => { + const ctx = createMockContext({ + resource: 'customProperty', + operation: 'get', + params: { entityType: '' }, + }); + // entityType is '' so should be skipped + ctx.getNodeParameter.mockImplementation((name: string, _index: number, defaultVal?: unknown) => { + if (name === 'resource') return 'customProperty'; + if (name === 'operation') return 'get'; + if (name === 'entityType') return ''; + if (defaultVal !== undefined) return defaultVal; + throw new Error(`Missing: ${name}`); + }); + await runRouter(ctx); + expect(ctx._calls[0].qs).toBeUndefined(); + }); +}); + +// ============================================================================ +// COMMA-TO-ARRAY CONVERSION +// ============================================================================ + +describe('Comma-to-array conversion', () => { + it('splits comma-separated IDs into integer array', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'create', + params: { chatName: 'Test', additionalFields: { memberIds: '1,2,3' } }, + }); + await runRouter(ctx); + const body = ctx._calls[0].body as any; + expect(body.chat.member_ids).toEqual([1, 2, 3]); + }); + + it('validates integer IDs and rejects invalid values', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'create', + params: { chatName: 'Test', additionalFields: { memberIds: '1,abc,3' } }, + }); + await expect(runRouter(ctx)).rejects.toThrow(/must be numbers/); + }); +}); + +// ============================================================================ +// fixedCollection subKey HANDLING +// ============================================================================ + +describe('fixedCollection subKey', () => { + it('extracts inner array from fixedCollection object', async () => { + const ctx = createMockContext({ + resource: 'task', + operation: 'create', + params: { + taskKind: 'task', + additionalFields: { + customProperties: { property: [{ id: 1, value: 'val1' }] }, + }, + }, + }); + await runRouter(ctx); + const body = ctx._calls[0].body as any; + expect(body.task.custom_properties).toEqual([{ id: 1, value: 'val1' }]); + }); +}); + +// ============================================================================ +// DELETE OPERATIONS +// ============================================================================ + +describe('DELETE operations', () => { + it('returns { success: true } for delete', async () => { + const ctx = createMockContext({ + resource: 'task', + operation: 'delete', + params: { id: 42 }, + }); + mockResponse(ctx, { statusCode: 204, body: {} }); + const result = await runRouter(ctx); + expect(result[0][0].json).toEqual({ success: true }); + }); +}); + +// ============================================================================ +// noDataWrapper OPERATIONS +// ============================================================================ + +describe('noDataWrapper operations', () => { + it('returns full response for export.get (no .data unwrap)', async () => { + const ctx = createMockContext({ + resource: 'export', + operation: 'get', + params: { id: 1 }, + }); + const rawResponse = { id: 1, status: 'completed', url: 'https://...' }; + ctx.helpers.httpRequestWithAuthentication.mockResolvedValue({ + statusCode: 200, + body: rawResponse, + }); + const result = await runRouter(ctx); + expect(result[0][0].json).toEqual(rawResponse); + }); +}); + +// ============================================================================ +// SPECIAL HANDLERS +// ============================================================================ + +describe('Special: messageButtons', () => { + it('calls buildButtonRows and includes buttons in body', async () => { + const spy = vi.spyOn(GenericFunctions, 'buildButtonRows').mockReturnValue([[{ text: 'Click' }]]); + const fileSpy = vi.spyOn(GenericFunctions, 'cleanFileAttachments').mockReturnValue([]); + + const ctx = createMockContext({ + resource: 'message', + operation: 'create', + params: { + entityType: 'discussion', + entityId: 1, + content: 'Hello', + additionalFields: {}, + }, + }); + await runRouter(ctx); + const body = ctx._calls[0].body as any; + expect(body.message.buttons).toEqual([[{ text: 'Click' }]]); + + spy.mockRestore(); + fileSpy.mockRestore(); + }); + + it('calls cleanFileAttachments and includes files in body', async () => { + const spy = vi.spyOn(GenericFunctions, 'buildButtonRows').mockReturnValue([]); + const fileSpy = vi.spyOn(GenericFunctions, 'cleanFileAttachments').mockReturnValue([ + { key: 'uploads/test.pdf', file_type: 'file' }, + ]); + + const ctx = createMockContext({ + resource: 'message', + operation: 'create', + params: { + entityType: 'discussion', + entityId: 1, + content: 'With file', + additionalFields: {}, + }, + }); + await runRouter(ctx); + const body = ctx._calls[0].body as any; + expect(body.message.files).toEqual([{ key: 'uploads/test.pdf', file_type: 'file' }]); + + spy.mockRestore(); + fileSpy.mockRestore(); + }); +}); + +describe('Special: formBlocks', () => { + it('calls resolveFormBlocksFromParams and includes blocks in body', async () => { + const spy = vi.spyOn(GenericFunctions, 'resolveFormBlocksFromParams').mockReturnValue([ + { type: 'header', text: 'Test' }, + ]); + + const ctx = createMockContext({ + resource: 'form', + operation: 'create', + params: { + formTitle: 'My Form', + type: 'modal', + triggerId: 'abc123', + additionalFields: {}, + }, + }); + await runRouter(ctx); + const body = ctx._calls[0].body as any; + expect(body.view.blocks).toEqual([{ type: 'header', text: 'Test' }]); + + spy.mockRestore(); + }); +}); + +describe('Special: botWebhook', () => { + it('nests webhookUrl inside webhook object', async () => { + const ctx = createMockContext({ + resource: 'bot', + operation: 'update', + params: { botId: 5, webhookUrl: 'https://example.com/webhook', additionalFields: {} }, + }); + await runRouter(ctx); + const body = ctx._calls[0].body as any; + expect(body.bot.webhook).toEqual({ outgoing_url: 'https://example.com/webhook' }); + }); +}); + +describe('Special: fileUpload', () => { + it('calls uploadFileToS3', async () => { + const spy = vi.spyOn(GenericFunctions, 'uploadFileToS3').mockResolvedValue({ + key: 'uploads/test.txt', + file_name: 'test.txt', + content_type: 'text/plain', + size: 100, + }); + + const ctx = createMockContext({ + resource: 'file', + operation: 'create', + params: { fileSource: 'binary', binaryProperty: 'data' }, + }); + const result = await runRouter(ctx); + expect(result[0][0].json).toHaveProperty('key', 'uploads/test.txt'); + expect(spy).toHaveBeenCalledTimes(1); + + spy.mockRestore(); + }); +}); + +describe('Special: formProcessSubmission', () => { + it('passes through input data without API call', async () => { + const inputData = { type: 'view_submission', payload: { values: { feedback: 'great' } } }; + const ctx = createMockContext({ + resource: 'form', + operation: 'processSubmission', + inputData: [inputData], + }); + const result = await runRouter(ctx); + expect(result[0][0].json).toEqual(inputData); + expect(ctx._calls).toHaveLength(0); // no API call made + }); +}); + +describe('Special: formGetTemplates', () => { + it('returns all templates without API call', async () => { + const ctx = createMockContext({ + resource: 'form', + operation: 'getTemplates', + }); + const result = await runRouter(ctx); + const templateNames = result[0].map((item) => item.json.name); + expect(templateNames).toContain('feedback'); + expect(templateNames).toContain('timeoff'); + expect(templateNames).toContain('survey'); + expect(templateNames).toContain('bug_report'); + expect(ctx._calls).toHaveLength(0); // no API call + }); +}); + +// ============================================================================ +// SIMPLIFY MODE +// ============================================================================ + +describe('Simplify mode', () => { + it('v2 GET single returns simplified item when simplify=true', async () => { + const ctx = createMockContext({ + resource: 'message', + operation: 'get', + nodeVersion: 2, + params: { id: 1, simplify: true }, + }); + ctx.helpers.httpRequestWithAuthentication.mockResolvedValue({ + statusCode: 200, + body: { + data: { + id: 1, entity_id: 10, chat_id: 5, content: 'Hi', user_id: 3, created_at: '2026-01-01', + updated_at: '2026-01-02', message_chat_id: 5, files: [], buttons: [], + }, + }, + }); + const result = await runRouter(ctx); + const json = result[0][0].json; + expect(json).toHaveProperty('id'); + expect(json).toHaveProperty('content'); + expect(json).not.toHaveProperty('updated_at'); + expect(json).not.toHaveProperty('files'); + expect(json).not.toHaveProperty('buttons'); + }); + + it('v1 GET single does NOT simplify even with simplify=true', async () => { + const ctx = createMockContext({ + resource: 'message', + operation: 'get', + nodeVersion: 1, + params: { id: 1, simplify: true }, + }); + ctx.helpers.httpRequestWithAuthentication.mockResolvedValue({ + statusCode: 200, + body: { + data: { + id: 1, entity_id: 10, chat_id: 5, content: 'Hi', user_id: 3, created_at: '2026-01-01', + updated_at: '2026-01-02', + }, + }, + }); + const result = await runRouter(ctx); + const json = result[0][0].json; + expect(json).toHaveProperty('updated_at'); // not simplified + }); +}); + +// ============================================================================ +// V1 COMPATIBILITY: RESOURCE MAPPING +// ============================================================================ + +describe('V1 resource mapping', () => { + it('maps v1 "customFields" to "customProperty"', async () => { + const ctx = createMockContext({ + resource: 'customFields', + operation: 'getCustomProperties', // v1 op name + nodeVersion: 1, + params: { entityType: 'User' }, + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/custom_properties'); + }); + + it('maps v1 "status" to "profile"', async () => { + const ctx = createMockContext({ + resource: 'status', + operation: 'getProfile', // v1 op name + nodeVersion: 1, + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/profile'); + }); + + it('maps v1 "reactions" to "reaction"', async () => { + const ctx = createMockContext({ + resource: 'reactions', + operation: 'addReaction', // v1 op name + nodeVersion: 1, + params: { reactionsMessageId: 100, reactionsReactionCode: '👍', additionalFields: {} }, + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/messages/100/reactions'); + }); +}); + +// ============================================================================ +// V1 COMPATIBILITY: OPERATION MAPPING +// ============================================================================ + +describe('V1 operation mapping', () => { + it('maps message "send" → "create"', async () => { + const ctx = createMockContext({ + resource: 'message', + operation: 'send', + nodeVersion: 1, + params: { + entityType: 'discussion', + entityId: 1, + content: 'Hello from v1', + additionalFields: {}, + }, + }); + vi.spyOn(GenericFunctions, 'buildButtonRows').mockReturnValue([]); + vi.spyOn(GenericFunctions, 'cleanFileAttachments').mockReturnValue([]); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('POST'); + expect(ctx._calls[0].url).toContain('/messages'); + vi.restoreAllMocks(); + }); + + it('maps message "getById" → "get"', async () => { + const ctx = createMockContext({ + resource: 'message', + operation: 'getById', + nodeVersion: 1, + params: { messageId: 42 }, + }); + ctx.getNodeParameter.mockImplementation((name: string, _index: number, defaultVal?: unknown) => { + if (name === 'resource') return 'message'; + if (name === 'operation') return 'getById'; + if (name === 'messageId') return 42; + if (name === 'id') throw new Error('Missing'); + if (defaultVal !== undefined) return defaultVal; + throw new Error(`Missing: ${name}`); + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/messages/42'); + }); + + it('maps chat "getById" → "get"', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'getById', + nodeVersion: 1, + params: { chatId: 55 }, + }); + ctx.getNodeParameter.mockImplementation((name: string, _index: number, defaultVal?: unknown) => { + if (name === 'resource') return 'chat'; + if (name === 'operation') return 'getById'; + if (name === 'chatId') return 55; + if (name === 'id') throw new Error('Missing'); + if (defaultVal !== undefined) return defaultVal; + throw new Error(`Missing: ${name}`); + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/chats/55'); + }); + + it('maps user "getById" → "get"', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getById', + nodeVersion: 1, + params: { userId: 77 }, + }); + ctx.getNodeParameter.mockImplementation((name: string, _index: number, defaultVal?: unknown) => { + if (name === 'resource') return 'user'; + if (name === 'operation') return 'getById'; + if (name === 'userId') return 77; + if (name === 'id') throw new Error('Missing'); + if (defaultVal !== undefined) return defaultVal; + throw new Error(`Missing: ${name}`); + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/users/77'); + }); + + it('maps profile "updateStatus" → "updateStatus" (via status→profile resource map)', async () => { + const ctx = createMockContext({ + resource: 'status', + operation: 'updateStatus', + nodeVersion: 1, + params: { statusEmoji: '🏖️', statusTitle: 'On vacation', additionalFields: {} }, + }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('PUT'); + expect(ctx._calls[0].url).toContain('/profile/status'); + const body = ctx._calls[0].body as any; + expect(body.status.emoji).toBe('🏖️'); + expect(body.status.title).toBe('On vacation'); + }); + + it('maps reaction "addReaction" → "create"', async () => { + const ctx = createMockContext({ + resource: 'reactions', + operation: 'addReaction', + nodeVersion: 1, + params: { reactionsMessageId: 100, reactionsReactionCode: '❤️', additionalFields: {} }, + }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('POST'); + expect(ctx._calls[0].url).toContain('/messages/100/reactions'); + }); + + it('maps file "upload" → "create"', async () => { + const spy = vi.spyOn(GenericFunctions, 'uploadFileToS3').mockResolvedValue({ + key: 'uploads/test.txt', file_name: 'test.txt', content_type: 'text/plain', size: 42, + }); + const ctx = createMockContext({ + resource: 'file', + operation: 'upload', + nodeVersion: 1, + params: { fileSource: 'binary', binaryProperty: 'data' }, + }); + const result = await runRouter(ctx); + expect(result[0][0].json).toHaveProperty('key', 'uploads/test.txt'); + spy.mockRestore(); + }); + + it('maps form "createView" → "create"', async () => { + const spy = vi.spyOn(GenericFunctions, 'resolveFormBlocksFromParams').mockReturnValue([]); + const ctx = createMockContext({ + resource: 'form', + operation: 'createView', + nodeVersion: 1, + params: { + formTitle: 'Test', + type: 'modal', + triggerId: 'xyz', + additionalFields: {}, + }, + }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('POST'); + expect(ctx._calls[0].url).toContain('/views/open'); + spy.mockRestore(); + }); + + it('maps thread "createThread" → "create"', async () => { + const ctx = createMockContext({ + resource: 'thread', + operation: 'createThread', + nodeVersion: 1, + params: { threadMessageId: 50 }, + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/messages/50/thread'); + }); + + it('maps thread "getThread" → "get"', async () => { + const ctx = createMockContext({ + resource: 'thread', + operation: 'getThread', + nodeVersion: 1, + params: { threadThreadId: 60 }, + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/threads/60'); + }); + + it('maps groupTag "getById" → "get"', async () => { + const ctx = createMockContext({ + resource: 'groupTag', + operation: 'getById', + nodeVersion: 1, + params: { groupTagId: 33 }, + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/group_tags/33'); + }); +}); + +// ============================================================================ +// V1 ALIAS OPERATIONS +// ============================================================================ + +describe('V1 alias operations (cross-resource)', () => { + it('chat.getMembers hits GET /chats/{id}/members', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'getMembers', + nodeVersion: 1, + params: { chatId: 10, returnAll: true }, + }); + mockPaginatedResponse(ctx, [{ data: [{ id: 1 }, { id: 2 }] }]); + const result = await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/chats/10/members'); + expect(result[0].length).toBe(2); + }); + + it('chat.addUsers hits POST /chats/{id}/members', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'addUsers', + nodeVersion: 1, + params: { chatId: 10, memberIds: '1,2,3', silent: false }, + }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('POST'); + expect(ctx._calls[0].url).toContain('/chats/10/members'); + const body = ctx._calls[0].body as any; + expect(body.member_ids).toEqual([1, 2, 3]); + }); + + it('chat.removeUser hits DELETE /chats/{id}/members/{userId}', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'removeUser', + nodeVersion: 1, + params: { chatId: 10, userId: 5 }, + }); + mockResponse(ctx, { statusCode: 204, body: {} }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('DELETE'); + expect(ctx._calls[0].url).toContain('/chats/10/members/5'); + }); + + it('chat.updateRole hits PUT /chats/{id}/members/{userId}', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'updateRole', + nodeVersion: 1, + params: { chatId: 10, userId: 5, newRole: 'admin' }, + }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('PUT'); + expect(ctx._calls[0].url).toContain('/chats/10/members/5'); + }); + + it('chat.leaveChat hits DELETE /chats/{id}/leave', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'leaveChat', + nodeVersion: 1, + params: { chatId: 10 }, + }); + mockResponse(ctx, { statusCode: 204, body: {} }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('DELETE'); + expect(ctx._calls[0].url).toContain('/chats/10/leave'); + }); + + it('message.getReadMembers hits GET /messages/{id}/read_member_ids', async () => { + const ctx = createMockContext({ + resource: 'message', + operation: 'getReadMembers', + nodeVersion: 1, + params: { messageId: 100, returnAll: true }, + }); + mockPaginatedResponse(ctx, [{ data: [{ id: 1 }] }]); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/messages/100/read_member_ids'); + }); + + it('message.unfurl hits POST /messages/{id}/link_previews', async () => { + const ctx = createMockContext({ + resource: 'message', + operation: 'unfurl', + nodeVersion: 1, + params: { messageId: 100, linkPreviews: [{ url: 'https://example.com' }] }, + }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('POST'); + expect(ctx._calls[0].url).toContain('/messages/100/link_previews'); + }); + + it('groupTag.addTags hits POST /chats/{id}/group_tags', async () => { + const ctx = createMockContext({ + resource: 'groupTag', + operation: 'addTags', + nodeVersion: 1, + params: { groupTagChatId: 10, groupTagIds: '1,2' }, + }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('POST'); + expect(ctx._calls[0].url).toContain('/chats/10/group_tags'); + }); + + it('groupTag.removeTag hits DELETE /chats/{id}/group_tags/{tagId}', async () => { + const ctx = createMockContext({ + resource: 'groupTag', + operation: 'removeTag', + nodeVersion: 1, + params: { groupTagChatId: 10, tagId: 5 }, + }); + mockResponse(ctx, { statusCode: 204, body: {} }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('DELETE'); + expect(ctx._calls[0].url).toContain('/chats/10/group_tags/5'); + }); +}); + +// ============================================================================ +// PAGINATION +// ============================================================================ + +describe('Pagination', () => { + it('fetches all pages when returnAll=true', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getAll', + params: { returnAll: true, query: 'test', additionalFields: {} }, + }); + mockPaginatedResponse(ctx, [ + { data: [{ id: 1 }, { id: 2 }], nextCursor: 'cursor1' }, + { data: [{ id: 3 }] }, + ]); + const result = await runRouter(ctx); + expect(result[0]).toHaveLength(3); + }); + + it('limits results when returnAll=false', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getAll', + params: { returnAll: false, limit: 2, query: 'test', additionalFields: {} }, + }); + mockPaginatedResponse(ctx, [ + { data: [{ id: 1 }, { id: 2 }, { id: 3 }] }, + ]); + const result = await runRouter(ctx); + expect(result[0]).toHaveLength(2); + }); +}); + +// ============================================================================ +// ROUTES TABLE VALIDATION +// ============================================================================ + +describe('ROUTES table completeness', () => { + // Verify all expected resources exist + const expectedResources = [ + 'security', 'bot', 'chat', 'member', 'groupTag', 'message', + 'linkPreview', 'reaction', 'readMember', 'thread', 'profile', + 'search', 'task', 'user', 'form', 'export', 'customProperty', 'file', + ]; + + for (const res of expectedResources) { + it(`should have resource "${res}" in ROUTES`, async () => { + // We test this indirectly by trying to route to a known operation + // If the resource exists, router won't throw "Unknown operation" for valid ops + // We just verify the resource name appears in Router.ts + const routerContent = await import('fs').then((fs) => + fs.readFileSync(require('path').resolve(__dirname, '../nodes/Pachca/SharedRouter.ts'), 'utf-8'), + ); + expect(routerContent).toContain(`\t${res}: {`); + }); + } +}); + +// ============================================================================ +// MULTI-ITEM PROCESSING +// ============================================================================ + +describe('Multi-item processing', () => { + it('processes multiple input items', async () => { + const ctx = createMockContext({ + resource: 'profile', + operation: 'get', + inputData: [{}, {}, {}], // 3 items + }); + const result = await runRouter(ctx); + expect(result[0]).toHaveLength(3); + expect(result[0][0]).toHaveProperty('pairedItem', { item: 0 }); + expect(result[0][1]).toHaveProperty('pairedItem', { item: 1 }); + expect(result[0][2]).toHaveProperty('pairedItem', { item: 2 }); + }); + + it('continues processing on error with continueOnFail', async () => { + let callCount = 0; + const ctx = createMockContext({ + resource: 'profile', + operation: 'get', + inputData: [{}, {}], + continueOnFail: true, + }); + ctx.helpers.httpRequestWithAuthentication.mockImplementation(async () => { + callCount++; + if (callCount === 1) { + return { statusCode: 500, body: { message: 'Internal error' } }; + } + return { statusCode: 200, body: { data: { id: 1 } } }; + }); + const result = await runRouter(ctx); + expect(result[0]).toHaveLength(2); + expect(result[0][0].json).toHaveProperty('error'); // first failed + expect(result[0][1].json).toHaveProperty('id', 1); // second succeeded + }); +}); + +// ============================================================================ +// RESOURCE-SPECIFIC OPERATION TESTS +// ============================================================================ + +describe('Resource operations', () => { + it('chat.create sends correct body structure', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'create', + params: { + chatName: 'Dev Team', + additionalFields: { channel: true, public: false, memberIds: '1,2' }, + }, + }); + await runRouter(ctx); + const body = ctx._calls[0].body as any; + expect(body.chat.name).toBe('Dev Team'); + expect(body.chat.channel).toBe(true); + expect(body.chat.public).toBe(false); + expect(body.chat.member_ids).toEqual([1, 2]); + }); + + it('chat.archive hits PUT /chats/{id}/archive', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'archive', + params: { id: { __rl: true, value: 10, mode: 'id' } }, + }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('PUT'); + expect(ctx._calls[0].url).toContain('/chats/10/archive'); + }); + + it('chat.unarchive hits PUT /chats/{id}/unarchive', async () => { + const ctx = createMockContext({ + resource: 'chat', + operation: 'unarchive', + params: { id: { __rl: true, value: 10, mode: 'id' } }, + }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('PUT'); + expect(ctx._calls[0].url).toContain('/chats/10/unarchive'); + }); + + it('message.pin hits POST /messages/{id}/pin', async () => { + const ctx = createMockContext({ + resource: 'message', + operation: 'pin', + params: { id: 42 }, + }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('POST'); + expect(ctx._calls[0].url).toContain('/messages/42/pin'); + }); + + it('message.unpin hits DELETE /messages/{id}/pin', async () => { + const ctx = createMockContext({ + resource: 'message', + operation: 'unpin', + params: { id: 42 }, + }); + mockResponse(ctx, { statusCode: 204, body: {} }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('DELETE'); + expect(ctx._calls[0].url).toContain('/messages/42/pin'); + }); + + it('profile.getInfo hits GET /oauth/token/info', async () => { + const ctx = createMockContext({ + resource: 'profile', + operation: 'getInfo', + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/oauth/token/info'); + }); + + it('profile.getStatus hits GET /profile/status', async () => { + const ctx = createMockContext({ + resource: 'profile', + operation: 'getStatus', + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/profile/status'); + }); + + it('profile.deleteStatus hits DELETE /profile/status', async () => { + const ctx = createMockContext({ + resource: 'profile', + operation: 'deleteStatus', + }); + mockResponse(ctx, { statusCode: 204, body: {} }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('DELETE'); + expect(ctx._calls[0].url).toContain('/profile/status'); + }); + + it('export.create sends correct body without wrapper', async () => { + const ctx = createMockContext({ + resource: 'export', + operation: 'create', + params: { + startAt: '2026-01-01', + endAt: '2026-01-31', + webhookUrl: 'https://example.com', + additionalFields: {}, + }, + }); + await runRouter(ctx); + const body = ctx._calls[0].body as any; + expect(body.start_at).toBe('2026-01-01'); + expect(body.end_at).toBe('2026-01-31'); + expect(body.webhook_url).toBe('https://example.com'); + // No wrapper key for export + expect(body).not.toHaveProperty('export'); + }); + + it('linkPreview.create sends body to correct endpoint', async () => { + const ctx = createMockContext({ + resource: 'linkPreview', + operation: 'create', + params: { id: 42, linkPreviews: [{ url: 'https://example.com', title: 'Example' }] }, + }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('POST'); + expect(ctx._calls[0].url).toContain('/messages/42/link_previews'); + }); + + it('groupTag.create wraps in group_tag key', async () => { + const ctx = createMockContext({ + resource: 'groupTag', + operation: 'create', + params: { groupTagName: 'Engineers' }, + }); + await runRouter(ctx); + const body = ctx._calls[0].body as any; + expect(body.group_tag.name).toBe('Engineers'); + }); + + it('user.getStatus hits correct endpoint', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getStatus', + params: { userId: 42 }, + }); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/users/42/status'); + }); + + it('reaction.delete sends code as query param', async () => { + const ctx = createMockContext({ + resource: 'reaction', + operation: 'delete', + params: { reactionsMessageId: 100, reactionsReactionCode: '👍', name: '' }, + }); + mockResponse(ctx, { statusCode: 204, body: {} }); + await runRouter(ctx); + expect(ctx._calls[0].method).toBe('DELETE'); + expect(ctx._calls[0].url).toContain('/messages/100/reactions'); + expect(ctx._calls[0].qs).toHaveProperty('code', '👍'); + }); + + it('search.getAllChats sends query', async () => { + const ctx = createMockContext({ + resource: 'search', + operation: 'getAllChats', + params: { returnAll: false, limit: 10, query: 'dev', additionalFields: {} }, + }); + mockPaginatedResponse(ctx, [{ data: [{ id: 1, name: 'dev-team' }] }]); + await runRouter(ctx); + expect(ctx._calls[0].url).toContain('/search/chats'); + expect(ctx._calls[0].qs).toHaveProperty('query', 'dev'); + }); +}); + +// ============================================================================ +// BUG FIX REGRESSION TESTS +// ============================================================================ + +describe('BUG 1: v1 user.getAll reads query from additionalOptions', () => { + it('sends query param when stored in additionalOptions (v1 compat)', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getAll', + nodeVersion: 1, + params: { + returnAll: false, + limit: 10, + additionalOptions: { query: 'john' }, + }, + }); + mockPaginatedResponse(ctx, [{ data: [{ id: 1, first_name: 'John' }] }]); + await runRouter(ctx); + expect(ctx._calls[0].qs).toHaveProperty('query', 'john'); + }); + + it('sends query param from top-level (v2)', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getAll', + nodeVersion: 2, + params: { + returnAll: false, + limit: 10, + query: 'jane', + additionalFields: {}, + }, + }); + mockPaginatedResponse(ctx, [{ data: [{ id: 2, first_name: 'Jane' }] }]); + await runRouter(ctx); + expect(ctx._calls[0].qs).toHaveProperty('query', 'jane'); + }); +}); + +describe('BUG 2: v1 user.getAll applies filterOptions client-side', () => { + it('filters by role', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getAll', + nodeVersion: 1, + params: { + returnAll: true, + additionalOptions: {}, + filterOptions: { filterRole: ['admin'] }, + }, + }); + mockPaginatedResponse(ctx, [{ data: [ + { id: 1, role: 'admin', bot: false, suspended: false }, + { id: 2, role: 'user', bot: false, suspended: false }, + { id: 3, role: 'admin', bot: false, suspended: false }, + ] }]); + const result = await runRouter(ctx); + expect(result[0]).toHaveLength(2); + expect(result[0].map(r => r.json.id)).toEqual([1, 3]); + }); + + it('filters bots only', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getAll', + nodeVersion: 1, + params: { + returnAll: true, + additionalOptions: {}, + filterOptions: { filterBot: 'bots' }, + }, + }); + mockPaginatedResponse(ctx, [{ data: [ + { id: 1, bot: true, role: 'user', suspended: false }, + { id: 2, bot: false, role: 'user', suspended: false }, + ] }]); + const result = await runRouter(ctx); + expect(result[0]).toHaveLength(1); + expect(result[0][0].json.id).toBe(1); + }); + + it('filters users only (excludes bots)', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getAll', + nodeVersion: 1, + params: { + returnAll: true, + additionalOptions: {}, + filterOptions: { filterBot: 'users' }, + }, + }); + mockPaginatedResponse(ctx, [{ data: [ + { id: 1, bot: true, role: 'user', suspended: false }, + { id: 2, bot: false, role: 'user', suspended: false }, + ] }]); + const result = await runRouter(ctx); + expect(result[0]).toHaveLength(1); + expect(result[0][0].json.id).toBe(2); + }); + + it('filters suspended only', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getAll', + nodeVersion: 1, + params: { + returnAll: true, + additionalOptions: {}, + filterOptions: { filterSuspended: 'suspended' }, + }, + }); + mockPaginatedResponse(ctx, [{ data: [ + { id: 1, suspended: true, role: 'user', bot: false }, + { id: 2, suspended: false, role: 'user', bot: false }, + ] }]); + const result = await runRouter(ctx); + expect(result[0]).toHaveLength(1); + expect(result[0][0].json.id).toBe(1); + }); + + it('filters active only', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getAll', + nodeVersion: 1, + params: { + returnAll: true, + additionalOptions: {}, + filterOptions: { filterSuspended: 'active' }, + }, + }); + mockPaginatedResponse(ctx, [{ data: [ + { id: 1, suspended: true, role: 'user', bot: false }, + { id: 2, suspended: false, role: 'user', bot: false }, + ] }]); + const result = await runRouter(ctx); + expect(result[0]).toHaveLength(1); + expect(result[0][0].json.id).toBe(2); + }); + + it('filters by invite_status', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getAll', + nodeVersion: 1, + params: { + returnAll: true, + additionalOptions: {}, + filterOptions: { filterInviteStatus: ['confirmed'] }, + }, + }); + mockPaginatedResponse(ctx, [{ data: [ + { id: 1, invite_status: 'confirmed', role: 'user', bot: false, suspended: false }, + { id: 2, invite_status: 'sent', role: 'user', bot: false, suspended: false }, + ] }]); + const result = await runRouter(ctx); + expect(result[0]).toHaveLength(1); + expect(result[0][0].json.id).toBe(1); + }); + + it('does NOT apply filters in v2 mode', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getAll', + nodeVersion: 2, + params: { + returnAll: true, + additionalFields: {}, + }, + }); + mockPaginatedResponse(ctx, [{ data: [ + { id: 1, role: 'admin' }, + { id: 2, role: 'user' }, + ] }]); + const result = await runRouter(ctx); + expect(result[0]).toHaveLength(2); // no filtering + }); + + it('combines multiple filters', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'getAll', + nodeVersion: 1, + params: { + returnAll: true, + additionalOptions: {}, + filterOptions: { filterRole: ['admin'], filterSuspended: 'active' }, + }, + }); + mockPaginatedResponse(ctx, [{ data: [ + { id: 1, role: 'admin', suspended: false, bot: false }, + { id: 2, role: 'admin', suspended: true, bot: false }, + { id: 3, role: 'user', suspended: false, bot: false }, + ] }]); + const result = await runRouter(ctx); + expect(result[0]).toHaveLength(1); + expect(result[0][0].json.id).toBe(1); + }); +}); diff --git a/integrations/n8n/tests/routes-spec.test.ts b/integrations/n8n/tests/routes-spec.test.ts new file mode 100644 index 00000000..3f5a53c7 --- /dev/null +++ b/integrations/n8n/tests/routes-spec.test.ts @@ -0,0 +1,507 @@ +import { describe, it, expect, beforeAll } from 'vitest'; +import * as fs from 'fs'; +import * as path from 'path'; +import { parseOpenAPI, resolveAllOf } from '@pachca/openapi-parser'; +import type { Endpoint, Schema } from '@pachca/openapi-parser'; +import { getWrapperKey } from '../scripts/utils'; + +// ============================================================================ +// SETUP: Paths +// ============================================================================ + +const ROOT = path.resolve(__dirname, '../../..'); +const SPEC_PATH = path.join(ROOT, 'packages/spec/openapi.yaml'); +const ROUTER_PATH = path.resolve(__dirname, '../nodes/Pachca/SharedRouter.ts'); + +// ============================================================================ +// Mapping tables (mirrored from generate-n8n.ts / contract.test.ts) +// ============================================================================ + +const TAG_TO_RESOURCE: Record = { + 'Users': 'user', + 'Messages': 'message', + 'Chats': 'chat', + 'Members': 'member', + 'Threads': 'thread', + 'Reactions': 'reaction', + 'Group tags': 'groupTag', + 'Profile': 'profile', + 'Common': 'common', + 'Tasks': 'task', + 'Bots': 'bot', + 'Views': 'form', + 'Read members': 'readMember', + 'Link Previews': 'linkPreview', + 'Search': 'search', + 'Security': 'security', +}; + +function tagToResource(tag: string): string { + return TAG_TO_RESOURCE[tag] || tag.toLowerCase().replace(/s$/, ''); +} + +const STANDARD_CRUD_SUBRESOURCES = new Set(['reaction', 'member', 'readMember', 'linkPreview', 'thread', 'export']); + +function snakeToCamel(s: string): string { + return s.replace(/_([a-z])/g, (_, c) => c.toUpperCase()); +} + +function snakeToPascal(s: string): string { + const camel = snakeToCamel(s); + return camel.charAt(0).toUpperCase() + camel.slice(1); +} + +function endpointToOperation(ep: Endpoint, resource: string): string { + const method = ep.method; + const segments = ep.path.split('/').filter(Boolean); + const staticSegments = segments.filter(s => !s.startsWith('{')); + const lastStatic = staticSegments[staticSegments.length - 1]; + const hasTrailingParam = segments[segments.length - 1]?.startsWith('{') && staticSegments.length > 1; + + if (lastStatic === 'pin') return method === 'POST' ? 'pin' : 'unpin'; + if (lastStatic === 'archive') return 'archive'; + if (lastStatic === 'unarchive') return 'unarchive'; + if (lastStatic === 'leave') return 'leave'; + if (ep.path === '/views/open' && method === 'POST') return 'create'; + + if (staticSegments.length > 1) { + const resourceRoot = staticSegments[0]; + if (lastStatic !== resourceRoot) { + const lastStaticCamel = snakeToCamel(lastStatic); + const resourcePlural = resource.endsWith('y') ? resource.slice(0, -1) + 'ies' : resource + 's'; + if (STANDARD_CRUD_SUBRESOURCES.has(resource) && (lastStaticCamel === resourcePlural || lastStaticCamel === resource)) { + if (hasTrailingParam) { + if (method === 'DELETE') return 'delete'; + if (method === 'PUT' || method === 'PATCH') return 'update'; + return 'get'; + } + if (method === 'GET') return 'getAll'; + if (method === 'POST') return 'create'; + if (method === 'PUT') return 'update'; + if (method === 'DELETE') return 'delete'; + } + + const subName = snakeToPascal(lastStatic); + if (hasTrailingParam) { + if (method === 'DELETE') return `remove${subName}`; + if (method === 'PUT' || method === 'PATCH') return `update${subName}`; + return `get${subName}`; + } + if (method === 'GET') { + const hasCursor = ep.parameters.some(p => p.in === 'query' && p.name === 'cursor'); + return hasCursor ? `getAll${subName}` : `get${subName}`; + } + if (method === 'POST') return `add${subName}`; + if (method === 'PUT') return `update${subName}`; + if (method === 'DELETE') return `delete${subName}`; + } + } + + if (method === 'GET' && !segments.some(s => s.startsWith('{'))) { + const hasCursor = ep.parameters.some(p => p.in === 'query' && p.name === 'cursor'); + return hasCursor ? 'getAll' : 'get'; + } + if (method === 'GET') return 'get'; + if (method === 'POST') return 'create'; + if (method === 'PUT' || method === 'PATCH') return 'update'; + if (method === 'DELETE') return 'delete'; + + return 'execute'; +} + +/** Endpoints intentionally not covered by the n8n node */ +const INTENTIONALLY_SKIPPED = new Set([ + 'POST /direct_url', // low-level S3 upload, handled internally +]); + +// V1 alias operations that exist in ROUTES but NOT in the spec (they are +// duplicates of v2 sub-resource operations kept for backward compatibility) +const V1_ALIAS_OPS: Record = { + message: ['getReadMembers', 'unfurl'], + chat: ['getMembers', 'addUsers', 'removeUser', 'updateRole', 'leaveChat'], + groupTag: ['addTags', 'removeTag'], +}; + +// Special operations that don't map directly to an API endpoint +const SPECIAL_NON_API_OPS = new Set([ + 'form.processSubmission', + 'form.getTemplates', +]); + +// ============================================================================ +// HELPERS: Parse OpenAPI spec +// ============================================================================ + +interface SpecOperation { + resource: string; + v2Op: string; + endpoint: Endpoint; + hasPagination: boolean; + wrapperKey: string | null; +} + +function groupEndpointsByTag(endpoints: Endpoint[]): Map { + const groups = new Map(); + for (const endpoint of endpoints) { + const tag = endpoint.tags[0] || 'Common'; + if (!groups.has(tag)) groups.set(tag, []); + groups.get(tag)!.push(endpoint); + } + return groups; +} + +function resolveCommonEndpoints(byTag: Map): Map { + const common = byTag.get('Common') ?? []; + const result = new Map(byTag); + result.delete('Common'); + for (const ep of common) { + if (ep.path.startsWith('/custom_properties')) { + const tag = 'CustomProperty'; + if (!result.has(tag)) result.set(tag, []); + result.get(tag)!.push(ep); + } else if (ep.path.startsWith('/uploads')) { + const tag = 'File'; + if (!result.has(tag)) result.set(tag, []); + result.get(tag)!.push(ep); + } else if (ep.path.startsWith('/chats/exports')) { + const tag = 'Export'; + if (!result.has(tag)) result.set(tag, []); + result.get(tag)!.push(ep); + } else { + if (!result.has('Common')) result.set('Common', []); + result.get('Common')!.push(ep); + } + } + return result; +} + +function getSpecOperations(): SpecOperation[] { + const api = parseOpenAPI(SPEC_PATH); + let byTag = groupEndpointsByTag(api.endpoints); + byTag = resolveCommonEndpoints(byTag); + + const operations: SpecOperation[] = []; + + for (const [tag, endpoints] of byTag) { + const resource = tag === 'CustomProperty' ? 'customProperty' + : tag === 'File' ? 'file' + : tag === 'Export' ? 'export' + : tagToResource(tag); + if (resource === 'common') continue; + + for (const ep of endpoints) { + const key = `${ep.method} ${ep.path}`; + if (INTENTIONALLY_SKIPPED.has(key)) continue; + + const v2Op = endpointToOperation(ep, resource); + const queryParams = ep.parameters.filter(p => p.in === 'query'); + const hasPagination = queryParams.some(p => p.name === 'cursor'); + const wrapperKey = getWrapperKey(ep.requestBody); + + operations.push({ resource, v2Op, endpoint: ep, hasPagination, wrapperKey }); + } + } + + return operations; +} + +// ============================================================================ +// HELPERS: Parse ROUTES table from Router.ts +// ============================================================================ + +interface ParsedRoute { + resource: string; + operation: string; + method: string; + path: string; + paginated: boolean; + wrapperKey: string | null; + special: string | null; +} + +function parseRoutesFromFile(): ParsedRoute[] { + const content = fs.readFileSync(ROUTER_PATH, 'utf-8'); + + // Extract the ROUTES block: starts with `const ROUTES: Record<...> = {` + // and ends before `// ===...` section (Router Entry Point) + const routesStart = content.indexOf('const ROUTES: Record<'); + if (routesStart === -1) throw new Error('Could not find ROUTES table in Router.ts'); + + const routesSection = content.slice(routesStart); + // Find the closing `};` of the ROUTES object — it's followed by the Router section + const routerSectionIdx = routesSection.indexOf('\n// ============================================================================\n// Router Entry Point'); + const routesBlock = routerSectionIdx !== -1 + ? routesSection.slice(0, routerSectionIdx) + : routesSection; + + const routes: ParsedRoute[] = []; + + // Parse resource blocks: top-level keys like `security: {`, `bot: {`, etc. + // Match: : { ... at top level (one tab indent) + const resourceRegex = /^\t(\w+): \{$/gm; + let resourceMatch: RegExpExecArray | null; + + while ((resourceMatch = resourceRegex.exec(routesBlock)) !== null) { + const resource = resourceMatch[1]; + const resourceStart = resourceMatch.index + resourceMatch[0].length; + + // Find the end of this resource block by tracking brace depth + let depth = 1; + let pos = resourceStart; + while (pos < routesBlock.length && depth > 0) { + if (routesBlock[pos] === '{') depth++; + if (routesBlock[pos] === '}') depth--; + pos++; + } + const resourceBody = routesBlock.slice(resourceStart, pos - 1); + + // Parse operation blocks within the resource: `: {` + const opRegex = /^\t\t(\w+): \{$/gm; + let opMatch: RegExpExecArray | null; + + while ((opMatch = opRegex.exec(resourceBody)) !== null) { + const operation = opMatch[1]; + const opStart = opMatch.index + opMatch[0].length; + + // Find the end of this operation block + let opDepth = 1; + let opPos = opStart; + while (opPos < resourceBody.length && opDepth > 0) { + if (resourceBody[opPos] === '{') opDepth++; + if (resourceBody[opPos] === '}') opDepth--; + opPos++; + } + const opBody = resourceBody.slice(opStart, opPos - 1); + + // Extract method + const methodMatch = opBody.match(/method: '([A-Z]+)'/); + const method = methodMatch?.[1] ?? ''; + + // Extract path + const pathMatch = opBody.match(/path: '([^']+)'/); + const routePath = pathMatch?.[1] ?? ''; + + // Extract paginated + const paginated = /paginated: true/.test(opBody); + + // Extract wrapperKey + const wrapperKeyMatch = opBody.match(/wrapperKey: '([^']+)'/); + const wrapperKey = wrapperKeyMatch?.[1] ?? null; + + // Extract special + const specialMatch = opBody.match(/special: '([^']+)'/); + const special = specialMatch?.[1] ?? null; + + routes.push({ resource, operation, method, path: routePath, paginated, wrapperKey, special }); + } + } + + return routes; +} + +// ============================================================================ +// Build a lookup from parsed routes +// ============================================================================ + +function buildRoutesMap(routes: ParsedRoute[]): Map { + const map = new Map(); + for (const route of routes) { + map.set(`${route.resource}.${route.operation}`, route); + } + return map; +} + +// ============================================================================ +// Normalize OpenAPI path to match ROUTES path format +// ============================================================================ + +/** + * OpenAPI paths use `{param_name}` notation, ROUTES may use the same or + * slightly different param names. We normalize both to compare the URL + * structure by replacing all `{...}` segments with a placeholder. + */ +function normalizePath(p: string): string { + return p.replace(/\{[^}]+\}/g, '{*}'); +} + +// ============================================================================ +// TESTS +// ============================================================================ + +let specOps: SpecOperation[]; +let parsedRoutes: ParsedRoute[]; +let routesMap: Map; + +beforeAll(() => { + specOps = getSpecOperations(); + parsedRoutes = parseRoutesFromFile(); + routesMap = buildRoutesMap(parsedRoutes); +}); + +describe('ROUTES table vs OpenAPI spec', () => { + describe('every spec endpoint has a ROUTES entry', () => { + it('all OpenAPI endpoints should exist in ROUTES', () => { + const missing: string[] = []; + + for (const spec of specOps) { + const key = `${spec.resource}.${spec.v2Op}`; + if (!routesMap.has(key)) { + missing.push(`${key} (${spec.endpoint.method} ${spec.endpoint.path})`); + } + } + + expect(missing, `Missing ROUTES entries:\n${missing.join('\n')}`).toEqual([]); + }); + }); + + describe('HTTP methods match', () => { + it('each ROUTES entry should have the correct HTTP method from spec', () => { + const mismatches: string[] = []; + + for (const spec of specOps) { + const key = `${spec.resource}.${spec.v2Op}`; + const route = routesMap.get(key); + if (!route) continue; + + // Skip special-only operations whose method/path are placeholders + if (SPECIAL_NON_API_OPS.has(key)) continue; + if (route.special === 'fileUpload') continue; + + const expectedMethod = spec.endpoint.method.toUpperCase(); + if (route.method !== expectedMethod) { + mismatches.push( + `${key}: ROUTES has ${route.method}, spec has ${expectedMethod}`, + ); + } + } + + expect(mismatches, `Method mismatches:\n${mismatches.join('\n')}`).toEqual([]); + }); + }); + + describe('URL paths match', () => { + it('each ROUTES entry should have the correct URL path structure from spec', () => { + const mismatches: string[] = []; + + for (const spec of specOps) { + const key = `${spec.resource}.${spec.v2Op}`; + const route = routesMap.get(key); + if (!route) continue; + + // Skip special-only operations whose path is a placeholder + if (SPECIAL_NON_API_OPS.has(key)) continue; + if (route.special === 'fileUpload') continue; + + const normalizedRoute = normalizePath(route.path); + const normalizedSpec = normalizePath(spec.endpoint.path); + + if (normalizedRoute !== normalizedSpec) { + mismatches.push( + `${key}: ROUTES has "${route.path}" (normalized: "${normalizedRoute}"), spec has "${spec.endpoint.path}" (normalized: "${normalizedSpec}")`, + ); + } + } + + expect(mismatches, `Path mismatches:\n${mismatches.join('\n')}`).toEqual([]); + }); + }); + + describe('pagination flags match', () => { + it('paginated spec endpoints should have paginated: true in ROUTES', () => { + const mismatches: string[] = []; + + for (const spec of specOps) { + const key = `${spec.resource}.${spec.v2Op}`; + const route = routesMap.get(key); + if (!route) continue; + + if (SPECIAL_NON_API_OPS.has(key)) continue; + if (route.special === 'fileUpload') continue; + + if (spec.hasPagination && !route.paginated) { + mismatches.push(`${key}: spec is paginated but ROUTES missing paginated: true`); + } + if (!spec.hasPagination && route.paginated) { + mismatches.push(`${key}: ROUTES has paginated: true but spec has no cursor param`); + } + } + + expect(mismatches, `Pagination mismatches:\n${mismatches.join('\n')}`).toEqual([]); + }); + }); + + describe('wrapperKey matches', () => { + it('body-wrapped spec endpoints should have the correct wrapperKey in ROUTES', () => { + const mismatches: string[] = []; + + for (const spec of specOps) { + const key = `${spec.resource}.${spec.v2Op}`; + const route = routesMap.get(key); + if (!route) continue; + + if (SPECIAL_NON_API_OPS.has(key)) continue; + if (route.special === 'fileUpload') continue; + + // noDataWrapper routes intentionally skip the wrapper + if (route.wrapperKey === null && spec.wrapperKey !== null) { + // Check if noDataWrapper is set — if so, the route intentionally omits the wrapper + // We need to re-check from the parsed route; noDataWrapper means body is sent flat + const fullRoute = parsedRoutes.find(r => r.resource === spec.resource && r.operation === spec.v2Op); + if (fullRoute) { + // Read Router.ts to check noDataWrapper — but we already parsed the fields we need + // For simplicity, skip noDataWrapper routes (export resource) + if (spec.resource === 'export') continue; + } + mismatches.push( + `${key}: spec has wrapperKey "${spec.wrapperKey}" but ROUTES has none`, + ); + } + if (route.wrapperKey !== null && spec.wrapperKey === null) { + mismatches.push( + `${key}: ROUTES has wrapperKey "${route.wrapperKey}" but spec has no wrapper`, + ); + } + if (route.wrapperKey !== null && spec.wrapperKey !== null && route.wrapperKey !== spec.wrapperKey) { + mismatches.push( + `${key}: ROUTES has wrapperKey "${route.wrapperKey}", spec has "${spec.wrapperKey}"`, + ); + } + } + + expect(mismatches, `WrapperKey mismatches:\n${mismatches.join('\n')}`).toEqual([]); + }); + }); + + describe('no orphan routes', () => { + it('every ROUTES entry should correspond to a spec endpoint, a v1 alias, or a special handler', () => { + const specKeys = new Set(specOps.map(s => `${s.resource}.${s.v2Op}`)); + + // Build set of all known v1 alias keys + const v1AliasKeys = new Set(); + for (const [resource, ops] of Object.entries(V1_ALIAS_OPS)) { + for (const op of ops) { + v1AliasKeys.add(`${resource}.${op}`); + } + } + + const orphans: string[] = []; + + for (const route of parsedRoutes) { + const key = `${route.resource}.${route.operation}`; + + // Skip if it matches a spec endpoint + if (specKeys.has(key)) continue; + + // Skip if it's a known v1 alias operation + if (v1AliasKeys.has(key)) continue; + + // Skip if it's a special non-API operation + if (SPECIAL_NON_API_OPS.has(key)) continue; + + orphans.push(`${key} (${route.method} ${route.path})`); + } + + expect(orphans, `Orphan ROUTES entries:\n${orphans.join('\n')}`).toEqual([]); + }); + }); +}); diff --git a/integrations/n8n/tsconfig.json b/integrations/n8n/tsconfig.json new file mode 100644 index 00000000..0a04b270 --- /dev/null +++ b/integrations/n8n/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "es2019", + "module": "commonjs", + "moduleResolution": "node", + "strict": true, + "strictNullChecks": true, + "noImplicitAny": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "outDir": "./dist/", + "declaration": true, + "sourceMap": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true + }, + "include": [ + "credentials/**/*", + "nodes/**/*", + "nodes/**/*.json" + ], + "exclude": [ + "node_modules", + "dist", + "scripts", + "tests", + "e2e" + ] +} diff --git a/package.json b/package.json index 7e37c22d..c4f50482 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,11 @@ "apps/*", "apps/*/*", "packages/*", - "sdk/*" + "sdk/*", + "integrations/*" ], "devDependencies": { - "turbo": "^2.8.1" + "turbo": "^2.8.1", + "@playwright/test": "^1.50.0" } } diff --git a/packages/generator/src/lang/csharp.ts b/packages/generator/src/lang/csharp.ts index 95fdfcfc..69e4ae9f 100644 --- a/packages/generator/src/lang/csharp.ts +++ b/packages/generator/src/lang/csharp.ts @@ -149,7 +149,7 @@ function queryParamValueExpr(p: IRParam): string { return `PachcaUtils.EnumToApiString(${paramName}${valueSuffix})`; if (p.type.kind === 'primitive' && p.type.primitive === 'string') return paramName; - return `${paramName}${valueSuffix}.ToString()`; + return `${paramName}${valueSuffix}.ToString()!`; } /** Check if ApiError model exists in IR */ @@ -402,6 +402,7 @@ function generateUtils(): string { return `#nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; @@ -778,11 +779,11 @@ function emitMethodBody( if (p.isArray) { if (p.required) { lines.push(`${indent2}foreach (var item in ${paramName})`); - lines.push(`${indent2} queryParts.Add($"${paramKey}={Uri.EscapeDataString(item.ToString())}");`); + lines.push(`${indent2} queryParts.Add($"${paramKey}={Uri.EscapeDataString(item.ToString()!)}");`); } else { lines.push(`${indent2}if (${paramName} != null)`); lines.push(`${indent2} foreach (var item in ${paramName})`); - lines.push(`${indent2} queryParts.Add($"${paramKey}={Uri.EscapeDataString(item.ToString())}");`); + lines.push(`${indent2} queryParts.Add($"${paramKey}={Uri.EscapeDataString(item.ToString()!)}");`); } } else { const valueExpr = queryParamValueExpr(p); @@ -1016,7 +1017,11 @@ function csLiteral( return `${ft.example}d`; } if (ft.primitive === 'boolean' && typeof ft.example === 'boolean') return String(ft.example); - if (ft.primitive === 'string' && typeof ft.example === 'string') return `"${ft.example}"`; + if (ft.primitive === 'string' && typeof ft.example === 'string') { + if (ft.format === 'date-time') return `DateTimeOffset.Parse(${JSON.stringify(ft.example)})`; + if (ft.format === 'date') return `DateOnly.Parse(${JSON.stringify(ft.example)})`; + return JSON.stringify(ft.example); + } } if (ft.kind === 'enum' && typeof ft.example === 'string') { const e = ir.enums.find((en) => en.name === ft.ref); @@ -1032,7 +1037,7 @@ function csLiteral( if (ft.primitive === 'any') return 'new object()'; if (ft.primitive === 'string') { if (ft.format === 'date-time') return 'DateTimeOffset.UtcNow'; - if (ft.format === 'date') return '"2024-01-01"'; + if (ft.format === 'date') return 'DateOnly.Parse("2024-01-01")'; } return '"example"'; } @@ -1062,7 +1067,7 @@ function csLiteral( return `default(${ft.ref ?? 'object'})!`; } case 'literal': - return `"${ft.literalValue}"`; + return JSON.stringify(ft.literalValue); case 'binary': return 'Array.Empty()'; } @@ -1085,7 +1090,7 @@ function csModelLiteral( const isCyclic = (f: IRField) => f.type.kind === 'model' && f.type.ref != null && nextVisited.has(f.type.ref); const fields = model.fields.filter( - (f) => (f.type.kind !== 'binary' || f.required) && !(isCyclic(f) && (!f.required || f.nullable)), + (f) => f.type.kind !== 'literal' && (f.type.kind !== 'binary' || f.required) && !(isCyclic(f) && (!f.required || f.nullable)), ); if (fields.length === 0) return `new ${modelName}()`; diff --git a/packages/generator/tests/additional-props-bool/snapshots/cs/Utils.cs b/packages/generator/tests/additional-props-bool/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/additional-props-bool/snapshots/cs/Utils.cs +++ b/packages/generator/tests/additional-props-bool/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/allof-sibling/snapshots/cs/Utils.cs b/packages/generator/tests/allof-sibling/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/allof-sibling/snapshots/cs/Utils.cs +++ b/packages/generator/tests/allof-sibling/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/circular-ref/snapshots/cs/Utils.cs b/packages/generator/tests/circular-ref/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/circular-ref/snapshots/cs/Utils.cs +++ b/packages/generator/tests/circular-ref/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/crud/snapshots/cs/Client.cs b/packages/generator/tests/crud/snapshots/cs/Client.cs index 583e8c6c..23f28beb 100644 --- a/packages/generator/tests/crud/snapshots/cs/Client.cs +++ b/packages/generator/tests/crud/snapshots/cs/Client.cs @@ -34,7 +34,7 @@ public async System.Threading.Tasks.Task ListChatsAsync( if (availability != null) queryParts.Add($"availability={Uri.EscapeDataString(PachcaUtils.EnumToApiString(availability.Value))}"); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); if (sortField != null) diff --git a/packages/generator/tests/crud/snapshots/cs/Utils.cs b/packages/generator/tests/crud/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/crud/snapshots/cs/Utils.cs +++ b/packages/generator/tests/crud/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/deep-nesting/snapshots/cs/Utils.cs b/packages/generator/tests/deep-nesting/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/deep-nesting/snapshots/cs/Utils.cs +++ b/packages/generator/tests/deep-nesting/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/edge-cases/snapshots/cs/Client.cs b/packages/generator/tests/edge-cases/snapshots/cs/Client.cs index bc4a882d..5eee19dc 100644 --- a/packages/generator/tests/edge-cases/snapshots/cs/Client.cs +++ b/packages/generator/tests/edge-cases/snapshots/cs/Client.cs @@ -33,9 +33,9 @@ public async System.Threading.Tasks.Task ListEventsAsync( if (isActive != null) queryParts.Add($"is_active={Uri.EscapeDataString((isActive.Value ? "true" : "false"))}"); if (scopes != null) - queryParts.Add($"scopes={Uri.EscapeDataString(scopes.ToString())}"); + queryParts.Add($"scopes={Uri.EscapeDataString(scopes.ToString()!)}"); if (filter != null) - queryParts.Add($"filter={Uri.EscapeDataString(filter.ToString())}"); + queryParts.Add($"filter={Uri.EscapeDataString(filter.ToString()!)}"); var url = $"{_baseUrl}/events" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); using var request = new HttpRequestMessage(HttpMethod.Get, url); using var response = await PachcaUtils.SendWithRetryAsync(_client, request, cancellationToken).ConfigureAwait(false); diff --git a/packages/generator/tests/edge-cases/snapshots/cs/Utils.cs b/packages/generator/tests/edge-cases/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/edge-cases/snapshots/cs/Utils.cs +++ b/packages/generator/tests/edge-cases/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/enums/snapshots/cs/Utils.cs b/packages/generator/tests/enums/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/enums/snapshots/cs/Utils.cs +++ b/packages/generator/tests/enums/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/models/snapshots/cs/Utils.cs b/packages/generator/tests/models/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/models/snapshots/cs/Utils.cs +++ b/packages/generator/tests/models/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/multi-path-params/snapshots/cs/Utils.cs b/packages/generator/tests/multi-path-params/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/multi-path-params/snapshots/cs/Utils.cs +++ b/packages/generator/tests/multi-path-params/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/nullable-ref/snapshots/cs/Utils.cs b/packages/generator/tests/nullable-ref/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/nullable-ref/snapshots/cs/Utils.cs +++ b/packages/generator/tests/nullable-ref/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/oneof/snapshots/cs/Utils.cs b/packages/generator/tests/oneof/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/oneof/snapshots/cs/Utils.cs +++ b/packages/generator/tests/oneof/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/patch/snapshots/cs/Utils.cs b/packages/generator/tests/patch/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/patch/snapshots/cs/Utils.cs +++ b/packages/generator/tests/patch/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/record/snapshots/cs/Utils.cs b/packages/generator/tests/record/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/record/snapshots/cs/Utils.cs +++ b/packages/generator/tests/record/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/redirect/snapshots/cs/Utils.cs b/packages/generator/tests/redirect/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/redirect/snapshots/cs/Utils.cs +++ b/packages/generator/tests/redirect/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/reserved-keywords/snapshots/cs/Utils.cs b/packages/generator/tests/reserved-keywords/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/reserved-keywords/snapshots/cs/Utils.cs +++ b/packages/generator/tests/reserved-keywords/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/search/snapshots/cs/Client.cs b/packages/generator/tests/search/snapshots/cs/Client.cs index d098afc2..00bb7bb6 100644 --- a/packages/generator/tests/search/snapshots/cs/Client.cs +++ b/packages/generator/tests/search/snapshots/cs/Client.cs @@ -37,10 +37,10 @@ public async System.Threading.Tasks.Task SearchMessagesA queryParts.Add($"query={Uri.EscapeDataString(query)}"); if (chatIds != null) foreach (var item in chatIds) - queryParts.Add($"chat_ids[]={Uri.EscapeDataString(item.ToString())}"); + queryParts.Add($"chat_ids[]={Uri.EscapeDataString(item.ToString()!)}"); if (userIds != null) foreach (var item in userIds) - queryParts.Add($"user_ids[]={Uri.EscapeDataString(item.ToString())}"); + queryParts.Add($"user_ids[]={Uri.EscapeDataString(item.ToString()!)}"); if (createdFrom != null) queryParts.Add($"created_from={Uri.EscapeDataString(createdFrom.Value.ToString("o"))}"); if (createdTo != null) @@ -48,7 +48,7 @@ public async System.Threading.Tasks.Task SearchMessagesA if (sort != null) queryParts.Add($"sort={Uri.EscapeDataString(PachcaUtils.EnumToApiString(sort.Value))}"); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); var url = $"{_baseUrl}/search/messages" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); diff --git a/packages/generator/tests/search/snapshots/cs/Utils.cs b/packages/generator/tests/search/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/search/snapshots/cs/Utils.cs +++ b/packages/generator/tests/search/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/unions/snapshots/cs/Utils.cs b/packages/generator/tests/unions/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/unions/snapshots/cs/Utils.cs +++ b/packages/generator/tests/unions/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/unwrap/snapshots/cs/Utils.cs b/packages/generator/tests/unwrap/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/unwrap/snapshots/cs/Utils.cs +++ b/packages/generator/tests/unwrap/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/generator/tests/upload/snapshots/cs/Utils.cs b/packages/generator/tests/upload/snapshots/cs/Utils.cs index 88d4be58..2cf57544 100644 --- a/packages/generator/tests/upload/snapshots/cs/Utils.cs +++ b/packages/generator/tests/upload/snapshots/cs/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/packages/openapi-parser/package.json b/packages/openapi-parser/package.json index 3340dbbf..fc59433f 100644 --- a/packages/openapi-parser/package.json +++ b/packages/openapi-parser/package.json @@ -7,8 +7,9 @@ "types": "dist/index.d.ts", "exports": { ".": { + "types": "./dist/index.d.ts", "import": "./dist/index.js", - "types": "./dist/index.d.ts" + "default": "./dist/index.js" } }, "scripts": { diff --git a/packages/spec/examples.ts b/packages/spec/examples.ts new file mode 100644 index 00000000..db9c6fbf --- /dev/null +++ b/packages/spec/examples.ts @@ -0,0 +1,193 @@ +/** + * Shared example data for n8n node, docs, skills, and CLI. + * + * This file provides high-level preset data that is NOT derivable from OpenAPI schemas: + * form templates, validation rules, button presets, file upload examples. + * + * For automatic per-field examples (types, formats, heuristics), see: + * apps/docs/lib/openapi/example-generator.ts + */ + +export const EXAMPLES = { + /** Button examples — used in docs, skills, n8n node (default values) */ + buttons: [ + { + text: 'Approve', + action_type: 'url' as const, + url: 'https://example.com/approve', + }, + { + text: 'Reject', + action_type: 'action' as const, + action_name: 'reject_request', + }, + ], + + /** Form templates — used in n8n node (preset forms), docs, skills */ + formTemplates: { + timeoff_request: { + name: 'Time Off Request', + blocks: [ + { + type: 'input', + element: { type: 'datepicker', action_id: 'date_start' }, + label: { type: 'plain_text', text: 'Start date' }, + }, + { + type: 'input', + element: { type: 'datepicker', action_id: 'date_end' }, + label: { type: 'plain_text', text: 'End date' }, + }, + { + type: 'input', + element: { type: 'plain_text_input', action_id: 'reason' }, + label: { type: 'plain_text', text: 'Reason' }, + optional: true, + }, + ], + submit: { type: 'plain_text', text: 'Request' }, + }, + feedback_form: { + name: 'Feedback Form', + blocks: [ + { + type: 'input', + element: { + type: 'radio', + action_id: 'rating', + options: [ + { text: { type: 'plain_text', text: '1 — Poor' }, value: '1' }, + { text: { type: 'plain_text', text: '2 — Fair' }, value: '2' }, + { text: { type: 'plain_text', text: '3 — Good' }, value: '3' }, + { text: { type: 'plain_text', text: '4 — Great' }, value: '4' }, + { text: { type: 'plain_text', text: '5 — Excellent' }, value: '5' }, + ], + }, + label: { type: 'plain_text', text: 'Rating' }, + }, + { + type: 'input', + element: { type: 'plain_text_input', action_id: 'comment', multiline: true }, + label: { type: 'plain_text', text: 'Comment' }, + optional: true, + }, + ], + submit: { type: 'plain_text', text: 'Send' }, + }, + task_request: { + name: 'Task Request', + blocks: [ + { + type: 'input', + element: { type: 'plain_text_input', action_id: 'title' }, + label: { type: 'plain_text', text: 'Title' }, + }, + { + type: 'input', + element: { type: 'plain_text_input', action_id: 'description', multiline: true }, + label: { type: 'plain_text', text: 'Description' }, + }, + ], + submit: { type: 'plain_text', text: 'Create' }, + }, + survey_form: { + name: 'Employee Survey', + blocks: [ + { + type: 'input', + element: { + type: 'radio', + action_id: 'satisfaction', + options: [ + { text: { type: 'plain_text', text: '1' }, value: '1' }, + { text: { type: 'plain_text', text: '2' }, value: '2' }, + { text: { type: 'plain_text', text: '3' }, value: '3' }, + { text: { type: 'plain_text', text: '4' }, value: '4' }, + { text: { type: 'plain_text', text: '5' }, value: '5' }, + ], + }, + label: { type: 'plain_text', text: 'Overall satisfaction (1-5)' }, + }, + { + type: 'input', + element: { type: 'plain_text_input', action_id: 'suggestions', multiline: true }, + label: { type: 'plain_text', text: 'Suggestions' }, + optional: true, + }, + ], + submit: { type: 'plain_text', text: 'Submit' }, + }, + access_request: { + name: 'Access Request', + blocks: [ + { + type: 'input', + element: { type: 'plain_text_input', action_id: 'resource' }, + label: { type: 'plain_text', text: 'Resource name' }, + }, + { + type: 'input', + element: { type: 'plain_text_input', action_id: 'justification', multiline: true }, + label: { type: 'plain_text', text: 'Justification' }, + }, + ], + submit: { type: 'plain_text', text: 'Request access' }, + }, + }, + + /** Client-side form validation rules — n8n node */ + formValidationRules: { + timeoff_request: { + date_end: { + rule: 'after_field' as const, + field: 'date_start', + message: 'End date must be after start date', + }, + }, + feedback_form: { + comment: { + rule: 'min_length' as const, + value: 10, + message: 'Comment must be at least 10 characters', + }, + }, + task_request: { + title: { + rule: 'min_length' as const, + value: 5, + message: 'Title must be at least 5 characters', + }, + description: { + rule: 'min_length' as const, + value: 20, + message: 'Description must be at least 20 characters', + }, + }, + }, + + /** Upload response example — from POST /uploads */ + upload: { + direct_url: 'https://s3.amazonaws.com/...', + key: 'uploads/abc123/file.pdf', + }, + + /** Message with file attachments */ + messageWithFiles: { + content: 'Here is the report', + files: [{ key: 'uploads/abc123/file.pdf', name: 'report.pdf' }], + }, + + /** MIME types for file upload detection */ + mimeTypes: { + pdf: 'application/pdf', + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + png: 'image/png', + gif: 'image/gif', + doc: 'application/msword', + docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + xls: 'application/vnd.ms-excel', + xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + zip: 'application/zip', + } as Record, +} as const; diff --git a/packages/spec/openapi.en.yaml b/packages/spec/openapi.en.yaml new file mode 100644 index 00000000..d94ebf3a --- /dev/null +++ b/packages/spec/openapi.en.yaml @@ -0,0 +1,8249 @@ +openapi: 3.0.0 +info: + title: Pachca API + version: 1.0.0 +tags: + - name: Common + - name: Profile + - name: Users + - name: Group tags + - name: Chats + - name: Members + - name: Threads + - name: Messages + - name: Read members + - name: Reactions + - name: Link Previews + - name: Search + - name: Tasks + - name: Views + - name: Bots + - name: Security +paths: + /audit_events: + get: + operationId: SecurityOperations_getAuditEvents + description: |- + Audit event log + + Retrieve event logs based on the specified filters. + parameters: + - name: start_time + in: query + required: false + description: Start timestamp (inclusive) + schema: + type: string + format: date-time + example: '2025-05-01T09:11:00Z' + example: '2025-05-01T09:11:00Z' + explode: false + - name: end_time + in: query + required: false + description: End timestamp (exclusive) + schema: + type: string + format: date-time + example: '2025-05-02T09:11:00Z' + example: '2025-05-02T09:11:00Z' + explode: false + - name: event_key + in: query + required: false + description: Filter by specific event type + schema: + $ref: '#/components/schemas/AuditEventKey' + example: user_login + example: user_login + explode: false + - name: actor_id + in: query + required: false + description: ID of the user who performed the action + schema: + type: string + example: '98765' + example: '98765' + explode: false + - name: actor_type + in: query + required: false + description: Actor type + schema: + type: string + example: User + example: User + explode: false + - name: entity_id + in: query + required: false + description: ID of the affected entity + schema: + type: string + example: '98765' + example: '98765' + explode: false + - name: entity_type + in: query + required: false + description: Entity type + schema: + type: string + example: User + example: User + explode: false + - name: limit + in: query + required: false + description: Number of records to return + schema: + type: integer + format: int32 + maximum: 50 + example: 1 + default: 50 + example: 1 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: '#/components/schemas/AuditEvent' + meta: + $ref: '#/components/schemas/PaginationMeta' + description: Response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Security + x-paginated: true + x-requirements: + scope: audit_events:read + plan: corporation + /bots/{id}: + put: + operationId: BotOperations_updateBot + description: >- + Edit bot + + + Edit a bot's settings. + + + To edit a bot you need to know its `user_id` and specify it in the request `URL`. All editable bot parameters + are specified in the request body. You can find the bot's `user_id` in the bot settings under the "API" tab. + + + You cannot edit a bot whose settings are not accessible to you (the "Who can edit bot settings" field is located + on the "General" tab in the bot settings). + parameters: + - name: id + in: path + required: true + description: Bot ID + schema: + type: integer + format: int32 + example: 1738816 + example: 1738816 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/BotResponse' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Bots + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/BotUpdateRequest' + x-requirements: + scope: bots:write + /chats: + post: + operationId: ChatOperations_createChat + description: |- + New chat + + Create a new chat. + + To create a one-on-one direct message with a user, use the [New message](POST /messages) method. + + When creating a chat, you automatically become a member. + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Chat' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Chats + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ChatCreateRequest' + x-requirements: + scope: chats:create + get: + operationId: ChatOperations_listChats + description: |- + List chats + + Retrieve a list of chats based on the specified parameters. + parameters: + - name: sort[{field}] + in: query + required: false + description: Sort order for the results + schema: + allOf: + - $ref: '#/components/schemas/SortOrder' + default: desc + example: desc + x-param-names: + - name: sort[id] + description: Chat ID + - name: sort[last_message_at] + description: Date and time of the last message creation + explode: false + - name: availability + in: query + required: false + description: Parameter that controls chat availability and filtering for the user + schema: + allOf: + - $ref: '#/components/schemas/ChatAvailability' + default: is_member + example: is_member + explode: false + - name: last_message_at_after + in: query + required: false + description: >- + Filter by last message creation time. Returns chats where the last message was created no earlier than the + specified time (in YYYY-MM-DDThh:mm:ss.sssZ format). + schema: + type: string + format: date-time + example: '2025-01-01T00:00:00.000Z' + example: '2025-01-01T00:00:00.000Z' + explode: false + - name: last_message_at_before + in: query + required: false + description: >- + Filter by last message creation time. Returns chats where the last message was created no later than the + specified time (in YYYY-MM-DDThh:mm:ss.sssZ format). + schema: + type: string + format: date-time + example: '2025-02-01T00:00:00.000Z' + example: '2025-02-01T00:00:00.000Z' + explode: false + - name: personal + in: query + required: false + description: Filter by direct and group chats. If not specified, all chats are returned. + schema: + type: boolean + example: false + example: false + explode: false + - name: limit + in: query + required: false + description: Number of records to return per request + schema: + type: integer + format: int32 + minimum: 1 + maximum: 50 + example: 1 + default: 50 + example: 1 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: '#/components/schemas/Chat' + meta: + $ref: '#/components/schemas/PaginationMeta' + description: Response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Chats + x-paginated: true + x-requirements: + scope: chats:read + /chats/exports: + post: + operationId: ExportOperations_requestExport + description: |- + Export messages + + Request a message export for the specified time period. + parameters: [] + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/ApiError' + - $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Common + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ExportRequest' + x-requirements: + scope: chat_exports:write + plan: corporation + /chats/exports/{id}: + get: + operationId: ExportOperations_downloadExport + description: >- + Download export archive + + + Download a completed message export archive. + + + To download the archive you need to know its `id` and specify it in the request `URL`. + + + The server will respond with `302 Found` and a `Location` header containing a temporary download link. Most HTTP + clients automatically follow the redirect and download the file. + parameters: + - name: id + in: path + required: true + description: Export ID + schema: + type: integer + format: int32 + example: 22322 + example: 22322 + responses: + '302': + description: Redirection + headers: + location: + required: true + schema: + type: string + format: uri + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/OAuthError' + - anyOf: + - $ref: '#/components/schemas/ApiError' + - $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Common + x-requirements: + scope: chat_exports:read + plan: corporation + /chats/{id}: + get: + operationId: ChatOperations_getChat + description: |- + Chat info + + Retrieve information about a chat. + + To get a chat you need to know its `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: Chat ID + schema: + type: integer + format: int32 + example: 334 + example: 334 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Chat' + description: Response wrapper with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Chats + x-requirements: + scope: chats:read + put: + operationId: ChatOperations_updateChat + description: >- + Update chat + + + Update chat parameters. + + + To update a chat you need to know its `id` and specify it in the `URL`. All updatable fields are passed in the + request body. + parameters: + - name: id + in: path + required: true + description: Chat ID + schema: + type: integer + format: int32 + example: 334 + example: 334 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Chat' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Chats + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ChatUpdateRequest' + x-requirements: + scope: chats:update + /chats/{id}/archive: + put: + operationId: ChatOperations_archiveChat + description: |- + Archive chat + + Archive a chat. + + To archive a chat you need to know its `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: Chat ID + schema: + type: integer + format: int32 + example: 334 + example: 334 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Chats + x-requirements: + scope: chats:archive + /chats/{id}/group_tags: + post: + operationId: ChatMemberOperations_addTags + description: >- + Add tags + + + Add tags to the member list of a conversation or channel. + + + After adding a tag, all its members automatically become members of the chat. The tag and chat member lists are + synchronized automatically: when a new member is added to the tag, they immediately appear in the chat; when + removed from the tag, they are removed from the chat. + parameters: + - name: id + in: path + required: true + description: Chat ID + schema: + type: integer + format: int32 + example: 334 + example: 334 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Members + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AddTagsRequest' + x-requirements: + scope: chat_members:write + /chats/{id}/group_tags/{tag_id}: + delete: + operationId: ChatMemberOperations_removeTag + description: |- + Remove tag + + Remove a tag from the member list of a conversation or channel. + + To remove a tag you need to know its `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: Chat ID + schema: + type: integer + format: int32 + example: 334 + example: 334 + - name: tag_id + in: path + required: true + description: Tag ID + schema: + type: integer + format: int32 + example: 86 + example: 86 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Members + x-requirements: + scope: chat_members:write + /chats/{id}/leave: + delete: + operationId: ChatMemberOperations_leaveChat + description: |- + Leave conversation or channel + + Leave a conversation or channel on your own. + parameters: + - name: id + in: path + required: true + description: Chat ID + schema: + type: integer + format: int32 + example: 334 + example: 334 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Members + x-requirements: + scope: chats:leave + /chats/{id}/members: + get: + operationId: ChatMemberOperations_listMembers + description: >- + List chat members + + + Retrieve the current list of chat members. + + + The workspace owner can retrieve the member list of any chat in the workspace. Admins and bots can only retrieve + the member list of chats they belong to (or that are public). + parameters: + - name: id + in: path + required: true + description: Chat ID + schema: + type: integer + format: int32 + example: 334 + example: 334 + - name: role + in: query + required: false + description: Role in the chat + schema: + allOf: + - $ref: '#/components/schemas/ChatMemberRoleFilter' + default: all + example: all + explode: false + - name: limit + in: query + required: false + description: Number of records to return per request + schema: + type: integer + format: int32 + minimum: 1 + maximum: 50 + example: 1 + default: 50 + example: 1 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: '#/components/schemas/User' + meta: + $ref: '#/components/schemas/PaginationMeta' + description: Response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Members + x-paginated: true + x-requirements: + scope: chat_members:read + post: + operationId: ChatMemberOperations_addMembers + description: |- + Add users + + Add users to the member list of a conversation, channel, or thread. + parameters: + - name: id + in: path + required: true + description: Chat ID (conversation, channel, or thread chat) + schema: + type: integer + format: int32 + example: 334 + example: 334 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Members + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AddMembersRequest' + x-requirements: + scope: chat_members:write + /chats/{id}/members/{user_id}: + delete: + operationId: ChatMemberOperations_removeMember + description: >- + Remove user + + + Remove a user from the member list of a conversation or channel. + + + If the user is the chat owner, they cannot be removed. They can only leave the chat on their own using the + [Leave conversation or channel](DELETE /chats/{id}/leave) method. + parameters: + - name: id + in: path + required: true + description: Chat ID + schema: + type: integer + format: int32 + example: 334 + example: 334 + - name: user_id + in: path + required: true + description: User ID + schema: + type: integer + format: int32 + example: 186 + example: 186 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Members + x-requirements: + scope: chat_members:write + put: + operationId: ChatMemberOperations_updateMemberRole + description: >- + Edit role + + + Edit a user's or bot's role in a conversation or channel. + + + To edit a role in a conversation or channel you need to know the `id` of the chat and the user (or bot) and + specify them in the request `URL`. All editable role parameters are specified in the request body. + + + The chat owner's role cannot be changed. They always have Admin privileges in the chat. + parameters: + - name: id + in: path + required: true + description: Chat ID + schema: + type: integer + format: int32 + example: 334 + example: 334 + - name: user_id + in: path + required: true + description: User ID + schema: + type: integer + format: int32 + example: 186 + example: 186 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Members + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateMemberRoleRequest' + x-requirements: + scope: chat_members:write + /chats/{id}/unarchive: + put: + operationId: ChatOperations_unarchiveChat + description: |- + Unarchive chat + + Restore a chat from the archive. + + To unarchive a chat you need to know its `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: Chat ID + schema: + type: integer + format: int32 + example: 334 + example: 334 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Chats + x-requirements: + scope: chats:archive + /custom_properties: + get: + operationId: CommonOperations_listProperties + description: >- + List custom properties + + + Working with "File" type custom properties is currently unavailable. + + + Retrieve the current list of custom properties for employees and tasks in your workspace. + + + By default, all entities in your workspace only have basic fields. However, your workspace administrator can + add, edit, and delete custom properties. If you use custom properties that are no longer current (deleted or + non-existent) when creating employees (or tasks), you will receive an error. + parameters: + - name: entity_type + in: query + required: true + description: Entity type + schema: + $ref: '#/components/schemas/SearchEntityType' + example: User + example: User + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: '#/components/schemas/CustomPropertyDefinition' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Common + x-requirements: + scope: custom_properties:read + /direct_url: + post: + operationId: DirectUploadOperations_uploadFile + description: >- + Upload file + + + Upload a file to the server using `multipart/form-data` format. Upload parameters are obtained via the [Get + signature, key and other parameters](POST /uploads) method. + parameters: [] + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + tags: + - Common + requestBody: + required: true + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/FileUploadRequest' + x-external-url: directUrl + x-requirements: + auth: false + /group_tags: + post: + operationId: GroupTagOperations_createTag + description: |- + New tag + + Create a new tag. + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/GroupTag' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Group tags + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/GroupTagRequest' + x-requirements: + scope: group_tags:write + get: + operationId: GroupTagOperations_listTags + description: |- + List employee tags + + Retrieve the current list of employee tags. Tag names are unique within the workspace. + parameters: + - name: names + in: query + required: false + description: Array of tag names to filter by + schema: + $ref: '#/components/schemas/TagNamesFilter' + example: + - Design + - Product + example: + - Design + - Product + - name: limit + in: query + required: false + description: Number of records to return per request + schema: + type: integer + format: int32 + minimum: 1 + maximum: 50 + example: 1 + default: 50 + example: 1 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: '#/components/schemas/GroupTag' + meta: + $ref: '#/components/schemas/PaginationMeta' + description: Response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Group tags + x-paginated: true + x-requirements: + scope: group_tags:read + /group_tags/{id}: + get: + operationId: GroupTagOperations_getTag + description: |- + Tag info + + Retrieve information about a tag. Tag names are unique within the workspace. + + To get a tag you need to know its `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: Tag ID + schema: + type: integer + format: int32 + example: 9111 + example: 9111 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/GroupTag' + description: Response wrapper with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Group tags + x-requirements: + scope: group_tags:read + put: + operationId: GroupTagOperations_updateTag + description: >- + Edit tag + + + Edit a tag. + + + To edit a tag you need to know its `id` and specify it in the request `URL`. All editable tag parameters are + specified in the request body. + parameters: + - name: id + in: path + required: true + description: Tag ID + schema: + type: integer + format: int32 + example: 9111 + example: 9111 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/GroupTag' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Group tags + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/GroupTagRequest' + x-requirements: + scope: group_tags:write + delete: + operationId: GroupTagOperations_deleteTag + description: |- + Delete tag + + Delete a tag. + + To delete a tag you need to know its `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: Tag ID + schema: + type: integer + format: int32 + example: 9111 + example: 9111 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Group tags + x-requirements: + scope: group_tags:write + /group_tags/{id}/users: + get: + operationId: GroupTagOperations_getTagUsers + description: |- + List tag employees + + Retrieve the current list of employees in a tag. + parameters: + - name: id + in: path + required: true + description: Tag ID + schema: + type: integer + format: int32 + example: 9111 + example: 9111 + - name: limit + in: query + required: false + description: Number of records to return per request + schema: + type: integer + format: int32 + minimum: 1 + maximum: 50 + example: 1 + default: 50 + example: 1 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: '#/components/schemas/User' + meta: + $ref: '#/components/schemas/PaginationMeta' + description: Response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Group tags + x-paginated: true + x-requirements: + scope: group_tags:read + /messages: + post: + operationId: MessageOperations_createMessage + description: >- + New message + + + Send a message to a conversation or channel, a direct message to a user, or a comment to a thread. + + + When using `entity_type: "discussion"` (or simply without specifying `entity_type`), any `chat_id` can be passed + in the `entity_id` field. This means you can send a message knowing only the chat ID. Additionally, you can send + a message to a thread by its ID or a direct message by the user's ID. + + + To send a direct message to a user, you do not need to create a chat. Simply specify `entity_type: "user"` and + the user's ID. A chat will be created automatically if there has been no prior conversation between you. Only + one direct chat can exist between two users. + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Message' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Messages + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/MessageCreateRequest' + x-requirements: + scope: messages:create + get: + operationId: ChatMessageOperations_listChatMessages + description: >- + List chat messages + + + Retrieve a list of messages from conversations, channels, threads, and direct messages. + + + To retrieve messages you need to know the `chat_id` of the required conversation, channel, thread, or direct + message, and specify it in the request `URL`. Messages are returned in descending order by send date (i.e., the + most recent messages come first). To retrieve earlier messages, use the `limit` and `cursor` parameters. + parameters: + - name: chat_id + in: query + required: true + description: Chat ID (conversation, channel, direct message, or thread chat) + schema: + type: integer + format: int32 + example: 198 + example: 198 + explode: false + - name: sort[{field}] + in: query + required: false + description: Sort order for the results + schema: + allOf: + - $ref: '#/components/schemas/SortOrder' + default: desc + example: desc + x-param-names: + - name: sort[id] + description: Message ID + explode: false + - name: limit + in: query + required: false + description: Number of records to return per request + schema: + type: integer + format: int32 + minimum: 1 + maximum: 50 + example: 1 + default: 50 + example: 1 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: '#/components/schemas/Message' + meta: + $ref: '#/components/schemas/PaginationMeta' + description: Response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Messages + x-paginated: true + x-requirements: + scope: messages:read + /messages/{id}: + get: + operationId: MessageOperations_getMessage + description: |- + Message info + + Retrieve information about a message. + + To get a message you need to know its `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: Message ID + schema: + type: integer + format: int32 + example: 194275 + example: 194275 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Message' + description: Response wrapper with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Messages + x-requirements: + scope: messages:read + put: + operationId: MessageOperations_updateMessage + description: >- + Edit message + + + Edit a message or comment. + + + To edit a message you need to know its `id` and specify it in the request `URL`. All editable message parameters + are specified in the request body. + parameters: + - name: id + in: path + required: true + description: Message ID + schema: + type: integer + format: int32 + example: 194275 + example: 194275 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Message' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Messages + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/MessageUpdateRequest' + x-requirements: + scope: messages:update + delete: + operationId: MessageOperations_deleteMessage + description: >- + Delete message + + + Delete a message. + + + Message deletion is available to the sender, admins, and editors in the chat. In direct messages, both users are + editors. There are no time restrictions on message deletion. + + + To delete a message you need to know its `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: Message ID + schema: + type: integer + format: int32 + example: 194275 + example: 194275 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Messages + x-requirements: + scope: messages:delete + /messages/{id}/link_previews: + post: + operationId: LinkPreviewOperations_createLinkPreviews + description: |- + Unfurl (link previews) + + Create link previews in messages. Only available for Unfurl bots. + parameters: + - name: id + in: path + required: true + description: Message ID + schema: + type: integer + format: int32 + example: 194275 + example: 194275 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Link Previews + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/LinkPreviewsRequest' + x-requirements: + scope: link_previews:write + /messages/{id}/pin: + post: + operationId: MessageOperations_pinMessage + description: |- + Pin message + + Pin a message in a chat. + + To pin a message you need to know the message `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: Message ID + schema: + type: integer + format: int32 + example: 194275 + example: 194275 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + tags: + - Messages + x-requirements: + scope: pins:write + delete: + operationId: MessageOperations_unpinMessage + description: |- + Unpin message + + Unpin a message from a chat. + + To unpin a message you need to know the message `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: Message ID + schema: + type: integer + format: int32 + example: 194275 + example: 194275 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Messages + x-requirements: + scope: pins:write + /messages/{id}/reactions: + post: + operationId: ReactionOperations_addReaction + description: >- + Add reaction + + + Add a reaction to a message. + + + To add a reaction you need to know the message `id` and specify it in the request `URL`. Message reactions are + sent as `Emoji` characters. If the user has already added the same reaction, it will not be duplicated. To + remove a reaction, use the [Delete reaction](DELETE /messages/{id}/reactions) method. + + + **Reaction limits:** + + + - Each user can add no more than **20 unique** reactions + + - A message can have no more than **30 unique** reactions + + - The total number of reactions on a message cannot exceed **1000** + parameters: + - name: id + in: path + required: true + description: Message ID + schema: + type: integer + format: int32 + example: 7231942 + example: 7231942 + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/Reaction' + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Reactions + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ReactionRequest' + x-requirements: + scope: reactions:write + delete: + operationId: ReactionOperations_removeReaction + description: >- + Delete reaction + + + Remove a reaction from a message. + + + To remove a reaction you need to know the message `id` and specify it in the request `URL`. Message reactions + are stored as `Emoji` characters. + + + You can only remove reactions that were added by the authenticated user. + parameters: + - name: id + in: path + required: true + description: Message ID + schema: + type: integer + format: int32 + example: 7231942 + example: 7231942 + - name: code + in: query + required: true + description: Emoji character of the reaction + schema: + type: string + example: 👍 + example: 👍 + explode: false + - name: name + in: query + required: false + description: Text name of the emoji (used for custom emoji) + schema: + type: string + example: ':+1:' + example: ':+1:' + explode: false + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Reactions + x-requirements: + scope: reactions:write + get: + operationId: ReactionOperations_listReactions + description: |- + List reactions + + Retrieve the current list of reactions on a message. + parameters: + - name: id + in: path + required: true + description: Message ID + schema: + type: integer + format: int32 + example: 194275 + example: 194275 + - name: limit + in: query + required: false + description: Number of records to return per request + schema: + type: integer + format: int32 + minimum: 1 + maximum: 50 + example: 1 + default: 50 + example: 1 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: '#/components/schemas/Reaction' + meta: + $ref: '#/components/schemas/PaginationMeta' + description: Response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Reactions + x-paginated: true + x-requirements: + scope: reactions:read + /messages/{id}/read_member_ids: + get: + operationId: ReadMemberOperations_listReadMembers + description: |- + List users who read the message + + Retrieve the current list of users who have read the message. + parameters: + - name: id + in: path + required: true + description: Message ID + schema: + type: integer + format: int32 + example: 194275 + example: 194275 + - name: limit + in: query + required: false + description: Number of records to return per request + schema: + type: integer + format: int32 + minimum: 1 + maximum: 300 + example: 300 + default: 300 + example: 300 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + type: integer + format: int32 + meta: + $ref: '#/components/schemas/PaginationMeta' + description: Response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Read members + x-paginated: true + x-requirements: + scope: messages:read + /messages/{id}/thread: + post: + operationId: ThreadOperations_createThread + description: >- + New thread + + + Create a new thread on a message. + + + If a thread has already been created for the message, the response will return information about the previously + created thread. + parameters: + - name: id + in: path + required: true + description: Message ID + schema: + type: integer + format: int32 + example: 154332686 + example: 154332686 + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Thread' + description: Response wrapper with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Threads + x-requirements: + scope: threads:create + /oauth/token/info: + get: + operationId: OAuthOperations_getTokenInfo + description: >- + Token info + + + Retrieve information about the current OAuth token, including its scopes, creation date, and last usage date. + The token in the response is masked — only the first 8 and last 4 characters are visible. + parameters: [] + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/AccessTokenInfo' + description: Response wrapper with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + tags: + - Profile + /profile: + get: + operationId: ProfileOperations_getProfile + description: |- + Profile info + + Retrieve information about your own profile. + parameters: [] + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/User' + description: Response wrapper with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + tags: + - Profile + x-requirements: + scope: profile:read + /profile/status: + get: + operationId: ProfileOperations_getStatus + description: |- + Current status + + Retrieve information about your current status. + parameters: [] + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: object + allOf: + - $ref: '#/components/schemas/UserStatus' + nullable: true + description: Response wrapper with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + tags: + - Profile + x-requirements: + scope: profile_status:read + put: + operationId: ProfileOperations_updateStatus + description: |- + New status + + Set a new status for yourself. + parameters: [] + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/UserStatus' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Profile + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/StatusUpdateRequest' + x-requirements: + scope: profile_status:write + delete: + operationId: ProfileOperations_deleteStatus + description: |- + Delete status + + Delete your current status. + parameters: [] + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + tags: + - Profile + x-requirements: + scope: profile_status:write + /search/chats: + get: + operationId: SearchOperations_searchChats + description: |- + Search chats + + Full-text search for channels and conversations. + parameters: + - name: query + in: query + required: false + description: Search query text + schema: + type: string + example: Development + example: Development + explode: false + - name: limit + in: query + required: false + description: Number of results to return per request + schema: + type: integer + format: int32 + maximum: 100 + example: 10 + default: 100 + example: 10 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + - name: order + in: query + required: false + description: Sort direction + schema: + $ref: '#/components/schemas/SortOrder' + example: desc + example: desc + explode: false + - name: created_from + in: query + required: false + description: Filter by creation date (from) + schema: + type: string + format: date-time + example: '2025-01-01T00:00:00.000Z' + example: '2025-01-01T00:00:00.000Z' + explode: false + - name: created_to + in: query + required: false + description: Filter by creation date (to) + schema: + type: string + format: date-time + example: '2025-02-01T00:00:00.000Z' + example: '2025-02-01T00:00:00.000Z' + explode: false + - name: active + in: query + required: false + description: Filter by chat activity + schema: + type: boolean + example: true + example: true + explode: false + - name: chat_subtype + in: query + required: false + description: Filter by chat type + schema: + $ref: '#/components/schemas/ChatSubtype' + example: discussion + example: discussion + explode: false + - name: personal + in: query + required: false + description: Filter by direct chats + schema: + type: boolean + example: false + example: false + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/Chat' + meta: + $ref: '#/components/schemas/SearchPaginationMeta' + description: Search results response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + tags: + - Search + x-paginated: true + x-requirements: + scope: search:chats + /search/messages: + get: + operationId: SearchOperations_searchMessages + description: |- + Search messages + + Full-text search for messages. + parameters: + - name: query + in: query + required: false + description: Search query text + schema: + type: string + example: t-shirts + example: t-shirts + explode: false + - name: limit + in: query + required: false + description: Number of results to return per request + schema: + type: integer + format: int32 + maximum: 200 + example: 10 + default: 200 + example: 10 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + - name: order + in: query + required: false + description: Sort direction + schema: + $ref: '#/components/schemas/SortOrder' + example: desc + example: desc + explode: false + - name: created_from + in: query + required: false + description: Filter by creation date (from) + schema: + type: string + format: date-time + example: '2025-01-01T00:00:00.000Z' + example: '2025-01-01T00:00:00.000Z' + explode: false + - name: created_to + in: query + required: false + description: Filter by creation date (to) + schema: + type: string + format: date-time + example: '2025-02-01T00:00:00.000Z' + example: '2025-02-01T00:00:00.000Z' + explode: false + - name: chat_ids + in: query + required: false + description: Filter by chat IDs + schema: + type: array + items: + type: integer + format: int32 + example: + - 198 + - 334 + example: + - 198 + - 334 + explode: false + - name: user_ids + in: query + required: false + description: Filter by message author IDs + schema: + type: array + items: + type: integer + format: int32 + example: + - 12 + - 185 + example: + - 12 + - 185 + explode: false + - name: active + in: query + required: false + description: Filter by chat activity + schema: + type: boolean + example: true + example: true + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/Message' + meta: + $ref: '#/components/schemas/SearchPaginationMeta' + description: Search results response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + tags: + - Search + x-paginated: true + x-requirements: + scope: search:messages + /search/users: + get: + operationId: SearchOperations_searchUsers + description: |- + Search employees + + Full-text search for employees by name, email, position, and other fields. + parameters: + - name: query + in: query + required: false + description: Search query text + schema: + type: string + example: Oleg + example: Oleg + explode: false + - name: limit + in: query + required: false + description: Number of results to return per request + schema: + type: integer + format: int32 + maximum: 200 + example: 10 + default: 200 + example: 10 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + - name: sort + in: query + required: false + description: Sort results by + schema: + $ref: '#/components/schemas/SearchSortOrder' + example: by_score + example: by_score + explode: false + - name: order + in: query + required: false + description: Sort direction + schema: + $ref: '#/components/schemas/SortOrder' + example: desc + example: desc + explode: false + - name: created_from + in: query + required: false + description: Filter by creation date (from) + schema: + type: string + format: date-time + example: '2025-01-01T00:00:00.000Z' + example: '2025-01-01T00:00:00.000Z' + explode: false + - name: created_to + in: query + required: false + description: Filter by creation date (to) + schema: + type: string + format: date-time + example: '2025-02-01T00:00:00.000Z' + example: '2025-02-01T00:00:00.000Z' + explode: false + - name: company_roles + in: query + required: false + description: Filter by employee roles + schema: + type: array + items: + $ref: '#/components/schemas/UserRole' + example: + - admin + - user + example: + - admin + - user + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/User' + meta: + $ref: '#/components/schemas/SearchPaginationMeta' + description: Search results response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + tags: + - Search + x-paginated: true + x-requirements: + scope: search:users + /tasks: + post: + operationId: TaskOperations_createTask + description: >- + New task + + + Create a new task. + + + When creating a task, specifying the task type is required: call, meeting, simple reminder, event, or email. No + additional description is needed — you simply create a task with the corresponding text. If you specify a task + description, it will become the task's text. + + + A task must have assignees; if none are specified, you are assigned as the responsible person. + + + Any workspace employee can be assigned to a task that is not linked to any entity. You can get the current + employee list using the [List employees](GET /users) method. + + + A task can be linked to a chat by specifying `chat_id`. To link to a chat, you must be a member of that chat. + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Task' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Tasks + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/TaskCreateRequest' + x-requirements: + scope: tasks:create + get: + operationId: TaskOperations_listTasks + description: |- + List tasks + + Retrieve a list of tasks. + parameters: + - name: limit + in: query + required: false + description: Number of records to return per request + schema: + type: integer + format: int32 + minimum: 1 + maximum: 50 + example: 1 + default: 50 + example: 1 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: '#/components/schemas/Task' + meta: + $ref: '#/components/schemas/PaginationMeta' + description: Response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + tags: + - Tasks + x-paginated: true + x-requirements: + scope: tasks:read + /tasks/{id}: + get: + operationId: TaskOperations_getTask + description: |- + Task info + + Retrieve information about a task. + + To get a task you need to know its `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: Task ID + schema: + type: integer + format: int32 + example: 22283 + example: 22283 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Task' + description: Response wrapper with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Tasks + x-requirements: + scope: tasks:read + put: + operationId: TaskOperations_updateTask + description: >- + Edit task + + + Edit a task. + + + To edit a task you need to know its `id` and specify it in the request `URL`. All editable task parameters are + specified in the request body. + parameters: + - name: id + in: path + required: true + description: Task ID + schema: + type: integer + format: int32 + example: 22283 + example: 22283 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Task' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Tasks + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/TaskUpdateRequest' + x-requirements: + scope: tasks:update + delete: + operationId: TaskOperations_deleteTask + description: |- + Delete task + + Delete a task. + + To delete a task you need to know its `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: Task ID + schema: + type: integer + format: int32 + example: 22283 + example: 22283 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Tasks + x-requirements: + scope: tasks:delete + /threads/{id}: + get: + operationId: ThreadOperations_getThread + description: |- + Thread info + + Retrieve information about a thread. + + To get a thread you need to know its `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: Thread ID + schema: + type: integer + format: int32 + example: 265142 + example: 265142 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Thread' + description: Response wrapper with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Threads + x-requirements: + scope: threads:read + /uploads: + post: + operationId: UploadOperations_getUploadParams + description: |- + Get signature, key and other parameters + + Retrieve the signature, key, and other parameters required for file upload. + + This method must be used for each file upload. + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + $ref: '#/components/schemas/UploadParams' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + tags: + - Common + x-requirements: + scope: uploads:write + /users: + post: + operationId: UserOperations_createUser + description: >- + Create employee + + + Create a new employee in your workspace. + + + You can fill in custom properties for the employee that have been created in your workspace. You can get the + current list of employee custom property IDs using the [List custom properties](GET /custom_properties) method. + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/User' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Users + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UserCreateRequest' + x-requirements: + scope: users:create + get: + operationId: UserOperations_listUsers + description: |- + List employees + + Retrieve the current list of employees in your workspace. + parameters: + - name: query + in: query + required: false + description: >- + Search phrase to filter results. Search works on the following fields: `first_name`, `last_name`, `email`, + `phone_number`, and `nickname`. + schema: + type: string + example: Oleg + example: Oleg + explode: false + - name: limit + in: query + required: false + description: Number of records to return per request + schema: + type: integer + format: int32 + minimum: 1 + maximum: 50 + example: 1 + default: 50 + example: 1 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: '#/components/schemas/User' + meta: + $ref: '#/components/schemas/PaginationMeta' + description: Response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Users + x-paginated: true + x-requirements: + scope: users:read + /users/{id}: + get: + operationId: UserOperations_getUser + description: |- + Employee info + + Retrieve information about an employee. + + To get an employee you need to know their `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: User ID + schema: + type: integer + format: int32 + example: 12 + example: 12 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/User' + description: Response wrapper with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Users + x-requirements: + scope: users:read + put: + operationId: UserOperations_updateUser + description: >- + Edit employee + + + Edit an employee. + + + To edit an employee you need to know their `id` and specify it in the request `URL`. All editable employee + parameters are specified in the request body. You can get the current list of employee custom property IDs using + the [List custom properties](GET /custom_properties) method. + parameters: + - name: id + in: path + required: true + description: User ID + schema: + type: integer + format: int32 + example: 12 + example: 12 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/User' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Users + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UserUpdateRequest' + x-requirements: + scope: users:update + delete: + operationId: UserOperations_deleteUser + description: |- + Delete employee + + Delete an employee. + + To delete an employee you need to know their `id` and specify it in the request `URL`. + parameters: + - name: id + in: path + required: true + description: User ID + schema: + type: integer + format: int32 + example: 12 + example: 12 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Users + x-requirements: + scope: users:delete + /users/{user_id}/status: + get: + operationId: UserStatusOperations_getUserStatus + description: |- + Employee status + + Retrieve information about an employee's status. + parameters: + - name: user_id + in: path + required: true + description: User ID + schema: + type: integer + format: int32 + example: 12 + example: 12 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: object + allOf: + - $ref: '#/components/schemas/UserStatus' + nullable: true + description: Response wrapper with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Users + x-requirements: + scope: user_status:read + put: + operationId: UserStatusOperations_updateUserStatus + description: |- + New employee status + + Set a new status for an employee. + parameters: + - name: user_id + in: path + required: true + description: User ID + schema: + type: integer + format: int32 + example: 12 + example: 12 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/UserStatus' + description: Response wrapper with data + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Users + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/StatusUpdateRequest' + x-requirements: + scope: user_status:write + delete: + operationId: UserStatusOperations_deleteUserStatus + description: |- + Delete employee status + + Delete an employee's status. + parameters: + - name: user_id + in: path + required: true + description: User ID + schema: + type: integer + format: int32 + example: 12 + example: 12 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Users + x-requirements: + scope: user_status:write + /views/open: + post: + operationId: FormOperations_openView + description: |- + Open view + + Open a modal window with a view for the user. + + To open a modal window with a view, your application must have a valid, non-expired `trigger_id`. + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '410': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Views + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/OpenViewRequest' + x-requirements: + scope: views:write + /webhooks/events: + get: + operationId: BotOperations_getWebhookEvents + description: >- + Event history + + + Retrieve the history of a bot's recent events. This method is useful if you cannot receive events in real time + at your `URL`, but need to process all events you have subscribed to. + + + Event history is only saved when the "Save event history" option is enabled in the "Outgoing webhook" tab of the + bot settings. Specifying a "Webhook `URL`" is not required. + + + To retrieve the event history of a specific bot, you need to know its `access_token` and use it in the request. + Each event is a webhook `JSON` object. + parameters: + - name: limit + in: query + required: false + description: Number of records to return per request + schema: + type: integer + format: int32 + minimum: 1 + maximum: 50 + example: 1 + default: 50 + example: 1 + explode: false + - name: cursor + in: query + required: false + description: Pagination cursor (from `meta.paginate.next_page`) + schema: + type: string + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + example: eyJpZCI6MTAsImRpciI6ImFzYyJ9 + explode: false + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: '#/components/schemas/WebhookEvent' + meta: + $ref: '#/components/schemas/PaginationMeta' + description: Response wrapper with data and pagination + '400': + description: The server could not understand the request due to invalid syntax. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Bots + x-paginated: true + x-requirements: + scope: webhooks:events:read + /webhooks/events/{id}: + delete: + operationId: BotOperations_deleteWebhookEvent + description: |- + Delete event + + This method is only available with a bot's `access_token`. + + Delete an event from the bot's event history. + + To delete an event you need to know the bot's `access_token` that owns the event and the event `id`. + parameters: + - name: id + in: path + required: true + description: Event ID + schema: + type: string + example: 01KAJZ2XDSS2S3DSW9EXJZ0TBV + example: 01KAJZ2XDSS2S3DSW9EXJZ0TBV + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Bots + x-requirements: + scope: webhooks:events:delete +security: + - BearerAuth: [] +components: + schemas: + AccessTokenInfo: + type: object + required: + - id + - token + - name + - user_id + - scopes + - created_at + - revoked_at + - expires_in + - last_used_at + properties: + id: + type: integer + format: int64 + description: Token ID + example: 4827 + token: + type: string + description: Masked token (first 8 and last 4 characters visible) + example: cH5kR9mN...x7Qp + name: + type: string + nullable: true + description: User-defined token name + example: My API Token + user_id: + type: integer + format: int64 + description: Token owner ID + example: 12 + scopes: + type: array + items: + $ref: '#/components/schemas/OAuthScope' + description: List of token scopes + example: + - messages:read + - chats:read + created_at: + type: string + format: date-time + description: Token creation date + example: '2025-01-15T10:30:00.000Z' + revoked_at: + type: string + format: date-time + nullable: true + description: Token revocation date + example: null + expires_in: + type: integer + format: int32 + nullable: true + description: Token lifetime in seconds + example: null + last_used_at: + type: string + format: date-time + nullable: true + description: Token last used date + example: '2025-02-24T14:20:00.000Z' + description: Access token + AddMembersRequest: + type: object + required: + - member_ids + properties: + member_ids: + type: array + items: + type: integer + format: int32 + description: Array of user IDs who will become members + example: + - 186 + - 187 + silent: + type: boolean + description: Do not create a system message in the chat about adding a member + example: true + description: Request to add members to a chat + AddTagsRequest: + type: object + required: + - group_tag_ids + properties: + group_tag_ids: + type: array + items: + type: integer + format: int32 + description: Array of tag IDs to be added as members + example: + - 86 + - 18 + description: Request to add tags to a chat + ApiError: + type: object + required: + - errors + properties: + errors: + type: array + items: + $ref: '#/components/schemas/ApiErrorItem' + description: Array of errors + description: API error (used for 400, 402, 403, 404, 409, 410, 422) + x-error: true + ApiErrorItem: + type: object + required: + - key + - value + - message + - code + - payload + properties: + key: + type: string + description: Field key that caused the error + example: field.name + value: + type: string + nullable: true + description: Field value that caused the error + example: invalid_value + message: + type: string + description: Error message + example: Field cannot be empty + code: + allOf: + - $ref: '#/components/schemas/ValidationErrorCode' + description: Error code + example: blank + payload: + type: object + additionalProperties: {} + nullable: true + description: >- + Additional error data. Content depends on the error code: `{id: number}` for custom property errors, `{type: + string}` for type mismatch errors + example: null + description: Detailed error information + AuditDetailsChatId: + type: object + required: + - chat_id + properties: + chat_id: + type: integer + format: int32 + description: Chat ID + description: 'For: tag_removed_from_chat' + AuditDetailsChatPermission: + type: object + required: + - public_access + properties: + public_access: + type: boolean + description: Public access + description: 'For: chat_permission_changed' + AuditDetailsChatRenamed: + type: object + required: + - old_name + - new_name + properties: + old_name: + type: string + description: Previous chat name + new_name: + type: string + description: New chat name + description: 'For: chat_renamed' + AuditDetailsDlp: + type: object + required: + - dlp_rule_id + - dlp_rule_name + - message_id + - chat_id + - user_id + - action_message + - conditions_matched + properties: + dlp_rule_id: + type: integer + format: int32 + description: DLP rule ID + dlp_rule_name: + type: string + description: DLP rule name + message_id: + type: integer + format: int32 + description: Message ID + chat_id: + type: integer + format: int32 + description: Chat ID + user_id: + type: integer + format: int32 + description: User ID + action_message: + type: string + description: Action description + conditions_matched: + type: boolean + description: Rule conditions check result (true — conditions matched) + description: 'For: dlp_violation_detected' + AuditDetailsEmpty: + type: object + description: >- + Empty details. For: user_login, user_logout, user_2fa_fail, user_2fa_success, user_created, user_deleted, + chat_created, message_created, message_updated, message_deleted, reaction_created, reaction_deleted, + thread_created, audit_events_accessed + AuditDetailsInitiator: + type: object + required: + - initiator_id + properties: + initiator_id: + type: integer + format: int32 + description: Action initiator ID + description: 'For: user_added_to_tag, user_removed_from_tag, user_chat_leave' + AuditDetailsInviter: + type: object + required: + - inviter_id + properties: + inviter_id: + type: integer + format: int32 + description: Inviter ID + description: 'For: user_chat_join' + AuditDetailsKms: + type: object + required: + - chat_id + - message_id + - reason + properties: + chat_id: + type: integer + format: int32 + description: Chat ID + message_id: + type: integer + format: int32 + description: Message ID + reason: + type: string + description: Operation reason + description: 'For: kms_encrypt, kms_decrypt' + AuditDetailsRoleChanged: + type: object + required: + - new_company_role + - previous_company_role + - initiator_id + properties: + new_company_role: + type: string + description: New role + previous_company_role: + type: string + description: Previous role + initiator_id: + type: integer + format: int32 + description: Initiator ID + description: 'For: user_role_changed' + AuditDetailsSearch: + type: object + required: + - search_type + - query_present + - cursor_present + - limit + - filters + properties: + search_type: + type: string + description: Search type + query_present: + type: boolean + description: Whether a search query was specified + cursor_present: + type: boolean + description: Whether a cursor was used + limit: + type: integer + format: int32 + description: Number of returned results + filters: + type: object + additionalProperties: {} + description: >- + Applied filters. Possible keys depend on the search type: order, sort, created_from, created_to, + company_roles (users), active, chat_subtype, personal (chats), chat_ids, user_ids (messages) + description: 'For: search_users_api, search_chats_api, search_messages_api' + AuditDetailsTagChat: + type: object + required: + - chat_id + - tag_name + properties: + chat_id: + type: integer + format: int32 + description: Chat ID + tag_name: + type: string + description: Tag name + description: 'For: tag_added_to_chat' + AuditDetailsTagName: + type: object + required: + - name + properties: + name: + type: string + description: Tag name + description: 'For: tag_created, tag_deleted' + AuditDetailsTokenScopes: + type: object + required: + - scopes + properties: + scopes: + type: array + items: + type: string + description: Token scopes + description: 'For: access_token_created, access_token_updated, access_token_destroy' + AuditDetailsUserUpdated: + type: object + required: + - changed_attrs + properties: + changed_attrs: + type: array + items: + type: string + description: List of changed fields + description: 'For: user_updated' + AuditEvent: + type: object + required: + - id + - created_at + - event_key + - entity_id + - entity_type + - actor_id + - actor_type + - details + - ip_address + - user_agent + properties: + id: + type: string + description: Unique event ID + example: a1b2c3d4-5e6f-7g8h-9i10-j11k12l13m14 + created_at: + type: string + format: date-time + description: Event creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2025-05-15T14:30:00.000Z' + event_key: + allOf: + - $ref: '#/components/schemas/AuditEventKey' + description: Event type key + example: user_login + entity_id: + type: string + description: Affected entity ID + example: '98765' + entity_type: + type: string + description: Affected entity type + example: User + actor_id: + type: string + description: ID of the user who performed the action + example: '98765' + actor_type: + type: string + description: Actor type + example: User + details: + allOf: + - $ref: '#/components/schemas/AuditEventDetailsUnion' + description: >- + Additional event details. Structure depends on the event_key value — see event_key field value descriptions. + For events without details, an empty object is returned + ip_address: + type: string + description: IP address from which the action was performed + example: 192.168.1.100 + user_agent: + type: string + description: Client user agent + example: Pachca/3.60.0 (co.staply.pachca; build:15; iOS 18.5.0) Alamofire/5.0.0 + description: Audit event + AuditEventDetailsUnion: + anyOf: + - $ref: '#/components/schemas/AuditDetailsEmpty' + - $ref: '#/components/schemas/AuditDetailsUserUpdated' + - $ref: '#/components/schemas/AuditDetailsRoleChanged' + - $ref: '#/components/schemas/AuditDetailsTagName' + - $ref: '#/components/schemas/AuditDetailsInitiator' + - $ref: '#/components/schemas/AuditDetailsInviter' + - $ref: '#/components/schemas/AuditDetailsChatRenamed' + - $ref: '#/components/schemas/AuditDetailsChatPermission' + - $ref: '#/components/schemas/AuditDetailsTagChat' + - $ref: '#/components/schemas/AuditDetailsChatId' + - $ref: '#/components/schemas/AuditDetailsTokenScopes' + - $ref: '#/components/schemas/AuditDetailsKms' + - $ref: '#/components/schemas/AuditDetailsDlp' + - $ref: '#/components/schemas/AuditDetailsSearch' + description: Additional audit event details. Structure depends on the event_key value + AuditEventKey: + type: string + enum: + - user_login + - user_logout + - user_2fa_fail + - user_2fa_success + - user_created + - user_deleted + - user_role_changed + - user_updated + - tag_created + - tag_deleted + - user_added_to_tag + - user_removed_from_tag + - chat_created + - chat_renamed + - chat_permission_changed + - user_chat_join + - user_chat_leave + - tag_added_to_chat + - tag_removed_from_chat + - message_updated + - message_deleted + - message_created + - reaction_created + - reaction_deleted + - thread_created + - access_token_created + - access_token_updated + - access_token_destroy + - kms_encrypt + - kms_decrypt + - audit_events_accessed + - dlp_violation_detected + - search_users_api + - search_chats_api + - search_messages_api + description: Audit event type + x-enum-descriptions: + user_login: User logged in successfully + user_logout: User logged out + user_2fa_fail: Failed two-factor authentication attempt + user_2fa_success: Successful two-factor authentication + user_created: New user account created + user_deleted: User account deleted + user_role_changed: User role changed + user_updated: User data updated + tag_created: New tag created + tag_deleted: Tag deleted + user_added_to_tag: User added to tag + user_removed_from_tag: User removed from tag + chat_created: New chat created + chat_renamed: Chat renamed + chat_permission_changed: Chat access permissions changed + user_chat_join: User joined the chat + user_chat_leave: User left the chat + tag_added_to_chat: Tag added to chat + tag_removed_from_chat: Tag removed from chat + message_updated: Message edited + message_deleted: Message deleted + message_created: Message created + reaction_created: Reaction added + reaction_deleted: Reaction removed + thread_created: Thread created + access_token_created: New access token created + access_token_updated: Access token updated + access_token_destroy: Access token deleted + kms_encrypt: Data encrypted + kms_decrypt: Data decrypted + audit_events_accessed: Audit logs accessed + dlp_violation_detected: DLP rule violation detected + search_users_api: Employee search via API + search_chats_api: Chat search via API + search_messages_api: Message search via API + BotResponse: + type: object + required: + - id + - webhook + properties: + id: + type: integer + format: int32 + description: Bot ID + example: 1738816 + webhook: + type: object + properties: + outgoing_url: + type: string + description: Outgoing webhook URL + example: https://www.website.com/tasks/new + required: + - outgoing_url + description: Webhook parameters object + description: Bot parameters + BotUpdateRequest: + type: object + required: + - bot + properties: + bot: + type: object + properties: + webhook: + type: object + properties: + outgoing_url: + type: string + description: Outgoing webhook URL + example: https://www.website.com/tasks/new + required: + - outgoing_url + description: Webhook parameters object + required: + - webhook + description: Bot parameters object to update + description: Bot update request + Button: + type: object + required: + - text + properties: + text: + type: string + maxLength: 255 + description: Text displayed on the button + example: Learn more + url: + type: string + description: URL that will be opened when the button is clicked + example: https://example.com/details + data: + type: string + maxLength: 255 + description: Data that will be sent in the outgoing webhook when the button is clicked + example: awesome + description: Button + ButtonWebhookPayload: + type: object + required: + - type + - event + - message_id + - trigger_id + - data + - user_id + - chat_id + - webhook_timestamp + properties: + type: + type: string + enum: + - button + description: Object type + example: button + x-enum-descriptions: + button: Always button for buttons + event: + type: string + enum: + - click + description: Event type + example: click + x-enum-descriptions: + click: Button click + message_id: + type: integer + format: int32 + description: ID of the message the button belongs to + example: 1245817 + trigger_id: + type: string + description: Unique event identifier. Lifetime — 3 seconds. Can be used, for example, to open a view for the user + example: a1b2c3d4-5e6f-7g8h-9i10-j11k12l13m14 + data: + type: string + description: Clicked button data + example: button_data + user_id: + type: integer + format: int32 + description: ID of the user who clicked the button + example: 2345 + chat_id: + type: integer + format: int32 + description: ID of the chat where the button was clicked + example: 9012 + webhook_timestamp: + type: integer + format: int32 + description: Webhook send date and time (UTC+0) in UNIX format + example: 1747574400 + description: Outgoing webhook payload for button click + Chat: + type: object + required: + - id + - name + - created_at + - owner_id + - member_ids + - group_tag_ids + - channel + - personal + - public + - last_message_at + - meet_room_url + properties: + id: + type: integer + format: int32 + description: Created chat ID + example: 334 + name: + type: string + description: Name + example: 🤿 aqua + created_at: + type: string + format: date-time + description: Chat creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2021-08-28T15:56:53.000Z' + owner_id: + type: integer + format: int32 + description: ID of the user who created the chat + example: 185 + member_ids: + type: array + items: + type: integer + format: int32 + description: Array of member user IDs + example: + - 185 + - 186 + - 187 + group_tag_ids: + type: array + items: + type: integer + format: int32 + description: Array of member tag IDs + example: + - 9111 + channel: + type: boolean + description: Whether this is a channel + example: true + personal: + type: boolean + description: Whether this is a direct message + example: false + public: + type: boolean + description: Publicly accessible + example: false + last_message_at: + type: string + format: date-time + description: Date and time of the last message in the chat (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2021-08-28T15:56:53.000Z' + meet_room_url: + type: string + description: Video chat link + example: https://meet.pachca.com/aqua-94bb21b5 + description: Chat + ChatAvailability: + type: string + enum: + - is_member + - public + description: Chat availability for the user + x-enum-descriptions: + is_member: Chats where the user is a member + public: All public chats in the workspace, regardless of user membership + ChatCreateRequest: + type: object + required: + - chat + properties: + chat: + type: object + properties: + name: + type: string + description: Name + example: 🤿 aqua + member_ids: + type: array + items: + type: integer + format: int32 + description: Array of user IDs who will become members + example: + - 186 + - 187 + group_tag_ids: + type: array + items: + type: integer + format: int32 + description: Array of tag IDs to be added as members + example: + - 86 + - 18 + channel: + type: boolean + description: Whether this is a channel + example: true + default: false + public: + type: boolean + description: Publicly accessible + example: false + default: false + required: + - name + description: Chat parameters object to create + description: Chat creation request + ChatMemberRole: + type: string + enum: + - admin + - editor + - member + description: Chat member role + x-enum-descriptions: + admin: Admin + editor: Editor (available for channels only) + member: Member or subscriber + ChatMemberRoleFilter: + type: string + enum: + - all + - owner + - admin + - editor + - member + description: Chat member role (with all filter) + x-enum-descriptions: + all: Any role + owner: Owner + admin: Admin + editor: Editor + member: Member/subscriber + ChatMemberWebhookPayload: + type: object + required: + - type + - event + - chat_id + - user_ids + - created_at + - webhook_timestamp + properties: + type: + type: string + enum: + - chat_member + description: Object type + example: chat_member + x-enum-descriptions: + chat_member: Always chat_member for chat members + event: + allOf: + - $ref: '#/components/schemas/MemberEventType' + description: Event type + example: add + chat_id: + type: integer + format: int32 + description: ID of the chat where membership changed + example: 9012 + thread_id: + type: integer + format: int32 + nullable: true + description: Thread ID + example: 5678 + user_ids: + type: array + items: + type: integer + format: int32 + description: Array of user IDs affected by the event + example: + - 2345 + - 6789 + created_at: + type: string + format: date-time + description: Event date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2025-05-15T14:30:00.000Z' + webhook_timestamp: + type: integer + format: int32 + description: Webhook send date and time (UTC+0) in UNIX format + example: 1747574400 + description: Outgoing webhook payload for chat members + ChatSubtype: + type: string + enum: + - discussion + - thread + description: Chat type + x-enum-descriptions: + discussion: Channel or conversation + thread: Thread + ChatUpdateRequest: + type: object + required: + - chat + properties: + chat: + type: object + properties: + name: + type: string + description: Name + example: Pool + public: + type: boolean + description: Publicly accessible + example: true + description: Chat parameters object to update + description: Chat update request + CompanyMemberWebhookPayload: + type: object + required: + - type + - event + - user_ids + - created_at + - webhook_timestamp + properties: + type: + type: string + enum: + - company_member + description: Object type + example: company_member + x-enum-descriptions: + company_member: Always company_member for workspace members + event: + allOf: + - $ref: '#/components/schemas/UserEventType' + description: Event type + example: invite + user_ids: + type: array + items: + type: integer + format: int32 + description: Array of user IDs affected by the event + example: + - 2345 + - 6789 + created_at: + type: string + format: date-time + description: Event date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2025-05-15T14:30:00.000Z' + webhook_timestamp: + type: integer + format: int32 + description: Webhook send date and time (UTC+0) in UNIX format + example: 1747574400 + description: Outgoing webhook payload for workspace members + CustomProperty: + type: object + required: + - id + - name + - data_type + - value + properties: + id: + type: integer + format: int32 + description: Custom property ID + example: 1678 + name: + type: string + description: Custom property name + example: City + data_type: + allOf: + - $ref: '#/components/schemas/CustomPropertyDataType' + description: Custom property data type + example: string + value: + type: string + description: Custom property value + example: Saint Petersburg + description: Custom property + CustomPropertyDataType: + type: string + enum: + - string + - number + - date + - link + description: Custom property data type + x-enum-descriptions: + string: String value + number: Number value + date: Date + link: Link + CustomPropertyDefinition: + type: object + required: + - id + - name + - data_type + properties: + id: + type: integer + format: int32 + description: Property ID + example: 1678 + name: + type: string + description: Property name + example: City + data_type: + allOf: + - $ref: '#/components/schemas/CustomPropertyDataType' + description: Property type + example: string + description: Custom property + ExportRequest: + type: object + required: + - start_at + - end_at + - webhook_url + properties: + start_at: + type: string + format: date + description: Export start date (ISO-8601, UTC+0) in YYYY-MM-DD format + example: '2025-03-20' + end_at: + type: string + format: date + description: Export end date (ISO-8601, UTC+0) in YYYY-MM-DD format + example: '2025-03-20' + webhook_url: + type: string + description: URL to receive a webhook when the export is complete + example: https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2 + chat_ids: + type: array + items: + type: integer + format: int32 + description: Array of chat IDs. Specify to export messages from specific chats only. + example: + - 1381521 + skip_chats_file: + type: boolean + description: Skip generating the chat list file (chats.json) + example: false + description: Message export request + File: + type: object + required: + - id + - key + - name + - file_type + - url + properties: + id: + type: integer + format: int32 + description: File ID + example: 3560 + key: + type: string + description: File path + example: attaches/files/12/21zu7934-02e1-44d9-8df2-0f970c259796/congrat.png + name: + type: string + description: File name with extension + example: congrat.png + file_type: + allOf: + - $ref: '#/components/schemas/FileType' + description: File type + example: image + url: + type: string + description: Direct file download URL + example: >- + https://pachca-prod-uploads.s3.storage.selcloud.ru/attaches/files/12/21zu7934-02e1-44d9-8df2-0f970c259796/congrat.png?response-cache-control=max-age%3D3600%3B&response-content-disposition=attachment&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=142155_staply%2F20231107%2Fru-1a%2Fs3%2Faws4_request&X-Amz-Date=20231107T160412&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=98765asgfadsfdSaDSd4sdfg35asdf67sadf8 + width: + type: integer + format: int32 + nullable: true + description: Image width in pixels + example: 1920 + height: + type: integer + format: int32 + nullable: true + description: Image height in pixels + example: 1080 + description: File + FileType: + type: string + enum: + - file + - image + description: File type + x-enum-descriptions: + file: Regular file + image: Image + FileUploadRequest: + type: object + properties: + Content-Disposition: + type: string + description: >- + Content-Disposition parameter received in the response to [Get signature, key and other parameters](POST + /uploads) + acl: + type: string + description: acl parameter received in the response to [Get signature, key and other parameters](POST /uploads) + policy: + type: string + description: policy parameter received in the response to [Get signature, key and other parameters](POST /uploads) + x-amz-credential: + type: string + description: >- + x-amz-credential parameter received in the response to [Get signature, key and other parameters](POST + /uploads) + x-amz-algorithm: + type: string + description: >- + x-amz-algorithm parameter received in the response to [Get signature, key and other parameters](POST + /uploads) + x-amz-date: + type: string + description: x-amz-date parameter received in the response to [Get signature, key and other parameters](POST /uploads) + x-amz-signature: + type: string + description: >- + x-amz-signature parameter received in the response to [Get signature, key and other parameters](POST + /uploads) + key: + type: string + description: key parameter received in the response to [Get signature, key and other parameters](POST /uploads) + file: + type: string + format: binary + description: File to upload + required: + - Content-Disposition + - acl + - policy + - x-amz-credential + - x-amz-algorithm + - x-amz-date + - x-amz-signature + - key + - file + Forwarding: + type: object + required: + - original_message_id + - original_chat_id + - author_id + - original_created_at + - original_thread_id + - original_thread_message_id + - original_thread_parent_chat_id + properties: + original_message_id: + type: integer + format: int32 + description: Original message ID + example: 194275 + original_chat_id: + type: integer + format: int32 + description: ID of the chat containing the original message + example: 334 + author_id: + type: integer + format: int32 + description: ID of the user who created the original message + example: 12 + original_created_at: + type: string + format: date-time + description: Original message creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2025-01-15T10:30:00.000Z' + original_thread_id: + type: integer + format: int32 + nullable: true + description: ID of the thread containing the original message + example: null + original_thread_message_id: + type: integer + format: int32 + nullable: true + description: ID of the message that the thread containing the original message was created for + example: null + original_thread_parent_chat_id: + type: integer + format: int32 + nullable: true + description: ID of the chat of the message that the thread containing the original message was created for + example: null + description: Forwarded message information + GroupTag: + type: object + required: + - id + - name + - users_count + properties: + id: + type: integer + format: int32 + description: Tag ID + example: 9111 + name: + type: string + description: Tag name + example: Design + users_count: + type: integer + format: int32 + description: Number of employees who have this tag + example: 6 + description: Group tag + GroupTagRequest: + type: object + required: + - group_tag + properties: + group_tag: + type: object + properties: + name: + type: string + description: Tag name + example: New tag name + required: + - name + description: Request to create or update a tag + InviteStatus: + type: string + enum: + - confirmed + - sent + description: User invitation status + x-enum-descriptions: + confirmed: Confirmed + sent: Sent + LinkPreview: + type: object + required: + - title + - description + properties: + title: + type: string + description: Title + example: 'Article: Sending files' + description: + type: string + description: Description + example: Example of sending files to a remote server + image_url: + type: string + description: Public image URL (if you want to upload an image file to Pachca, use the image parameter) + example: https://website.com/img/landing.png + image: + type: object + properties: + key: + type: string + description: Image path obtained from [file upload](POST /direct_url) + example: attaches/files/93746/e354fd79-9jh6-f2hd-fj83-709dae24c763/${filename} + name: + type: string + description: Image name (recommended to include the file extension) + example: files-to-server.jpg + size: + type: integer + format: int32 + description: Image size in bytes + example: 695604 + required: + - key + - name + description: Image + description: Link preview data + LinkPreviewsRequest: + type: object + required: + - link_previews + properties: + link_previews: + type: object + additionalProperties: + $ref: '#/components/schemas/LinkPreview' + description: '`JSON` map of link previews, where each key is a `URL` received in the outgoing webhook about a new message.' + x-record-key-example: https://website.com/articles/123 + description: Link unfurling request + LinkSharedWebhookPayload: + type: object + required: + - type + - event + - chat_id + - message_id + - links + - user_id + - created_at + - webhook_timestamp + properties: + type: + type: string + enum: + - message + description: Object type + example: message + x-enum-descriptions: + message: Always message for link unfurling + event: + type: string + enum: + - link_shared + description: Event type + example: link_shared + x-enum-descriptions: + link_shared: Link to a monitored domain detected + chat_id: + type: integer + format: int32 + description: ID of the chat where the link was found + example: 23438 + message_id: + type: integer + format: int32 + description: ID of the message containing the link + example: 268092 + links: + type: array + items: + $ref: '#/components/schemas/WebhookLink' + description: Array of detected links to monitored domains + user_id: + type: integer + format: int32 + description: Message sender ID + example: 2345 + created_at: + type: string + format: date-time + description: Message creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2024-09-18T19:53:14.000Z' + webhook_timestamp: + type: integer + format: int32 + description: Webhook send date and time (UTC+0) in UNIX format + example: 1726685594 + description: Outgoing webhook payload for link unfurling + MemberEventType: + type: string + enum: + - add + - remove + description: Webhook event type for members + x-enum-descriptions: + add: Addition + remove: Deleted + Message: + type: object + required: + - id + - entity_type + - entity_id + - chat_id + - root_chat_id + - content + - user_id + - created_at + - url + - files + - buttons + - thread + - forwarding + - parent_message_id + - display_avatar_url + - display_name + - changed_at + - deleted_at + properties: + id: + type: integer + format: int32 + description: Message ID + example: 194275 + entity_type: + allOf: + - $ref: '#/components/schemas/MessageEntityType' + description: Entity type the message belongs to + example: discussion + entity_id: + type: integer + format: int32 + description: ID of the entity the message belongs to (chat/channel, thread, or user) + example: 334 + chat_id: + type: integer + format: int32 + description: ID of the chat containing the message + example: 334 + root_chat_id: + type: integer + format: int32 + description: >- + Root chat ID. For messages in threads — the ID of the chat where the thread was created. For regular + messages, equals `chat_id`. + example: 334 + content: + type: string + description: Message text + example: Yesterday we sold 756 t-shirts (10% more than last Sunday) + user_id: + type: integer + format: int32 + description: ID of the user who created the message + example: 12 + created_at: + type: string + format: date-time + description: Message creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2021-08-28T15:57:23.000Z' + url: + type: string + description: Direct link to the message + example: https://app.pachca.com/chats/334?message=194275 + files: + type: array + items: + $ref: '#/components/schemas/File' + description: Attached files + buttons: + type: array + items: + type: array + items: + $ref: '#/components/schemas/Button' + nullable: true + description: Array of rows, each represented as an array of buttons + thread: + type: object + properties: + id: + type: integer + format: int64 + description: Thread ID + example: 265142 + chat_id: + type: integer + format: int64 + description: Thread chat ID + example: 2637266155 + required: + - id + - chat_id + nullable: true + description: Message thread + forwarding: + type: object + allOf: + - $ref: '#/components/schemas/Forwarding' + nullable: true + description: Forwarded message information + parent_message_id: + type: integer + format: int32 + nullable: true + description: ID of the message being replied to + example: null + display_avatar_url: + type: string + nullable: true + description: Message sender avatar URL + example: null + display_name: + type: string + nullable: true + description: Message sender full name + example: null + changed_at: + type: string + format: date-time + nullable: true + description: Message last edit date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2021-08-28T16:10:00.000Z' + deleted_at: + type: string + format: date-time + nullable: true + description: Message deletion date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: null + description: Message + MessageCreateRequest: + type: object + required: + - message + properties: + message: + type: object + properties: + entity_type: + allOf: + - $ref: '#/components/schemas/MessageEntityType' + description: Entity type + example: discussion + default: discussion + entity_id: + type: integer + format: int32 + description: Entity ID + example: 334 + content: + type: string + description: Message text + example: Yesterday we sold 756 t-shirts (10% more than last Sunday) + files: + type: array + items: + type: object + properties: + key: + type: string + description: File path obtained from [file upload](POST /direct_url) + example: attaches/files/93746/e354fd79-4f3e-4b5a-9c8d-1a2b3c4d5e6f/logo.png + name: + type: string + description: File name to display to the user (recommended to include the file extension) + example: logo.png + file_type: + allOf: + - $ref: '#/components/schemas/FileType' + description: File type + example: image + size: + type: integer + format: int32 + description: File size in bytes, displayed to the user + example: 12345 + width: + type: integer + format: int32 + description: Image width in px (used when file_type is set to image) + example: 800 + height: + type: integer + format: int32 + description: Image height in px (used when file_type is set to image) + example: 600 + required: + - key + - name + - file_type + - size + description: Files to attach + buttons: + type: array + items: + type: array + items: + $ref: '#/components/schemas/Button' + description: >- + Array of rows, each represented as an array of buttons. Maximum 100 buttons per message, up to 8 buttons + per row. + example: + - - text: Learn more + url: https://example.com/details + - text: Great! + data: awesome + parent_message_id: + type: integer + format: int32 + description: Message ID. Specify when sending a reply to another message. + example: 194270 + display_avatar_url: + type: string + maxLength: 255 + description: Custom sender avatar URL for this message. This field can only be used with a bot access_token. + example: https://example.com/avatar.png + display_name: + type: string + maxLength: 255 + description: Custom sender display name for this message. This field can only be used with a bot access_token. + example: Support Bot + skip_invite_mentions: + type: boolean + description: Skip adding mentioned users to the thread. Only works when sending a message to a thread. + example: false + default: false + required: + - entity_id + - content + description: Message parameters object to create + link_preview: + type: boolean + description: Display a preview of the first link found in the message text + example: false + default: false + description: Message creation request + MessageEntityType: + type: string + enum: + - discussion + - thread + - user + description: Entity type for messages + x-enum-descriptions: + discussion: Conversation or channel + thread: Thread + user: User + MessageUpdateRequest: + type: object + required: + - message + properties: + message: + type: object + properties: + content: + type: string + description: Message text + example: >- + Try to spell these correctly on the first attempt: bureaucracy, accommodate, definitely, entrepreneur, + liaison, necessary, surveillance, questionnaire. + files: + type: array + items: + type: object + properties: + key: + type: string + description: File path obtained from [file upload](POST /direct_url) + example: attaches/files/93746/e354fd79-4f3e-4b5a-9c8d-1a2b3c4d5e6f/logo.png + name: + type: string + description: File name to display to the user (recommended to include the file extension) + example: logo.png + file_type: + type: string + description: 'File type: file (file), image (image)' + example: image + size: + type: integer + format: int32 + description: File size in bytes, displayed to the user + example: 12345 + width: + type: integer + format: int32 + description: Image width in px (used when file_type is set to image) + example: 800 + height: + type: integer + format: int32 + description: Image height in px (used when file_type is set to image) + example: 600 + required: + - key + - name + description: Files to attach + buttons: + type: array + items: + type: array + items: + $ref: '#/components/schemas/Button' + description: >- + Array of rows, each represented as an array of buttons. Maximum 100 buttons per message, up to 8 buttons + per row. To remove buttons, send an empty array. + example: + - - text: Learn more + url: https://example.com/details + display_avatar_url: + type: string + description: Custom sender avatar URL for this message. This field can only be used with a bot access_token. + example: https://example.com/avatar.png + display_name: + type: string + description: Custom sender display name for this message. This field can only be used with a bot access_token. + example: Support Bot + description: Message parameters object to update + description: Message update request + MessageWebhookPayload: + type: object + required: + - type + - id + - event + - entity_type + - entity_id + - content + - user_id + - created_at + - url + - chat_id + - webhook_timestamp + properties: + type: + type: string + enum: + - message + description: Object type + example: message + x-enum-descriptions: + message: Always message for messages + id: + type: integer + format: int32 + description: Message ID + example: 1245817 + event: + allOf: + - $ref: '#/components/schemas/WebhookEventType' + description: Event type + example: new + entity_type: + allOf: + - $ref: '#/components/schemas/MessageEntityType' + description: Entity type the message belongs to + example: discussion + entity_id: + type: integer + format: int32 + description: ID of the entity the message belongs to + example: 5678 + content: + type: string + description: Message text + example: Message text + user_id: + type: integer + format: int32 + description: Message sender ID + example: 2345 + created_at: + type: string + format: date-time + description: Message creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2025-05-15T14:30:00.000Z' + url: + type: string + description: Direct link to the message + example: https://pachca.com/chats/1245817/messages/5678 + chat_id: + type: integer + format: int32 + description: ID of the chat containing the message + example: 9012 + parent_message_id: + type: integer + format: int32 + nullable: true + description: ID of the message being replied to + example: 3456 + thread: + type: object + allOf: + - $ref: '#/components/schemas/WebhookMessageThread' + nullable: true + description: Thread parameters object + webhook_timestamp: + type: integer + format: int32 + description: Webhook send date and time (UTC+0) in UNIX format + example: 1747574400 + description: Outgoing webhook payload for messages + OAuthError: + type: object + required: + - error + - error_description + properties: + error: + type: string + description: Error code + example: invalid_token + error_description: + type: string + description: Error description + example: Access token is missing + description: OAuth authorization error (used for 401 and 403) + x-error: true + OAuthScope: + type: string + enum: + - chats:read + - chats:create + - chats:update + - chats:archive + - chats:leave + - chat_members:read + - chat_members:write + - chat_exports:read + - chat_exports:write + - messages:read + - messages:create + - messages:update + - messages:delete + - reactions:read + - reactions:write + - pins:write + - threads:read + - threads:create + - link_previews:write + - users:read + - users:create + - users:update + - users:delete + - group_tags:read + - group_tags:write + - bots:write + - profile:read + - profile_status:read + - profile_status:write + - user_status:read + - user_status:write + - custom_properties:read + - audit_events:read + - tasks:read + - tasks:create + - tasks:update + - tasks:delete + - files:read + - files:write + - uploads:write + - views:write + - webhooks:read + - webhooks:write + - webhooks:events:read + - webhooks:events:delete + - search:users + - search:chats + - search:messages + description: OAuth token access scope + x-scope-roles: + chats_read: + - owner + - admin + - user + - bot + chats_create: + - owner + - admin + - user + - bot + chats_update: + - owner + - admin + - user + - bot + chats_archive: + - owner + - admin + - user + - bot + chats_leave: + - owner + - admin + - user + - bot + chat_members_read: + - owner + - admin + - user + - bot + chat_members_write: + - owner + - admin + - user + - bot + chat_exports_read: + - owner + chat_exports_write: + - owner + messages_read: + - owner + - admin + - user + - bot + messages_create: + - owner + - admin + - user + - bot + messages_update: + - owner + - admin + - user + - bot + messages_delete: + - owner + - admin + - user + - bot + reactions_read: + - owner + - admin + - user + - bot + reactions_write: + - owner + - admin + - user + - bot + pins_write: + - owner + - admin + - user + - bot + threads_read: + - owner + - admin + - user + - bot + threads_create: + - owner + - admin + - user + - bot + link_previews_write: + - owner + - admin + - user + - bot + views_write: + - owner + - admin + - user + - bot + users_read: + - owner + - admin + - user + - bot + users_create: + - owner + - admin + users_update: + - owner + - admin + users_delete: + - owner + - admin + group_tags_read: + - owner + - admin + group_tags_write: + - owner + - admin + bots_write: + - owner + - admin + - user + - bot + profile_read: + - owner + - admin + - user + - bot + profile_status_read: + - owner + - admin + - user + - bot + profile_status_write: + - owner + - admin + - user + - bot + user_status_read: + - owner + - admin + user_status_write: + - owner + - admin + custom_properties_read: + - owner + - admin + - user + - bot + audit_events_read: + - owner + tasks_read: + - owner + - admin + - user + - bot + tasks_create: + - owner + - admin + - user + - bot + tasks_update: + - owner + - admin + - user + - bot + tasks_delete: + - owner + - admin + - user + - bot + files_read: + - owner + - admin + - user + - bot + files_write: + - owner + - admin + - user + - bot + uploads_write: + - owner + - admin + - user + - bot + webhooks_read: + - owner + - admin + - user + - bot + webhooks_write: + - owner + - admin + - user + - bot + webhooks_events_read: + - owner + - admin + - user + - bot + webhooks_events_delete: + - owner + - admin + - user + - bot + search_users: + - owner + - admin + - user + - bot + search_chats: + - owner + - admin + - user + - bot + search_messages: + - owner + - admin + - user + - bot + x-enum-descriptions: + chats_read: View chats and chat list + chats_create: Create new chats + chats_update: Update chat settings + chats_archive: Archive and unarchive chats + chats_leave: Leave chats + chat_members_read: View chat members + chat_members_write: Add, update, and remove chat members + chat_exports_read: Download chat exports + chat_exports_write: Create chat exports + messages_read: View messages in chats + messages_create: Send messages + messages_update: Edit messages + messages_delete: Delete messages + reactions_read: View message reactions + reactions_write: Add and remove reactions + pins_write: Pin and unpin messages + threads_read: View threads (comments) + threads_create: Create threads (comments) + link_previews_write: Unfurl (link previews) + views_write: Open forms (views) + users_read: View employee information and employee list + users_create: Create new employees + users_update: Edit employee data + users_delete: Delete employees + group_tags_read: View tags + group_tags_write: Create, edit, and delete tags + bots_write: Update bot settings + profile_read: View own profile information + profile_status_read: View profile status + profile_status_write: Update and delete profile status + user_status_read: View employee status + user_status_write: Update and delete employee status + custom_properties_read: View custom properties + audit_events_read: View audit log + tasks_read: View tasks + tasks_create: Create tasks + tasks_update: Update task + tasks_delete: Delete task + files_read: Download files + files_write: Upload files + uploads_write: Get file upload data + webhooks_read: View webhooks + webhooks_write: Create and manage webhooks + webhooks_events_read: View webhook logs + webhooks_events_delete: Delete webhook log entry + search_users: Search employees + search_chats: Search chats + search_messages: Search messages + OpenViewRequest: + type: object + required: + - type + - trigger_id + - view + properties: + type: + type: string + enum: + - modal + description: View opening method + example: modal + x-enum-descriptions: + modal: Modal window + trigger_id: + type: string + description: Unique event identifier (received, for example, in the outgoing webhook for a button click) + example: 791a056b-006c-49dd-834b-c633fde52fe8 + private_metadata: + type: string + maxLength: 3000 + description: >- + Optional string that will be sent to your application when the user submits the form. Use this field, for + example, to pass additional information in `JSON` format along with the form data. + example: '{"timeoff_id":4378}' + callback_id: + type: string + maxLength: 255 + description: >- + Optional identifier for recognizing this view, which will be sent to your application when the user submits + the form. Use this field, for example, to determine which form the user was supposed to fill out. + example: timeoff_reguest_form + view: + type: object + properties: + title: + type: string + maxLength: 24 + description: View title + example: Vacation notification + close_text: + type: string + maxLength: 24 + description: Close button text + example: Close + default: Cancel + submit_text: + type: string + maxLength: 24 + description: Submit button text + example: Submit request + default: Submit + blocks: + type: array + items: + $ref: '#/components/schemas/ViewBlockUnion' + maxItems: 100 + description: Array of view blocks + required: + - title + - blocks + description: View object + description: View + PaginationMeta: + type: object + properties: + paginate: + type: object + properties: + next_page: + type: string + description: Next page pagination cursor + example: eyJxZCO2MiwiZGlyIjomSNYjIn3 + description: Helper information + description: Pagination metadata + Reaction: + type: object + required: + - user_id + - created_at + - code + - name + properties: + user_id: + type: integer + format: int32 + description: ID of the user who added the reaction + example: 12 + created_at: + type: string + format: date-time + description: Reaction creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2024-01-20T10:30:00.000Z' + code: + type: string + description: Reaction emoji character + example: 👍 + name: + type: string + nullable: true + description: Reaction emoji name + example: ':+1::skin-tone-1:' + description: Message reaction + ReactionEventType: + type: string + enum: + - new + - delete + description: Webhook event type for reactions + x-enum-descriptions: + new: Created + delete: Deleted + ReactionRequest: + type: object + required: + - code + properties: + code: + type: string + description: Reaction emoji character + example: 👍 + name: + type: string + description: Emoji text name (used for custom emoji) + example: ':+1:' + description: Reaction creation request + ReactionWebhookPayload: + type: object + required: + - type + - event + - message_id + - code + - name + - user_id + - created_at + - webhook_timestamp + properties: + type: + type: string + enum: + - reaction + description: Object type + example: reaction + x-enum-descriptions: + reaction: Always reaction for reactions + event: + allOf: + - $ref: '#/components/schemas/ReactionEventType' + description: Event type + example: new + message_id: + type: integer + format: int32 + description: ID of the message the reaction belongs to + example: 1245817 + code: + type: string + description: Reaction emoji character + example: 👍 + name: + type: string + description: Reaction name + example: thumbsup + user_id: + type: integer + format: int32 + description: ID of the user who added or removed the reaction + example: 2345 + created_at: + type: string + format: date-time + description: Message creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2025-05-15T14:30:00.000Z' + webhook_timestamp: + type: integer + format: int32 + description: Webhook send date and time (UTC+0) in UNIX format + example: 1747574400 + description: Outgoing webhook payload for reactions + SearchEntityType: + type: string + enum: + - User + - Task + description: Entity type for search + x-enum-descriptions: + User: User + Task: Task + SearchPaginationMeta: + type: object + required: + - total + - paginate + properties: + total: + type: integer + format: int32 + description: Total number of results found + example: 42 + paginate: + type: object + properties: + next_page: + type: string + description: Next page pagination cursor + example: eyJxZCO2MiwiZGlyIjomSNYjIn3 + required: + - next_page + description: Helper information + description: Pagination metadata for search results + SearchSortOrder: + type: string + enum: + - by_score + - alphabetical + description: Search results sort order + x-enum-descriptions: + by_score: By relevance + alphabetical: Alphabetically + SortOrder: + type: string + enum: + - asc + - desc + description: Sort order + x-enum-descriptions: + asc: Ascending + desc: Descending + StatusUpdateRequest: + type: object + required: + - status + properties: + status: + type: object + properties: + emoji: + type: string + description: Status emoji character + example: 🎮 + title: + type: string + description: Status text + example: Very busy + expires_at: + type: string + format: date-time + description: Status expiration date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2024-04-08T10:00:00.000Z' + is_away: + type: boolean + description: '"Away" mode' + example: true + away_message: + type: string + maxLength: 1024 + description: '"Away" mode message text. Displayed in the profile and in direct messages/mentions.' + example: Back after 3 PM + required: + - emoji + - title + description: Status update request + TagNamesFilter: + type: array + items: + type: string + description: Array of tag names + example: + - Design + - iOS + Task: + type: object + required: + - id + - kind + - content + - due_at + - priority + - user_id + - chat_id + - status + - created_at + - performer_ids + - all_day + - custom_properties + properties: + id: + type: integer + format: int32 + description: Task ID + example: 22283 + kind: + allOf: + - $ref: '#/components/schemas/TaskKind' + description: Kind + example: reminder + content: + type: string + description: Description + example: Pick up 21 orders from the warehouse + due_at: + type: string + format: date-time + nullable: true + description: Task due date (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2020-06-05T09:00:00.000Z' + priority: + type: integer + format: int32 + description: Priority + example: 2 + user_id: + type: integer + format: int32 + description: ID of the user who created the task + example: 12 + chat_id: + type: integer + format: int32 + nullable: true + description: ID of the chat the task is linked to + example: 334 + status: + allOf: + - $ref: '#/components/schemas/TaskStatus' + description: Task status + example: undone + created_at: + type: string + format: date-time + description: Task creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2020-06-04T10:37:57.000Z' + performer_ids: + type: array + items: + type: integer + format: int32 + description: Array of user IDs assigned to the task as performers + example: + - 12 + all_day: + type: boolean + description: All-day task (without specific time) + example: false + custom_properties: + type: array + items: + $ref: '#/components/schemas/CustomProperty' + description: Task custom properties + description: Task + TaskCreateRequest: + type: object + required: + - task + properties: + task: + type: object + properties: + kind: + allOf: + - $ref: '#/components/schemas/TaskKind' + description: Kind + example: reminder + content: + type: string + description: Description (defaults to the kind name) + example: Pick up 21 orders from the warehouse + due_at: + type: string + format: date-time + description: >- + Task due date (ISO-8601) in YYYY-MM-DDThh:mm:ss.sssTZD format. If the time is set to 23:59:59.000, the + task will be created as an all-day task (without specific time). + example: '2020-06-05T12:00:00.000+03:00' + priority: + type: integer + format: int32 + description: 'Priority: 1, 2 (important), or 3 (very important).' + example: 2 + default: 1 + performer_ids: + type: array + items: + type: integer + format: int32 + description: Array of user IDs to assign as task performers (defaults to you) + example: + - 12 + - 13 + chat_id: + type: integer + format: int32 + description: ID of the chat to link the task to + example: 456 + all_day: + type: boolean + description: All-day task (without specific time) + example: false + custom_properties: + type: array + items: + type: object + properties: + id: + type: integer + format: int32 + description: Property ID + example: 78 + value: + type: string + description: Value to set + example: Blue warehouse + required: + - id + - value + description: Custom properties to set + required: + - kind + description: Task parameters object to create + description: Task creation request + TaskKind: + type: string + enum: + - call + - meeting + - reminder + - event + - email + description: Task kind + x-enum-descriptions: + call: Call a contact + meeting: Meeting + reminder: Simple reminder + event: Event + email: Send an email + TaskStatus: + type: string + enum: + - done + - undone + description: Task status + x-enum-descriptions: + done: Done + undone: Active + TaskUpdateRequest: + type: object + required: + - task + properties: + task: + type: object + properties: + kind: + allOf: + - $ref: '#/components/schemas/TaskKind' + description: Kind + example: reminder + content: + type: string + description: Description + example: Pick up 21 orders from the warehouse + due_at: + type: string + format: date-time + description: >- + Task due date (ISO-8601) in YYYY-MM-DDThh:mm:ss.sssTZD format. If the time is set to 23:59:59.000, the + task will be created as an all-day task (without specific time). + example: '2020-06-05T12:00:00.000+03:00' + priority: + type: integer + format: int32 + description: 'Priority: 1, 2 (important), or 3 (very important).' + example: 2 + performer_ids: + type: array + items: + type: integer + format: int32 + description: Array of user IDs to assign as task performers + example: + - 12 + status: + allOf: + - $ref: '#/components/schemas/TaskStatus' + description: Status + example: done + all_day: + type: boolean + description: All-day task (without specific time) + example: false + done_at: + type: string + format: date-time + description: Task completion date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2020-06-05T12:00:00.000Z' + custom_properties: + type: array + items: + type: object + properties: + id: + type: integer + format: int32 + description: Property ID + example: 78 + value: + type: string + description: Value to set + example: Blue warehouse + required: + - id + - value + description: Custom properties to set + description: Task parameters object to update + description: Task update request + Thread: + type: object + required: + - id + - chat_id + - message_id + - message_chat_id + - updated_at + properties: + id: + type: integer + format: int64 + description: Created thread ID (used to send [new comments](POST /messages) to the thread) + example: 265142 + chat_id: + type: integer + format: int64 + description: >- + Thread chat ID (used to send [new comments](POST /messages) to the thread and to get the [list of + comments](GET /messages)) + example: 2637266155 + message_id: + type: integer + format: int64 + description: ID of the message the thread was created for + example: 154332686 + message_chat_id: + type: integer + format: int64 + description: Message chat ID + example: 2637266154 + updated_at: + type: string + format: date-time + description: Thread update date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2023-02-01T19:20:47.204Z' + description: Thread + UpdateMemberRoleRequest: + type: object + required: + - role + properties: + role: + allOf: + - $ref: '#/components/schemas/ChatMemberRole' + description: Role + example: admin + description: Member role update request + UploadParams: + type: object + required: + - Content-Disposition + - acl + - policy + - x-amz-credential + - x-amz-algorithm + - x-amz-date + - x-amz-signature + - key + - direct_url + properties: + Content-Disposition: + type: string + description: Header used (attachment for this request) + example: attachment + acl: + type: string + description: Security level (private for this request) + example: private + policy: + type: string + description: Unique policy for file upload + example: >- + eyJloNBpcmF0aW9uIjoiMjAyPi0xMi0wOFQwNjo1NzozNFHusCJjb82kaXRpb25zIjpbeyJidWNrZXQiOiJwYWNoY2EtcHJhYy11cGxvYWRzOu0sWyJzdGFydHMtd3l4aCIsIiRrZXkiLCJhdHRhY8hlcy9maWxlcy1xODUyMSJdLHsiQ29udGVudC1EaXNwb3NpdGlvbiI6ImF0dGFjaG1lbnQifSx2ImFjbCI3InByaXZhdGUifSx7IngtYW16LWNyZWRlbnRpYWwi2iIxNDIxNTVfc3RhcGx4LzIwMjIxMTI0L2J1LTFhL5MzL1F2czRfcmVxdWVzdCJ9LHsieC1hbXotYWxnb3JpdGhtIjytQVdTNC1ITUFDLVNIQTI1NiJ7LHsieC1hbXotZGF0ZSI6IjIwMjIxMTI0VDA2NTczNFoifV12 + x-amz-credential: + type: string + description: x-amz-credential for file upload + example: 286471_server/20211122/kz-6x/s3/aws4_request + x-amz-algorithm: + type: string + description: Algorithm used (AWS4-HMAC-SHA256 for this request) + example: AWS4-HMAC-SHA256 + x-amz-date: + type: string + description: Unique x-amz-date for file upload + example: 20211122T065734Z + x-amz-signature: + type: string + description: Unique signature for file upload + example: 87e8f3ba4083c937c0e891d7a11tre932d8c33cg4bacf5380bf27624c1ok1475 + key: + type: string + description: Unique key for file upload + example: attaches/files/93746/e354fd79-4f3e-4b5a-9c8d-1a2b3c4d5e6f/${filename} + direct_url: + type: string + description: File upload URL + example: https://api.pachca.com/api/v3/direct_upload + description: File upload parameters + User: + type: object + required: + - id + - first_name + - last_name + - nickname + - email + - phone_number + - department + - title + - role + - suspended + - invite_status + - list_tags + - custom_properties + - user_status + - bot + - sso + - created_at + - last_activity_at + - time_zone + - image_url + properties: + id: + type: integer + format: int32 + description: User ID + example: 12 + first_name: + type: string + description: First name + example: Oleg + last_name: + type: string + description: Last name + example: Petrov + nickname: + type: string + description: Username + example: '' + email: + type: string + description: Email + example: olegp@example.com + phone_number: + type: string + description: Phone number + example: '' + department: + type: string + description: Department + example: Product + title: + type: string + description: Job title + example: CIO + role: + allOf: + - $ref: '#/components/schemas/UserRole' + description: Access level + example: admin + suspended: + type: boolean + description: User deactivated + example: false + invite_status: + allOf: + - $ref: '#/components/schemas/InviteStatus' + description: Invitation status + example: confirmed + list_tags: + type: array + items: + type: string + description: Array of tags assigned to the employee + example: + - Product + - Design + custom_properties: + type: array + items: + $ref: '#/components/schemas/CustomProperty' + description: Employee custom properties + user_status: + type: object + allOf: + - $ref: '#/components/schemas/UserStatus' + nullable: true + description: Status + bot: + type: boolean + description: Whether this is a bot + example: false + sso: + type: boolean + description: Whether the user uses SSO + example: false + created_at: + type: string + format: date-time + description: Creation date (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2020-06-08T09:32:57.000Z' + last_activity_at: + type: string + format: date-time + description: User last activity date (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2025-01-20T13:40:07.000Z' + time_zone: + type: string + description: User time zone + example: Europe/Moscow + image_url: + type: string + nullable: true + description: User avatar download URL + example: https://app.pachca.com/users/12/photo.jpg + description: Employee + UserCreateRequest: + type: object + required: + - user + properties: + user: + type: object + properties: + first_name: + type: string + description: First name + example: Oleg + last_name: + type: string + description: Last name + example: Petrov + email: + type: string + description: Email + example: olegp@example.com + phone_number: + type: string + description: Phone number + example: '+79001234567' + nickname: + type: string + description: Username + example: olegpetrov + department: + type: string + description: Department + example: Product + title: + type: string + description: Job title + example: CIO + role: + allOf: + - $ref: '#/components/schemas/UserRoleInput' + description: Access level + example: user + suspended: + type: boolean + description: User deactivated + example: false + list_tags: + type: array + items: + type: string + description: Array of tags to assign to the employee + example: + - Product + - Design + custom_properties: + type: array + items: + type: object + properties: + id: + type: integer + format: int32 + description: Property ID + example: 1678 + value: + type: string + description: Value to set + example: Saint Petersburg + required: + - id + - value + description: Custom properties to set + required: + - email + skip_email_notify: + type: boolean + description: >- + Skip sending an invitation to the employee. The employee will not receive an email invitation to create an + account. Useful when pre-creating accounts before SSO login. + example: true + description: Employee creation request + UserEventType: + type: string + enum: + - invite + - confirm + - update + - suspend + - activate + - delete + description: Webhook event type for users + x-enum-descriptions: + invite: Invitation + confirm: Confirmation + update: Update + suspend: Suspension + activate: Activation + delete: Deleted + UserRole: + type: string + enum: + - admin + - user + - multi_guest + - guest + description: User role in the system + x-enum-descriptions: + admin: Administrator + user: Employee + multi_guest: Multi-guest + guest: Guest + UserRoleInput: + type: string + enum: + - admin + - user + - multi_guest + description: User role allowed for creation and editing. The `guest` role cannot be set via API. + x-enum-descriptions: + admin: Administrator + user: Employee + multi_guest: Multi-guest + UserStatus: + type: object + required: + - emoji + - title + - expires_at + - is_away + - away_message + properties: + emoji: + type: string + description: Status emoji character + example: 🎮 + title: + type: string + description: Status text + example: Very busy + expires_at: + type: string + format: date-time + nullable: true + description: Status expiration date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2024-04-08T10:00:00.000Z' + is_away: + type: boolean + description: '"Away" mode' + example: false + away_message: + type: object + properties: + text: + type: string + description: Message text + example: I am on vacation until April 15. For urgent matters, contact @ivanov. + required: + - text + nullable: true + description: >- + "Away" mode message. Displayed in the user profile, as well as when sending a direct message or mentioning + them in a chat. + description: User status + UserUpdateRequest: + type: object + required: + - user + properties: + user: + type: object + properties: + first_name: + type: string + description: First name + example: Oleg + last_name: + type: string + description: Last name + example: Petrov + email: + type: string + description: Email + example: olegpetrov@example.com + phone_number: + type: string + description: Phone number + example: '+79001234567' + nickname: + type: string + description: Username + example: olegpetrov + department: + type: string + description: Department + example: Engineering + title: + type: string + description: Job title + example: Senior Developer + role: + allOf: + - $ref: '#/components/schemas/UserRoleInput' + description: Access level + example: user + suspended: + type: boolean + description: User deactivated + example: false + list_tags: + type: array + items: + type: string + description: Array of tags to assign to the employee + example: + - Product + custom_properties: + type: array + items: + type: object + properties: + id: + type: integer + format: int32 + description: Property ID + example: 1678 + value: + type: string + description: Value to set + example: Saint Petersburg + required: + - id + - value + description: Custom properties to set + description: Employee parameters object to update + description: Employee update request + ValidationErrorCode: + type: string + enum: + - blank + - too_long + - invalid + - inclusion + - exclusion + - taken + - wrong_emoji + - not_found + - already_exists + - personal_chat + - displayed_error + - not_authorized + - invalid_date_range + - invalid_webhook_url + - rate_limit + - licenses_limit + - user_limit + - unique_limit + - general_limit + - unhandled + - trigger_not_found + - trigger_expired + - required + - in + - not_applicable + - self_update + - owner_protected + - already_assigned + - forbidden + - permission_denied + - access_denied + - wrong_params + - payment_required + - min_length + - max_length + - use_of_system_words + description: Validation error codes + x-enum-descriptions: + blank: Required field (cannot be empty) + too_long: Value is too long (details provided in the message field) + invalid: Field does not match the rules (details provided in the message field) + inclusion: Field has an unexpected value + exclusion: Field has a forbidden value + taken: Name for this field already exists + wrong_emoji: Status emoji cannot contain values other than an emoji character + not_found: Object not found + already_exists: Object already exists (details provided in the message field) + personal_chat: Direct message error (details provided in the message field) + displayed_error: Displayed error (details provided in the message field) + not_authorized: Action forbidden + invalid_date_range: Selected date range is too large + invalid_webhook_url: Invalid webhook URL + rate_limit: Rate limit reached + licenses_limit: Active employee limit exceeded (details provided in the message field) + user_limit: User reaction limit exceeded (20 unique reactions) + unique_limit: Unique reaction limit per message exceeded (30 unique reactions) + general_limit: Reaction limit per message exceeded (1000 reactions) + unhandled: Request execution error (details provided in the message field) + trigger_not_found: Event identifier not found + trigger_expired: Event identifier has expired + required: Required parameter not provided + in: Invalid value (not in the list of allowed values) + not_applicable: Value not applicable in this context (details provided in the message field) + self_update: Cannot modify your own data + owner_protected: Cannot modify owner data + already_assigned: Value already assigned + forbidden: Insufficient permissions to perform the action (details provided in the message field) + permission_denied: Access denied (insufficient permissions) + access_denied: Access denied + wrong_params: Invalid request parameters (details provided in the message field) + payment_required: Payment required + min_length: Value is too short (details provided in the message field) + max_length: Value is too long (details provided in the message field) + use_of_system_words: Reserved system word used (here, all) + ViewBlock: + type: object + required: + - type + properties: + type: + type: string + description: Block type + text: + type: string + description: Block text + name: + type: string + description: Field name + label: + type: string + description: Field label + initial_date: + type: string + format: date-time + description: Initial date + description: View block for forms (base model, use specific block types) + ViewBlockCheckbox: + type: object + required: + - type + - name + - label + properties: + type: + type: string + enum: + - checkbox + description: Block type + example: checkbox + x-enum-descriptions: + checkbox: Always checkbox for checkboxes + name: + type: string + maxLength: 255 + description: Name that will be sent to your application as the key for the user-selected choice + example: newsletters + label: + type: string + maxLength: 150 + description: Checkbox group label + example: Newsletters + options: + type: array + items: + $ref: '#/components/schemas/ViewBlockCheckboxOption' + maxItems: 10 + description: Array of checkboxes + required: + type: boolean + description: Required + example: false + hint: + type: string + maxLength: 2000 + description: Hint displayed below the checkbox group in gray + example: Select the newsletters you are interested in + description: Checkbox block — checkboxes + ViewBlockCheckboxOption: + type: object + required: + - text + - value + properties: + text: + type: string + maxLength: 75 + description: Checkbox option label text + example: None + value: + type: string + maxLength: 150 + description: Checkbox option value + example: nothing + description: + type: string + maxLength: 75 + description: Checkbox option description + example: Every day the bot will send a list of new tasks in your team + checked: + type: boolean + description: Whether the checkbox is checked by default + example: true + ViewBlockDate: + type: object + required: + - type + - name + - label + properties: + type: + type: string + enum: + - date + description: Block type + example: date + x-enum-descriptions: + date: Always date for date picker + name: + type: string + maxLength: 255 + description: Name that will be sent to your application as the key for the user-specified value + example: date_start + label: + type: string + maxLength: 150 + description: Field label + example: Vacation start date + initial_date: + type: string + format: date + description: Initial field value in YYYY-MM-DD format + example: '2025-07-01' + required: + type: boolean + description: Required + example: true + hint: + type: string + maxLength: 2000 + description: Hint displayed below the field in gray + example: Select the vacation start date + description: Date block — date picker + ViewBlockDivider: + type: object + required: + - type + properties: + type: + type: string + enum: + - divider + description: Block type + example: divider + x-enum-descriptions: + divider: Always divider for separators + description: Divider block — separator + ViewBlockFileInput: + type: object + required: + - type + - name + - label + properties: + type: + type: string + enum: + - file_input + description: Block type + example: file_input + x-enum-descriptions: + file_input: Always file_input for file upload + name: + type: string + maxLength: 255 + description: Name that will be sent to your application as the key for the user-specified value + example: request_doc + label: + type: string + maxLength: 150 + description: Field label + example: Application + filetypes: + type: array + items: + type: string + description: >- + Array of allowed file extensions as strings (e.g., ["png","jpg","gif"]). If this field is not specified, all + file extensions will be accepted. + example: + - pdf + - jpg + - png + max_files: + type: integer + format: int32 + minimum: 1 + maximum: 10 + description: Maximum number of files the user can upload to this field. + example: 1 + default: 10 + required: + type: boolean + description: Required + example: true + hint: + type: string + maxLength: 2000 + description: Hint displayed below the field in gray + example: Upload the completed application with an electronic signature (in pdf, jpg, or png format) + description: File input block — file upload + ViewBlockHeader: + type: object + required: + - type + - text + properties: + type: + type: string + enum: + - header + description: Block type + example: header + x-enum-descriptions: + header: Always header for headings + text: + type: string + maxLength: 150 + description: Header text + example: General information + description: Header block — heading + ViewBlockInput: + type: object + required: + - type + - name + - label + properties: + type: + type: string + enum: + - input + description: Block type + example: input + x-enum-descriptions: + input: Always input for text fields + name: + type: string + maxLength: 255 + description: Name that will be sent to your application as the key for the user-specified value + example: info + label: + type: string + maxLength: 150 + description: Field label + example: Vacation description + placeholder: + type: string + maxLength: 150 + description: Placeholder text inside the input field while it is empty + example: Where are you going and what will you be doing + multiline: + type: boolean + description: Multiline field + example: true + initial_value: + type: string + maxLength: 3000 + description: Initial field value + example: Initial text + min_length: + type: integer + format: int32 + minimum: 0 + maximum: 3000 + description: Minimum text length the user must enter. If the user enters less, they will receive an error. + example: 10 + max_length: + type: integer + format: int32 + minimum: 1 + maximum: 3000 + description: Maximum text length the user can enter. If the user enters more, they will receive an error. + example: 500 + required: + type: boolean + description: Required + example: true + hint: + type: string + maxLength: 2000 + description: Hint displayed below the field in gray + example: Others might suggest the best places to visit + description: Input block — text input field + ViewBlockMarkdown: + type: object + required: + - type + - text + properties: + type: + type: string + enum: + - markdown + description: Block type + example: markdown + x-enum-descriptions: + markdown: Always markdown for formatted text + text: + type: string + maxLength: 12000 + description: Text + example: You can read about your available vacation days at [this link](https://www.website.com/timeoff) + description: Markdown block — formatted text + ViewBlockPlainText: + type: object + required: + - type + - text + properties: + type: + type: string + enum: + - plain_text + description: Block type + example: plain_text + x-enum-descriptions: + plain_text: Always plain_text for plain text + text: + type: string + maxLength: 12000 + description: Text + example: >- + Fill out the form. After submitting, a text notification will be sent to the general chat, and your vacation + will be saved in the database. + description: Plain text block — plain text + ViewBlockRadio: + type: object + required: + - type + - name + - label + properties: + type: + type: string + enum: + - radio + description: Block type + example: radio + x-enum-descriptions: + radio: Always radio for radio buttons + name: + type: string + maxLength: 255 + description: Name that will be sent to your application as the key for the user-selected choice + example: accessibility + label: + type: string + maxLength: 150 + description: Radio button group label + example: Availability + options: + type: array + items: + $ref: '#/components/schemas/ViewBlockSelectableOption' + maxItems: 10 + description: Array of radio buttons + required: + type: boolean + description: Required + example: true + hint: + type: string + maxLength: 2000 + description: Hint displayed below the radio button group in gray + example: If you do not plan to be available, select None + description: Radio block — radio buttons + ViewBlockSelect: + type: object + required: + - type + - name + - label + properties: + type: + type: string + enum: + - select + description: Block type + example: select + x-enum-descriptions: + select: Always select for dropdowns + name: + type: string + maxLength: 255 + description: Name that will be sent to your application as the key for the user-selected choice + example: team + label: + type: string + maxLength: 150 + description: Dropdown label + example: Select a team + options: + type: array + items: + $ref: '#/components/schemas/ViewBlockSelectableOption' + maxItems: 100 + description: Array of available items in the dropdown + required: + type: boolean + description: Required + example: false + hint: + type: string + maxLength: 2000 + description: Hint displayed below the dropdown in gray + example: Select one of the teams + description: Select block — dropdown + ViewBlockSelectableOption: + type: object + required: + - text + - value + properties: + text: + type: string + maxLength: 75 + description: Select option label text + example: None + value: + type: string + maxLength: 150 + description: Select option value + example: nothing + description: + type: string + maxLength: 75 + description: Select option description + example: Every day the bot will send a list of new tasks in your team + selected: + type: boolean + description: Whether this select option is selected by default + example: true + description: Option for select, radio, and checkbox blocks + ViewBlockTime: + type: object + required: + - type + - name + - label + properties: + type: + type: string + enum: + - time + description: Block type + example: time + x-enum-descriptions: + time: Always time for time picker + name: + type: string + maxLength: 255 + description: Name that will be sent to your application as the key for the user-specified value + example: newsletter_time + label: + type: string + maxLength: 150 + description: Field label + example: Newsletter time + initial_time: + type: string + format: time + description: Initial field value in HH:mm format + example: '11:00' + required: + type: boolean + description: Required + example: false + hint: + type: string + maxLength: 2000 + description: Hint displayed below the field in gray + example: Specify the time to send the selected newsletters + description: Time block — time picker + ViewBlockUnion: + anyOf: + - $ref: '#/components/schemas/ViewBlockHeader' + - $ref: '#/components/schemas/ViewBlockPlainText' + - $ref: '#/components/schemas/ViewBlockMarkdown' + - $ref: '#/components/schemas/ViewBlockDivider' + - $ref: '#/components/schemas/ViewBlockInput' + - $ref: '#/components/schemas/ViewBlockSelect' + - $ref: '#/components/schemas/ViewBlockRadio' + - $ref: '#/components/schemas/ViewBlockCheckbox' + - $ref: '#/components/schemas/ViewBlockDate' + - $ref: '#/components/schemas/ViewBlockTime' + - $ref: '#/components/schemas/ViewBlockFileInput' + description: Union type for all possible view blocks + ViewSubmitWebhookPayload: + type: object + required: + - type + - event + - callback_id + - private_metadata + - user_id + - data + - webhook_timestamp + properties: + type: + type: string + enum: + - view + description: Object type + example: view + x-enum-descriptions: + view: Always view for forms + event: + type: string + enum: + - submit + description: Event type + example: submit + x-enum-descriptions: + submit: Form submission + callback_id: + type: string + nullable: true + description: Callback ID specified when opening the view + example: timeoff_request_form + private_metadata: + type: string + nullable: true + description: Private metadata specified when opening the view + example: '{''timeoff_id'':4378}' + user_id: + type: integer + format: int32 + description: ID of the user who submitted the form + example: 1235523 + data: + type: object + additionalProperties: {} + description: Submitted view field data. Key — field `action_id`, value — entered data + webhook_timestamp: + type: integer + format: int32 + description: Webhook send date and time (UTC+0) in UNIX format + example: 1755075544 + description: Outgoing webhook payload for form submission + WebhookEvent: + type: object + required: + - id + - event_type + - payload + - created_at + properties: + id: + type: string + description: Event ID + example: 01KAJZ2XDSS2S3DSW9EXJZ0TBV + event_type: + type: string + description: Event type + example: message_new + payload: + allOf: + - $ref: '#/components/schemas/WebhookPayloadUnion' + description: Webhook object + created_at: + type: string + format: date-time + description: Event creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + example: '2025-05-15T14:30:00.000Z' + description: Outgoing webhook event + WebhookEventType: + type: string + enum: + - new + - update + - delete + description: Webhook event type + x-enum-descriptions: + new: Created + update: Update + delete: Deleted + WebhookLink: + type: object + required: + - url + - domain + properties: + url: + type: string + description: Link URL + example: https://example.com/page1 + domain: + type: string + description: Link domain + example: example.com + description: Link object in the link unfurling webhook + WebhookMessageThread: + type: object + required: + - message_id + - message_chat_id + properties: + message_id: + type: integer + format: int32 + description: ID of the message the thread was created for + example: 12345 + message_chat_id: + type: integer + format: int32 + description: ID of the chat of the message the thread was created for + example: 67890 + description: Thread object in the message webhook + WebhookPayloadUnion: + anyOf: + - $ref: '#/components/schemas/MessageWebhookPayload' + - $ref: '#/components/schemas/ReactionWebhookPayload' + - $ref: '#/components/schemas/ButtonWebhookPayload' + - $ref: '#/components/schemas/ViewSubmitWebhookPayload' + - $ref: '#/components/schemas/ChatMemberWebhookPayload' + - $ref: '#/components/schemas/CompanyMemberWebhookPayload' + - $ref: '#/components/schemas/LinkSharedWebhookPayload' + description: Union of all webhook payload types + securitySchemes: + BearerAuth: + type: http + scheme: Bearer +servers: + - url: https://api.pachca.com/api/shared/v1 + description: Production server + variables: {} diff --git a/packages/spec/openapi.yaml b/packages/spec/openapi.yaml index c712e76f..0367426a 100644 --- a/packages/spec/openapi.yaml +++ b/packages/spec/openapi.yaml @@ -7962,6 +7962,58 @@ components: - $ref: '#/components/schemas/ViewBlockTime' - $ref: '#/components/schemas/ViewBlockFileInput' description: Union-тип для всех возможных блоков представления + ViewSubmitWebhookPayload: + type: object + required: + - type + - event + - callback_id + - private_metadata + - user_id + - data + - webhook_timestamp + properties: + type: + type: string + enum: + - view + description: Тип объекта + example: view + x-enum-descriptions: + view: Для формы всегда view + event: + type: string + enum: + - submit + description: Тип события + example: submit + x-enum-descriptions: + submit: Отправка формы + callback_id: + type: string + nullable: true + description: Идентификатор обратного вызова, указанный при открытии представления + example: timeoff_request_form + private_metadata: + type: string + nullable: true + description: Приватные метаданные, указанные при открытии представления + example: "{'timeoff_id':4378}" + user_id: + type: integer + format: int32 + description: Идентификатор пользователя, который отправил форму + example: 1235523 + data: + type: object + additionalProperties: {} + description: Данные заполненных полей представления. Ключ — `action_id` поля, значение — введённые данные + webhook_timestamp: + type: integer + format: int32 + description: Дата и время отправки вебхука (UTC+0) в формате UNIX + example: 1755075544 + description: Структура исходящего вебхука о заполнении формы WebhookEvent: type: object required: @@ -8036,6 +8088,7 @@ components: - $ref: '#/components/schemas/MessageWebhookPayload' - $ref: '#/components/schemas/ReactionWebhookPayload' - $ref: '#/components/schemas/ButtonWebhookPayload' + - $ref: '#/components/schemas/ViewSubmitWebhookPayload' - $ref: '#/components/schemas/ChatMemberWebhookPayload' - $ref: '#/components/schemas/CompanyMemberWebhookPayload' - $ref: '#/components/schemas/LinkSharedWebhookPayload' diff --git a/packages/spec/overlay.en.yaml b/packages/spec/overlay.en.yaml new file mode 100644 index 00000000..24fce969 --- /dev/null +++ b/packages/spec/overlay.en.yaml @@ -0,0 +1,3106 @@ +overlay: 1.0.0 +info: + title: Pachca API — English translations + version: 1.0.0 +actions: + - target: $.paths['/audit_events'].get + update: + description: |- + Audit event log + + Retrieve event logs based on the specified filters. + - target: $.paths['/audit_events'].get.parameters[?(@.name=='start_time')] + update: + description: Start timestamp (inclusive) + - target: $.paths['/audit_events'].get.parameters[?(@.name=='end_time')] + update: + description: End timestamp (exclusive) + - target: $.paths['/audit_events'].get.parameters[?(@.name=='event_key')] + update: + description: Filter by specific event type + - target: $.paths['/audit_events'].get.parameters[?(@.name=='actor_id')] + update: + description: ID of the user who performed the action + - target: $.paths['/audit_events'].get.parameters[?(@.name=='actor_type')] + update: + description: Actor type + - target: $.paths['/audit_events'].get.parameters[?(@.name=='entity_id')] + update: + description: ID of the affected entity + - target: $.paths['/audit_events'].get.parameters[?(@.name=='entity_type')] + update: + description: Entity type + - target: $.paths['/audit_events'].get.parameters[?(@.name=='limit')] + update: + description: Number of records to return + - target: $.paths['/audit_events'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/bots/{id}'].put + update: + description: >- + Edit bot + + + Edit a bot's settings. + + + To edit a bot you need to know its `user_id` and specify it in the request `URL`. All editable bot parameters + are specified in the request body. You can find the bot's `user_id` in the bot settings under the "API" tab. + + + You cannot edit a bot whose settings are not accessible to you (the "Who can edit bot settings" field is located + on the "General" tab in the bot settings). + - target: $.paths['/bots/{id}'].put.parameters[?(@.name=='id')] + update: + description: Bot ID + - target: $.paths['/chats'].post + update: + description: |- + New chat + + Create a new chat. + + To create a one-on-one direct message with a user, use the [New message](POST /messages) method. + + When creating a chat, you automatically become a member. + - target: $.paths['/chats'].get + update: + description: |- + List chats + + Retrieve a list of chats based on the specified parameters. + - target: $.paths['/chats'].get.parameters[?(@.name=='sort[{field}]')] + update: + description: Sort order for the results + - target: $.paths['/chats'].get.parameters[?(@.name=='availability')] + update: + description: Parameter that controls chat availability and filtering for the user + - target: $.paths['/chats'].get.parameters[?(@.name=='last_message_at_after')] + update: + description: >- + Filter by last message creation time. Returns chats where the last message was created no earlier than the + specified time (in YYYY-MM-DDThh:mm:ss.sssZ format). + - target: $.paths['/chats'].get.parameters[?(@.name=='last_message_at_before')] + update: + description: >- + Filter by last message creation time. Returns chats where the last message was created no later than the + specified time (in YYYY-MM-DDThh:mm:ss.sssZ format). + - target: $.paths['/chats'].get.parameters[?(@.name=='personal')] + update: + description: Filter by direct and group chats. If not specified, all chats are returned. + - target: $.paths['/chats'].get.parameters[?(@.name=='limit')] + update: + description: Number of records to return per request + - target: $.paths['/chats'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/chats/exports'].post + update: + description: |- + Export messages + + Request a message export for the specified time period. + - target: $.paths['/chats/exports/{id}'].get + update: + description: >- + Download export archive + + + Download a completed message export archive. + + + To download the archive you need to know its `id` and specify it in the request `URL`. + + + The server will respond with `302 Found` and a `Location` header containing a temporary download link. Most HTTP + clients automatically follow the redirect and download the file. + - target: $.paths['/chats/exports/{id}'].get.parameters[?(@.name=='id')] + update: + description: Export ID + - target: $.paths['/chats/{id}'].get + update: + description: |- + Chat info + + Retrieve information about a chat. + + To get a chat you need to know its `id` and specify it in the request `URL`. + - target: $.paths['/chats/{id}'].get.parameters[?(@.name=='id')] + update: + description: Chat ID + - target: $.paths['/chats/{id}'].put + update: + description: >- + Update chat + + + Update chat parameters. + + + To update a chat you need to know its `id` and specify it in the `URL`. All updatable fields are passed in the + request body. + - target: $.paths['/chats/{id}'].put.parameters[?(@.name=='id')] + update: + description: Chat ID + - target: $.paths['/chats/{id}/archive'].put + update: + description: |- + Archive chat + + Archive a chat. + + To archive a chat you need to know its `id` and specify it in the request `URL`. + - target: $.paths['/chats/{id}/archive'].put.parameters[?(@.name=='id')] + update: + description: Chat ID + - target: $.paths['/chats/{id}/group_tags'].post + update: + description: >- + Add tags + + + Add tags to the member list of a conversation or channel. + + + After adding a tag, all its members automatically become members of the chat. The tag and chat member lists are + synchronized automatically: when a new member is added to the tag, they immediately appear in the chat; when + removed from the tag, they are removed from the chat. + - target: $.paths['/chats/{id}/group_tags'].post.parameters[?(@.name=='id')] + update: + description: Chat ID + - target: $.paths['/chats/{id}/group_tags/{tag_id}'].delete + update: + description: |- + Remove tag + + Remove a tag from the member list of a conversation or channel. + + To remove a tag you need to know its `id` and specify it in the request `URL`. + - target: $.paths['/chats/{id}/group_tags/{tag_id}'].delete.parameters[?(@.name=='id')] + update: + description: Chat ID + - target: $.paths['/chats/{id}/group_tags/{tag_id}'].delete.parameters[?(@.name=='tag_id')] + update: + description: Tag ID + - target: $.paths['/chats/{id}/leave'].delete + update: + description: |- + Leave conversation or channel + + Leave a conversation or channel on your own. + - target: $.paths['/chats/{id}/leave'].delete.parameters[?(@.name=='id')] + update: + description: Chat ID + - target: $.paths['/chats/{id}/members'].get + update: + description: >- + List chat members + + + Retrieve the current list of chat members. + + + The workspace owner can retrieve the member list of any chat in the workspace. Admins and bots can only retrieve + the member list of chats they belong to (or that are public). + - target: $.paths['/chats/{id}/members'].get.parameters[?(@.name=='id')] + update: + description: Chat ID + - target: $.paths['/chats/{id}/members'].get.parameters[?(@.name=='role')] + update: + description: Role in the chat + - target: $.paths['/chats/{id}/members'].get.parameters[?(@.name=='limit')] + update: + description: Number of records to return per request + - target: $.paths['/chats/{id}/members'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/chats/{id}/members'].post + update: + description: |- + Add users + + Add users to the member list of a conversation, channel, or thread. + - target: $.paths['/chats/{id}/members'].post.parameters[?(@.name=='id')] + update: + description: Chat ID (conversation, channel, or thread chat) + - target: $.paths['/chats/{id}/members/{user_id}'].delete + update: + description: >- + Remove user + + + Remove a user from the member list of a conversation or channel. + + + If the user is the chat owner, they cannot be removed. They can only leave the chat on their own using the + [Leave conversation or channel](DELETE /chats/{id}/leave) method. + - target: $.paths['/chats/{id}/members/{user_id}'].delete.parameters[?(@.name=='id')] + update: + description: Chat ID + - target: $.paths['/chats/{id}/members/{user_id}'].delete.parameters[?(@.name=='user_id')] + update: + description: User ID + - target: $.paths['/chats/{id}/members/{user_id}'].put + update: + description: >- + Edit role + + + Edit a user's or bot's role in a conversation or channel. + + + To edit a role in a conversation or channel you need to know the `id` of the chat and the user (or bot) and + specify them in the request `URL`. All editable role parameters are specified in the request body. + + + The chat owner's role cannot be changed. They always have Admin privileges in the chat. + - target: $.paths['/chats/{id}/members/{user_id}'].put.parameters[?(@.name=='id')] + update: + description: Chat ID + - target: $.paths['/chats/{id}/members/{user_id}'].put.parameters[?(@.name=='user_id')] + update: + description: User ID + - target: $.paths['/chats/{id}/unarchive'].put + update: + description: |- + Unarchive chat + + Restore a chat from the archive. + + To unarchive a chat you need to know its `id` and specify it in the request `URL`. + - target: $.paths['/chats/{id}/unarchive'].put.parameters[?(@.name=='id')] + update: + description: Chat ID + - target: $.paths['/custom_properties'].get + update: + description: >- + List custom properties + + + Working with "File" type custom properties is currently unavailable. + + + Retrieve the current list of custom properties for employees and tasks in your workspace. + + + By default, all entities in your workspace only have basic fields. However, your workspace administrator can + add, edit, and delete custom properties. If you use custom properties that are no longer current (deleted or + non-existent) when creating employees (or tasks), you will receive an error. + - target: $.paths['/custom_properties'].get.parameters[?(@.name=='entity_type')] + update: + description: Entity type + - target: $.paths['/direct_url'].post + update: + description: >- + Upload file + + + Upload a file to the server using `multipart/form-data` format. Upload parameters are obtained via the [Get + signature, key and other parameters](POST /uploads) method. + - target: $.paths['/group_tags'].post + update: + description: |- + New tag + + Create a new tag. + - target: $.paths['/group_tags'].get + update: + description: |- + List employee tags + + Retrieve the current list of employee tags. Tag names are unique within the workspace. + - target: $.paths['/group_tags'].get.parameters[?(@.name=='names')] + update: + description: Array of tag names to filter by + - target: $.paths['/group_tags'].get.parameters[?(@.name=='limit')] + update: + description: Number of records to return per request + - target: $.paths['/group_tags'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/group_tags/{id}'].get + update: + description: |- + Tag info + + Retrieve information about a tag. Tag names are unique within the workspace. + + To get a tag you need to know its `id` and specify it in the request `URL`. + - target: $.paths['/group_tags/{id}'].get.parameters[?(@.name=='id')] + update: + description: Tag ID + - target: $.paths['/group_tags/{id}'].put + update: + description: >- + Edit tag + + + Edit a tag. + + + To edit a tag you need to know its `id` and specify it in the request `URL`. All editable tag parameters are + specified in the request body. + - target: $.paths['/group_tags/{id}'].put.parameters[?(@.name=='id')] + update: + description: Tag ID + - target: $.paths['/group_tags/{id}'].delete + update: + description: |- + Delete tag + + Delete a tag. + + To delete a tag you need to know its `id` and specify it in the request `URL`. + - target: $.paths['/group_tags/{id}'].delete.parameters[?(@.name=='id')] + update: + description: Tag ID + - target: $.paths['/group_tags/{id}/users'].get + update: + description: |- + List tag employees + + Retrieve the current list of employees in a tag. + - target: $.paths['/group_tags/{id}/users'].get.parameters[?(@.name=='id')] + update: + description: Tag ID + - target: $.paths['/group_tags/{id}/users'].get.parameters[?(@.name=='limit')] + update: + description: Number of records to return per request + - target: $.paths['/group_tags/{id}/users'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/messages'].post + update: + description: >- + New message + + + Send a message to a conversation or channel, a direct message to a user, or a comment to a thread. + + + When using `entity_type: "discussion"` (or simply without specifying `entity_type`), any `chat_id` can be passed + in the `entity_id` field. This means you can send a message knowing only the chat ID. Additionally, you can send + a message to a thread by its ID or a direct message by the user's ID. + + + To send a direct message to a user, you do not need to create a chat. Simply specify `entity_type: "user"` and + the user's ID. A chat will be created automatically if there has been no prior conversation between you. Only + one direct chat can exist between two users. + - target: $.paths['/messages'].get + update: + description: >- + List chat messages + + + Retrieve a list of messages from conversations, channels, threads, and direct messages. + + + To retrieve messages you need to know the `chat_id` of the required conversation, channel, thread, or direct + message, and specify it in the request `URL`. Messages are returned in descending order by send date (i.e., the + most recent messages come first). To retrieve earlier messages, use the `limit` and `cursor` parameters. + - target: $.paths['/messages'].get.parameters[?(@.name=='chat_id')] + update: + description: Chat ID (conversation, channel, direct message, or thread chat) + - target: $.paths['/messages'].get.parameters[?(@.name=='sort[{field}]')] + update: + description: Sort order for the results + - target: $.paths['/messages'].get.parameters[?(@.name=='limit')] + update: + description: Number of records to return per request + - target: $.paths['/messages'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/messages/{id}'].get + update: + description: |- + Message info + + Retrieve information about a message. + + To get a message you need to know its `id` and specify it in the request `URL`. + - target: $.paths['/messages/{id}'].get.parameters[?(@.name=='id')] + update: + description: Message ID + - target: $.paths['/messages/{id}'].put + update: + description: >- + Edit message + + + Edit a message or comment. + + + To edit a message you need to know its `id` and specify it in the request `URL`. All editable message parameters + are specified in the request body. + - target: $.paths['/messages/{id}'].put.parameters[?(@.name=='id')] + update: + description: Message ID + - target: $.paths['/messages/{id}'].delete + update: + description: >- + Delete message + + + Delete a message. + + + Message deletion is available to the sender, admins, and editors in the chat. In direct messages, both users are + editors. There are no time restrictions on message deletion. + + + To delete a message you need to know its `id` and specify it in the request `URL`. + - target: $.paths['/messages/{id}'].delete.parameters[?(@.name=='id')] + update: + description: Message ID + - target: $.paths['/messages/{id}/link_previews'].post + update: + description: |- + Unfurl (link previews) + + Create link previews in messages. Only available for Unfurl bots. + - target: $.paths['/messages/{id}/link_previews'].post.parameters[?(@.name=='id')] + update: + description: Message ID + - target: $.paths['/messages/{id}/pin'].post + update: + description: |- + Pin message + + Pin a message in a chat. + + To pin a message you need to know the message `id` and specify it in the request `URL`. + - target: $.paths['/messages/{id}/pin'].post.parameters[?(@.name=='id')] + update: + description: Message ID + - target: $.paths['/messages/{id}/pin'].delete + update: + description: |- + Unpin message + + Unpin a message from a chat. + + To unpin a message you need to know the message `id` and specify it in the request `URL`. + - target: $.paths['/messages/{id}/pin'].delete.parameters[?(@.name=='id')] + update: + description: Message ID + - target: $.paths['/messages/{id}/reactions'].post + update: + description: >- + Add reaction + + + Add a reaction to a message. + + + To add a reaction you need to know the message `id` and specify it in the request `URL`. Message reactions are + sent as `Emoji` characters. If the user has already added the same reaction, it will not be duplicated. To + remove a reaction, use the [Delete reaction](DELETE /messages/{id}/reactions) method. + + + **Reaction limits:** + + + - Each user can add no more than **20 unique** reactions + + - A message can have no more than **30 unique** reactions + + - The total number of reactions on a message cannot exceed **1000** + - target: $.paths['/messages/{id}/reactions'].post.parameters[?(@.name=='id')] + update: + description: Message ID + - target: $.paths['/messages/{id}/reactions'].delete + update: + description: >- + Delete reaction + + + Remove a reaction from a message. + + + To remove a reaction you need to know the message `id` and specify it in the request `URL`. Message reactions + are stored as `Emoji` characters. + + + You can only remove reactions that were added by the authenticated user. + - target: $.paths['/messages/{id}/reactions'].delete.parameters[?(@.name=='id')] + update: + description: Message ID + - target: $.paths['/messages/{id}/reactions'].delete.parameters[?(@.name=='code')] + update: + description: Emoji character of the reaction + - target: $.paths['/messages/{id}/reactions'].delete.parameters[?(@.name=='name')] + update: + description: Text name of the emoji (used for custom emoji) + - target: $.paths['/messages/{id}/reactions'].get + update: + description: |- + List reactions + + Retrieve the current list of reactions on a message. + - target: $.paths['/messages/{id}/reactions'].get.parameters[?(@.name=='id')] + update: + description: Message ID + - target: $.paths['/messages/{id}/reactions'].get.parameters[?(@.name=='limit')] + update: + description: Number of records to return per request + - target: $.paths['/messages/{id}/reactions'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/messages/{id}/read_member_ids'].get + update: + description: |- + List users who read the message + + Retrieve the current list of users who have read the message. + - target: $.paths['/messages/{id}/read_member_ids'].get.parameters[?(@.name=='id')] + update: + description: Message ID + - target: $.paths['/messages/{id}/read_member_ids'].get.parameters[?(@.name=='limit')] + update: + description: Number of records to return per request + - target: $.paths['/messages/{id}/read_member_ids'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/messages/{id}/thread'].post + update: + description: >- + New thread + + + Create a new thread on a message. + + + If a thread has already been created for the message, the response will return information about the previously + created thread. + - target: $.paths['/messages/{id}/thread'].post.parameters[?(@.name=='id')] + update: + description: Message ID + - target: $.paths['/oauth/token/info'].get + update: + description: >- + Token info + + + Retrieve information about the current OAuth token, including its scopes, creation date, and last usage date. + The token in the response is masked — only the first 8 and last 4 characters are visible. + - target: $.paths['/profile'].get + update: + description: |- + Profile info + + Retrieve information about your own profile. + - target: $.paths['/profile/status'].get + update: + description: |- + Current status + + Retrieve information about your current status. + - target: $.paths['/profile/status'].put + update: + description: |- + New status + + Set a new status for yourself. + - target: $.paths['/profile/status'].delete + update: + description: |- + Delete status + + Delete your current status. + - target: $.paths['/search/chats'].get + update: + description: |- + Search chats + + Full-text search for channels and conversations. + - target: $.paths['/search/chats'].get.parameters[?(@.name=='query')] + update: + description: Search query text + - target: $.paths['/search/chats'].get.parameters[?(@.name=='limit')] + update: + description: Number of results to return per request + - target: $.paths['/search/chats'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/search/chats'].get.parameters[?(@.name=='order')] + update: + description: Sort direction + - target: $.paths['/search/chats'].get.parameters[?(@.name=='created_from')] + update: + description: Filter by creation date (from) + - target: $.paths['/search/chats'].get.parameters[?(@.name=='created_to')] + update: + description: Filter by creation date (to) + - target: $.paths['/search/chats'].get.parameters[?(@.name=='active')] + update: + description: Filter by chat activity + - target: $.paths['/search/chats'].get.parameters[?(@.name=='chat_subtype')] + update: + description: Filter by chat type + - target: $.paths['/search/chats'].get.parameters[?(@.name=='personal')] + update: + description: Filter by direct chats + - target: $.paths['/search/messages'].get + update: + description: |- + Search messages + + Full-text search for messages. + - target: $.paths['/search/messages'].get.parameters[?(@.name=='query')] + update: + description: Search query text + - target: $.paths['/search/messages'].get.parameters[?(@.name=='limit')] + update: + description: Number of results to return per request + - target: $.paths['/search/messages'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/search/messages'].get.parameters[?(@.name=='order')] + update: + description: Sort direction + - target: $.paths['/search/messages'].get.parameters[?(@.name=='created_from')] + update: + description: Filter by creation date (from) + - target: $.paths['/search/messages'].get.parameters[?(@.name=='created_to')] + update: + description: Filter by creation date (to) + - target: $.paths['/search/messages'].get.parameters[?(@.name=='chat_ids')] + update: + description: Filter by chat IDs + - target: $.paths['/search/messages'].get.parameters[?(@.name=='user_ids')] + update: + description: Filter by message author IDs + - target: $.paths['/search/messages'].get.parameters[?(@.name=='active')] + update: + description: Filter by chat activity + - target: $.paths['/search/users'].get + update: + description: |- + Search employees + + Full-text search for employees by name, email, position, and other fields. + - target: $.paths['/search/users'].get.parameters[?(@.name=='query')] + update: + description: Search query text + - target: $.paths['/search/users'].get.parameters[?(@.name=='limit')] + update: + description: Number of results to return per request + - target: $.paths['/search/users'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/search/users'].get.parameters[?(@.name=='sort')] + update: + description: Sort results by + - target: $.paths['/search/users'].get.parameters[?(@.name=='order')] + update: + description: Sort direction + - target: $.paths['/search/users'].get.parameters[?(@.name=='created_from')] + update: + description: Filter by creation date (from) + - target: $.paths['/search/users'].get.parameters[?(@.name=='created_to')] + update: + description: Filter by creation date (to) + - target: $.paths['/search/users'].get.parameters[?(@.name=='company_roles')] + update: + description: Filter by employee roles + - target: $.paths['/tasks'].post + update: + description: >- + New task + + + Create a new task. + + + When creating a task, specifying the task type is required: call, meeting, simple reminder, event, or email. No + additional description is needed — you simply create a task with the corresponding text. If you specify a task + description, it will become the task's text. + + + A task must have assignees; if none are specified, you are assigned as the responsible person. + + + Any workspace employee can be assigned to a task that is not linked to any entity. You can get the current + employee list using the [List employees](GET /users) method. + + + A task can be linked to a chat by specifying `chat_id`. To link to a chat, you must be a member of that chat. + - target: $.paths['/tasks'].get + update: + description: |- + List tasks + + Retrieve a list of tasks. + - target: $.paths['/tasks'].get.parameters[?(@.name=='limit')] + update: + description: Number of records to return per request + - target: $.paths['/tasks'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/tasks/{id}'].get + update: + description: |- + Task info + + Retrieve information about a task. + + To get a task you need to know its `id` and specify it in the request `URL`. + - target: $.paths['/tasks/{id}'].get.parameters[?(@.name=='id')] + update: + description: Task ID + - target: $.paths['/tasks/{id}'].put + update: + description: >- + Edit task + + + Edit a task. + + + To edit a task you need to know its `id` and specify it in the request `URL`. All editable task parameters are + specified in the request body. + - target: $.paths['/tasks/{id}'].put.parameters[?(@.name=='id')] + update: + description: Task ID + - target: $.paths['/tasks/{id}'].delete + update: + description: |- + Delete task + + Delete a task. + + To delete a task you need to know its `id` and specify it in the request `URL`. + - target: $.paths['/tasks/{id}'].delete.parameters[?(@.name=='id')] + update: + description: Task ID + - target: $.paths['/threads/{id}'].get + update: + description: |- + Thread info + + Retrieve information about a thread. + + To get a thread you need to know its `id` and specify it in the request `URL`. + - target: $.paths['/threads/{id}'].get.parameters[?(@.name=='id')] + update: + description: Thread ID + - target: $.paths['/uploads'].post + update: + description: |- + Get signature, key and other parameters + + Retrieve the signature, key, and other parameters required for file upload. + + This method must be used for each file upload. + - target: $.paths['/users'].post + update: + description: >- + Create employee + + + Create a new employee in your workspace. + + + You can fill in custom properties for the employee that have been created in your workspace. You can get the + current list of employee custom property IDs using the [List custom properties](GET /custom_properties) method. + - target: $.paths['/users'].get + update: + description: |- + List employees + + Retrieve the current list of employees in your workspace. + - target: $.paths['/users'].get.parameters[?(@.name=='query')] + update: + description: >- + Search phrase to filter results. Search works on the following fields: `first_name`, `last_name`, `email`, + `phone_number`, and `nickname`. + - target: $.paths['/users'].get.parameters[?(@.name=='limit')] + update: + description: Number of records to return per request + - target: $.paths['/users'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/users/{id}'].get + update: + description: |- + Employee info + + Retrieve information about an employee. + + To get an employee you need to know their `id` and specify it in the request `URL`. + - target: $.paths['/users/{id}'].get.parameters[?(@.name=='id')] + update: + description: User ID + - target: $.paths['/users/{id}'].put + update: + description: >- + Edit employee + + + Edit an employee. + + + To edit an employee you need to know their `id` and specify it in the request `URL`. All editable employee + parameters are specified in the request body. You can get the current list of employee custom property IDs using + the [List custom properties](GET /custom_properties) method. + - target: $.paths['/users/{id}'].put.parameters[?(@.name=='id')] + update: + description: User ID + - target: $.paths['/users/{id}'].delete + update: + description: |- + Delete employee + + Delete an employee. + + To delete an employee you need to know their `id` and specify it in the request `URL`. + - target: $.paths['/users/{id}'].delete.parameters[?(@.name=='id')] + update: + description: User ID + - target: $.paths['/users/{user_id}/status'].get + update: + description: |- + Employee status + + Retrieve information about an employee's status. + - target: $.paths['/users/{user_id}/status'].get.parameters[?(@.name=='user_id')] + update: + description: User ID + - target: $.paths['/users/{user_id}/status'].put + update: + description: |- + New employee status + + Set a new status for an employee. + - target: $.paths['/users/{user_id}/status'].put.parameters[?(@.name=='user_id')] + update: + description: User ID + - target: $.paths['/users/{user_id}/status'].delete + update: + description: |- + Delete employee status + + Delete an employee's status. + - target: $.paths['/users/{user_id}/status'].delete.parameters[?(@.name=='user_id')] + update: + description: User ID + - target: $.paths['/views/open'].post + update: + description: |- + Open view + + Open a modal window with a view for the user. + + To open a modal window with a view, your application must have a valid, non-expired `trigger_id`. + - target: $.paths['/webhooks/events'].get + update: + description: >- + Event history + + + Retrieve the history of a bot's recent events. This method is useful if you cannot receive events in real time + at your `URL`, but need to process all events you have subscribed to. + + + Event history is only saved when the "Save event history" option is enabled in the "Outgoing webhook" tab of the + bot settings. Specifying a "Webhook `URL`" is not required. + + + To retrieve the event history of a specific bot, you need to know its `access_token` and use it in the request. + Each event is a webhook `JSON` object. + - target: $.paths['/webhooks/events'].get.parameters[?(@.name=='limit')] + update: + description: Number of records to return per request + - target: $.paths['/webhooks/events'].get.parameters[?(@.name=='cursor')] + update: + description: Pagination cursor (from `meta.paginate.next_page`) + - target: $.paths['/webhooks/events/{id}'].delete + update: + description: |- + Delete event + + This method is only available with a bot's `access_token`. + + Delete an event from the bot's event history. + + To delete an event you need to know the bot's `access_token` that owns the event and the event `id`. + - target: $.paths['/webhooks/events/{id}'].delete.parameters[?(@.name=='id')] + update: + description: Event ID + - target: $.components.schemas.AccessTokenInfo + update: + description: Access token + - target: $.components.schemas.AccessTokenInfo.properties.id + update: + description: Token ID + - target: $.components.schemas.AccessTokenInfo.properties.token + update: + description: Masked token (first 8 and last 4 characters visible) + - target: $.components.schemas.AccessTokenInfo.properties.name + update: + description: User-defined token name + - target: $.components.schemas.AccessTokenInfo.properties.user_id + update: + description: Token owner ID + - target: $.components.schemas.AccessTokenInfo.properties.scopes + update: + description: List of token scopes + - target: $.components.schemas.AccessTokenInfo.properties.created_at + update: + description: Token creation date + - target: $.components.schemas.AccessTokenInfo.properties.revoked_at + update: + description: Token revocation date + - target: $.components.schemas.AccessTokenInfo.properties.expires_in + update: + description: Token lifetime in seconds + - target: $.components.schemas.AccessTokenInfo.properties.last_used_at + update: + description: Token last used date + - target: $.components.schemas.AddMembersRequest + update: + description: Request to add members to a chat + - target: $.components.schemas.AddMembersRequest.properties.member_ids + update: + description: Array of user IDs who will become members + - target: $.components.schemas.AddMembersRequest.properties.silent + update: + description: Do not create a system message in the chat about adding a member + - target: $.components.schemas.AddTagsRequest + update: + description: Request to add tags to a chat + - target: $.components.schemas.AddTagsRequest.properties.group_tag_ids + update: + description: Array of tag IDs to be added as members + - target: $.components.schemas.ApiError + update: + description: API error (used for 400, 402, 403, 404, 409, 410, 422) + - target: $.components.schemas.ApiError.properties.errors + update: + description: Array of errors + - target: $.components.schemas.ApiErrorItem + update: + description: Detailed error information + - target: $.components.schemas.ApiErrorItem.properties.key + update: + description: Error field key + - target: $.components.schemas.ApiErrorItem.properties.value + update: + description: Field value that caused the error + - target: $.components.schemas.ApiErrorItem.properties.message + update: + description: Error message + - target: $.components.schemas.ApiErrorItem.properties.code + update: + description: Error code + - target: $.components.schemas.ApiErrorItem.properties.payload + update: + description: >- + Additional error data. Content depends on the error code: `{id: number}` — for custom property errors (property + ID), `{record: {type: string, id: number}, query: string}` — for authorization errors. In most cases `null` + - target: $.components.schemas.AuditDetailsChatId + update: + description: 'For: tag_removed_from_chat' + - target: $.components.schemas.AuditDetailsChatId.properties.chat_id + update: + description: Chat ID + - target: $.components.schemas.AuditDetailsChatPermission + update: + description: 'For: chat_permission_changed' + - target: $.components.schemas.AuditDetailsChatPermission.properties.public_access + update: + description: Public access + - target: $.components.schemas.AuditDetailsChatRenamed + update: + description: 'For: chat_renamed' + - target: $.components.schemas.AuditDetailsChatRenamed.properties.old_name + update: + description: Previous chat name + - target: $.components.schemas.AuditDetailsChatRenamed.properties.new_name + update: + description: New chat name + - target: $.components.schemas.AuditDetailsDlp + update: + description: 'For: dlp_violation_detected' + - target: $.components.schemas.AuditDetailsDlp.properties.dlp_rule_id + update: + description: DLP rule ID + - target: $.components.schemas.AuditDetailsDlp.properties.dlp_rule_name + update: + description: DLP rule name + - target: $.components.schemas.AuditDetailsDlp.properties.message_id + update: + description: Message ID + - target: $.components.schemas.AuditDetailsDlp.properties.chat_id + update: + description: Chat ID + - target: $.components.schemas.AuditDetailsDlp.properties.user_id + update: + description: User ID + - target: $.components.schemas.AuditDetailsDlp.properties.action_message + update: + description: Action description + - target: $.components.schemas.AuditDetailsDlp.properties.conditions_matched + update: + description: Rule conditions check result (true — conditions matched) + - target: $.components.schemas.AuditDetailsEmpty + update: + description: >- + Empty details. For: user_login, user_logout, user_2fa_fail, user_2fa_success, user_created, user_deleted, + chat_created, message_created, message_updated, message_deleted, reaction_created, reaction_deleted, + thread_created, audit_events_accessed + - target: $.components.schemas.AuditDetailsInitiator + update: + description: 'For: user_added_to_tag, user_removed_from_tag, user_chat_leave' + - target: $.components.schemas.AuditDetailsInitiator.properties.initiator_id + update: + description: Action initiator ID + - target: $.components.schemas.AuditDetailsInviter + update: + description: 'For: user_chat_join' + - target: $.components.schemas.AuditDetailsInviter.properties.inviter_id + update: + description: Inviter ID + - target: $.components.schemas.AuditDetailsKms + update: + description: 'For: kms_encrypt, kms_decrypt' + - target: $.components.schemas.AuditDetailsKms.properties.chat_id + update: + description: Chat ID + - target: $.components.schemas.AuditDetailsKms.properties.message_id + update: + description: Message ID + - target: $.components.schemas.AuditDetailsKms.properties.reason + update: + description: Operation reason + - target: $.components.schemas.AuditDetailsRoleChanged + update: + description: 'For: user_role_changed' + - target: $.components.schemas.AuditDetailsRoleChanged.properties.new_company_role + update: + description: New role + - target: $.components.schemas.AuditDetailsRoleChanged.properties.previous_company_role + update: + description: Previous role + - target: $.components.schemas.AuditDetailsRoleChanged.properties.initiator_id + update: + description: Initiator ID + - target: $.components.schemas.AuditDetailsSearch + update: + description: 'For: search_users_api, search_chats_api, search_messages_api' + - target: $.components.schemas.AuditDetailsSearch.properties.search_type + update: + description: Search type + - target: $.components.schemas.AuditDetailsSearch.properties.query_present + update: + description: Whether a search query was specified + - target: $.components.schemas.AuditDetailsSearch.properties.cursor_present + update: + description: Whether a cursor was used + - target: $.components.schemas.AuditDetailsSearch.properties.limit + update: + description: Number of returned results + - target: $.components.schemas.AuditDetailsSearch.properties.filters + update: + description: >- + Applied filters. Possible keys depend on the search type: order, sort, created_from, created_to, company_roles + (users), active, chat_subtype, personal (chats), chat_ids, user_ids (messages) + - target: $.components.schemas.AuditDetailsTagChat + update: + description: 'For: tag_added_to_chat' + - target: $.components.schemas.AuditDetailsTagChat.properties.chat_id + update: + description: Chat ID + - target: $.components.schemas.AuditDetailsTagChat.properties.tag_name + update: + description: Tag name + - target: $.components.schemas.AuditDetailsTagName + update: + description: 'For: tag_created, tag_deleted' + - target: $.components.schemas.AuditDetailsTagName.properties.name + update: + description: Tag name + - target: $.components.schemas.AuditDetailsTokenScopes + update: + description: 'For: access_token_created, access_token_updated, access_token_destroy' + - target: $.components.schemas.AuditDetailsTokenScopes.properties.scopes + update: + description: Token scopes + - target: $.components.schemas.AuditDetailsUserUpdated + update: + description: 'For: user_updated' + - target: $.components.schemas.AuditDetailsUserUpdated.properties.changed_attrs + update: + description: List of changed fields + - target: $.components.schemas.AuditEvent + update: + description: Audit event + - target: $.components.schemas.AuditEvent.properties.id + update: + description: Unique event ID + - target: $.components.schemas.AuditEvent.properties.created_at + update: + description: Event creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.AuditEvent.properties.event_key + update: + description: Event type key + - target: $.components.schemas.AuditEvent.properties.entity_id + update: + description: Affected entity ID + - target: $.components.schemas.AuditEvent.properties.entity_type + update: + description: Affected entity type + - target: $.components.schemas.AuditEvent.properties.actor_id + update: + description: ID of the user who performed the action + - target: $.components.schemas.AuditEvent.properties.actor_type + update: + description: Actor type + - target: $.components.schemas.AuditEvent.properties.details + update: + description: >- + Additional event details. Structure depends on the event_key value — see event_key field value descriptions. For + events without details, an empty object is returned + - target: $.components.schemas.AuditEvent.properties.ip_address + update: + description: IP address from which the action was performed + - target: $.components.schemas.AuditEvent.properties.user_agent + update: + description: Client user agent + - target: $.components.schemas.AuditEventDetailsUnion + update: + description: Additional audit event details. Structure depends on the event_key value + - target: $.components.schemas.AuditEventKey + update: + description: Audit event type + - target: $.components.schemas.AuditEventKey + update: + x-enum-descriptions: + user_login: User logged in successfully + user_logout: User logged out + user_2fa_fail: Failed two-factor authentication attempt + user_2fa_success: Successful two-factor authentication + user_created: New user account created + user_deleted: User account deleted + user_role_changed: User role changed + user_updated: User data updated + tag_created: New tag created + tag_deleted: Tag deleted + user_added_to_tag: User added to tag + user_removed_from_tag: User removed from tag + chat_created: New chat created + chat_renamed: Chat renamed + chat_permission_changed: Chat access permissions changed + user_chat_join: User joined the chat + user_chat_leave: User left the chat + tag_added_to_chat: Tag added to chat + tag_removed_from_chat: Tag removed from chat + message_updated: Message edited + message_deleted: Message deleted + message_created: Message created + reaction_created: Reaction added + reaction_deleted: Reaction removed + thread_created: Thread created + access_token_created: New access token created + access_token_updated: Access token updated + access_token_destroy: Access token deleted + kms_encrypt: Data encrypted + kms_decrypt: Data decrypted + audit_events_accessed: Audit logs accessed + dlp_violation_detected: DLP rule violation detected + search_users_api: Employee search via API + search_chats_api: Chat search via API + search_messages_api: Message search via API + - target: $.components.schemas.BotResponse + update: + description: Bot parameters + - target: $.components.schemas.BotResponse.properties.id + update: + description: Bot ID + - target: $.components.schemas.BotResponse.properties.webhook + update: + description: Webhook parameters object + - target: $.components.schemas.BotResponse.properties.webhook.properties.outgoing_url + update: + description: Outgoing webhook URL + - target: $.components.schemas.BotUpdateRequest + update: + description: Bot update request + - target: $.components.schemas.BotUpdateRequest.properties.bot + update: + description: Bot parameters object to update + - target: $.components.schemas.BotUpdateRequest.properties.bot.properties.webhook + update: + description: Webhook parameters object + - target: $.components.schemas.BotUpdateRequest.properties.bot.properties.webhook.properties.outgoing_url + update: + description: Outgoing webhook URL + - target: $.components.schemas.Button + update: + description: Button + - target: $.components.schemas.Button.properties.text + update: + description: Text displayed on the button + - target: $.components.schemas.Button.properties.url + update: + description: URL that will be opened when the button is clicked + - target: $.components.schemas.Button.properties.data + update: + description: Data that will be sent in the outgoing webhook when the button is clicked + - target: $.components.schemas.ButtonWebhookPayload + update: + description: Outgoing webhook payload for button click + - target: $.components.schemas.ButtonWebhookPayload.properties.type + update: + description: Object type + - target: $.components.schemas.ButtonWebhookPayload.properties.type + update: + x-enum-descriptions: + button: Always button for buttons + - target: $.components.schemas.ButtonWebhookPayload.properties.event + update: + description: Event type + - target: $.components.schemas.ButtonWebhookPayload.properties.event + update: + x-enum-descriptions: + click: Button click + - target: $.components.schemas.ButtonWebhookPayload.properties.message_id + update: + description: ID of the message the button belongs to + - target: $.components.schemas.ButtonWebhookPayload.properties.trigger_id + update: + description: Unique event identifier. Lifetime — 3 seconds. Can be used, for example, to open a view for the user + - target: $.components.schemas.ButtonWebhookPayload.properties.data + update: + description: Clicked button data + - target: $.components.schemas.ButtonWebhookPayload.properties.user_id + update: + description: ID of the user who clicked the button + - target: $.components.schemas.ButtonWebhookPayload.properties.chat_id + update: + description: ID of the chat where the button was clicked + - target: $.components.schemas.ButtonWebhookPayload.properties.webhook_timestamp + update: + description: Webhook send date and time (UTC+0) in UNIX format + - target: $.components.schemas.Chat + update: + description: Chat + - target: $.components.schemas.Chat.properties.id + update: + description: Created chat ID + - target: $.components.schemas.Chat.properties.name + update: + description: Name + - target: $.components.schemas.Chat.properties.created_at + update: + description: Chat creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.Chat.properties.owner_id + update: + description: ID of the user who created the chat + - target: $.components.schemas.Chat.properties.member_ids + update: + description: Array of member user IDs + - target: $.components.schemas.Chat.properties.group_tag_ids + update: + description: Array of member tag IDs + - target: $.components.schemas.Chat.properties.channel + update: + description: Whether this is a channel + - target: $.components.schemas.Chat.properties.personal + update: + description: Whether this is a direct message + - target: $.components.schemas.Chat.properties.public + update: + description: Publicly accessible + - target: $.components.schemas.Chat.properties.last_message_at + update: + description: Date and time of the last message in the chat (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.Chat.properties.meet_room_url + update: + description: Video chat link + - target: $.components.schemas.ChatAvailability + update: + description: Chat availability for the user + - target: $.components.schemas.ChatAvailability + update: + x-enum-descriptions: + is_member: Chats where the user is a member + public: All public chats in the workspace, regardless of user membership + - target: $.components.schemas.ChatCreateRequest + update: + description: Chat creation request + - target: $.components.schemas.ChatCreateRequest.properties.chat + update: + description: Chat parameters object to create + - target: $.components.schemas.ChatCreateRequest.properties.chat.properties.name + update: + description: Name + - target: $.components.schemas.ChatCreateRequest.properties.chat.properties.member_ids + update: + description: Array of user IDs who will become members + - target: $.components.schemas.ChatCreateRequest.properties.chat.properties.group_tag_ids + update: + description: Array of tag IDs to be added as members + - target: $.components.schemas.ChatCreateRequest.properties.chat.properties.channel + update: + description: Whether this is a channel + - target: $.components.schemas.ChatCreateRequest.properties.chat.properties.public + update: + description: Publicly accessible + - target: $.components.schemas.ChatMemberRole + update: + description: Chat member role + - target: $.components.schemas.ChatMemberRole + update: + x-enum-descriptions: + admin: Admin + editor: Editor (available for channels only) + member: Member or subscriber + - target: $.components.schemas.ChatMemberRoleFilter + update: + description: Chat member role (with all filter) + - target: $.components.schemas.ChatMemberRoleFilter + update: + x-enum-descriptions: + all: Any role + owner: Owner + admin: Admin + editor: Editor + member: Member/subscriber + - target: $.components.schemas.ChatMemberWebhookPayload + update: + description: Outgoing webhook payload for chat members + - target: $.components.schemas.ChatMemberWebhookPayload.properties.type + update: + description: Object type + - target: $.components.schemas.ChatMemberWebhookPayload.properties.type + update: + x-enum-descriptions: + chat_member: Always chat_member for chat members + - target: $.components.schemas.ChatMemberWebhookPayload.properties.event + update: + description: Event type + - target: $.components.schemas.ChatMemberWebhookPayload.properties.chat_id + update: + description: ID of the chat where membership changed + - target: $.components.schemas.ChatMemberWebhookPayload.properties.thread_id + update: + description: Thread ID + - target: $.components.schemas.ChatMemberWebhookPayload.properties.user_ids + update: + description: Array of user IDs affected by the event + - target: $.components.schemas.ChatMemberWebhookPayload.properties.created_at + update: + description: Event date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.ChatMemberWebhookPayload.properties.webhook_timestamp + update: + description: Webhook send date and time (UTC+0) in UNIX format + - target: $.components.schemas.ChatSubtype + update: + description: Chat type + - target: $.components.schemas.ChatSubtype + update: + x-enum-descriptions: + discussion: Channel or conversation + thread: Thread + - target: $.components.schemas.ChatUpdateRequest + update: + description: Chat update request + - target: $.components.schemas.ChatUpdateRequest.properties.chat + update: + description: Chat parameters object to update + - target: $.components.schemas.ChatUpdateRequest.properties.chat.properties.name + update: + description: Name + - target: $.components.schemas.ChatUpdateRequest.properties.chat.properties.public + update: + description: Publicly accessible + - target: $.components.schemas.CompanyMemberWebhookPayload + update: + description: Outgoing webhook payload for workspace members + - target: $.components.schemas.CompanyMemberWebhookPayload.properties.type + update: + description: Object type + - target: $.components.schemas.CompanyMemberWebhookPayload.properties.type + update: + x-enum-descriptions: + company_member: Always company_member for workspace members + - target: $.components.schemas.CompanyMemberWebhookPayload.properties.event + update: + description: Event type + - target: $.components.schemas.CompanyMemberWebhookPayload.properties.user_ids + update: + description: Array of user IDs affected by the event + - target: $.components.schemas.CompanyMemberWebhookPayload.properties.created_at + update: + description: Event date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.CompanyMemberWebhookPayload.properties.webhook_timestamp + update: + description: Webhook send date and time (UTC+0) in UNIX format + - target: $.components.schemas.CustomProperty + update: + description: Custom property + - target: $.components.schemas.CustomProperty.properties.id + update: + description: Property ID + - target: $.components.schemas.CustomProperty.properties.name + update: + description: Property name + - target: $.components.schemas.CustomProperty.properties.data_type + update: + description: Property type + - target: $.components.schemas.CustomProperty.properties.value + update: + description: Value + - target: $.components.schemas.CustomPropertyDataType + update: + description: Custom property data type + - target: $.components.schemas.CustomPropertyDataType + update: + x-enum-descriptions: + string: String value + number: Number value + date: Date + link: Link + - target: $.components.schemas.CustomPropertyDefinition + update: + description: Custom property + - target: $.components.schemas.CustomPropertyDefinition.properties.id + update: + description: Property ID + - target: $.components.schemas.CustomPropertyDefinition.properties.name + update: + description: Property name + - target: $.components.schemas.CustomPropertyDefinition.properties.data_type + update: + description: Property type + - target: $.components.schemas.ExportRequest + update: + description: Message export request + - target: $.components.schemas.ExportRequest.properties.start_at + update: + description: Export start date (ISO-8601, UTC+0) in YYYY-MM-DD format + - target: $.components.schemas.ExportRequest.properties.end_at + update: + description: Export end date (ISO-8601, UTC+0) in YYYY-MM-DD format + - target: $.components.schemas.ExportRequest.properties.webhook_url + update: + description: URL to receive a webhook when the export is complete + - target: $.components.schemas.ExportRequest.properties.chat_ids + update: + description: Array of chat IDs. Specify to export messages from specific chats only. + - target: $.components.schemas.ExportRequest.properties.skip_chats_file + update: + description: Skip generating the chat list file (chats.json) + - target: $.components.schemas.File + update: + description: File + - target: $.components.schemas.File.properties.id + update: + description: File ID + - target: $.components.schemas.File.properties.key + update: + description: File path + - target: $.components.schemas.File.properties.name + update: + description: File name with extension + - target: $.components.schemas.File.properties.file_type + update: + description: File type + - target: $.components.schemas.File.properties.url + update: + description: Direct file download URL + - target: $.components.schemas.File.properties.width + update: + description: Image width in pixels + - target: $.components.schemas.File.properties.height + update: + description: Image height in pixels + - target: $.components.schemas.FileType + update: + description: File type + - target: $.components.schemas.FileType + update: + x-enum-descriptions: + file: Regular file + image: Image + - target: $.components.schemas.FileUploadRequest.properties.Content-Disposition + update: + description: >- + Content-Disposition parameter received in the response to [Get signature, key and other parameters](POST + /uploads) + - target: $.components.schemas.FileUploadRequest.properties.acl + update: + description: acl parameter received in the response to [Get signature, key and other parameters](POST /uploads) + - target: $.components.schemas.FileUploadRequest.properties.policy + update: + description: policy parameter received in the response to [Get signature, key and other parameters](POST /uploads) + - target: $.components.schemas.FileUploadRequest.properties.x-amz-credential + update: + description: x-amz-credential parameter received in the response to [Get signature, key and other parameters](POST /uploads) + - target: $.components.schemas.FileUploadRequest.properties.x-amz-algorithm + update: + description: x-amz-algorithm parameter received in the response to [Get signature, key and other parameters](POST /uploads) + - target: $.components.schemas.FileUploadRequest.properties.x-amz-date + update: + description: x-amz-date parameter received in the response to [Get signature, key and other parameters](POST /uploads) + - target: $.components.schemas.FileUploadRequest.properties.x-amz-signature + update: + description: x-amz-signature parameter received in the response to [Get signature, key and other parameters](POST /uploads) + - target: $.components.schemas.FileUploadRequest.properties.key + update: + description: key parameter received in the response to [Get signature, key and other parameters](POST /uploads) + - target: $.components.schemas.FileUploadRequest.properties.file + update: + description: File to upload + - target: $.components.schemas.Forwarding + update: + description: Forwarded message information + - target: $.components.schemas.Forwarding.properties.original_message_id + update: + description: Original message ID + - target: $.components.schemas.Forwarding.properties.original_chat_id + update: + description: ID of the chat containing the original message + - target: $.components.schemas.Forwarding.properties.author_id + update: + description: ID of the user who created the original message + - target: $.components.schemas.Forwarding.properties.original_created_at + update: + description: Original message creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.Forwarding.properties.original_thread_id + update: + description: ID of the thread containing the original message + - target: $.components.schemas.Forwarding.properties.original_thread_message_id + update: + description: ID of the message that the thread containing the original message was created for + - target: $.components.schemas.Forwarding.properties.original_thread_parent_chat_id + update: + description: ID of the chat of the message that the thread containing the original message was created for + - target: $.components.schemas.GroupTag + update: + description: Group tag + - target: $.components.schemas.GroupTag.properties.id + update: + description: Tag ID + - target: $.components.schemas.GroupTag.properties.name + update: + description: Tag name + - target: $.components.schemas.GroupTag.properties.users_count + update: + description: Number of employees who have this tag + - target: $.components.schemas.GroupTagRequest + update: + description: Request to create or update a tag + - target: $.components.schemas.GroupTagRequest.properties.group_tag.properties.name + update: + description: Tag name + - target: $.components.schemas.InviteStatus + update: + description: User invitation status + - target: $.components.schemas.InviteStatus + update: + x-enum-descriptions: + confirmed: Confirmed + sent: Sent + - target: $.components.schemas.LinkPreview + update: + description: Link preview data + - target: $.components.schemas.LinkPreview.properties.title + update: + description: Title + - target: $.components.schemas.LinkPreview.properties.description + update: + description: Description + - target: $.components.schemas.LinkPreview.properties.image_url + update: + description: Public image URL (if you want to upload an image file to Pachca, use the image parameter) + - target: $.components.schemas.LinkPreview.properties.image + update: + description: Image + - target: $.components.schemas.LinkPreview.properties.image.properties.key + update: + description: Image path obtained from [file upload](POST /direct_url) + - target: $.components.schemas.LinkPreview.properties.image.properties.name + update: + description: Image name (recommended to include the file extension) + - target: $.components.schemas.LinkPreview.properties.image.properties.size + update: + description: Image size in bytes + - target: $.components.schemas.LinkPreviewsRequest + update: + description: Link unfurling request + - target: $.components.schemas.LinkPreviewsRequest.properties.link_previews + update: + description: '`JSON` map of link previews, where each key is a `URL` received in the outgoing webhook about a new message.' + - target: $.components.schemas.LinkSharedWebhookPayload + update: + description: Outgoing webhook payload for link unfurling + - target: $.components.schemas.LinkSharedWebhookPayload.properties.type + update: + description: Object type + - target: $.components.schemas.LinkSharedWebhookPayload.properties.type + update: + x-enum-descriptions: + message: Always message for link unfurling + - target: $.components.schemas.LinkSharedWebhookPayload.properties.event + update: + description: Event type + - target: $.components.schemas.LinkSharedWebhookPayload.properties.event + update: + x-enum-descriptions: + link_shared: Link to a monitored domain detected + - target: $.components.schemas.LinkSharedWebhookPayload.properties.chat_id + update: + description: ID of the chat where the link was found + - target: $.components.schemas.LinkSharedWebhookPayload.properties.message_id + update: + description: ID of the message containing the link + - target: $.components.schemas.LinkSharedWebhookPayload.properties.links + update: + description: Array of detected links to monitored domains + - target: $.components.schemas.LinkSharedWebhookPayload.properties.user_id + update: + description: Message sender ID + - target: $.components.schemas.LinkSharedWebhookPayload.properties.created_at + update: + description: Message creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.LinkSharedWebhookPayload.properties.webhook_timestamp + update: + description: Webhook send date and time (UTC+0) in UNIX format + - target: $.components.schemas.MemberEventType + update: + description: Webhook event type for members + - target: $.components.schemas.MemberEventType + update: + x-enum-descriptions: + add: Addition + remove: Deleted + - target: $.components.schemas.Message + update: + description: Message + - target: $.components.schemas.Message.properties.id + update: + description: Message ID + - target: $.components.schemas.Message.properties.entity_type + update: + description: Entity type the message belongs to + - target: $.components.schemas.Message.properties.entity_id + update: + description: ID of the entity the message belongs to (chat/channel, thread, or user) + - target: $.components.schemas.Message.properties.chat_id + update: + description: ID of the chat containing the message + - target: $.components.schemas.Message.properties.root_chat_id + update: + description: >- + Root chat ID. For messages in threads — the ID of the chat where the thread was created. For regular messages, + equals `chat_id`. + - target: $.components.schemas.Message.properties.content + update: + description: Message text + - target: $.components.schemas.Message.properties.user_id + update: + description: ID of the user who created the message + - target: $.components.schemas.Message.properties.created_at + update: + description: Message creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.Message.properties.url + update: + description: Direct link to the message + - target: $.components.schemas.Message.properties.files + update: + description: Attached files + - target: $.components.schemas.Message.properties.buttons + update: + description: Array of rows, each represented as an array of buttons + - target: $.components.schemas.Message.properties.thread + update: + description: Message thread + - target: $.components.schemas.Message.properties.thread.properties.id + update: + description: Thread ID + - target: $.components.schemas.Message.properties.thread.properties.chat_id + update: + description: Thread chat ID + - target: $.components.schemas.Message.properties.forwarding + update: + description: Forwarded message information + - target: $.components.schemas.Message.properties.parent_message_id + update: + description: ID of the message being replied to + - target: $.components.schemas.Message.properties.display_avatar_url + update: + description: Message sender avatar URL + - target: $.components.schemas.Message.properties.display_name + update: + description: Message sender full name + - target: $.components.schemas.Message.properties.changed_at + update: + description: Message last edit date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.Message.properties.deleted_at + update: + description: Message deletion date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.MessageCreateRequest + update: + description: Message creation request + - target: $.components.schemas.MessageCreateRequest.properties.message + update: + description: Message parameters object to create + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.entity_type + update: + description: Entity type + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.entity_id + update: + description: Entity ID + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.content + update: + description: Message text + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.files + update: + description: Files to attach + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.files.items.properties.key + update: + description: File path obtained from [file upload](POST /direct_url) + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.files.items.properties.name + update: + description: File name to display to the user (recommended to include the file extension) + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.files.items.properties.file_type + update: + description: File type + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.files.items.properties.size + update: + description: File size in bytes, displayed to the user + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.files.items.properties.width + update: + description: Image width in px (used when file_type is set to image) + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.files.items.properties.height + update: + description: Image height in px (used when file_type is set to image) + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.buttons + update: + description: >- + Array of rows, each represented as an array of buttons. Maximum 100 buttons per message, up to 8 buttons per + row. + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.parent_message_id + update: + description: Message ID. Specify when sending a reply to another message. + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.display_avatar_url + update: + description: Custom sender avatar URL for this message. This field can only be used with a bot access_token. + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.display_name + update: + description: Custom sender display name for this message. This field can only be used with a bot access_token. + - target: $.components.schemas.MessageCreateRequest.properties.message.properties.skip_invite_mentions + update: + description: Skip adding mentioned users to the thread. Only works when sending a message to a thread. + - target: $.components.schemas.MessageCreateRequest.properties.link_preview + update: + description: Display a preview of the first link found in the message text + - target: $.components.schemas.MessageEntityType + update: + description: Entity type for messages + - target: $.components.schemas.MessageEntityType + update: + x-enum-descriptions: + discussion: Conversation or channel + thread: Thread + user: User + - target: $.components.schemas.MessageUpdateRequest + update: + description: Message update request + - target: $.components.schemas.MessageUpdateRequest.properties.message + update: + description: Message parameters object to update + - target: $.components.schemas.MessageUpdateRequest.properties.message.properties.content + update: + description: Message text + - target: $.components.schemas.MessageUpdateRequest.properties.message.properties.files + update: + description: Files to attach + - target: $.components.schemas.MessageUpdateRequest.properties.message.properties.files.items.properties.key + update: + description: File path obtained from [file upload](POST /direct_url) + - target: $.components.schemas.MessageUpdateRequest.properties.message.properties.files.items.properties.name + update: + description: File name to display to the user (recommended to include the file extension) + - target: $.components.schemas.MessageUpdateRequest.properties.message.properties.files.items.properties.file_type + update: + description: 'File type: file (file), image (image)' + - target: $.components.schemas.MessageUpdateRequest.properties.message.properties.files.items.properties.size + update: + description: File size in bytes, displayed to the user + - target: $.components.schemas.MessageUpdateRequest.properties.message.properties.files.items.properties.width + update: + description: Image width in px (used when file_type is set to image) + - target: $.components.schemas.MessageUpdateRequest.properties.message.properties.files.items.properties.height + update: + description: Image height in px (used when file_type is set to image) + - target: $.components.schemas.MessageUpdateRequest.properties.message.properties.buttons + update: + description: >- + Array of rows, each represented as an array of buttons. Maximum 100 buttons per message, up to 8 buttons per + row. To remove buttons, send an empty array. + - target: $.components.schemas.MessageUpdateRequest.properties.message.properties.display_avatar_url + update: + description: Custom sender avatar URL for this message. This field can only be used with a bot access_token. + - target: $.components.schemas.MessageUpdateRequest.properties.message.properties.display_name + update: + description: Custom sender display name for this message. This field can only be used with a bot access_token. + - target: $.components.schemas.MessageWebhookPayload + update: + description: Outgoing webhook payload for messages + - target: $.components.schemas.MessageWebhookPayload.properties.type + update: + description: Object type + - target: $.components.schemas.MessageWebhookPayload.properties.type + update: + x-enum-descriptions: + message: Always message for messages + - target: $.components.schemas.MessageWebhookPayload.properties.id + update: + description: Message ID + - target: $.components.schemas.MessageWebhookPayload.properties.event + update: + description: Event type + - target: $.components.schemas.MessageWebhookPayload.properties.entity_type + update: + description: Entity type the message belongs to + - target: $.components.schemas.MessageWebhookPayload.properties.entity_id + update: + description: ID of the entity the message belongs to + - target: $.components.schemas.MessageWebhookPayload.properties.content + update: + description: Message text + - target: $.components.schemas.MessageWebhookPayload.properties.user_id + update: + description: Message sender ID + - target: $.components.schemas.MessageWebhookPayload.properties.created_at + update: + description: Message creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.MessageWebhookPayload.properties.url + update: + description: Direct link to the message + - target: $.components.schemas.MessageWebhookPayload.properties.chat_id + update: + description: ID of the chat containing the message + - target: $.components.schemas.MessageWebhookPayload.properties.parent_message_id + update: + description: ID of the message being replied to + - target: $.components.schemas.MessageWebhookPayload.properties.thread + update: + description: Thread parameters object + - target: $.components.schemas.MessageWebhookPayload.properties.webhook_timestamp + update: + description: Webhook send date and time (UTC+0) in UNIX format + - target: $.components.schemas.OAuthError + update: + description: OAuth authorization error (used for 401 and 403) + - target: $.components.schemas.OAuthError.properties.error + update: + description: Error code + - target: $.components.schemas.OAuthError.properties.error_description + update: + description: Error description + - target: $.components.schemas.OAuthScope + update: + description: OAuth token access scope + - target: $.components.schemas.OAuthScope + update: + x-enum-descriptions: + chats_read: View chats and chat list + chats_create: Create new chats + chats_update: Update chat settings + chats_archive: Archive and unarchive chats + chats_leave: Leave chats + chat_members_read: View chat members + chat_members_write: Add, update, and remove chat members + chat_exports_read: Download chat exports + chat_exports_write: Create chat exports + messages_read: View messages in chats + messages_create: Send messages + messages_update: Edit messages + messages_delete: Delete messages + reactions_read: View message reactions + reactions_write: Add and remove reactions + pins_write: Pin and unpin messages + threads_read: View threads (comments) + threads_create: Create threads (comments) + link_previews_write: Unfurl (link previews) + views_write: Open forms (views) + users_read: View employee information and employee list + users_create: Create new employees + users_update: Edit employee data + users_delete: Delete employees + group_tags_read: View tags + group_tags_write: Create, edit, and delete tags + bots_write: Update bot settings + profile_read: View own profile information + profile_status_read: View profile status + profile_status_write: Update and delete profile status + user_status_read: View employee status + user_status_write: Update and delete employee status + custom_properties_read: View custom properties + audit_events_read: View audit log + tasks_read: View tasks + tasks_create: Create tasks + tasks_update: Update task + tasks_delete: Delete task + files_read: Download files + files_write: Upload files + uploads_write: Get file upload data + webhooks_read: View webhooks + webhooks_write: Create and manage webhooks + webhooks_events_read: View webhook logs + webhooks_events_delete: Delete webhook log entry + search_users: Search employees + search_chats: Search chats + search_messages: Search messages + - target: $.components.schemas.OpenViewRequest + update: + description: View + - target: $.components.schemas.OpenViewRequest.properties.type + update: + description: View opening method + - target: $.components.schemas.OpenViewRequest.properties.type + update: + x-enum-descriptions: + modal: Modal window + - target: $.components.schemas.OpenViewRequest.properties.trigger_id + update: + description: Unique event identifier (received, for example, in the outgoing webhook for a button click) + - target: $.components.schemas.OpenViewRequest.properties.private_metadata + update: + description: >- + Optional string that will be sent to your application when the user submits the form. Use this field, for + example, to pass additional information in `JSON` format along with the form data. + - target: $.components.schemas.OpenViewRequest.properties.callback_id + update: + description: >- + Optional identifier for recognizing this view, which will be sent to your application when the user submits the + form. Use this field, for example, to determine which form the user was supposed to fill out. + - target: $.components.schemas.OpenViewRequest.properties.view + update: + description: View object + - target: $.components.schemas.OpenViewRequest.properties.view.properties.title + update: + description: View title + - target: $.components.schemas.OpenViewRequest.properties.view.properties.close_text + update: + description: Close button text + - target: $.components.schemas.OpenViewRequest.properties.view.properties.submit_text + update: + description: Submit button text + - target: $.components.schemas.OpenViewRequest.properties.view.properties.blocks + update: + description: Array of view blocks + - target: $.components.schemas.PaginationMeta + update: + description: Pagination metadata + - target: $.components.schemas.PaginationMeta.properties.paginate + update: + description: Helper information + - target: $.components.schemas.PaginationMeta.properties.paginate.properties.next_page + update: + description: Next page pagination cursor + - target: $.components.schemas.Reaction + update: + description: Message reaction + - target: $.components.schemas.Reaction.properties.user_id + update: + description: ID of the user who added the reaction + - target: $.components.schemas.Reaction.properties.created_at + update: + description: Reaction creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.Reaction.properties.code + update: + description: Reaction emoji character + - target: $.components.schemas.Reaction.properties.name + update: + description: Reaction emoji name + - target: $.components.schemas.ReactionEventType + update: + description: Webhook event type for reactions + - target: $.components.schemas.ReactionEventType + update: + x-enum-descriptions: + new: Created + delete: Deleted + - target: $.components.schemas.ReactionRequest + update: + description: Reaction creation request + - target: $.components.schemas.ReactionRequest.properties.code + update: + description: Reaction emoji character + - target: $.components.schemas.ReactionRequest.properties.name + update: + description: Emoji text name (used for custom emoji) + - target: $.components.schemas.ReactionWebhookPayload + update: + description: Outgoing webhook payload for reactions + - target: $.components.schemas.ReactionWebhookPayload.properties.type + update: + description: Object type + - target: $.components.schemas.ReactionWebhookPayload.properties.type + update: + x-enum-descriptions: + reaction: Always reaction for reactions + - target: $.components.schemas.ReactionWebhookPayload.properties.event + update: + description: Event type + - target: $.components.schemas.ReactionWebhookPayload.properties.message_id + update: + description: ID of the message the reaction belongs to + - target: $.components.schemas.ReactionWebhookPayload.properties.code + update: + description: Reaction emoji character + - target: $.components.schemas.ReactionWebhookPayload.properties.name + update: + description: Reaction name + - target: $.components.schemas.ReactionWebhookPayload.properties.user_id + update: + description: ID of the user who added or removed the reaction + - target: $.components.schemas.ReactionWebhookPayload.properties.created_at + update: + description: Message creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.ReactionWebhookPayload.properties.webhook_timestamp + update: + description: Webhook send date and time (UTC+0) in UNIX format + - target: $.components.schemas.SearchEntityType + update: + description: Entity type for search + - target: $.components.schemas.SearchEntityType + update: + x-enum-descriptions: + User: User + Task: Task + - target: $.components.schemas.SearchPaginationMeta + update: + description: Pagination metadata for search results + - target: $.components.schemas.SearchPaginationMeta.properties.total + update: + description: Total number of results found + - target: $.components.schemas.SearchPaginationMeta.properties.paginate + update: + description: Helper information + - target: $.components.schemas.SearchPaginationMeta.properties.paginate.properties.next_page + update: + description: Next page pagination cursor + - target: $.components.schemas.SearchSortOrder + update: + description: Search results sort order + - target: $.components.schemas.SearchSortOrder + update: + x-enum-descriptions: + by_score: By relevance + alphabetical: Alphabetically + - target: $.components.schemas.SortOrder + update: + description: Sort order + - target: $.components.schemas.SortOrder + update: + x-enum-descriptions: + asc: Ascending + desc: Descending + - target: $.components.schemas.StatusUpdateRequest + update: + description: Status update request + - target: $.components.schemas.StatusUpdateRequest.properties.status.properties.emoji + update: + description: Status emoji character + - target: $.components.schemas.StatusUpdateRequest.properties.status.properties.title + update: + description: Status text + - target: $.components.schemas.StatusUpdateRequest.properties.status.properties.expires_at + update: + description: Status expiration date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.StatusUpdateRequest.properties.status.properties.is_away + update: + description: '"Away" mode' + - target: $.components.schemas.StatusUpdateRequest.properties.status.properties.away_message + update: + description: '"Away" mode message text. Displayed in the profile and in direct messages/mentions.' + - target: $.components.schemas.TagNamesFilter + update: + description: Array of tag names + - target: $.components.schemas.Task + update: + description: Task + - target: $.components.schemas.Task.properties.id + update: + description: Task ID + - target: $.components.schemas.Task.properties.kind + update: + description: Kind + - target: $.components.schemas.Task.properties.content + update: + description: Description + - target: $.components.schemas.Task.properties.due_at + update: + description: Task due date (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.Task.properties.priority + update: + description: Priority + - target: $.components.schemas.Task.properties.user_id + update: + description: ID of the user who created the task + - target: $.components.schemas.Task.properties.chat_id + update: + description: ID of the chat the task is linked to + - target: $.components.schemas.Task.properties.status + update: + description: Task status + - target: $.components.schemas.Task.properties.created_at + update: + description: Task creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.Task.properties.performer_ids + update: + description: Array of user IDs assigned to the task as performers + - target: $.components.schemas.Task.properties.all_day + update: + description: All-day task (without specific time) + - target: $.components.schemas.Task.properties.custom_properties + update: + description: Task custom properties + - target: $.components.schemas.TaskCreateRequest + update: + description: Task creation request + - target: $.components.schemas.TaskCreateRequest.properties.task + update: + description: Task parameters object to create + - target: $.components.schemas.TaskCreateRequest.properties.task.properties.kind + update: + description: Kind + - target: $.components.schemas.TaskCreateRequest.properties.task.properties.content + update: + description: Description (defaults to the kind name) + - target: $.components.schemas.TaskCreateRequest.properties.task.properties.due_at + update: + description: >- + Task due date (ISO-8601) in YYYY-MM-DDThh:mm:ss.sssTZD format. If the time is set to 23:59:59.000, the task will + be created as an all-day task (without specific time). + - target: $.components.schemas.TaskCreateRequest.properties.task.properties.priority + update: + description: 'Priority: 1, 2 (important), or 3 (very important).' + - target: $.components.schemas.TaskCreateRequest.properties.task.properties.performer_ids + update: + description: Array of user IDs to assign as task performers (defaults to you) + - target: $.components.schemas.TaskCreateRequest.properties.task.properties.chat_id + update: + description: ID of the chat to link the task to + - target: $.components.schemas.TaskCreateRequest.properties.task.properties.all_day + update: + description: All-day task (without specific time) + - target: $.components.schemas.TaskCreateRequest.properties.task.properties.custom_properties + update: + description: Custom properties to set + - target: $.components.schemas.TaskCreateRequest.properties.task.properties.custom_properties.items.properties.id + update: + description: Property ID + - target: $.components.schemas.TaskCreateRequest.properties.task.properties.custom_properties.items.properties.value + update: + description: Value to set + - target: $.components.schemas.TaskKind + update: + description: Task kind + - target: $.components.schemas.TaskKind + update: + x-enum-descriptions: + call: Call a contact + meeting: Meeting + reminder: Simple reminder + event: Event + email: Send an email + - target: $.components.schemas.TaskStatus + update: + description: Task status + - target: $.components.schemas.TaskStatus + update: + x-enum-descriptions: + done: Done + undone: Active + - target: $.components.schemas.TaskUpdateRequest + update: + description: Task update request + - target: $.components.schemas.TaskUpdateRequest.properties.task + update: + description: Task parameters object to update + - target: $.components.schemas.TaskUpdateRequest.properties.task.properties.kind + update: + description: Kind + - target: $.components.schemas.TaskUpdateRequest.properties.task.properties.content + update: + description: Description + - target: $.components.schemas.TaskUpdateRequest.properties.task.properties.due_at + update: + description: >- + Task due date (ISO-8601) in YYYY-MM-DDThh:mm:ss.sssTZD format. If the time is set to 23:59:59.000, the task will + be created as an all-day task (without specific time). + - target: $.components.schemas.TaskUpdateRequest.properties.task.properties.priority + update: + description: 'Priority: 1, 2 (important), or 3 (very important).' + - target: $.components.schemas.TaskUpdateRequest.properties.task.properties.performer_ids + update: + description: Array of user IDs to assign as task performers + - target: $.components.schemas.TaskUpdateRequest.properties.task.properties.status + update: + description: Status + - target: $.components.schemas.TaskUpdateRequest.properties.task.properties.all_day + update: + description: All-day task (without specific time) + - target: $.components.schemas.TaskUpdateRequest.properties.task.properties.done_at + update: + description: Task completion date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.TaskUpdateRequest.properties.task.properties.custom_properties + update: + description: Custom properties to set + - target: $.components.schemas.TaskUpdateRequest.properties.task.properties.custom_properties.items.properties.id + update: + description: Property ID + - target: $.components.schemas.TaskUpdateRequest.properties.task.properties.custom_properties.items.properties.value + update: + description: Value to set + - target: $.components.schemas.Thread + update: + description: Thread + - target: $.components.schemas.Thread.properties.id + update: + description: Created thread ID (used to send [new comments](POST /messages) to the thread) + - target: $.components.schemas.Thread.properties.chat_id + update: + description: >- + Thread chat ID (used to send [new comments](POST /messages) to the thread and to get the [list of comments](GET + /messages)) + - target: $.components.schemas.Thread.properties.message_id + update: + description: ID of the message the thread was created for + - target: $.components.schemas.Thread.properties.message_chat_id + update: + description: Message chat ID + - target: $.components.schemas.Thread.properties.updated_at + update: + description: Thread update date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.UpdateMemberRoleRequest + update: + description: Member role update request + - target: $.components.schemas.UpdateMemberRoleRequest.properties.role + update: + description: Role + - target: $.components.schemas.UploadParams + update: + description: File upload parameters + - target: $.components.schemas.UploadParams.properties.Content-Disposition + update: + description: Header used (attachment for this request) + - target: $.components.schemas.UploadParams.properties.acl + update: + description: Security level (private for this request) + - target: $.components.schemas.UploadParams.properties.policy + update: + description: Unique policy for file upload + - target: $.components.schemas.UploadParams.properties.x-amz-credential + update: + description: x-amz-credential for file upload + - target: $.components.schemas.UploadParams.properties.x-amz-algorithm + update: + description: Algorithm used (AWS4-HMAC-SHA256 for this request) + - target: $.components.schemas.UploadParams.properties.x-amz-date + update: + description: Unique x-amz-date for file upload + - target: $.components.schemas.UploadParams.properties.x-amz-signature + update: + description: Unique signature for file upload + - target: $.components.schemas.UploadParams.properties.key + update: + description: Unique key for file upload + - target: $.components.schemas.UploadParams.properties.direct_url + update: + description: File upload URL + - target: $.components.schemas.User + update: + description: Employee + - target: $.components.schemas.User.properties.id + update: + description: User ID + - target: $.components.schemas.User.properties.first_name + update: + description: First name + - target: $.components.schemas.User.properties.last_name + update: + description: Last name + - target: $.components.schemas.User.properties.nickname + update: + description: Username + - target: $.components.schemas.User.properties.email + update: + description: Email + - target: $.components.schemas.User.properties.phone_number + update: + description: Phone number + - target: $.components.schemas.User.properties.department + update: + description: Department + - target: $.components.schemas.User.properties.title + update: + description: Job title + - target: $.components.schemas.User.properties.role + update: + description: Access level + - target: $.components.schemas.User.properties.suspended + update: + description: User deactivated + - target: $.components.schemas.User.properties.invite_status + update: + description: Invitation status + - target: $.components.schemas.User.properties.list_tags + update: + description: Array of tags assigned to the employee + - target: $.components.schemas.User.properties.custom_properties + update: + description: Employee custom properties + - target: $.components.schemas.User.properties.user_status + update: + description: Status + - target: $.components.schemas.User.properties.bot + update: + description: Whether this is a bot + - target: $.components.schemas.User.properties.sso + update: + description: Whether the user uses SSO + - target: $.components.schemas.User.properties.created_at + update: + description: Creation date (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.User.properties.last_activity_at + update: + description: User last activity date (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.User.properties.time_zone + update: + description: User time zone + - target: $.components.schemas.User.properties.image_url + update: + description: User avatar download URL + - target: $.components.schemas.UserCreateRequest + update: + description: Employee creation request + - target: $.components.schemas.UserCreateRequest.properties.user.properties.first_name + update: + description: First name + - target: $.components.schemas.UserCreateRequest.properties.user.properties.last_name + update: + description: Last name + - target: $.components.schemas.UserCreateRequest.properties.user.properties.email + update: + description: Email + - target: $.components.schemas.UserCreateRequest.properties.user.properties.phone_number + update: + description: Phone number + - target: $.components.schemas.UserCreateRequest.properties.user.properties.nickname + update: + description: Username + - target: $.components.schemas.UserCreateRequest.properties.user.properties.department + update: + description: Department + - target: $.components.schemas.UserCreateRequest.properties.user.properties.title + update: + description: Job title + - target: $.components.schemas.UserCreateRequest.properties.user.properties.role + update: + description: Access level + - target: $.components.schemas.UserCreateRequest.properties.user.properties.suspended + update: + description: User deactivated + - target: $.components.schemas.UserCreateRequest.properties.user.properties.list_tags + update: + description: Array of tags to assign to the employee + - target: $.components.schemas.UserCreateRequest.properties.user.properties.custom_properties + update: + description: Custom properties to set + - target: $.components.schemas.UserCreateRequest.properties.user.properties.custom_properties.items.properties.id + update: + description: Property ID + - target: $.components.schemas.UserCreateRequest.properties.user.properties.custom_properties.items.properties.value + update: + description: Value to set + - target: $.components.schemas.UserCreateRequest.properties.skip_email_notify + update: + description: >- + Skip sending an invitation to the employee. The employee will not receive an email invitation to create an + account. Useful when pre-creating accounts before SSO login. + - target: $.components.schemas.UserEventType + update: + description: Webhook event type for users + - target: $.components.schemas.UserEventType + update: + x-enum-descriptions: + invite: Invitation + confirm: Confirmation + update: Update + suspend: Suspension + activate: Activation + delete: Deleted + - target: $.components.schemas.UserRole + update: + description: User role in the system + - target: $.components.schemas.UserRole + update: + x-enum-descriptions: + admin: Administrator + user: Employee + multi_guest: Multi-guest + guest: Guest + - target: $.components.schemas.UserRoleInput + update: + description: User role allowed for creation and editing. The `guest` role cannot be set via API. + - target: $.components.schemas.UserRoleInput + update: + x-enum-descriptions: + admin: Administrator + user: Employee + multi_guest: Multi-guest + - target: $.components.schemas.UserStatus + update: + description: User status + - target: $.components.schemas.UserStatus.properties.emoji + update: + description: Status emoji character + - target: $.components.schemas.UserStatus.properties.title + update: + description: Status text + - target: $.components.schemas.UserStatus.properties.expires_at + update: + description: Status expiration date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.UserStatus.properties.is_away + update: + description: '"Away" mode' + - target: $.components.schemas.UserStatus.properties.away_message + update: + description: >- + "Away" mode message. Displayed in the user profile, as well as when sending a direct message or mentioning them + in a chat. + - target: $.components.schemas.UserStatus.properties.away_message.properties.text + update: + description: Message text + - target: $.components.schemas.UserUpdateRequest + update: + description: Employee update request + - target: $.components.schemas.UserUpdateRequest.properties.user + update: + description: Employee parameters object to update + - target: $.components.schemas.UserUpdateRequest.properties.user.properties.first_name + update: + description: First name + - target: $.components.schemas.UserUpdateRequest.properties.user.properties.last_name + update: + description: Last name + - target: $.components.schemas.UserUpdateRequest.properties.user.properties.email + update: + description: Email + - target: $.components.schemas.UserUpdateRequest.properties.user.properties.phone_number + update: + description: Phone number + - target: $.components.schemas.UserUpdateRequest.properties.user.properties.nickname + update: + description: Username + - target: $.components.schemas.UserUpdateRequest.properties.user.properties.department + update: + description: Department + - target: $.components.schemas.UserUpdateRequest.properties.user.properties.title + update: + description: Job title + - target: $.components.schemas.UserUpdateRequest.properties.user.properties.role + update: + description: Access level + - target: $.components.schemas.UserUpdateRequest.properties.user.properties.suspended + update: + description: User deactivated + - target: $.components.schemas.UserUpdateRequest.properties.user.properties.list_tags + update: + description: Array of tags to assign to the employee + - target: $.components.schemas.UserUpdateRequest.properties.user.properties.custom_properties + update: + description: Custom properties to set + - target: $.components.schemas.UserUpdateRequest.properties.user.properties.custom_properties.items.properties.id + update: + description: Property ID + - target: $.components.schemas.UserUpdateRequest.properties.user.properties.custom_properties.items.properties.value + update: + description: Value to set + - target: $.components.schemas.ValidationErrorCode + update: + description: Validation error codes + - target: $.components.schemas.ValidationErrorCode + update: + x-enum-descriptions: + blank: Required field (cannot be empty) + too_long: Value is too long (details provided in the message field) + invalid: Field does not match the rules (details provided in the message field) + inclusion: Field has an unexpected value + exclusion: Field has a forbidden value + taken: Name for this field already exists + wrong_emoji: Status emoji cannot contain values other than an emoji character + not_found: Object not found + already_exists: Object already exists (details provided in the message field) + personal_chat: Direct message error (details provided in the message field) + displayed_error: Displayed error (details provided in the message field) + not_authorized: Action forbidden + invalid_date_range: Selected date range is too large + invalid_webhook_url: Invalid webhook URL + rate_limit: Rate limit reached + licenses_limit: Active employee limit exceeded (details provided in the message field) + user_limit: User reaction limit exceeded (20 unique reactions) + unique_limit: Unique reaction limit per message exceeded (30 unique reactions) + general_limit: Reaction limit per message exceeded (1000 reactions) + unhandled: Request execution error (details provided in the message field) + trigger_not_found: Event identifier not found + trigger_expired: Event identifier has expired + required: Required parameter not provided + in: Invalid value (not in the list of allowed values) + not_applicable: Value not applicable in this context (details provided in the message field) + self_update: Cannot modify your own data + owner_protected: Cannot modify owner data + already_assigned: Value already assigned + forbidden: Insufficient permissions to perform the action (details provided in the message field) + permission_denied: Access denied (insufficient permissions) + access_denied: Access denied + wrong_params: Invalid request parameters (details provided in the message field) + payment_required: Payment required + min_length: Value is too short (details provided in the message field) + max_length: Value is too long (details provided in the message field) + use_of_system_words: Reserved system word used (here, all) + - target: $.components.schemas.ViewBlock + update: + description: View block for forms (base model, use specific block types) + - target: $.components.schemas.ViewBlock.properties.type + update: + description: Block type + - target: $.components.schemas.ViewBlock.properties.text + update: + description: Block text + - target: $.components.schemas.ViewBlock.properties.name + update: + description: Field name + - target: $.components.schemas.ViewBlock.properties.label + update: + description: Field label + - target: $.components.schemas.ViewBlock.properties.initial_date + update: + description: Initial date + - target: $.components.schemas.ViewBlockCheckbox + update: + description: Checkbox block — checkboxes + - target: $.components.schemas.ViewBlockCheckbox.properties.type + update: + description: Block type + - target: $.components.schemas.ViewBlockCheckbox.properties.type + update: + x-enum-descriptions: + checkbox: Always checkbox for checkboxes + - target: $.components.schemas.ViewBlockCheckbox.properties.name + update: + description: Name that will be sent to your application as the key for the user-selected choice + - target: $.components.schemas.ViewBlockCheckbox.properties.label + update: + description: Checkbox group label + - target: $.components.schemas.ViewBlockCheckbox.properties.options + update: + description: Array of checkboxes + - target: $.components.schemas.ViewBlockCheckbox.properties.required + update: + description: Required + - target: $.components.schemas.ViewBlockCheckbox.properties.hint + update: + description: Hint displayed below the checkbox group in gray + - target: $.components.schemas.ViewBlockCheckboxOption.properties.text + update: + description: Display text + - target: $.components.schemas.ViewBlockCheckboxOption.properties.value + update: + description: Unique string value that will be sent to your application when this item is selected + - target: $.components.schemas.ViewBlockCheckboxOption.properties.description + update: + description: Description displayed in gray below the display text for this item + - target: $.components.schemas.ViewBlockCheckboxOption.properties.checked + update: + description: Initially selected item + - target: $.components.schemas.ViewBlockDate + update: + description: Date block — date picker + - target: $.components.schemas.ViewBlockDate.properties.type + update: + description: Block type + - target: $.components.schemas.ViewBlockDate.properties.type + update: + x-enum-descriptions: + date: Always date for date picker + - target: $.components.schemas.ViewBlockDate.properties.name + update: + description: Name that will be sent to your application as the key for the user-specified value + - target: $.components.schemas.ViewBlockDate.properties.label + update: + description: Field label + - target: $.components.schemas.ViewBlockDate.properties.initial_date + update: + description: Initial field value in YYYY-MM-DD format + - target: $.components.schemas.ViewBlockDate.properties.required + update: + description: Required + - target: $.components.schemas.ViewBlockDate.properties.hint + update: + description: Hint displayed below the field in gray + - target: $.components.schemas.ViewBlockDivider + update: + description: Divider block — separator + - target: $.components.schemas.ViewBlockDivider.properties.type + update: + description: Block type + - target: $.components.schemas.ViewBlockDivider.properties.type + update: + x-enum-descriptions: + divider: Always divider for separators + - target: $.components.schemas.ViewBlockFileInput + update: + description: File input block — file upload + - target: $.components.schemas.ViewBlockFileInput.properties.type + update: + description: Block type + - target: $.components.schemas.ViewBlockFileInput.properties.type + update: + x-enum-descriptions: + file_input: Always file_input for file upload + - target: $.components.schemas.ViewBlockFileInput.properties.name + update: + description: Name that will be sent to your application as the key for the user-specified value + - target: $.components.schemas.ViewBlockFileInput.properties.label + update: + description: Field label + - target: $.components.schemas.ViewBlockFileInput.properties.filetypes + update: + description: >- + Array of allowed file extensions as strings (e.g., ["png","jpg","gif"]). If this field is not specified, all + file extensions will be accepted. + - target: $.components.schemas.ViewBlockFileInput.properties.max_files + update: + description: Maximum number of files the user can upload to this field. + - target: $.components.schemas.ViewBlockFileInput.properties.required + update: + description: Required + - target: $.components.schemas.ViewBlockFileInput.properties.hint + update: + description: Hint displayed below the field in gray + - target: $.components.schemas.ViewBlockHeader + update: + description: Header block — heading + - target: $.components.schemas.ViewBlockHeader.properties.type + update: + description: Block type + - target: $.components.schemas.ViewBlockHeader.properties.type + update: + x-enum-descriptions: + header: Always header for headings + - target: $.components.schemas.ViewBlockHeader.properties.text + update: + description: Header text + - target: $.components.schemas.ViewBlockInput + update: + description: Input block — text input field + - target: $.components.schemas.ViewBlockInput.properties.type + update: + description: Block type + - target: $.components.schemas.ViewBlockInput.properties.type + update: + x-enum-descriptions: + input: Always input for text fields + - target: $.components.schemas.ViewBlockInput.properties.name + update: + description: Name that will be sent to your application as the key for the user-specified value + - target: $.components.schemas.ViewBlockInput.properties.label + update: + description: Field label + - target: $.components.schemas.ViewBlockInput.properties.placeholder + update: + description: Placeholder text inside the input field while it is empty + - target: $.components.schemas.ViewBlockInput.properties.multiline + update: + description: Multiline field + - target: $.components.schemas.ViewBlockInput.properties.initial_value + update: + description: Initial field value + - target: $.components.schemas.ViewBlockInput.properties.min_length + update: + description: Minimum text length the user must enter. If the user enters less, they will receive an error. + - target: $.components.schemas.ViewBlockInput.properties.max_length + update: + description: Maximum text length the user can enter. If the user enters more, they will receive an error. + - target: $.components.schemas.ViewBlockInput.properties.required + update: + description: Required + - target: $.components.schemas.ViewBlockInput.properties.hint + update: + description: Hint displayed below the field in gray + - target: $.components.schemas.ViewBlockMarkdown + update: + description: Markdown block — formatted text + - target: $.components.schemas.ViewBlockMarkdown.properties.type + update: + description: Block type + - target: $.components.schemas.ViewBlockMarkdown.properties.type + update: + x-enum-descriptions: + markdown: Always markdown for formatted text + - target: $.components.schemas.ViewBlockMarkdown.properties.text + update: + description: Text + - target: $.components.schemas.ViewBlockPlainText + update: + description: Plain text block — plain text + - target: $.components.schemas.ViewBlockPlainText.properties.type + update: + description: Block type + - target: $.components.schemas.ViewBlockPlainText.properties.type + update: + x-enum-descriptions: + plain_text: Always plain_text for plain text + - target: $.components.schemas.ViewBlockPlainText.properties.text + update: + description: Text + - target: $.components.schemas.ViewBlockRadio + update: + description: Radio block — radio buttons + - target: $.components.schemas.ViewBlockRadio.properties.type + update: + description: Block type + - target: $.components.schemas.ViewBlockRadio.properties.type + update: + x-enum-descriptions: + radio: Always radio for radio buttons + - target: $.components.schemas.ViewBlockRadio.properties.name + update: + description: Name that will be sent to your application as the key for the user-selected choice + - target: $.components.schemas.ViewBlockRadio.properties.label + update: + description: Radio button group label + - target: $.components.schemas.ViewBlockRadio.properties.options + update: + description: Array of radio buttons + - target: $.components.schemas.ViewBlockRadio.properties.required + update: + description: Required + - target: $.components.schemas.ViewBlockRadio.properties.hint + update: + description: Hint displayed below the radio button group in gray + - target: $.components.schemas.ViewBlockSelect + update: + description: Select block — dropdown + - target: $.components.schemas.ViewBlockSelect.properties.type + update: + description: Block type + - target: $.components.schemas.ViewBlockSelect.properties.type + update: + x-enum-descriptions: + select: Always select for dropdowns + - target: $.components.schemas.ViewBlockSelect.properties.name + update: + description: Name that will be sent to your application as the key for the user-selected choice + - target: $.components.schemas.ViewBlockSelect.properties.label + update: + description: Dropdown label + - target: $.components.schemas.ViewBlockSelect.properties.options + update: + description: Array of available items in the dropdown + - target: $.components.schemas.ViewBlockSelect.properties.required + update: + description: Required + - target: $.components.schemas.ViewBlockSelect.properties.hint + update: + description: Hint displayed below the dropdown in gray + - target: $.components.schemas.ViewBlockSelectableOption + update: + description: Option for select, radio, and checkbox blocks + - target: $.components.schemas.ViewBlockSelectableOption.properties.text + update: + description: Display text + - target: $.components.schemas.ViewBlockSelectableOption.properties.value + update: + description: Unique string value that will be sent to your application when this item is selected + - target: $.components.schemas.ViewBlockSelectableOption.properties.description + update: + description: Description displayed in gray below the display text for this item + - target: $.components.schemas.ViewBlockSelectableOption.properties.selected + update: + description: Initially selected item. Only one item can be selected. + - target: $.components.schemas.ViewBlockTime + update: + description: Time block — time picker + - target: $.components.schemas.ViewBlockTime.properties.type + update: + description: Block type + - target: $.components.schemas.ViewBlockTime.properties.type + update: + x-enum-descriptions: + time: Always time for time picker + - target: $.components.schemas.ViewBlockTime.properties.name + update: + description: Name that will be sent to your application as the key for the user-specified value + - target: $.components.schemas.ViewBlockTime.properties.label + update: + description: Field label + - target: $.components.schemas.ViewBlockTime.properties.initial_time + update: + description: Initial field value in HH:mm format + - target: $.components.schemas.ViewBlockTime.properties.required + update: + description: Required + - target: $.components.schemas.ViewBlockTime.properties.hint + update: + description: Hint displayed below the field in gray + - target: $.components.schemas.ViewBlockUnion + update: + description: Union type for all possible view blocks + - target: $.components.schemas.ViewSubmitWebhookPayload + update: + description: Outgoing webhook payload for form submission + - target: $.components.schemas.ViewSubmitWebhookPayload.properties.type + update: + description: Object type + - target: $.components.schemas.ViewSubmitWebhookPayload.properties.type + update: + x-enum-descriptions: + view: Always view for forms + - target: $.components.schemas.ViewSubmitWebhookPayload.properties.event + update: + description: Event type + - target: $.components.schemas.ViewSubmitWebhookPayload.properties.event + update: + x-enum-descriptions: + submit: Form submission + - target: $.components.schemas.ViewSubmitWebhookPayload.properties.callback_id + update: + description: Callback ID specified when opening the view + - target: $.components.schemas.ViewSubmitWebhookPayload.properties.private_metadata + update: + description: Private metadata specified when opening the view + - target: $.components.schemas.ViewSubmitWebhookPayload.properties.user_id + update: + description: ID of the user who submitted the form + - target: $.components.schemas.ViewSubmitWebhookPayload.properties.data + update: + description: Submitted view field data. Key — field `action_id`, value — entered data + - target: $.components.schemas.ViewSubmitWebhookPayload.properties.webhook_timestamp + update: + description: Webhook send date and time (UTC+0) in UNIX format + - target: $.components.schemas.WebhookEvent + update: + description: Outgoing webhook event + - target: $.components.schemas.WebhookEvent.properties.id + update: + description: Event ID + - target: $.components.schemas.WebhookEvent.properties.event_type + update: + description: Event type + - target: $.components.schemas.WebhookEvent.properties.payload + update: + description: Webhook object + - target: $.components.schemas.WebhookEvent.properties.created_at + update: + description: Event creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.WebhookEventType + update: + description: Webhook event type + - target: $.components.schemas.WebhookEventType + update: + x-enum-descriptions: + new: Created + update: Update + delete: Deleted + - target: $.components.schemas.WebhookLink + update: + description: Link object in the link unfurling webhook + - target: $.components.schemas.WebhookLink.properties.url + update: + description: Link URL + - target: $.components.schemas.WebhookLink.properties.domain + update: + description: Link domain + - target: $.components.schemas.WebhookMessageThread + update: + description: Thread object in the message webhook + - target: $.components.schemas.WebhookMessageThread.properties.message_id + update: + description: ID of the message the thread was created for + - target: $.components.schemas.WebhookMessageThread.properties.message_chat_id + update: + description: ID of the chat of the message the thread was created for + - target: $.components.schemas.WebhookPayloadUnion + update: + description: Union of all webhook payload types + # ApiError nested items + - target: $.components.schemas.ApiError.properties.errors.items.properties.key + update: + description: Field key that caused the error + - target: $.components.schemas.ApiError.properties.errors.items.properties.value + update: + description: Field value that caused the error + - target: $.components.schemas.ApiError.properties.errors.items.properties.message + update: + description: Error message + - target: $.components.schemas.ApiError.properties.errors.items.properties.code + update: + description: Error code + - target: $.components.schemas.ApiError.properties.errors.items.properties.payload + update: + description: >- + Additional error data. Content depends on the error code: + `{id: number}` for custom property errors, `{type: string}` for type mismatch errors + + # LinkSharedWebhookPayload nested items + - target: $.components.schemas.LinkSharedWebhookPayload.properties.links.items.properties.url + update: + description: Link URL + - target: $.components.schemas.LinkSharedWebhookPayload.properties.links.items.properties.domain + update: + description: Link domain + + # Message.files nested items + - target: $.components.schemas.Message.properties.files.items.properties.id + update: + description: File ID + - target: $.components.schemas.Message.properties.files.items.properties.key + update: + description: File path + - target: $.components.schemas.Message.properties.files.items.properties.name + update: + description: File name with extension + - target: $.components.schemas.Message.properties.files.items.properties.file_type + update: + description: "File type" + - target: $.components.schemas.Message.properties.files.items.properties.url + update: + description: Direct file download URL + - target: $.components.schemas.Message.properties.files.items.properties.width + update: + description: Image width in pixels + - target: $.components.schemas.Message.properties.files.items.properties.height + update: + description: Image height in pixels + + # Message.forwarding nested properties + - target: $.components.schemas.Message.properties.forwarding.properties.original_message_id + update: + description: Original message ID + - target: $.components.schemas.Message.properties.forwarding.properties.original_chat_id + update: + description: ID of the chat containing the original message + - target: $.components.schemas.Message.properties.forwarding.properties.author_id + update: + description: ID of the user who created the original message + - target: $.components.schemas.Message.properties.forwarding.properties.original_created_at + update: + description: Original message creation date and time (ISO-8601, UTC+0) in YYYY-MM-DDThh:mm:ss.sssZ format + - target: $.components.schemas.Message.properties.forwarding.properties.original_thread_id + update: + description: ID of the thread containing the original message + - target: $.components.schemas.Message.properties.forwarding.properties.original_thread_message_id + update: + description: ID of the message that the thread was created from, which contains the original message + - target: $.components.schemas.Message.properties.forwarding.properties.original_thread_parent_chat_id + update: + description: ID of the chat of the message that the thread was created from, which contains the original message + + # MessageWebhookPayload.thread nested properties + - target: $.components.schemas.MessageWebhookPayload.properties.thread.properties.message_id + update: + description: Thread parent message ID + - target: $.components.schemas.MessageWebhookPayload.properties.thread.properties.message_chat_id + update: + description: Chat ID of the thread parent message + + # Task.custom_properties nested items + - target: $.components.schemas.Task.properties.custom_properties.items.properties.id + update: + description: Custom property ID + - target: $.components.schemas.Task.properties.custom_properties.items.properties.name + update: + description: Custom property name + - target: $.components.schemas.Task.properties.custom_properties.items.properties.data_type + update: + description: Custom property data type + - target: $.components.schemas.Task.properties.custom_properties.items.properties.value + update: + description: Custom property value + + # User.custom_properties nested items + - target: $.components.schemas.User.properties.custom_properties.items.properties.id + update: + description: Custom property ID + - target: $.components.schemas.User.properties.custom_properties.items.properties.name + update: + description: Custom property name + - target: $.components.schemas.User.properties.custom_properties.items.properties.data_type + update: + description: Custom property data type + - target: $.components.schemas.User.properties.custom_properties.items.properties.value + update: + description: Custom property value + + # User.user_status nested properties + - target: $.components.schemas.User.properties.user_status.properties.emoji + update: + description: Status emoji + - target: $.components.schemas.User.properties.user_status.properties.title + update: + description: Status text + - target: $.components.schemas.User.properties.user_status.properties.expires_at + update: + description: Status expiration date and time (ISO-8601, UTC+0) + - target: $.components.schemas.User.properties.user_status.properties.is_away + update: + description: Whether the user is marked as away + - target: $.components.schemas.User.properties.user_status.properties.away_message + update: + description: Away message + - target: $.components.schemas.User.properties.user_status.properties.away_message.properties.text + update: + description: Away message text + + # ViewBlockCheckbox.options nested items + - target: $.components.schemas.ViewBlockCheckbox.properties.options.items.properties.text + update: + description: Checkbox option label text + - target: $.components.schemas.ViewBlockCheckbox.properties.options.items.properties.value + update: + description: Checkbox option value + - target: $.components.schemas.ViewBlockCheckbox.properties.options.items.properties.description + update: + description: Checkbox option description + - target: $.components.schemas.ViewBlockCheckbox.properties.options.items.properties.checked + update: + description: Whether the checkbox is checked by default + + # ViewBlockRadio.options nested items + - target: $.components.schemas.ViewBlockRadio.properties.options.items.properties.text + update: + description: Radio option label text + - target: $.components.schemas.ViewBlockRadio.properties.options.items.properties.value + update: + description: Radio option value + - target: $.components.schemas.ViewBlockRadio.properties.options.items.properties.description + update: + description: Radio option description + - target: $.components.schemas.ViewBlockRadio.properties.options.items.properties.selected + update: + description: Whether this radio option is selected by default + + # ViewBlockSelect.options nested items + - target: $.components.schemas.ViewBlockSelect.properties.options.items.properties.text + update: + description: Select option label text + - target: $.components.schemas.ViewBlockSelect.properties.options.items.properties.value + update: + description: Select option value + - target: $.components.schemas.ViewBlockSelect.properties.options.items.properties.description + update: + description: Select option description + - target: $.components.schemas.ViewBlockSelect.properties.options.items.properties.selected + update: + description: Whether this select option is selected by default diff --git a/packages/spec/package.json b/packages/spec/package.json index df90480c..813e440e 100644 --- a/packages/spec/package.json +++ b/packages/spec/package.json @@ -7,13 +7,17 @@ }, "scripts": { "setup": "true", - "generate": "tsp compile typespec.tsp --config tspconfig.yaml" + "generate": "tsp compile typespec.tsp --config tspconfig.yaml", + "overlay:apply": "bun scripts/apply-overlay.ts", + "overlay:validate": "bun scripts/validate-overlay.ts" }, "devDependencies": { + "@types/js-yaml": "^4.0.9", "@typespec/compiler": "^1.7.1", "@typespec/http": "^1.7.0", "@typespec/openapi": "^1.7.0", "@typespec/openapi3": "^1.7.0", - "@typespec/rest": "^0.77.0" + "@typespec/rest": "^0.77.0", + "js-yaml": "^4.1.1" } } diff --git a/packages/spec/scripts/apply-overlay.ts b/packages/spec/scripts/apply-overlay.ts new file mode 100644 index 00000000..72030f96 --- /dev/null +++ b/packages/spec/scripts/apply-overlay.ts @@ -0,0 +1,437 @@ +/** + * Apply an OpenAPI Overlay v1.0.0 to a base spec. + * + * Usage: tsx scripts/apply-overlay.ts [--base openapi.yaml] [--overlay overlay.en.yaml] [--output openapi.en.yaml] + */ +import fs from 'node:fs'; +import path from 'node:path'; +import yaml from 'js-yaml'; + +// --------------------------------------------------------------------------- +// JSONPath-subset resolver +// --------------------------------------------------------------------------- + +interface Resolved { + parent: any; + key: string | number; +} + +/** + * Parse a JSONPath target string into segments. + * Supports: $, .key, ['key'], [N], [?(@.name=='value')] + */ +function parseTarget(target: string): string[] { + const segments: string[] = []; + let i = 0; + if (target[i] === '$') i++; // skip root + + while (i < target.length) { + if (target[i] === '.') { + i++; + // Read dotted property name (stops at . or [) + let name = ''; + while (i < target.length && target[i] !== '.' && target[i] !== '[') { + name += target[i++]; + } + if (name) segments.push(name); + } else if (target[i] === '[') { + i++; // skip [ + if (target[i] === "'") { + // Bracket string: ['key'] + i++; // skip opening ' + let name = ''; + while (i < target.length && target[i] !== "'") { + name += target[i++]; + } + i++; // skip closing ' + i++; // skip ] + segments.push(name); + } else if (target[i] === '?') { + // Filter: [?(@.name=='value')] — find matching ) then ] + let depth = 0; + let filterEnd = i; + while (filterEnd < target.length) { + if (target[filterEnd] === '(') depth++; + if (target[filterEnd] === ')') { + depth--; + if (depth === 0) { + // find the closing ] after ) + filterEnd = target.indexOf(']', filterEnd); + break; + } + } + filterEnd++; + } + const filterExpr = target.substring(i, filterEnd); + segments.push(filterExpr); + i = filterEnd + 1; + } else { + // Numeric index: [0] + let num = ''; + while (i < target.length && target[i] !== ']') { + num += target[i++]; + } + i++; // skip ] + segments.push(num); + } + } else { + i++; + } + } + return segments; +} + +/** + * Parse a filter expression like ?(@.name=='value') and return {prop, value}. + */ +function parseFilter(filter: string): { prop: string; value: string } | null { + // ?(@.prop=='value') or ?(@.prop=='value') + const m = filter.match(/\?\(@\.(\w+)==['"](.*?)['"]\)/); + if (!m) return null; + return { prop: m[1], value: m[2] }; +} + +/** + * Follow $ref if present in the current object. + */ +function followRef(obj: any, doc: any): any { + if (obj && typeof obj === 'object' && obj.$ref && typeof obj.$ref === 'string') { + const ref = obj.$ref; + if (!ref.startsWith('#/')) return obj; + const parts = ref.replace('#/', '').split('/'); + let resolved = doc; + for (const part of parts) { + resolved = resolved?.[part]; + } + return resolved ?? obj; + } + return obj; +} + +/** + * Resolve a JSONPath target to {parent, key} in the document. + */ +function resolveTarget(doc: any, target: string): Resolved { + const segments = parseTarget(target); + let current = doc; + + for (let i = 0; i < segments.length; i++) { + const seg = segments[i]; + const isLast = i === segments.length - 1; + + // Follow $ref before navigating + current = followRef(current, doc); + + if (seg.startsWith('?')) { + // Array filter + const filter = parseFilter(seg); + if (!filter || !Array.isArray(current)) { + throw new Error(`Cannot apply filter "${seg}" — current value is not an array or filter is invalid. Target: ${target}`); + } + const idx = current.findIndex((item: any) => String(item[filter.prop]) === filter.value); + if (idx === -1) { + throw new Error(`Filter "${seg}" matched no elements in array. Target: ${target}`); + } + if (isLast) { + return { parent: current, key: idx }; + } + current = current[idx]; + } else if (/^\d+$/.test(seg)) { + // Numeric index + const idx = parseInt(seg, 10); + if (isLast) { + return { parent: current, key: idx }; + } + current = current[idx]; + } else { + // Object property + if (isLast) { + return { parent: current, key: seg }; + } + if (current[seg] === undefined) { + throw new Error(`Property "${seg}" not found. Target: ${target}`); + } + current = current[seg]; + } + } + + throw new Error(`Could not resolve target: ${target}`); +} + +// --------------------------------------------------------------------------- +// Deep merge (only overwrites leaf values, preserves structure) +// --------------------------------------------------------------------------- + +function deepMerge(target: any, source: any): any { + if (source === null || source === undefined) return target; + if (typeof source !== 'object' || Array.isArray(source)) return source; + if (typeof target !== 'object' || target === null || Array.isArray(target)) return source; + + const result = { ...target }; + for (const key of Object.keys(source)) { + result[key] = deepMerge(result[key], source[key]); + } + return result; +} + +// --------------------------------------------------------------------------- +// Post-processing: translate remaining Russian strings +// --------------------------------------------------------------------------- + +const CYRILLIC_RE = /[а-яА-ЯёЁ]/; + +/** Translation dictionary for inline strings not reachable via JSONPath overlay targets */ +const RU_TO_EN: Record = { + // Response wrapper descriptions (inline schemas in response bodies) + 'Обертка ответа с данными и пагинацией': 'Response wrapper with data and pagination', + 'Обертка ответа с данными': 'Response wrapper with data', + 'Обертка ответа поисковых результатов с данными и пагинацией': 'Search results response wrapper with data and pagination', + + // x-param-names descriptions + 'Идентификатор чата': 'Chat ID', + 'Дата и время создания последнего сообщения': 'Date and time of the last message creation', + 'Идентификатор сообщения': 'Message ID', + + // Example values — models + 'Разработка': 'Development', + 'футболки': 't-shirts', + 'Олег': 'Oleg', + 'Петров': 'Petrov', + 'Продукт': 'Product', + 'Санкт-Петербург': 'Saint Petersburg', + 'Город': 'City', + 'Мой API токен': 'My API Token', + 'Поле не может быть пустым': 'Field cannot be empty', + 'Отдел разработки': 'Engineering', + 'Старший разработчик': 'Senior Developer', + 'Текст сообщения': 'Message text', + 'Бассейн': 'Pool', + 'Новое название тега': 'New tag name', + 'Очень занят': 'Very busy', + 'Вернусь после 15:00': 'Back after 3 PM', + + // Example values — messages and buttons + 'Подробнее': 'Learn more', + 'Отлично!': 'Great!', + 'Бот Поддержки': 'Support Bot', + 'Статья: Отправка файлов': 'Article: Sending files', + 'Пример отправки файлов на удаленный сервер': 'Example of sending files to a remote server', + 'Синий склад': 'Blue warehouse', + + // Example values — messages content + 'Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)': + 'Yesterday we sold 756 t-shirts (10% more than last Sunday)', + 'Вот попробуйте написать правильно это с первого раза: Будущий, Полощи, Прийти, Грейпфрут, Мозаика, Бюллетень, Дуршлаг, Винегрет.': + 'Try to spell these correctly on the first attempt: bureaucracy, accommodate, definitely, entrepreneur, liaison, necessary, surveillance, questionnaire.', + 'Забрать со склада 21 заказ': 'Pick up 21 orders from the warehouse', + + // Example values — user status + 'Я в отпуске до 15 апреля. По срочным вопросам обращайтесь к @ivanov.': + 'I am on vacation until April 15. For urgent matters, contact @ivanov.', + + // Example values — forms / views + 'Уведомление об отпуске': 'Vacation notification', + 'Закрыть': 'Close', + 'Отменить': 'Cancel', + 'Отправить заявку': 'Submit request', + 'Отправить': 'Submit', + 'Рассылки': 'Newsletters', + 'Выберите интересующие вас рассылки': 'Select the newsletters you are interested in', + 'Ничего': 'None', + 'Каждый день бот будет присылать список новых задач в вашей команде': + 'Every day the bot will send a list of new tasks in your team', + 'Дата начала отпуска': 'Vacation start date', + 'Укажите дату начала отпуска': 'Select the vacation start date', + 'Заявление': 'Application', + 'Загрузите заполненное заявление с электронной подписью (в формате pdf, jpg или png)': + 'Upload the completed application with an electronic signature (in pdf, jpg, or png format)', + 'Основная информация': 'General information', + 'Описание отпуска': 'Vacation description', + 'Куда собираетесь и что будете делать': 'Where are you going and what will you be doing', + 'Начальный текст': 'Initial text', + 'Возможно вам подскаджут, какие места лучше посетить': + 'Others might suggest the best places to visit', + 'Информацию о доступных вам днях отпуска вы можете прочитать по [ссылке](https://www.website.com/timeoff)': + 'You can read about your available vacation days at [this link](https://www.website.com/timeoff)', + 'Заполните форму. После отправки формы в общий чат будет отправлено текстовое уведомление, а ваш отпуск будет сохранен в базе.': + 'Fill out the form. After submitting, a text notification will be sent to the general chat, and your vacation will be saved in the database.', + 'Доступность': 'Availability', + 'Если вы не планируете выходить на связь, то выберите вариант Ничего': + 'If you do not plan to be available, select None', + 'Выберите команду': 'Select a team', + 'Выберите одну из команд': 'Select one of the teams', + 'Время рассылки': 'Newsletter time', + 'Укажите, в какое время присылать выбранные рассылки': + 'Specify the time to send the selected newsletters', +}; + +/** + * Recursively walk the document and replace Russian strings using the dictionary. + * Handles: description, example, default, text fields + array/object values. + */ +function translateRemaining(obj: any): number { + if (obj === null || obj === undefined || typeof obj !== 'object') return 0; + let count = 0; + + if (Array.isArray(obj)) { + for (let i = 0; i < obj.length; i++) { + if (typeof obj[i] === 'string' && CYRILLIC_RE.test(obj[i])) { + const normalized = obj[i].replace(/\s+/g, ' ').trim(); + if (RU_TO_EN[normalized]) { + obj[i] = RU_TO_EN[normalized]; + count++; + } + } else { + count += translateRemaining(obj[i]); + } + } + return count; + } + + for (const key of Object.keys(obj)) { + const val = obj[key]; + if (typeof val === 'string' && CYRILLIC_RE.test(val)) { + const normalized = val.replace(/\s+/g, ' ').trim(); + if (RU_TO_EN[normalized]) { + obj[key] = RU_TO_EN[normalized]; + count++; + } + } else if (typeof val === 'object' && val !== null) { + count += translateRemaining(val); + } + } + return count; +} + +/** + * After post-processing, verify no Cyrillic remains in description/example/default fields. + * Returns list of paths with remaining Cyrillic text. + */ +function findRemainingCyrillic(obj: any, path = '$'): string[] { + if (obj === null || obj === undefined || typeof obj !== 'object') return []; + const found: string[] = []; + + if (Array.isArray(obj)) { + for (let i = 0; i < obj.length; i++) { + if (typeof obj[i] === 'string' && CYRILLIC_RE.test(obj[i])) { + found.push(`${path}[${i}] = "${obj[i].substring(0, 60)}..."`); + } else { + found.push(...findRemainingCyrillic(obj[i], `${path}[${i}]`)); + } + } + return found; + } + + for (const key of Object.keys(obj)) { + const val = obj[key]; + if (typeof val === 'string' && CYRILLIC_RE.test(val)) { + found.push(`${path}.${key} = "${val.substring(0, 80)}..."`); + } else if (typeof val === 'object' && val !== null) { + found.push(...findRemainingCyrillic(val, `${path}.${key}`)); + } + } + return found; +} + +// --------------------------------------------------------------------------- +// Main +// --------------------------------------------------------------------------- + +function main() { + const specDir = path.resolve(__dirname, '..'); + let basePath = path.join(specDir, 'openapi.yaml'); + let overlayPath = path.join(specDir, 'overlay.en.yaml'); + let outputPath = path.join(specDir, 'openapi.en.yaml'); + + // Parse args + const args = process.argv.slice(2); + for (let i = 0; i < args.length; i++) { + if (args[i] === '--base' && args[i + 1]) basePath = path.resolve(args[++i]); + if (args[i] === '--overlay' && args[i + 1]) overlayPath = path.resolve(args[++i]); + if (args[i] === '--output' && args[i + 1]) outputPath = path.resolve(args[++i]); + } + + // Read files + const baseDoc = yaml.load(fs.readFileSync(basePath, 'utf8')) as any; + const overlay = yaml.load(fs.readFileSync(overlayPath, 'utf8')) as any; + + // Validate overlay structure + if (!overlay.overlay || !overlay.info || !Array.isArray(overlay.actions)) { + throw new Error('Invalid overlay: must have "overlay", "info", and "actions" fields'); + } + + let applied = 0; + let skipped = 0; + let errors = 0; + + for (const action of overlay.actions) { + try { + const { parent, key } = resolveTarget(baseDoc, action.target); + + if (action.remove === true) { + if (Array.isArray(parent)) { + parent.splice(key as number, 1); + } else { + delete parent[key]; + } + } else if (action.update !== undefined) { + if (typeof action.update === 'object' && action.update !== null && !Array.isArray(action.update)) { + parent[key] = deepMerge(parent[key], action.update); + } else { + parent[key] = action.update; + } + } + applied++; + } catch (err) { + const msg = (err as Error).message; + // Skip targets that reference $ref-resolved paths not directly in the spec + if (msg.includes('not found')) { + skipped++; + } else { + console.error(`ERROR applying action: ${msg}`); + errors++; + } + } + } + + if (skipped > 0) { + console.log(`Skipped ${skipped} actions (targets resolved from $ref, not directly present in spec)`); + } + + // Post-process: translate any remaining Russian strings + const translated = translateRemaining(baseDoc); + if (translated > 0) { + console.log(`Post-processed ${translated} remaining Russian strings`); + } + + // Verify no Cyrillic remains — fail build if any found + const remaining = findRemainingCyrillic(baseDoc); + if (remaining.length > 0) { + console.error(`\nERROR: ${remaining.length} strings with Cyrillic text still remain:`); + for (const r of remaining.slice(0, 30)) { + console.error(` ✗ ${r}`); + } + if (remaining.length > 30) { + console.error(` ... and ${remaining.length - 30} more`); + } + console.error(`\nFix: add translations to RU_TO_EN in scripts/apply-overlay.ts or to overlay.en.yaml`); + process.exit(1); + } + + // Write output + const output = yaml.dump(baseDoc, { + lineWidth: 120, + noRefs: true, + quotingType: "'", + forceQuotes: false, + }); + fs.writeFileSync(outputPath, output); + + console.log(`Applied ${applied}/${overlay.actions.length} overlay actions → ${path.basename(outputPath)}`); + if (errors > 0) { + console.error(`${errors} actions failed — see errors above`); + process.exit(1); + } +} + +main(); diff --git a/packages/spec/scripts/validate-overlay.ts b/packages/spec/scripts/validate-overlay.ts new file mode 100644 index 00000000..16f7447e --- /dev/null +++ b/packages/spec/scripts/validate-overlay.ts @@ -0,0 +1,266 @@ +/** + * Validate that overlay.en.yaml covers ALL translatable strings in openapi.yaml. + * Exits with code 1 if ANY translation is missing. + * + * Usage: tsx scripts/validate-overlay.ts [--base openapi.yaml] [--overlay overlay.en.yaml] + */ +import fs from 'node:fs'; +import path from 'node:path'; +import yaml from 'js-yaml'; + +// --------------------------------------------------------------------------- +// Extract all translatable JSONPath targets from the OpenAPI spec +// --------------------------------------------------------------------------- + +function extractTranslatablePaths(doc: any): Set { + const paths = new Set(); + + // Info description + if (doc.info?.description) { + paths.add('$.info.description'); + } + + // Walk paths (operations) + if (doc.paths) { + for (const [route, methods] of Object.entries(doc.paths as Record)) { + const routeKey = `['${route}']`; + for (const [method, op] of Object.entries(methods as Record)) { + if (['get', 'post', 'put', 'patch', 'delete', 'head', 'options'].indexOf(method) === -1) continue; + const opPrefix = `$.paths${routeKey}.${method}`; + + // Operation description + if (op.description) { + paths.add(`${opPrefix}.description`); + } + + // Parameters + if (Array.isArray(op.parameters)) { + for (const param of op.parameters) { + if (param.description) { + paths.add(`${opPrefix}.parameters[?(@.name=='${param.name}')].description`); + } + } + } + + // Request body — walk schema properties + if (op.requestBody?.content) { + for (const [, mediaType] of Object.entries(op.requestBody.content as Record)) { + if ((mediaType as any).schema) { + walkSchema((mediaType as any).schema, `${opPrefix}.requestBody`, paths, doc); + } + } + } + } + } + } + + // Walk component schemas + if (doc.components?.schemas) { + for (const [schemaName, schema] of Object.entries(doc.components.schemas as Record)) { + const prefix = `$.components.schemas.${schemaName}`; + + // Schema-level description + if (schema.description) { + paths.add(`${prefix}.description`); + } + + // x-enum-descriptions + if (schema['x-enum-descriptions']) { + paths.add(`${prefix}.x-enum-descriptions`); + } + + // Schema properties (recursive) + walkProperties(schema, prefix, paths, doc); + } + } + + return paths; +} + +/** + * Walk schema properties recursively to find all description fields. + */ +function walkProperties(schema: any, prefix: string, paths: Set, doc: any): void { + if (!schema || typeof schema !== 'object') return; + + // Handle allOf — merges properties into parent, so walk with parent prefix + if (Array.isArray(schema.allOf)) { + for (const sub of schema.allOf) { + const resolved = resolveRef(sub, doc); + walkProperties(resolved, prefix, paths, doc); + } + } + // NOTE: oneOf/anyOf reference separate schemas that are walked independently + // in the top-level schema loop. Do NOT walk them here with the parent prefix, + // as the properties exist in the referenced schemas, not in the union schema. + + if (schema.properties) { + for (const [propName, propSchema] of Object.entries(schema.properties as Record)) { + const resolved = resolveRef(propSchema, doc); + const propPrefix = `${prefix}.properties.${propName}`; + + if (resolved.description) { + paths.add(`${propPrefix}.description`); + } + + // x-enum-descriptions on property + if (resolved['x-enum-descriptions']) { + paths.add(`${propPrefix}.x-enum-descriptions`); + } + + // Nested object properties + walkProperties(resolved, propPrefix, paths, doc); + + // Array items + if (resolved.items) { + const itemResolved = resolveRef(resolved.items, doc); + walkProperties(itemResolved, `${propPrefix}.items`, paths, doc); + } + } + } +} + +/** + * Walk request body schema (skip $ref to component schemas — those are handled separately). + */ +function walkSchema(schema: any, prefix: string, paths: Set, doc: any): void { + // Request body schemas are usually $ref to components — skip, they're already covered + // Only handle inline schemas + if (schema.$ref) return; + walkProperties(schema, prefix, paths, doc); +} + +/** + * Resolve a $ref to the actual schema object. Only handles local refs. + */ +function resolveRef(schema: any, doc: any): any { + if (!schema || !schema.$ref) return schema || {}; + const ref = schema.$ref; + if (!ref.startsWith('#/')) return schema; + + const parts = ref.replace('#/', '').split('/'); + let current = doc; + for (const part of parts) { + current = current?.[part]; + } + return current || {}; +} + +// --------------------------------------------------------------------------- +// Extract overlay targets +// --------------------------------------------------------------------------- + +function extractOverlayTargets(overlay: any): Set { + const targets = new Set(); + if (!Array.isArray(overlay.actions)) return targets; + + for (const action of overlay.actions) { + if (!action.target) continue; + + if (action.update && typeof action.update === 'object') { + // If update has specific fields, create targets for each + for (const key of Object.keys(action.update)) { + targets.add(`${action.target}.${key}`); + } + } else { + targets.add(action.target); + } + } + return targets; +} + +// --------------------------------------------------------------------------- +// Normalize targets for comparison +// --------------------------------------------------------------------------- + +function normalizeTarget(target: string): string { + // Normalize whitespace and quotes + return target.replace(/\s+/g, ' ').trim(); +} + +// --------------------------------------------------------------------------- +// Main +// --------------------------------------------------------------------------- + +function main() { + const specDir = path.resolve(__dirname, '..'); + let basePath = path.join(specDir, 'openapi.yaml'); + let overlayPath = path.join(specDir, 'overlay.en.yaml'); + + const args = process.argv.slice(2); + for (let i = 0; i < args.length; i++) { + if (args[i] === '--base' && args[i + 1]) basePath = path.resolve(args[++i]); + if (args[i] === '--overlay' && args[i + 1]) overlayPath = path.resolve(args[++i]); + } + + const baseDoc = yaml.load(fs.readFileSync(basePath, 'utf8')) as any; + const overlay = yaml.load(fs.readFileSync(overlayPath, 'utf8')) as any; + + const translatablePaths = extractTranslatablePaths(baseDoc); + const overlayTargets = extractOverlayTargets(overlay); + + // Normalize both sets + const normalizedTranslatable = new Map(); + for (const p of translatablePaths) { + normalizedTranslatable.set(normalizeTarget(p), p); + } + + const normalizedOverlay = new Map(); + for (const t of overlayTargets) { + normalizedOverlay.set(normalizeTarget(t), t); + } + + // Find missing and stale + const missing: string[] = []; + for (const [norm, original] of normalizedTranslatable) { + if (!normalizedOverlay.has(norm)) { + missing.push(original); + } + } + + const stale: string[] = []; + for (const [norm, original] of normalizedOverlay) { + if (!normalizedTranslatable.has(norm)) { + stale.push(original); + } + } + + // Sort for readability + missing.sort(); + stale.sort(); + + const total = translatablePaths.size; + const translated = total - missing.length; + + // Report + if (missing.length === 0 && stale.length === 0) { + console.log(`✓ Overlay validation passed: ${translated}/${total} strings translated (100%)`); + process.exit(0); + } + + if (missing.length > 0) { + console.error(`\nMissing translations (${missing.length}):`); + for (const m of missing) { + console.error(` ✗ ${m}`); + } + } + + if (stale.length > 0) { + console.warn(`\nStale translations (${stale.length}):`); + for (const s of stale) { + console.warn(` ⚠ ${s}`); + } + } + + console.log(`\nTotal: ${translated}/${total} translated (${((translated / total) * 100).toFixed(1)}%)`); + + if (missing.length > 0) { + console.error(`\nMissing: ${missing.length} — BUILD FAILED`); + process.exit(1); + } + + // Only stale warnings — still pass + process.exit(0); +} + +main(); diff --git a/packages/spec/typespec.tsp b/packages/spec/typespec.tsp index 839b3b62..d2b73a62 100644 --- a/packages/spec/typespec.tsp +++ b/packages/spec/typespec.tsp @@ -2796,6 +2796,42 @@ model ButtonWebhookPayload { webhook_timestamp: int32; } +@doc("Структура исходящего вебхука о заполнении формы") +model ViewSubmitWebhookPayload { + @doc("Тип объекта") + @example("view") + @extension("x-enum-descriptions", #{ + view: "Для формы всегда view" + }) + type: "view"; + + @doc("Тип события") + @example("submit") + @extension("x-enum-descriptions", #{ + submit: "Отправка формы" + }) + event: "submit"; + + @doc("Идентификатор обратного вызова, указанный при открытии представления") + @example("timeoff_request_form") + callback_id: string | null; + + @doc("Приватные метаданные, указанные при открытии представления") + @example("{'timeoff_id':4378}") + private_metadata: string | null; + + @doc("Идентификатор пользователя, который отправил форму") + @example(1235523) + user_id: int32; + + @doc("Данные заполненных полей представления. Ключ — `action_id` поля, значение — введённые данные") + data: Record; + + @doc("Дата и время отправки вебхука (UTC+0) в формате UNIX") + @example(1755075544) + webhook_timestamp: int32; +} + @doc("Структура исходящего вебхука об участниках чата") model ChatMemberWebhookPayload { @doc("Тип объекта") @@ -2912,6 +2948,7 @@ union WebhookPayloadUnion { MessageWebhookPayload, ReactionWebhookPayload, ButtonWebhookPayload, + ViewSubmitWebhookPayload, ChatMemberWebhookPayload, CompanyMemberWebhookPayload, LinkSharedWebhookPayload, @@ -3005,6 +3042,11 @@ interface CommonOperations { @route("/uploads") @tag("Common") +@extension("x-n8n-file-upload", #{ + presignEndpoint: "/uploads", + urlField: "direct_url", + keyField: "key", +}) interface UploadOperations { @extension("x-requirements", #{ scope: "uploads:write", diff --git a/sdk/csharp/generated/Client.cs b/sdk/csharp/generated/Client.cs index 044b2aae..2b7948d2 100644 --- a/sdk/csharp/generated/Client.cs +++ b/sdk/csharp/generated/Client.cs @@ -51,7 +51,7 @@ public async System.Threading.Tasks.Task GetAuditEventsA if (entityType != null) queryParts.Add($"entity_type={Uri.EscapeDataString(entityType)}"); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); var url = $"{_baseUrl}/audit_events" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); @@ -110,7 +110,7 @@ public async System.Threading.Tasks.Task GetWebhookEve { var queryParts = new List(); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); var url = $"{_baseUrl}/webhooks/events" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); @@ -215,7 +215,7 @@ public async System.Threading.Tasks.Task ListChatsAsync( if (personal != null) queryParts.Add($"personal={Uri.EscapeDataString((personal.Value ? "true" : "false"))}"); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); var url = $"{_baseUrl}/chats" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); @@ -480,7 +480,7 @@ public async System.Threading.Tasks.Task ListMembersAsync( if (role != null) queryParts.Add($"role={Uri.EscapeDataString(PachcaUtils.EnumToApiString(role.Value))}"); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); var url = $"{_baseUrl}/chats/{id}/members" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); @@ -658,9 +658,9 @@ public async System.Threading.Tasks.Task ListTagsAsync( { var queryParts = new List(); if (names != null) - queryParts.Add($"names={Uri.EscapeDataString(names.ToString())}"); + queryParts.Add($"names={Uri.EscapeDataString(names.ToString()!)}"); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); var url = $"{_baseUrl}/group_tags" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); @@ -719,7 +719,7 @@ public async System.Threading.Tasks.Task GetTagUsersAsync( { var queryParts = new List(); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); var url = $"{_baseUrl}/group_tags/{id}/users" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); @@ -829,11 +829,11 @@ public async System.Threading.Tasks.Task ListChatMessa CancellationToken cancellationToken = default) { var queryParts = new List(); - queryParts.Add($"chat_id={Uri.EscapeDataString(chatId.ToString())}"); + queryParts.Add($"chat_id={Uri.EscapeDataString(chatId.ToString()!)}"); if (sortId != null) queryParts.Add($"sort[{{field}}]={Uri.EscapeDataString(PachcaUtils.EnumToApiString(sortId.Value))}"); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); var url = $"{_baseUrl}/messages" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); @@ -1028,7 +1028,7 @@ public async System.Threading.Tasks.Task ListReactionsAsy { var queryParts = new List(); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); var url = $"{_baseUrl}/messages/{id}/reactions" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); @@ -1128,7 +1128,7 @@ public async System.Threading.Tasks.Task ListReadMembersAsync( { var queryParts = new List(); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); var url = $"{_baseUrl}/messages/{id}/read_member_ids" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); @@ -1318,7 +1318,7 @@ public async System.Threading.Tasks.Task SearchChatsAsync( if (query != null) queryParts.Add($"query={Uri.EscapeDataString(query)}"); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); if (order != null) @@ -1386,7 +1386,7 @@ public async System.Threading.Tasks.Task SearchMessage if (query != null) queryParts.Add($"query={Uri.EscapeDataString(query)}"); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); if (order != null) @@ -1396,9 +1396,9 @@ public async System.Threading.Tasks.Task SearchMessage if (createdTo != null) queryParts.Add($"created_to={Uri.EscapeDataString(createdTo.Value.ToString("o"))}"); if (chatIds != null) - queryParts.Add($"chat_ids={Uri.EscapeDataString(chatIds.ToString())}"); + queryParts.Add($"chat_ids={Uri.EscapeDataString(chatIds.ToString()!)}"); if (userIds != null) - queryParts.Add($"user_ids={Uri.EscapeDataString(userIds.ToString())}"); + queryParts.Add($"user_ids={Uri.EscapeDataString(userIds.ToString()!)}"); if (active != null) queryParts.Add($"active={Uri.EscapeDataString((active.Value ? "true" : "false"))}"); var url = $"{_baseUrl}/search/messages" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); @@ -1453,7 +1453,7 @@ public async System.Threading.Tasks.Task SearchUsersAsync( if (query != null) queryParts.Add($"query={Uri.EscapeDataString(query)}"); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); if (sort != null) @@ -1465,7 +1465,7 @@ public async System.Threading.Tasks.Task SearchUsersAsync( if (createdTo != null) queryParts.Add($"created_to={Uri.EscapeDataString(createdTo.Value.ToString("o"))}"); if (companyRoles != null) - queryParts.Add($"company_roles={Uri.EscapeDataString(companyRoles.ToString())}"); + queryParts.Add($"company_roles={Uri.EscapeDataString(companyRoles.ToString()!)}"); var url = $"{_baseUrl}/search/users" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); using var request = new HttpRequestMessage(HttpMethod.Get, url); using var response = await PachcaUtils.SendWithRetryAsync(_client, request, cancellationToken).ConfigureAwait(false); @@ -1521,7 +1521,7 @@ public async System.Threading.Tasks.Task ListTasksAsync( { var queryParts = new List(); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); var url = $"{_baseUrl}/tasks" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); @@ -1649,7 +1649,7 @@ public async System.Threading.Tasks.Task ListUsersAsync( if (query != null) queryParts.Add($"query={Uri.EscapeDataString(query)}"); if (limit != null) - queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString())}"); + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); var url = $"{_baseUrl}/users" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); diff --git a/sdk/csharp/generated/Models.cs b/sdk/csharp/generated/Models.cs index 54274a39..da921263 100644 --- a/sdk/csharp/generated/Models.cs +++ b/sdk/csharp/generated/Models.cs @@ -1613,6 +1613,7 @@ public class ViewBlockFileInput : ViewBlockUnion [JsonDerivedType(typeof(MessageWebhookPayload), "message")] [JsonDerivedType(typeof(ReactionWebhookPayload), "reaction")] [JsonDerivedType(typeof(ButtonWebhookPayload), "button")] +[JsonDerivedType(typeof(ViewSubmitWebhookPayload), "view")] [JsonDerivedType(typeof(ChatMemberWebhookPayload), "chat_member")] [JsonDerivedType(typeof(CompanyMemberWebhookPayload), "company_member")] [JsonDerivedType(typeof(LinkSharedWebhookPayload), "message")] @@ -1687,6 +1688,21 @@ public class ButtonWebhookPayload : WebhookPayloadUnion public int WebhookTimestamp { get; set; } = default!; } +public class ViewSubmitWebhookPayload : WebhookPayloadUnion +{ + public override string Type => "view"; + [JsonPropertyName("callback_id")] + public string? CallbackId { get; set; } + [JsonPropertyName("private_metadata")] + public string? PrivateMetadata { get; set; } + [JsonPropertyName("user_id")] + public int UserId { get; set; } = default!; + [JsonPropertyName("data")] + public Dictionary Data { get; set; } = default!; + [JsonPropertyName("webhook_timestamp")] + public int WebhookTimestamp { get; set; } = default!; +} + public class ChatMemberWebhookPayload : WebhookPayloadUnion { public override string Type => "chat_member"; diff --git a/sdk/csharp/generated/Pachca.csproj b/sdk/csharp/generated/Pachca.csproj index 84028b70..5304942c 100644 --- a/sdk/csharp/generated/Pachca.csproj +++ b/sdk/csharp/generated/Pachca.csproj @@ -20,6 +20,7 @@ true + CS1591 true true true diff --git a/sdk/csharp/generated/Utils.cs b/sdk/csharp/generated/Utils.cs index 88d4be58..2cf57544 100644 --- a/sdk/csharp/generated/Utils.cs +++ b/sdk/csharp/generated/Utils.cs @@ -1,6 +1,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Http.Headers; diff --git a/sdk/csharp/generated/bin/Debug/net8.0/Pachca.dll b/sdk/csharp/generated/bin/Debug/net8.0/Pachca.dll index 0752f77264e9a8fe2fd021be7bf7aa1e478dfd3f..dac1b55b2edb11d10ec4341337c261ed0eb78d7d 100644 GIT binary patch literal 236544 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 Nj+pO%cK?J1egizj?j`^L literal 236032 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

w-UkKLoYr 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 K^xyq^68HroP4dbB diff --git a/sdk/csharp/generated/bin/Debug/net8.0/Pachca.pdb b/sdk/csharp/generated/bin/Debug/net8.0/Pachca.pdb index eedaeec05723316bce297ab29959aeffb20961b7..d62b3868ee302c5749d575a78cffab4a94dfcd1b 100644 GIT binary patch literal 71812 zcmd>{g;8cr4*(BSlp8Qg(F;n5i-_(WPyYkzELhhrNcn>DMwXkm^YOyZwMmL{ zWdYbDGKP&co$6S~Y5X0ZRo%zN#h3l)cIR`?yQo$=lv!+NQ(DoFsx!C%h8LC-{aPx@ zvm6*B>QTLU?p@7PHvLp7 z&wr{jdHktT{&19RDyx(p)lKF9`l(WybJ+j$pGqn1{67O=s+2GK7?o1XcpPMBsFaQR zI+gMw%TpPtd$w-yrQ-iEh!fU9MC@2vc3Z+5g zq3O_kXc@E)+6L`|jzFiOi_lHz0o19cT8V{HYOzhV(z~`=Szg;vzKyb`j-lM8j#^n_ zEI&ipp{}96TV1u1ZY$tT zMuu`kBek;FSiX*Op~i;#R*lul2xIvG$~l`D>I0gnl~Km>L6q~j8|u5btCa=D@*R}R zG&R(BYpPZ}JPhSZo@yoBlV#ICtf!vU${KiEpgqv<&`Ib|=sI){dIr6PK0`UY)JkDU z166>kL$#nrP&23%)DG$fg+ozLA~Y0AgT_PCq505iXfw1MIs~17Ex+65hijzj06tI!?j z3G^EJ2&uf$7vv1pftojnGag z1Ns9x2VH?Op~ukQ&<99qp;mH3g&_@80jdtwf*L{1pjJ>js2dax#X*ChWM~XD1)2jb zhE_wHq216S=mc~bx(z*oUP1pt-=Um7*vC*&s0>sIa)ug0UXUNu7U~LxL6J}bGz3b8 z#zE7dMbIi}6SNCD2pxycLsy|Y&=cr2^bu0ER4XI=m~gP{~?EVK#Q1s#NrL+7EZ&>iRr^cwmIsr;~hP=2U5R3GwyT0(80&QMS2Hz*Do z1SLabpefK&Xf3oA+6x_qPCl6#LoQHV$Q^0{1wtL6V5koi z3yp*(LNlR-&B&tI(+gY2QokPB27a)(+#flx;%80rJX zLIWW!Gzyvo&4SXQz0hIk6!aH#1G*1AhyH=SKo$X5FQ^by3UYuPp_))b$P4m=+Cp8S zFsMH?3>pDVfM!4opykkdXgjnYItrbEEs;gnonKph0bTuHqO)c?>iKngcC{RzsVi-OwTE1atwq2EB$pLaHE~4^V!nI8+v@ z0X2X;Azvs6>H>vAeW7@0Fq8sKhvq}epmoqTXdiS0It^WfZbA>B7tlNCD`eRgeL+_)Cpb}6e$Qi2B)i9`2*#LibG`~C#W{m81jbvq4rRB zs23Cs^@oN*BcKV;3}^wg99j=;?{3&m`%yj$oq;Yvx1fj6OXxlH4YKNi^9m{gm4+%p z9#BiD4b&Ox3H=7eL4%-VXbdz3ngcC{RzsVi-OwTE1atwq2Hl08LM4K64nb8RH>f`3 z0kwqMK%JqU&~H#2GzdzD#z0e`InZKgHMAMp4IP3`Ko_8E&|T;$^alC_sY7rqK?R@^ zP&ue7ln113Ca5gU&*iq5IHt=pX0{WYH7%AW$Kw6yyLoLN%d=kQd|! zwS~GuVNfKL01bgsp>fbOXdbi_S_^H3_CklDQ_x?~4d_1f9Qp_P0$GHjf2a^t3UYuP zp~jFmCn9vV@+IDgu>;Dnd?BZKyHi4f#Xuq3%#GC>rVy4TDBN6QCK;0%$q39@-A= zhmJyLpi9s#=ppnHdJlbrta_t=s0dUVstDD98bF?qFBAj?Lw%rFXdtA8#zWJg`Oq?G z9kdPF2OWVc&&;#fN^bYz8S@yweP^d7Zfhs`Np;}NQs2S7>Y6o?L!l5WA5gH1m zLF1w6(0phav<}(^?Sqa$r=g2|aws?Z@Oa|C97=pd4rMTu42_Opol2Rb|7j?f_>DjL zPo+fkHI!H`9+_R9E6Pbx+4Zi`+2y;UJUb@4zFKT{d95hl=$Bm|$w#01e<~%1{+TR6 zrR)&phy+6f>#HYbm+y-5&HmZ-Q}M*t@K2?*$5UNX`JpIx!P8w+eXBv)fME z2Oll#|EZL#qMS4|yT1Cc?D7&(P8*(G|5B81X|wBR>axpD$=T%tqTD7WyMB)-Z{p)* z{XdoBl9pZGAj-{0WY^ym)(p<+ELl{+R@qNdSkN7FGN{8HoM++Tz2`sDEA+q zU2i=hySz}8zld_HN!c;0MfvmO?D~FFvdf#NW|wPE%Pv0_<=)e?>(7bu$Qjx7b~Cff z6Gb`CtnB)QqFj1*cKv)&{v^sz=VZr3&&@7ZnrABKQ1*&)zxk|J;kOf}-**%R<9e0F z+_^af^FXu^%y>(|t-w}-`EV|$VEWdA>Dvfqd$xjk^4SUIMG{uVBXK zGvoY%*?$4Sj4x=$h0M6HVD?u;FdsY@70mXF3GN0iF1Q`IgkZK;(u_+9X1qo)<4X(X z_{#{UZ!ehRDJz)ml@rYP@`Bl(gJ8y25X|_Bf*D^)F#XDc=~ofV@l+Me?Nd!K`*Re` z{OV@xWX8^d*}scm=DV7)n_!NohG6E`6imOCV2-c0V8+)m#mjBg^C$D_L$H#K7q!EE1CF!Q|xv;Ag*IbV1S=6umyF#Q&S>HC;*OTmfo zeFd{WKf&C-tpszt{$?Ct#({#F-&!#9+X!ZVL4vtI+6rcVJHgCvZ^j+WxT9d^cQWJ7 zg4tddGwv#w3E6(Q8TT^d-e%03N14x? zMajHjl+2q($-G&V9A(DQVte#ZDT;}?Ejof@;N!JCNKpzyvA9B+c&a6ShYrqR^b4pJ zCEj=iW4tev0Jb#xJRkalt&H3iJOG^2$bsM_khPI{!!`(PV`OfNAz)i0v;Co9J0r9G z;ow|G=DKRZxsA;JlEHaIehN6R$WH_36aENre&LS-7ZCnva6#dZ1s5_h`x^%?Y-FzA z1aJ`}AI3(W2rg>mi`agX!NrWs^_v1NZe*_CG;j&wPY0J2{!DNw;m-nVgg*ydTKIFp zWrRN;Y;R<4{{`T(M&|ZU2bUB1i@@bY{t~c*ktZU4DY$}>`J!PtxT2A{e^!7i8JXK_ z6}YnC)!-^d=Js0)u4-f#D@9ocu4d%2*nS(pjv{{}xVp&S3U)Fw(v|IIyaRP6pXb0% z!PY4667hM#y9KkoJtCg@dj&IppJ4j?1=Bwun0|&}`UgdS8t@^(?EiNW&-}xJnSVsY zbNojIGyj-~XZ|08nSWfwGyjBO=ARVt%s(ZV`KLuZ^Unxo{#g;v{Bwete_k;C3xetY zDcUOn{!1|1zbN9Fe@QU&FN=7N?}}jNUlsApzb2UZ*9FtRA(;M6(H_TlOEBBNE#jG< zDVX_pL_EiLS1|MMiFoGU7tH(zBA)pV1vCGVh-dy|!OVXmnEq42^q&c)|6DNr7otBN zzb^%||5qZO`F{&${%gVX-w3AvRxtg41k-;fnErdg^#2u1|AS!q9|hC@B$)nZ!Suff zrvFu}Z$0og!Ce3EBA)r2s!a0{^YM1EET)gQjb$TnUi2{PiGO&d>6sYcNI+EO)!1Du`X->)2}I* zel5ZDYYV1dM=<@mg6Y>2`tE}1Hx*3ZLoj_$ z!SuZZ({Com%kg^)=J=b7c;>ed%zPig^jiw1?<<(TpJ4i}1k?8yOg}&{{XoI=TZ{2> z{A~nt{6Qj~`E3O=znx(E?FG~CAecU1)5!UxlVJLt1v9^kVESDJ)9)t6%kg&?%<=Oz zm8n1G2McC?h+z6X1=9}|Og~I8{cyqbdkLoBTQL1Tg6T(y@pAmX3Fi3wig@Nn3TA$k zVEWO5>Bk7BA1jzX--9i;Pn=--@q(G3AeerlVEX+9(;pz#hwC>;FxPLeh-dx~!OR~j znEo)q^oI+kuN6#RCzyV+VEQS7>8A>&pC*|82*LD63Z_3wF#XYj>5maif2?5o;{?+m zFPQ!W!Sp8zrawtA{mFvqPZ3Ois@NYv;Aw)nf2NCg=Fbq!{F#F3&k{_3wqW{m1k;}@ znEpJ$^ydqvzd$hkg@Wm)3#PwFF#W}X=`RuM+Zeo5FxP*Xh-dzC!OUMFnEpz^^j8U{ zzgjT;HG=7{6-9fIla z6ik1YVEVfS)88YQ{$9cK_lfcH^~!$19RC3k&-@I*%s(iY{vpBie-}*uuweQ}1k*n% znEo-r^#2e{|F~fKCj`?!Db~jYd`d9a@3e?#{u#l{KP#C2Il=VL3#NZTF#SIT)Bj5_ z{flBeRlt`7b9|RYJoB#zX8u*d^sfn~e_b&B8-nTI6iok?VEVTO)6W!4|Bhh#cLmeG zC)TG9_`dKN|3EO~9}1@bNHG1!g6TgIO#i81`p*Q@e=eB*3&HeX3a0-`F#W#;(|;|P z{u{yc-wLMxk6`-m1k-;nwioAC7vVGht6;`|GmHN& ze8%J9c-H+4<5lYH*UM~QEquo35X^WB!SpQ!)3*{#Kc`^&)`IEV2&QirZDVXuK1k^y>?1Hp`MD42dD!Sovorr$&`eRsk1n+m4yA(+0WVESHy={FNh z-&-*K=7Qndc zW-GOBgW$Zjuk%R`w3=zoM8I# zg6Ss+rk^O7et*#)uSWxf&-j6Y8J{GW{vg5h2MeY@L@@oKg6R(vOn7+-nDJ8u)1M}o{&d0gX9%W0Q!xEmg6Yo|On;7G`f~--pC_39e8Kb=2&TVK zF#UAF^cM-HzgRH+C1QK|f|m-P@yi4=ez{=!D+JSDDVY8$!Sq)ProToo{k4MWuMLrnEocg^f!z31PV2e@8I=yMpQ86HNcUVEPXP(|;(K z{v*Nk9}A}cL@@oQg6TgKO#iuH`Y#02e<_&$E5Y>t7EJ%OVES(a(|;?N{y&20zY|RV zy333!St&Nre94keMiCcs|%*@B-V%9 z$65G{cM;5ZSHbk%1kXrVEPRN({Cu&hx@0I@EPA& zFyosDrtdD8epAsNw~vSL8Sg2W@m_-IHxo?XTQL3Rg6X#qOy5T^{g!6q@fAMf{RA_< zm0+X$u~B$$3%!SvgS@$!DHz3>^|K``Sx38vp!F#WEA>30)M zzq?@iJp|Ja7EC`xF#Vo_>4yrYA12nP95`I~jPE6w@x2Ap#|H*~xSm9a_ISMhCVa;C z70mV`&Elhk&-iG;jE@maKUOgPexf}d-*Lice7s=BCkUpWD42eK!Sn|Rraw?H{UpKk z2MMM>STOw|X5$?ye8vwG%=qCVp4(R^e8wjWW_*fZ`l*8HrwOJ%LNNW2g6WSEOn!StsKrawb4{h5O4&k{_3 zw%8xMADbh5#?KYZ_<4fq&lgO8foPA%??T}-K3y>57YU}nSTOx1g6S_6On;eR`pX5= zUm=+OO2PD338ueVF#R=x>8}+`f1P0Z>jl%_AhrjO_l?45{3gMS-)t7YMfi;0Dwy%x z1k>LxnEnpY9{0yi;WK`hV8-tjOn;AH`g;Y_-zS*mr`(cSHD$zbTmUw*=F_Etr0$VET6i z)4wa2{yo9;?+d2?KrsD>g6TgJO#iW9`cDMYe=3;%Gr{zq3#R`5Y5n9g6Y2zO#iK5`u_-~|4uOd_k!vFE13QV!Sp{0rvFJW{m+8we-TXot6=)y1k?X6 zm_9zv_QU;^N-%x3VCLr#Oy5EDvmXZzq_3F2VG33#Ok( zF#WuO>E{znKfhr51q9PCD42dB!So9Yre8!b{h}7x&m$&*iwU3c#RW6Igkbt51=BAj z+T-;@BYeh}7R>lEg6Z1}re9Vt{c?iomlsUmK`{Lag6UTjOuv#~`jrLKuOgU!Rl)SD z38wETn0|G^^qmCLcNR?FMKFC=!Svk()2|`6H|O7)!e@Lf!Hlmhn0_6>^y`|nS5Nqi zuP>PK4b0*j3ZL**n0_b0^g9ct-$gL}u7c@z6HLFmVER1-(+?I*KSVJ7P{H)W1k(=}`-A60FX1!3 zw_wKi5llZqF#X>I)9)*oexzXfQG)453#K04*T@o|C~A1|1Gf?)cIg6a1c zOn-o2`U3^iPZHzd@jOWQj2|qR@k0dDA1avsFv0YP3#P9XOkXFMezMtkQiRX=RKbi- z6HI@EVEQ8k(;p?6{%FDU#|WlBR*Z+gFC8a*#*Y`w_z8mPPZUgll4y_Hd$RBuKSeO( zrwXP&O)&lGX6?-oKI3N!X8bI{^k)mEKS#7z5Ik4-jGrf%@$&`KUm%$NLbLYLh0pj! zf*HS9F#RQh=`S^FZ<+8Jzg#fmSD3}G6h7lu31<9i!SvS%roYy#y>-H8{CdHR-yoR& zM#1zqnYFiB_>A8onDJW$)88hT{&utWb_k#GI|Va-mtgw41=HVS*4|#>Gk%|7#_tzQ z|A1in8KS)s;Df?v{2{@N|6MTs!-DA_F>CLr@ELzhFysFaO#irG`X|iVJ1Km|pAyXY z(}L-r5lsKAXpiU9IpH(@ykN#(5KRA1!Sw$!Ywx1)8GlJI<1Y)Qe?>6;t7h$86F%dw z3ugQc5zp)GP2n^CmSD!;HjB>`KI88QX8c{V_Q2300B$)A!&ElU3 zpYcxxGya)b{Bz+m{)J%1zch<~C49#JEtv7I&Enq(pYd-6GyWg5_;(hzS+AdKz<&>R zR`4cx{PTwX6%|w`rv7;D<`6s(znixb z{2StJ1lPy2fLwz4-jTe5`Ch34g85#j!e(4dFh4t2QZVlwN(*LtWd*Z82f=(VP9?!Q za8<#4??iRMeD9iz;PU9NhG4$8rnX?d7owhEj;Enuepa%HU_Q(B5WExd&CIxk;GBr} z70m7BFPQJ8Yb}`X6>BRv7X5b++#l_A7EHgJ;C}Ff1@pZ=p@P|eFTw0TLNNP}6wLLH z5xfBH#|h^4N;Knvg4zFI!QB4C1oOQ>I>B6@RKZ-|k%C)-#|WlBUhqD&H%TzpXR2Vn z*LH?rzISxCU>;xd1k+zAnA>l$V4iQw1b@Kswo)+tHG(;}t{2SDer^)H1pZdR>~Du) zz87=1VEX$6^L)+_%=7to!92f?3TFOs!EFDOVD8_uf*F57FpvL>g1P^$2#!Sm*9Eix zTY~xCtviBw{@%CDo-gx*9|>0B`?UCv^RWJlKd|II`~Tl%UiG;JN>#(=Qn1NUj;_T` z#n1n#6x#@1r);3F7H}=`P0p6qxDHrh?zhBzkMH-g%!_$FH|FwON-;}2%-Ob>r}JTM z&V%{50OsH#n0E_et}TT5wJ_$?l9)$JVD2o9`La0X$YPim%U~|lC@m~YVa}_Fd9E_% zw(^+IDqs$Cz`Rusb5&W)Pn9qyRmVK!g1N^L^G!9(F;y|IIAJbvRR&r*W6r37d7=*H zhT519YGDqji}Sud&hG5_QZMYj&rvu&etY5M?G*}dgEMdhV!ol&bj6|&syT# z^1=BOfODud&KrN6E3I&T_~D!g#CgyG$9`uV?_F?=x5IJW9>;Q99KS(0W;^0I?Sx~q z8;-|+Ego6Ex2U98;#p@UY|}kh;yc@Ny5oD;>Q-~dmJO^HjB+O|ZIqtXW?&x#sM1lB zTrC|nbE<7eO^7-JHA|{xpk`gQOq4fcX`>v)mvdPwXR)+V?p1R~+1k+^WqZe9l&fHA zqqsS0QLclfjpFN=j&fTpZInKa87TL|(nd*h%tUztmNv>_M@4O|tijSoIpFAy@&qhd zAB^&SENzr8_{wk#Jl)lz#L?LC3-glH6GP7P}9EpJ$;Rm!&(_! zUCCjiOs#H@aur8=l-(T5=U{8@sF_#Y9W`632cx_fOB>}}^-#U5Ma|XfTD_Z&^550d zQMPbeqIWY;liMi+HD#SLQLc)mjndfZp5C>$uvS8y>@94R!A|9I&x5{Dlj`J-n(9OK!39n4i!WYU(??qo$2>Fv?x9v{AyGd3D7$L`{UV7Bxei(@`FQCHL$Sy_Xm)7&XOQf>Gn>5~{CB zM@?&&bksz+EYa6wpeEHR12yBFGEt6m$wYaC%RRlT1z~gYbD-Qv9?i0y4s^W z2}>JgsjEB6>#*dp6pZpg*I<+{x~8N22}>KLfLjL2RU9)=c5}=`xujbr$~D{+8*Wv_ zhFjGh<%VwdD7STUN4bilJIXi5wqCD9x9pyP#qF=WRl{KcKSB$^lhS?w}w5+Kq zW#qP2+SgR_;B2a8k7a1>U@X&XYxU&}eK}KKw$ICYcPv9|YxU)HeK}KKR`Rjl9n19E z!TNH#zMP>iEBRS(k0sjIm$mwG29|?sW$MfJ1@!G>8Cu)30LQG=*QD!fGWBJppuQI@ z(Tl#Et}kck%Ss`AFIb`%eOaq7XXwkB`m%jteJ@yIEwCJ1D_vjC)YmITSf9SYTB#h7 zfn{|pvHc@5Q4Yq^Mv00@Uudo5`7M2+t@03MJLO%3l5VXu=&PjLDj$DS((RN2eS=YB z9T|+8Gbr0BkNReyWkcpa7SlTJI65N+rD70Pys^&t0^m_@O)RkmPhr<@v;j+$YE(@_(SC2N#b>`Pf?i^tZ= zDm$h4kYLmt#nM(;hb6aR25QblXP~CZ&Zyi5#AZnyOgZDW1dK*H|lev9wkG#F8=TsQF!+jv5`7cFG*BvesHj(J5b{=q<-XolDVpZKo?A5?HJ#(qQ8ObgU001fym%miqmLn&gogsA++vof0zAek0e^ext2&A7!qo7By2xX;Cu>OKy!!)I^TX zL`_vJQ8U_oleJ<$#(k5mk`qhDq@(8Qm~_-E#L`aLIY!xxtg*^wtOb@_(_qxtj|)c4 z!?D4r`93xSHRs1=pk^kPIO@jPZ^5}d-hPX%(h^G^t6J2&8?Qyp4J;XxiJEZ}GEozc zCAYKtR_;^xt+vXG3GQ2YcBiAJ%%pVG+?<$>n)efxZQRbvHd|%xBxM_8f>CpNaxiMf zVu>Ssat3PBV>3|WGbIBx9jDlDw^l|@wcl>5G{e$P={{A9nh`Nt)M%z@Q4=1MiJD8( zGEp-ROFL!TH1{1myWMx#D*n^mcQ7U$HNQ_!N6l6&Ig=HA- zE*Ld$W(1?=OH>AGM#N;GrvJ_?_yu}yKI$rGwpY=FD+`u&(fkM0ZSemnW!lm zn~56B*_o)p_Swz7s zqXy$aO}n|lsKIzpQ*d4eYOc=BK+T)E_Iq)!IM05stuh5m&Kp|P1kcx^#sy0|rOEtE z)T~{Qi5fR7?UeWhcsYSzZiPf9hAVwSqQfG?*lS7McZ`s zTYv3jzTLkiwEW0}$Q+KXja-{0lwiTX~ zaGzK8V?fb-aUV)AUln!iLqd!FJ^So!?{d4JV%aV}JTBf2>k}6~ATqIUM6``pOlV?M zcyvO1&Y0Nn=#bcm9Pwd&twQ7bgv7<#^bU^>j|)i%53})%j6jf6Xguy4RXGc4DpYZ) zZ?C)Ab$W#lx?zJ)xz0KKaqcs>k2Zd*_IplD%x^Q;d&{Uyn^rMl;gRt_WX0N_9N%^3 zg~5&f&bRF7ktRh3o_tU~%(ndXM}E7SOdHl?&zHH@?GhsNNp@LXX_wpE{PpPfD>3Ok zD)mlq{Zh>G)~ej6^Z1X><*;Ob=b{c}pVrI~)AKh=ukfCUy{)3d6Y4s-I63(@YwH;k z7v3~B*0DWSJ0d2!QGXgu?wObn&JpI%?(Bv(Q~OZ+!hU_z6Qz5% zi}tlDccp6Ca_Ip@;~aAp|8w)}&nI>+Ui~`CNqdyXfwQxH!;r*;n5=DO@7&lnF&=-< z+CC^LJ|R4+!4KrrCcIZAHJ1!(Dd_YWG->lJBF85z+TF%ivE8Ht0J~lEW$sgJFjqLR)_ShKZs&un0 z5*QNNCp08$yZA)+iuuJBNiJ&tu*%k^kG(=1yuTgTAL=-HMz>iluRoZv`D@br_~Bc& z|I<*npTCY>gS2bX}xw^uCJ%poP2BB&gaszjIVnXbV3?eN3h(SeCIdX>L0$$Y&c zO0_y)__HUl%94a}Vu6Zqlb#X)_) z=wAIh*zJAoVa1}~Uz+CmVEnUIizYKK$Aao!niv5j{ViATF1FB=TA;q;j(g8 z$vs7zEz4Zp>UY1(t+yPnaUpk=NUv9y0%m=_d*)`He=pA8)#GKU8w39ReSWuj-RBMZ zSZRn$a>UD#Z!>~BP3>8?^S;QmfBr1~#Y&~t&KO)S%rqsGt3SA$vwq5O7E^|E)|BCF zoHCrNmaAW`PeMX$e0^u(>wkoW_lk%PSK78|>ef;=8l*M zsk%K}_`@@xO|zzffh^YQ;nE|ZO^@cNXxpp}Yij>gQ|G4|v}2ZKY|{0=4cA|1xcyg# zTaW+DaQk&rHU6uq8b36pEQx9r5gHd0AJZ$r$uo$TIj6A5NIXbfRAR*>MT>VV>^k#( zZ2_gl_T9H{F8Z{xadvq7i1@^iNRN>Ch)^e9S&WIj^H**P5|qHDN01;*jfN{Hx>Ym_0e zVb10cnV9N)r((lLb}e*wr#&rQaYrTd#5Uo*BXFmZWK1jFt?qezcfWEcy=#SGwx_&T z&I@Vf(Xw<%RD5VmTx3K~W7wCW+H+i$)o)h??Yd^wbl<{*Ij;{7#%(}Cd;;cxkhm~o zm_e!7D7#^ud7Gu(Ln!bR7Ur~beMV|?c;F{vE)_jb9DrLCRi zJLSeIh({leU(f&2jFU-JxZ4T$xr2h6K8+8$G!Ei`<~t@X&~m$cRDVrmeqr!Gx(y z4w^IlR_(Zo&8JRI`+9LjrEOWsQL!=6*e3cLFsG)`(J=}7>B+Q#w>Md`UCF?^SIeHu zy<%Ts_xTV0Xyv_h$=+Y*dxa!~{M^Qp!^gjIC#jEbtiP*kNuN#KGKZ|tF3 zrC*m(%;|N;H}?F8vHqj`EzJE_sCT_z=QQh&Rlw;M9@aEIDcZE*Htf2!pKV;r`K>@| z)3zQnJKn02uz9HWuiNtIdMDz(8P@}2O7Sg6cXQ17 z`m8GbSBu%clbp*>s`72ltn8Hdn5?6!)Y=D!I6{{-`!|kC`shB=Zc65+(I3WS1!v7X zy8G?^Vr1orCnw*(&Gg^e;^U;^7WqdTBe~yjf<#4SjbmBJ&?EfHlCeu-4nNOx)?>{n&{>&l*vrip z&AP^6m3r%bLNjZ&=a?B^YxmEbRLB$=5z;$4CO#n|RDb#=#Nl<7sgrqoRQfaD>r*fP zsQp)(Z5uGJOS7%BkN+Z7f3t7gzS^9Z|K!*POpOTrUf!yOZqLGTsoN}0{33>~ zP(ny(-?rFZrU~e-UCDFY(o+JO*pHsq&wcvksJ}DcuYB=~+_spDJH$ocFxEHVhpPkU zBjf5P%?{V^+=uo-zdzdK>$9=Vs?aLy*ERfALoqRUd1hGY>l^<$$Cd8gDDzw+i*4>{ zPd#!~(i~{}t27S#hfQ8NV$5m|e%p#78|~D&n(k;<@b23xBMbgVGG7B3dfj-o!b2t& zdw!%_zHaIk%Wn?~=+UZ^>GEI*D)C`pCa3j97r!;I$i2DMmdv8XM*Vr#&eS^YQ?px4 z8y0(!>(Tyva?{YBF1|~aS-$=-MqSh__@~Ka@TFy^x$kcOeJ+nhM3bhgwl`i9SYuR8 zQ=Z|LG3(WwVPs(;mp`(zEq_g2@{eEPmT5tOK3}JnTxLx2#w}wAPKc)Q(XPf7j$Qoc z9j-dFdRM|M%cW&+r^H)vV)XkXf6TnF< zHV&r@XH<{4n1sj(ZfG;8TuzYRU>?>c|z@t|L)8U|Y@uh%u^JiKr9 zZjjRp&*eLhUV44_Z1G>`@N73ahV*;OAL{3F+ml@v_Iz5R)yg8ft+c8CF8+0T=ZILg zU>xqWqf?);>o;zF4?5ky;63$i{rbU^)`;O6`moA9V>II?9zC$(>}zlT@y)OHa9uIm zbe+T&5yNU4%GrdsTX8Xw#*PX^y}8Z?d{57rIQP$gJXRIzSGVMwq+d5+==18od-T`U z3Iih|M+Q1IPxEj0XyMVqrVHbbeR{>=o>a_!U+1*ZpFr;O3a_ZppheTop^xwT=g9Rj zd!vW}|8yGpe7-)Cqit~^aoXKpbpuA8DD)s;z1H!U*&RX>Li=P*TsC|r&C%V&QA5grIpXHg7EMTFZGNYXzh|wyLn2rbl>!CYU}b%cZZ+2AKWMB z(d@id;ZZShNv%R+W5dHZc+=?-9__M?J$7yr+{wFRRnOF!@y;*CG_RhW85j|Z=wI!Y zHCH-qWbTJzpO#)ZywYo8)qQ>QJ|7rko@>}69y`we$ua)bwz-4*9JP;SX!y13#%#QX?PrYa z(PsQb&SJ6K!sbsrc*<-1-O0m-ybgFGBbyC0oq(q8FsVS!_xy7f2lF`l`&(}C8hzff ztFNemho9PTEhnH-OF8Pv1aAa$4zH=&U$;}-D0a-)6G)MuEMJ# zzF%S1!PR$sI+gpU+4lAB{iCAKhKj6KArYpnxp?V{W!y52dUfyL`AS>&ZReY9zj(Q6 zPZ7<>eQm;V0wju?(QxlB`U&jjn#c3Be>L`4J-o_|H#1+D<_4}j#Al2=!Fe&tzLCw0 z8a17LT6OWiz3I$vK6CvpdA}M{I#u);n0;AYz9RM%H}m*sr7E0hS;%Yp{o7aCJC_?G zqs?F7MpZnvmpu%9Rpr6`OR8q+J71ja)^)}qk<&Uc>s3@@2Q6-B@v)f7A65spuI)Q_ zY28uLe~ex$qT7V`OAL?Cy2E^XtVtT%KRT~q^s!^n9y7L#xtigXFIr>-h2teDOYVZFcBd&i$Xn0^uMAqxj5|%FdslH6z{UNKb zJ@FfLvOwjR=OVhxteDWgcwuck%3`OzxXf=(_({;rNGaELo+daac~ zcHhE%Cco1iOeyH<`eQQgRR@|jM09-XC(LN_?c?!`s&@1ys9-f;G>U#A+@&ON!*X|CPUxC=E#SLx)p=H-SD35A|- zHs#>=7I-;r+I&F;#?5CB+rDfo+U3wwuZ=;)x0OCsYP@-LdpvxP$-39suqy9AyzS35 z`;#uzqglX&(!br0=o#_am=)0TH-sBrMH>c{JU8DK4r*b*Irr*Ys(Y;OVL8M$UoKNZ z_S1bQK5^%zN^Zd>wl{Zjkek~b4d{F#*>gjgWA%qj{M6Xkoya!yRx9_ov5YUHi%xBD zr*gB6`})o3RM_6vblY?2OMY-IJ|1E|48!j(?6Jy zXZfJSQ~Fn7)&ei6ONV zw$<~-yIuZrD1q<> zTl(AVw}DgscJOrYTRFg@UY;+rD*qzOkl#vwsW+wjjIXVK{Bk+-dx`B~j^5g~XJ5Q5 zc|6BY>4q15#!eT$KXH>o^;oxSR_(ABUdw$4C#+V6_?ohezjosNHg0+1g2MIlTD()c z==hLcrhBKvj0GFmh+o&?lk?O)-h5l_wNuL{HLmo3HDY*v>S-LxtTtWFuocHD3tlA6 zeA{aGgLM}h=07;otQEt~-8A;yaV0aC;`*@lx1_nlJoXk=5APS`XL{ge`gPe)yC(8R zRsE~-p5FtmKHuBgYh3!jR!ak&7n*g_0?#(H@9_SN>-?4@Yqg}h^|WI7{MK~rk*D39 zPc_VveDHiTE+#f>8yQAA;mX-Hd@$PZuaxtH{F{5v$#-B%Nr#ZEL*KZC&68V(^bZLN zjf;piokATP$86>?SFMC77y@$^XmT?gmFv!eC1B7vvnd@>gcgzVErOj{7+ii^N=pR9Q`<$C6Meu{E!aN+)LuG9TCMbv5RR`Ktw!_>Gw zelgMW4_7He&4mOf|gF#y&J%LP~7+ zKf_HvV(^>8^=H0vAFT<ZWAZeP;?wV;))V*T@R{}C;;srVbIp&N zA6MX~$>>y=r~Vq@xPQmcGEe=y$EF|7Rqtr~H~(`K9ivQlg)zbT^$)U^{nhDn&_DV8 z7Tm9RKk((90><>Ldz)XqJSkToXg2r2flp(X#jon^KH|#j{9pDwGreTU%Jqy4iHI_7 zwTpjL#Q~4=cuuLel|2sm?>=$h>w2FL70f&Ij7y5eugT*=V*4aHHI3{YgIlaVS*;YZ zI4x*Y&)lNx_^tnu>F09{ zw(IVn7Fh3X-6ml_Z!bruIx;kvQY^+?J-I|iTiaEKOK9XP0~JdAkzZu-yJSr z*lXL7(;fpn>YE;b{JNEnwOs0X;sJR?FZ_0t@1`(pnAU@<=!xqr zzi0Hur{>$#5WOS%o&KeQ)tL5qJsS>bHFE!8ZO!9ZPtvk_#*m{!BVt2L>z!|fyZ$P& ze^bPhhtn#y++Ir838z8Pg?IApS^#x zEN-5!A3!)>U}x{O_El~4Git6JnX^__nczNk&BCa^=N;*vm8!pX8g3qO=Wg6AE1j$^ za1$>+7TI-N=eo@|T@LQGZ^PfF$LPkZ$&ZhSFLdvx-#D`y6my+dMeTp!SmA^LnZ0Hk zd*Y*Ar>sND6K}c+#4`cY8a5akt)EZac2!J2?RwHLC2(Ey*LfmM7m^>74LhUu$0^e} z#vJ{Vh7@b?Z@@0=;Dy8eT}_YEe@yx5nme)b2>qeh(Q?p<_p2WJPQ5*)`^`23{`u8t z7;NV*C_{+D?m)6faoU+z$ zd=LNQGg{;{&DQ#G{1!AZG9>QjhZpw(#~$RQwc^$4b&-i%{MO9xQ2J^>kZCWp?Sls? z`V-U>@BWJBo0tq+#w%v+8*Z7sYu6kLN&DzNY0_hx4;{z9Gp$=zo*_K2e&SSiGgy14 z^tHO_?sH=Y%t?w}JNKvX0Q`n2QvayQ*iqvlYxKX3{+xJm|LU<%eDq@VWt&2MK;bK68;D0OU9gHe9_zD`tM-j(nBf8?7z z8;Wpxd4t*I_J3?_f5oBM-nxr>6zNhI;=$AKOg>_iT7cdZo0je4B5j${_Q-n z_Y&t0K6A^r4Y*<*{neBd7lQj_{hPZ?2Tb>-3-zzyTKd)4@U(qBpS{Cu>KvHgdET!w z{9^F#665eTT>h&64e$9qxk_C;w#|D^{c~@!4mY|C(t16yGf*@6FkzLwsg!9bNtJhcl{(KtB57oA9z9 zfpiGVSi|*xnt7?%)m0sv@2F6tjP2RPI8)LOQ)*dHT@Bx5gD_XB|!NgEH>1W3C~oJm>y+b!LEl>p33VKkk0< zGGW+pnGzLgmK3TSc*K6zwL4n7@r2TzGY9?gd)E=YO;4lr{X|8YMwoRRwyx8CHJ=qN zpMCWDfWa3%SBCg{dR~5Hdfcv03k*rp&LCXRd2EWdX=p^jMq^9Zr<3%Js*!vjQsw&(D>;$o_Vfn zuwhVX`vrygoeK>LS>{w!YK*s_+BzryBp5Ntcz0!be3bowD&EQXRta0<0P#37Z+21t zXtt;sI~ksG#oHL`eF99s>EngK^rnQYYe-gwX~Hh4T0K#l{P?=W~)gX=8$&P8XrhZvr(rFwMIY_RlH`H1wJ7< zl&f4P?3b&|mUQ?(TBW<7N^Ysq-P9zvc1T{!mUK7N$$>TqXsSxoXtiu=ctN1MN~cok zhH7-VG`ds=-EDoWom!Vd(^sXPi54~5#Ts1^2VFm!+C^$z;gT3cUG4t=97W1Ms?;!5 z>N-_g1x@NsO`4-a+DIm+?og*yI_RSH<^r{@0N1UaF8Dv!O}kX3vsdXNRJuDF zU4lmU*df_d-)+2F_lPZfsdQEz%S@}CYVPE1bju1>zdp8ZtXNh)0nl`cc03)1M0IV6|UkF1Sachs=8bapD;NbG5i zZi0jEiQX)%){SR!82j!a!;z}djd0N2(VMx|x->)6x|}Lq3RX^|8{?pR zpf~fYb)${_{&4JZwHlY*-2i-mW z3glJmMjCs-;bN`P&eiDhI_Q4W_b^AT%VTWqhm(hE*Cgf2FV~LoZB)8KD%~U;BpTgJ z2i+TePo>qm8T!4Q^6{66rad%SrMsp|ZllpX&?I+qNZzVXzOPR1$d>(8x_m0#IE}8P zMmN<#_fl_`Q0t~JTYE{R>!{K#RVA0w=r(AQ%R3|w(+8|qCzoT_jZ?e*&#p21WvY@p zYIM(VPB|p+)+awzCwFIZ{nV6SCUaPxD(yIx&O)P|snOXv=z1|xJ43CrrHQErCsS^X zHeI7D+bQrqWKp zY^2f7#tiA8>!UYksdc#w=8yA~F#(&~Mx&jFqrySgSD!Fft;@@y)k`b*%b{^or;b&n zsa0vdsCmcppU~*bJb=q-#KnGRoc~x2oRoWB{t_o?h9n${M2RNwHW-%b; zy(%?|m%%hAP3l2SS}ljPNeoEMP^Z;o_jS`A{b%<&T=s^mbbqLl-8H&DHOb8#k{2^s zcR`)(&C8ybYM@4&Vu|xdo6Hr(CFh3|NZ-MT|8ZT7R_Si3k}Ii_7iyB-G|9^yQdI09 z*;Spqj16LX{b8pX>U6nrIo4o?)J<~GJ=2eqbus5i=(MstkxCL z4`pPjU#@FTYzK>x^~xB2)-P-L*`U1PXTvInpN*UiKO0vt{A^Om@YCJMO^tCL)eZHY z#(XbhTr*?4-p2UmMs86y)*o+87}?S|wj35}>pV(1YbBSems%;MRIySD@Na$=;2-uZ zpw!@^9v9ABxMr2~MjfI)PH*Vb^l|!N}yj4DS0XTHu=*Dn=+Ju!mFA@x`!ta^kPG;?M6CSK~W|N~x__O5y_98nrD;0~j)# z3&k2Cx$x;cH9k~bTpeS{IDBP+x`-wE1C~^)EfHd2$q<$jxj=}1p`oiGmQ)XANG>jb z`b9A|fIcko=UNL{;%~I-n=&;}Mr~z@Cw!gq~NEfRtj>V56RD5+<5C3 z)@WYM1vY9v^-yd4QC)oYy9iOg$gS>&uPPuGRpaB)*hvgdG-ec5TQRL!zUshxoS8>0kVYgdyw_6%^dntU~Z!Qb8I@kh#_%xmy)Y2k}8`MHkAhVOq-ZO(zM2q-S#NSeDxkx!mIo48b)kC?~Qp*L{i?!E7~zIS%A^Rt_9bU)9`n%T3~`rhw_zNAt%%J&WJ(qokaQ<+N+z|p7Oo9Dc^Z9ct*aczu3N^MZQO0B@}nINU=<;y^D?C zL>;f(Hnw)9__L-IJBp<9?AwImf|e=H7K*=Zkz!Y|wK5yxp4gghk2Iy28^f;?IO^3` zwMcQ?)k5(zQq1(MUSdtl7o*(PKS}|HtuhcQpzPQ#F!gQUOB^FFKMB$BLJ8Lfox)qI%|SJ)N7+c9SS%lF+19VnSV?rWEsHpvbsq@=vqqJ9@5A ztZb2D_gG;J7V1b$xS_?kS9ft!iiNR0B3igWv3*6$JkAq}(cmsqs%MB)O{5*$8jn>? zDdtL~&C3>PFU9Xc=G4`a$IKjSVtcXZ5%wyyF~Wdlq(gnP99xG_pP6G#s4oyhDijp? z_Bv);M*ikGcD~^GNsBV?ELw&)#Ne?l+g07OO(l>Q!|&lZV)3m-{;3OuA_BO{ZUqtw z3p5l?M(?7O8UN>NW;D6DS@s`yy`UII6q$LdtDq9;UGKpv&(a> zKK44ffM#cEWu&A2Qn^BV*&r88r)Xg&N&W4TTx+sUc?QPLW3HLL)_q@$rvBHtIpELf zFp#EqCnpu%o)YOV{bsmA}!g++5 z!!)xZneE%&x&5^qWy+XWImoO6c$H=~!0{?8_4`wp*vmpy>VcNBcZX>EnY=!$m$si} z)*~Em)?mGU4X@Abt=H$qwY-k!*TstrvbpC7DENhlp^A+bRcPf!X0gNZ78$l|Zz-?e z_$|GDBf+g;rz_a$jaW2sVz~1po!-Jmx3bZ#rjg^_YF1WkZym3%C&KmSd&gTpT-(?3 zdOh3MlW3BhCv_#p^Lg&~Q<>Kr5C{Ni_U>X&-)GJ5v*q1UIY8OEhu81n_dg)zACU5W zJim|U_v>1bcR#J>L0u#A9vpm@k@5GT6KWspD^6@3F*&hPIf^NtJBaR43ja~|@;J{Q z=lPRF^(4{mELYS!sf4HgNzb3ElvOjwdlbquB0%<)qZP7)J<7FTk>*RZ!k1`;FBwjX zyjOYsAg>?f^@HYmq4zsp|2?n&p4WeGt`~Sm%=LWl&#d=0>%DF2#k{}tRIGm?kMGh3 z-ZeH5^WLX~-=~EC8kLmvhvfM~w)-2;|HkuAc>W2`|DE*yy+W=3ZS-TrBEmR9kS7W9 zBtd?`Mqd!*m**?!FUM+mibPJ4$XBfY6^Wc|Ad;WVQ6k9>N+j7qi6nEiQ8HJFB=eO> zGGB=#3zSH*K#3$fvVKP;lI+kxq%c`bA|)hJLL#MXR7xUc=NS%?Wn;7~Cy{az>B0Iv zNTj5JNM5opiS#3pek5`x8=XlaXR+Q{8Y7bfNn{|2oXz@YlSseDM24~Pa1t3#A|u#n z1c{7dXQR|`l9eP<$?r$A{%8^z-aw=%$!MM&Pa@+<ESEHO3`3P$(Oykp#~Z zJg+18I)eAupU3`E1e+RUB5`sZ4Bn(*C$>Jq6x$$21}6{;OLr38CZgFyG@D6vGp}zU znl1ePUZS~|XtwfvE6=wP&9*@mhR!CF7xIL>$qNREh)MDSUinJ?kc1v4fQM-tk3=PP z^B4&|MnX^MFeLfJNY&wwNccyCOlnL%1~FlgPj*YC#u>?{NokiRndB}rjEE(7v*+FH zc@IUhhluvl3iqs+x(Ii z_$$)*6=}Rg8ZVK?Z&?2~gXFe|ll&zTAd_rE_XWv=?EVm0Iz*OUBTKK5rPnFk*D2h? ztbdsG-yr!nNd5@PAE8zc8Q~hOn)H5yplL9#Sn{nh)yiA+^K1)C%_K~=mP@!h;sW#Z)GJvW`y{d5#mz@;!lUEPTuN|F|rw)IvBWPIx2u|#dv~k zPLRe)VmoQDImr`@3a2RCQ>JexdCCkhVkt|pq%0jsrz|s&j-~QcsHr>^YRXY1q#RX3 zs!%bf3YC7UNa?4Fl*d#j_TTAzW6`NRTz4EtkQ?8LrAl>JlqzLUW$dAhJ(R08rOMUP zQ$2{JhpIExOQoOc#d>|%Pah(xP;I0tl=D=aHxA=O)}Pn=^ZEdu59n{=W~vlgbYgwP z{@2UV&9aNhZe98aLTLz|a+h-m#WTd1fRh@+yP6|3iKIrTsia1!ic_P8nQ=~P1ekJS z)WsM!9>c~HbikOJV07c8CX6?_Pfb=kOHDR*=A(}!7JW75Z>&>TR=abomq`Q!stD;R+QD}>JowJ+N zV)dWYVzuE^4eQkmxIp4aYL*dNp-8TWsObhdDwds5lNm?ba=Jlw$nj3>MwQS?B40`5 zt7ucJD2ZEWQ@7CeZY9!NiC_)S*O+rB#ax`agPh)B;=7Z&LkEeedU94z&N($oacY#h zlkM(gyF1x#3pK(-mb#a??E~&*(<3>}1WIRPj@EzNcscPm|H7Dac(E+%B5zZr0m9P$}#jYWz%g zc}n|PVtkg^_AwysV;I=a@AnhQ^Q8DZDZaq^FR=aro*&@(i){a5UlU|g&l(;bk&>~Q zA~}N33%9S*EM8>@Imo^avadrlhePD@HA>|*s`Yi6*X!(unJRUd-@g%+ynclJA7TGT ziS=mTbB*D@ia_ARu9qF8MVsFsM`oB}JOY;9l}RFXjChU_&pX8V4z=+f&E`GI@Hhj{ zaR!tR*!}~y|A>zH5gqem+RMiy)$EQT#4=2-mLszD8CCij**OuFRN+Y)(aE?P#b*!; z2dy-UQ*3d{v~W_Vv}fN^z`kVwJH9o}D9&dV^O?nbN89_3QuGTo2l<7#V~&X8n=D1C z`Nb*~zgVT>m#EbI5|x@?%1%mEI(`|yFFQv&D~7b380-ip4^{E6zD{zTThMD5BmiXIAvD?Q5LDp8@cVV+zue7{o&IxKNY3 z&uOF2X`|0+qt9uhzgT_IUwnbKub~WUDC=dEIc2t-bXHQ9EBXDZs2rk(R%NU; zrk$_RF_OPV^N@c#WpKNZf#a_+RvhzP^6rxNTFS1Lva63u8bXr(mZahNZ11yu$o3(v z-;HD^65Gs5o5|@GN@NQqaxW!vFD0^-9B!oqwowAx`2BV=x!o}7_}j_U-k*A z^Pi+&KW-#NzkQmOnehBwloaP_{%!`1-3$(U2y)N4D)y(Pvm$b~kL>TG*qGb={S@Ex z?Bsd+{R`~;1%7{koE;cq0;s*UGtkI`N~pbS1R+I4(Rmi$j?GN009 z{!XNSzd!}}DR_5cqm>wEKfca>Vm?;}eXb1pUy|6D3?Qcn{}i?M6;0%;f!g^=qiV}^ z9@r|Yz%~e+z#gaH7iv@v3YF8KNCQJqq}mBODe|C`b{=r?FOd8IodhKcA}CQ1L8&@L zP^uCM%Ght2N-!vAJx-8<9;)@AhuV3-2~p5XO)cod_I=pCLM0efTwtPRP-voNrzlD} z>*YvxjaC56cT4308xJ7U1K9Z>GBHS((t-h|(<0??7$q`{5@9|HhN~wBBh(s$5tPU% z)*r?Cm1^HXrP_TknnXvFqcJ2thLRaOS?P|wLP{qXMoCO${}au4#R(>AcnhYG8Q$v& zE@yw2lbI=vnVC*?PNzDVH-Z^thBtnKnIy&=K!M%>iUqUD%xp3!6MSpdq7UGh)gZh2o)@2f6FPfXsp9 zfE+B-k%%ln$UVClZXZUYo8WfJ;&#)<32xT`N#Lr#1+MyAP)pOUrD@kw(e?dTqkl)`KmAt-*{cmDDE(ivj`n=@^!EV~pZrakG?plwlhQVH*?qu#SEeB|$GKEaO*1opFO(T#wSs<;%Hd2d z_%((7YkKXAhB!meL2BS2C2)vH4^fk^vGHrH_c|r~I=$d9>mO$QH>k-ssL3Og*b#nz zlT};0xCKf)?~8`}vamo}#8tRhk4JoB$qGh_k_{A+%Htp`|TDTPcRN zsv)!*sUdU}M(8N}VWE-<3stNkb7#oh88T;vom7lrG3zsjhMbdyoRfv6s)n#s)ex4c z8bU5EhUKb;uw2y;_8^WPs)n$asv+#9!8MGl_`|qnj4-a^4hNChLBundOb;f1LwG)f z=gfd1GhjHJ^oE-;g%b`^HH4Myx03zxwpcit{fr?$VCA*f5(*<^OcX;(OfolRk96B~CnO~+y3G*+6=7qPj-t9D9~e zmE5p)f^zCp+CBxt92SOb?`zHsIn4<<%?V`<53xMl!g`xYXB&mEO(Rgq927pldfTXo z9i+R1bRT7ZkFwql(%nh^cJexNOZXI)=I~%`xN`{p^^1%5A*VGVr#0ao(^)Ls!^*qQ zmCDezAm@@@$a_uUepcSk%KIAk%=NkO0AWZJmrh%Gc)yjv9V zZc)fJx9~9Qy{;)TJW6{$YRtw7k7_^+kJ0Xr8M}AFV-)vs+TwAe1}8jD`~R3u_OWp? zC;XV^$3?I3GegG-Kcf)7AZ`uBPWXie-0&;X{fczIQo0*$<$I%T+Bq9-<#VH>^*1_N zf1@*?+af%*g%>CAPLtCY4`x|in79OEPB|IRFzrP)%Us|2e zm30@kr?J)lXStl3e@a>j#u96_Z4Jf0bel8BnrmAF<*c7AYyxi|Yg}G&7i)OT zDzb*j&H}$^sQYn{-xB;gu#v%wczf?XY@W3Me-oU*=0Rroycm;x_Hw8Q%N}jn?mjy) z!cM$k*Y>w-H`}%UVb?9T?7BDO9{%+&?%jbW%-*!BmZ3YK!z)p)ycsf7ID<(xV(J|H z6?q0z%NsM5pNFS2TVblQF;n+}(7#~wI*bI@Gq8CbDsXPC0jI5%#l3Rk?xTR4D6{Ou zP52?d8&MT_VQ+2{c+bkTKi9LJA?>rj`RH&1HZRY}UjDgTK2r8W`5v|+V}Gs-1DuUl zK9}PwK!5=*j|>nms6n9}ELh2~OeIjc==!j03{C*t~+bu>Z;&87q-L8<$VE zvU}P}ejHD{4FT6)Y1y?;TT5WSkv(h$cX$?e5?(luo1$NkCc*;#Dp{>t%31Qx7=Uff-f~7xc>tPOiJp?h)^ww2d`SeSUVtP z;G{1z3Qk7JbL}R*)W}JctY*te>xpMU`$9?|Yjj&fN*#>hF>GGXIAX{|NjyDGNU3Au z$yN^3kYc+p+ljf*%_+O~0lTg@QqHD${XS^S!{4BLDXVI=iVGL z_EArKSPZBuKq8hexwQe$z{sTA9rD_2*XfYgFCFswMG+0A5Knl3^^Rp#-_`(2-d9IN zyQDpymg7E~SNu=b@Vpks8yTtjUqR_l*u4I;VcTo4dHpMJZvB?Qp`|kN#l}Ic3LX(f zhv$JA@3;5F8_Z2c6Ir70$Sjtc0r_qa+KtT{I1F&73FLtlIJXjn+)}CW%)LjXoDV54 z#4o_DMH}_q1m5aa-@Q(f+>N%?baGK3gW?cWB-gfGG2Cq*t3<4$p|^| z#79WklVHHND-YsOcY=ojt)~(s9*~Q2_UR4eB$XV+<_(>NzE%tTp%pl{9whvhN*Tx@ z^#ODM!5_zz_0b0MrCI*FlH+|gZDZN z8RGTxEW7^a){=itb6#5k&dpe*-KoFL1D4M~t+QxpNh)mHlw=cWmw!*F^!c zn7|~Cfvg#?;9cq>8KPk9agK~V%t`Y}?{a&sn{1MXhGw1hj>!_zGnBm-VBZiGkN+OD zdowm~yixXEj6>v;t?U^MKAwYU2VpvM9pqg52Mj)jS=DX=t!cXQcK#^ax$c|M`yW9_ z!n-$d6*$=<+)S*%xwVf5+fu29@nbOzjFu8>ko(Bz~N+X(ndVYG>%|X|*|Yt_809v3XaOLv|Pz;mCN(t@M;^Wx0kIqbBiI;;Ud<#Myxkctl7#QQAT@+U#i^ema;lLizo`Mx z;s{WCqG+2%l#ZfH(ou9t6ePC^q#{7NL4xG>6%w4e?ixVC+&sgXpE&)&<}!6=Oz71h%}NR5%esp|$;8FUGBfDfcu}nNL1tBZJ-W?n=G$TWFNpoG7zfkGJsKPtkKRs? z&Q|Ie(@o(wiy_lwy!L01Z{0w+bS*S4D-!gKjbM6k#`MVK&C{P0wLG_2m7ZIys&=Av7TIB4+*VlWHIs+a!~2Ih;pif;c=O^r?js5dH=VsJ0jtT1L!$7s zAA|B9b^jtyyoef*2)+L3J&L_1mz>Y1l8Pj;G+&^NZX3^$bzJ<|=^66ClewXc2cFEy zOu4&^Cz%>fqG~rtn~a;#?S96o&9|DrgtL?*J9$sshy8Qr$fT?yE^|vqW3># z9;4>6m4l--tOh^(n_asUuJ*ZIcT>FnSE9D_ptjAJ)ci>0hk;j89-}zD2b$WPK+=(V zZ#q)%t#)@dV3-CB=INwnqm~;pMlBhSXl5I6XJpi$gV0fI-g9yjT<)`Z&sE^udI+*^ zt<;60#;Y>bSaXdsZn7*woH+)_KJ;t9!1kvFwtuSol#<7UE?EHbScq)AD0Ii^KTY`y zJ~UZ}MWJgfx8D7UQj#e7IVeT$6{WEzk4?7o8K<6Yf5s{O*yMrqW0MCmo`(DbjJozx z*!ZI`>ZcpjGd5CB3&W4ENk{L4nt2@ZrS!8wFV(m|ZNTtzU^qR;YV+_m?N~3T?d0WZ zcUJ=j-b|a+d^+&8I@Z6X9qZq!U6~*tHY2vA@*o29?7=tU*ROz(S=~C6UfnvRZu=O_ zBGDb=ja4#GmI;6YO3Lr(nn2SYw{5>VewS9q@2cHr8p!XA{H}K1)i}$ua-{N=wo@U)++p%24emYm zkijA*0O#Pc{OL{1Dv+De=JgtVlO`XS28b|^qapqYlfsnasn{;T_6D{uumLn)5^>** zC(x~(c*1gj>F&e#5amVsUQK7a1Sk002K%-gt4qu=-e-Vyk_Yub7L;&V-uf9Q%LIUG zzML78cU4wcV`El@bSQ0ds%+*27YIMTooh|aTZ@su))6_Ki9os6- z!?Q>QlV+4y-K_6H&iVG7Oa2=u$nza5Er=y24=)&56M)`&1ls{@-iPM{oditp!^&ch`~NIh<^qTl9v!c}8}2{gKOc|R^*qn({XXa1bMHNK=Q0dl!EL-$ib~M6G5KsRR>MU5-Iaqmy@-~)R zb@unc{|nGi{bgXU$QU-JK67QlW}72EyH5>T_I6{wRfW4&I*V$hYo(QTHWd}asJelR zVR*gsqhCu!d6ExfMBNJ14S^;UQIvh)6zD7XIDB-W41s_OQj{PF)k+CesPRAl;eXor z_uBZMa@-KhKFUH)sI`TddmWLD5$=nuSo}W<|F6aWJMn)Bl}f3hQY$soDy4~9joO~I zO%0+PSSP!j{l7~2<-59UkN>Nbt&Wnj%PPf>L;9cpREo3n{|tbsQY>Bm@0f>%7?o1N zbROhpsFeAJI+b!I$5Sb_U2`LHODg3=p7o4SDL!twk>8e7%9{W5WTZ-|TaT<#+SXGk zouFP&7!(O5K%<~kXbLn3S^}+xHbJ|fgV1s4C&;6|TImW!xU)^Q(yoD8nbN>mK7n$+ zhQ_jIL$xx|RKA3=Z6jm7cO$hj&Qv~wvbwRczG-8%l3*%tM)`@UT&am#>D|N_vl!)r zO^xL{&D2V%=EibRbG0(TR6dIG7gM=j3$+s2!Wgp#<(H5DUC=)sj z{S4iJ9z!po576I`rLS5k2$h61P&LR2a)+8jzEC@;Gt?W3frde2q4CgkXg;(YS_f@~ z_CiOXQ_w}|I&=?u3KjH2Uyuf>2020QP;1E5LjF((s5_*EBA_8q5~PQw zLGz$x&{}8283D68^0hA7{hqgh7pcBw}=qhvvdJMgUK0tp%mj0M`s3cScstvh8O&~9*4b&0p z0ri6hL2=LsXgo9>nh!09)7@7jjftEn4p-s>(=pb|)`U$!M{R%yTUO?}mzaWc1951K@Q~_!Pc|fh9 z_E0w{1R4m%Lc<{)Gy$3cEr8OY_0TqGACw85hJJ=_Kv~dR=nJF{!fOLm3@Qgzfoel; zP!q@tY6EqIdO-c4K~Nkt0!oG^L9?J!&_(DvbPsw8y@vjT{)Gy($9_Q-AP2}1st+}T ze4w^aC#V+`21P;%&?qPsngY#%mO!haP0%jrAaor13AzIP3O#~eK<}ZyAd3#@A1VP= zfE*x4s6NyT8VZep#zE7ddC)RwEwlyN109A=LKmQG&|T;W^a}b2{nLTho?5Z$s8$L= zrJ#yXb;ucN0JVVppg^b#)CWq0Mnh@PRA?@=6j}rAg^oa{po`FT=pOVGdJX*v{R`y} z#&ri(hH62sP-Dmw@`pM=-61U$0S$qYAU!k@S_5r{c0-4t6VQ3+Ds%^W484RtKz~D) zov^M!B_Rz|4RV6qp>QY)N`yv3Y0y+?F0>R{18s(OLx-Rf(0S-8^a6Sh{RLTc#xa9R zKouZor~%Xh@`D1QE>It+KNJlOg~mYRplQ%zXce>(+6nyt{Ro|det~X7&!9h`Pmt0@ ztyn`vpfZp>4TVEdP$D!MN`t0CbD^cs8fY`L8#)A?fX+i#p*zrH z=q2<4`Wv$Big|@fLK>(VV|b1Dhic_Dnqp(SEw=M3Hd`Epze?sihzbdNsu0z2+f0*L2IEc&>rY8bP~D%U4!mI zPoP)ON9Z5OsynU?s1#HYssq)7nnK=C02B=MghHXgP<(gebu|*@6lgLu8(Ivlf;K`s zp-kvB^fPn=%7UIje?Xrgr3dB~DhX+zYLFA;4mF2-p>|Mbs5cY?4eMd-do0T1P37q* z&xe*n>!7XBUg!vP3c3j0hn_=kpwE!1C*~b03YCQ_L$x4Rs4?UT1wvh*K2U!s8X5|X zfyP18pn1?TXd|=}`k|+Bd_SUm4*CVU4LyW@hu%S7p?tmYS_Tz|%0pG5I#4~RDdY_W zK*3N?C=?nD#X}>Z6lfom37v+1hHgNQp_kAH=x@lfH|7{B32C5ekQ3w%HHUnmc2H-i zHxv#L2scikh%|E%b;RVIj9O$8*+o1 z^fAtp7s_p*j!+M%A2bMxgGNBf&?IOUvZT0r^3JP#35V)E|n5mO*QwEzln5Fmw{S09}LbLQkMq&`0PW$SMSVL8YLI zP<6-|Y5=u>{GdRn3)Bbd4@E;mp)t@nXc{yRS_Z9!wm^HJ!_Z0S0(1?!3pLf^{D1F{Lpo>zGy_@yr9cXa=+ZN{7}%+n{66S?Dr!3wi*(hW>>9h4P20mBLVI zs1j5Ia)BB`EumIW5Y!dw3k`r`pkdHhXgo9>njdOBzm}uC4%!Osg^oa{po`FT=pOVG zdJX*v{R`y}!x*5_P$j4aT0*U$AgC7<21P;%&?qPsngY#%mOvYz?a+ScD0Bw8 z1l@%0L(d^49P83wbQ8J{J%`>vpCQ#itp89^s4P?&ss*`1jUi9SAL;;gAINiw z|MDp}2j)}mL(ibsIrS>#qbLuJFh=tk(}_X3<;20cj$ zlUr{cn_F(g$CrkGD&@2&_l?V~FK&3=O2*hkd169tOpCC+|BCYcF}d|^#^#or=yJ>N zM0t`vx4wLGZh4C+mrlv8FPNHJo+8S2X}R^QM7i;}-1@ho95g<+-g-iA`Bzb%J2AK3 ze^PGwS5cliIk(@-KOQ%Z^$$gPz`Wf0-$i-Q{M`DlqC8?jZvAIb?y@kq-fvNE`K&0XEY7aar<7Te zTRv|ntMJo??4MthhKaQ(hj~Er3FZlBA(-)&g4=S6DFPiEn&GvCRKoz2)qF#E47nE9?|>?WAwsVA8E^##*+7tHZB5X|_7 zX52_H;~NWRdrbt>Zz`C6Gr=5xb2DxsnDH$I^L+F$V^1^o63q6!1vB4AFx&SP%=N-g zFxQJ#g6X#wOyA#(+XzmCA0U|hwH3_yZ6}!H4K(8*Gj1=K`5go^zoTIG7c7{^qmy9f zcNWb2E@s@-jJpYDes?qOA(-v;G~-@^IlkV48P7M9+3PuerE zUYHq&n{j_L9$?12Ih5`322nC^5+(EIP%>{2B}bWYw3v^+Dn-d=&P6wH41C=4f)u4B z6pL4=Z1%U}&%N{GHP7f5Q!7fm=@pFe0Z;?+xqs8ZrA!=cttivMrA>Sl^EVS*#>CveS>UoJ=KjqAmlOV6 zaCza+2UigO0MdYslR~7lIzz!zn&Ejfs zH52oV!dh^36Z8121J^Jy=W7GFrr->4EfaJ8Hi2uKcqq=l&EPsFu8jHH3U(Cv+rUmD ze;3%<#7I~6nDJiJW&6Aa_6f$}Qud4Z!r%jf+1?K#p7{p_Gyjla`iBM6KO&fZreOL< zMSmLbF~RKrM-k8b;+cOI@g6Y2${qg*LC7Auc7V*sgLooB-2&Vs5F#UIe>Ax3D|AS!q9|hC@ zQ!xEcg6V%2O#h2u`dDLiV-%&7qCox}K&zuEwK3zmS^Xm#` zzN=vRZi4CKgK{~?pMHJ8^xXy1Zy=a{L&5YL38vpzjF;nYBADZED&m>nOfd7C3#Q*f zF#VQ->3ayK?ej%zS^r^xFugA0U{1Tfy|( z38o(?n0}C8`t1eN?;ys@@plx=@dt}|=64dz{LX^ucM(j#t6=(kPb1fp?t?>!63p=r7V*rF6wLf6!StgA(~l8MKUOe(ex_Q^Pn=--@q(G3AeerlVERJ^(;p`G zhx<1|F!yhyh-dyN!OR~mnEn{S^v4ROuM8A>&pC*|8IKlMC3#LCo zF#U;w=}!_&f3jfuQv}nWDwzH>!StsKrawb4{h5O4&k{_3wm2Ta;5mYMeCCRH=Fbz% z{P}|EFAz+Bp8}#|+XB2=F!z6r zh-dy2DQGf163Pg>F*Itf3INr`vlY9FPQ!T!SsI+O#h%@`iBJ5KP;I35wSmY!I^@&e@8_; z^N$H;{*Qv`9~Vsjgkbt71=BwznEq+O^v{U#)B>Ls%<-KQ@y!28F!Rp~rhh>&{fmO> z|16mPCBgJB3#R{zVER`C)4wX1{x!k$uZ#U@2)-eF#@`go_*;VM-xf^&SHbk}2&R8m zF#UUi>1PS1e_t^D2ZHH86iok-VET^*(|;nE{!_v9p9!Y_TrmCL#C-93{9X8re<7Ih zF9p+oC7Awe(H`GV{ULnDzY)y%w`TG0gwOc*f*Jq8EdHbL8ULqX#(xq_|FdBFUj)HjO3zM{^3f6V6_Dm;^v_cv<6jL#>S?O6z>Zz-6*m0=AeeqZ!So9Wre9bv{UUIen~N(ygw)< ze8!g+%=j`Qp66p(;WNIRV8)jhOuvF)`Wn$5?;k4)pYfFhGu~drvwuF5&fZ_fR}swk zs%G&H!e@Ln!HlnN7GFd7jISw}@wEiguPvB<9l`V+1=Dvj>(5#EjCT>t__~7Wy9%c7 zCYXLb!Sw43rtdD8egnbu8w#f1NHG1zg6TIAOuwmM`ppE>Z!VaA3&HeT3a0NNn7*fA z`d)(Rdkd!TBj&p=*jMEjn! za+p4T(IkiI2Z{0We8(?n4%E(IDq*f&g}6r9v`gCVaDUbjyX(!fMELgkl{CegkbuEM1Ooe8Z3Oa7b%$WQG)45 z3#K05mXhf23ggqXg3* zEtvio!Su%prmquBUoV(`vS9itg6XG<{pIuYG~qLToM6U}7fgSGVEPjU)1M@m{$#=Q zrwFD$RWSW&g6U5eOn-)8`ZER7pCy?7Y{B&B2&O+*F#UOg>CYGQ6#!l!e8w*n%=kru z=`R*ce~DoFO9j(kCYb(m!SvGw(_bN&{z}30R|%%SS}^@Jg6Xdn`^)!l>x9qv^@16{ zK`{Lc!Spu@roTxr{mr63t`}Q`&-kr^8NW@$bN$~ge8%q(%=n#V@w0zb=^m4Z-wp3Z{QcF#X$t>HjL2{vE;e?+T`WPcZ!~!SwG7rvE@N z{fC0-KN3v;v0(a71k-;inEo@t^q&i+|C?a?zYC`SLNNW8g6Y2!O#iiD`hSS?iSN(e z2%qt91vCDgVEXR`)Bhlt{zt*|{}fFBlVJLv1=If`nEqG6^#2k}|8KEByg&O#_>BKo zFyryzw{PyhRD$WN1v5XNVEPt<>01h>ZzY(1e!=vu1=F_?Oy5>8eLKPQ3karPP%!;M zg6S6)OutCJ+~*x!UyBN#@x=r)zPMoeB?QwiDca+DS4#MdFD;nyWdzeNE0}&c!Su@u zre8rYeT`uH6$R6;B$&RvVEUB>)2|}-hx1ca_>6ZD%=l`8=~ov_zlLD?H3ieJC76C~ z!Sw40rtc`2zO!KZE`sUT75l^E<0^c{y9s7|J;C(r3#RWb+T;8*5I*A@3TAvG!Sovo zrr$&`{icHHHxo?1xnTM&%*NAF_>A`u%y>`1^t}Yr_ZCdwM=*U~!SwwE({Cl1erv(> z{l$2Bzt%?hj1LgZ_;!Nn2MVU&UNHR*g6Ve@Og~sK{Z4}EcNR>)i(vX)1=H^)_NNNC zyYLy`Lonle3Z~ynF#X=5J)W<9gwOcCf*BuT7OxdP5mgkf4pG&69m(rD46~v!Sp8!rawh6{i))3@P2HX@EJc{Fym(krax0K{aK^&WrFE17fe50F#Q#R>8}(_ zf0dXIp6{!L&-gWh8Nb#nex2|czg{roHwdPmA(;L~(H@V-CgC%FvtY(=5lnxpVEWqx z)88(b{tm(PcM7JzOECT2g6Z!OOndcpeiz<9`&)_~U}We@-y{pTv0UgU<_}@fQR$ z{-TKI{{1X`#$OW5_{)On|00E94c|E6I2w*=F_EtvkVg6ZE8 zO#iN6`u7CW&k{`kzF_(f#C){^KNLRW9|>msW5M*F2&Vs3F#TtO=|2}t|2M((e-}*u zg<$$G1=D{enEq?Q^#2e{|BYb!Zw1qTCz$?w!Sp`}rvFhe{XYfM|0J0HXTkKp2&Vs4 zF#W#-)BjsA{eJ}0|5q@5#Ul6qioQxPeYIfv`2^Fq5KP}vFnue*^z#d*Z!MU3!St&Nrtct_el@}Ls|%)I zL(DhV-1F9-L~KR_`3wu0%m6HGr)F#RCG^xF%j-$5|_j)Lh2 z3#Q*mF#XPg>30=OznftC-No_X_0U83jPEI!@x27o?=6^qAHnqd3Z@?-n7&pp{eFV! zhYF@2W;Wh%;WNI!V8#y+On;zY`VoTZ4-!m&uweR;g6T(z@$h_(7Cz%+1T#KXF#REd z>BkACA1|1Gf?)cIg6R)68_zJ|Gk&;W#wQ7;KSD75k%H-u5=?)zVESVO(;q9w!=IPx zgwJ@rV8$m4rk^61eyV7X^PMJq#*Y)s`0;}2PY_IhqFH;BgwOcNf*C(WF#V~5=}!~w z6$eijKI3NyX8cUS^k)gCKijOmIl^cBT)~W=Cz$?x!SolHwYO0Cj9(;}@r%vkmk6Kn zO9eB2nPB?M1=CMAYj1_{8NX66<5vl$zgjT;HD>Lt6+YwF31<9y!Spu>rk`Qf-bUdw zev@FvZx&2{i(vX&&Dz^0e8z7V%=jIG>F*Rwf0t;l9C)|z8NWv`rOPqF~1VEaLfkdrA0=zbu&XznH~e5kBLu3TFH@ zv-s=6XZ#JpjK66Xe@pm`zb%;YznaD05kBMZ3TFI0v-m9GGyc9{#y>ENe<*y$KN8IN z$7bFM6=4YL*3g-2D!!mchEDF9YnDfVfTz3s$lz}Z@ zQZU(yO6lxwiU0YVekx`7K)xc`KyNJa;gtd3TWn#CR{$%l`iQc`H+fkW#)@7Lt9SvW zfTbN)Yg??)MX)Lt!b)5Wt8Xc+xW%!`mcYtd602!>tf1wvYF5NbSr)5f8LWtvunKCF zW|kGO+EvF2R}-sRRjg#yuzERQ#j1i;sxnrl8d!~-umaV^s^f^2rVdt@+E`JXv5L4V zk@&+=F_!hPLNvsx&;ToeJFfmlxZ<1ODsPS}yBV%#Z(PA1xN1FdrMAS?>4huO4_Bct zuDsT`+FIcXYlExGA6HTkuAUCKVghlMw8NFr7FR=iTmfBi*7v}f-V!Z<4pX`;+C^IPjx10Ce_JA&73+}C@;j;M%j$7v9eb7U~8kCt>c06 zYiwDeI_1xgxeUiko9P%1yDgQGy&ZQSOGVjS}gYg>oXcHp)atMQyFj z!q!Gv>*#@UBDSm#LHQiEHp)ZCP_+e~+v`yC!cm7B#VH+S8*FV9d#6`^Y_XpeGP$Ex|*ng?o9oIFso$SDNnRoL1nd!0fJt`0Ss zPCA2|j`DS zn!(NiQFG2Y3*{@= z+9=PQ9~xZ6(pq`rtXOi!s$ykAU#O|<;(?mRE+Hs;VQZrVxbSrmbBLPuE;`hNxul~U zg)NWlDubJe8of&lsU&NM2t*RAU4nfVo zE+MEXUN_WGla883b<fTV_60RN>w2K(T-{JZjSe+`)YYNJ!ZjV`g4o(9m0edE+$_}ixn`l}q{~A?jbd%B z^l(+IZIozNdz6P^Yoknd^+0(Jwmg?YP+spEg7QJvbd>L7YomO2%|y9~VZPN+*Et>KbIzFst(E5Wl|s0h-0iXTZxDj*xCS~yInz+iGL-ELv)%(+{{}ikIo(js zGL)4ftoOinT!RopIo(jsG?bO1thdJ&?HkHELpc-Me(qU@vVAeeR4rz~^BiULVyH8LprnU0!~*xD&`B9(Nk8&OKSty< zcFMz;EYuVkl7*TJv012j8tbtV>--RpmA1-KY}s-;Y69ZYQR9X!dskNBdXH09*(xWn zwNviKg`j3fdm0Q@_Do3$pjSe;G z!*ryN;^=hLG{x3V=`>o| zU>MH^Tje^+cFL2{A*eY$CImI(u(eZ`kI6($i?Nxgalw``_8EAk*4by+DtE@(XV@tp z$LdgXPp3o88f@*9!@4Zg4AWtRb_{@ z(qXEy!&Yg8En`AZ^K5DeYA#~SdCo-5Uon}e@t>B7nhp{6JFS(G)9rWKDvhzVQ#wx9 zp~fynhnhc8W=s}pYR$|-&C?lKs8MEm>|#3}yKqcV#_^h&j+%$F(owSlTRY{zEM+&Z zWo5Umk~CY{&E7*$<2EM*HJ@gOpr+`YOw`23WTGYmWyaX=!TB@SevhqE1Y52oI@Fw- zt3%BWY`KzTp(Y?M3pIiBvQX14%40A4^4M#uT%PB#m+hpZ#%)eIYC6nMM@`W=%06r5 z`Fv%ct@1OrJQG4t6CV?T8tsA*)L?#4<31@9HCYQXQG@GiKljvrzpc`0q5XaycO7c# zEYhLo`9d9P)QhrEgYlqdJIaRf9I#em7JD49Rot<)Qvw&KqbC27bkw{;nd^q~gSB#S ziSmQ3G6h>ZW$}^_)L1VILCv(KA*i{y6mKN3o@gTz!|_LCqQfG?I76*c_~%*^ z_7yGeHGcB2LTU3imHO1LL(7x-e!d=}BclCwZJxBvujq$=4kkFy z-f(-k&s4v{ZtD*0{H2R!(Vu3fH)^;1MYWBK+{+EJeDTljpQog>nRm;tU+ND5H>_K= z8xw8QtL>Is=ZYK{lu&Se$G(XtW*+w4wa;uLXAZyQS{SSaqWI z-<_&GFXyqO_UE9|MdChHT)QFa)Te~jhx-jY*ro2hA&SMon5b~8xWwq_@HmTMF>!v;IEB*58 z!XYz8oo?T8xov!uRbXWPKRQl5)M|OYn0|vSeZu=C4zP+2PiW*^*V#GHx082FT)1a! ztYeq(xcG>e=;lLdc*e(vNA-(L@=U;=R_>RW5Y90c6TMy0-O%0DJ+|NCdA8z!&d~u@ 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 oY=DvFnwaCEkxEB(GZkAG@-JIRF3v diff --git a/sdk/csharp/generated/examples.json b/sdk/csharp/generated/examples.json index b87e88de..50133935 100644 --- a/sdk/csharp/generated/examples.json +++ b/sdk/csharp/generated/examples.json @@ -6,7 +6,7 @@ ] }, "SecurityOperations_getAuditEvents": { - "usage": "var response = await client.Security.GetAuditEventsAsync(\"2025-05-01T09:11:00Z\", \"2025-05-02T09:11:00Z\", AuditEventKey.UserLogin, \"98765\", \"User\", \"98765\", \"User\", 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", + "usage": "var response = await client.Security.GetAuditEventsAsync(DateTimeOffset.Parse(\"2025-05-01T09:11:00Z\"), DateTimeOffset.Parse(\"2025-05-02T09:11:00Z\"), AuditEventKey.UserLogin, \"98765\", \"User\", \"98765\", \"User\", 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", "output": "GetAuditEventsResponse(Data: List, Meta: PaginationMeta?)", "imports": [ "AuditEventKey" @@ -29,7 +29,7 @@ "usage": "await client.Bots.DeleteWebhookEventAsync(\"01KAJZ2XDSS2S3DSW9EXJZ0TBV\");" }, "ChatOperations_listChats": { - "usage": "var response = await client.Chats.ListChatsAsync(SortOrder.Desc, ChatAvailability.IsMember, \"2025-01-01T00:00:00.000Z\", \"2025-02-01T00:00:00.000Z\", false, 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", + "usage": "var response = await client.Chats.ListChatsAsync(SortOrder.Desc, ChatAvailability.IsMember, DateTimeOffset.Parse(\"2025-01-01T00:00:00.000Z\"), DateTimeOffset.Parse(\"2025-02-01T00:00:00.000Z\"), false, 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", "output": "ListChatsResponse(Data: List, Meta: PaginationMeta?)", "imports": [ "ChatAvailability", @@ -74,7 +74,7 @@ ] }, "ExportOperations_requestExport": { - "usage": "var request = new ExportRequest\n{\n StartAt = \"2025-03-20\",\n EndAt = \"2025-03-20\",\n WebhookUrl = \"https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2\",\n ChatIds = new List { 123 },\n SkipChatsFile = false\n};\nawait client.Common.RequestExportAsync(request);", + "usage": "var request = new ExportRequest\n{\n StartAt = DateOnly.Parse(\"2025-03-20\"),\n EndAt = DateOnly.Parse(\"2025-03-20\"),\n WebhookUrl = \"https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2\",\n ChatIds = new List { 123 },\n SkipChatsFile = false\n};\nawait client.Common.RequestExportAsync(request);", "imports": [ "ExportRequest" ] @@ -243,7 +243,7 @@ "output": "object" }, "ProfileOperations_updateStatus": { - "usage": "var request = new StatusUpdateRequest\n{\n Status = new StatusUpdateRequestStatus\n {\n Emoji = \"🎮\",\n Title = \"Очень занят\",\n ExpiresAt = \"2024-04-08T10:00:00.000Z\",\n IsAway = true,\n AwayMessage = \"Вернусь после 15:00\"\n }\n};\nvar response = await client.Profile.UpdateStatusAsync(request);", + "usage": "var request = new StatusUpdateRequest\n{\n Status = new StatusUpdateRequestStatus\n {\n Emoji = \"🎮\",\n Title = \"Очень занят\",\n ExpiresAt = DateTimeOffset.Parse(\"2024-04-08T10:00:00.000Z\"),\n IsAway = true,\n AwayMessage = \"Вернусь после 15:00\"\n }\n};\nvar response = await client.Profile.UpdateStatusAsync(request);", "output": "UserStatus(Emoji: string, Title: string, ExpiresAt: DateTimeOffset?, IsAway: bool, AwayMessage: UserStatusAwayMessage(Text: string)?)", "imports": [ "StatusUpdateRequest", @@ -254,7 +254,7 @@ "usage": "await client.Profile.DeleteStatusAsync();" }, "SearchOperations_searchChats": { - "usage": "var response = await client.Search.SearchChatsAsync(\"Разработка\", 10, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\", SortOrder.Desc, \"2025-01-01T00:00:00.000Z\", \"2025-02-01T00:00:00.000Z\", true, ChatSubtype.Discussion, false);", + "usage": "var response = await client.Search.SearchChatsAsync(\"Разработка\", 10, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\", SortOrder.Desc, DateTimeOffset.Parse(\"2025-01-01T00:00:00.000Z\"), DateTimeOffset.Parse(\"2025-02-01T00:00:00.000Z\"), true, ChatSubtype.Discussion, false);", "output": "SearchChatsResponse(Data: List, Meta: SearchPaginationMeta)", "imports": [ "ChatSubtype", @@ -262,14 +262,14 @@ ] }, "SearchOperations_searchMessages": { - "usage": "var chatIds = new List { 123 };\nvar userIds = new List { 123 };\nvar response = await client.Search.SearchMessagesAsync(\"футболки\", 10, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\", SortOrder.Desc, \"2025-01-01T00:00:00.000Z\", \"2025-02-01T00:00:00.000Z\", chatIds, userIds, true);", + "usage": "var chatIds = new List { 123 };\nvar userIds = new List { 123 };\nvar response = await client.Search.SearchMessagesAsync(\"футболки\", 10, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\", SortOrder.Desc, DateTimeOffset.Parse(\"2025-01-01T00:00:00.000Z\"), DateTimeOffset.Parse(\"2025-02-01T00:00:00.000Z\"), chatIds, userIds, true);", "output": "SearchMessagesResponse(Data: List, Meta: SearchPaginationMeta)", "imports": [ "SortOrder" ] }, "SearchOperations_searchUsers": { - "usage": "var companyRoles = new List { UserRole.Admin };\nvar response = await client.Search.SearchUsersAsync(\"Олег\", 10, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\", SearchSortOrder.ByScore, SortOrder.Desc, \"2025-01-01T00:00:00.000Z\", \"2025-02-01T00:00:00.000Z\", companyRoles);", + "usage": "var companyRoles = new List { UserRole.Admin };\nvar response = await client.Search.SearchUsersAsync(\"Олег\", 10, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\", SearchSortOrder.ByScore, SortOrder.Desc, DateTimeOffset.Parse(\"2025-01-01T00:00:00.000Z\"), DateTimeOffset.Parse(\"2025-02-01T00:00:00.000Z\"), companyRoles);", "output": "SearchUsersResponse(Data: List, Meta: SearchPaginationMeta)", "imports": [ "SearchSortOrder", @@ -286,7 +286,7 @@ "output": "Task(Id: int, Kind: TaskKind, Content: string, DueAt: DateTimeOffset?, Priority: int, UserId: int, ChatId: int?, Status: TaskStatus, CreatedAt: DateTimeOffset, PerformerIds: List, AllDay: bool, CustomProperties: List)" }, "TaskOperations_createTask": { - "usage": "var request = new TaskCreateRequest\n{\n Task = new TaskCreateRequestTask\n {\n Kind = TaskKind.Reminder,\n Content = \"Забрать со склада 21 заказ\",\n DueAt = \"2020-06-05T12:00:00.000+03:00\",\n Priority = 2,\n PerformerIds = new List { 123 },\n ChatId = 456,\n AllDay = false,\n CustomProperties = new List { new TaskCreateRequestCustomProperty { Id = 78, Value = \"Синий склад\" } }\n }\n};\nvar response = await client.Tasks.CreateTaskAsync(request);", + "usage": "var request = new TaskCreateRequest\n{\n Task = new TaskCreateRequestTask\n {\n Kind = TaskKind.Reminder,\n Content = \"Забрать со склада 21 заказ\",\n DueAt = DateTimeOffset.Parse(\"2020-06-05T12:00:00.000+03:00\"),\n Priority = 2,\n PerformerIds = new List { 123 },\n ChatId = 456,\n AllDay = false,\n CustomProperties = new List { new TaskCreateRequestCustomProperty { Id = 78, Value = \"Синий склад\" } }\n }\n};\nvar response = await client.Tasks.CreateTaskAsync(request);", "output": "Task(Id: int, Kind: TaskKind, Content: string, DueAt: DateTimeOffset?, Priority: int, UserId: int, ChatId: int?, Status: TaskStatus, CreatedAt: DateTimeOffset, PerformerIds: List, AllDay: bool, CustomProperties: List)", "imports": [ "TaskCreateRequest", @@ -296,7 +296,7 @@ ] }, "TaskOperations_updateTask": { - "usage": "var request = new TaskUpdateRequest\n{\n Task = new TaskUpdateRequestTask\n {\n Kind = TaskKind.Reminder,\n Content = \"Забрать со склада 21 заказ\",\n DueAt = \"2020-06-05T12:00:00.000+03:00\",\n Priority = 2,\n PerformerIds = new List { 123 },\n Status = TaskStatus.Done,\n AllDay = false,\n DoneAt = \"2020-06-05T12:00:00.000Z\",\n CustomProperties = new List { new TaskUpdateRequestCustomProperty { Id = 78, Value = \"Синий склад\" } }\n }\n};\nvar response = await client.Tasks.UpdateTaskAsync(22283, request);", + "usage": "var request = new TaskUpdateRequest\n{\n Task = new TaskUpdateRequestTask\n {\n Kind = TaskKind.Reminder,\n Content = \"Забрать со склада 21 заказ\",\n DueAt = DateTimeOffset.Parse(\"2020-06-05T12:00:00.000+03:00\"),\n Priority = 2,\n PerformerIds = new List { 123 },\n Status = TaskStatus.Done,\n AllDay = false,\n DoneAt = DateTimeOffset.Parse(\"2020-06-05T12:00:00.000Z\"),\n CustomProperties = new List { new TaskUpdateRequestCustomProperty { Id = 78, Value = \"Синий склад\" } }\n }\n};\nvar response = await client.Tasks.UpdateTaskAsync(22283, request);", "output": "Task(Id: int, Kind: TaskKind, Content: string, DueAt: DateTimeOffset?, Priority: int, UserId: int, ChatId: int?, Status: TaskStatus, CreatedAt: DateTimeOffset, PerformerIds: List, AllDay: bool, CustomProperties: List)", "imports": [ "TaskKind", @@ -342,7 +342,7 @@ ] }, "UserStatusOperations_updateUserStatus": { - "usage": "var request = new StatusUpdateRequest\n{\n Status = new StatusUpdateRequestStatus\n {\n Emoji = \"🎮\",\n Title = \"Очень занят\",\n ExpiresAt = \"2024-04-08T10:00:00.000Z\",\n IsAway = true,\n AwayMessage = \"Вернусь после 15:00\"\n }\n};\nvar response = await client.Users.UpdateUserStatusAsync(12, request);", + "usage": "var request = new StatusUpdateRequest\n{\n Status = new StatusUpdateRequestStatus\n {\n Emoji = \"🎮\",\n Title = \"Очень занят\",\n ExpiresAt = DateTimeOffset.Parse(\"2024-04-08T10:00:00.000Z\"),\n IsAway = true,\n AwayMessage = \"Вернусь после 15:00\"\n }\n};\nvar response = await client.Users.UpdateUserStatusAsync(12, request);", "output": "UserStatus(Emoji: string, Title: string, ExpiresAt: DateTimeOffset?, IsAway: bool, AwayMessage: UserStatusAwayMessage(Text: string)?)", "imports": [ "StatusUpdateRequest", @@ -356,7 +356,7 @@ "usage": "await client.Users.DeleteUserStatusAsync(12);" }, "FormOperations_openView": { - "usage": "var request = new OpenViewRequest\n{\n Type = \"modal\",\n TriggerId = \"791a056b-006c-49dd-834b-c633fde52fe8\",\n PrivateMetadata = \"{\"timeoff_id\":4378}\",\n CallbackId = \"timeoff_reguest_form\",\n View = new OpenViewRequestView\n {\n Title = \"Уведомление об отпуске\",\n CloseText = \"Закрыть\",\n SubmitText = \"Отправить заявку\",\n Blocks = new List { new ViewBlockHeader { Type = \"header\", Text = \"Основная информация\" } }\n }\n};\nawait client.Views.OpenViewAsync(request);", + "usage": "var request = new OpenViewRequest\n{\n TriggerId = \"791a056b-006c-49dd-834b-c633fde52fe8\",\n PrivateMetadata = \"{\\\"timeoff_id\\\":4378}\",\n CallbackId = \"timeoff_reguest_form\",\n View = new OpenViewRequestView\n {\n Title = \"Уведомление об отпуске\",\n CloseText = \"Закрыть\",\n SubmitText = \"Отправить заявку\",\n Blocks = new List { new ViewBlockHeader { Text = \"Основная информация\" } }\n }\n};\nawait client.Views.OpenViewAsync(request);", "imports": [ "OpenViewRequest", "OpenViewRequestView", diff --git a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfo.cs b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfo.cs index 77c663af..725d2351 100644 --- a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfo.cs +++ b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfo.cs @@ -14,11 +14,11 @@ [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyDescriptionAttribute("Official Pachca API SDK for .NET")] [assembly: System.Reflection.AssemblyFileVersionAttribute("0.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("0.0.0+9afa2fc4504fb25202c414ae42418737b6da4e0f")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("0.0.0+a15ad39036f4480e143b58e9993369b3756f5aa1")] [assembly: System.Reflection.AssemblyProductAttribute("Pachca")] [assembly: System.Reflection.AssemblyTitleAttribute("Pachca")] [assembly: System.Reflection.AssemblyVersionAttribute("0.0.0.0")] [assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/pachca/openapi")] -// Generated by the MSBuild WriteCodeFragment class. +// Создано классом WriteCodeFragment MSBuild. diff --git a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfoInputs.cache b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfoInputs.cache index 9e84d514..92654dd7 100644 --- a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfoInputs.cache +++ b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfoInputs.cache @@ -1 +1 @@ -2c85671f0b10bc23c3ff979e312d97dfd3502ab9620fba499cd27334c0494c28 +b403c306e5305f6eedbdf2651408342cc0d70e5d4b4a80c79ecdbd65bfd3cca5 diff --git a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.GeneratedMSBuildEditorConfig.editorconfig b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.GeneratedMSBuildEditorConfig.editorconfig index 97d70010..fc6679e1 100644 --- a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.GeneratedMSBuildEditorConfig.editorconfig +++ b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.GeneratedMSBuildEditorConfig.editorconfig @@ -1,7 +1,5 @@ is_global = true build_property.TargetFramework = net8.0 -build_property.TargetFrameworkIdentifier = .NETCoreApp -build_property.TargetFrameworkVersion = v8.0 build_property.TargetPlatformMinVersion = build_property.UsingMicrosoftNETSdkWeb = build_property.ProjectTypeGuids = @@ -10,8 +8,6 @@ build_property.PlatformNeutralAssembly = build_property.EnforceExtendedAnalyzerRules = build_property._SupportedPlatformList = Linux,macOS,Windows build_property.RootNamespace = Pachca.Sdk -build_property.ProjectDir = /home/runner/work/openapi/openapi/sdk/csharp/generated/ +build_property.ProjectDir = /Users/andrewlukin/Documents/openapi/sdk/csharp/generated/ build_property.EnableComHosting = build_property.EnableGeneratedComInterfaceComImportInterop = -build_property.EffectiveAnalysisLevelStyle = 8.0 -build_property.EnableCodeStyleSeverity = diff --git a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.assets.cache b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.assets.cache index d6c0700937011912080e93d8b30b93518b43d53c..6d0d11ad787f64072835fbecf3101035ca0b2936 100644 GIT binary patch literal 156 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 Nj+pO%cK?J1egizj?j`^L literal 236032 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 literal 97792 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 NuGet $(MSBuildThisFileDirectory)project.assets.json - /home/runner/.nuget/packages/ - /home/runner/.nuget/packages/ + /Users/andrewlukin/.nuget/packages/ + /Users/andrewlukin/.nuget/packages/ PackageReference - 7.0.0 + 6.8.1 - + \ No newline at end of file diff --git a/sdk/csharp/generated/obj/project.assets.json b/sdk/csharp/generated/obj/project.assets.json index 6e7a2895..7930959b 100644 --- a/sdk/csharp/generated/obj/project.assets.json +++ b/sdk/csharp/generated/obj/project.assets.json @@ -8,19 +8,19 @@ "net8.0": [] }, "packageFolders": { - "/home/runner/.nuget/packages/": {} + "/Users/andrewlukin/.nuget/packages/": {} }, "project": { "version": "0.0.0", "restore": { - "projectUniqueName": "/home/runner/work/openapi/openapi/sdk/csharp/generated/Pachca.csproj", + "projectUniqueName": "/Users/andrewlukin/Documents/openapi/sdk/csharp/generated/Pachca.csproj", "projectName": "Pachca.Sdk", - "projectPath": "/home/runner/work/openapi/openapi/sdk/csharp/generated/Pachca.csproj", - "packagesPath": "/home/runner/.nuget/packages/", - "outputPath": "/home/runner/work/openapi/openapi/sdk/csharp/generated/obj/", + "projectPath": "/Users/andrewlukin/Documents/openapi/sdk/csharp/generated/Pachca.csproj", + "packagesPath": "/Users/andrewlukin/.nuget/packages/", + "outputPath": "/Users/andrewlukin/Documents/openapi/sdk/csharp/generated/obj/", "projectStyle": "PackageReference", "configFilePaths": [ - "/home/runner/.nuget/NuGet/NuGet.Config" + "/Users/andrewlukin/.nuget/NuGet/NuGet.Config" ], "originalTargetFrameworks": [ "net8.0" @@ -38,13 +38,7 @@ "warnAsError": [ "NU1605" ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "10.0.200" + } }, "frameworks": { "net8.0": { @@ -65,7 +59,7 @@ "privateAssets": "all" } }, - "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/10.0.201/PortableRuntimeIdentifierGraph.json" + "runtimeIdentifierGraphPath": "/opt/homebrew/Cellar/dotnet@8/8.0.125/libexec/sdk/8.0.125/PortableRuntimeIdentifierGraph.json" } } } diff --git a/sdk/csharp/generated/obj/project.nuget.cache b/sdk/csharp/generated/obj/project.nuget.cache index c3a217b3..132d7824 100644 --- a/sdk/csharp/generated/obj/project.nuget.cache +++ b/sdk/csharp/generated/obj/project.nuget.cache @@ -1,8 +1,8 @@ { "version": 2, - "dgSpecHash": "L7vmAtClJb4=", + "dgSpecHash": "EsF0dhpSvN5RxBolXraPjyKJhwoYbA4L4PT1mL2LU87aszKSFQpEr6oy9iCdM+ew2Y58XdYssXgeQmK1FI76EQ==", "success": true, - "projectFilePath": "/home/runner/work/openapi/openapi/sdk/csharp/generated/Pachca.csproj", + "projectFilePath": "/Users/andrewlukin/Documents/openapi/sdk/csharp/generated/Pachca.csproj", "expectedPackageFiles": [], "logs": [] } \ No newline at end of file diff --git a/sdk/go/generated/types.go b/sdk/go/generated/types.go index ae446773..f92d4dbe 100644 --- a/sdk/go/generated/types.go +++ b/sdk/go/generated/types.go @@ -1052,6 +1052,16 @@ type ViewBlockTime struct { Hint *string `json:"hint,omitempty"` } +type ViewSubmitWebhookPayload struct { + Type string `json:"type"` // always "view" + Event string `json:"event"` // always "submit" + UserID int32 `json:"user_id"` + Data map[string]string `json:"data"` + WebhookTimestamp int32 `json:"webhook_timestamp"` + CallbackID *string `json:"callback_id"` + PrivateMetadata *string `json:"private_metadata"` +} + type WebhookEvent struct { ID string `json:"id"` EventType string `json:"event_type"` @@ -1288,6 +1298,7 @@ type WebhookPayloadUnion struct { MessageWebhookPayload *MessageWebhookPayload ReactionWebhookPayload *ReactionWebhookPayload ButtonWebhookPayload *ButtonWebhookPayload + ViewSubmitWebhookPayload *ViewSubmitWebhookPayload ChatMemberWebhookPayload *ChatMemberWebhookPayload CompanyMemberWebhookPayload *CompanyMemberWebhookPayload LinkSharedWebhookPayload *LinkSharedWebhookPayload @@ -1310,6 +1321,9 @@ func (u *WebhookPayloadUnion) UnmarshalJSON(data []byte) error { case "button": u.ButtonWebhookPayload = &ButtonWebhookPayload{} return json.Unmarshal(data, u.ButtonWebhookPayload) + case "view": + u.ViewSubmitWebhookPayload = &ViewSubmitWebhookPayload{} + return json.Unmarshal(data, u.ViewSubmitWebhookPayload) case "chat_member": u.ChatMemberWebhookPayload = &ChatMemberWebhookPayload{} return json.Unmarshal(data, u.ChatMemberWebhookPayload) @@ -1331,6 +1345,9 @@ func (u WebhookPayloadUnion) MarshalJSON() ([]byte, error) { if u.ButtonWebhookPayload != nil { return json.Marshal(u.ButtonWebhookPayload) } + if u.ViewSubmitWebhookPayload != nil { + return json.Marshal(u.ViewSubmitWebhookPayload) + } if u.ChatMemberWebhookPayload != nil { return json.Marshal(u.ChatMemberWebhookPayload) } diff --git a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt index 2080b559..2060e1f5 100644 --- a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt +++ b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt @@ -744,6 +744,17 @@ data class ButtonWebhookPayload( @SerialName("webhook_timestamp") val webhookTimestamp: Int, ) : WebhookPayloadUnion +@Serializable +@SerialName("view") +data class ViewSubmitWebhookPayload( + override val type: String = "view", + @SerialName("callback_id") val callbackId: String, + @SerialName("private_metadata") val privateMetadata: String, + @SerialName("user_id") val userId: Int, + val data: Map, + @SerialName("webhook_timestamp") val webhookTimestamp: Int, +) : WebhookPayloadUnion + @Serializable @SerialName("chat_member") data class ChatMemberWebhookPayload( diff --git a/sdk/python/generated/pachca/models.py b/sdk/python/generated/pachca/models.py index d42901ac..48ad7978 100644 --- a/sdk/python/generated/pachca/models.py +++ b/sdk/python/generated/pachca/models.py @@ -1131,6 +1131,17 @@ class ViewBlockTime: hint: str | None = None +@dataclass +class ViewSubmitWebhookPayload: + type: str # literal "view" + event: str # literal "submit" + user_id: int + data: dict[str, str] + webhook_timestamp: int + callback_id: str | None = None + private_metadata: str | None = None + + @dataclass class WebhookEvent: id: str @@ -1157,7 +1168,7 @@ class WebhookMessageThread: ViewBlockUnion = Union[ViewBlockHeader, ViewBlockPlainText, ViewBlockMarkdown, ViewBlockDivider, ViewBlockInput, ViewBlockSelect, ViewBlockRadio, ViewBlockCheckbox, ViewBlockDate, ViewBlockTime, ViewBlockFileInput] -WebhookPayloadUnion = Union[MessageWebhookPayload, ReactionWebhookPayload, ButtonWebhookPayload, ChatMemberWebhookPayload, CompanyMemberWebhookPayload, LinkSharedWebhookPayload] +WebhookPayloadUnion = Union[MessageWebhookPayload, ReactionWebhookPayload, ButtonWebhookPayload, ViewSubmitWebhookPayload, ChatMemberWebhookPayload, CompanyMemberWebhookPayload, LinkSharedWebhookPayload] @dataclass diff --git a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift index 87c3e94a..58848280 100644 --- a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift +++ b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift @@ -2442,6 +2442,36 @@ public struct ViewBlockTime: Codable { } } +public struct ViewSubmitWebhookPayload: Codable { + public let type: String + public let event: String + public let callbackId: String? + public let privateMetadata: String? + public let userId: Int + public let data: [String: String] + public let webhookTimestamp: Int + + public init(type: String, event: String, callbackId: String? = nil, privateMetadata: String? = nil, userId: Int, data: [String: String], webhookTimestamp: Int) { + self.type = type + self.event = event + self.callbackId = callbackId + self.privateMetadata = privateMetadata + self.userId = userId + self.data = data + self.webhookTimestamp = webhookTimestamp + } + + enum CodingKeys: String, CodingKey { + case type + case event + case callbackId = "callback_id" + case privateMetadata = "private_metadata" + case userId = "user_id" + case data + case webhookTimestamp = "webhook_timestamp" + } +} + public struct WebhookEvent: Codable { public let id: String public let eventType: String @@ -2663,6 +2693,7 @@ public enum WebhookPayloadUnion: Codable { case messageWebhookPayload(MessageWebhookPayload) case reactionWebhookPayload(ReactionWebhookPayload) case buttonWebhookPayload(ButtonWebhookPayload) + case viewSubmitWebhookPayload(ViewSubmitWebhookPayload) case chatMemberWebhookPayload(ChatMemberWebhookPayload) case companyMemberWebhookPayload(CompanyMemberWebhookPayload) case linkSharedWebhookPayload(LinkSharedWebhookPayload) @@ -2681,6 +2712,8 @@ public enum WebhookPayloadUnion: Codable { self = .reactionWebhookPayload(try ReactionWebhookPayload(from: decoder)) case "button": self = .buttonWebhookPayload(try ButtonWebhookPayload(from: decoder)) + case "view": + self = .viewSubmitWebhookPayload(try ViewSubmitWebhookPayload(from: decoder)) case "chat_member": self = .chatMemberWebhookPayload(try ChatMemberWebhookPayload(from: decoder)) case "company_member": @@ -2700,6 +2733,8 @@ public enum WebhookPayloadUnion: Codable { try value.encode(to: encoder) case .buttonWebhookPayload(let value): try value.encode(to: encoder) + case .viewSubmitWebhookPayload(let value): + try value.encode(to: encoder) case .chatMemberWebhookPayload(let value): try value.encode(to: encoder) case .companyMemberWebhookPayload(let value): diff --git a/sdk/typescript/src/generated/types.ts b/sdk/typescript/src/generated/types.ts index 0321ea26..46d7c0cc 100644 --- a/sdk/typescript/src/generated/types.ts +++ b/sdk/typescript/src/generated/types.ts @@ -1154,6 +1154,16 @@ export interface ViewBlockTime { hint?: string; } +export interface ViewSubmitWebhookPayload { + type: "view"; + event: "submit"; + callbackId: string | null; + privateMetadata: string | null; + userId: number; + data: Record; + webhookTimestamp: number; +} + export interface WebhookEvent { id: string; eventType: string; @@ -1175,7 +1185,7 @@ export type AuditEventDetailsUnion = AuditDetailsEmpty | AuditDetailsUserUpdated export type ViewBlockUnion = ViewBlockHeader | ViewBlockPlainText | ViewBlockMarkdown | ViewBlockDivider | ViewBlockInput | ViewBlockSelect | ViewBlockRadio | ViewBlockCheckbox | ViewBlockDate | ViewBlockTime | ViewBlockFileInput; -export type WebhookPayloadUnion = MessageWebhookPayload | ReactionWebhookPayload | ButtonWebhookPayload | ChatMemberWebhookPayload | CompanyMemberWebhookPayload | LinkSharedWebhookPayload; +export type WebhookPayloadUnion = MessageWebhookPayload | ReactionWebhookPayload | ButtonWebhookPayload | ViewSubmitWebhookPayload | ChatMemberWebhookPayload | CompanyMemberWebhookPayload | LinkSharedWebhookPayload; export interface GetAuditEventsParams { startTime?: string; diff --git a/sdk/typescript/src/generated/utils.ts b/sdk/typescript/src/generated/utils.ts index e265ad6f..55e4476f 100644 --- a/sdk/typescript/src/generated/utils.ts +++ b/sdk/typescript/src/generated/utils.ts @@ -10,7 +10,7 @@ function camelToSnake(str: string): string { .toLowerCase(); } -const RECORD_KEYS = new Set(["payload", "filters", "link_previews", "linkPreviews"]); +const RECORD_KEYS = new Set(["payload", "filters", "link_previews", "linkPreviews", "data"]); function deserializeRecord(obj: unknown): unknown { if (obj !== null && typeof obj === "object" && !Array.isArray(obj)) { diff --git a/turbo.json b/turbo.json index 2808a2a0..576a69b9 100644 --- a/turbo.json +++ b/turbo.json @@ -34,8 +34,36 @@ "outputs": ["src/commands/*/*.ts", "!src/commands/auth/*.ts", "!src/commands/config/*.ts", "src/data/*.json", "!src/data/changelog.json", "README.md"], "cache": true }, + "overlay:apply": { + "dependsOn": ["@pachca/spec#generate"], + "inputs": ["overlay.en.yaml", "openapi.yaml", "scripts/apply-overlay.ts"], + "outputs": ["openapi.en.yaml"], + "cache": true + }, + "overlay:validate": { + "dependsOn": ["@pachca/spec#generate", "@pachca/spec#overlay:apply"], + "inputs": ["overlay.en.yaml", "openapi.yaml", "scripts/validate-overlay.ts"], + "cache": true + }, + "generate-n8n": { + "dependsOn": ["@pachca/spec#generate", "@pachca/spec#overlay:apply"], + "inputs": [ + "../../packages/spec/openapi.yaml", + "../../packages/spec/openapi.en.yaml", + "../../packages/spec/workflows.ts", + "../../packages/spec/examples.ts", + "../../packages/openapi-parser/src/**", + "../../packages/generator/src/naming.ts", + "../../apps/docs/lib/openapi/mapper.ts", + "../../apps/docs/lib/openapi/example-generator.ts", + "../../apps/docs/scripts/skills/config.ts", + "scripts/**" + ], + "outputs": ["nodes/**/*.ts", "credentials/**/*.ts"], + "cache": true + }, "build": { - "dependsOn": ["^build", "generate", "generate-llms", "generate-cli"], + "dependsOn": ["^build", "generate", "overlay:apply", "generate-llms", "generate-cli", "generate-n8n"], "outputs": [".next/**", "!.next/cache/**", ".build/**", "dist/**", "oclif.manifest.json"], "cache": true }, @@ -58,7 +86,7 @@ "cache": true }, "check": { - "dependsOn": ["lint", "typecheck", "knip", "format:check", "test"], + "dependsOn": ["lint", "typecheck", "knip", "format:check", "test", "@pachca/spec#overlay:validate"], "cache": false }, "check-urls": { @@ -66,7 +94,7 @@ "cache": true }, "test": { - "dependsOn": ["^build", "generate-cli"], + "dependsOn": ["^build", "generate-cli", "generate-n8n"], "inputs": ["src/**", "tests/**"], "cache": true }, From 0c076b663d7ca51d019b6a6b7d4348f5fe665576 Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 00:12:27 +0300 Subject: [PATCH 02/37] chore: update .gitignore for AI tooling files --- .gitignore | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b75ada9c..1baae5e7 100644 --- a/.gitignore +++ b/.gitignore @@ -64,9 +64,11 @@ Thumbs.db # Evals evals/results/ -# Agent-specific local skills (installed via `npx skills add`) -.claude/skills/ +# Agent / AI tooling +.claude/ .cursor/ +.mcp.json +.playwright-mcp/ # C# / .NET bin/ From a194a120c6d2b8ac885f2ec0d995185778b50f6c Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 00:15:37 +0300 Subject: [PATCH 03/37] fix: add overlay step to n8n CI and update .gitignore --- .github/workflows/n8n.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/n8n.yml b/.github/workflows/n8n.yml index 5a122e4d..d3d18384 100644 --- a/.github/workflows/n8n.yml +++ b/.github/workflows/n8n.yml @@ -12,6 +12,8 @@ on: - 'packages/generator/src/naming.ts' - 'apps/docs/lib/openapi/mapper.ts' - 'apps/docs/lib/openapi/example-generator.ts' + - 'packages/spec/overlay.en.yaml' + - 'packages/spec/scripts/**' pull_request: branches: [main] paths: @@ -23,6 +25,8 @@ on: - 'packages/generator/src/naming.ts' - 'apps/docs/lib/openapi/mapper.ts' - 'apps/docs/lib/openapi/example-generator.ts' + - 'packages/spec/overlay.en.yaml' + - 'packages/spec/scripts/**' workflow_dispatch: jobs: @@ -45,6 +49,10 @@ jobs: working-directory: packages/openapi-parser run: bun run build + - name: Apply English overlay + working-directory: packages/spec + run: bun run scripts/apply-overlay.ts + - name: Generate n8n node run: bun run integrations/n8n/scripts/generate-n8n.ts @@ -89,6 +97,10 @@ jobs: working-directory: packages/openapi-parser run: bun run build + - name: Apply English overlay + working-directory: packages/spec + run: bun run scripts/apply-overlay.ts + - name: Generate n8n node run: bun run integrations/n8n/scripts/generate-n8n.ts From 415f079eda51da1473608b229037cf39f8f3bb9f Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 00:20:04 +0300 Subject: [PATCH 04/37] fix: resolve build warnings (Swift codegen, turbo outputs, Next.js root) --- apps/docs/next.config.ts | 3 +++ packages/generator/src/lang/swift.ts | 2 +- .../tests/crud/snapshots/swift/Models.swift | 2 +- .../Pachca/GeneratedSources/Models.swift | 20 +++++++++---------- turbo.json | 2 +- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/apps/docs/next.config.ts b/apps/docs/next.config.ts index 273b0f71..a6ecc0fb 100644 --- a/apps/docs/next.config.ts +++ b/apps/docs/next.config.ts @@ -20,6 +20,9 @@ const nextConfig: NextConfig = { pageExtensions: ['js', 'jsx', 'mdx', 'ts', 'tsx'], // Keep flexsearch as external to avoid Turbopack worker_threads bundling issues serverExternalPackages: ['flexsearch'], + turbopack: { + root: '../../', + }, async headers() { return [ { diff --git a/packages/generator/src/lang/swift.ts b/packages/generator/src/lang/swift.ts index 9e8aebea..d6b8d780 100644 --- a/packages/generator/src/lang/swift.ts +++ b/packages/generator/src/lang/swift.ts @@ -224,7 +224,7 @@ function generateModels(ir: IR): string { for (const rt of ir.responses) { lines.push(`public struct ${rt.name}: Codable {`); lines.push(` public let data: [${rt.dataRef}]`); - if (rt.metaRef) lines.push(` public let meta: ${rt.metaRef}${rt.metaIsRequired ? '' : '?'}${rt.metaIsRequired ? '' : ' = nil'}`); + if (rt.metaRef) lines.push(` public ${rt.metaIsRequired ? 'let' : 'var'} meta: ${rt.metaRef}${rt.metaIsRequired ? '' : '?'}${rt.metaIsRequired ? '' : ' = nil'}`); lines.push('}'); lines.push(''); } diff --git a/packages/generator/tests/crud/snapshots/swift/Models.swift b/packages/generator/tests/crud/snapshots/swift/Models.swift index 5ee09e75..8b2c0bd3 100644 --- a/packages/generator/tests/crud/snapshots/swift/Models.swift +++ b/packages/generator/tests/crud/snapshots/swift/Models.swift @@ -142,7 +142,7 @@ public struct PaginationMeta: Codable { public struct ListChatsResponse: Codable { public let data: [Chat] - public let meta: PaginationMeta? = nil + public var meta: PaginationMeta? = nil } struct ChatDataWrapper: Codable { diff --git a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift index 58848280..198e4f36 100644 --- a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift +++ b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift @@ -2747,17 +2747,17 @@ public enum WebhookPayloadUnion: Codable { public struct GetAuditEventsResponse: Codable { public let data: [AuditEvent] - public let meta: PaginationMeta? = nil + public var meta: PaginationMeta? = nil } public struct ListChatsResponse: Codable { public let data: [Chat] - public let meta: PaginationMeta? = nil + public var meta: PaginationMeta? = nil } public struct ListMembersResponse: Codable { public let data: [User] - public let meta: PaginationMeta? = nil + public var meta: PaginationMeta? = nil } public struct ListPropertiesResponse: Codable { @@ -2766,22 +2766,22 @@ public struct ListPropertiesResponse: Codable { public struct ListTagsResponse: Codable { public let data: [GroupTag] - public let meta: PaginationMeta? = nil + public var meta: PaginationMeta? = nil } public struct GetTagUsersResponse: Codable { public let data: [User] - public let meta: PaginationMeta? = nil + public var meta: PaginationMeta? = nil } public struct ListChatMessagesResponse: Codable { public let data: [Message] - public let meta: PaginationMeta? = nil + public var meta: PaginationMeta? = nil } public struct ListReactionsResponse: Codable { public let data: [Reaction] - public let meta: PaginationMeta? = nil + public var meta: PaginationMeta? = nil } public struct SearchChatsResponse: Codable { @@ -2801,17 +2801,17 @@ public struct SearchUsersResponse: Codable { public struct ListTasksResponse: Codable { public let data: [Task] - public let meta: PaginationMeta? = nil + public var meta: PaginationMeta? = nil } public struct ListUsersResponse: Codable { public let data: [User] - public let meta: PaginationMeta? = nil + public var meta: PaginationMeta? = nil } public struct GetWebhookEventsResponse: Codable { public let data: [WebhookEvent] - public let meta: PaginationMeta? = nil + public var meta: PaginationMeta? = nil } struct BotResponseDataWrapper: Codable { diff --git a/turbo.json b/turbo.json index 576a69b9..7a7f55ef 100644 --- a/turbo.json +++ b/turbo.json @@ -64,7 +64,7 @@ }, "build": { "dependsOn": ["^build", "generate", "overlay:apply", "generate-llms", "generate-cli", "generate-n8n"], - "outputs": [".next/**", "!.next/cache/**", ".build/**", "dist/**", "oclif.manifest.json"], + "outputs": [".next/**", "!.next/cache/**", ".build/**", "dist/**", "oclif.manifest.json", "generated/bin/**", "generated/obj/**"], "cache": true }, "dev": { From 13469c580f34b3e1713c4419b3df1cc700747519 Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 00:24:22 +0300 Subject: [PATCH 05/37] chore: remove unused x-n8n-file-upload extension from spec --- packages/spec/typespec.tsp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/spec/typespec.tsp b/packages/spec/typespec.tsp index d2b73a62..08dcfcfc 100644 --- a/packages/spec/typespec.tsp +++ b/packages/spec/typespec.tsp @@ -3042,11 +3042,6 @@ interface CommonOperations { @route("/uploads") @tag("Common") -@extension("x-n8n-file-upload", #{ - presignEndpoint: "/uploads", - urlField: "direct_url", - keyField: "key", -}) interface UploadOperations { @extension("x-requirements", #{ scope: "uploads:write", From 24074cae7ccbd884096094c5f5a7e4e8107396ed Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 00:32:48 +0300 Subject: [PATCH 06/37] docs: add n8n Node v2 to updates page --- apps/docs/content/updates.mdx | 18 ++++++++++++++++++ apps/docs/public/updates.md | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/apps/docs/content/updates.mdx b/apps/docs/content/updates.mdx index d80c0234..f5fe9313 100644 --- a/apps/docs/content/updates.mdx +++ b/apps/docs/content/updates.mdx @@ -9,6 +9,24 @@ useUpdatesComponent: true Автоматически отслеживайте обновления: подпишитесь на [RSS-ленту](/feed.xml) или используйте [markdown-версию этой страницы](/updates.md) для интеграции с инструментами и AI-агентами. + + +## n8n Node v2 + +Расширение [n8n](/guides/n8n/overview) для Пачки обновлено до версии 2.0.0. Нода автоматически генерируется из OpenAPI-спецификации и всегда синхронизирована с актуальным API. + +Что нового: + +- **18 ресурсов и 60+ операций** — полное покрытие API, включая задачи, поиск, экспорт чатов и журнал безопасности +- **[Pachca Trigger](/guides/n8n/trigger)** — webhook-нода с авторегистрацией вебхука и 16 типами событий +- **Курсорная автопагинация** — Return All / Limit вместо ручного per/page +- **[Simplify](/guides/n8n/resources#simplify)** — переключатель для получения только ключевых полей +- **Формы** — визуальный конструктор, шаблоны и JSON-режим +- **AI Tool Use** — использование узлов как инструментов AI Agent +- **Полная обратная совместимость** — все существующие workflow на v1 продолжают работать без изменений + +Подробнее о [миграции с v1](/guides/n8n/migration) и [устранении ошибок](/guides/n8n/troubleshooting). + ## C# SDK diff --git a/apps/docs/public/updates.md b/apps/docs/public/updates.md index d97ef537..1b7a8210 100644 --- a/apps/docs/public/updates.md +++ b/apps/docs/public/updates.md @@ -4,6 +4,24 @@ > Автоматически отслеживайте обновления: подпишитесь на [RSS-ленту](/feed.xml) или используйте [markdown-версию этой страницы](/updates.md) для интеграции с инструментами и AI-агентами. + + +## n8n Node v2 + +Расширение [n8n](/guides/n8n/overview) для Пачки обновлено до версии 2.0.0. Нода автоматически генерируется из OpenAPI-спецификации и всегда синхронизирована с актуальным API. + +Что нового: + +- **18 ресурсов и 60+ операций** — полное покрытие API, включая задачи, поиск, экспорт чатов и журнал безопасности +- **[Pachca Trigger](/guides/n8n/trigger)** — webhook-нода с авторегистрацией вебхука и 16 типами событий +- **Курсорная автопагинация** — Return All / Limit вместо ручного per/page +- **[Simplify](/guides/n8n/resources#simplify)** — переключатель для получения только ключевых полей +- **Формы** — визуальный конструктор, шаблоны и JSON-режим +- **AI Tool Use** — использование узлов как инструментов AI Agent +- **Полная обратная совместимость** — все существующие workflow на v1 продолжают работать без изменений + +Подробнее о [миграции с v1](/guides/n8n/migration) и [устранении ошибок](/guides/n8n/troubleshooting). + ## C# SDK From 67380bb6e6fa8864fe71b88778ede81f4135934a Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 00:33:24 +0300 Subject: [PATCH 07/37] fix: remove forms from n8n v2 updates (existed in v1) --- apps/docs/content/updates.mdx | 1 - apps/docs/public/updates.md | 1 - 2 files changed, 2 deletions(-) diff --git a/apps/docs/content/updates.mdx b/apps/docs/content/updates.mdx index f5fe9313..63ae4c45 100644 --- a/apps/docs/content/updates.mdx +++ b/apps/docs/content/updates.mdx @@ -21,7 +21,6 @@ useUpdatesComponent: true - **[Pachca Trigger](/guides/n8n/trigger)** — webhook-нода с авторегистрацией вебхука и 16 типами событий - **Курсорная автопагинация** — Return All / Limit вместо ручного per/page - **[Simplify](/guides/n8n/resources#simplify)** — переключатель для получения только ключевых полей -- **Формы** — визуальный конструктор, шаблоны и JSON-режим - **AI Tool Use** — использование узлов как инструментов AI Agent - **Полная обратная совместимость** — все существующие workflow на v1 продолжают работать без изменений diff --git a/apps/docs/public/updates.md b/apps/docs/public/updates.md index 1b7a8210..ed23195c 100644 --- a/apps/docs/public/updates.md +++ b/apps/docs/public/updates.md @@ -16,7 +16,6 @@ - **[Pachca Trigger](/guides/n8n/trigger)** — webhook-нода с авторегистрацией вебхука и 16 типами событий - **Курсорная автопагинация** — Return All / Limit вместо ручного per/page - **[Simplify](/guides/n8n/resources#simplify)** — переключатель для получения только ключевых полей -- **Формы** — визуальный конструктор, шаблоны и JSON-режим - **AI Tool Use** — использование узлов как инструментов AI Agent - **Полная обратная совместимость** — все существующие workflow на v1 продолжают работать без изменений From 7f2290d40641085c5478f3ee65c48a587810e37f Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 00:34:02 +0300 Subject: [PATCH 08/37] docs: clean up n8n v2 update entry --- apps/docs/content/updates.mdx | 6 +----- apps/docs/public/updates.md | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/apps/docs/content/updates.mdx b/apps/docs/content/updates.mdx index 63ae4c45..7ea59dc4 100644 --- a/apps/docs/content/updates.mdx +++ b/apps/docs/content/updates.mdx @@ -15,16 +15,12 @@ useUpdatesComponent: true Расширение [n8n](/guides/n8n/overview) для Пачки обновлено до версии 2.0.0. Нода автоматически генерируется из OpenAPI-спецификации и всегда синхронизирована с актуальным API. -Что нового: - - **18 ресурсов и 60+ операций** — полное покрытие API, включая задачи, поиск, экспорт чатов и журнал безопасности - **[Pachca Trigger](/guides/n8n/trigger)** — webhook-нода с авторегистрацией вебхука и 16 типами событий - **Курсорная автопагинация** — Return All / Limit вместо ручного per/page - **[Simplify](/guides/n8n/resources#simplify)** — переключатель для получения только ключевых полей - **AI Tool Use** — использование узлов как инструментов AI Agent -- **Полная обратная совместимость** — все существующие workflow на v1 продолжают работать без изменений - -Подробнее о [миграции с v1](/guides/n8n/migration) и [устранении ошибок](/guides/n8n/troubleshooting). +- **Полная [обратная совместимость](/guides/n8n/migration)** — все существующие workflow на v1 продолжают работать без изменений diff --git a/apps/docs/public/updates.md b/apps/docs/public/updates.md index ed23195c..dd7e20dc 100644 --- a/apps/docs/public/updates.md +++ b/apps/docs/public/updates.md @@ -10,16 +10,12 @@ Расширение [n8n](/guides/n8n/overview) для Пачки обновлено до версии 2.0.0. Нода автоматически генерируется из OpenAPI-спецификации и всегда синхронизирована с актуальным API. -Что нового: - - **18 ресурсов и 60+ операций** — полное покрытие API, включая задачи, поиск, экспорт чатов и журнал безопасности - **[Pachca Trigger](/guides/n8n/trigger)** — webhook-нода с авторегистрацией вебхука и 16 типами событий - **Курсорная автопагинация** — Return All / Limit вместо ручного per/page - **[Simplify](/guides/n8n/resources#simplify)** — переключатель для получения только ключевых полей - **AI Tool Use** — использование узлов как инструментов AI Agent -- **Полная обратная совместимость** — все существующие workflow на v1 продолжают работать без изменений - -Подробнее о [миграции с v1](/guides/n8n/migration) и [устранении ошибок](/guides/n8n/troubleshooting). +- **Полная [обратная совместимость](/guides/n8n/migration)** — все существующие workflow на v1 продолжают работать без изменений From 4f3a68f8bbcbbbea08f7bc3056b80eccd4f49067 Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 00:34:51 +0300 Subject: [PATCH 09/37] chore: update n8n v2.0.0 release date to 2026-04-03 --- integrations/n8n/CHANGELOG.md | 2 +- integrations/n8n/changelog.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/n8n/CHANGELOG.md b/integrations/n8n/CHANGELOG.md index 094e501c..7737dc5b 100644 --- a/integrations/n8n/CHANGELOG.md +++ b/integrations/n8n/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 2.0.0 (2026-04-01) +## 2.0.0 (2026-04-03) ### New diff --git a/integrations/n8n/changelog.json b/integrations/n8n/changelog.json index 995e2390..cf3b23f4 100644 --- a/integrations/n8n/changelog.json +++ b/integrations/n8n/changelog.json @@ -1,7 +1,7 @@ [ { "version": "2.0.0", - "date": "2026-03-29", + "date": "2026-04-03", "changes": [ { "type": "+", "scope": "all", "description": "Auto-generated from OpenAPI with full v1 backward compatibility" }, { "type": "+", "scope": "resource", "description": "New: Member, Read Member, Link Preview, Search, Security" }, From e62e71b5adecf42a762f0a57c50847efe4c4e556 Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 00:43:10 +0300 Subject: [PATCH 10/37] feat: add GitHub Release with tgz to n8n CI --- .github/workflows/n8n.yml | 16 +++++++++++++++- integrations/n8n/README.md | 4 ++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/n8n.yml b/.github/workflows/n8n.yml index d3d18384..aeff6a2c 100644 --- a/.github/workflows/n8n.yml +++ b/.github/workflows/n8n.yml @@ -80,7 +80,7 @@ jobs: group: publish-n8n cancel-in-progress: false permissions: - contents: read + contents: write id-token: write steps: - uses: actions/checkout@v4 @@ -145,3 +145,17 @@ jobs: env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: npm publish --access public --provenance + + - name: Create GitHub Release + if: steps.version.outputs.published == 'no' + working-directory: integrations/n8n + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + npm pack + mv n8n-nodes-pachca-*.tgz n8n-nodes-pachca.tgz + gh release create "n8n-v${{ steps.version.outputs.version }}" \ + n8n-nodes-pachca.tgz \ + --title "n8n-nodes-pachca v${{ steps.version.outputs.version }}" \ + --notes "See [CHANGELOG](integrations/n8n/CHANGELOG.md) for details." \ + --latest diff --git a/integrations/n8n/README.md b/integrations/n8n/README.md index a35c4a62..9dca09a8 100644 --- a/integrations/n8n/README.md +++ b/integrations/n8n/README.md @@ -21,8 +21,8 @@ npm install n8n-nodes-pachca Or install from archive: ```bash -wget https://github.com/pachca/openapi/releases/latest/download/n8n-nodes-pachca.tar.gz -tar -xzf n8n-nodes-pachca.tar.gz -C ~/.n8n/nodes/ +wget https://github.com/pachca/openapi/releases/latest/download/n8n-nodes-pachca.tgz +tar -xzf n8n-nodes-pachca.tgz -C ~/.n8n/nodes/ # Restart n8n ``` From ec8c406dec5baa611d8e922722399a2796124da6 Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 00:51:37 +0300 Subject: [PATCH 11/37] =?UTF-8?q?docs:=20update=20root=20README=20?= =?UTF-8?q?=E2=80=94=20add=20n8n=20section,=20CI=20table,=20structure,=20r?= =?UTF-8?q?emove=20scenarios.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index e0fc08b5..4eb0f004 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,19 @@ npx skills add pachca/openapi Скиллы генерируются автоматически из OpenAPI-спеки при `bun turbo build`. Устанавливайте только из официального репозитория — скиллы содержат исключительно инструкции (нет исполняемого кода). +## n8n + +Community node для [n8n](https://n8n.io/) — 18 ресурсов, 60+ операций, Pachca Trigger с авторегистрацией вебхука. + +```bash +# В n8n: Settings > Community Nodes > n8n-nodes-pachca +npm install n8n-nodes-pachca +``` + +Автоматически генерируется из OpenAPI-спецификации, полная обратная совместимость с v1. + +**Документация**: [dev.pachca.com/guides/n8n](https://dev.pachca.com/guides/n8n/overview) · **[README](integrations/n8n/README.md)** + ## SDK | Язык | Пакет | Реестр | @@ -149,7 +162,6 @@ npx @pachca/generator --output ./generated --lang typescript,python,go,kotlin,sw | [`/llms.txt`](https://dev.pachca.com/llms.txt) | Краткий индекс: все endpoint'ы со ссылками | | [`/llms-full.txt`](https://dev.pachca.com/llms-full.txt) | Полная документация: гайды + endpoint'ы с параметрами | | [`/skill.md`](https://dev.pachca.com/skill.md) | AI-agent skill: workflows, capabilities, ссылки | -| [`/scenarios.json`](https://dev.pachca.com/scenarios.json) | Машиночитаемые сценарии для no-code платформ (n8n, Albato) | | `/{section}/{action}.md` | Отдельный .md для каждого endpoint'а и гайда | [Context7](https://context7.com/pachca/openapi) — AI-native document discovery. @@ -173,6 +185,7 @@ bun turbo generate # TypeSpec → openapi.yaml + SDK |----------|---------|------------| | `check.yml` | PR в `main` | `bun turbo check` | | `sdk.yml` | Push в `main` | Генерация SDK → коммит → теги → публикация | +| `n8n.yml` | Push/PR в `main` | Генерация n8n node → тест → npm publish → GitHub Release | | `deploy.yml` | Push в `main` | Docker build → GitLab registry → SSH deploy | | `gitlab.yml` | Push в `main` | Зеркало в GitLab | @@ -203,8 +216,10 @@ bun turbo generate # TypeSpec → openapi.yaml + SDK │ ├── kotlin/ # JitPack │ ├── swift/ # SPM │ └── csharp/ # NuGet +├── integrations/ +│ └── n8n/ # n8n community node (генерируется из OpenAPI) ├── skills/ # Agent Skills (генерируются → apps/docs/public/.well-known/skills/) -├── .github/workflows/ # CI/CD (check, sdk, deploy, gitlab) +├── .github/workflows/ # CI/CD (check, sdk, n8n, deploy, gitlab) ├── Package.swift # Корневой Swift Package (копируется из sdk/swift при CI) ├── jitpack.yml # JitPack конфиг для Kotlin (JDK 17) ├── Dockerfile # Multi-stage Docker-сборка docs @@ -231,7 +246,6 @@ apps/docs sdk/* (6 языков) Сайт + llms.txt + llms-full.txt + skill.md + per-endpoint .md + Agent Skills (skills/, AGENTS.md, .well-known/) - + scenarios.json (n8n, no-code) + CLI examples (10-й код-генератор) + pachca.postman_collection.json + OG-изображения + sitemap + RSS @@ -240,8 +254,7 @@ workflows.ts (packages/spec — единый источник сценариев │ ├──→ Web (страница сценариев с поиском) ├──→ CLI (pachca guide) - ├──→ Skills (CLI-сценарии в SKILL.md) - └──→ scenarios.json (no-code: n8n, Albato) + └──→ Skills (CLI-сценарии в SKILL.md) ``` ## Turborepo пайплайн @@ -381,6 +394,6 @@ Badge «Новое» показывается < 7 дней. Попадает в ### Безопасность (next.config.ts) -HSTS (2 года, preload), X-Frame-Options: DENY, nosniff, Permissions-Policy. CORS разрешён для `llms.txt`, `llms-full.txt`, `skill.md`, `*.md`, `/.well-known/skills/*`, `openapi.yaml`, `pachca.postman_collection.json`, `scenarios.json`. +HSTS (2 года, preload), X-Frame-Options: DENY, nosniff, Permissions-Policy. CORS разрешён для `llms.txt`, `llms-full.txt`, `skill.md`, `*.md`, `/.well-known/skills/*`, `openapi.yaml`, `pachca.postman_collection.json`. From 2a7659f938114e92ae7fa3e15fa329b691b354ff Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 01:08:04 +0300 Subject: [PATCH 12/37] docs: add n8n badge and mention to README header --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4eb0f004..8b64534b 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,11 @@ [![npm](https://img.shields.io/npm/v/@pachca/sdk)](https://www.npmjs.com/package/@pachca/sdk) [![npm](https://img.shields.io/npm/v/@pachca/cli)](https://www.npmjs.com/package/@pachca/cli) [![npm](https://img.shields.io/npm/v/@pachca/generator)](https://www.npmjs.com/package/@pachca/generator) +[![npm](https://img.shields.io/npm/v/n8n-nodes-pachca)](https://www.npmjs.com/package/n8n-nodes-pachca) [![PyPI](https://img.shields.io/pypi/v/pachca-sdk)](https://pypi.org/project/pachca-sdk/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) -Unified Developer Experience Platform для [Pachca API](https://dev.pachca.com) — API корпоративного мессенджера Пачка. Один источник (TypeSpec + workflows.ts) генерирует артефакты для всех каналов: web docs, CLI, SDK, agent skills, LLM context. +Unified Developer Experience Platform для [Pachca API](https://dev.pachca.com) — API корпоративного мессенджера Пачка. Один источник (TypeSpec + workflows.ts) генерирует артефакты для всех каналов: web docs, CLI, SDK, n8n node, agent skills, LLM context. **Документация**: https://dev.pachca.com · **OpenAPI**: https://dev.pachca.com/openapi.yaml · **Авторизация**: https://dev.pachca.com/guides/authorization · **Changelog**: https://dev.pachca.com/guides/updates · **Postman/Bruno**: https://dev.pachca.com/pachca.postman_collection.json From 821e88c2f348f1ef96f2ef7481af7a985b2c1dc7 Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 22:19:22 +0300 Subject: [PATCH 13/37] =?UTF-8?q?feat(n8n):=20v2=20audit=20fixes=20?= =?UTF-8?q?=E2=80=94=20retry=20bug,=20webhook=20trigger,=20error=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix do-while + continue retry bug in makeApiRequestAllPages (inner for-loop) - Add PachcaTrigger node with webhook signature verification, IP allowlist, replay protection - Add credentials fields: signingSecret, webhookAllowedIps, botId - Add resolveBotId for automatic bot detection via token/info API - Add sanitizeBaseUrl with protocol validation - Add 25 error-path tests covering retries, pagination, validation errors - Improve generator: better field descriptions, display names, Content-Type handling - Various V2 description fixes across all resources --- apps/docs/public/llms-full.txt | 13 + integrations/n8n/CHANGELOG.md | 2 +- .../n8n/credentials/PachcaApi.credentials.ts | 9 + .../n8n/nodes/Pachca/GenericFunctions.ts | 316 +++++++++--- .../n8n/nodes/Pachca/PachcaTrigger.node.ts | 51 +- integrations/n8n/nodes/Pachca/SharedRouter.ts | 58 ++- .../n8n/nodes/Pachca/V2/ChatDescription.ts | 2 +- .../Pachca/V2/CustomPropertyDescription.ts | 1 + .../n8n/nodes/Pachca/V2/ExportDescription.ts | 8 - .../n8n/nodes/Pachca/V2/FileDescription.ts | 8 +- .../nodes/Pachca/V2/LinkPreviewDescription.ts | 4 +- .../n8n/nodes/Pachca/V2/MemberDescription.ts | 2 +- .../n8n/nodes/Pachca/V2/MessageDescription.ts | 1 + .../n8n/nodes/Pachca/V2/PachcaV2.node.ts | 105 +--- .../nodes/Pachca/V2/ReactionDescription.ts | 1 + .../n8n/nodes/Pachca/V2/TaskDescription.ts | 14 +- integrations/n8n/scripts/generate-n8n.ts | 318 +++++++----- integrations/n8n/tests/error-paths.test.ts | 475 ++++++++++++++++++ 18 files changed, 1047 insertions(+), 341 deletions(-) create mode 100644 integrations/n8n/tests/error-paths.test.ts diff --git a/apps/docs/public/llms-full.txt b/apps/docs/public/llms-full.txt index 8351b4cd..0c77636b 100644 --- a/apps/docs/public/llms-full.txt +++ b/apps/docs/public/llms-full.txt @@ -7084,6 +7084,19 @@ Albato — платформа для интеграции различных с > Автоматически отслеживайте обновления: подпишитесь на [RSS-ленту](/feed.xml) или используйте [markdown-версию этой страницы](/updates.md) для интеграции с инструментами и AI-агентами. + + +## n8n Node v2 + +Расширение [n8n](/guides/n8n/overview) для Пачки обновлено до версии 2.0.0. Нода автоматически генерируется из OpenAPI-спецификации и всегда синхронизирована с актуальным API. + +- **18 ресурсов и 60+ операций** — полное покрытие API, включая задачи, поиск, экспорт чатов и журнал безопасности +- **[Pachca Trigger](/guides/n8n/trigger)** — webhook-нода с авторегистрацией вебхука и 16 типами событий +- **Курсорная автопагинация** — Return All / Limit вместо ручного per/page +- **[Simplify](/guides/n8n/resources#simplify)** — переключатель для получения только ключевых полей +- **AI Tool Use** — использование узлов как инструментов AI Agent +- **Полная [обратная совместимость](/guides/n8n/migration)** — все существующие workflow на v1 продолжают работать без изменений + ## C# SDK diff --git a/integrations/n8n/CHANGELOG.md b/integrations/n8n/CHANGELOG.md index 7737dc5b..324d86f0 100644 --- a/integrations/n8n/CHANGELOG.md +++ b/integrations/n8n/CHANGELOG.md @@ -5,7 +5,7 @@ ### New - **Auto-generated from OpenAPI** with full v1 backward compatibility -- **New resources:** Member, Read Member, Link Preview, Search, Security +- **New resources:** Member, Read Member, Link Preview, Chat Export, Search, Security - **Task resource** now supports full CRUD (was create-only) - **Auto-pagination** with Return All / Limit (cursor-based) - **AI Tool Use** support (`usableAsTool: true`) diff --git a/integrations/n8n/credentials/PachcaApi.credentials.ts b/integrations/n8n/credentials/PachcaApi.credentials.ts index dd2ca2f9..76bbbfe3 100644 --- a/integrations/n8n/credentials/PachcaApi.credentials.ts +++ b/integrations/n8n/credentials/PachcaApi.credentials.ts @@ -43,6 +43,15 @@ export class PachcaApi implements ICredentialType { description: 'Used to verify incoming webhook requests from Pachca. Found in bot settings under the Webhook section.', hint: 'Only required when using the Pachca Trigger node', }, + { + displayName: 'Webhook Allowed IPs', + name: 'webhookAllowedIps', + type: 'string', + default: '', + description: 'Comma-separated list of IP addresses allowed to send webhooks. Pachca sends from 37.200.70.177. Leave empty to allow all.', + placeholder: '37.200.70.177', + hint: 'Only used with the Pachca Trigger node', + }, ]; authenticate: IAuthenticateGeneric = { diff --git a/integrations/n8n/nodes/Pachca/GenericFunctions.ts b/integrations/n8n/nodes/Pachca/GenericFunctions.ts index 332619de..fa90a919 100644 --- a/integrations/n8n/nodes/Pachca/GenericFunctions.ts +++ b/integrations/n8n/nodes/Pachca/GenericFunctions.ts @@ -5,7 +5,10 @@ import type { IHookFunctions, IHttpRequestMethods, IHttpRequestOptions, + ILoadOptionsFunctions, INodeExecutionData, + INodeListSearchResult, + INodePropertyOptions, IN8nHttpFullResponse, JsonObject, } from 'n8n-workflow'; @@ -213,8 +216,8 @@ export function verifyWebhookSignature( const expected = hmac.digest('hex'); try { return crypto.timingSafeEqual( - Buffer.from(signature), - Buffer.from(expected), + Buffer.from(signature, 'hex'), + Buffer.from(expected, 'hex'), ); } catch { return false; @@ -225,27 +228,35 @@ export function verifyWebhookSignature( // S3 FILE UPLOAD UTILITIES // ============================================================================ +/** MIME type lookup table (module-level to avoid re-creation per call) */ +const MIME_TYPES: Record = { + pdf: 'application/pdf', + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + png: 'image/png', + gif: 'image/gif', + webp: 'image/webp', + heic: 'image/heic', + avif: 'image/avif', + svg: 'image/svg+xml', + doc: 'application/msword', + docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + xls: 'application/vnd.ms-excel', + xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + zip: 'application/zip', + mp4: 'video/mp4', + mov: 'video/quicktime', + mp3: 'audio/mpeg', + ogg: 'audio/ogg', + txt: 'text/plain', + csv: 'text/csv', + json: 'application/json', +}; + /** Detect MIME type from file extension */ export function detectMimeType(filename: string): string { const ext = filename.split('.').pop()?.toLowerCase() ?? ''; - const MIME_TYPES: Record = { - pdf: 'application/pdf', - jpg: 'image/jpeg', - jpeg: 'image/jpeg', - png: 'image/png', - gif: 'image/gif', - webp: 'image/webp', - doc: 'application/msword', - docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - xls: 'application/vnd.ms-excel', - xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - zip: 'application/zip', - mp4: 'video/mp4', - mp3: 'audio/mpeg', - txt: 'text/plain', - csv: 'text/csv', - json: 'application/json', - }; return MIME_TYPES[ext] ?? 'application/octet-stream'; } @@ -261,6 +272,8 @@ export function buildMultipartBody( ): { body: Buffer; contentType: string } { const boundary = `----WebKitFormBoundary${crypto.randomBytes(16).toString('hex')}`; const parts: Buffer[] = []; + // Sanitize filename: strip CRLF and quotes to prevent header injection + const safeName = fileName.replace(/[\r\n\\"]/g, '_'); // Policy fields first (order matters for S3) for (const [key, value] of Object.entries(fields)) { @@ -274,7 +287,7 @@ export function buildMultipartBody( // File last parts.push( Buffer.from( - `--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${fileName}"\r\nContent-Type: ${contentType}\r\n\r\n`, + `--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${safeName}"\r\nContent-Type: ${contentType}\r\n\r\n`, ), ); parts.push(fileBuffer); @@ -293,6 +306,7 @@ export function buildMultipartBody( /** * Resolve bot ID: use explicit credential value, or auto-detect via /oauth/token/info. * Returns the bot's user_id if the token belongs to a bot, or 0 if it's a personal token. + * Throws on network/auth errors so callers can distinguish "not a bot" from "failed to check". */ export async function resolveBotId( context: IHookFunctions, @@ -301,24 +315,29 @@ export async function resolveBotId( if (credentials.botId && Number(credentials.botId) > 0) { return Number(credentials.botId); } - try { - const response = (await context.helpers.httpRequestWithAuthentication.call( - context, - 'pachcaApi', - { - method: 'GET', - url: `${credentials.baseUrl}/oauth/token/info`, - }, - )) as IDataObject; - const data = response.data as IDataObject | undefined; - // Bot tokens have name: null, personal tokens have a user-defined name - if (data && data.name === null && data.user_id) { - return Number(data.user_id); - } - return 0; - } catch { - return 0; + const response = (await context.helpers.httpRequestWithAuthentication.call( + context, + 'pachcaApi', + { + method: 'GET', + url: `${credentials.baseUrl}/oauth/token/info`, + }, + )) as IDataObject; + const data = response.data as IDataObject | undefined; + // Bot tokens have name: null, personal tokens have a user-defined name + if (data && data.name === null && data.user_id) { + return Number(data.user_id); + } + return 0; +} + +/** Sanitize baseUrl: strip trailing slashes, validate protocol */ +export function sanitizeBaseUrl(url: string): string { + const trimmed = url.replace(/\/+$/, ''); + if (!/^https?:\/\//.test(trimmed)) { + throw new Error(`Invalid Base URL: must start with http:// or https://. Got: ${trimmed}`); } + return trimmed; } // ============================================================================ @@ -338,21 +357,34 @@ export async function makeApiRequest( itemIndex?: number, ): Promise { const credentials = await this.getCredentials('pachcaApi'); + const baseUrl = sanitizeBaseUrl(credentials.baseUrl as string); + const headers: Record = { Accept: 'application/json' }; + if (method !== 'GET' && method !== 'DELETE') { + headers['Content-Type'] = 'application/json'; + } const options: IHttpRequestOptions = { method, - url: `${credentials.baseUrl}${endpoint}`, - headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + url: `${baseUrl}${endpoint}`, + headers, qs, - body, + body: (method !== 'GET' && method !== 'DELETE') ? body : undefined, returnFullResponse: true, + ignoreHttpStatusErrors: true, }; const response = (await this.helpers.httpRequestWithAuthentication.call( this, 'pachcaApi', options, )) as IN8nHttpFullResponse; + // Handle empty/null body (e.g. 204 No Content) + if (!response.body || typeof response.body !== 'object') { + if (response.statusCode >= 200 && response.statusCode < 300) { + return { success: true } as unknown as IDataObject; + } + } + if (response.statusCode >= 400) { - const resBody = response.body as IDataObject; + const resBody = (response.body ?? {}) as IDataObject; const errors = resBody.errors as Array<{ key: string; value: string }> | undefined; let message: string; @@ -368,12 +400,18 @@ export async function makeApiRequest( const hint = STATUS_HINTS[response.statusCode]; const description = hint ? `${hint}\n${message}` : message; - throw new NodeApiError(this.getNode(), resBody as JsonObject, { + const apiError = new NodeApiError(this.getNode(), resBody as JsonObject, { message, httpCode: String(response.statusCode), description, itemIndex, }); + // Attach Retry-After for pagination retry logic + const headers = response.headers as Record | undefined; + if (headers?.['retry-after']) { + (apiError as NodeApiError & { retryAfter?: number }).retryAfter = parseInt(headers['retry-after'], 10) || 2; + } + throw apiError; } return response.body as IDataObject; @@ -412,6 +450,17 @@ export async function makeApiRequestAllPages( const items = (response.data as IDataObject[]) ?? []; return items.map(item => ({ json: item })); } + + // V1-specific: collection pagination params already in qs (via optionalQueryMap + v1Collection). + // Original V1 used single-page manual pagination for these endpoints. + const hasV1CollectionPagination = ('per' in qs || 'page' in qs || + (qs.cursor !== undefined && qs.cursor !== '') || + (qs.limit !== undefined && qs.limit !== '')); + if (hasV1CollectionPagination) { + const response = await makeApiRequest.call(this, method, endpoint, undefined, qs, itemIndex); + const items = (response.data as IDataObject[]) ?? []; + return items.map(item => ({ json: item })); + } } // Check returnAll / getAllUsersNoLimit (v1 alias) @@ -424,35 +473,51 @@ export async function makeApiRequestAllPages( const limit = returnAll ? 0 : ((this.getNodeParameter('limit', itemIndex, 50) as number) || 50); const results: IDataObject[] = []; let cursor: string | undefined; - let retryCount = 0; + let previousCursor: string | undefined; + let totalRetries = 0; const MAX_RETRIES = 5; + const MAX_PAGES = 1000; + let pageCount = 0; do { const pageQs: IDataObject = { ...qs, limit: 50 }; if (cursor) pageQs.cursor = cursor; + // Inner retry loop: avoids `continue` on the outer do-while, which + // would re-evaluate `while(cursor && ...)` and exit prematurely when + // cursor is undefined (e.g. 429 on the very first page). let response: IDataObject; - try { - response = await makeApiRequest.call(this, method, endpoint, undefined, pageQs, itemIndex); - retryCount = 0; - } catch (error: unknown) { - const err = error as { httpCode?: string; response?: { headers?: Record } }; - if (err.httpCode === '429' && retryCount < MAX_RETRIES) { - retryCount++; - const retryAfter = parseInt(err.response?.headers?.['retry-after'] ?? '1', 10); - // eslint-disable-next-line @n8n/community-nodes/no-restricted-globals - await new Promise(r => setTimeout(r, retryAfter * 1000)); - continue; + for (;;) { + try { + response = await makeApiRequest.call(this, method, endpoint, undefined, pageQs, itemIndex); + break; + } catch (error: unknown) { + const err = error instanceof NodeApiError ? error : null; + const code = err?.httpCode; + if ((code === '429' || code === '502' || code === '503') && totalRetries < MAX_RETRIES) { + totalRetries++; + const retryAfter = (err as NodeApiError & { retryAfter?: number })?.retryAfter; + const waitSec = retryAfter ?? (code === '429' ? 2 : 1); + // eslint-disable-next-line @n8n/community-nodes/no-restricted-globals + await new Promise(r => setTimeout(r, waitSec * 1000)); + continue; + } + throw error; } - throw error; } const items = (response.data as IDataObject[]) ?? []; results.push(...items); const meta = response.meta as IDataObject | undefined; const paginate = meta?.paginate as IDataObject | undefined; - cursor = (paginate?.next_page as string) ?? undefined; - } while (cursor && (returnAll || results.length < limit)); + const nextCursor = (paginate?.next_page as string) ?? undefined; + + // Guard against infinite loops: duplicate cursor or too many pages + if (nextCursor && nextCursor === previousCursor) break; + previousCursor = cursor; + cursor = nextCursor; + pageCount++; + } while (cursor && (returnAll || results.length < limit) && pageCount < MAX_PAGES); const finalResults = returnAll ? results : results.slice(0, limit); @@ -726,6 +791,7 @@ export async function uploadFileToS3( let fileBuffer: Buffer; let resolvedFileName: string; + let binaryMimeType: string | undefined; if (fileSource === 'url') { const fileUrl = ctx.getNodeParameter('fileUrl', itemIndex, '') as string; fileBuffer = (await ctx.helpers.httpRequest({ @@ -733,15 +799,19 @@ export async function uploadFileToS3( url: fileUrl, encoding: 'arraybuffer', })) as Buffer; - resolvedFileName = userFileName || fileUrl.split('/').pop()?.split('?')[0] || 'file'; + const rawName = fileUrl.split('/').pop()?.split('?')[0]?.split('#')[0] || 'file'; + resolvedFileName = userFileName || decodeURIComponent(rawName); } else { const binaryProperty = ctx.getNodeParameter('binaryProperty', itemIndex, 'data') as string; const binaryData = ctx.helpers.assertBinaryData(itemIndex, binaryProperty); fileBuffer = await ctx.helpers.getBinaryDataBuffer(itemIndex, binaryProperty); resolvedFileName = userFileName || binaryData.fileName || 'file'; + binaryMimeType = binaryData.mimeType; } - const contentType = userContentType || detectMimeType(resolvedFileName); + // Treat 'application/octet-stream' as unset (V1 default) — fall through to auto-detection + const effectiveUserType = (userContentType && userContentType !== 'application/octet-stream') ? userContentType : ''; + const contentType = effectiveUserType || binaryMimeType || detectMimeType(resolvedFileName); // Step 2: Upload to S3 with retry const MAX_RETRIES = 3; @@ -755,7 +825,7 @@ export async function uploadFileToS3( 'x-amz-algorithm': String(presigned['x-amz-algorithm']), 'x-amz-date': String(presigned['x-amz-date']), 'x-amz-signature': String(presigned['x-amz-signature']), - key: String(presigned.key).replace('${filename}', resolvedFileName), + key: String(presigned.key).replace('${filename}', () => resolvedFileName), }; const multipart = buildMultipartBody(s3Fields, fileBuffer, resolvedFileName, contentType); @@ -777,7 +847,7 @@ export async function uploadFileToS3( } } - const fileKey = String(presigned.key).replace('${filename}', resolvedFileName); + const fileKey = String(presigned.key).replace('${filename}', () => resolvedFileName); return { key: fileKey, file_name: resolvedFileName, @@ -810,3 +880,125 @@ export function splitAndValidateCommaList( } return arr; } + +// ============================================================================ +// SHARED LIST-SEARCH & LOAD-OPTIONS METHODS (used by V2 node) +// ============================================================================ + +/** Format user name for display in resource locator dropdowns */ +export function formatUserName(u: { first_name: string; last_name: string; nickname: string }): string { + const fullName = [u.first_name, u.last_name] + .filter((v) => v != null && v !== '' && v !== 'null') + .join(' '); + const display = fullName || u.nickname || 'User'; + return u.nickname ? `${display} (@${u.nickname})` : display; +} + +/** + * Search chats with cursor-based pagination. + * When filtering — uses search endpoint (returns all matches). + * When listing — fetches multiple pages up to 200 results. + */ +export async function searchChats( + this: ILoadOptionsFunctions, + filter?: string, + paginationToken?: unknown, +): Promise { + const credentials = await this.getCredentials('pachcaApi'); + + if (filter) { + const url = `${credentials.baseUrl}/search/chats?query=${encodeURIComponent(filter)}`; + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { + method: 'GET', + url, + }); + const items = response.data ?? []; + return { + results: items.map((c: { id: number; name: string }) => ({ + name: c.name, + value: c.id, + })), + }; + } + + // No filter — paginated listing + const cursor = paginationToken as string | undefined; + const qs = cursor ? `per=50&cursor=${cursor}` : 'per=50'; + const url = `${credentials.baseUrl}/chats?${qs}`; + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { + method: 'GET', + url, + }); + const items = response.data ?? []; + const nextCursor = response.meta?.paginate?.next_page as string | undefined; + return { + results: items.map((c: { id: number; name: string }) => ({ + name: c.name, + value: c.id, + })), + paginationToken: nextCursor, + }; +} + +/** Search users by name/nickname */ +export async function searchUsers( + this: ILoadOptionsFunctions, + filter?: string, +): Promise { + const credentials = await this.getCredentials('pachcaApi'); + if (!filter) return { results: [] }; + const url = `${credentials.baseUrl}/search/users?query=${encodeURIComponent(filter)}`; + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { + method: 'GET', + url, + }); + const items = response.data ?? []; + return { + results: items.map((u: { id: number; first_name: string; last_name: string; nickname: string }) => ({ + name: formatUserName(u), + value: u.id, + })), + }; +} + +/** Search entities — dispatches to chats or users based on entityType parameter */ +export async function searchEntities( + this: ILoadOptionsFunctions, + filter?: string, + paginationToken?: unknown, +): Promise { + let entityType = 'discussion'; + try { + entityType = (this.getNodeParameter('entityType') as string) || 'discussion'; + } catch { + try { + entityType = (this.getCurrentNodeParameter('entityType') as string) || 'discussion'; + } catch { /* parameter may not exist yet */ } + } + + if (entityType === 'user') { + return searchUsers.call(this, filter); + } + if (entityType === 'thread') { + return { results: [] }; + } + return searchChats.call(this, filter, paginationToken); +} + +/** Load custom properties for the current resource (User or Task) */ +export async function getCustomProperties( + this: ILoadOptionsFunctions, +): Promise { + const credentials = await this.getCredentials('pachcaApi'); + const resource = this.getNodeParameter('resource') as string; + const entityType = resource === 'task' ? 'Task' : 'User'; + const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { + method: 'GET', + url: `${credentials.baseUrl}/custom_properties?entity_type=${entityType}`, + }); + const items = response.data ?? []; + return items.map((p: { id: number; name: string }) => ({ + name: p.name, + value: p.id, + })); +} diff --git a/integrations/n8n/nodes/Pachca/PachcaTrigger.node.ts b/integrations/n8n/nodes/Pachca/PachcaTrigger.node.ts index 7d8157c3..a467ee2f 100644 --- a/integrations/n8n/nodes/Pachca/PachcaTrigger.node.ts +++ b/integrations/n8n/nodes/Pachca/PachcaTrigger.node.ts @@ -48,6 +48,7 @@ export class PachcaTrigger implements INodeType { httpMethod: 'POST', responseMode: 'onReceived', path: 'webhook', + rawBody: true, }, ], properties: [ @@ -86,7 +87,12 @@ export class PachcaTrigger implements INodeType { default: { async checkExists(this: IHookFunctions): Promise { const credentials = await this.getCredentials('pachcaApi'); - const botId = await resolveBotId(this, credentials); + let botId: number; + try { + botId = await resolveBotId(this, credentials); + } catch { + return false; // Network error → treat as not exists, will trigger create + } if (!botId) return false; const webhookUrl = this.getNodeWebhookUrl('default'); try { @@ -109,7 +115,10 @@ export class PachcaTrigger implements INodeType { async create(this: IHookFunctions): Promise { const credentials = await this.getCredentials('pachcaApi'); const botId = await resolveBotId(this, credentials); - if (!botId) return true; // Not a bot token → manual mode + if (!botId) { + this.logger.warn('Pachca Trigger: token is not a bot token. Webhook was NOT registered automatically. Configure webhook URL manually in Pachca bot settings.'); + return true; + } const webhookUrl = this.getNodeWebhookUrl('default'); await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { method: 'PUT', @@ -121,7 +130,12 @@ export class PachcaTrigger implements INodeType { async delete(this: IHookFunctions): Promise { const credentials = await this.getCredentials('pachcaApi'); - const botId = await resolveBotId(this, credentials); + let botId: number; + try { + botId = await resolveBotId(this, credentials); + } catch { + return true; // Can't resolve bot → nothing to clean up + } if (!botId) return true; try { await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { @@ -143,11 +157,23 @@ export class PachcaTrigger implements INodeType { const credentials = await this.getCredentials('pachcaApi'); const event = this.getNodeParameter('event') as string; + // IP allowlist check + const allowedIps = ((credentials.webhookAllowedIps as string) || '').split(',').map(s => s.trim()).filter(Boolean); + if (allowedIps.length > 0) { + const request = this.getRequestObject(); + const clientIp = (request.headers['x-forwarded-for'] as string)?.split(',')[0]?.trim() || request.socket?.remoteAddress || ''; + const normalizedIp = clientIp.replace(/^::ffff:/, ''); + if (!allowedIps.includes(normalizedIp)) { + return { webhookResponse: 'Forbidden' }; + } + } + // Signing secret verification (use raw body bytes for accurate HMAC) - if (credentials.signingSecret) { - const signature = headerData['x-pachca-signature'] as string; + const signingSecret = ((credentials.signingSecret as string) || '').trim(); + if (signingSecret) { + const signature = headerData['pachca-signature'] as string; if (!signature) { - return { webhookResponse: 'Missing signature' }; + return { webhookResponse: 'Rejected' }; } const request = this.getRequestObject(); const rawBody = request.rawBody @@ -157,10 +183,19 @@ export class PachcaTrigger implements INodeType { !verifyWebhookSignature( rawBody, signature, - credentials.signingSecret as string, + signingSecret, ) ) { - return { webhookResponse: 'Invalid signature' }; + return { webhookResponse: 'Rejected' }; + } + } + + // Replay protection — reject events older than 5 minutes + const webhookTs = body.webhook_timestamp as number | undefined; + if (webhookTs) { + const ageMs = Date.now() - webhookTs * 1000; + if (Math.abs(ageMs) > 5 * 60 * 1000) { + return { webhookResponse: 'Rejected' }; } } diff --git a/integrations/n8n/nodes/Pachca/SharedRouter.ts b/integrations/n8n/nodes/Pachca/SharedRouter.ts index 79b7984f..54d1d18c 100644 --- a/integrations/n8n/nodes/Pachca/SharedRouter.ts +++ b/integrations/n8n/nodes/Pachca/SharedRouter.ts @@ -15,6 +15,7 @@ import { splitAndValidateCommaList, simplifyItem, FORM_TEMPLATES, + sanitizeBaseUrl, } from './GenericFunctions'; // ============================================================================ @@ -41,6 +42,7 @@ interface QueryMap { api: string; n8n: string; locator?: boolean; + required?: boolean; } interface RouteConfig { @@ -168,13 +170,14 @@ const ROUTES: Record> = { pathParams: [{ api: 'chatId', n8n: 'chatId' }], paginated: true, v1Collection: 'chatMembersOptions', - optionalQueryMap: [{ api: 'role', n8n: 'role' }], + optionalQueryMap: [{ api: 'role', n8n: 'role' }, { api: 'limit', n8n: 'limit' }, { api: 'cursor', n8n: 'cursor' }], }, addUsers: { method: 'POST' as IHttpRequestMethods, path: '/chats/{chatId}/members', pathParams: [{ api: 'chatId', n8n: 'chatId' }], - bodyMap: [{ api: 'member_ids', n8n: 'memberIds', isArray: true, arrayType: 'int' }, { api: 'silent', n8n: 'silent' }], + bodyMap: [{ api: 'member_ids', n8n: 'memberIds', isArray: true, arrayType: 'int' }], + optionalBodyMap: [{ api: 'silent', n8n: 'silent' }], }, removeUser: { method: 'DELETE' as IHttpRequestMethods, @@ -252,9 +255,6 @@ const ROUTES: Record> = { bodyMap: [ { api: 'name', n8n: 'groupTagName' }, ], - optionalBodyMap: [ - { api: 'color', n8n: 'groupTagColor' }, - ], }, getAll: { method: 'GET' as IHttpRequestMethods, @@ -275,9 +275,6 @@ const ROUTES: Record> = { bodyMap: [ { api: 'name', n8n: 'groupTagName' }, ], - optionalBodyMap: [ - { api: 'color', n8n: 'groupTagColor' }, - ], }, delete: { method: 'DELETE' as IHttpRequestMethods, @@ -327,7 +324,7 @@ const ROUTES: Record> = { method: 'GET' as IHttpRequestMethods, path: '/messages', paginated: true, - queryMap: [{ api: 'chat_id', n8n: 'chatId', locator: true }], + queryMap: [{ api: 'chat_id', n8n: 'chatId', locator: true, required: true }], }, get: { method: 'GET' as IHttpRequestMethods, @@ -368,6 +365,7 @@ const ROUTES: Record> = { pathParams: [{ api: 'messageId', n8n: 'messageId' }], paginated: true, v1Collection: 'readMembersOptions', + optionalQueryMap: [{ api: 'per', n8n: 'readMembersPer' }, { api: 'page', n8n: 'readMembersPage' }], }, unfurl: { method: 'POST' as IHttpRequestMethods, @@ -403,7 +401,7 @@ const ROUTES: Record> = { method: 'DELETE' as IHttpRequestMethods, path: '/messages/{id}/reactions', pathParams: [{ api: 'id', n8n: 'reactionsMessageId' }], - queryMap: [{ api: 'code', n8n: 'reactionsReactionCode' }, { api: 'name', n8n: 'name' }], + queryMap: [{ api: 'code', n8n: 'reactionsReactionCode', required: true }, { api: 'name', n8n: 'name' }], }, getAll: { method: 'GET' as IHttpRequestMethods, @@ -411,6 +409,7 @@ const ROUTES: Record> = { pathParams: [{ api: 'id', n8n: 'reactionsMessageId' }], paginated: true, v1Collection: 'reactionsOptions', + optionalQueryMap: [{ api: 'limit', n8n: 'reactionsPer' }, { api: 'cursor', n8n: 'reactionsCursor' }], }, }, readMember: { @@ -675,13 +674,14 @@ const ROUTES: Record> = { path: '/chats/exports/{id}', pathParams: [{ api: 'id', n8n: 'id' }], noDataWrapper: true, + special: 'exportDownload', }, }, customProperty: { get: { method: 'GET' as IHttpRequestMethods, path: '/custom_properties', - queryMap: [{ api: 'entity_type', n8n: 'entityType' }], + queryMap: [{ api: 'entity_type', n8n: 'entityType', required: true }], }, }, file: { @@ -758,7 +758,26 @@ async function executeRoute( json: { name: key, blocks } as unknown as IDataObject, })); } - + if (route.special === 'exportDownload') { + const exportId = this.getNodeParameter('id', i) as number; + const credentials = await this.getCredentials('pachcaApi'); + const base = sanitizeBaseUrl(credentials.baseUrl as string); + const resp = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { + method: 'GET', + url: `${base}/chats/exports/${exportId}`, + ignoreHttpStatusErrors: true, + returnFullResponse: true, + disableFollowRedirect: true, + }) as { statusCode: number; headers: Record; body: unknown }; + const location = resp.headers?.location; + if (location) { + return [{ json: { id: exportId, url: location } as unknown as IDataObject }]; + } + if (typeof resp.body === 'object' && resp.body) { + return [{ json: resp.body as IDataObject }]; + } + return [{ json: { id: exportId, success: true } as unknown as IDataObject }]; + } // === Build URL with path params === let url = route.path; for (const pp of route.pathParams ?? []) { @@ -776,6 +795,9 @@ async function executeRoute( } } } + if (value === undefined || value === null || value === '') { + throw new Error(`Missing required path parameter: ${pp.n8n}`); + } url = url.replace(`{${pp.api}}`, String(value)); } @@ -834,7 +856,9 @@ async function executeRoute( val = this.getNodeParameter(qm.n8n, i); } if (val !== undefined && val !== null && val !== '') qs[qm.api] = val as IDataObject; - } catch { /* param not shown / not filled */ } + } catch (e) { + if (qm.required) throw e; // Required query param must be present + } } // Read query params from collection, with top-level fallback (same pattern as optionalBodyMap) @@ -949,7 +973,15 @@ async function executeRoute( return [{ json: { success: true } }]; } + // Handle 204 No Content for non-DELETE methods (archive, unarchive, pin, addMembers, etc.) + if (!response || (typeof response === 'object' && Object.keys(response).length === 0)) { + return [{ json: { success: true } }]; + } + if (route.noDataWrapper) { + if (!response || (typeof response === 'object' && Object.keys(response).length === 0)) { + return [{ json: { success: true } as unknown as IDataObject }]; + } return [{ json: response }]; } diff --git a/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts b/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts index 53b313d1..791e00ad 100644 --- a/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts @@ -127,7 +127,7 @@ export const chatFields: INodeProperties[] = [ type: 'options', options: [{ name: 'Is Member', value: 'is_member', description: 'Chats where the user is a member' }, { name: 'Public', value: 'public', description: 'All public chats in the workspace, regardless of user membership' }], - default: "", + default: "is_member", description: 'Parameter that controls chat availability and filtering for the user', displayOptions: { show: { resource: ['chat'], operation: ['getAll'] } }, routing: { send: { type: 'query', property: 'availability' } }, diff --git a/integrations/n8n/nodes/Pachca/V2/CustomPropertyDescription.ts b/integrations/n8n/nodes/Pachca/V2/CustomPropertyDescription.ts index 05970015..345fba18 100644 --- a/integrations/n8n/nodes/Pachca/V2/CustomPropertyDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/CustomPropertyDescription.ts @@ -31,6 +31,7 @@ export const customPropertyFields: INodeProperties[] = [ displayName: 'Entity Type', name: 'entityType', type: 'options', + required: true, options: [{ name: 'Task', value: 'Task' }, { name: 'User', value: 'User' }], default: "", diff --git a/integrations/n8n/nodes/Pachca/V2/ExportDescription.ts b/integrations/n8n/nodes/Pachca/V2/ExportDescription.ts index 5379c29c..9b03c96f 100644 --- a/integrations/n8n/nodes/Pachca/V2/ExportDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/ExportDescription.ts @@ -107,12 +107,4 @@ export const exportFields: INodeProperties[] = [ default: '', displayOptions: { show: { resource: ['export'], operation: ['get'] } }, }, - { - displayName: 'Simplify', - name: 'simplify', - type: 'boolean', - default: true, - description: 'Whether to return a simplified version of the response instead of all fields', - displayOptions: { show: { resource: ['export'], operation: ['get'] } }, - }, ]; \ No newline at end of file diff --git a/integrations/n8n/nodes/Pachca/V2/FileDescription.ts b/integrations/n8n/nodes/Pachca/V2/FileDescription.ts index fcf318ff..ab01269a 100644 --- a/integrations/n8n/nodes/Pachca/V2/FileDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/FileDescription.ts @@ -29,7 +29,7 @@ export const fileFields: INodeProperties[] = [ ], default: 'binary', description: 'Where to get the file to upload', - displayOptions: { show: { resource: ['file'], operation: ['create', 'upload'] } }, + displayOptions: { show: { resource: ['file'], operation: ['create'] } }, }, { displayName: 'File URL', @@ -38,7 +38,7 @@ export const fileFields: INodeProperties[] = [ required: true, default: '', description: 'URL of the file to upload', - displayOptions: { show: { resource: ['file'], operation: ['create', 'upload'], fileSource: ['url'] } }, + displayOptions: { show: { resource: ['file'], operation: ['create'], fileSource: ['url'] } }, }, { displayName: 'Input Binary Field', @@ -47,7 +47,7 @@ export const fileFields: INodeProperties[] = [ required: true, default: 'data', hint: 'The name of the input binary field containing the file to be uploaded', - displayOptions: { show: { resource: ['file'], operation: ['create', 'upload'], fileSource: ['binary'] } }, + displayOptions: { show: { resource: ['file'], operation: ['create'], fileSource: ['binary'] } }, }, { displayName: 'Additional Fields', @@ -55,7 +55,7 @@ export const fileFields: INodeProperties[] = [ type: 'collection', placeholder: 'Add Field', default: {}, - displayOptions: { show: { resource: ['file'], operation: ['create', 'upload'] } }, + displayOptions: { show: { resource: ['file'], operation: ['create'] } }, options: [ { displayName: 'Content Type', diff --git a/integrations/n8n/nodes/Pachca/V2/LinkPreviewDescription.ts b/integrations/n8n/nodes/Pachca/V2/LinkPreviewDescription.ts index 63a1af17..7ee3d1d7 100644 --- a/integrations/n8n/nodes/Pachca/V2/LinkPreviewDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/LinkPreviewDescription.ts @@ -31,9 +31,9 @@ export const linkPreviewFields: INodeProperties[] = [ { displayName: 'Link Previews', name: 'linkPreviews', - type: 'string', + type: 'json', required: true, - default: "", + default: {}, description: 'JSON map of link previews, where each key is a `URL` received in the outgoing webhook about a new message', displayOptions: { show: { resource: ['linkPreview'], operation: ['create'] } }, routing: { send: { type: 'body', property: 'link_previews' } }, diff --git a/integrations/n8n/nodes/Pachca/V2/MemberDescription.ts b/integrations/n8n/nodes/Pachca/V2/MemberDescription.ts index 6f65b6b5..ae784f97 100644 --- a/integrations/n8n/nodes/Pachca/V2/MemberDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/MemberDescription.ts @@ -225,7 +225,7 @@ export const memberFields: INodeProperties[] = [ { name: 'Editor', value: 'editor' }, { name: 'Member', value: 'member', description: 'Member/subscriber' }, { name: 'Owner', value: 'owner' }], - default: "", + default: "all", description: 'Role in the chat', displayOptions: { show: { resource: ['member'], operation: ['getAll'] } }, routing: { send: { type: 'query', property: 'role' } }, diff --git a/integrations/n8n/nodes/Pachca/V2/MessageDescription.ts b/integrations/n8n/nodes/Pachca/V2/MessageDescription.ts index daa58d20..ee5deb5a 100644 --- a/integrations/n8n/nodes/Pachca/V2/MessageDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/MessageDescription.ts @@ -312,6 +312,7 @@ export const messageFields: INodeProperties[] = [ displayName: 'Chat ID', name: 'chatId', type: 'resourceLocator', + required: true, default: { mode: 'list', value: '' }, description: 'Chat ID (conversation, channel, direct message, or thread chat)', modes: [ diff --git a/integrations/n8n/nodes/Pachca/V2/PachcaV2.node.ts b/integrations/n8n/nodes/Pachca/V2/PachcaV2.node.ts index 0ec0aae8..f3dbb3a1 100644 --- a/integrations/n8n/nodes/Pachca/V2/PachcaV2.node.ts +++ b/integrations/n8n/nodes/Pachca/V2/PachcaV2.node.ts @@ -4,19 +4,10 @@ import type { INodeTypeDescription, IExecuteFunctions, INodeExecutionData, - ILoadOptionsFunctions, - INodeListSearchResult, - INodePropertyOptions, } from 'n8n-workflow'; import { NodeConnectionTypes } from 'n8n-workflow'; import { router } from '../SharedRouter'; -function formatUserName(u: { first_name: string; last_name: string; nickname: string }): string { - const fullName = [u.first_name, u.last_name] - .filter((v) => v != null && v !== '' && v !== 'null') - .join(' '); - const display = fullName || u.nickname || 'User'; - return u.nickname ? `${display} (@${u.nickname})` : display; -} +import { searchChats, searchUsers, searchEntities, getCustomProperties } from '../GenericFunctions'; import { securityOperations, securityFields } from './SecurityDescription'; import { botOperations, botFields } from './BotDescription'; @@ -122,97 +113,7 @@ export class PachcaV2 implements INodeType { } methods = { - listSearch: { - async searchChats(this: ILoadOptionsFunctions, filter?: string): Promise { - const credentials = await this.getCredentials('pachcaApi'); - const url = filter - ? `${credentials.baseUrl}/search/chats?query=${encodeURIComponent(filter)}` - : `${credentials.baseUrl}/chats?per=50`; - const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { - method: 'GET', - url, - }); - const items = response.data ?? []; - return { - results: items.map((c: { id: number; name: string }) => ({ - name: c.name, - value: c.id, - })), - }; - }, - async searchUsers(this: ILoadOptionsFunctions, filter?: string): Promise { - const credentials = await this.getCredentials('pachcaApi'); - if (!filter) return { results: [] }; - const url = `${credentials.baseUrl}/search/users?query=${encodeURIComponent(filter)}`; - const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { - method: 'GET', - url, - }); - const items = response.data ?? []; - return { - results: items.map((u: { id: number; first_name: string; last_name: string; nickname: string }) => ({ - name: formatUserName(u), - value: u.id, - })), - }; - }, - async searchEntities(this: ILoadOptionsFunctions, filter?: string): Promise { - let entityType = 'discussion'; - try { - entityType = (this.getNodeParameter('entityType') as string) || 'discussion'; - } catch { - try { - entityType = (this.getCurrentNodeParameter('entityType') as string) || 'discussion'; - } catch { /* parameter may not exist yet */ } - } - const credentials = await this.getCredentials('pachcaApi'); - if (entityType === 'user') { - if (!filter) return { results: [] }; - const url = `${credentials.baseUrl}/search/users?query=${encodeURIComponent(filter)}`; - const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { method: 'GET', url }); - const items = response.data ?? []; - return { - results: items.map((u: { id: number; first_name: string; last_name: string; nickname: string }) => ({ - name: formatUserName(u), - value: u.id, - })), - }; - } - if (entityType === 'thread') { - return { results: [] }; - } - const url = filter - ? `${credentials.baseUrl}/search/chats?query=${encodeURIComponent(filter)}` - : `${credentials.baseUrl}/chats?per=50`; - const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { method: 'GET', url }); - const items = response.data ?? []; - return { - results: items.map((c: { id: number; name: string }) => ({ - name: c.name, - value: c.id, - })), - }; - }, - }, - loadOptions: { - async getCustomProperties(this: ILoadOptionsFunctions): Promise { - const credentials = await this.getCredentials('pachcaApi'); - const resource = this.getNodeParameter('resource') as string; - const entityType = resource === 'task' ? 'Task' : 'User'; - try { - const response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { - method: 'GET', - url: `${credentials.baseUrl}/custom_properties?entity_type=${entityType}`, - }); - const items = response.data ?? []; - return items.map((p: { id: number; name: string }) => ({ - name: p.name, - value: p.id, - })); - } catch { - return []; - } - }, - }, + listSearch: { searchChats, searchUsers, searchEntities }, + loadOptions: { getCustomProperties }, }; } diff --git a/integrations/n8n/nodes/Pachca/V2/ReactionDescription.ts b/integrations/n8n/nodes/Pachca/V2/ReactionDescription.ts index 32dac435..b6b3cae3 100644 --- a/integrations/n8n/nodes/Pachca/V2/ReactionDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/ReactionDescription.ts @@ -81,6 +81,7 @@ export const reactionFields: INodeProperties[] = [ displayName: 'Code', name: 'reactionsReactionCode', type: 'string', + required: true, default: "", description: 'Emoji character of the reaction', placeholder: '👍', diff --git a/integrations/n8n/nodes/Pachca/V2/TaskDescription.ts b/integrations/n8n/nodes/Pachca/V2/TaskDescription.ts index 1e35a83a..c27fb141 100644 --- a/integrations/n8n/nodes/Pachca/V2/TaskDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/TaskDescription.ts @@ -138,8 +138,12 @@ export const taskFields: INodeProperties[] = [ { displayName: 'Priority', name: 'taskPriority', - type: 'number', - default: 1, + type: 'options', + options: [{ name: 'None', value: 0 }, +{ name: '1 — Normal', value: 1 }, +{ name: '2 — Important', value: 2 }, +{ name: '3 — Very Important', value: 3 }], + default: 0, description: 'Priority: 1, 2 (important), or 3 (very important)', placeholder: '2', routing: { send: { type: 'body', property: 'priority' } }, @@ -294,7 +298,11 @@ export const taskFields: INodeProperties[] = [ { displayName: 'Priority', name: 'priority', - type: 'number', + type: 'options', + options: [{ name: 'None', value: 0 }, +{ name: '1 — Normal', value: 1 }, +{ name: '2 — Important', value: 2 }, +{ name: '3 — Very Important', value: 3 }], default: 0, description: 'Priority: 1, 2 (important), or 3 (very important)', placeholder: '2', diff --git a/integrations/n8n/scripts/generate-n8n.ts b/integrations/n8n/scripts/generate-n8n.ts index 0eb7aa7a..6128a4e8 100644 --- a/integrations/n8n/scripts/generate-n8n.ts +++ b/integrations/n8n/scripts/generate-n8n.ts @@ -74,8 +74,8 @@ const V1_COMPAT_PARAMS: Record>> = }, groupTag: { '*': { id: 'groupTagId' }, - create: { name: 'groupTagName', color: 'groupTagColor' }, - update: { name: 'groupTagName', color: 'groupTagColor' }, + create: { name: 'groupTagName' }, + update: { name: 'groupTagName' }, addTags: { chatId: 'groupTagChatId', groupTagIds: 'groupTagIds' }, removeTag: { chatId: 'groupTagChatId', tagId: 'tagId' }, getUsers: { id: 'groupTagId' }, @@ -127,7 +127,26 @@ const V1_COMPAT_SUBCOLLECTIONS: Record = { /** v1 alias operations: optional query params (not from OpenAPI) */ const V1_ALIAS_QUERY_PARAMS: Record> = { chat: { - getMembers: [['role', 'role']], + getMembers: [['role', 'role'], ['limit', 'limit'], ['cursor', 'cursor']], + }, + message: { + getReadMembers: [['per', 'readMembersPer'], ['page', 'readMembersPage']], + }, + reactions: { + getReactions: [['limit', 'reactionsPer'], ['cursor', 'reactionsCursor']], + }, +}; + +/** v1 compat: pagination fields from V1 collections → API query params (for primary ops, not aliases) */ +const V1_COMPAT_PAGINATION: Record> = { + chat: { + getMembers: [['limit', 'limit'], ['cursor', 'cursor']], + }, + message: { + getReadMembers: [['per', 'readMembersPer'], ['page', 'readMembersPage']], + }, + reaction: { + getAll: [['limit', 'reactionsPer'], ['cursor', 'reactionsCursor']], }, }; @@ -138,12 +157,8 @@ const V1_ALIAS_SPECIALS: Record> = { }, }; -/** Extra body fields for v2 operations not in OpenAPI (v1 compat, e.g. groupTag color) */ +/** Extra body fields for v2 operations not in OpenAPI (v1 compat) */ const V1_EXTRA_BODY_FIELDS: Record> = { - groupTag: { - create: [['color', 'groupTagColor']], - update: [['color', 'groupTagColor']], - }, }; /** Resources only visible in v2 (new, not in v1) */ @@ -245,7 +260,7 @@ const V1_ALIAS_FIELDS: Record 0) return 'options'; if (field.format === 'date-time') return 'dateTime'; if (field.type === 'boolean') return 'boolean'; if (field.type === 'integer' || field.type === 'number') return 'number'; - if (field.type === 'array' && field.items?.properties) return 'fixedCollection'; + if (field.type === 'array' && resolveArrayItems(field)?.properties) return 'fixedCollection'; // Array of primitives → comma-separated string (transformed via splitCommaToArray) - if (field.type === 'array' && !field.items?.properties) return 'string'; - if (field.type === 'object' && field.properties) return 'json'; + if (field.type === 'array' && !resolveArrayItems(field)?.properties) return 'string'; + if (field.type === 'object') return 'json'; return 'string'; } @@ -677,12 +698,13 @@ function queryParamN8nType(schema: Schema): string { /** Check if a field is an array of primitives (needs splitCommaToArray preSend) */ function isPrimitiveArray(field: BodyField): boolean { - return field.type === 'array' && !field.items?.properties; + return field.type === 'array' && !resolveArrayItems(field)?.properties; } /** Get the item type for primitive arrays */ function getArrayItemType(field: BodyField): 'int' | 'string' { - const itemType = field.items ? getSchemaType(field.items) : 'string'; + const resolved = resolveArrayItems(field); + const itemType = resolved ? getSchemaType(resolved) : 'string'; return (itemType === 'integer' || itemType === 'number') ? 'int' : 'string'; } @@ -894,8 +916,8 @@ function generateResourceDescription( } - // Simplify toggle for GET operations (v2 only) - if (op.endpoint.method === 'GET') { + // Simplify toggle for GET operations (v2 only, skip for noDataWrapper resources like export) + if (op.endpoint.method === 'GET' && resource !== 'export') { lines.push(`\t{`); lines.push(`\t\tdisplayName: 'Simplify',`); lines.push(`\t\tname: 'simplify',`); @@ -988,6 +1010,7 @@ function generateResourceDescription( lines.push(`\t\tdisplayName: ${quote(formatDisplayName(param.name))},`); lines.push(`\t\tname: ${quote(paramName)},`); lines.push(`\t\ttype: 'resourceLocator',`); + if (param.required) lines.push(`\t\trequired: true,`); lines.push(`\t\tdefault: { mode: 'list', value: '' },`); if (queryDesc && queryDesc.toLowerCase() !== formatDisplayName(param.name).toLowerCase()) lines.push(`\t\tdescription: ${quote(sanitizeDescription(queryDesc))},`); lines.push(`\t\tmodes: [`); @@ -1465,17 +1488,23 @@ function generateFieldProperty( return lines.join('\n'); } + // Check for field type overrides (e.g. priority → options instead of number) + const fieldOverride = FIELD_OPTIONS_OVERRIDES[field.name]; + lines.push(`${tab}{`); lines.push(`${tab}\tdisplayName: ${quote(displayName)},`); lines.push(`${tab}\tname: ${quote(paramName)},`); - lines.push(`${tab}\ttype: ${quote(n8nType)},`); + lines.push(`${tab}\ttype: ${quote(fieldOverride ? 'options' : n8nType)},`); if (isRequired) { lines.push(`${tab}\trequired: true,`); } // Type-specific options - if (n8nType === 'options' && field.enum) { + if (fieldOverride) { + const optStr = fieldOverride.options.map(o => `{ name: ${quote(o.name)}, value: ${JSON.stringify(o.value)} }`).join(',\n'); + lines.push(`${tab}\toptions: [${optStr}],`); + } else if (n8nType === 'options' && field.enum) { const enumDescs = getEnumDescriptions(field.name, op.endpoint.id); lines.push(`${tab}\toptions: [${generateEnumOptions(field.enum, enumDescs)}],`); } @@ -1611,11 +1640,16 @@ function generateQueryParamField( lines.push(`${tab}\tdisplayName: ${quote(formatDisplayName(param.name))},`); lines.push(`${tab}\tname: ${quote(paramName)},`); lines.push(`${tab}\ttype: ${quote(n8nType)},`); + if (param.required && !isInsideCollection) { + lines.push(`${tab}\trequired: true,`); + } if (n8nType === 'options' && resolvedSchema.enum) { const qEnumDescs = getEnumDescriptions(param.name, endpointId); lines.push(`${tab}\toptions: [${generateEnumOptions(resolvedSchema.enum, qEnumDescs)}],`); } - const qDefault = (typeof resolvedSchema.default === 'string' && /[а-яА-ЯёЁ]/.test(resolvedSchema.default)) ? '' : (resolvedSchema.default ?? (n8nType === 'boolean' ? false : (n8nType === 'number' ? 0 : ''))); + // Use resolved default, falling back to original schema default (resolveAllOf may drop sibling defaults) + const rawDefault = resolvedSchema.default ?? param.schema.default; + const qDefault = (typeof rawDefault === 'string' && /[а-яА-ЯёЁ]/.test(rawDefault)) ? '' : (rawDefault ?? (n8nType === 'boolean' ? false : (n8nType === 'number' ? 0 : ''))); lines.push(`${tab}\tdefault: ${JSON.stringify(qDefault)},`); if (queryDesc && queryDesc.toLowerCase() !== formatDisplayName(param.name).toLowerCase()) { const desc = sanitizeDescription(n8nType === 'boolean' ? booleanDescription(queryDesc) : queryDesc); @@ -1639,7 +1673,24 @@ const SAFE_ENUM_DEFAULTS: Record = { role: ['member', 'user'], }; +/** Fields that should be rendered as 'options' type regardless of OpenAPI schema. + * Used when OpenAPI uses plain integer but valid values are a small fixed set. */ +const FIELD_OPTIONS_OVERRIDES: Record; default: number | string }> = { + priority: { + options: [ + { name: 'None', value: 0 }, + { name: '1 — Normal', value: 1 }, + { name: '2 — Important', value: 2 }, + { name: '3 — Very Important', value: 3 }, + ], + default: 0, + }, +}; + function getDefaultValue(field: BodyField, resource: string, op: string, paramName: string): unknown { + // Field type overrides have priority + const fieldOverride = FIELD_OPTIONS_OVERRIDES[field.name]; + if (fieldOverride) return fieldOverride.default; // Use OpenAPI default if set and not Russian text if (field.default !== undefined && !(typeof field.default === 'string' && /[а-яА-ЯёЁ]/.test(field.default))) return field.default; if (field.enum && field.enum.length > 0) { @@ -1755,19 +1806,10 @@ function generateV2Node(resources: string[]): string { \tINodeTypeDescription, \tIExecuteFunctions, \tINodeExecutionData, -\tILoadOptionsFunctions, -\tINodeListSearchResult, -\tINodePropertyOptions, } from 'n8n-workflow'; import { NodeConnectionTypes } from 'n8n-workflow'; import { router } from '../SharedRouter'; -function formatUserName(u: { first_name: string; last_name: string; nickname: string }): string { - const fullName = [u.first_name, u.last_name] - .filter((v) => v != null && v !== '' && v !== 'null') - .join(' '); - const display = fullName || u.nickname || 'User'; - return u.nickname ? \`\${display} (@\${u.nickname})\` : display; -} +import { searchChats, searchUsers, searchEntities, getCustomProperties } from '../GenericFunctions'; ${imports.join('\n')} @@ -1804,98 +1846,8 @@ ${properties.join('\n')} \t} \tmethods = { -\t\tlistSearch: { -\t\t\tasync searchChats(this: ILoadOptionsFunctions, filter?: string): Promise { -\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); -\t\t\t\tconst url = filter -\t\t\t\t\t? \`\${credentials.baseUrl}/search/chats?query=\${encodeURIComponent(filter)}\` -\t\t\t\t\t: \`\${credentials.baseUrl}/chats?per=50\`; -\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { -\t\t\t\t\tmethod: 'GET', -\t\t\t\t\turl, -\t\t\t\t}); -\t\t\t\tconst items = response.data ?? []; -\t\t\t\treturn { -\t\t\t\t\tresults: items.map((c: { id: number; name: string }) => ({ -\t\t\t\t\t\tname: c.name, -\t\t\t\t\t\tvalue: c.id, -\t\t\t\t\t})), -\t\t\t\t}; -\t\t\t}, -\t\t\tasync searchUsers(this: ILoadOptionsFunctions, filter?: string): Promise { -\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); -\t\t\t\tif (!filter) return { results: [] }; -\t\t\t\tconst url = \`\${credentials.baseUrl}/search/users?query=\${encodeURIComponent(filter)}\`; -\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { -\t\t\t\t\tmethod: 'GET', -\t\t\t\t\turl, -\t\t\t\t}); -\t\t\t\tconst items = response.data ?? []; -\t\t\t\treturn { -\t\t\t\t\tresults: items.map((u: { id: number; first_name: string; last_name: string; nickname: string }) => ({ -\t\t\t\t\t\tname: formatUserName(u), -\t\t\t\t\t\tvalue: u.id, -\t\t\t\t\t})), -\t\t\t\t}; -\t\t\t}, -\t\t\tasync searchEntities(this: ILoadOptionsFunctions, filter?: string): Promise { -\t\t\t\tlet entityType = 'discussion'; -\t\t\t\ttry { -\t\t\t\t entityType = (this.getNodeParameter('entityType') as string) || 'discussion'; -\t\t\t\t} catch { -\t\t\t\t try { -\t\t\t\t entityType = (this.getCurrentNodeParameter('entityType') as string) || 'discussion'; -\t\t\t\t } catch { /* parameter may not exist yet */ } -\t\t\t\t} -\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); -\t\t\t\tif (entityType === 'user') { -\t\t\t\t\tif (!filter) return { results: [] }; -\t\t\t\t\tconst url = \`\${credentials.baseUrl}/search/users?query=\${encodeURIComponent(filter)}\`; -\t\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { method: 'GET', url }); -\t\t\t\t\tconst items = response.data ?? []; -\t\t\t\t\treturn { -\t\t\t\t\t\tresults: items.map((u: { id: number; first_name: string; last_name: string; nickname: string }) => ({ -\t\t\t\t\t\t\tname: formatUserName(u), -\t\t\t\t\t\t\tvalue: u.id, -\t\t\t\t\t\t})), -\t\t\t\t\t}; -\t\t\t\t} -\t\t\t\tif (entityType === 'thread') { -\t\t\t\t\treturn { results: [] }; -\t\t\t\t} -\t\t\t\tconst url = filter -\t\t\t\t\t? \`\${credentials.baseUrl}/search/chats?query=\${encodeURIComponent(filter)}\` -\t\t\t\t\t: \`\${credentials.baseUrl}/chats?per=50\`; -\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { method: 'GET', url }); -\t\t\t\tconst items = response.data ?? []; -\t\t\t\treturn { -\t\t\t\t\tresults: items.map((c: { id: number; name: string }) => ({ -\t\t\t\t\t\tname: c.name, -\t\t\t\t\t\tvalue: c.id, -\t\t\t\t\t})), -\t\t\t\t}; -\t\t\t}, -\t\t}, -\t\tloadOptions: { -\t\t\tasync getCustomProperties(this: ILoadOptionsFunctions): Promise { -\t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); -\t\t\t\tconst resource = this.getNodeParameter('resource') as string; -\t\t\t\tconst entityType = resource === 'task' ? 'Task' : 'User'; -\t\t\t\ttry { -\t\t\t\t\tconst response = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { -\t\t\t\t\t\tmethod: 'GET', -\t\t\t\t\t\turl: \`\${credentials.baseUrl}/custom_properties?entity_type=\${entityType}\`, -\t\t\t\t\t}); -\t\t\t\t\tconst items = response.data ?? []; -\t\t\t\t\treturn items.map((p: { id: number; name: string }) => ({ -\t\t\t\t\t\tname: p.name, -\t\t\t\t\t\tvalue: p.id, -\t\t\t\t\t})); -\t\t\t\t} catch { -\t\t\t\t\treturn []; -\t\t\t\t} -\t\t\t}, -\t\t}, +\t\tlistSearch: { searchChats, searchUsers, searchEntities }, +\t\tloadOptions: { getCustomProperties }, \t}; } `; @@ -1980,6 +1932,15 @@ export class PachcaApi implements ICredentialType { \t\t\tdescription: 'Used to verify incoming webhook requests from Pachca. Found in bot settings under the Webhook section.', \t\t\thint: 'Only required when using the Pachca Trigger node', \t\t}, +\t\t{ +\t\t\tdisplayName: 'Webhook Allowed IPs', +\t\t\tname: 'webhookAllowedIps', +\t\t\ttype: 'string', +\t\t\tdefault: '', +\t\t\tdescription: 'Comma-separated list of IP addresses allowed to send webhooks. Pachca sends from 37.200.70.177. Leave empty to allow all.', +\t\t\tplaceholder: '37.200.70.177', +\t\t\thint: 'Only used with the Pachca Trigger node', +\t\t}, \t]; \tauthenticate: IAuthenticateGeneric = { @@ -2165,7 +2126,7 @@ function injectFileUploadFields(outputDir: string): void { \t\t], \t\tdefault: 'binary', \t\tdescription: 'Where to get the file to upload', -\t\tdisplayOptions: { show: { resource: ['file'], operation: ['create', 'upload'] } }, +\t\tdisplayOptions: { show: { resource: ['file'], operation: ['create'] } }, \t}, \t{ \t\tdisplayName: 'File URL', @@ -2174,7 +2135,7 @@ function injectFileUploadFields(outputDir: string): void { \t\trequired: true, \t\tdefault: '', \t\tdescription: 'URL of the file to upload', -\t\tdisplayOptions: { show: { resource: ['file'], operation: ['create', 'upload'], fileSource: ['url'] } }, +\t\tdisplayOptions: { show: { resource: ['file'], operation: ['create'], fileSource: ['url'] } }, \t}, \t{ \t\tdisplayName: 'Input Binary Field', @@ -2183,7 +2144,7 @@ function injectFileUploadFields(outputDir: string): void { \t\trequired: true, \t\tdefault: 'data', \t\thint: 'The name of the input binary field containing the file to be uploaded', -\t\tdisplayOptions: { show: { resource: ['file'], operation: ['create', 'upload'], fileSource: ['binary'] } }, +\t\tdisplayOptions: { show: { resource: ['file'], operation: ['create'], fileSource: ['binary'] } }, \t}, \t{ \t\tdisplayName: 'Additional Fields', @@ -2191,7 +2152,7 @@ function injectFileUploadFields(outputDir: string): void { \t\ttype: 'collection', \t\tplaceholder: 'Add Field', \t\tdefault: {}, -\t\tdisplayOptions: { show: { resource: ['file'], operation: ['create', 'upload'] } }, +\t\tdisplayOptions: { show: { resource: ['file'], operation: ['create'] } }, \t\toptions: [ \t\t\t{ \t\t\t\tdisplayName: 'Content Type', @@ -2333,6 +2294,7 @@ export class PachcaTrigger implements INodeType { \t\t\t\thttpMethod: 'POST', \t\t\t\tresponseMode: 'onReceived', \t\t\t\tpath: 'webhook', +\t\t\t\trawBody: true, \t\t\t}, \t\t], \t\tproperties: [ @@ -2356,7 +2318,12 @@ ${optionEntries} \t\tdefault: { \t\t\tasync checkExists(this: IHookFunctions): Promise { \t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); -\t\t\t\tconst botId = await resolveBotId(this, credentials); +\t\t\t\tlet botId: number; +\t\t\t\ttry { +\t\t\t\t\tbotId = await resolveBotId(this, credentials); +\t\t\t\t} catch { +\t\t\t\t\treturn false; // Network error → treat as not exists, will trigger create +\t\t\t\t} \t\t\t\tif (!botId) return false; \t\t\t\tconst webhookUrl = this.getNodeWebhookUrl('default'); \t\t\t\ttry { @@ -2379,7 +2346,10 @@ ${optionEntries} \t\t\tasync create(this: IHookFunctions): Promise { \t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); \t\t\t\tconst botId = await resolveBotId(this, credentials); -\t\t\t\tif (!botId) return true; // Not a bot token → manual mode +\t\t\t\tif (!botId) { +\t\t\t\t\tthis.logger.warn('Pachca Trigger: token is not a bot token. Webhook was NOT registered automatically. Configure webhook URL manually in Pachca bot settings.'); +\t\t\t\t\treturn true; +\t\t\t\t} \t\t\t\tconst webhookUrl = this.getNodeWebhookUrl('default'); \t\t\t\tawait this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { \t\t\t\t\tmethod: 'PUT', @@ -2391,7 +2361,12 @@ ${optionEntries} \t\t\tasync delete(this: IHookFunctions): Promise { \t\t\t\tconst credentials = await this.getCredentials('pachcaApi'); -\t\t\t\tconst botId = await resolveBotId(this, credentials); +\t\t\t\tlet botId: number; +\t\t\t\ttry { +\t\t\t\t\tbotId = await resolveBotId(this, credentials); +\t\t\t\t} catch { +\t\t\t\t\treturn true; // Can't resolve bot → nothing to clean up +\t\t\t\t} \t\t\t\tif (!botId) return true; \t\t\t\ttry { \t\t\t\t\tawait this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { @@ -2413,11 +2388,23 @@ ${optionEntries} \t\tconst credentials = await this.getCredentials('pachcaApi'); \t\tconst event = this.getNodeParameter('event') as string; +\t\t// IP allowlist check +\t\tconst allowedIps = ((credentials.webhookAllowedIps as string) || '').split(',').map(s => s.trim()).filter(Boolean); +\t\tif (allowedIps.length > 0) { +\t\t\tconst request = this.getRequestObject(); +\t\t\tconst clientIp = (request.headers['x-forwarded-for'] as string)?.split(',')[0]?.trim() || request.socket?.remoteAddress || ''; +\t\t\tconst normalizedIp = clientIp.replace(/^::ffff:/, ''); +\t\t\tif (!allowedIps.includes(normalizedIp)) { +\t\t\t\treturn { webhookResponse: 'Forbidden' }; +\t\t\t} +\t\t} + \t\t// Signing secret verification (use raw body bytes for accurate HMAC) -\t\tif (credentials.signingSecret) { -\t\t\tconst signature = headerData['x-pachca-signature'] as string; +\t\tconst signingSecret = ((credentials.signingSecret as string) || '').trim(); +\t\tif (signingSecret) { +\t\t\tconst signature = headerData['pachca-signature'] as string; \t\t\tif (!signature) { -\t\t\t\treturn { webhookResponse: 'Missing signature' }; +\t\t\t\treturn { webhookResponse: 'Rejected' }; \t\t\t} \t\t\tconst request = this.getRequestObject(); \t\t\tconst rawBody = request.rawBody @@ -2427,10 +2414,19 @@ ${optionEntries} \t\t\t\t!verifyWebhookSignature( \t\t\t\t\trawBody, \t\t\t\t\tsignature, -\t\t\t\t\tcredentials.signingSecret as string, +\t\t\t\t\tsigningSecret, \t\t\t\t) \t\t\t) { -\t\t\t\treturn { webhookResponse: 'Invalid signature' }; +\t\t\t\treturn { webhookResponse: 'Rejected' }; +\t\t\t} +\t\t} + +\t\t// Replay protection — reject events older than 5 minutes +\t\tconst webhookTs = body.webhook_timestamp as number | undefined; +\t\tif (webhookTs) { +\t\t\tconst ageMs = Date.now() - webhookTs * 1000; +\t\t\tif (Math.abs(ageMs) > 5 * 60 * 1000) { +\t\t\t\treturn { webhookResponse: 'Rejected' }; \t\t\t} \t\t} @@ -2465,6 +2461,7 @@ function getSpecialHandler(resource: string, v2Op: string): string | null { if (resource === 'form' && v2Op === 'create') return 'formBlocks'; if (resource === 'bot' && v2Op === 'update') return 'botWebhook'; if (resource === 'user' && v2Op === 'getAll') return 'userGetAllFilters'; + if (resource === 'export' && v2Op === 'get') return 'exportDownload'; return null; } @@ -2599,6 +2596,7 @@ function buildRouteEntry(resource: string, op: OperationInfo): string { const locator = !!SEARCHABLE_QUERY_PARAMS[p.name]; const qm: string[] = [`api: '${p.name}'`, `n8n: '${n8nName}'`]; if (locator) qm.push('locator: true'); + if (p.required) qm.push('required: true'); queryMapEntries.push(`{ ${qm.join(', ')} }`); } if (queryMapEntries.length) parts.push(`queryMap: [${queryMapEntries.join(', ')}]`); @@ -2608,6 +2606,13 @@ function buildRouteEntry(resource: string, op: OperationInfo): string { const n8nName = getParamName(resource, op.v1Op, p.name); optQueryEntries.push(`{ api: '${p.name}', n8n: '${n8nName}' }`); } + // v1 compat: pagination fields from V1-specific collections (not in OpenAPI spec) + const v1Pagination = V1_COMPAT_PAGINATION[resource]?.[v2Op]; + if (v1Pagination) { + for (const [api, n8n] of v1Pagination) { + optQueryEntries.push(`{ api: '${api}', n8n: '${n8n}' }`); + } + } if (optQueryEntries.length) parts.push(`optionalQueryMap: [${optQueryEntries.join(', ')}]`); return `\t\t${v2Op}: {\n\t\t\t${parts.join(',\n\t\t\t')},\n\t\t}`; @@ -2658,6 +2663,7 @@ function buildAliasRouteEntry( // Collect body fields from splitComma + V1_ALIAS_FIELDS routing const bodyEntries: string[] = []; + const optBodyEntries: string[] = []; if (routing.splitComma) { for (const [n8n, api, type] of routing.splitComma) { bodyEntries.push(`{ api: '${api}', n8n: '${n8n}', isArray: true, arrayType: '${type}' }`); @@ -2667,11 +2673,17 @@ function buildAliasRouteEntry( if (aliasFieldDefs) { for (const f of aliasFieldDefs.fields) { if (f.routing) { - bodyEntries.push(`{ api: '${f.routing.send.property}', n8n: '${f.name}' }`); + const entry = `{ api: '${f.routing.send.property}', n8n: '${f.name}' }`; + if (f.required) { + bodyEntries.push(entry); + } else { + optBodyEntries.push(entry); + } } } } if (bodyEntries.length) parts.push(`bodyMap: [${bodyEntries.join(', ')}]`); + if (optBodyEntries.length) parts.push(`optionalBodyMap: [${optBodyEntries.join(', ')}]`); return `\t\t${aliasOp}: {\n\t\t\t${parts.join(',\n\t\t\t')},\n\t\t}`; } @@ -2727,6 +2739,7 @@ import { \tsplitAndValidateCommaList, \tsimplifyItem, \tFORM_TEMPLATES, +\tsanitizeBaseUrl, } from './GenericFunctions'; // ============================================================================ @@ -2753,6 +2766,7 @@ interface QueryMap { \tapi: string; \tn8n: string; \tlocator?: boolean; +\trequired?: boolean; } interface RouteConfig { @@ -2858,7 +2872,26 @@ async function executeRoute( \t\t\tjson: { name: key, blocks } as unknown as IDataObject, \t\t})); \t} - +\tif (route.special === 'exportDownload') { +\t\tconst exportId = this.getNodeParameter('id', i) as number; +\t\tconst credentials = await this.getCredentials('pachcaApi'); +\t\tconst base = sanitizeBaseUrl(credentials.baseUrl as string); +\t\tconst resp = await this.helpers.httpRequestWithAuthentication.call(this, 'pachcaApi', { +\t\t\tmethod: 'GET', +\t\t\turl: \`\${base}/chats/exports/\${exportId}\`, +\t\t\tignoreHttpStatusErrors: true, +\t\t\treturnFullResponse: true, +\t\t\tdisableFollowRedirect: true, +\t\t}) as { statusCode: number; headers: Record; body: unknown }; +\t\tconst location = resp.headers?.location; +\t\tif (location) { +\t\t\treturn [{ json: { id: exportId, url: location } as unknown as IDataObject }]; +\t\t} +\t\tif (typeof resp.body === 'object' && resp.body) { +\t\t\treturn [{ json: resp.body as IDataObject }]; +\t\t} +\t\treturn [{ json: { id: exportId, success: true } as unknown as IDataObject }]; +\t} \t// === Build URL with path params === \tlet url = route.path; \tfor (const pp of route.pathParams ?? []) { @@ -2876,6 +2909,9 @@ async function executeRoute( \t\t\t\t} \t\t\t} \t\t} +\t\tif (value === undefined || value === null || value === '') { +\t\t\tthrow new Error(\`Missing required path parameter: \${pp.n8n}\`); +\t\t} \t\turl = url.replace(\`{\${pp.api}}\`, String(value)); \t} @@ -2934,7 +2970,9 @@ async function executeRoute( \t\t\t\tval = this.getNodeParameter(qm.n8n, i); \t\t\t} \t\t\tif (val !== undefined && val !== null && val !== '') qs[qm.api] = val as IDataObject; -\t\t} catch { /* param not shown / not filled */ } +\t\t} catch (e) { +\t\t\tif (qm.required) throw e; // Required query param must be present +\t\t} \t} \t// Read query params from collection, with top-level fallback (same pattern as optionalBodyMap) @@ -3049,7 +3087,15 @@ async function executeRoute( \t\treturn [{ json: { success: true } }]; \t} +\t// Handle 204 No Content for non-DELETE methods (archive, unarchive, pin, addMembers, etc.) +\tif (!response || (typeof response === 'object' && Object.keys(response).length === 0)) { +\t\treturn [{ json: { success: true } }]; +\t} + \tif (route.noDataWrapper) { +\t\tif (!response || (typeof response === 'object' && Object.keys(response).length === 0)) { +\t\t\treturn [{ json: { success: true } as unknown as IDataObject }]; +\t\t} \t\treturn [{ json: response }]; \t} diff --git a/integrations/n8n/tests/error-paths.test.ts b/integrations/n8n/tests/error-paths.test.ts new file mode 100644 index 00000000..8e352000 --- /dev/null +++ b/integrations/n8n/tests/error-paths.test.ts @@ -0,0 +1,475 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import type { IDataObject, IExecuteFunctions, IHookFunctions, INode } from 'n8n-workflow'; +import { NodeApiError } from 'n8n-workflow'; +import { + makeApiRequest, + makeApiRequestAllPages, + sanitizeBaseUrl, + resolveBotId, +} from '../nodes/Pachca/GenericFunctions'; + +// ============================================================================ +// Mock helpers +// ============================================================================ + +const MOCK_NODE: INode = { + id: 'test-node-id', + name: 'Pachca', + type: 'n8n-nodes-pachca.pachca', + typeVersion: 2, + position: [0, 0], + parameters: {}, +}; + +function createExecCtx(overrides: { + httpResponse?: unknown; + httpResponses?: unknown[]; + params?: Record; +}): IExecuteFunctions & { _callIndex: number } { + const params = overrides.params ?? {}; + let callIndex = 0; + const responses = overrides.httpResponses ?? [overrides.httpResponse ?? { statusCode: 200, body: { data: {} } }]; + + return { + _callIndex: 0, + getCredentials: vi.fn(async () => ({ + baseUrl: 'https://api.pachca.com/api/shared/v1', + accessToken: 'test-token', + })), + getNodeParameter: vi.fn((name: string, _index: number, defaultVal?: unknown) => { + if (name in params) return params[name]; + if (defaultVal !== undefined) return defaultVal; + throw new Error(`Missing parameter: ${name}`); + }), + getNode: vi.fn(() => MOCK_NODE), + helpers: { + httpRequestWithAuthentication: vi.fn(async () => { + const idx = callIndex++; + const resp = responses[idx % responses.length]; + if (resp instanceof Error) throw resp; + return resp; + }), + }, + } as unknown as IExecuteFunctions & { _callIndex: number }; +} + +// ============================================================================ +// sanitizeBaseUrl +// ============================================================================ + +describe('sanitizeBaseUrl', () => { + it('should strip trailing slashes', () => { + expect(sanitizeBaseUrl('https://api.example.com/')).toBe('https://api.example.com'); + expect(sanitizeBaseUrl('https://api.example.com///')).toBe('https://api.example.com'); + }); + + it('should pass through clean URLs', () => { + expect(sanitizeBaseUrl('https://api.example.com')).toBe('https://api.example.com'); + }); + + it('should throw for non-http URLs', () => { + expect(() => sanitizeBaseUrl('ftp://files.example.com')).toThrow('Invalid Base URL'); + expect(() => sanitizeBaseUrl('javascript:alert(1)')).toThrow('Invalid Base URL'); + expect(() => sanitizeBaseUrl('')).toThrow('Invalid Base URL'); + }); + + it('should accept http:// URLs', () => { + expect(sanitizeBaseUrl('http://localhost:8080')).toBe('http://localhost:8080'); + }); +}); + +// ============================================================================ +// makeApiRequest — error paths +// ============================================================================ + +describe('makeApiRequest error paths', () => { + it('should throw NodeApiError on 401', async () => { + const ctx = createExecCtx({ + httpResponse: { + statusCode: 401, + body: { error: 'Unauthorized' }, + headers: {}, + }, + }); + + await expect( + makeApiRequest.call(ctx, 'GET', '/users', undefined, undefined, 0), + ).rejects.toThrow(NodeApiError); + }); + + it('should throw NodeApiError on 404', async () => { + const ctx = createExecCtx({ + httpResponse: { + statusCode: 404, + body: { error: 'Not found' }, + headers: {}, + }, + }); + + await expect( + makeApiRequest.call(ctx, 'GET', '/users/999', undefined, undefined, 0), + ).rejects.toThrow(NodeApiError); + }); + + it('should format field-level validation errors (422)', async () => { + const ctx = createExecCtx({ + httpResponse: { + statusCode: 422, + body: { + errors: [ + { key: 'entity_id', value: 'is required' }, + { key: 'first_name', value: 'is too short' }, + ], + }, + headers: {}, + }, + }); + + try { + await makeApiRequest.call(ctx, 'POST', '/users', {}, undefined, 0); + expect.unreachable('Should have thrown'); + } catch (error) { + expect(error).toBeInstanceOf(NodeApiError); + const apiError = error as NodeApiError; + // Should use display names from FIELD_DISPLAY_NAMES + expect(apiError.message).toContain('Entity ID'); + expect(apiError.message).toContain('First Name'); + } + }); + + it('should attach Retry-After header to error', async () => { + const ctx = createExecCtx({ + httpResponse: { + statusCode: 429, + body: { error: 'Rate limited' }, + headers: { 'retry-after': '5' }, + }, + }); + + try { + await makeApiRequest.call(ctx, 'GET', '/users', undefined, undefined, 0); + expect.unreachable('Should have thrown'); + } catch (error) { + expect(error).toBeInstanceOf(NodeApiError); + expect((error as NodeApiError & { retryAfter?: number }).retryAfter).toBe(5); + } + }); + + it('should handle 204 No Content as success', async () => { + const ctx = createExecCtx({ + httpResponse: { + statusCode: 204, + body: null, + headers: {}, + }, + }); + + const result = await makeApiRequest.call(ctx, 'DELETE', '/messages/1', undefined, undefined, 0); + expect(result).toEqual({ success: true }); + }); + + it('should handle 500 with generic error message', async () => { + const ctx = createExecCtx({ + httpResponse: { + statusCode: 500, + body: {}, + headers: {}, + }, + }); + + try { + await makeApiRequest.call(ctx, 'GET', '/users', undefined, undefined, 0); + expect.unreachable('Should have thrown'); + } catch (error) { + expect(error).toBeInstanceOf(NodeApiError); + expect((error as NodeApiError).message).toContain('500'); + } + }); + + it('should not send Content-Type or body for GET requests', async () => { + const ctx = createExecCtx({ + httpResponse: { statusCode: 200, body: { data: [] }, headers: {} }, + }); + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + + await makeApiRequest.call(ctx, 'GET', '/users', { should: 'be-ignored' }, { per: 50 }, 0); + + const callArgs = httpMock.mock.calls[0]; + const options = callArgs[1]; + expect(options.body).toBeUndefined(); + expect(options.headers['Content-Type']).toBeUndefined(); + expect(options.qs).toEqual({ per: 50 }); + }); + + it('should not send Content-Type or body for DELETE requests', async () => { + const ctx = createExecCtx({ + httpResponse: { statusCode: 204, body: null, headers: {} }, + }); + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + + await makeApiRequest.call(ctx, 'DELETE', '/messages/1', undefined, undefined, 0); + + const options = httpMock.mock.calls[0][1]; + expect(options.body).toBeUndefined(); + expect(options.headers['Content-Type']).toBeUndefined(); + }); +}); + +// ============================================================================ +// makeApiRequestAllPages — retry and pagination error paths +// ============================================================================ + +describe('makeApiRequestAllPages error paths', () => { + // Stub setTimeout to resolve immediately so retry tests don't wait + beforeEach(() => { + vi.spyOn(globalThis, 'setTimeout').mockImplementation((fn: TimerHandler) => { + if (typeof fn === 'function') fn(); + return 0 as unknown as ReturnType; + }); + }); + afterEach(() => { + vi.restoreAllMocks(); + }); + + it('should retry on 429 and succeed', async () => { + const rateLimitResponse = { + statusCode: 429, + body: { error: 'Rate limited' }, + headers: { 'retry-after': '1' }, + }; + const successResponse = { + statusCode: 200, + body: { data: [{ id: 1 }], meta: { paginate: {} } }, + headers: {}, + }; + + const ctx = createExecCtx({ + httpResponses: [rateLimitResponse, successResponse], + params: { returnAll: false, limit: 10 }, + }); + + const results = await makeApiRequestAllPages.call( + ctx, 'GET', '/users', {}, 0, 'user', 2, + ); + expect(results).toEqual([{ json: { id: 1 } }]); + expect((ctx.helpers.httpRequestWithAuthentication as ReturnType).mock.calls).toHaveLength(2); + }); + + it('should retry on 502 and succeed', async () => { + const errorResponse = { + statusCode: 502, + body: { error: 'Bad Gateway' }, + headers: {}, + }; + const successResponse = { + statusCode: 200, + body: { data: [{ id: 1 }], meta: { paginate: {} } }, + headers: {}, + }; + + const ctx = createExecCtx({ + httpResponses: [errorResponse, successResponse], + params: { returnAll: false, limit: 10 }, + }); + + const results = await makeApiRequestAllPages.call( + ctx, 'GET', '/users', {}, 0, 'user', 2, + ); + expect(results).toEqual([{ json: { id: 1 } }]); + }); + + it('should throw after MAX_RETRIES exceeded', async () => { + const rateLimitResponse = { + statusCode: 429, + body: { error: 'Rate limited' }, + headers: { 'retry-after': '1' }, + }; + + // initial + 5 retries = 6 calls, then 7th throws + const ctx = createExecCtx({ + httpResponses: Array(7).fill(rateLimitResponse), + params: { returnAll: false, limit: 10 }, + }); + + await expect( + makeApiRequestAllPages.call(ctx, 'GET', '/users', {}, 0, 'user', 2), + ).rejects.toThrow(NodeApiError); + // 6 calls total: 1 initial + 5 retries, 6th exceeds MAX_RETRIES + expect((ctx.helpers.httpRequestWithAuthentication as ReturnType).mock.calls).toHaveLength(6); + }); + + it('should throw non-retryable errors immediately (e.g. 403)', async () => { + const ctx = createExecCtx({ + httpResponses: [{ + statusCode: 403, + body: { error: 'Forbidden' }, + headers: {}, + }], + params: { returnAll: false, limit: 10 }, + }); + + await expect( + makeApiRequestAllPages.call(ctx, 'GET', '/users', {}, 0, 'user', 2), + ).rejects.toThrow(NodeApiError); + // Only 1 call — no retries + expect((ctx.helpers.httpRequestWithAuthentication as ReturnType).mock.calls).toHaveLength(1); + }); + + it('should break on duplicate cursor (infinite loop guard)', async () => { + const page1 = { + statusCode: 200, + body: { data: [{ id: 1 }], meta: { paginate: { next_page: 'cursor-A' } } }, + headers: {}, + }; + const page2 = { + statusCode: 200, + body: { data: [{ id: 2 }], meta: { paginate: { next_page: 'cursor-A' } } }, + headers: {}, + }; + const page3 = { + statusCode: 200, + body: { data: [{ id: 3 }], meta: { paginate: { next_page: 'cursor-A' } } }, + headers: {}, + }; + + const ctx = createExecCtx({ + httpResponses: [page1, page2, page3], + params: { returnAll: true }, + }); + + const results = await makeApiRequestAllPages.call( + ctx, 'GET', '/users', {}, 0, 'user', 2, + ); + // Guard compares nextCursor with previousCursor (one behind current): + // Page 1: nextCursor=A, previousCursor=undefined → no match + // Page 2: nextCursor=A, previousCursor=undefined → no match + // Page 3: nextCursor=A, previousCursor=A → match → break + expect(results).toHaveLength(3); + }); + + it('should respect limit and not fetch extra pages', async () => { + const page1 = { + statusCode: 200, + body: { + data: Array.from({ length: 50 }, (_, i) => ({ id: i })), + meta: { paginate: { next_page: 'cursor-B' } }, + }, + headers: {}, + }; + + const ctx = createExecCtx({ + httpResponses: [page1], + params: { returnAll: false, limit: 10 }, + }); + + const results = await makeApiRequestAllPages.call( + ctx, 'GET', '/users', {}, 0, 'user', 2, + ); + // Should slice to limit + expect(results).toHaveLength(10); + // Only 1 HTTP call — didn't fetch page 2 because 50 >= limit(10) + expect((ctx.helpers.httpRequestWithAuthentication as ReturnType).mock.calls).toHaveLength(1); + }); + + it('should handle empty data array gracefully', async () => { + const ctx = createExecCtx({ + httpResponses: [{ + statusCode: 200, + body: { data: [], meta: { paginate: {} } }, + headers: {}, + }], + params: { returnAll: true }, + }); + + const results = await makeApiRequestAllPages.call( + ctx, 'GET', '/users', {}, 0, 'user', 2, + ); + expect(results).toEqual([]); + }); + + it('should pass Retry-After value to setTimeout', async () => { + const rateLimitResponse = { + statusCode: 429, + body: { error: 'Rate limited' }, + headers: { 'retry-after': '3' }, + }; + const successResponse = { + statusCode: 200, + body: { data: [{ id: 1 }], meta: {} }, + headers: {}, + }; + + const ctx = createExecCtx({ + httpResponses: [rateLimitResponse, successResponse], + params: { returnAll: false, limit: 10 }, + }); + + const setTimeoutSpy = globalThis.setTimeout as unknown as ReturnType; + const results = await makeApiRequestAllPages.call(ctx, 'GET', '/users', {}, 0, 'user', 2); + + expect(results).toEqual([{ json: { id: 1 } }]); + // Retry-After: 3 → retryAfter = parseInt('3') || 2 = 3 → setTimeout(fn, 3000) + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 3000); + }); +}); + +// ============================================================================ +// resolveBotId +// ============================================================================ + +describe('resolveBotId', () => { + function createHookCtx(httpResponse: unknown) { + return { + helpers: { + httpRequestWithAuthentication: vi.fn(async () => httpResponse), + }, + } as unknown as IHookFunctions; + } + + it('should return explicit botId from credentials', async () => { + const ctx = createHookCtx({}); + const credentials = { botId: 42, baseUrl: 'https://api.pachca.com/api/shared/v1' }; + const result = await resolveBotId(ctx, credentials); + expect(result).toBe(42); + // Should not make any HTTP call + expect((ctx.helpers.httpRequestWithAuthentication as ReturnType)).not.toHaveBeenCalled(); + }); + + it('should detect bot token via token/info API', async () => { + const ctx = createHookCtx({ + data: { name: null, user_id: 12345 }, + }); + const credentials = { botId: 0, baseUrl: 'https://api.pachca.com/api/shared/v1' }; + const result = await resolveBotId(ctx, credentials); + expect(result).toBe(12345); + }); + + it('should return 0 for personal token (name is not null)', async () => { + const ctx = createHookCtx({ + data: { name: 'My Token', user_id: 99 }, + }); + const credentials = { botId: 0, baseUrl: 'https://api.pachca.com/api/shared/v1' }; + const result = await resolveBotId(ctx, credentials); + expect(result).toBe(0); + }); + + it('should return 0 when data is missing', async () => { + const ctx = createHookCtx({}); + const credentials = { botId: 0, baseUrl: 'https://api.pachca.com/api/shared/v1' }; + const result = await resolveBotId(ctx, credentials); + expect(result).toBe(0); + }); + + it('should propagate network errors (no silent catch)', async () => { + const ctx = { + helpers: { + httpRequestWithAuthentication: vi.fn(async () => { + throw new Error('Network timeout'); + }), + }, + } as unknown as IHookFunctions; + const credentials = { botId: 0, baseUrl: 'https://api.pachca.com/api/shared/v1' }; + + await expect(resolveBotId(ctx, credentials)).rejects.toThrow('Network timeout'); + }); +}); From 53bc17bc253f6f3f80eb4377646e0695e870566a Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 22:23:28 +0300 Subject: [PATCH 14/37] chore: remove C# build artifacts from git tracking --- .../bin/Debug/net8.0/Pachca.deps.json | 23 - .../generated/bin/Debug/net8.0/Pachca.dll | Bin 236544 -> 0 bytes .../generated/bin/Debug/net8.0/Pachca.pdb | Bin 71812 -> 0 bytes .../generated/bin/Debug/net8.0/Pachca.xml | 599 ------------------ ...CoreApp,Version=v8.0.AssemblyAttributes.cs | 4 - .../obj/Debug/net8.0/Pachca.AssemblyInfo.cs | 24 - .../net8.0/Pachca.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 13 - .../obj/Debug/net8.0/Pachca.assets.cache | Bin 156 -> 0 bytes .../Pachca.csproj.CoreCompileInputs.cache | 1 - .../net8.0/Pachca.csproj.FileListAbsolute.txt | 28 - .../generated/obj/Debug/net8.0/Pachca.dll | Bin 236544 -> 0 bytes .../generated/obj/Debug/net8.0/Pachca.pdb | Bin 71812 -> 0 bytes .../obj/Debug/net8.0/Pachca.sourcelink.json | 1 - .../generated/obj/Debug/net8.0/Pachca.xml | 599 ------------------ .../generated/obj/Debug/net8.0/ref/Pachca.dll | Bin 98304 -> 0 bytes .../obj/Debug/net8.0/refint/Pachca.dll | Bin 98304 -> 0 bytes .../obj/Pachca.csproj.nuget.dgspec.json | 61 -- .../generated/obj/Pachca.csproj.nuget.g.props | 15 - .../obj/Pachca.csproj.nuget.g.targets | 2 - sdk/csharp/generated/obj/project.assets.json | 66 -- sdk/csharp/generated/obj/project.nuget.cache | 8 - 22 files changed, 1445 deletions(-) delete mode 100644 sdk/csharp/generated/bin/Debug/net8.0/Pachca.deps.json delete mode 100644 sdk/csharp/generated/bin/Debug/net8.0/Pachca.dll delete mode 100644 sdk/csharp/generated/bin/Debug/net8.0/Pachca.pdb delete mode 100644 sdk/csharp/generated/bin/Debug/net8.0/Pachca.xml delete mode 100644 sdk/csharp/generated/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs delete mode 100644 sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfo.cs delete mode 100644 sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfoInputs.cache delete mode 100644 sdk/csharp/generated/obj/Debug/net8.0/Pachca.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 sdk/csharp/generated/obj/Debug/net8.0/Pachca.assets.cache delete mode 100644 sdk/csharp/generated/obj/Debug/net8.0/Pachca.csproj.CoreCompileInputs.cache delete mode 100644 sdk/csharp/generated/obj/Debug/net8.0/Pachca.csproj.FileListAbsolute.txt delete mode 100644 sdk/csharp/generated/obj/Debug/net8.0/Pachca.dll delete mode 100644 sdk/csharp/generated/obj/Debug/net8.0/Pachca.pdb delete mode 100644 sdk/csharp/generated/obj/Debug/net8.0/Pachca.sourcelink.json delete mode 100644 sdk/csharp/generated/obj/Debug/net8.0/Pachca.xml delete mode 100644 sdk/csharp/generated/obj/Debug/net8.0/ref/Pachca.dll delete mode 100644 sdk/csharp/generated/obj/Debug/net8.0/refint/Pachca.dll delete mode 100644 sdk/csharp/generated/obj/Pachca.csproj.nuget.dgspec.json delete mode 100644 sdk/csharp/generated/obj/Pachca.csproj.nuget.g.props delete mode 100644 sdk/csharp/generated/obj/Pachca.csproj.nuget.g.targets delete mode 100644 sdk/csharp/generated/obj/project.assets.json delete mode 100644 sdk/csharp/generated/obj/project.nuget.cache diff --git a/sdk/csharp/generated/bin/Debug/net8.0/Pachca.deps.json b/sdk/csharp/generated/bin/Debug/net8.0/Pachca.deps.json deleted file mode 100644 index 2961953f..00000000 --- a/sdk/csharp/generated/bin/Debug/net8.0/Pachca.deps.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "runtimeTarget": { - "name": ".NETCoreApp,Version=v8.0", - "signature": "" - }, - "compilationOptions": {}, - "targets": { - ".NETCoreApp,Version=v8.0": { - "Pachca/0.0.0": { - "runtime": { - "Pachca.dll": {} - } - } - } - }, - "libraries": { - "Pachca/0.0.0": { - "type": "project", - "serviceable": false, - "sha512": "" - } - } -} \ No newline at end of file diff --git a/sdk/csharp/generated/bin/Debug/net8.0/Pachca.dll b/sdk/csharp/generated/bin/Debug/net8.0/Pachca.dll deleted file mode 100644 index dac1b55b2edb11d10ec4341337c261ed0eb78d7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236544 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 Nj+pO%cK?J1egizj?j`^L diff --git a/sdk/csharp/generated/bin/Debug/net8.0/Pachca.pdb b/sdk/csharp/generated/bin/Debug/net8.0/Pachca.pdb deleted file mode 100644 index d62b3868ee302c5749d575a78cffab4a94dfcd1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71812 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 - - - Pachca - - - - Тип аудит-события - - - Пользователь успешно вошел в систему - - - Пользователь вышел из системы - - - Неудачная попытка двухфакторной аутентификации - - - Успешная двухфакторная аутентификация - - - Создана новая учетная запись пользователя - - - Учетная запись пользователя удалена - - - Роль пользователя была изменена - - - Данные пользователя обновлены - - - Создан новый тег - - - Тег удален - - - Пользователь добавлен в тег - - - Пользователь удален из тега - - - Создан новый чат - - - Чат переименован - - - Изменены права доступа к чату - - - Пользователь присоединился к чату - - - Пользователь покинул чат - - - Тег добавлен в чат - - - Тег удален из чата - - - Сообщение отредактировано - - - Сообщение удалено - - - Сообщение создано - - - Реакция добавлена - - - Реакция удалена - - - Тред создан - - - Создан новый токен доступа - - - Токен доступа обновлен - - - Токен доступа удален - - - Данные зашифрованы - - - Данные расшифрованы - - - Доступ к журналам аудита получен - - - Срабатывание правила DLP-системы - - - Поиск сотрудников через API - - - Поиск чатов через API - - - Поиск сообщений через API - - - Доступность чатов для пользователя - - - Чаты, где пользователь является участником - - - Все открытые чаты компании, вне зависимости от участия в них пользователя - - - Роль участника чата - - - Админ - - - Редактор (доступно только для каналов) - - - Участник или подписчик - - - Роль участника чата (с фильтром все) - - - Любая роль - - - Создатель - - - Админ - - - Редактор - - - Участник/подписчик - - - Тип чата - - - Канал или беседа - - - Тред - - - Тип данных дополнительного поля - - - Строковое значение - - - Числовое значение - - - Дата - - - Ссылка - - - Тип файла - - - Обычный файл - - - Изображение - - - Статус приглашения пользователя - - - Принято - - - Отправлено - - - Тип события webhook для участников - - - Добавление - - - Удаление - - - Тип сущности для сообщений - - - Беседа или канал - - - Тред - - - Пользователь - - - Скоуп доступа OAuth токена - - - Просмотр чатов и списка чатов - - - Создание новых чатов - - - Изменение настроек чата - - - Архивация и разархивация чатов - - - Выход из чатов - - - Просмотр участников чата - - - Добавление, изменение и удаление участников чата - - - Скачивание экспортов чата - - - Создание экспортов чата - - - Просмотр сообщений в чатах - - - Отправка сообщений - - - Редактирование сообщений - - - Удаление сообщений - - - Просмотр реакций на сообщения - - - Добавление и удаление реакций - - - Закрепление и открепление сообщений - - - Просмотр тредов (комментариев) - - - Создание тредов (комментариев) - - - Unfurl (разворачивание ссылок) - - - Просмотр информации о сотрудниках и списка сотрудников - - - Создание новых сотрудников - - - Редактирование данных сотрудника - - - Удаление сотрудников - - - Просмотр тегов - - - Создание, редактирование и удаление тегов - - - Изменение настроек бота - - - Просмотр информации о своем профиле - - - Просмотр статуса профиля - - - Изменение и удаление статуса профиля - - - Просмотр статуса сотрудника - - - Изменение и удаление статуса сотрудника - - - Просмотр дополнительных полей - - - Просмотр журнала аудита - - - Просмотр задач - - - Создание задач - - - Изменение задачи - - - Удаление задачи - - - Скачивание файлов - - - Загрузка файлов - - - Получение данных для загрузки файлов - - - Открытие форм (представлений) - - - Просмотр вебхуков - - - Создание и управление вебхуками - - - Просмотр лога вебхуков - - - Удаление записи в логе вебхука - - - Поиск сотрудников - - - Поиск чатов - - - Поиск сообщений - - - Тип события webhook для реакций - - - Создание - - - Удаление - - - Тип сущности для поиска - - - Пользователь - - - Задача - - - Сортировка результатов поиска - - - По релевантности - - - По алфавиту - - - Порядок сортировки - - - По возрастанию - - - По убыванию - - - Тип задачи - - - Позвонить контакту - - - Встреча - - - Простое напоминание - - - Событие - - - Написать письмо - - - Статус напоминания - - - Выполнено - - - Активно - - - Тип события webhook для пользователей - - - Приглашение - - - Подтверждение - - - Обновление - - - Приостановка - - - Активация - - - Удаление - - - Роль пользователя в системе - - - Администратор - - - Сотрудник - - - Мульти-гость - - - Гость - - - Роль пользователя, допустимая при создании и редактировании. Роль `guest` недоступна для установки через API. - - - Администратор - - - Сотрудник - - - Мульти-гость - - - Коды ошибок валидации - - - Обязательное поле (не может быть пустым) - - - Слишком длинное значение (пояснения вы получите в поле message) - - - Поле не соответствует правилам (пояснения вы получите в поле message) - - - Поле имеет непредусмотренное значение - - - Поле имеет недопустимое значение - - - Название для этого поля уже существует - - - Emoji статуса не может содержать значения отличные от Emoji символа - - - Объект не найден - - - Объект уже существует (пояснения вы получите в поле message) - - - Ошибка личного чата (пояснения вы получите в поле message) - - - Отображаемая ошибка (пояснения вы получите в поле message) - - - Действие запрещено - - - Выбран слишком большой диапазон дат - - - Некорректный URL вебхука - - - Достигнут лимит запросов - - - Превышен лимит активных сотрудников (пояснения вы получите в поле message) - - - Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций) - - - Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций) - - - Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций) - - - Ошибка выполнения запроса (пояснения вы получите в поле message) - - - Не удалось найти идентификатор события - - - Время жизни идентификатора события истекло - - - Обязательный параметр не передан - - - Недопустимое значение (не входит в список допустимых) - - - Значение неприменимо в данном контексте (пояснения вы получите в поле message) - - - Нельзя изменить свои собственные данные - - - Нельзя изменить данные владельца - - - Значение уже назначено - - - Недостаточно прав для выполнения действия (пояснения вы получите в поле message) - - - Доступ запрещён (недостаточно прав) - - - Доступ запрещён - - - Некорректные параметры запроса (пояснения вы получите в поле message) - - - Требуется оплата - - - Значение слишком короткое (пояснения вы получите в поле message) - - - Значение слишком длинное (пояснения вы получите в поле message) - - - Использовано зарезервированное системное слово (here, all) - - - Тип события webhook - - - Создание - - - Обновление - - - Удаление - - - diff --git a/sdk/csharp/generated/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/sdk/csharp/generated/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs deleted file mode 100644 index 2217181c..00000000 --- a/sdk/csharp/generated/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfo.cs b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfo.cs deleted file mode 100644 index 725d2351..00000000 --- a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfo.cs +++ /dev/null @@ -1,24 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("Pachca")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyDescriptionAttribute("Official Pachca API SDK for .NET")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("0.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("0.0.0+a15ad39036f4480e143b58e9993369b3756f5aa1")] -[assembly: System.Reflection.AssemblyProductAttribute("Pachca")] -[assembly: System.Reflection.AssemblyTitleAttribute("Pachca")] -[assembly: System.Reflection.AssemblyVersionAttribute("0.0.0.0")] -[assembly: System.Reflection.AssemblyMetadataAttribute("RepositoryUrl", "https://github.com/pachca/openapi")] - -// Создано классом WriteCodeFragment MSBuild. - diff --git a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfoInputs.cache b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfoInputs.cache deleted file mode 100644 index 92654dd7..00000000 --- a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -b403c306e5305f6eedbdf2651408342cc0d70e5d4b4a80c79ecdbd65bfd3cca5 diff --git a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.GeneratedMSBuildEditorConfig.editorconfig b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index fc6679e1..00000000 --- a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -is_global = true -build_property.TargetFramework = net8.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = Pachca.Sdk -build_property.ProjectDir = /Users/andrewlukin/Documents/openapi/sdk/csharp/generated/ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.assets.cache b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.assets.cache deleted file mode 100644 index 6d0d11ad787f64072835fbecf3101035ca0b2936..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 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 Nj+pO%cK?J1egizj?j`^L diff --git a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.pdb b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.pdb deleted file mode 100644 index d62b3868ee302c5749d575a78cffab4a94dfcd1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71812 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 - - - Pachca - - - - Тип аудит-события - - - Пользователь успешно вошел в систему - - - Пользователь вышел из системы - - - Неудачная попытка двухфакторной аутентификации - - - Успешная двухфакторная аутентификация - - - Создана новая учетная запись пользователя - - - Учетная запись пользователя удалена - - - Роль пользователя была изменена - - - Данные пользователя обновлены - - - Создан новый тег - - - Тег удален - - - Пользователь добавлен в тег - - - Пользователь удален из тега - - - Создан новый чат - - - Чат переименован - - - Изменены права доступа к чату - - - Пользователь присоединился к чату - - - Пользователь покинул чат - - - Тег добавлен в чат - - - Тег удален из чата - - - Сообщение отредактировано - - - Сообщение удалено - - - Сообщение создано - - - Реакция добавлена - - - Реакция удалена - - - Тред создан - - - Создан новый токен доступа - - - Токен доступа обновлен - - - Токен доступа удален - - - Данные зашифрованы - - - Данные расшифрованы - - - Доступ к журналам аудита получен - - - Срабатывание правила DLP-системы - - - Поиск сотрудников через API - - - Поиск чатов через API - - - Поиск сообщений через API - - - Доступность чатов для пользователя - - - Чаты, где пользователь является участником - - - Все открытые чаты компании, вне зависимости от участия в них пользователя - - - Роль участника чата - - - Админ - - - Редактор (доступно только для каналов) - - - Участник или подписчик - - - Роль участника чата (с фильтром все) - - - Любая роль - - - Создатель - - - Админ - - - Редактор - - - Участник/подписчик - - - Тип чата - - - Канал или беседа - - - Тред - - - Тип данных дополнительного поля - - - Строковое значение - - - Числовое значение - - - Дата - - - Ссылка - - - Тип файла - - - Обычный файл - - - Изображение - - - Статус приглашения пользователя - - - Принято - - - Отправлено - - - Тип события webhook для участников - - - Добавление - - - Удаление - - - Тип сущности для сообщений - - - Беседа или канал - - - Тред - - - Пользователь - - - Скоуп доступа OAuth токена - - - Просмотр чатов и списка чатов - - - Создание новых чатов - - - Изменение настроек чата - - - Архивация и разархивация чатов - - - Выход из чатов - - - Просмотр участников чата - - - Добавление, изменение и удаление участников чата - - - Скачивание экспортов чата - - - Создание экспортов чата - - - Просмотр сообщений в чатах - - - Отправка сообщений - - - Редактирование сообщений - - - Удаление сообщений - - - Просмотр реакций на сообщения - - - Добавление и удаление реакций - - - Закрепление и открепление сообщений - - - Просмотр тредов (комментариев) - - - Создание тредов (комментариев) - - - Unfurl (разворачивание ссылок) - - - Просмотр информации о сотрудниках и списка сотрудников - - - Создание новых сотрудников - - - Редактирование данных сотрудника - - - Удаление сотрудников - - - Просмотр тегов - - - Создание, редактирование и удаление тегов - - - Изменение настроек бота - - - Просмотр информации о своем профиле - - - Просмотр статуса профиля - - - Изменение и удаление статуса профиля - - - Просмотр статуса сотрудника - - - Изменение и удаление статуса сотрудника - - - Просмотр дополнительных полей - - - Просмотр журнала аудита - - - Просмотр задач - - - Создание задач - - - Изменение задачи - - - Удаление задачи - - - Скачивание файлов - - - Загрузка файлов - - - Получение данных для загрузки файлов - - - Открытие форм (представлений) - - - Просмотр вебхуков - - - Создание и управление вебхуками - - - Просмотр лога вебхуков - - - Удаление записи в логе вебхука - - - Поиск сотрудников - - - Поиск чатов - - - Поиск сообщений - - - Тип события webhook для реакций - - - Создание - - - Удаление - - - Тип сущности для поиска - - - Пользователь - - - Задача - - - Сортировка результатов поиска - - - По релевантности - - - По алфавиту - - - Порядок сортировки - - - По возрастанию - - - По убыванию - - - Тип задачи - - - Позвонить контакту - - - Встреча - - - Простое напоминание - - - Событие - - - Написать письмо - - - Статус напоминания - - - Выполнено - - - Активно - - - Тип события webhook для пользователей - - - Приглашение - - - Подтверждение - - - Обновление - - - Приостановка - - - Активация - - - Удаление - - - Роль пользователя в системе - - - Администратор - - - Сотрудник - - - Мульти-гость - - - Гость - - - Роль пользователя, допустимая при создании и редактировании. Роль `guest` недоступна для установки через API. - - - Администратор - - - Сотрудник - - - Мульти-гость - - - Коды ошибок валидации - - - Обязательное поле (не может быть пустым) - - - Слишком длинное значение (пояснения вы получите в поле message) - - - Поле не соответствует правилам (пояснения вы получите в поле message) - - - Поле имеет непредусмотренное значение - - - Поле имеет недопустимое значение - - - Название для этого поля уже существует - - - Emoji статуса не может содержать значения отличные от Emoji символа - - - Объект не найден - - - Объект уже существует (пояснения вы получите в поле message) - - - Ошибка личного чата (пояснения вы получите в поле message) - - - Отображаемая ошибка (пояснения вы получите в поле message) - - - Действие запрещено - - - Выбран слишком большой диапазон дат - - - Некорректный URL вебхука - - - Достигнут лимит запросов - - - Превышен лимит активных сотрудников (пояснения вы получите в поле message) - - - Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций) - - - Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций) - - - Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций) - - - Ошибка выполнения запроса (пояснения вы получите в поле message) - - - Не удалось найти идентификатор события - - - Время жизни идентификатора события истекло - - - Обязательный параметр не передан - - - Недопустимое значение (не входит в список допустимых) - - - Значение неприменимо в данном контексте (пояснения вы получите в поле message) - - - Нельзя изменить свои собственные данные - - - Нельзя изменить данные владельца - - - Значение уже назначено - - - Недостаточно прав для выполнения действия (пояснения вы получите в поле message) - - - Доступ запрещён (недостаточно прав) - - - Доступ запрещён - - - Некорректные параметры запроса (пояснения вы получите в поле message) - - - Требуется оплата - - - Значение слишком короткое (пояснения вы получите в поле message) - - - Значение слишком длинное (пояснения вы получите в поле message) - - - Использовано зарезервированное системное слово (here, all) - - - Тип события webhook - - - Создание - - - Обновление - - - Удаление - - - diff --git a/sdk/csharp/generated/obj/Debug/net8.0/ref/Pachca.dll b/sdk/csharp/generated/obj/Debug/net8.0/ref/Pachca.dll deleted file mode 100644 index fe96e21c897055244c58d75c4ae02a0d936b244a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98304 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 diff --git a/sdk/csharp/generated/obj/Debug/net8.0/refint/Pachca.dll b/sdk/csharp/generated/obj/Debug/net8.0/refint/Pachca.dll deleted file mode 100644 index fe96e21c897055244c58d75c4ae02a0d936b244a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98304 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 diff --git a/sdk/csharp/generated/obj/Pachca.csproj.nuget.dgspec.json b/sdk/csharp/generated/obj/Pachca.csproj.nuget.dgspec.json deleted file mode 100644 index b309f27e..00000000 --- a/sdk/csharp/generated/obj/Pachca.csproj.nuget.dgspec.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "format": 1, - "restore": { - "/Users/andrewlukin/Documents/openapi/sdk/csharp/generated/Pachca.csproj": {} - }, - "projects": { - "/Users/andrewlukin/Documents/openapi/sdk/csharp/generated/Pachca.csproj": { - "version": "0.0.0", - "restore": { - "projectUniqueName": "/Users/andrewlukin/Documents/openapi/sdk/csharp/generated/Pachca.csproj", - "projectName": "Pachca.Sdk", - "projectPath": "/Users/andrewlukin/Documents/openapi/sdk/csharp/generated/Pachca.csproj", - "packagesPath": "/Users/andrewlukin/.nuget/packages/", - "outputPath": "/Users/andrewlukin/Documents/openapi/sdk/csharp/generated/obj/", - "projectStyle": "PackageReference", - "configFilePaths": [ - "/Users/andrewlukin/.nuget/NuGet/NuGet.Config" - ], - "originalTargetFrameworks": [ - "net8.0" - ], - "sources": { - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net8.0": { - "targetAlias": "net8.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net8.0": { - "targetAlias": "net8.0", - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "/opt/homebrew/Cellar/dotnet@8/8.0.125/libexec/sdk/8.0.125/PortableRuntimeIdentifierGraph.json" - } - } - } - } -} \ No newline at end of file diff --git a/sdk/csharp/generated/obj/Pachca.csproj.nuget.g.props b/sdk/csharp/generated/obj/Pachca.csproj.nuget.g.props deleted file mode 100644 index eef70482..00000000 --- a/sdk/csharp/generated/obj/Pachca.csproj.nuget.g.props +++ /dev/null @@ -1,15 +0,0 @@ - - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - /Users/andrewlukin/.nuget/packages/ - /Users/andrewlukin/.nuget/packages/ - PackageReference - 6.8.1 - - - - - \ No newline at end of file diff --git a/sdk/csharp/generated/obj/Pachca.csproj.nuget.g.targets b/sdk/csharp/generated/obj/Pachca.csproj.nuget.g.targets deleted file mode 100644 index 3dc06ef3..00000000 --- a/sdk/csharp/generated/obj/Pachca.csproj.nuget.g.targets +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/sdk/csharp/generated/obj/project.assets.json b/sdk/csharp/generated/obj/project.assets.json deleted file mode 100644 index 7930959b..00000000 --- a/sdk/csharp/generated/obj/project.assets.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "version": 3, - "targets": { - "net8.0": {} - }, - "libraries": {}, - "projectFileDependencyGroups": { - "net8.0": [] - }, - "packageFolders": { - "/Users/andrewlukin/.nuget/packages/": {} - }, - "project": { - "version": "0.0.0", - "restore": { - "projectUniqueName": "/Users/andrewlukin/Documents/openapi/sdk/csharp/generated/Pachca.csproj", - "projectName": "Pachca.Sdk", - "projectPath": "/Users/andrewlukin/Documents/openapi/sdk/csharp/generated/Pachca.csproj", - "packagesPath": "/Users/andrewlukin/.nuget/packages/", - "outputPath": "/Users/andrewlukin/Documents/openapi/sdk/csharp/generated/obj/", - "projectStyle": "PackageReference", - "configFilePaths": [ - "/Users/andrewlukin/.nuget/NuGet/NuGet.Config" - ], - "originalTargetFrameworks": [ - "net8.0" - ], - "sources": { - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net8.0": { - "targetAlias": "net8.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - } - }, - "frameworks": { - "net8.0": { - "targetAlias": "net8.0", - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "/opt/homebrew/Cellar/dotnet@8/8.0.125/libexec/sdk/8.0.125/PortableRuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/sdk/csharp/generated/obj/project.nuget.cache b/sdk/csharp/generated/obj/project.nuget.cache deleted file mode 100644 index 132d7824..00000000 --- a/sdk/csharp/generated/obj/project.nuget.cache +++ /dev/null @@ -1,8 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "EsF0dhpSvN5RxBolXraPjyKJhwoYbA4L4PT1mL2LU87aszKSFQpEr6oy9iCdM+ew2Y58XdYssXgeQmK1FI76EQ==", - "success": true, - "projectFilePath": "/Users/andrewlukin/Documents/openapi/sdk/csharp/generated/Pachca.csproj", - "expectedPackageFiles": [], - "logs": [] -} \ No newline at end of file From eb58c5ecf25b4f8121aee4cdaa557985f39933b1 Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 22:53:07 +0300 Subject: [PATCH 15/37] feat(n8n): bug fixes, 77 new tests, SDK docs cleanup n8n fixes: - Fix filename sanitization: filter control chars + null bytes, truncate to 255 - Fix resolveResourceLocator: throw on null/undefined/empty values - Fix splitAndValidateCommaList: reject floats in int mode (Number.isInteger) - Fix replay protection: reject far-future timestamps (>1min), not just old n8n tests (3 new files, 77 tests): - trigger.test.ts: event filtering, signature verification, IP allowlist, replay protection - webhook-lifecycle.test.ts: checkExists, create, delete lifecycle methods - load-options.test.ts: formatUserName, searchChats, searchUsers, searchEntities, getCustomProperties SDK: - Remove hardcoded versions from SDK READMEs and docs (use latest/latest.release) - Fix SDK CI: skip commit/tag/release when no SDK files changed (any_changed output) --- .github/workflows/sdk.yml | 55 +- apps/docs/content/guides/sdk/kotlin.mdx | 2 +- apps/docs/content/guides/sdk/swift.mdx | 2 +- .../n8n/nodes/Pachca/GenericFunctions.ts | 14 +- .../n8n/nodes/Pachca/PachcaTrigger.node.ts | 2 +- integrations/n8n/scripts/generate-n8n.ts | 2 +- integrations/n8n/tests/load-options.test.ts | 311 +++++++++++ integrations/n8n/tests/trigger.test.ts | 507 ++++++++++++++++++ .../n8n/tests/webhook-lifecycle.test.ts | 254 +++++++++ sdk/go/README.md | 2 +- sdk/kotlin/README.md | 2 +- sdk/python/generated/README.md | 2 +- sdk/swift/README.md | 2 +- sdk/typescript/README.md | 2 +- 14 files changed, 1129 insertions(+), 30 deletions(-) create mode 100644 integrations/n8n/tests/load-options.test.ts create mode 100644 integrations/n8n/tests/trigger.test.ts create mode 100644 integrations/n8n/tests/webhook-lifecycle.test.ts diff --git a/.github/workflows/sdk.yml b/.github/workflows/sdk.yml index 3be08aa7..fa7e47ed 100644 --- a/.github/workflows/sdk.yml +++ b/.github/workflows/sdk.yml @@ -15,6 +15,13 @@ jobs: contents: write outputs: version: ${{ steps.version.outputs.version }} + any_sdk_changed: ${{ steps.sdk_changes.outputs.any_changed }} + ts_changed: ${{ steps.sdk_changes.outputs.ts_changed }} + go_changed: ${{ steps.sdk_changes.outputs.go_changed }} + kotlin_changed: ${{ steps.sdk_changes.outputs.kotlin_changed }} + python_changed: ${{ steps.sdk_changes.outputs.python_changed }} + csharp_changed: ${{ steps.sdk_changes.outputs.csharp_changed }} + swift_changed: ${{ steps.sdk_changes.outputs.swift_changed }} cli_changed: ${{ steps.cli_check.outputs.changed }} steps: - uses: actions/checkout@v4 @@ -36,12 +43,23 @@ jobs: - name: Check for SDK changes id: sdk_changes run: | - echo "ts_changed=$(git diff --name-only -- sdk/typescript/ | grep -q . && echo true || echo false)" >> $GITHUB_OUTPUT - echo "go_changed=$(git diff --name-only -- sdk/go/ | grep -q . && echo true || echo false)" >> $GITHUB_OUTPUT - echo "kotlin_changed=$(git diff --name-only -- sdk/kotlin/ | grep -q . && echo true || echo false)" >> $GITHUB_OUTPUT - echo "python_changed=$(git diff --name-only -- sdk/python/ | grep -q . && echo true || echo false)" >> $GITHUB_OUTPUT - echo "csharp_changed=$(git diff --name-only -- sdk/csharp/ | grep -q . && echo true || echo false)" >> $GITHUB_OUTPUT - echo "swift_changed=$(git diff --name-only -- sdk/swift/ | grep -q . && echo true || echo false)" >> $GITHUB_OUTPUT + TS=$(git diff --name-only -- sdk/typescript/ | grep -q . && echo true || echo false) + GO=$(git diff --name-only -- sdk/go/ | grep -q . && echo true || echo false) + KT=$(git diff --name-only -- sdk/kotlin/ | grep -q . && echo true || echo false) + PY=$(git diff --name-only -- sdk/python/ | grep -q . && echo true || echo false) + CS=$(git diff --name-only -- sdk/csharp/ | grep -q . && echo true || echo false) + SW=$(git diff --name-only -- sdk/swift/ | grep -q . && echo true || echo false) + echo "ts_changed=$TS" >> $GITHUB_OUTPUT + echo "go_changed=$GO" >> $GITHUB_OUTPUT + echo "kotlin_changed=$KT" >> $GITHUB_OUTPUT + echo "python_changed=$PY" >> $GITHUB_OUTPUT + echo "csharp_changed=$CS" >> $GITHUB_OUTPUT + echo "swift_changed=$SW" >> $GITHUB_OUTPUT + if [ "$TS" = "true" ] || [ "$GO" = "true" ] || [ "$KT" = "true" ] || [ "$PY" = "true" ] || [ "$CS" = "true" ] || [ "$SW" = "true" ]; then + echo "any_changed=true" >> $GITHUB_OUTPUT + else + echo "any_changed=false" >> $GITHUB_OUTPUT + fi - name: Check for CLI changes if: github.event_name == 'push' @@ -98,11 +116,11 @@ jobs: run: swift build - name: Copy Swift Package.swift to root - if: github.event_name == 'push' + if: github.event_name == 'push' && steps.sdk_changes.outputs.swift_changed == 'true' run: cp sdk/swift/Package.swift Package.swift - name: Extract version - if: github.event_name == 'push' + if: github.event_name == 'push' && steps.sdk_changes.outputs.any_changed == 'true' id: version run: | SPEC_VERSION=$(grep -oP 'version:\s*"\K[^"]+' packages/spec/typespec.tsp) @@ -121,7 +139,7 @@ jobs: echo "version=$VERSION" >> $GITHUB_OUTPUT - name: Commit - if: github.event_name == 'push' + if: github.event_name == 'push' && steps.sdk_changes.outputs.any_changed == 'true' run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" @@ -129,17 +147,18 @@ jobs: git diff --staged --quiet || git commit -m "chore: regenerate SDK v${{ steps.version.outputs.version }}" - name: Tag - if: github.event_name == 'push' - run: | - git tag -f "v${{ steps.version.outputs.version }}" - git tag -f "sdk/go/generated/v${{ steps.version.outputs.version }}" + if: github.event_name == 'push' && steps.sdk_changes.outputs.any_changed == 'true' + run: git tag -f "v${{ steps.version.outputs.version }}" + - name: Tag Go SDK + if: github.event_name == 'push' && steps.sdk_changes.outputs.go_changed == 'true' + run: git tag -f "sdk/go/generated/v${{ steps.version.outputs.version }}" - name: Push - if: github.event_name == 'push' + if: github.event_name == 'push' && steps.sdk_changes.outputs.any_changed == 'true' run: git push && git push --tags --force publish-ts: - if: github.event_name == 'push' + if: github.event_name == 'push' && needs.generate-and-build.outputs.ts_changed == 'true' needs: generate-and-build runs-on: ubuntu-latest permissions: @@ -240,7 +259,7 @@ jobs: } publish-py: - if: github.event_name == 'push' + if: github.event_name == 'push' && needs.generate-and-build.outputs.python_changed == 'true' needs: generate-and-build runs-on: ubuntu-latest steps: @@ -265,7 +284,7 @@ jobs: TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} publish-kt: - if: github.event_name == 'push' + if: github.event_name == 'push' && needs.generate-and-build.outputs.kotlin_changed == 'true' needs: generate-and-build runs-on: ubuntu-latest steps: @@ -274,7 +293,7 @@ jobs: version: v${{ needs.generate-and-build.outputs.version }} publish-cs: - if: github.event_name == 'push' + if: github.event_name == 'push' && needs.generate-and-build.outputs.csharp_changed == 'true' needs: generate-and-build runs-on: ubuntu-latest steps: diff --git a/apps/docs/content/guides/sdk/kotlin.mdx b/apps/docs/content/guides/sdk/kotlin.mdx index b3611926..7e220b26 100644 --- a/apps/docs/content/guides/sdk/kotlin.mdx +++ b/apps/docs/content/guides/sdk/kotlin.mdx @@ -20,7 +20,7 @@ description: Типизированный клиент для Pachca API на Ko ```kotlin dependencies { - implementation("com.pachca:pachca-sdk:1.0.1") + implementation("com.pachca:pachca-sdk:latest.release") } ``` diff --git a/apps/docs/content/guides/sdk/swift.mdx b/apps/docs/content/guides/sdk/swift.mdx index 35228aa0..605c8668 100644 --- a/apps/docs/content/guides/sdk/swift.mdx +++ b/apps/docs/content/guides/sdk/swift.mdx @@ -20,7 +20,7 @@ description: Типизированный клиент для Pachca API на Sw ```swift dependencies: [ - .package(url: "https://github.com/pachca/openapi", from: "1.0.1") + .package(url: "https://github.com/pachca/openapi", from: "1.0.0") ] ``` diff --git a/integrations/n8n/nodes/Pachca/GenericFunctions.ts b/integrations/n8n/nodes/Pachca/GenericFunctions.ts index fa90a919..657174b1 100644 --- a/integrations/n8n/nodes/Pachca/GenericFunctions.ts +++ b/integrations/n8n/nodes/Pachca/GenericFunctions.ts @@ -273,7 +273,8 @@ export function buildMultipartBody( const boundary = `----WebKitFormBoundary${crypto.randomBytes(16).toString('hex')}`; const parts: Buffer[] = []; // Sanitize filename: strip CRLF and quotes to prevent header injection - const safeName = fileName.replace(/[\r\n\\"]/g, '_'); + // eslint-disable-next-line no-control-regex + const safeName = fileName.replace(/[\x00-\x1f\x7f\\"]/g, '_').slice(0, 255); // Policy fields first (order matters for S3) for (const [key, value] of Object.entries(fields)) { @@ -566,7 +567,14 @@ export function resolveResourceLocator( } } if (typeof value === 'object' && value !== null && (value as IDataObject).__rl) { - return (value as IDataObject).value as number | string; + const rlValue = (value as IDataObject).value; + if (rlValue === null || rlValue === undefined || rlValue === '') { + throw new NodeOperationError(ctx.getNode(), `Parameter "${paramName}" is empty`, { itemIndex }); + } + return rlValue as number | string; + } + if (value === null || value === undefined || value === '') { + throw new NodeOperationError(ctx.getNode(), `Parameter "${paramName}" is empty`, { itemIndex }); } return value as number | string; } @@ -869,7 +877,7 @@ export function splitAndValidateCommaList( ): (number | string)[] { const arr = value.split(',').map(s => s.trim()).filter(Boolean); if (type === 'int') { - const invalid = arr.filter(id => isNaN(Number(id))); + const invalid = arr.filter(id => !Number.isInteger(Number(id))); if (invalid.length) { throw new NodeOperationError(ctx.getNode(), `${fieldName} must be numbers. Invalid values: ${invalid.join(', ')}`, diff --git a/integrations/n8n/nodes/Pachca/PachcaTrigger.node.ts b/integrations/n8n/nodes/Pachca/PachcaTrigger.node.ts index a467ee2f..b64bbfef 100644 --- a/integrations/n8n/nodes/Pachca/PachcaTrigger.node.ts +++ b/integrations/n8n/nodes/Pachca/PachcaTrigger.node.ts @@ -194,7 +194,7 @@ export class PachcaTrigger implements INodeType { const webhookTs = body.webhook_timestamp as number | undefined; if (webhookTs) { const ageMs = Date.now() - webhookTs * 1000; - if (Math.abs(ageMs) > 5 * 60 * 1000) { + if (ageMs < -60_000 || ageMs > 5 * 60 * 1000) { return { webhookResponse: 'Rejected' }; } } diff --git a/integrations/n8n/scripts/generate-n8n.ts b/integrations/n8n/scripts/generate-n8n.ts index 6128a4e8..03b86a0c 100644 --- a/integrations/n8n/scripts/generate-n8n.ts +++ b/integrations/n8n/scripts/generate-n8n.ts @@ -2425,7 +2425,7 @@ ${optionEntries} \t\tconst webhookTs = body.webhook_timestamp as number | undefined; \t\tif (webhookTs) { \t\t\tconst ageMs = Date.now() - webhookTs * 1000; -\t\t\tif (Math.abs(ageMs) > 5 * 60 * 1000) { +\t\t\tif (ageMs < -60_000 || ageMs > 5 * 60 * 1000) { \t\t\t\treturn { webhookResponse: 'Rejected' }; \t\t\t} \t\t} diff --git a/integrations/n8n/tests/load-options.test.ts b/integrations/n8n/tests/load-options.test.ts new file mode 100644 index 00000000..5405132f --- /dev/null +++ b/integrations/n8n/tests/load-options.test.ts @@ -0,0 +1,311 @@ +import { describe, it, expect, vi } from 'vitest'; +import type { ILoadOptionsFunctions } from 'n8n-workflow'; +import { + formatUserName, + searchChats, + searchUsers, + searchEntities, + getCustomProperties, +} from '../nodes/Pachca/GenericFunctions'; + +// ============================================================================ +// Helpers +// ============================================================================ + +const BASE_URL = 'https://api.pachca.com/api/shared/v1'; + +function createLoadCtx(overrides: { + httpResponses?: unknown[]; + params?: Record; +} = {}): ILoadOptionsFunctions { + let callIndex = 0; + const responses = overrides.httpResponses ?? [{ data: [] }]; + const params = overrides.params ?? {}; + + return { + getCredentials: vi.fn(async () => ({ + baseUrl: BASE_URL, + accessToken: 'test-token', + })), + getNodeParameter: vi.fn((name: string) => { + if (name in params) return params[name]; + throw new Error(`Missing parameter: ${name}`); + }), + getCurrentNodeParameter: vi.fn((name: string) => { + if (name in params) return params[name]; + throw new Error(`Missing parameter: ${name}`); + }), + helpers: { + httpRequestWithAuthentication: vi.fn(async () => { + const idx = callIndex++; + const resp = responses[idx % responses.length]; + if (resp instanceof Error) throw resp; + return resp; + }), + }, + } as unknown as ILoadOptionsFunctions; +} + +// ============================================================================ +// formatUserName +// ============================================================================ + +describe('formatUserName', () => { + it('should format full name with nickname', () => { + expect(formatUserName({ first_name: 'John', last_name: 'Doe', nickname: 'jdoe' })) + .toBe('John Doe (@jdoe)'); + }); + + it('should format full name without nickname', () => { + expect(formatUserName({ first_name: 'John', last_name: 'Doe', nickname: '' })) + .toBe('John Doe'); + }); + + it('should use only first name when last name is empty', () => { + expect(formatUserName({ first_name: 'John', last_name: '', nickname: '' })) + .toBe('John'); + }); + + it('should use nickname when name is empty', () => { + expect(formatUserName({ first_name: '', last_name: '', nickname: 'jdoe' })) + .toBe('jdoe (@jdoe)'); + }); + + it('should fall back to "User" when everything is empty', () => { + expect(formatUserName({ first_name: '', last_name: '', nickname: '' })) + .toBe('User'); + }); + + it('should filter out "null" string values', () => { + expect(formatUserName({ first_name: 'null', last_name: 'null', nickname: 'real' })) + .toBe('real (@real)'); + }); + + it('should handle null values via != null check', () => { + expect(formatUserName({ first_name: null as unknown as string, last_name: 'Smith', nickname: '' })) + .toBe('Smith'); + }); +}); + +// ============================================================================ +// searchChats +// ============================================================================ + +describe('searchChats', () => { + it('should search chats with filter query', async () => { + const ctx = createLoadCtx({ + httpResponses: [{ + data: [ + { id: 1, name: 'General' }, + { id: 2, name: 'Dev Team' }, + ], + }], + }); + + const result = await searchChats.call(ctx, 'dev'); + expect(result.results).toEqual([ + { name: 'General', value: 1 }, + { name: 'Dev Team', value: 2 }, + ]); + + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + expect(httpMock.mock.calls[0][1].url).toContain('/search/chats?query=dev'); + }); + + it('should encode filter query', async () => { + const ctx = createLoadCtx({ httpResponses: [{ data: [] }] }); + await searchChats.call(ctx, 'hello world'); + + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + expect(httpMock.mock.calls[0][1].url).toContain('query=hello%20world'); + }); + + it('should list chats without filter (paginated)', async () => { + const ctx = createLoadCtx({ + httpResponses: [{ + data: [{ id: 1, name: 'Chat 1' }], + meta: { paginate: { next_page: 'cursor-abc' } }, + }], + }); + + const result = await searchChats.call(ctx, undefined); + expect(result.results).toEqual([{ name: 'Chat 1', value: 1 }]); + expect(result.paginationToken).toBe('cursor-abc'); + + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + expect(httpMock.mock.calls[0][1].url).toContain('/chats?per=50'); + }); + + it('should pass pagination cursor', async () => { + const ctx = createLoadCtx({ + httpResponses: [{ + data: [{ id: 2, name: 'Chat 2' }], + meta: { paginate: {} }, + }], + }); + + const result = await searchChats.call(ctx, undefined, 'cursor-abc'); + expect(result.paginationToken).toBeUndefined(); + + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + expect(httpMock.mock.calls[0][1].url).toContain('cursor=cursor-abc'); + }); + + it('should return empty results when data is missing', async () => { + const ctx = createLoadCtx({ httpResponses: [{}] }); + const result = await searchChats.call(ctx, 'test'); + expect(result.results).toEqual([]); + }); +}); + +// ============================================================================ +// searchUsers +// ============================================================================ + +describe('searchUsers', () => { + it('should search users with filter', async () => { + const ctx = createLoadCtx({ + httpResponses: [{ + data: [ + { id: 10, first_name: 'Alice', last_name: 'Smith', nickname: 'alice' }, + { id: 20, first_name: 'Bob', last_name: '', nickname: 'bob' }, + ], + }], + }); + + const result = await searchUsers.call(ctx, 'ali'); + expect(result.results).toEqual([ + { name: 'Alice Smith (@alice)', value: 10 }, + { name: 'Bob (@bob)', value: 20 }, + ]); + }); + + it('should return empty results without filter', async () => { + const ctx = createLoadCtx(); + const result = await searchUsers.call(ctx, undefined); + expect(result.results).toEqual([]); + }); + + it('should return empty results for empty filter', async () => { + const ctx = createLoadCtx(); + const result = await searchUsers.call(ctx, ''); + expect(result.results).toEqual([]); + }); + + it('should call search endpoint with encoded query', async () => { + const ctx = createLoadCtx({ httpResponses: [{ data: [] }] }); + await searchUsers.call(ctx, 'Иван'); + + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + expect(httpMock.mock.calls[0][1].url).toContain('/search/users?query='); + expect(httpMock.mock.calls[0][1].url).toContain(encodeURIComponent('Иван')); + }); +}); + +// ============================================================================ +// searchEntities +// ============================================================================ + +describe('searchEntities', () => { + it('should dispatch to searchUsers when entityType = user', async () => { + const ctx = createLoadCtx({ + params: { entityType: 'user' }, + httpResponses: [{ + data: [{ id: 1, first_name: 'Test', last_name: 'User', nickname: 'tu' }], + }], + }); + + const result = await searchEntities.call(ctx, 'test'); + expect(result.results[0].name).toContain('Test User'); + }); + + it('should return empty for thread entityType', async () => { + const ctx = createLoadCtx({ params: { entityType: 'thread' } }); + const result = await searchEntities.call(ctx, 'test'); + expect(result.results).toEqual([]); + }); + + it('should dispatch to searchChats for discussion entityType', async () => { + const ctx = createLoadCtx({ + params: { entityType: 'discussion' }, + httpResponses: [{ + data: [{ id: 5, name: 'General' }], + }], + }); + + const result = await searchEntities.call(ctx, 'gen'); + expect(result.results).toEqual([{ name: 'General', value: 5 }]); + }); + + it('should default to discussion when entityType parameter is missing', async () => { + const ctx = createLoadCtx({ + params: {}, // no entityType + httpResponses: [{ + data: [{ id: 1, name: 'Chat' }], + }], + }); + + const result = await searchEntities.call(ctx, 'chat'); + expect(result.results).toEqual([{ name: 'Chat', value: 1 }]); + }); +}); + +// ============================================================================ +// getCustomProperties +// ============================================================================ + +describe('getCustomProperties', () => { + it('should load custom properties for task resource', async () => { + const ctx = createLoadCtx({ + params: { resource: 'task' }, + httpResponses: [{ + data: [ + { id: 1, name: 'Priority' }, + { id: 2, name: 'Sprint' }, + ], + }], + }); + + const result = await getCustomProperties.call(ctx); + expect(result).toEqual([ + { name: 'Priority', value: 1 }, + { name: 'Sprint', value: 2 }, + ]); + + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + expect(httpMock.mock.calls[0][1].url).toContain('entity_type=Task'); + }); + + it('should use User entity type for non-task resources', async () => { + const ctx = createLoadCtx({ + params: { resource: 'user' }, + httpResponses: [{ data: [{ id: 3, name: 'Department' }] }], + }); + + const result = await getCustomProperties.call(ctx); + expect(result).toEqual([{ name: 'Department', value: 3 }]); + + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + expect(httpMock.mock.calls[0][1].url).toContain('entity_type=User'); + }); + + it('should return empty array when no properties exist', async () => { + const ctx = createLoadCtx({ + params: { resource: 'user' }, + httpResponses: [{ data: [] }], + }); + + const result = await getCustomProperties.call(ctx); + expect(result).toEqual([]); + }); + + it('should handle missing data in response', async () => { + const ctx = createLoadCtx({ + params: { resource: 'user' }, + httpResponses: [{}], + }); + + const result = await getCustomProperties.call(ctx); + expect(result).toEqual([]); + }); +}); diff --git a/integrations/n8n/tests/trigger.test.ts b/integrations/n8n/tests/trigger.test.ts new file mode 100644 index 00000000..50856d4f --- /dev/null +++ b/integrations/n8n/tests/trigger.test.ts @@ -0,0 +1,507 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import type { IDataObject, IWebhookFunctions } from 'n8n-workflow'; +import * as crypto from 'crypto'; +import { PachcaTrigger } from '../nodes/Pachca/PachcaTrigger.node'; + +// ============================================================================ +// Helpers +// ============================================================================ + +function hmacSha256(body: string, secret: string): string { + const hmac = crypto.createHmac('sha256', secret); + hmac.update(body); + return hmac.digest('hex'); +} + +function freshTimestamp(): number { + return Math.floor(Date.now() / 1000); +} + +interface WebhookCtxOptions { + body?: IDataObject; + headers?: Record; + event?: string; + signingSecret?: string; + webhookAllowedIps?: string; + clientIp?: string; + xForwardedFor?: string; + rawBody?: Buffer | null; + remoteAddress?: string; +} + +function createWebhookCtx(opts: WebhookCtxOptions = {}): IWebhookFunctions { + const body = opts.body ?? { type: 'message', event: 'new', content: 'hello' }; + const headerData = opts.headers ?? {}; + const event = opts.event ?? '*'; + const signingSecret = opts.signingSecret ?? ''; + const webhookAllowedIps = opts.webhookAllowedIps ?? ''; + const rawBody = opts.rawBody !== undefined ? opts.rawBody : null; + const remoteAddress = opts.remoteAddress ?? '127.0.0.1'; + const xForwardedFor = opts.xForwardedFor; + + const requestHeaders: Record = {}; + if (xForwardedFor) requestHeaders['x-forwarded-for'] = xForwardedFor; + + return { + getBodyData: vi.fn(() => body), + getHeaderData: vi.fn(() => headerData), + getCredentials: vi.fn(async () => ({ + baseUrl: 'https://api.pachca.com/api/shared/v1', + accessToken: 'test-token', + signingSecret, + webhookAllowedIps, + })), + getNodeParameter: vi.fn((_name: string) => event), + getRequestObject: vi.fn(() => ({ + headers: requestHeaders, + rawBody, + socket: { remoteAddress }, + })), + helpers: { + returnJsonArray: vi.fn((data: IDataObject) => [{ json: data }]), + }, + } as unknown as IWebhookFunctions; +} + +// ============================================================================ +// Event Filtering +// ============================================================================ + +describe('PachcaTrigger — event filtering', () => { + const trigger = new PachcaTrigger(); + + it('should pass all events when event = "*"', async () => { + const ctx = createWebhookCtx({ + body: { type: 'message', event: 'new', content: 'hi' }, + event: '*', + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); + + it('should pass matching event (new_message)', async () => { + const ctx = createWebhookCtx({ + body: { type: 'message', event: 'new', content: 'hi' }, + event: 'new_message', + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); + + it('should filter non-matching event', async () => { + const ctx = createWebhookCtx({ + body: { type: 'message', event: 'new', content: 'hi' }, + event: 'message_deleted', // expects type: message, event: delete + }); + const result = await trigger.webhook.call(ctx); + expect(result.webhookResponse).toBe('Event filtered'); + expect(result.workflowData).toBeUndefined(); + }); + + it('should pass button_pressed event', async () => { + const ctx = createWebhookCtx({ + body: { type: 'button', event: 'click', data: 'btn1' }, + event: 'button_pressed', + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); + + it('should pass form_submitted event', async () => { + const ctx = createWebhookCtx({ + body: { type: 'view', event: 'submit', callback_id: 'form1' }, + event: 'form_submitted', + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); + + it('should filter when body type mismatches', async () => { + const ctx = createWebhookCtx({ + body: { type: 'reaction', event: 'new' }, + event: 'new_message', // expects type: message + }); + const result = await trigger.webhook.call(ctx); + expect(result.webhookResponse).toBe('Event filtered'); + }); + + it('should pass company_member events', async () => { + const ctx = createWebhookCtx({ + body: { type: 'company_member', event: 'invite', user_id: 1 }, + event: 'company_member_invite', + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); +}); + +// ============================================================================ +// Signature Verification +// ============================================================================ + +describe('PachcaTrigger — signature verification', () => { + const trigger = new PachcaTrigger(); + const secret = 'my-webhook-secret'; + + it('should accept valid signature (rawBody)', async () => { + const bodyObj = { type: 'message', event: 'new', content: 'hi', webhook_timestamp: freshTimestamp() }; + const rawBodyStr = JSON.stringify(bodyObj); + const sig = hmacSha256(rawBodyStr, secret); + + const ctx = createWebhookCtx({ + body: bodyObj, + headers: { 'pachca-signature': sig }, + signingSecret: secret, + rawBody: Buffer.from(rawBodyStr), + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); + + it('should reject invalid signature', async () => { + const bodyObj = { type: 'message', event: 'new', webhook_timestamp: freshTimestamp() }; + const ctx = createWebhookCtx({ + body: bodyObj, + headers: { 'pachca-signature': 'deadbeef'.repeat(8) }, + signingSecret: secret, + rawBody: Buffer.from(JSON.stringify(bodyObj)), + }); + const result = await trigger.webhook.call(ctx); + expect(result.webhookResponse).toBe('Rejected'); + }); + + it('should reject missing signature when secret is configured', async () => { + const ctx = createWebhookCtx({ + body: { type: 'message', event: 'new', webhook_timestamp: freshTimestamp() }, + headers: {}, // no signature header + signingSecret: secret, + }); + const result = await trigger.webhook.call(ctx); + expect(result.webhookResponse).toBe('Rejected'); + }); + + it('should skip verification when no signing secret', async () => { + const ctx = createWebhookCtx({ + body: { type: 'message', event: 'new' }, + headers: {}, // no signature + signingSecret: '', + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); + + it('should use JSON.stringify fallback when rawBody is missing', async () => { + const bodyObj = { type: 'message', event: 'new', webhook_timestamp: freshTimestamp() }; + const sig = hmacSha256(JSON.stringify(bodyObj), secret); + + const ctx = createWebhookCtx({ + body: bodyObj, + headers: { 'pachca-signature': sig }, + signingSecret: secret, + rawBody: null, + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); +}); + +// ============================================================================ +// IP Allowlist +// ============================================================================ + +describe('PachcaTrigger — IP allowlist', () => { + const trigger = new PachcaTrigger(); + + it('should allow request from allowed IP', async () => { + const ctx = createWebhookCtx({ + webhookAllowedIps: '37.200.70.177', + remoteAddress: '37.200.70.177', + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); + + it('should reject request from disallowed IP', async () => { + const ctx = createWebhookCtx({ + webhookAllowedIps: '37.200.70.177', + remoteAddress: '1.2.3.4', + }); + const result = await trigger.webhook.call(ctx); + expect(result.webhookResponse).toBe('Forbidden'); + }); + + it('should normalize IPv6-mapped IPv4 (::ffff:)', async () => { + const ctx = createWebhookCtx({ + webhookAllowedIps: '37.200.70.177', + remoteAddress: '::ffff:37.200.70.177', + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); + + it('should use x-forwarded-for when present', async () => { + const ctx = createWebhookCtx({ + webhookAllowedIps: '37.200.70.177', + xForwardedFor: '37.200.70.177, 10.0.0.1', + remoteAddress: '10.0.0.1', + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); + + it('should allow all when no IPs configured', async () => { + const ctx = createWebhookCtx({ + webhookAllowedIps: '', + remoteAddress: '99.99.99.99', + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); + + it('should support multiple allowed IPs', async () => { + const ctx = createWebhookCtx({ + webhookAllowedIps: '10.0.0.1, 37.200.70.177, 192.168.1.1', + remoteAddress: '192.168.1.1', + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); +}); + +// ============================================================================ +// Replay Protection +// ============================================================================ + +describe('PachcaTrigger — replay protection', () => { + const trigger = new PachcaTrigger(); + + it('should accept fresh timestamp', async () => { + const ctx = createWebhookCtx({ + body: { type: 'message', event: 'new', webhook_timestamp: freshTimestamp() }, + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); + + it('should reject old timestamp (> 5 minutes)', async () => { + const oldTs = Math.floor(Date.now() / 1000) - 6 * 60; // 6 minutes ago + const ctx = createWebhookCtx({ + body: { type: 'message', event: 'new', webhook_timestamp: oldTs }, + }); + const result = await trigger.webhook.call(ctx); + expect(result.webhookResponse).toBe('Rejected'); + }); + + it('should reject far-future timestamp (> 1 minute ahead)', async () => { + const futureTs = Math.floor(Date.now() / 1000) + 2 * 60; // 2 minutes in the future + const ctx = createWebhookCtx({ + body: { type: 'message', event: 'new', webhook_timestamp: futureTs }, + }); + const result = await trigger.webhook.call(ctx); + expect(result.webhookResponse).toBe('Rejected'); + }); + + it('should accept slightly-future timestamp (within 1 minute)', async () => { + const nearFutureTs = Math.floor(Date.now() / 1000) + 30; // 30 seconds ahead + const ctx = createWebhookCtx({ + body: { type: 'message', event: 'new', webhook_timestamp: nearFutureTs }, + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); + + it('should skip check when no timestamp in body', async () => { + const ctx = createWebhookCtx({ + body: { type: 'message', event: 'new' }, // no webhook_timestamp + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); + + it('should accept timestamp exactly at 5-minute boundary', async () => { + // 4 minutes 59 seconds ago — should pass + const ts = Math.floor(Date.now() / 1000) - 4 * 60 - 59; + const ctx = createWebhookCtx({ + body: { type: 'message', event: 'new', webhook_timestamp: ts }, + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); +}); + +// ============================================================================ +// Combined scenarios +// ============================================================================ + +describe('PachcaTrigger — combined checks', () => { + const trigger = new PachcaTrigger(); + const secret = 'test-secret'; + + it('IP check runs before signature check', async () => { + // Blocked IP — should get Forbidden even without signature + const ctx = createWebhookCtx({ + webhookAllowedIps: '10.0.0.1', + remoteAddress: '99.99.99.99', + signingSecret: secret, + headers: {}, // no signature + }); + const result = await trigger.webhook.call(ctx); + expect(result.webhookResponse).toBe('Forbidden'); + }); + + it('signature check runs before replay check', async () => { + const oldTs = Math.floor(Date.now() / 1000) - 10 * 60; + const bodyObj = { type: 'message', event: 'new', webhook_timestamp: oldTs }; + const ctx = createWebhookCtx({ + body: bodyObj, + headers: { 'pachca-signature': 'invalid' }, + signingSecret: secret, + rawBody: Buffer.from(JSON.stringify(bodyObj)), + }); + const result = await trigger.webhook.call(ctx); + // Should be Rejected (sig fails), not Rejected from replay + expect(result.webhookResponse).toBe('Rejected'); + }); + + it('full valid request: IP + signature + fresh timestamp + matching event', async () => { + const bodyObj = { type: 'message', event: 'new', content: 'hi', webhook_timestamp: freshTimestamp() }; + const rawBodyStr = JSON.stringify(bodyObj); + const sig = hmacSha256(rawBodyStr, secret); + + const ctx = createWebhookCtx({ + body: bodyObj, + headers: { 'pachca-signature': sig }, + event: 'new_message', + signingSecret: secret, + webhookAllowedIps: '37.200.70.177', + remoteAddress: '37.200.70.177', + rawBody: Buffer.from(rawBodyStr), + }); + const result = await trigger.webhook.call(ctx); + expect(result.workflowData).toBeDefined(); + }); +}); + +// ============================================================================ +// resolveResourceLocator null/undefined guard +// ============================================================================ + +describe('resolveResourceLocator — null/undefined guard', () => { + // Imported separately to test the fix + let resolveResourceLocator: typeof import('../nodes/Pachca/GenericFunctions').resolveResourceLocator; + + beforeEach(async () => { + const mod = await import('../nodes/Pachca/GenericFunctions'); + resolveResourceLocator = mod.resolveResourceLocator; + }); + + function createCtx(params: Record) { + return { + getNodeParameter: vi.fn((name: string) => { + if (name in params) return params[name]; + throw new Error(`Missing parameter: ${name}`); + }), + getNode: vi.fn(() => ({ id: 'test', name: 'Test', type: 'test', typeVersion: 2, position: [0, 0], parameters: {} })), + } as unknown as import('n8n-workflow').IExecuteFunctions; + } + + it('should throw on null value', () => { + const ctx = createCtx({ id: null }); + expect(() => resolveResourceLocator(ctx, 'id', 0)).toThrow('empty'); + }); + + it('should throw on undefined value', () => { + const ctx = createCtx({ id: undefined }); + expect(() => resolveResourceLocator(ctx, 'id', 0)).toThrow('empty'); + }); + + it('should throw on empty string value', () => { + const ctx = createCtx({ id: '' }); + expect(() => resolveResourceLocator(ctx, 'id', 0)).toThrow('empty'); + }); + + it('should throw on empty ResourceLocator value', () => { + const ctx = createCtx({ id: { __rl: true, value: '', mode: 'id' } }); + expect(() => resolveResourceLocator(ctx, 'id', 0)).toThrow('empty'); + }); + + it('should pass valid number', () => { + const ctx = createCtx({ id: 42 }); + expect(resolveResourceLocator(ctx, 'id', 0)).toBe(42); + }); + + it('should pass valid ResourceLocator', () => { + const ctx = createCtx({ id: { __rl: true, value: 123, mode: 'id' } }); + expect(resolveResourceLocator(ctx, 'id', 0)).toBe(123); + }); +}); + +// ============================================================================ +// splitAndValidateCommaList — float rejection +// ============================================================================ + +describe('splitAndValidateCommaList — float rejection', () => { + let splitAndValidateCommaList: typeof import('../nodes/Pachca/GenericFunctions').splitAndValidateCommaList; + + beforeEach(async () => { + const mod = await import('../nodes/Pachca/GenericFunctions'); + splitAndValidateCommaList = mod.splitAndValidateCommaList; + }); + + function createCtx() { + return { + getNode: vi.fn(() => ({ id: 'test', name: 'Test', type: 'test', typeVersion: 2, position: [0, 0], parameters: {} })), + } as unknown as import('n8n-workflow').IExecuteFunctions; + } + + it('should reject floats in int mode', () => { + const ctx = createCtx(); + expect(() => splitAndValidateCommaList(ctx, '1, 3.14, 5', 'IDs', 'int', 0)).toThrow('Invalid'); + }); + + it('should accept valid integers', () => { + const ctx = createCtx(); + expect(splitAndValidateCommaList(ctx, '1, 2, 3', 'IDs', 'int', 0)).toEqual([1, 2, 3]); + }); + + it('should reject mixed valid/invalid', () => { + const ctx = createCtx(); + expect(() => splitAndValidateCommaList(ctx, '1, abc, 3', 'IDs', 'int', 0)).toThrow('abc'); + }); +}); + +// ============================================================================ +// buildMultipartBody — filename sanitization +// ============================================================================ + +describe('buildMultipartBody — filename sanitization', () => { + let buildMultipartBody: typeof import('../nodes/Pachca/GenericFunctions').buildMultipartBody; + + beforeEach(async () => { + const mod = await import('../nodes/Pachca/GenericFunctions'); + buildMultipartBody = mod.buildMultipartBody; + }); + + it('should strip null bytes from filename', () => { + const result = buildMultipartBody({}, Buffer.from('test'), 'file\x00name.txt', 'text/plain'); + const bodyStr = result.body.toString(); + expect(bodyStr).not.toContain('\x00'); + expect(bodyStr).toContain('file_name.txt'); + }); + + it('should strip control characters from filename', () => { + const result = buildMultipartBody({}, Buffer.from('test'), 'file\x07\x1fname.txt', 'text/plain'); + const bodyStr = result.body.toString(); + expect(bodyStr).toContain('file__name.txt'); + }); + + it('should truncate long filenames to 255 chars', () => { + const longName = 'a'.repeat(300) + '.txt'; + const result = buildMultipartBody({}, Buffer.from('test'), longName, 'text/plain'); + const bodyStr = result.body.toString(); + // The filename in the body should not exceed 255 chars + const match = bodyStr.match(/filename="([^"]+)"/); + expect(match).toBeTruthy(); + expect(match![1].length).toBeLessThanOrEqual(255); + }); +}); diff --git a/integrations/n8n/tests/webhook-lifecycle.test.ts b/integrations/n8n/tests/webhook-lifecycle.test.ts new file mode 100644 index 00000000..73266f4c --- /dev/null +++ b/integrations/n8n/tests/webhook-lifecycle.test.ts @@ -0,0 +1,254 @@ +import { describe, it, expect, vi } from 'vitest'; +import type { IDataObject, IHookFunctions } from 'n8n-workflow'; +import { PachcaTrigger } from '../nodes/Pachca/PachcaTrigger.node'; + +// ============================================================================ +// Helpers +// ============================================================================ + +const BASE_URL = 'https://api.pachca.com/api/shared/v1'; +const WEBHOOK_URL = 'https://n8n.example.com/webhook/abc123'; + +function createHookCtx(overrides: { + botId?: number; + httpResponses?: unknown[]; + resolveBotResult?: number; + resolveBotError?: Error; +} = {}): IHookFunctions { + let callIndex = 0; + const responses = overrides.httpResponses ?? [{}]; + + return { + getCredentials: vi.fn(async () => ({ + baseUrl: BASE_URL, + accessToken: 'test-token', + botId: overrides.botId ?? 0, + })), + getNodeWebhookUrl: vi.fn(() => WEBHOOK_URL), + helpers: { + httpRequestWithAuthentication: vi.fn(async () => { + const idx = callIndex++; + const resp = responses[idx % responses.length]; + if (resp instanceof Error) throw resp; + return resp; + }), + }, + logger: { + warn: vi.fn(), + info: vi.fn(), + error: vi.fn(), + }, + } as unknown as IHookFunctions; +} + +// ============================================================================ +// checkExists +// ============================================================================ + +describe('PachcaTrigger.webhookMethods.checkExists', () => { + const trigger = new PachcaTrigger(); + + it('should return true when webhook URL matches', async () => { + const ctx = createHookCtx({ + botId: 42, + httpResponses: [ + { data: { webhook: { outgoing_url: WEBHOOK_URL } } }, + ], + }); + + const result = await trigger.webhookMethods.default.checkExists.call(ctx); + expect(result).toBe(true); + }); + + it('should return false when webhook URL does not match', async () => { + const ctx = createHookCtx({ + botId: 42, + httpResponses: [ + { data: { webhook: { outgoing_url: 'https://other.example.com/webhook' } } }, + ], + }); + + const result = await trigger.webhookMethods.default.checkExists.call(ctx); + expect(result).toBe(false); + }); + + it('should return false when no webhook is configured', async () => { + const ctx = createHookCtx({ + botId: 42, + httpResponses: [{ data: {} }], + }); + + const result = await trigger.webhookMethods.default.checkExists.call(ctx); + expect(result).toBe(false); + }); + + it('should return false when bot ID is 0 (personal token)', async () => { + // botId=0 + token/info returns personal token + const ctx = createHookCtx({ + httpResponses: [ + { data: { name: 'My Token', user_id: 99 } }, // resolveBotId → 0 + ], + }); + + const result = await trigger.webhookMethods.default.checkExists.call(ctx); + expect(result).toBe(false); + // Should not attempt GET /bots/... + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + expect(httpMock.mock.calls).toHaveLength(1); // only token/info + }); + + it('should return false on network error during resolveBotId', async () => { + const ctx = createHookCtx({ + httpResponses: [new Error('Network timeout')], + }); + + const result = await trigger.webhookMethods.default.checkExists.call(ctx); + expect(result).toBe(false); + }); + + it('should return false on network error during bot GET', async () => { + const ctx = createHookCtx({ + botId: 42, + httpResponses: [new Error('Connection refused')], + }); + + const result = await trigger.webhookMethods.default.checkExists.call(ctx); + expect(result).toBe(false); + }); + + it('should call correct URL with bot ID', async () => { + const ctx = createHookCtx({ + botId: 77, + httpResponses: [ + { data: { webhook: { outgoing_url: WEBHOOK_URL } } }, + ], + }); + + await trigger.webhookMethods.default.checkExists.call(ctx); + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + const callArgs = httpMock.mock.calls[0]; + expect(callArgs[1].url).toBe(`${BASE_URL}/bots/77`); + expect(callArgs[1].method).toBe('GET'); + }); +}); + +// ============================================================================ +// create +// ============================================================================ + +describe('PachcaTrigger.webhookMethods.create', () => { + const trigger = new PachcaTrigger(); + + it('should register webhook via PUT /bots/:id', async () => { + const ctx = createHookCtx({ + botId: 42, + httpResponses: [{ data: {} }], + }); + + const result = await trigger.webhookMethods.default.create.call(ctx); + expect(result).toBe(true); + + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + expect(httpMock).toHaveBeenCalledWith( + 'pachcaApi', + expect.objectContaining({ + method: 'PUT', + url: `${BASE_URL}/bots/42`, + body: { bot: { webhook: { outgoing_url: WEBHOOK_URL } } }, + }), + ); + }); + + it('should warn and return true for personal token (no bot ID)', async () => { + const ctx = createHookCtx({ + // botId=0, token/info returns personal token + httpResponses: [ + { data: { name: 'My Token', user_id: 99 } }, // resolveBotId → 0 + ], + }); + + const result = await trigger.webhookMethods.default.create.call(ctx); + expect(result).toBe(true); + expect((ctx.logger as { warn: ReturnType }).warn).toHaveBeenCalledWith( + expect.stringContaining('not a bot token'), + ); + }); + + it('should auto-detect bot ID from token/info', async () => { + const ctx = createHookCtx({ + // botId=0, token/info returns bot token + httpResponses: [ + { data: { name: null, user_id: 55 } }, // resolveBotId → 55 + { data: {} }, // PUT /bots/55 + ], + }); + + const result = await trigger.webhookMethods.default.create.call(ctx); + expect(result).toBe(true); + + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + // Second call should be PUT /bots/55 + expect(httpMock.mock.calls[1][1].url).toBe(`${BASE_URL}/bots/55`); + }); +}); + +// ============================================================================ +// delete +// ============================================================================ + +describe('PachcaTrigger.webhookMethods.delete', () => { + const trigger = new PachcaTrigger(); + + it('should clear webhook via PUT /bots/:id with empty URL', async () => { + const ctx = createHookCtx({ + botId: 42, + httpResponses: [{ data: {} }], + }); + + const result = await trigger.webhookMethods.default.delete.call(ctx); + expect(result).toBe(true); + + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + expect(httpMock).toHaveBeenCalledWith( + 'pachcaApi', + expect.objectContaining({ + method: 'PUT', + url: `${BASE_URL}/bots/42`, + body: { bot: { webhook: { outgoing_url: '' } } }, + }), + ); + }); + + it('should return true when resolveBotId throws', async () => { + const ctx = createHookCtx({ + httpResponses: [new Error('Network timeout')], + }); + + const result = await trigger.webhookMethods.default.delete.call(ctx); + expect(result).toBe(true); + }); + + it('should return true when bot ID is 0', async () => { + const ctx = createHookCtx({ + httpResponses: [ + { data: { name: 'Personal Token', user_id: 1 } }, // → 0 + ], + }); + + const result = await trigger.webhookMethods.default.delete.call(ctx); + expect(result).toBe(true); + // Should not attempt PUT + const httpMock = ctx.helpers.httpRequestWithAuthentication as ReturnType; + expect(httpMock.mock.calls).toHaveLength(1); // only token/info + }); + + it('should ignore PUT errors on cleanup', async () => { + const ctx = createHookCtx({ + botId: 42, + httpResponses: [new Error('Server error')], + }); + + const result = await trigger.webhookMethods.default.delete.call(ctx); + expect(result).toBe(true); + }); +}); diff --git a/sdk/go/README.md b/sdk/go/README.md index bb0b5c45..d7e16303 100644 --- a/sdk/go/README.md +++ b/sdk/go/README.md @@ -5,7 +5,7 @@ Go клиент для [Pachca API](https://dev.pachca.com). ## Установка ```bash -go get github.com/pachca/openapi/sdk/go/generated@v1.0.1 +go get github.com/pachca/openapi/sdk/go/generated@latest ``` ## Использование diff --git a/sdk/kotlin/README.md b/sdk/kotlin/README.md index 52ae08c5..eff87768 100644 --- a/sdk/kotlin/README.md +++ b/sdk/kotlin/README.md @@ -12,7 +12,7 @@ Kotlin клиент для [Pachca API](https://dev.pachca.com). ```kotlin // build.gradle.kts dependencies { - implementation("com.pachca:pachca-sdk:1.0.1") + implementation("com.pachca:pachca-sdk:latest.release") } ``` diff --git a/sdk/python/generated/README.md b/sdk/python/generated/README.md index 8fbc3ffc..d1e2a460 100644 --- a/sdk/python/generated/README.md +++ b/sdk/python/generated/README.md @@ -5,7 +5,7 @@ Python клиент для [Pachca API](https://dev.pachca.com). ## Установка ```bash -pip install pachca-sdk==1.0.1 +pip install pachca-sdk ``` ## Использование diff --git a/sdk/swift/README.md b/sdk/swift/README.md index 3296d6fc..5c58c162 100644 --- a/sdk/swift/README.md +++ b/sdk/swift/README.md @@ -12,7 +12,7 @@ Swift клиент для [Pachca API](https://dev.pachca.com). ```swift // Package.swift dependencies: [ - .package(url: "https://github.com/pachca/openapi", from: "1.0.1") + .package(url: "https://github.com/pachca/openapi", from: "1.0.0") ] ``` diff --git a/sdk/typescript/README.md b/sdk/typescript/README.md index 43c26520..e3b1f9c4 100644 --- a/sdk/typescript/README.md +++ b/sdk/typescript/README.md @@ -5,7 +5,7 @@ ## Установка ```bash -npm install @pachca/sdk@1.0.1 +npm install @pachca/sdk ``` ## Использование From 2cba32c512bbdc871586f25369f81b1d4d6251dd Mon Sep 17 00:00:00 2001 From: lookinway Date: Fri, 3 Apr 2026 22:59:31 +0300 Subject: [PATCH 16/37] docs(n8n): add security features, bug fixes to docs and changelog - trigger.mdx: add IP allowlist, replay protection, signature header details - setup.mdx: add Webhook Allowed IPs credential field - CHANGELOG.md: add Security and Bug Fixes sections to 2.0.0 - README.md: add Webhook Allowed IPs to credentials table --- apps/docs/content/guides/n8n/setup.mdx | 3 ++- apps/docs/content/guides/n8n/trigger.mdx | 18 ++++++++++++++++-- integrations/n8n/CHANGELOG.md | 14 ++++++++++++++ integrations/n8n/README.md | 3 ++- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/apps/docs/content/guides/n8n/setup.mdx b/apps/docs/content/guides/n8n/setup.mdx index 73cf07a0..9a2078f4 100644 --- a/apps/docs/content/guides/n8n/setup.mdx +++ b/apps/docs/content/guides/n8n/setup.mdx @@ -65,8 +65,9 @@ description: Установка n8n, расширения Пачки, настр |------|:---:|----------| | **Base URL** | нет | Базовый URL API. По умолчанию `https://api.pachca.com/api/shared/v1`. Менять только для on-premise | | **Access Token** | да | Токен доступа к API | - | **Bot ID** | нет | ID бота — нужен для авторегистрации вебхука в [Pachca Trigger](/guides/n8n/trigger) | + | **Bot ID** | нет | ID бота — нужен для авторегистрации вебхука в [Pachca Trigger](/guides/n8n/trigger). Автоопределяется из токена бота | | **Signing Secret** | нет | Секрет для верификации входящих webhook-запросов (HMAC-SHA256) | + | **Webhook Allowed IPs** | нет | Список IP-адресов через запятую, с которых разрешены входящие вебхуки. Пачка отправляет с `37.200.70.177`. Пустое поле — разрешить все | diff --git a/apps/docs/content/guides/n8n/trigger.mdx b/apps/docs/content/guides/n8n/trigger.mdx index c4626f32..66e43ce2 100644 --- a/apps/docs/content/guides/n8n/trigger.mdx +++ b/apps/docs/content/guides/n8n/trigger.mdx @@ -107,14 +107,28 @@ description: "Pachca Trigger: 16 типов событий, авторегист 3. Вставьте URL в настройки бота в Пачке (раздел **Webhook URL**) 4. Активируйте workflow -## Проверка подписи +## Безопасность -Для защиты от поддельных запросов добавьте **Signing Secret** бота в [Credentials](/guides/n8n/setup#sozdanie-credentials). Trigger автоматически проверяет HMAC-SHA256 подпись каждого входящего запроса и отклоняет невалидные. +### Проверка подписи + +Для защиты от поддельных запросов добавьте **Signing Secret** бота в [Credentials](/guides/n8n/setup#sozdanie-credentials). Trigger автоматически проверяет HMAC-SHA256 подпись каждого входящего запроса через заголовок `pachca-signature` и отклоняет невалидные. Подробнее о механизме подписи — в разделе [Исходящие вебхуки](/guides/webhook#bezopasnost). Рекомендуется всегда использовать Signing Secret в продакшене для защиты от несанкционированных запросов. +### Ограничение по IP + +Укажите **Webhook Allowed IPs** в [Credentials](/guides/n8n/setup#sozdanie-credentials) — через запятую список IP-адресов, с которых принимаются вебхуки. Пачка отправляет вебхуки с IP `37.200.70.177`. + +Если поле пустое — проверка IP отключена и запросы принимаются с любого адреса. + +Ограничение по IP — дополнительная мера. Заголовок `x-forwarded-for` может быть подменён, если n8n не стоит за доверенным reverse proxy. Используйте вместе с Signing Secret. + +### Защита от повторов + +Trigger автоматически отклоняет события старше **5 минут** (по полю `webhook_timestamp` в теле запроса). Это защищает от replay-атак — повторной отправки перехваченного запроса. + ## Фильтрация событий Выберите конкретный тип события для фильтрации — workflow будет запускаться только при совпадении. Можно выбрать только один тип события на один узел Trigger. diff --git a/integrations/n8n/CHANGELOG.md b/integrations/n8n/CHANGELOG.md index 324d86f0..781d3e60 100644 --- a/integrations/n8n/CHANGELOG.md +++ b/integrations/n8n/CHANGELOG.md @@ -13,6 +13,20 @@ - **English descriptions** for common fields - **Bot update** with dedicated webhookUrl field +### Security + +- **Webhook signature verification** — HMAC-SHA256 via `pachca-signature` header +- **IP allowlist** — restrict incoming webhooks by source IP (`Webhook Allowed IPs` credential field) +- **Replay protection** — reject events older than 5 minutes or timestamped >1 minute in the future +- **Filename sanitization** — strip control characters and null bytes, truncate to 255 chars + +### Bug Fixes + +- Fix `do-while` + `continue` retry bug in pagination — retries on 429/502/503 no longer silently exit the loop when cursor is undefined +- Fix `resolveResourceLocator` — throw on null/undefined/empty values instead of passing them downstream +- Fix `splitAndValidateCommaList` — reject float values (e.g. `3.14`) in integer mode (`Number.isInteger` instead of `isNaN`) +- Fix replay protection — reject far-future timestamps (>1 minute ahead), not just old ones + ### v1 Compatibility All v1 workflows continue to work without changes: diff --git a/integrations/n8n/README.md b/integrations/n8n/README.md index 9dca09a8..a72f66c5 100644 --- a/integrations/n8n/README.md +++ b/integrations/n8n/README.md @@ -77,7 +77,8 @@ Create a **Pachca API** credential with: | **Base URL** | no | Default: `https://api.pachca.com/api/shared/v1`. Change only for on-premise. | | **Access Token** | yes | Bot or personal API token | | **Bot ID** | no | For automatic webhook registration in Trigger. Auto-detected from bot tokens. Set explicitly for admin tokens. | -| **Signing Secret** | no | For HMAC-SHA256 verification of incoming webhooks | +| **Signing Secret** | no | For HMAC-SHA256 verification of incoming webhooks (`pachca-signature` header) | +| **Webhook Allowed IPs** | no | Comma-separated IPs allowed to send webhooks. Pachca sends from `37.200.70.177`. Empty = allow all. | **Where to get tokens:** From c33405a41c28165d01a79bb42276d8c649371b97 Mon Sep 17 00:00:00 2001 From: lookinway Date: Mon, 6 Apr 2026 15:40:18 +0300 Subject: [PATCH 17/37] feat: cursor-based pagination across SDK, CLI, n8n and docs - Update pagination to use cursor-based approach with next_page detection - Regenerate all SDK clients (TypeScript, Python, Go, Swift, C#, Kotlin) - Update CLI list commands with cursor pagination support - Update n8n node with pagination fixes and new features - Add array-no-brackets and date-format generator tests - Update docs and SDK guides with pagination details --- .github/workflows/sdk.yml | 21 +- apps/docs/content/api/pagination.mdx | 2 +- apps/docs/content/guides/sdk/csharp.mdx | 9 +- apps/docs/content/guides/sdk/go.mdx | 11 +- apps/docs/content/guides/sdk/kotlin.mdx | 9 +- apps/docs/content/guides/sdk/python.mdx | 6 +- apps/docs/content/guides/sdk/swift.mdx | 7 +- apps/docs/content/guides/sdk/typescript.mdx | 9 +- apps/docs/public/api/bots/list-events.md | 6 +- apps/docs/public/api/chats/list.md | 6 +- apps/docs/public/api/group-tags/list-users.md | 6 +- apps/docs/public/api/group-tags/list.md | 6 +- apps/docs/public/api/members/list.md | 6 +- apps/docs/public/api/messages/list.md | 6 +- apps/docs/public/api/pagination.md | 6 +- apps/docs/public/api/reactions/list.md | 6 +- .../public/api/read-member/list-readers.md | 6 +- apps/docs/public/api/security/list.md | 6 +- apps/docs/public/api/tasks/list.md | 6 +- apps/docs/public/api/users/list.md | 6 +- apps/docs/public/guides/n8n/setup.md | 3 +- apps/docs/public/guides/n8n/trigger.md | 19 +- apps/docs/public/guides/sdk/csharp.md | 13 +- apps/docs/public/guides/sdk/go.md | 15 +- apps/docs/public/guides/sdk/kotlin.md | 15 +- apps/docs/public/guides/sdk/python.md | 10 +- apps/docs/public/guides/sdk/swift.md | 13 +- apps/docs/public/guides/sdk/typescript.md | 13 +- apps/docs/public/llms-full.txt | 173 ++--- .../n8n/nodes/Pachca/GenericFunctions.ts | 55 +- integrations/n8n/nodes/Pachca/SharedRouter.ts | 29 +- .../n8n/nodes/Pachca/V2/ChatDescription.ts | 21 +- .../nodes/Pachca/V2/LinkPreviewDescription.ts | 2 +- .../nodes/Pachca/V2/ReadMemberDescription.ts | 2 +- .../n8n/nodes/Pachca/V2/SearchDescription.ts | 6 +- integrations/n8n/scripts/generate-n8n.ts | 69 +- integrations/n8n/tests/error-paths.test.ts | 16 +- .../n8n/tests/execute-helpers.test.ts | 12 +- packages/cli/scripts/generate-cli.ts | 13 +- packages/cli/src/client.ts | 12 +- packages/cli/src/commands/bots/list-events.ts | 3 +- packages/cli/src/commands/chats/list.ts | 3 +- .../cli/src/commands/group-tags/list-users.ts | 3 +- packages/cli/src/commands/group-tags/list.ts | 7 +- packages/cli/src/commands/members/list.ts | 3 +- packages/cli/src/commands/messages/list.ts | 3 +- packages/cli/src/commands/reactions/list.ts | 3 +- .../src/commands/read-member/list-readers.ts | 3 +- .../cli/src/commands/search/list-chats.ts | 3 +- .../cli/src/commands/search/list-messages.ts | 11 +- .../cli/src/commands/search/list-users.ts | 7 +- packages/cli/src/commands/security/list.ts | 3 +- packages/cli/src/commands/tasks/list.ts | 3 +- packages/cli/src/commands/users/list.ts | 3 +- packages/cli/tests/commands.test.ts | 6 +- packages/generator/src/lang/csharp.ts | 21 +- packages/generator/src/lang/go.ts | 42 +- packages/generator/src/lang/kotlin.ts | 17 +- packages/generator/src/lang/python.ts | 25 +- packages/generator/src/lang/swift.ts | 27 +- packages/generator/src/lang/typescript.ts | 17 +- packages/generator/src/transform.ts | 28 +- .../tests/array-no-brackets/fixture.yaml | 109 +++ .../array-no-brackets/snapshots/cs/Client.cs | 99 +++ .../array-no-brackets/snapshots/cs/Models.cs | 42 ++ .../array-no-brackets/snapshots/cs/Utils.cs | 103 +++ .../snapshots/cs/examples.json | 12 + .../array-no-brackets/snapshots/go/client.go | 150 +++++ .../snapshots/go/examples.json | 15 + .../array-no-brackets/snapshots/go/types.go | 38 ++ .../array-no-brackets/snapshots/go/utils.go | 6 + .../array-no-brackets/snapshots/kt/Client.kt | 97 +++ .../array-no-brackets/snapshots/kt/Models.kt | 31 + .../snapshots/kt/examples.json | 12 + .../snapshots/py/__init__.py | 0 .../array-no-brackets/snapshots/py/client.py | 76 +++ .../snapshots/py/examples.json | 15 + .../array-no-brackets/snapshots/py/models.py | 38 ++ .../array-no-brackets/snapshots/py/utils.py | 111 ++++ .../snapshots/swift/Client.swift | 60 ++ .../snapshots/swift/Models.swift | 47 ++ .../snapshots/swift/Utils.swift | 69 ++ .../snapshots/swift/examples.json | 12 + .../array-no-brackets/snapshots/ts/client.ts | 60 ++ .../snapshots/ts/examples.json | 12 + .../array-no-brackets/snapshots/ts/types.ts | 31 + .../array-no-brackets/snapshots/ts/utils.ts | 58 ++ .../tests/crud/snapshots/cs/Client.cs | 1 + .../tests/crud/snapshots/go/client.go | 53 +- .../tests/crud/snapshots/kt/Client.kt | 1 + .../tests/crud/snapshots/py/client.py | 4 +- .../tests/crud/snapshots/swift/Client.swift | 3 +- .../tests/crud/snapshots/ts/client.ts | 3 +- .../generator/tests/date-format/fixture.yaml | 161 +++++ .../tests/date-format/snapshots/cs/Client.cs | 92 +++ .../tests/date-format/snapshots/cs/Models.cs | 60 ++ .../tests/date-format/snapshots/cs/Utils.cs | 103 +++ .../date-format/snapshots/cs/examples.json | 19 + .../tests/date-format/snapshots/go/client.go | 156 +++++ .../date-format/snapshots/go/examples.json | 22 + .../tests/date-format/snapshots/go/types.go | 47 ++ .../tests/date-format/snapshots/go/utils.go | 6 + .../tests/date-format/snapshots/kt/Client.kt | 83 +++ .../tests/date-format/snapshots/kt/Models.kt | 40 ++ .../date-format/snapshots/kt/examples.json | 19 + .../date-format/snapshots/py/__init__.py | 0 .../tests/date-format/snapshots/py/client.py | 73 ++ .../date-format/snapshots/py/examples.json | 22 + .../tests/date-format/snapshots/py/models.py | 43 ++ .../tests/date-format/snapshots/py/utils.py | 111 ++++ .../date-format/snapshots/swift/Client.swift | 63 ++ .../date-format/snapshots/swift/Models.swift | 80 +++ .../date-format/snapshots/swift/Utils.swift | 69 ++ .../date-format/snapshots/swift/examples.json | 19 + .../tests/date-format/snapshots/ts/client.ts | 59 ++ .../date-format/snapshots/ts/examples.json | 19 + .../tests/date-format/snapshots/ts/types.ts | 38 ++ .../tests/date-format/snapshots/ts/utils.ts | 58 ++ .../tests/edge-cases/snapshots/cs/Client.cs | 3 +- .../tests/edge-cases/snapshots/go/client.go | 6 +- .../tests/edge-cases/snapshots/kt/Client.kt | 2 +- .../tests/edge-cases/snapshots/py/client.py | 9 +- .../edge-cases/snapshots/swift/Client.swift | 4 +- .../tests/edge-cases/snapshots/ts/client.ts | 4 +- .../tests/patch/snapshots/go/client.go | 4 +- .../tests/record/snapshots/go/client.go | 8 +- .../tests/redirect/snapshots/go/client.go | 8 +- .../tests/search/snapshots/cs/Client.cs | 5 +- .../tests/search/snapshots/go/client.go | 9 +- .../tests/search/snapshots/kt/Client.kt | 5 +- .../tests/search/snapshots/py/client.py | 8 +- .../tests/search/snapshots/swift/Client.swift | 5 +- .../tests/search/snapshots/ts/client.ts | 5 +- .../tests/unwrap/snapshots/go/client.go | 24 +- .../tests/upload/snapshots/go/client.go | 8 +- packages/spec/openapi.en.yaml | 15 + packages/spec/openapi.yaml | 15 + packages/spec/typespec.tsp | 6 +- sdk/csharp/generated/Client.cs | 105 +-- sdk/csharp/generated/Models.cs | 26 +- sdk/csharp/generated/README.md | 7 +- sdk/csharp/generated/examples.json | 25 +- sdk/go/README.md | 7 +- sdk/go/generated/client.go | 621 +++++++++++++----- sdk/go/generated/examples.json | 25 +- sdk/go/generated/types.go | 71 +- sdk/kotlin/README.md | 7 +- .../src/main/kotlin/com/pachca/Client.kt | 91 +-- .../src/main/kotlin/com/pachca/Models.kt | 27 +- .../src/main/kotlin/com/pachca/examples.json | 25 +- sdk/python/generated/README.md | 6 +- sdk/python/generated/pachca/client.py | 132 ++-- sdk/python/generated/pachca/examples.json | 25 +- sdk/python/generated/pachca/models.py | 31 +- sdk/swift/README.md | 5 +- .../Pachca/GeneratedSources/Client.swift | 113 ++-- .../Pachca/GeneratedSources/Models.swift | 37 +- sdk/swift/generated/examples.json | 25 +- sdk/typescript/README.md | 7 +- sdk/typescript/src/generated/client.ts | 110 ++-- sdk/typescript/src/generated/examples.json | 25 +- sdk/typescript/src/generated/types.ts | 29 +- 162 files changed, 4440 insertions(+), 1023 deletions(-) create mode 100644 packages/generator/tests/array-no-brackets/fixture.yaml create mode 100644 packages/generator/tests/array-no-brackets/snapshots/cs/Client.cs create mode 100644 packages/generator/tests/array-no-brackets/snapshots/cs/Models.cs create mode 100644 packages/generator/tests/array-no-brackets/snapshots/cs/Utils.cs create mode 100644 packages/generator/tests/array-no-brackets/snapshots/cs/examples.json create mode 100644 packages/generator/tests/array-no-brackets/snapshots/go/client.go create mode 100644 packages/generator/tests/array-no-brackets/snapshots/go/examples.json create mode 100644 packages/generator/tests/array-no-brackets/snapshots/go/types.go create mode 100644 packages/generator/tests/array-no-brackets/snapshots/go/utils.go create mode 100644 packages/generator/tests/array-no-brackets/snapshots/kt/Client.kt create mode 100644 packages/generator/tests/array-no-brackets/snapshots/kt/Models.kt create mode 100644 packages/generator/tests/array-no-brackets/snapshots/kt/examples.json create mode 100644 packages/generator/tests/array-no-brackets/snapshots/py/__init__.py create mode 100644 packages/generator/tests/array-no-brackets/snapshots/py/client.py create mode 100644 packages/generator/tests/array-no-brackets/snapshots/py/examples.json create mode 100644 packages/generator/tests/array-no-brackets/snapshots/py/models.py create mode 100644 packages/generator/tests/array-no-brackets/snapshots/py/utils.py create mode 100644 packages/generator/tests/array-no-brackets/snapshots/swift/Client.swift create mode 100644 packages/generator/tests/array-no-brackets/snapshots/swift/Models.swift create mode 100644 packages/generator/tests/array-no-brackets/snapshots/swift/Utils.swift create mode 100644 packages/generator/tests/array-no-brackets/snapshots/swift/examples.json create mode 100644 packages/generator/tests/array-no-brackets/snapshots/ts/client.ts create mode 100644 packages/generator/tests/array-no-brackets/snapshots/ts/examples.json create mode 100644 packages/generator/tests/array-no-brackets/snapshots/ts/types.ts create mode 100644 packages/generator/tests/array-no-brackets/snapshots/ts/utils.ts create mode 100644 packages/generator/tests/date-format/fixture.yaml create mode 100644 packages/generator/tests/date-format/snapshots/cs/Client.cs create mode 100644 packages/generator/tests/date-format/snapshots/cs/Models.cs create mode 100644 packages/generator/tests/date-format/snapshots/cs/Utils.cs create mode 100644 packages/generator/tests/date-format/snapshots/cs/examples.json create mode 100644 packages/generator/tests/date-format/snapshots/go/client.go create mode 100644 packages/generator/tests/date-format/snapshots/go/examples.json create mode 100644 packages/generator/tests/date-format/snapshots/go/types.go create mode 100644 packages/generator/tests/date-format/snapshots/go/utils.go create mode 100644 packages/generator/tests/date-format/snapshots/kt/Client.kt create mode 100644 packages/generator/tests/date-format/snapshots/kt/Models.kt create mode 100644 packages/generator/tests/date-format/snapshots/kt/examples.json create mode 100644 packages/generator/tests/date-format/snapshots/py/__init__.py create mode 100644 packages/generator/tests/date-format/snapshots/py/client.py create mode 100644 packages/generator/tests/date-format/snapshots/py/examples.json create mode 100644 packages/generator/tests/date-format/snapshots/py/models.py create mode 100644 packages/generator/tests/date-format/snapshots/py/utils.py create mode 100644 packages/generator/tests/date-format/snapshots/swift/Client.swift create mode 100644 packages/generator/tests/date-format/snapshots/swift/Models.swift create mode 100644 packages/generator/tests/date-format/snapshots/swift/Utils.swift create mode 100644 packages/generator/tests/date-format/snapshots/swift/examples.json create mode 100644 packages/generator/tests/date-format/snapshots/ts/client.ts create mode 100644 packages/generator/tests/date-format/snapshots/ts/examples.json create mode 100644 packages/generator/tests/date-format/snapshots/ts/types.ts create mode 100644 packages/generator/tests/date-format/snapshots/ts/utils.ts diff --git a/.github/workflows/sdk.yml b/.github/workflows/sdk.yml index fa7e47ed..3921504b 100644 --- a/.github/workflows/sdk.yml +++ b/.github/workflows/sdk.yml @@ -43,12 +43,21 @@ jobs: - name: Check for SDK changes id: sdk_changes run: | - TS=$(git diff --name-only -- sdk/typescript/ | grep -q . && echo true || echo false) - GO=$(git diff --name-only -- sdk/go/ | grep -q . && echo true || echo false) - KT=$(git diff --name-only -- sdk/kotlin/ | grep -q . && echo true || echo false) - PY=$(git diff --name-only -- sdk/python/ | grep -q . && echo true || echo false) - CS=$(git diff --name-only -- sdk/csharp/ | grep -q . && echo true || echo false) - SW=$(git diff --name-only -- sdk/swift/ | grep -q . && echo true || echo false) + PREV_TAG=$(git describe --tags --abbrev=0 HEAD~1 2>/dev/null || echo "") + check_sdk() { + local dir=$1 + if [ -n "$PREV_TAG" ]; then + git diff --name-only "$PREV_TAG" HEAD -- "$dir" | grep -q . && echo true || echo false + else + git diff --name-only HEAD~1 HEAD -- "$dir" | grep -q . && echo true || echo false + fi + } + TS=$(check_sdk sdk/typescript/) + GO=$(check_sdk sdk/go/) + KT=$(check_sdk sdk/kotlin/) + PY=$(check_sdk sdk/python/) + CS=$(check_sdk sdk/csharp/) + SW=$(check_sdk sdk/swift/) echo "ts_changed=$TS" >> $GITHUB_OUTPUT echo "go_changed=$GO" >> $GITHUB_OUTPUT echo "kotlin_changed=$KT" >> $GITHUB_OUTPUT diff --git a/apps/docs/content/api/pagination.mdx b/apps/docs/content/api/pagination.mdx index edbeb627..5034827d 100644 --- a/apps/docs/content/api/pagination.mdx +++ b/apps/docs/content/api/pagination.mdx @@ -33,7 +33,7 @@ API Пачки использует **cursor-based** пагинацию для Для перехода на следующую страницу передайте значение `next_page` в параметр `cursor` следующего запроса. Последняя страница достигнута, когда массив `data` вернулся пустым. -Не определяйте последнюю страницу по количеству записей в ответе — оно может быть меньше `limit` и на промежуточных страницах. Проверяйте пустой массив `data`. Курсор — непрозрачный токен: не парсите и не сохраняйте его между сессиями. Всегда явно указывайте `limit` — не полагайтесь на значение по умолчанию. +Поле `next_page` **всегда присутствует** в ответе и никогда не бывает `null` — даже на последней странице. Не используйте `next_page == null` как признак конца данных. Единственный надёжный способ — проверять, что массив `data` пуст. Количество записей в ответе может быть меньше `limit` и на промежуточных страницах — не полагайтесь на него. Курсор — непрозрачный токен: не парсите и не сохраняйте его между сессиями. Всегда явно указывайте `limit` — не полагайтесь на значение по умолчанию. ### Методы поиска diff --git a/apps/docs/content/guides/sdk/csharp.mdx b/apps/docs/content/guides/sdk/csharp.mdx index af59fdfe..cc148ed8 100644 --- a/apps/docs/content/guides/sdk/csharp.mdx +++ b/apps/docs/content/guides/sdk/csharp.mdx @@ -84,7 +84,7 @@ using var client = new PachcaClient("YOUR_TOKEN", "https://custom-api.example.co ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит поле `Meta.Paginate.NextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит поле `Meta.Paginate.NextPage` — курсор для следующей страницы. Курсор никогда не бывает `null` — конец данных определяется по пустому массиву `Data`. ### Ручная пагинация @@ -92,12 +92,13 @@ using var client = new PachcaClient("YOUR_TOKEN", "https://custom-api.example.co var chats = new List(); string? cursor = null; -do +while (true) { var response = await client.Chats.ListChatsAsync(cursor: cursor); + if (response.Data.Count == 0) break; chats.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; -} while (cursor != null); + cursor = response.Meta.Paginate.NextPage; +} ``` ### Автопагинация diff --git a/apps/docs/content/guides/sdk/go.mdx b/apps/docs/content/guides/sdk/go.mdx index 5e75fa31..b79ff34f 100644 --- a/apps/docs/content/guides/sdk/go.mdx +++ b/apps/docs/content/guides/sdk/go.mdx @@ -104,7 +104,7 @@ request := pachca.ChatUpdateRequest{ ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит `Meta.Paginate.NextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит `Meta.Paginate.NextPage` — курсор для следующей страницы. Курсор никогда не бывает пустым — конец данных определяется по пустому слайсу `Data`. ### Ручная пагинация @@ -116,13 +116,14 @@ for { if err != nil { log.Fatal(err) } + if len(response.Data) == 0 { + break + } for _, user := range response.Data { fmt.Println(user.FirstName, user.LastName) } - if response.Meta == nil || response.Meta.Paginate == nil || response.Meta.Paginate.NextPage == nil { - break - } - cursor = response.Meta.Paginate.NextPage + nextPage := response.Meta.Paginate.NextPage + cursor = &nextPage } ``` diff --git a/apps/docs/content/guides/sdk/kotlin.mdx b/apps/docs/content/guides/sdk/kotlin.mdx index 7e220b26..403c0e84 100644 --- a/apps/docs/content/guides/sdk/kotlin.mdx +++ b/apps/docs/content/guides/sdk/kotlin.mdx @@ -100,19 +100,20 @@ client.close() ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит `meta?.paginate?.nextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит `meta.paginate.nextPage` — курсор для следующей страницы. Курсор никогда не бывает `null` — конец данных определяется по пустому массиву `data`. ### Ручная пагинация ```kotlin var cursor: String? = null -do { +while (true) { val response = client.users.listUsers(limit = 50, cursor = cursor) + if (response.data.isEmpty()) break for (user in response.data) { println("${user.firstName} ${user.lastName}") } - cursor = response.meta?.paginate?.nextPage -} while (cursor != null) + cursor = response.meta.paginate.nextPage +} ``` ### Автопагинация diff --git a/apps/docs/content/guides/sdk/python.mdx b/apps/docs/content/guides/sdk/python.mdx index 229bb95a..83af47a7 100644 --- a/apps/docs/content/guides/sdk/python.mdx +++ b/apps/docs/content/guides/sdk/python.mdx @@ -90,7 +90,7 @@ await client.close() ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит `meta.paginate.next_page` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит `meta.paginate.next_page` — курсор для следующей страницы. Курсор никогда не бывает `None` — конец данных определяется по пустому списку `data`. ### Ручная пагинация @@ -100,10 +100,10 @@ from pachca.models import ListUsersParams cursor = None while True: response = await client.users.list_users(ListUsersParams(limit=50, cursor=cursor)) + if not response.data: + break for user in response.data: print(user.first_name, user.last_name) - if not response.meta or not response.meta.paginate or not response.meta.paginate.next_page: - break cursor = response.meta.paginate.next_page ``` diff --git a/apps/docs/content/guides/sdk/swift.mdx b/apps/docs/content/guides/sdk/swift.mdx index 605c8668..b3ff6c52 100644 --- a/apps/docs/content/guides/sdk/swift.mdx +++ b/apps/docs/content/guides/sdk/swift.mdx @@ -90,7 +90,7 @@ let client = PachcaClient(token: "YOUR_TOKEN", baseURL: "https://custom-api.exam ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит `meta?.paginate?.nextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит `meta.paginate.nextPage` — курсор для следующей страницы. Курсор никогда не бывает `nil` — конец данных определяется по пустому массиву `data`. ### Ручная пагинация @@ -98,11 +98,12 @@ let client = PachcaClient(token: "YOUR_TOKEN", baseURL: "https://custom-api.exam var cursor: String? = nil repeat { let response = try await client.users.listUsers(limit: 50, cursor: cursor) + if response.data.isEmpty { break } for user in response.data { print("\(user.firstName) \(user.lastName)") } - cursor = response.meta?.paginate?.nextPage -} while cursor != nil + cursor = response.meta.paginate.nextPage +} while true ``` ### Автопагинация diff --git a/apps/docs/content/guides/sdk/typescript.mdx b/apps/docs/content/guides/sdk/typescript.mdx index c478b18a..25a67a0a 100644 --- a/apps/docs/content/guides/sdk/typescript.mdx +++ b/apps/docs/content/guides/sdk/typescript.mdx @@ -84,20 +84,21 @@ const client = new PachcaClient("YOUR_TOKEN", "https://custom-api.example.com/ap ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит поле `meta.paginate.nextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит поле `meta.paginate.nextPage` — курсор для следующей страницы. Курсор никогда не бывает `null` — конец данных определяется по пустому массиву `data`. ### Ручная пагинация ```typescript let cursor: string | undefined -do { +for (;;) { const response = await client.users.listUsers({ limit: 50, cursor }) + if (response.data.length === 0) break for (const user of response.data) { console.log(user.firstName, user.lastName) } - cursor = response.meta?.paginate?.nextPage -} while (cursor) + cursor = response.meta.paginate.nextPage +} ``` ### Автопагинация diff --git a/apps/docs/public/api/bots/list-events.md b/apps/docs/public/api/bots/list-events.md index 02dcdfbd..5d70fc1d 100644 --- a/apps/docs/public/api/bots/list-events.md +++ b/apps/docs/public/api/bots/list-events.md @@ -125,9 +125,9 @@ curl "https://api.pachca.com/api/shared/v1/webhooks/events?limit=1" \ - `created_at: date-time` (required) — Дата и время создания сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX - `created_at: date-time` (required) — Дата и время создания события (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** diff --git a/apps/docs/public/api/chats/list.md b/apps/docs/public/api/chats/list.md index 04b32d2d..78310704 100644 --- a/apps/docs/public/api/chats/list.md +++ b/apps/docs/public/api/chats/list.md @@ -47,9 +47,9 @@ curl "https://api.pachca.com/api/shared/v1/chats?sort[id]=desc&availability=is_m - `public: boolean` (required) — Открытый доступ - `last_message_at: date-time` (required) — Дата и время создания последнего сообщения в чате (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `meet_room_url: string` (required) — Ссылка на Видеочат -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** diff --git a/apps/docs/public/api/group-tags/list-users.md b/apps/docs/public/api/group-tags/list-users.md index f986974a..0c49e68d 100644 --- a/apps/docs/public/api/group-tags/list-users.md +++ b/apps/docs/public/api/group-tags/list-users.md @@ -68,9 +68,9 @@ curl "https://api.pachca.com/api/shared/v1/group_tags/9111/users?limit=1" \ - `last_activity_at: date-time` (required) — Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `time_zone: string` (required) — Часовой пояс пользователя - `image_url: string` (required) — Ссылка на скачивание аватарки пользователя -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** diff --git a/apps/docs/public/api/group-tags/list.md b/apps/docs/public/api/group-tags/list.md index c84dc75b..b250344c 100644 --- a/apps/docs/public/api/group-tags/list.md +++ b/apps/docs/public/api/group-tags/list.md @@ -35,9 +35,9 @@ curl "https://api.pachca.com/api/shared/v1/group_tags?names[]=Design&names[]=Pro - `id: integer, int32` (required) — Идентификатор тега - `name: string` (required) — Название тега - `users_count: integer, int32` (required) — Количество сотрудников, которые имеют этот тег -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** diff --git a/apps/docs/public/api/members/list.md b/apps/docs/public/api/members/list.md index f8b363a8..6d974444 100644 --- a/apps/docs/public/api/members/list.md +++ b/apps/docs/public/api/members/list.md @@ -71,9 +71,9 @@ curl "https://api.pachca.com/api/shared/v1/chats/334/members?role=all&limit=1" \ - `last_activity_at: date-time` (required) — Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `time_zone: string` (required) — Часовой пояс пользователя - `image_url: string` (required) — Ссылка на скачивание аватарки пользователя -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** diff --git a/apps/docs/public/api/messages/list.md b/apps/docs/public/api/messages/list.md index d93e0131..4e4327d8 100644 --- a/apps/docs/public/api/messages/list.md +++ b/apps/docs/public/api/messages/list.md @@ -71,9 +71,9 @@ curl "https://api.pachca.com/api/shared/v1/messages?chat_id=198&sort[id]=desc&li - `display_name: string` (required) — Полное имя отправителя сообщения - `changed_at: date-time` (required) — Дата и время последнего редактирования сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `deleted_at: date-time` (required) — Дата и время удаления сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** diff --git a/apps/docs/public/api/pagination.md b/apps/docs/public/api/pagination.md index 135ae367..1f122417 100644 --- a/apps/docs/public/api/pagination.md +++ b/apps/docs/public/api/pagination.md @@ -16,8 +16,8 @@ API Пачки использует **cursor-based** пагинацию для #### PaginationMeta -- `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы ```json title="Пример ответа" @@ -33,7 +33,7 @@ API Пачки использует **cursor-based** пагинацию для Для перехода на следующую страницу передайте значение `next_page` в параметр `cursor` следующего запроса. Последняя страница достигнута, когда массив `data` вернулся пустым. -> Не определяйте последнюю страницу по количеству записей в ответе — оно может быть меньше `limit` и на промежуточных страницах. Проверяйте пустой массив `data`. Курсор — непрозрачный токен: не парсите и не сохраняйте его между сессиями. Всегда явно указывайте `limit` — не полагайтесь на значение по умолчанию. +> Поле `next_page` **всегда присутствует** в ответе и никогда не бывает `null` — даже на последней странице. Не используйте `next_page == null` как признак конца данных. Единственный надёжный способ — проверять, что массив `data` пуст. Количество записей в ответе может быть меньше `limit` и на промежуточных страницах — не полагайтесь на него. Курсор — непрозрачный токен: не парсите и не сохраняйте его между сессиями. Всегда явно указывайте `limit` — не полагайтесь на значение по умолчанию. ### Методы поиска diff --git a/apps/docs/public/api/reactions/list.md b/apps/docs/public/api/reactions/list.md index d631b566..98f083fb 100644 --- a/apps/docs/public/api/reactions/list.md +++ b/apps/docs/public/api/reactions/list.md @@ -39,9 +39,9 @@ curl "https://api.pachca.com/api/shared/v1/messages/194275/reactions?limit=1" \ - `created_at: date-time` (required) — Дата и время добавления реакции (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `code: string` (required) — Emoji символ реакции - `name: string` (required) — Название emoji реакции -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** diff --git a/apps/docs/public/api/read-member/list-readers.md b/apps/docs/public/api/read-member/list-readers.md index cf081e46..0927b77d 100644 --- a/apps/docs/public/api/read-member/list-readers.md +++ b/apps/docs/public/api/read-member/list-readers.md @@ -35,9 +35,9 @@ curl "https://api.pachca.com/api/shared/v1/messages/194275/read_member_ids?limit **Схема ответа:** - `data: array of integer` (required) -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** diff --git a/apps/docs/public/api/security/list.md b/apps/docs/public/api/security/list.md index 2c2e7cfc..ea0e48a3 100644 --- a/apps/docs/public/api/security/list.md +++ b/apps/docs/public/api/security/list.md @@ -99,9 +99,9 @@ curl "https://api.pachca.com/api/shared/v1/audit_events?start_time=2025-05-01T09 - Тип значения: `any` - `ip_address: string` (required) — IP-адрес, с которого было выполнено действие - `user_agent: string` (required) — User agent клиента -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** diff --git a/apps/docs/public/api/tasks/list.md b/apps/docs/public/api/tasks/list.md index e2b0c9cd..2858db6e 100644 --- a/apps/docs/public/api/tasks/list.md +++ b/apps/docs/public/api/tasks/list.md @@ -50,9 +50,9 @@ curl "https://api.pachca.com/api/shared/v1/tasks?limit=1" \ - `data_type: string` (required) — Тип поля Значения: `string` — Строковое значение, `number` — Числовое значение, `date` — Дата, `link` — Ссылка - `value: string` (required) — Значение -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** diff --git a/apps/docs/public/api/users/list.md b/apps/docs/public/api/users/list.md index 1a7fa97a..4dd65b6b 100644 --- a/apps/docs/public/api/users/list.md +++ b/apps/docs/public/api/users/list.md @@ -65,9 +65,9 @@ curl "https://api.pachca.com/api/shared/v1/users?query=Олег&limit=1" \ - `last_activity_at: date-time` (required) — Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `time_zone: string` (required) — Часовой пояс пользователя - `image_url: string` (required) — Ссылка на скачивание аватарки пользователя -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** diff --git a/apps/docs/public/guides/n8n/setup.md b/apps/docs/public/guides/n8n/setup.md index 435745f8..572c7fe8 100644 --- a/apps/docs/public/guides/n8n/setup.md +++ b/apps/docs/public/guides/n8n/setup.md @@ -77,8 +77,9 @@ Credentials — данные для авторизации. Перейдите |------|:---:|----------| | **Base URL** | нет | Базовый URL API. По умолчанию `https://api.pachca.com/api/shared/v1`. Менять только для on-premise | | **Access Token** | да | Токен доступа к API | - | **Bot ID** | нет | ID бота — нужен для авторегистрации вебхука в [Pachca Trigger](/guides/n8n/trigger) | + | **Bot ID** | нет | ID бота — нужен для авторегистрации вебхука в [Pachca Trigger](/guides/n8n/trigger). Автоопределяется из токена бота | | **Signing Secret** | нет | Секрет для верификации входящих webhook-запросов (HMAC-SHA256) | + | **Webhook Allowed IPs** | нет | Список IP-адресов через запятую, с которых разрешены входящие вебхуки. Пачка отправляет с `37.200.70.177`. Пустое поле — разрешить все | ![Форма Credentials для Пачки в n8n](/images/n8n/credentials-v2.avif) diff --git a/apps/docs/public/guides/n8n/trigger.md b/apps/docs/public/guides/n8n/trigger.md index 3a775ebb..ce8aec35 100644 --- a/apps/docs/public/guides/n8n/trigger.md +++ b/apps/docs/public/guides/n8n/trigger.md @@ -119,15 +119,30 @@ sequenceDiagram 3. Вставьте URL в настройки бота в Пачке (раздел **Webhook URL**) 4. Активируйте workflow -## Проверка подписи +## Безопасность -Для защиты от поддельных запросов добавьте **Signing Secret** бота в [Credentials](/guides/n8n/setup#sozdanie-credentials). Trigger автоматически проверяет HMAC-SHA256 подпись каждого входящего запроса и отклоняет невалидные. +### Проверка подписи + +Для защиты от поддельных запросов добавьте **Signing Secret** бота в [Credentials](/guides/n8n/setup#sozdanie-credentials). Trigger автоматически проверяет HMAC-SHA256 подпись каждого входящего запроса через заголовок `pachca-signature` и отклоняет невалидные. Подробнее о механизме подписи — в разделе [Исходящие вебхуки](/guides/webhook#bezopasnost). > Рекомендуется всегда использовать Signing Secret в продакшене для защиты от несанкционированных запросов. +### Ограничение по IP + +Укажите **Webhook Allowed IPs** в [Credentials](/guides/n8n/setup#sozdanie-credentials) — через запятую список IP-адресов, с которых принимаются вебхуки. Пачка отправляет вебхуки с IP `37.200.70.177`. + +Если поле пустое — проверка IP отключена и запросы принимаются с любого адреса. + +> **Внимание:** Ограничение по IP — дополнительная мера. Заголовок `x-forwarded-for` может быть подменён, если n8n не стоит за доверенным reverse proxy. Используйте вместе с Signing Secret. + + +### Защита от повторов + +Trigger автоматически отклоняет события старше **5 минут** (по полю `webhook_timestamp` в теле запроса). Это защищает от replay-атак — повторной отправки перехваченного запроса. + ## Фильтрация событий Выберите конкретный тип события для фильтрации — workflow будет запускаться только при совпадении. Можно выбрать только один тип события на один узел Trigger. diff --git a/apps/docs/public/guides/sdk/csharp.md b/apps/docs/public/guides/sdk/csharp.md index 6f05500d..6d9a19b7 100644 --- a/apps/docs/public/guides/sdk/csharp.md +++ b/apps/docs/public/guides/sdk/csharp.md @@ -138,7 +138,7 @@ using Pachca.Sdk; // Список чатов var response = await client.Chats.ListChatsAsync(SortOrder.Desc, ChatAvailability.IsMember, DateTimeOffset.Parse("2025-01-01T00:00:00.000Z"), DateTimeOffset.Parse("2025-02-01T00:00:00.000Z"), false, 1, "eyJpZCI6MTAsImRpciI6ImFzYyJ9"); -// → ListChatsResponse(Data: List, Meta: PaginationMeta?) +// → ListChatsResponse(Data: List, Meta: PaginationMeta) ``` @@ -177,7 +177,7 @@ var response = await client.Chats.GetChatAsync(334); ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит поле `Meta.Paginate.NextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит поле `Meta.Paginate.NextPage` — курсор для следующей страницы. Курсор никогда не бывает `null` — конец данных определяется по пустому массиву `Data`. ### Ручная пагинация @@ -185,12 +185,13 @@ var response = await client.Chats.GetChatAsync(334); var chats = new List(); string? cursor = null; -do +while (true) { var response = await client.Chats.ListChatsAsync(cursor: cursor); + if (response.Data.Count == 0) break; chats.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; -} while (cursor != null); + cursor = response.Meta.Paginate.NextPage; +} ``` ### Автопагинация @@ -406,7 +407,7 @@ var response = await client.Messages.CreateMessageAsync(request); // Список сотрудников var response = await client.Users.ListUsersAsync("Олег", 1, "eyJpZCI6MTAsImRpciI6ImFzYyJ9"); -// → ListUsersResponse(Data: List, Meta: PaginationMeta?) +// → ListUsersResponse(Data: List, Meta: PaginationMeta) // Создание задачи var request = new TaskCreateRequest diff --git a/apps/docs/public/guides/sdk/go.md b/apps/docs/public/guides/sdk/go.md index 5cc4fe98..508efeff 100644 --- a/apps/docs/public/guides/sdk/go.md +++ b/apps/docs/public/guides/sdk/go.md @@ -154,7 +154,7 @@ params := &ListChatsParams{ Cursor: Ptr("eyJpZCI6MTAsImRpciI6ImFzYyJ9"), } response, err := client.Chats.ListChats(ctx, params) -// → ListChatsResponse{Data: []Chat, Meta: *PaginationMeta} +// → ListChatsResponse{Data: []Chat, Meta: PaginationMeta} ``` @@ -204,7 +204,7 @@ request := pachca.ChatUpdateRequest{ ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит `Meta.Paginate.NextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит `Meta.Paginate.NextPage` — курсор для следующей страницы. Курсор никогда не бывает пустым — конец данных определяется по пустому слайсу `Data`. ### Ручная пагинация @@ -216,13 +216,14 @@ for { if err != nil { log.Fatal(err) } + if len(response.Data) == 0 { + break + } for _, user := range response.Data { fmt.Println(user.FirstName, user.LastName) } - if response.Meta == nil || response.Meta.Paginate == nil || response.Meta.Paginate.NextPage == nil { - break - } - cursor = response.Meta.Paginate.NextPage + nextPage := response.Meta.Paginate.NextPage + cursor = &nextPage } ``` @@ -384,7 +385,7 @@ params := &ListUsersParams{ Cursor: Ptr("eyJpZCI6MTAsImRpciI6ImFzYyJ9"), } response, err := client.Users.ListUsers(ctx, params) -// → ListUsersResponse{Data: []User, Meta: *PaginationMeta} +// → ListUsersResponse{Data: []User, Meta: PaginationMeta} // Создание задачи request := TaskCreateRequest{ diff --git a/apps/docs/public/guides/sdk/kotlin.md b/apps/docs/public/guides/sdk/kotlin.md index 7d00894d..7de11adb 100644 --- a/apps/docs/public/guides/sdk/kotlin.md +++ b/apps/docs/public/guides/sdk/kotlin.md @@ -15,7 +15,7 @@ ```kotlin dependencies { - implementation("com.pachca:pachca-sdk:1.0.1") + implementation("com.pachca:pachca-sdk:latest.release") } ``` @@ -154,7 +154,7 @@ import com.pachca.sdk.SortOrder // Список чатов val response = client.chats.listChats(sortId = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = "2025-01-01T00:00:00.000Z", lastMessageAtBefore = "2025-02-01T00:00:00.000Z", personal = false, limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") -// → ListChatsResponse(data: List, meta: PaginationMeta?) +// → ListChatsResponse(data: List, meta: PaginationMeta) ``` @@ -190,19 +190,20 @@ val response = client.chats.getChat(id = 334) ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит `meta?.paginate?.nextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит `meta.paginate.nextPage` — курсор для следующей страницы. Курсор никогда не бывает `null` — конец данных определяется по пустому массиву `data`. ### Ручная пагинация ```kotlin var cursor: String? = null -do { +while (true) { val response = client.users.listUsers(limit = 50, cursor = cursor) + if (response.data.isEmpty()) break for (user in response.data) { println("${user.firstName} ${user.lastName}") } - cursor = response.meta?.paginate?.nextPage -} while (cursor != null) + cursor = response.meta.paginate.nextPage +} ``` ### Автопагинация @@ -375,7 +376,7 @@ val response = client.messages.createMessage(request = request) // Список сотрудников val response = client.users.listUsers(query = "Олег", limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") -// → ListUsersResponse(data: List, meta: PaginationMeta?) +// → ListUsersResponse(data: List, meta: PaginationMeta) // Создание задачи val request = TaskCreateRequest( diff --git a/apps/docs/public/guides/sdk/python.md b/apps/docs/public/guides/sdk/python.md index b5448871..9c082809 100644 --- a/apps/docs/public/guides/sdk/python.md +++ b/apps/docs/public/guides/sdk/python.md @@ -152,7 +152,7 @@ params = ListChatsParams( cursor="eyJpZCI6MTAsImRpciI6ImFzYyJ9" ) response = await client.chats.list_chats(params=params) -# → ListChatsResponse(data: list[Chat], meta: PaginationMeta | None) +# → ListChatsResponse(data: list[Chat], meta: PaginationMeta) ``` @@ -187,7 +187,7 @@ response = await client.chats.get_chat(id=334) ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит `meta.paginate.next_page` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит `meta.paginate.next_page` — курсор для следующей страницы. Курсор никогда не бывает `None` — конец данных определяется по пустому списку `data`. ### Ручная пагинация @@ -197,10 +197,10 @@ from pachca.models import ListUsersParams cursor = None while True: response = await client.users.list_users(ListUsersParams(limit=50, cursor=cursor)) + if not response.data: + break for user in response.data: print(user.first_name, user.last_name) - if not response.meta or not response.meta.paginate or not response.meta.paginate.next_page: - break cursor = response.meta.paginate.next_page ``` @@ -362,7 +362,7 @@ params = ListUsersParams( cursor="eyJpZCI6MTAsImRpciI6ImFzYyJ9" ) response = await client.users.list_users(params=params) -# → ListUsersResponse(data: list[User], meta: PaginationMeta | None) +# → ListUsersResponse(data: list[User], meta: PaginationMeta) # Создание задачи request = TaskCreateRequest( diff --git a/apps/docs/public/guides/sdk/swift.md b/apps/docs/public/guides/sdk/swift.md index 966188c0..c5c616b3 100644 --- a/apps/docs/public/guides/sdk/swift.md +++ b/apps/docs/public/guides/sdk/swift.md @@ -15,7 +15,7 @@ ```swift dependencies: [ - .package(url: "https://github.com/pachca/openapi", from: "1.0.1") + .package(url: "https://github.com/pachca/openapi", from: "1.0.0") ] ``` @@ -144,7 +144,7 @@ import PachcaSDK // Список чатов let response = try await client.chats.listChats(sortId: .desc, availability: .isMember, lastMessageAtAfter: "2025-01-01T00:00:00.000Z", lastMessageAtBefore: "2025-02-01T00:00:00.000Z", personal: false, limit: 1, cursor: "eyJpZCI6MTAsImRpciI6ImFzYyJ9") -// → ListChatsResponse(data: [Chat], meta: PaginationMeta?) +// → ListChatsResponse(data: [Chat], meta: PaginationMeta) ``` @@ -181,7 +181,7 @@ let response = try await client.chats.getChat(id: 334) ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит `meta?.paginate?.nextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит `meta.paginate.nextPage` — курсор для следующей страницы. Курсор никогда не бывает `nil` — конец данных определяется по пустому массиву `data`. ### Ручная пагинация @@ -189,11 +189,12 @@ let response = try await client.chats.getChat(id: 334) var cursor: String? = nil repeat { let response = try await client.users.listUsers(limit: 50, cursor: cursor) + if response.data.isEmpty { break } for user in response.data { print("\(user.firstName) \(user.lastName)") } - cursor = response.meta?.paginate?.nextPage -} while cursor != nil + cursor = response.meta.paginate.nextPage +} while true ``` ### Автопагинация @@ -347,7 +348,7 @@ let response = try await client.messages.createMessage(body: body) // Список сотрудников let response = try await client.users.listUsers(query: "Олег", limit: 1, cursor: "eyJpZCI6MTAsImRpciI6ImFzYyJ9") -// → ListUsersResponse(data: [User], meta: PaginationMeta?) +// → ListUsersResponse(data: [User], meta: PaginationMeta) // Создание задачи let body = TaskCreateRequest( diff --git a/apps/docs/public/guides/sdk/typescript.md b/apps/docs/public/guides/sdk/typescript.md index 1decb27b..1e46d9cd 100644 --- a/apps/docs/public/guides/sdk/typescript.md +++ b/apps/docs/public/guides/sdk/typescript.md @@ -144,7 +144,7 @@ const response = client.chats.listChats({ limit: 1, cursor: "eyJpZCI6MTAsImRpciI6ImFzYyJ9" }) -// → ListChatsResponse({ data: Chat[], meta?: PaginationMeta }) +// → ListChatsResponse({ data: Chat[], meta: PaginationMeta }) ``` @@ -179,20 +179,21 @@ const response = client.chats.getChat(334) ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит поле `meta.paginate.nextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит поле `meta.paginate.nextPage` — курсор для следующей страницы. Курсор никогда не бывает `null` — конец данных определяется по пустому массиву `data`. ### Ручная пагинация ```typescript let cursor: string | undefined -do { +for (;;) { const response = await client.users.listUsers({ limit: 50, cursor }) + if (response.data.length === 0) break for (const user of response.data) { console.log(user.firstName, user.lastName) } - cursor = response.meta?.paginate?.nextPage -} while (cursor) + cursor = response.meta.paginate.nextPage +} ``` ### Автопагинация @@ -366,7 +367,7 @@ const response = client.users.listUsers({ limit: 1, cursor: "eyJpZCI6MTAsImRpciI6ImFzYyJ9" }) -// → ListUsersResponse({ data: User[], meta?: PaginationMeta }) +// → ListUsersResponse({ data: User[], meta: PaginationMeta }) // Создание задачи const request: TaskCreateRequest = { diff --git a/apps/docs/public/llms-full.txt b/apps/docs/public/llms-full.txt index 0c77636b..8041c84b 100644 --- a/apps/docs/public/llms-full.txt +++ b/apps/docs/public/llms-full.txt @@ -1319,7 +1319,7 @@ const response = client.chats.listChats({ limit: 1, cursor: "eyJpZCI6MTAsImRpciI6ImFzYyJ9" }) -// → ListChatsResponse({ data: Chat[], meta?: PaginationMeta }) +// → ListChatsResponse({ data: Chat[], meta: PaginationMeta }) ``` @@ -1354,20 +1354,21 @@ const response = client.chats.getChat(334) ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит поле `meta.paginate.nextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит поле `meta.paginate.nextPage` — курсор для следующей страницы. Курсор никогда не бывает `null` — конец данных определяется по пустому массиву `data`. ### Ручная пагинация ```typescript let cursor: string | undefined -do { +for (;;) { const response = await client.users.listUsers({ limit: 50, cursor }) + if (response.data.length === 0) break for (const user of response.data) { console.log(user.firstName, user.lastName) } - cursor = response.meta?.paginate?.nextPage -} while (cursor) + cursor = response.meta.paginate.nextPage +} ``` ### Автопагинация @@ -1541,7 +1542,7 @@ const response = client.users.listUsers({ limit: 1, cursor: "eyJpZCI6MTAsImRpciI6ImFzYyJ9" }) -// → ListUsersResponse({ data: User[], meta?: PaginationMeta }) +// → ListUsersResponse({ data: User[], meta: PaginationMeta }) // Создание задачи const request: TaskCreateRequest = { @@ -1718,7 +1719,7 @@ params = ListChatsParams( cursor="eyJpZCI6MTAsImRpciI6ImFzYyJ9" ) response = await client.chats.list_chats(params=params) -# → ListChatsResponse(data: list[Chat], meta: PaginationMeta | None) +# → ListChatsResponse(data: list[Chat], meta: PaginationMeta) ``` @@ -1753,7 +1754,7 @@ response = await client.chats.get_chat(id=334) ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит `meta.paginate.next_page` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит `meta.paginate.next_page` — курсор для следующей страницы. Курсор никогда не бывает `None` — конец данных определяется по пустому списку `data`. ### Ручная пагинация @@ -1763,10 +1764,10 @@ from pachca.models import ListUsersParams cursor = None while True: response = await client.users.list_users(ListUsersParams(limit=50, cursor=cursor)) + if not response.data: + break for user in response.data: print(user.first_name, user.last_name) - if not response.meta or not response.meta.paginate or not response.meta.paginate.next_page: - break cursor = response.meta.paginate.next_page ``` @@ -1928,7 +1929,7 @@ params = ListUsersParams( cursor="eyJpZCI6MTAsImRpciI6ImFzYyJ9" ) response = await client.users.list_users(params=params) -# → ListUsersResponse(data: list[User], meta: PaginationMeta | None) +# → ListUsersResponse(data: list[User], meta: PaginationMeta) # Создание задачи request = TaskCreateRequest( @@ -2107,7 +2108,7 @@ params := &ListChatsParams{ Cursor: Ptr("eyJpZCI6MTAsImRpciI6ImFzYyJ9"), } response, err := client.Chats.ListChats(ctx, params) -// → ListChatsResponse{Data: []Chat, Meta: *PaginationMeta} +// → ListChatsResponse{Data: []Chat, Meta: PaginationMeta} ``` @@ -2157,7 +2158,7 @@ request := pachca.ChatUpdateRequest{ ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит `Meta.Paginate.NextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит `Meta.Paginate.NextPage` — курсор для следующей страницы. Курсор никогда не бывает пустым — конец данных определяется по пустому слайсу `Data`. ### Ручная пагинация @@ -2169,13 +2170,14 @@ for { if err != nil { log.Fatal(err) } + if len(response.Data) == 0 { + break + } for _, user := range response.Data { fmt.Println(user.FirstName, user.LastName) } - if response.Meta == nil || response.Meta.Paginate == nil || response.Meta.Paginate.NextPage == nil { - break - } - cursor = response.Meta.Paginate.NextPage + nextPage := response.Meta.Paginate.NextPage + cursor = &nextPage } ``` @@ -2337,7 +2339,7 @@ params := &ListUsersParams{ Cursor: Ptr("eyJpZCI6MTAsImRpciI6ImFzYyJ9"), } response, err := client.Users.ListUsers(ctx, params) -// → ListUsersResponse{Data: []User, Meta: *PaginationMeta} +// → ListUsersResponse{Data: []User, Meta: PaginationMeta} // Создание задачи request := TaskCreateRequest{ @@ -2380,7 +2382,7 @@ response, err := client.Tasks.CreateTask(ctx, request) ```kotlin dependencies { - implementation("com.pachca:pachca-sdk:1.0.1") + implementation("com.pachca:pachca-sdk:latest.release") } ``` @@ -2519,7 +2521,7 @@ import com.pachca.sdk.SortOrder // Список чатов val response = client.chats.listChats(sortId = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = "2025-01-01T00:00:00.000Z", lastMessageAtBefore = "2025-02-01T00:00:00.000Z", personal = false, limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") -// → ListChatsResponse(data: List, meta: PaginationMeta?) +// → ListChatsResponse(data: List, meta: PaginationMeta) ``` @@ -2555,19 +2557,20 @@ val response = client.chats.getChat(id = 334) ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит `meta?.paginate?.nextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит `meta.paginate.nextPage` — курсор для следующей страницы. Курсор никогда не бывает `null` — конец данных определяется по пустому массиву `data`. ### Ручная пагинация ```kotlin var cursor: String? = null -do { +while (true) { val response = client.users.listUsers(limit = 50, cursor = cursor) + if (response.data.isEmpty()) break for (user in response.data) { println("${user.firstName} ${user.lastName}") } - cursor = response.meta?.paginate?.nextPage -} while (cursor != null) + cursor = response.meta.paginate.nextPage +} ``` ### Автопагинация @@ -2740,7 +2743,7 @@ val response = client.messages.createMessage(request = request) // Список сотрудников val response = client.users.listUsers(query = "Олег", limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") -// → ListUsersResponse(data: List, meta: PaginationMeta?) +// → ListUsersResponse(data: List, meta: PaginationMeta) // Создание задачи val request = TaskCreateRequest( @@ -2780,7 +2783,7 @@ val response = client.tasks.createTask(request = request) ```swift dependencies: [ - .package(url: "https://github.com/pachca/openapi", from: "1.0.1") + .package(url: "https://github.com/pachca/openapi", from: "1.0.0") ] ``` @@ -2909,7 +2912,7 @@ import PachcaSDK // Список чатов let response = try await client.chats.listChats(sortId: .desc, availability: .isMember, lastMessageAtAfter: "2025-01-01T00:00:00.000Z", lastMessageAtBefore: "2025-02-01T00:00:00.000Z", personal: false, limit: 1, cursor: "eyJpZCI6MTAsImRpciI6ImFzYyJ9") -// → ListChatsResponse(data: [Chat], meta: PaginationMeta?) +// → ListChatsResponse(data: [Chat], meta: PaginationMeta) ``` @@ -2946,7 +2949,7 @@ let response = try await client.chats.getChat(id: 334) ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит `meta?.paginate?.nextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит `meta.paginate.nextPage` — курсор для следующей страницы. Курсор никогда не бывает `nil` — конец данных определяется по пустому массиву `data`. ### Ручная пагинация @@ -2954,11 +2957,12 @@ let response = try await client.chats.getChat(id: 334) var cursor: String? = nil repeat { let response = try await client.users.listUsers(limit: 50, cursor: cursor) + if response.data.isEmpty { break } for user in response.data { print("\(user.firstName) \(user.lastName)") } - cursor = response.meta?.paginate?.nextPage -} while cursor != nil + cursor = response.meta.paginate.nextPage +} while true ``` ### Автопагинация @@ -3112,7 +3116,7 @@ let response = try await client.messages.createMessage(body: body) // Список сотрудников let response = try await client.users.listUsers(query: "Олег", limit: 1, cursor: "eyJpZCI6MTAsImRpciI6ImFzYyJ9") -// → ListUsersResponse(data: [User], meta: PaginationMeta?) +// → ListUsersResponse(data: [User], meta: PaginationMeta) // Создание задачи let body = TaskCreateRequest( @@ -3275,7 +3279,7 @@ using Pachca.Sdk; // Список чатов var response = await client.Chats.ListChatsAsync(SortOrder.Desc, ChatAvailability.IsMember, DateTimeOffset.Parse("2025-01-01T00:00:00.000Z"), DateTimeOffset.Parse("2025-02-01T00:00:00.000Z"), false, 1, "eyJpZCI6MTAsImRpciI6ImFzYyJ9"); -// → ListChatsResponse(Data: List, Meta: PaginationMeta?) +// → ListChatsResponse(Data: List, Meta: PaginationMeta) ``` @@ -3314,7 +3318,7 @@ var response = await client.Chats.GetChatAsync(334); ## Пагинация -Методы, возвращающие списки, используют cursor-based пагинацию. Ответ содержит поле `Meta.Paginate.NextPage` — курсор для следующей страницы. +Методы, возвращающие списки, используют cursor-based пагинацию. Ответ всегда содержит поле `Meta.Paginate.NextPage` — курсор для следующей страницы. Курсор никогда не бывает `null` — конец данных определяется по пустому массиву `Data`. ### Ручная пагинация @@ -3322,12 +3326,13 @@ var response = await client.Chats.GetChatAsync(334); var chats = new List(); string? cursor = null; -do +while (true) { var response = await client.Chats.ListChatsAsync(cursor: cursor); + if (response.Data.Count == 0) break; chats.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; -} while (cursor != null); + cursor = response.Meta.Paginate.NextPage; +} ``` ### Автопагинация @@ -3543,7 +3548,7 @@ var response = await client.Messages.CreateMessageAsync(request); // Список сотрудников var response = await client.Users.ListUsersAsync("Олег", 1, "eyJpZCI6MTAsImRpciI6ImFzYyJ9"); -// → ListUsersResponse(Data: List, Meta: PaginationMeta?) +// → ListUsersResponse(Data: List, Meta: PaginationMeta) // Создание задачи var request = new TaskCreateRequest @@ -5672,8 +5677,9 @@ Credentials — данные для авторизации. Перейдите |------|:---:|----------| | **Base URL** | нет | Базовый URL API. По умолчанию `https://api.pachca.com/api/shared/v1`. Менять только для on-premise | | **Access Token** | да | Токен доступа к API | - | **Bot ID** | нет | ID бота — нужен для авторегистрации вебхука в [Pachca Trigger](/guides/n8n/trigger) | + | **Bot ID** | нет | ID бота — нужен для авторегистрации вебхука в [Pachca Trigger](/guides/n8n/trigger). Автоопределяется из токена бота | | **Signing Secret** | нет | Секрет для верификации входящих webhook-запросов (HMAC-SHA256) | + | **Webhook Allowed IPs** | нет | Список IP-адресов через запятую, с которых разрешены входящие вебхуки. Пачка отправляет с `37.200.70.177`. Пустое поле — разрешить все | ![Форма Credentials для Пачки в n8n](/images/n8n/credentials-v2.avif) @@ -6232,15 +6238,30 @@ sequenceDiagram 3. Вставьте URL в настройки бота в Пачке (раздел **Webhook URL**) 4. Активируйте workflow -## Проверка подписи +## Безопасность + +### Проверка подписи -Для защиты от поддельных запросов добавьте **Signing Secret** бота в [Credentials](/guides/n8n/setup#sozdanie-credentials). Trigger автоматически проверяет HMAC-SHA256 подпись каждого входящего запроса и отклоняет невалидные. +Для защиты от поддельных запросов добавьте **Signing Secret** бота в [Credentials](/guides/n8n/setup#sozdanie-credentials). Trigger автоматически проверяет HMAC-SHA256 подпись каждого входящего запроса через заголовок `pachca-signature` и отклоняет невалидные. Подробнее о механизме подписи — в разделе [Исходящие вебхуки](/guides/webhook#bezopasnost). > Рекомендуется всегда использовать Signing Secret в продакшене для защиты от несанкционированных запросов. +### Ограничение по IP + +Укажите **Webhook Allowed IPs** в [Credentials](/guides/n8n/setup#sozdanie-credentials) — через запятую список IP-адресов, с которых принимаются вебхуки. Пачка отправляет вебхуки с IP `37.200.70.177`. + +Если поле пустое — проверка IP отключена и запросы принимаются с любого адреса. + +> **Внимание:** Ограничение по IP — дополнительная мера. Заголовок `x-forwarded-for` может быть подменён, если n8n не стоит за доверенным reverse proxy. Используйте вместе с Signing Secret. + + +### Защита от повторов + +Trigger автоматически отклоняет события старше **5 минут** (по полю `webhook_timestamp` в теле запроса). Это защищает от replay-атак — повторной отправки перехваченного запроса. + ## Фильтрация событий Выберите конкретный тип события для фильтрации — workflow будет запускаться только при совпадении. Можно выбрать только один тип события на один узел Trigger. @@ -7955,8 +7976,8 @@ API Пачки использует **cursor-based** пагинацию для #### PaginationMeta -- `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы ```json title="Пример ответа" @@ -7972,7 +7993,7 @@ API Пачки использует **cursor-based** пагинацию для Для перехода на следующую страницу передайте значение `next_page` в параметр `cursor` следующего запроса. Последняя страница достигнута, когда массив `data` вернулся пустым. -> Не определяйте последнюю страницу по количеству записей в ответе — оно может быть меньше `limit` и на промежуточных страницах. Проверяйте пустой массив `data`. Курсор — непрозрачный токен: не парсите и не сохраняйте его между сессиями. Всегда явно указывайте `limit` — не полагайтесь на значение по умолчанию. +> Поле `next_page` **всегда присутствует** в ответе и никогда не бывает `null` — даже на последней странице. Не используйте `next_page == null` как признак конца данных. Единственный надёжный способ — проверять, что массив `data` пуст. Количество записей в ответе может быть меньше `limit` и на промежуточных страницах — не полагайтесь на него. Курсор — непрозрачный токен: не парсите и не сохраняйте его между сессиями. Всегда явно указывайте `limit` — не полагайтесь на значение по умолчанию. ### Методы поиска @@ -10352,9 +10373,9 @@ curl "https://api.pachca.com/api/shared/v1/users?query=Олег&limit=1" \ - `last_activity_at: date-time` (required) — Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `time_zone: string` (required) — Часовой пояс пользователя - `image_url: string` (required) — Ссылка на скачивание аватарки пользователя -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** @@ -11873,9 +11894,9 @@ curl "https://api.pachca.com/api/shared/v1/group_tags?names[]=Design&names[]=Pro - `id: integer, int32` (required) — Идентификатор тега - `name: string` (required) — Название тега - `users_count: integer, int32` (required) — Количество сотрудников, которые имеют этот тег -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** @@ -12591,9 +12612,9 @@ curl "https://api.pachca.com/api/shared/v1/group_tags/9111/users?limit=1" \ - `last_activity_at: date-time` (required) — Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `time_zone: string` (required) — Часовой пояс пользователя - `image_url: string` (required) — Ссылка на скачивание аватарки пользователя -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** @@ -13097,9 +13118,9 @@ curl "https://api.pachca.com/api/shared/v1/chats?sort[id]=desc&availability=is_m - `public: boolean` (required) — Открытый доступ - `last_message_at: date-time` (required) — Дата и время создания последнего сообщения в чате (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `meet_room_url: string` (required) — Ссылка на Видеочат -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** @@ -14378,9 +14399,9 @@ curl "https://api.pachca.com/api/shared/v1/chats/334/members?role=all&limit=1" \ - `last_activity_at: date-time` (required) — Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `time_zone: string` (required) — Часовой пояс пользователя - `image_url: string` (required) — Ссылка на скачивание аватарки пользователя -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** @@ -15713,9 +15734,9 @@ curl "https://api.pachca.com/api/shared/v1/messages?chat_id=198&sort[id]=desc&li - `display_name: string` (required) — Полное имя отправителя сообщения - `changed_at: date-time` (required) — Дата и время последнего редактирования сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `deleted_at: date-time` (required) — Дата и время удаления сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** @@ -16870,9 +16891,9 @@ curl "https://api.pachca.com/api/shared/v1/messages/194275/read_member_ids?limit **Схема ответа:** - `data: array of integer` (required) -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** @@ -17453,9 +17474,9 @@ curl "https://api.pachca.com/api/shared/v1/messages/194275/reactions?limit=1" \ - `created_at: date-time` (required) — Дата и время добавления реакции (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `code: string` (required) — Emoji символ реакции - `name: string` (required) — Название emoji реакции -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** @@ -18824,9 +18845,9 @@ curl "https://api.pachca.com/api/shared/v1/tasks?limit=1" \ - `data_type: string` (required) — Тип поля Значения: `string` — Строковое значение, `number` — Числовое значение, `date` — Дата, `link` — Ссылка - `value: string` (required) — Значение -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** @@ -20461,9 +20482,9 @@ curl "https://api.pachca.com/api/shared/v1/webhooks/events?limit=1" \ - `created_at: date-time` (required) — Дата и время создания сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `webhook_timestamp: integer, int32` (required) — Дата и время отправки вебхука (UTC+0) в формате UNIX - `created_at: date-time` (required) — Дата и время создания события (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** @@ -20857,9 +20878,9 @@ curl "https://api.pachca.com/api/shared/v1/audit_events?start_time=2025-05-01T09 - Тип значения: `any` - `ip_address: string` (required) — IP-адрес, с которого было выполнено действие - `user_agent: string` (required) — User agent клиента -- `meta: object` — Метаданные пагинации - - `paginate: object` — Вспомогательная информация - - `next_page: string` — Курсор пагинации следующей страницы +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** diff --git a/integrations/n8n/nodes/Pachca/GenericFunctions.ts b/integrations/n8n/nodes/Pachca/GenericFunctions.ts index 657174b1..74818905 100644 --- a/integrations/n8n/nodes/Pachca/GenericFunctions.ts +++ b/integrations/n8n/nodes/Pachca/GenericFunctions.ts @@ -50,12 +50,12 @@ const STATUS_HINTS: Record = { /** Key fields per resource for Simplify mode — only these fields are returned */ const SIMPLIFY_FIELDS: Record = { message: ['id', 'entity_id', 'chat_id', 'content', 'user_id', 'created_at'], - chat: ['id', 'name', 'channel', 'public', 'members_count', 'created_at'], + chat: ['id', 'name', 'channel', 'public', 'member_ids', 'created_at'], user: ['id', 'first_name', 'last_name', 'nickname', 'email', 'role', 'suspended'], task: ['id', 'content', 'kind', 'status', 'priority', 'due_at', 'created_at'], - bot: ['id', 'name', 'created_at'], + bot: ['id', 'webhook'], groupTag: ['id', 'name', 'users_count'], - reaction: ['id', 'code', 'user_id', 'created_at'], + reaction: ['code', 'name', 'user_id', 'created_at'], export: ['id', 'status', 'created_at'], }; @@ -363,11 +363,35 @@ export async function makeApiRequest( if (method !== 'GET' && method !== 'DELETE') { headers['Content-Type'] = 'application/json'; } + // Separate array params from scalar params — arrays need []= format for Rails + let scalarQs: IDataObject | undefined = qs; + let arrayQuerySuffix = ''; + if (qs) { + const scalarEntries: [string, unknown][] = []; + const arrayParts: string[] = []; + for (const [key, value] of Object.entries(qs)) { + if (Array.isArray(value)) { + for (const v of value) { + arrayParts.push(`${encodeURIComponent(key + '[]')}=${encodeURIComponent(String(v))}`); + } + } else { + scalarEntries.push([key, value]); + } + } + scalarQs = scalarEntries.length > 0 ? Object.fromEntries(scalarEntries) as IDataObject : undefined; + arrayQuerySuffix = arrayParts.join('&'); + } + + let url = `${baseUrl}${endpoint}`; + if (arrayQuerySuffix) { + url += (url.includes('?') ? '&' : '?') + arrayQuerySuffix; + } + const options: IHttpRequestOptions = { method, - url: `${baseUrl}${endpoint}`, + url, headers, - qs, + qs: scalarQs, body: (method !== 'GET' && method !== 'DELETE') ? body : undefined, returnFullResponse: true, ignoreHttpStatusErrors: true, @@ -460,7 +484,9 @@ export async function makeApiRequestAllPages( if (hasV1CollectionPagination) { const response = await makeApiRequest.call(this, method, endpoint, undefined, qs, itemIndex); const items = (response.data as IDataObject[]) ?? []; - return items.map(item => ({ json: item })); + return items.map(item => ({ + json: typeof item === 'object' && item !== null ? item : { value: item } as unknown as IDataObject, + })); } } @@ -474,14 +500,14 @@ export async function makeApiRequestAllPages( const limit = returnAll ? 0 : ((this.getNodeParameter('limit', itemIndex, 50) as number) || 50); const results: IDataObject[] = []; let cursor: string | undefined; - let previousCursor: string | undefined; let totalRetries = 0; const MAX_RETRIES = 5; const MAX_PAGES = 1000; let pageCount = 0; do { - const pageQs: IDataObject = { ...qs, limit: 50 }; + const perPage = returnAll ? 200 : limit; + const pageQs: IDataObject = { ...qs, limit: perPage }; if (cursor) pageQs.cursor = cursor; // Inner retry loop: avoids `continue` on the outer do-while, which @@ -513,9 +539,8 @@ export async function makeApiRequestAllPages( const paginate = meta?.paginate as IDataObject | undefined; const nextCursor = (paginate?.next_page as string) ?? undefined; - // Guard against infinite loops: duplicate cursor or too many pages - if (nextCursor && nextCursor === previousCursor) break; - previousCursor = cursor; + // Guard against infinite loops: server returned the same cursor we just sent + if (nextCursor && nextCursor === cursor) break; cursor = nextCursor; pageCount++; } while (cursor && (returnAll || results.length < limit) && pageCount < MAX_PAGES); @@ -536,14 +561,18 @@ export async function makeApiRequestAllPages( } } - return finalResults.map(item => ({ json: item })); + return finalResults.map(item => ({ + json: typeof item === 'object' && item !== null ? item : { value: item } as unknown as IDataObject, + })); } /** Simplify a single item by keeping only key fields for the resource */ export function simplifyItem(item: IDataObject, resource: string): IDataObject { const keyFields = SIMPLIFY_FIELDS[resource]; if (!keyFields) return item; - return Object.fromEntries(Object.entries(item).filter(([k]) => keyFields.includes(k))); + const simplified = Object.fromEntries(Object.entries(item).filter(([k]) => keyFields.includes(k))); + // If no fields matched (e.g. status response with user resource), return original + return Object.keys(simplified).length > 0 ? simplified : item; } /** diff --git a/integrations/n8n/nodes/Pachca/SharedRouter.ts b/integrations/n8n/nodes/Pachca/SharedRouter.ts index 54d1d18c..e9f25670 100644 --- a/integrations/n8n/nodes/Pachca/SharedRouter.ts +++ b/integrations/n8n/nodes/Pachca/SharedRouter.ts @@ -43,6 +43,8 @@ interface QueryMap { n8n: string; locator?: boolean; required?: boolean; + isArray?: boolean; + arrayType?: 'int' | 'string'; } interface RouteConfig { @@ -137,7 +139,8 @@ const ROUTES: Record> = { method: 'GET' as IHttpRequestMethods, path: '/chats', paginated: true, - queryMap: [{ api: 'availability', n8n: 'availability' }, { api: 'last_message_at_after', n8n: 'lastMessageAtAfter' }, { api: 'last_message_at_before', n8n: 'lastMessageAtBefore' }, { api: 'personal', n8n: 'personal' }], + queryMap: [{ api: 'availability', n8n: 'availability' }, { api: 'last_message_at_after', n8n: 'lastMessageAtAfter' }, { api: 'last_message_at_before', n8n: 'lastMessageAtBefore' }], + optionalQueryMap: [{ api: 'personal', n8n: 'personal' }], }, get: { method: 'GET' as IHttpRequestMethods, @@ -260,7 +263,7 @@ const ROUTES: Record> = { method: 'GET' as IHttpRequestMethods, path: '/group_tags', paginated: true, - queryMap: [{ api: 'names', n8n: 'names' }], + queryMap: [{ api: 'names', n8n: 'names', isArray: true, arrayType: 'string' }], }, get: { method: 'GET' as IHttpRequestMethods, @@ -477,14 +480,14 @@ const ROUTES: Record> = { path: '/search/messages', paginated: true, queryMap: [{ api: 'query', n8n: 'query' }], - optionalQueryMap: [{ api: 'order', n8n: 'order' }, { api: 'created_from', n8n: 'createdFrom' }, { api: 'created_to', n8n: 'createdTo' }, { api: 'chat_ids', n8n: 'chatIds' }, { api: 'user_ids', n8n: 'userIds' }, { api: 'active', n8n: 'active' }], + optionalQueryMap: [{ api: 'order', n8n: 'order' }, { api: 'created_from', n8n: 'createdFrom' }, { api: 'created_to', n8n: 'createdTo' }, { api: 'chat_ids', n8n: 'chatIds', isArray: true, arrayType: 'int' }, { api: 'user_ids', n8n: 'userIds', isArray: true, arrayType: 'int' }, { api: 'active', n8n: 'active' }], }, getAllUsers: { method: 'GET' as IHttpRequestMethods, path: '/search/users', paginated: true, queryMap: [{ api: 'query', n8n: 'query' }], - optionalQueryMap: [{ api: 'sort', n8n: 'sort' }, { api: 'order', n8n: 'order' }, { api: 'created_from', n8n: 'createdFrom' }, { api: 'created_to', n8n: 'createdTo' }, { api: 'company_roles', n8n: 'companyRoles' }], + optionalQueryMap: [{ api: 'sort', n8n: 'sort' }, { api: 'order', n8n: 'order' }, { api: 'created_from', n8n: 'createdFrom' }, { api: 'created_to', n8n: 'createdTo' }, { api: 'company_roles', n8n: 'companyRoles', isArray: true, arrayType: 'string' }], }, }, task: { @@ -855,9 +858,15 @@ async function executeRoute( } else { val = this.getNodeParameter(qm.n8n, i); } - if (val !== undefined && val !== null && val !== '') qs[qm.api] = val as IDataObject; + if (val !== undefined && val !== null && val !== '') { + if (qm.isArray && typeof val === 'string') { + qs[qm.api] = splitAndValidateCommaList(this, val, qm.n8n, qm.arrayType!, i); + } else { + qs[qm.api] = val as IDataObject; + } + } } catch (e) { - if (qm.required) throw e; // Required query param must be present + if (qm.required) throw e; } } @@ -867,7 +876,13 @@ async function executeRoute( if (val === undefined) { try { val = this.getNodeParameter(qm.n8n, i, undefined); } catch { /* not present */ } } - if (val !== undefined && val !== null && val !== '') qs[qm.api] = val; + if (val !== undefined && val !== null && val !== '') { + if (qm.isArray && typeof val === 'string') { + qs[qm.api] = splitAndValidateCommaList(this, val, qm.n8n, qm.arrayType!, i); + } else { + qs[qm.api] = val; + } + } } // === Special handlers === diff --git a/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts b/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts index 791e00ad..9222e464 100644 --- a/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts @@ -153,13 +153,22 @@ export const chatFields: INodeProperties[] = [ routing: { send: { type: 'query', property: 'last_message_at_before' } }, }, { - displayName: 'Personal', - name: 'personal', - type: 'boolean', - default: false, - description: 'Whether to filter by direct and group chats. If not specified, all chats are returned.', + displayName: 'Additional Fields', + name: 'additionalFields', + type: 'collection', + placeholder: 'Add Field', + default: {}, displayOptions: { show: { resource: ['chat'], operation: ['getAll'] } }, - routing: { send: { type: 'query', property: 'personal' } }, + options: [ + { + displayName: 'Personal', + name: 'personal', + type: 'boolean', + default: false, + description: 'Whether to filter by direct and group chats. If not specified, all chats are returned.', + routing: { send: { type: 'query', property: 'personal' } }, + }, + ], }, { displayName: 'ID', diff --git a/integrations/n8n/nodes/Pachca/V2/LinkPreviewDescription.ts b/integrations/n8n/nodes/Pachca/V2/LinkPreviewDescription.ts index 7ee3d1d7..411c5f65 100644 --- a/integrations/n8n/nodes/Pachca/V2/LinkPreviewDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/LinkPreviewDescription.ts @@ -33,7 +33,7 @@ export const linkPreviewFields: INodeProperties[] = [ name: 'linkPreviews', type: 'json', required: true, - default: {}, + default: "{}", description: 'JSON map of link previews, where each key is a `URL` received in the outgoing webhook about a new message', displayOptions: { show: { resource: ['linkPreview'], operation: ['create'] } }, routing: { send: { type: 'body', property: 'link_previews' } }, diff --git a/integrations/n8n/nodes/Pachca/V2/ReadMemberDescription.ts b/integrations/n8n/nodes/Pachca/V2/ReadMemberDescription.ts index 0386fda5..0d66b1ca 100644 --- a/integrations/n8n/nodes/Pachca/V2/ReadMemberDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/ReadMemberDescription.ts @@ -42,7 +42,7 @@ export const readMemberFields: INodeProperties[] = [ type: 'number', default: 50, description: 'Max number of results to return', - typeOptions: { minValue: 1, maxValue: 50 }, + typeOptions: { minValue: 1, maxValue: 300 }, displayOptions: { show: { resource: ['readMember'], operation: ['getAllReadMemberIds'], returnAll: [false] } }, }, { diff --git a/integrations/n8n/nodes/Pachca/V2/SearchDescription.ts b/integrations/n8n/nodes/Pachca/V2/SearchDescription.ts index b551fc55..6cf603b6 100644 --- a/integrations/n8n/nodes/Pachca/V2/SearchDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/SearchDescription.ts @@ -43,7 +43,7 @@ export const searchFields: INodeProperties[] = [ type: 'number', default: 50, description: 'Max number of results to return', - typeOptions: { minValue: 1, maxValue: 50 }, + typeOptions: { minValue: 1, maxValue: 100 }, displayOptions: { show: { resource: ['search'], operation: ['getAllChats'], returnAll: [false] } }, }, { @@ -142,7 +142,7 @@ export const searchFields: INodeProperties[] = [ type: 'number', default: 50, description: 'Max number of results to return', - typeOptions: { minValue: 1, maxValue: 50 }, + typeOptions: { minValue: 1, maxValue: 200 }, displayOptions: { show: { resource: ['search'], operation: ['getAllMessages'], returnAll: [false] } }, }, { @@ -241,7 +241,7 @@ export const searchFields: INodeProperties[] = [ type: 'number', default: 50, description: 'Max number of results to return', - typeOptions: { minValue: 1, maxValue: 50 }, + typeOptions: { minValue: 1, maxValue: 200 }, displayOptions: { show: { resource: ['search'], operation: ['getAllUsers'], returnAll: [false] } }, }, { diff --git a/integrations/n8n/scripts/generate-n8n.ts b/integrations/n8n/scripts/generate-n8n.ts index 03b86a0c..1af7f99a 100644 --- a/integrations/n8n/scripts/generate-n8n.ts +++ b/integrations/n8n/scripts/generate-n8n.ts @@ -708,6 +708,22 @@ function getArrayItemType(field: BodyField): 'int' | 'string' { return (itemType === 'integer' || itemType === 'number') ? 'int' : 'string'; } +/** Check if a query parameter is an array of primitives */ +function isQueryParamArray(param: Parameter): boolean { + const schema = resolveQuerySchema(param.schema); + return getSchemaType(schema) === 'array' && !!schema.items && !schema.items.properties; +} + +/** Get the item type for a query parameter array */ +function getQueryArrayItemType(param: Parameter): 'int' | 'string' { + const schema = resolveQuerySchema(param.schema); + const items = schema.items; + if (!items) return 'string'; + const resolved = items.allOf ? resolveAllOf(items) : items; + const itemType = getSchemaType(resolved); + return (itemType === 'integer' || itemType === 'number') ? 'int' : 'string'; +} + /** Ensure boolean descriptions start with "Whether" (eslint requirement) */ function booleanDescription(desc?: string): string { if (!desc) return 'Whether to enable this option'; @@ -905,12 +921,14 @@ function generateResourceDescription( lines.push(`\t},`); lines.push(`\t{`); + const limitParam = op.queryParams.find(p => p.name === 'limit'); + const maxLimit = limitParam?.schema?.maximum ?? 50; lines.push(`\t\tdisplayName: 'Limit',`); lines.push(`\t\tname: 'limit',`); lines.push(`\t\ttype: 'number',`); lines.push(`\t\tdefault: 50,`); lines.push(`\t\tdescription: 'Max number of results to return',`); - lines.push(`\t\ttypeOptions: { minValue: 1, maxValue: 50 },`); + lines.push(`\t\ttypeOptions: { minValue: 1, maxValue: ${maxLimit} },`); lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}], returnAll: [false] } },`); lines.push(`\t},`); @@ -990,14 +1008,18 @@ function generateResourceDescription( p => !['limit', 'cursor', 'per', 'page'].includes(p.name) && !p.name.includes('{') ); - // Split into primary (top-level) and filter (collection) params + // Split into primary (top-level) and filter (collection) params. + // Optional boolean query params always go into filter (Additional Fields) because + // boolean default false is indistinguishable from "not set" at the UI level, + // but the API may treat absence differently from false (e.g. chat.getAll personal). const shouldWrapFilters = QUERY_FILTER_RESOURCES.has(resource); + const isOptionalBool = (p: Parameter) => !p.required && queryParamN8nType(p.schema) === 'boolean'; const primaryParams = shouldWrapFilters ? nonPaginationParams.filter(p => p.required || PRIMARY_QUERY_PARAMS.has(p.name)) - : nonPaginationParams; + : nonPaginationParams.filter(p => !isOptionalBool(p)); const filterParams = shouldWrapFilters ? nonPaginationParams.filter(p => !p.required && !PRIMARY_QUERY_PARAMS.has(p.name)) - : []; + : nonPaginationParams.filter(p => isOptionalBool(p)); for (const param of primaryParams) { const paramName = getParamName(resource, op.v1Op, param.name); @@ -1712,7 +1734,7 @@ function getDefaultValue(field: BodyField, resource: string, op: string, paramNa if (field.type === 'array' && !field.items?.properties) return ''; if (field.type === 'array') return []; if (field.type === 'object' && n8nFieldType === 'string') return ''; - if (field.type === 'object') return {}; + if (field.type === 'object') return '{}'; // n8n json type expects string default return ''; } @@ -2583,12 +2605,14 @@ function buildRouteEntry(resource: string, op: OperationInfo): string { // BUG 1 fix: user.getAll query param must be in optionalQueryMap (read from v1Collection with fallback) const isUserGetAll = resource === 'user' && op.v2Op === 'getAll'; + // Optional boolean query params always go to optionalQueryMap (same logic as Description generation) + const isOptionalBool = (p: Parameter) => !p.required && queryParamN8nType(p.schema) === 'boolean'; const topLevelQueryParams = shouldWrapFilters ? nonPaginationParams.filter(p => p.required || PRIMARY_QUERY_PARAMS.has(p.name)) - : isUserGetAll ? [] : nonPaginationParams; + : isUserGetAll ? [] : nonPaginationParams.filter(p => !isOptionalBool(p)); const filterQueryParams = shouldWrapFilters ? nonPaginationParams.filter(p => !p.required && !PRIMARY_QUERY_PARAMS.has(p.name)) - : isUserGetAll ? nonPaginationParams : []; + : isUserGetAll ? nonPaginationParams : nonPaginationParams.filter(p => isOptionalBool(p)); const queryMapEntries: string[] = []; for (const p of topLevelQueryParams) { @@ -2597,6 +2621,10 @@ function buildRouteEntry(resource: string, op: OperationInfo): string { const qm: string[] = [`api: '${p.name}'`, `n8n: '${n8nName}'`]; if (locator) qm.push('locator: true'); if (p.required) qm.push('required: true'); + if (isQueryParamArray(p)) { + qm.push('isArray: true'); + qm.push(`arrayType: '${getQueryArrayItemType(p)}'`); + } queryMapEntries.push(`{ ${qm.join(', ')} }`); } if (queryMapEntries.length) parts.push(`queryMap: [${queryMapEntries.join(', ')}]`); @@ -2604,7 +2632,12 @@ function buildRouteEntry(resource: string, op: OperationInfo): string { const optQueryEntries: string[] = []; for (const p of filterQueryParams) { const n8nName = getParamName(resource, op.v1Op, p.name); - optQueryEntries.push(`{ api: '${p.name}', n8n: '${n8nName}' }`); + const qm: string[] = [`api: '${p.name}'`, `n8n: '${n8nName}'`]; + if (isQueryParamArray(p)) { + qm.push('isArray: true'); + qm.push(`arrayType: '${getQueryArrayItemType(p)}'`); + } + optQueryEntries.push(`{ ${qm.join(', ')} }`); } // v1 compat: pagination fields from V1-specific collections (not in OpenAPI spec) const v1Pagination = V1_COMPAT_PAGINATION[resource]?.[v2Op]; @@ -2767,6 +2800,8 @@ interface QueryMap { \tn8n: string; \tlocator?: boolean; \trequired?: boolean; +\tisArray?: boolean; +\tarrayType?: 'int' | 'string'; } interface RouteConfig { @@ -2969,9 +3004,15 @@ async function executeRoute( \t\t\t} else { \t\t\t\tval = this.getNodeParameter(qm.n8n, i); \t\t\t} -\t\t\tif (val !== undefined && val !== null && val !== '') qs[qm.api] = val as IDataObject; +\t\t\tif (val !== undefined && val !== null && val !== '') { +\t\t\t\tif (qm.isArray && typeof val === 'string') { +\t\t\t\t\tqs[qm.api] = splitAndValidateCommaList(this, val, qm.n8n, qm.arrayType!, i); +\t\t\t\t} else { +\t\t\t\t\tqs[qm.api] = val as IDataObject; +\t\t\t\t} +\t\t\t} \t\t} catch (e) { -\t\t\tif (qm.required) throw e; // Required query param must be present +\t\t\tif (qm.required) throw e; \t\t} \t} @@ -2981,7 +3022,13 @@ async function executeRoute( \t\tif (val === undefined) { \t\t\ttry { val = this.getNodeParameter(qm.n8n, i, undefined); } catch { /* not present */ } \t\t} -\t\tif (val !== undefined && val !== null && val !== '') qs[qm.api] = val; +\t\tif (val !== undefined && val !== null && val !== '') { +\t\t\tif (qm.isArray && typeof val === 'string') { +\t\t\t\tqs[qm.api] = splitAndValidateCommaList(this, val, qm.n8n, qm.arrayType!, i); +\t\t\t} else { +\t\t\t\tqs[qm.api] = val; +\t\t\t} +\t\t} \t} \t// === Special handlers === diff --git a/integrations/n8n/tests/error-paths.test.ts b/integrations/n8n/tests/error-paths.test.ts index 8e352000..395712d7 100644 --- a/integrations/n8n/tests/error-paths.test.ts +++ b/integrations/n8n/tests/error-paths.test.ts @@ -326,25 +326,19 @@ describe('makeApiRequestAllPages error paths', () => { body: { data: [{ id: 2 }], meta: { paginate: { next_page: 'cursor-A' } } }, headers: {}, }; - const page3 = { - statusCode: 200, - body: { data: [{ id: 3 }], meta: { paginate: { next_page: 'cursor-A' } } }, - headers: {}, - }; const ctx = createExecCtx({ - httpResponses: [page1, page2, page3], + httpResponses: [page1, page2], params: { returnAll: true }, }); const results = await makeApiRequestAllPages.call( ctx, 'GET', '/users', {}, 0, 'user', 2, ); - // Guard compares nextCursor with previousCursor (one behind current): - // Page 1: nextCursor=A, previousCursor=undefined → no match - // Page 2: nextCursor=A, previousCursor=undefined → no match - // Page 3: nextCursor=A, previousCursor=A → match → break - expect(results).toHaveLength(3); + // Guard compares nextCursor with current cursor: + // Page 1: cursor=undefined, nextCursor=cursor-A → no match → cursor becomes cursor-A + // Page 2: cursor=cursor-A, nextCursor=cursor-A → match → break + expect(results).toHaveLength(2); }); it('should respect limit and not fetch extra pages', async () => { diff --git a/integrations/n8n/tests/execute-helpers.test.ts b/integrations/n8n/tests/execute-helpers.test.ts index 874951a0..3e962a87 100644 --- a/integrations/n8n/tests/execute-helpers.test.ts +++ b/integrations/n8n/tests/execute-helpers.test.ts @@ -84,7 +84,7 @@ describe('simplifyItem', () => { name: 'General', channel: true, public: true, - members_count: 50, + member_ids: [1, 2, 3], created_at: '2026-01-01', description: 'should be removed', owner_id: 1, @@ -95,7 +95,7 @@ describe('simplifyItem', () => { name: 'General', channel: true, public: true, - members_count: 50, + member_ids: [1, 2, 3], created_at: '2026-01-01', }); }); @@ -149,9 +149,9 @@ describe('simplifyItem', () => { }); it('should keep only key fields for bot', () => { - const item: IDataObject = { id: 3, name: 'TestBot', created_at: '2026-01-01', token: 'secret' }; + const item: IDataObject = { id: 3, webhook: { outgoing_url: 'https://example.com' }, token: 'secret' }; const result = simplifyItem(item, 'bot'); - expect(result).toEqual({ id: 3, name: 'TestBot', created_at: '2026-01-01' }); + expect(result).toEqual({ id: 3, webhook: { outgoing_url: 'https://example.com' } }); }); it('should keep only key fields for groupTag', () => { @@ -161,9 +161,9 @@ describe('simplifyItem', () => { }); it('should keep only key fields for reaction', () => { - const item: IDataObject = { id: 11, code: ':thumbsup:', user_id: 42, created_at: '2026-01-01', message_id: 999 }; + const item: IDataObject = { code: ':thumbsup:', name: 'thumbsup', user_id: 42, created_at: '2026-01-01', message_id: 999 }; const result = simplifyItem(item, 'reaction'); - expect(result).toEqual({ id: 11, code: ':thumbsup:', user_id: 42, created_at: '2026-01-01' }); + expect(result).toEqual({ code: ':thumbsup:', name: 'thumbsup', user_id: 42, created_at: '2026-01-01' }); }); it('should keep only key fields for export', () => { diff --git a/packages/cli/scripts/generate-cli.ts b/packages/cli/scripts/generate-cli.ts index e41dd44c..5f08e76b 100644 --- a/packages/cli/scripts/generate-cli.ts +++ b/packages/cli/scripts/generate-cli.ts @@ -583,11 +583,11 @@ function generateCommandCode(p: CommandGenParams): string { continue; } const flagName = toKebabCase(param.name); - if (flagName !== param.name) { - queryEntries.push(` '${param.name}': flags['${flagName}'],`); - } else { - queryEntries.push(` ${param.name}: flags['${param.name}'],`); - } + const isArrayParam = param.schema.type === 'array'; + const flagRef = flagName !== param.name ? `flags['${flagName}']` : `flags['${param.name}']`; + const value = isArrayParam ? `${flagRef}?.split(',')` : flagRef; + const key = flagName !== param.name ? `'${param.name}'` : param.name; + queryEntries.push(` ${key}: ${value},`); } if (p.hasPagination) { queryEntries.push(` limit: flags.limit,`); @@ -629,7 +629,7 @@ function generateCommandCode(p: CommandGenParams): string { runBodyLines.push(` const seenCursors = new Set();`); runBodyLines.push(''); runBodyLines.push(` while (pages < 500) {`); - runBodyLines.push(` const query: Record = {`); + runBodyLines.push(` const query: Record = {`); for (const entry of queryEntries) { if (!entry.includes('cursor:')) runBodyLines.push(` ${entry}`); } @@ -639,6 +639,7 @@ function generateCommandCode(p: CommandGenParams): string { runBodyLines.push(` const body = response.data as Record;`); runBodyLines.push(` const items = body.data as unknown[];`); runBodyLines.push(` if (items) allData.push(...items);`); + runBodyLines.push(` if (!items || items.length === 0) break;`); runBodyLines.push(` const meta = body.meta as Record | undefined;`); runBodyLines.push(` const paginate = meta?.paginate as Record | undefined;`); runBodyLines.push(` nextCursor = paginate?.next_page as string | undefined;`); diff --git a/packages/cli/src/client.ts b/packages/cli/src/client.ts index 0f60d4c5..96a5fab1 100644 --- a/packages/cli/src/client.ts +++ b/packages/cli/src/client.ts @@ -51,7 +51,7 @@ export interface RequestOptions { path: string; token: string; body?: unknown; - query?: Record; + query?: Record; headers?: Record; timeout?: number; noRetry?: boolean; @@ -72,7 +72,7 @@ export interface ClientFlags { const MAX_RETRIES = 3; const DEFAULT_TIMEOUT = 30; -function buildUrl(apiPath: string, query?: Record): string { +function buildUrl(apiPath: string, query?: Record): string { const base = apiPath.startsWith('http://') || apiPath.startsWith('https://') ? apiPath : apiPath.startsWith('/') ? `${getBaseUrl()}${apiPath}` : `${getBaseUrl()}/${apiPath}`; @@ -80,7 +80,13 @@ function buildUrl(apiPath: string, query?: Record(); while (pages < 500) { - const query: Record = { + const query: Record = { limit: flags.limit, cursor: nextCursor, }; @@ -52,6 +52,7 @@ export default class BotsListEvents extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; diff --git a/packages/cli/src/commands/chats/list.ts b/packages/cli/src/commands/chats/list.ts index 8cc58a63..3c065e23 100644 --- a/packages/cli/src/commands/chats/list.ts +++ b/packages/cli/src/commands/chats/list.ts @@ -67,7 +67,7 @@ export default class ChatsList extends BaseCommand { const seenCursors = new Set(); while (pages < 500) { - const query: Record = { + const query: Record = { ...(flags.sort ? { [`sort[${flags.sort.replace(/-/g, '_')}]`]: flags.order || 'desc' } : {}), availability: flags['availability'], 'last_message_at_after': flags['last-message-at-after'], @@ -80,6 +80,7 @@ export default class ChatsList extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; diff --git a/packages/cli/src/commands/group-tags/list-users.ts b/packages/cli/src/commands/group-tags/list-users.ts index 2a39a4c6..f03ed459 100644 --- a/packages/cli/src/commands/group-tags/list-users.ts +++ b/packages/cli/src/commands/group-tags/list-users.ts @@ -47,7 +47,7 @@ export default class GroupTagsListUsers extends BaseCommand { const seenCursors = new Set(); while (pages < 500) { - const query: Record = { + const query: Record = { limit: flags.limit, cursor: nextCursor, }; @@ -55,6 +55,7 @@ export default class GroupTagsListUsers extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; diff --git a/packages/cli/src/commands/group-tags/list.ts b/packages/cli/src/commands/group-tags/list.ts index dd148fb7..4fb3938e 100644 --- a/packages/cli/src/commands/group-tags/list.ts +++ b/packages/cli/src/commands/group-tags/list.ts @@ -48,8 +48,8 @@ export default class GroupTagsList extends BaseCommand { const seenCursors = new Set(); while (pages < 500) { - const query: Record = { - names: flags['names'], + const query: Record = { + names: flags['names']?.split(','), limit: flags.limit, cursor: nextCursor, }; @@ -57,6 +57,7 @@ export default class GroupTagsList extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; @@ -88,7 +89,7 @@ export default class GroupTagsList extends BaseCommand { method: 'GET', path: '/group_tags', query: { - names: flags['names'], + names: flags['names']?.split(','), limit: flags.limit, cursor: flags.cursor, }, diff --git a/packages/cli/src/commands/members/list.ts b/packages/cli/src/commands/members/list.ts index 1d366076..1612ad67 100644 --- a/packages/cli/src/commands/members/list.ts +++ b/packages/cli/src/commands/members/list.ts @@ -52,7 +52,7 @@ export default class MembersList extends BaseCommand { const seenCursors = new Set(); while (pages < 500) { - const query: Record = { + const query: Record = { role: flags['role'], limit: flags.limit, cursor: nextCursor, @@ -61,6 +61,7 @@ export default class MembersList extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; diff --git a/packages/cli/src/commands/messages/list.ts b/packages/cli/src/commands/messages/list.ts index ad9a3f08..8b44d241 100644 --- a/packages/cli/src/commands/messages/list.ts +++ b/packages/cli/src/commands/messages/list.ts @@ -80,7 +80,7 @@ export default class MessagesList extends BaseCommand { const seenCursors = new Set(); while (pages < 500) { - const query: Record = { + const query: Record = { 'chat_id': flags['chat-id'], ...(flags.sort ? { [`sort[${flags.sort.replace(/-/g, '_')}]`]: flags.order || 'desc' } : {}), limit: flags.limit, @@ -90,6 +90,7 @@ export default class MessagesList extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; diff --git a/packages/cli/src/commands/reactions/list.ts b/packages/cli/src/commands/reactions/list.ts index e67418f1..eac350c0 100644 --- a/packages/cli/src/commands/reactions/list.ts +++ b/packages/cli/src/commands/reactions/list.ts @@ -48,7 +48,7 @@ export default class ReactionsList extends BaseCommand { const seenCursors = new Set(); while (pages < 500) { - const query: Record = { + const query: Record = { limit: flags.limit, cursor: nextCursor, }; @@ -56,6 +56,7 @@ export default class ReactionsList extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; diff --git a/packages/cli/src/commands/read-member/list-readers.ts b/packages/cli/src/commands/read-member/list-readers.ts index 40ca2b68..e70396e8 100644 --- a/packages/cli/src/commands/read-member/list-readers.ts +++ b/packages/cli/src/commands/read-member/list-readers.ts @@ -46,7 +46,7 @@ export default class ReadMemberListReaders extends BaseCommand { const seenCursors = new Set(); while (pages < 500) { - const query: Record = { + const query: Record = { limit: flags.limit, cursor: nextCursor, }; @@ -54,6 +54,7 @@ export default class ReadMemberListReaders extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; diff --git a/packages/cli/src/commands/search/list-chats.ts b/packages/cli/src/commands/search/list-chats.ts index c5ee1eea..a30174c2 100644 --- a/packages/cli/src/commands/search/list-chats.ts +++ b/packages/cli/src/commands/search/list-chats.ts @@ -70,7 +70,7 @@ export default class SearchListChats extends BaseCommand { const seenCursors = new Set(); while (pages < 500) { - const query: Record = { + const query: Record = { query: flags['query'], order: flags['order'], 'created_from': flags['created-from'], @@ -85,6 +85,7 @@ export default class SearchListChats extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; diff --git a/packages/cli/src/commands/search/list-messages.ts b/packages/cli/src/commands/search/list-messages.ts index 43d1c94a..61c2d6b3 100644 --- a/packages/cli/src/commands/search/list-messages.ts +++ b/packages/cli/src/commands/search/list-messages.ts @@ -67,13 +67,13 @@ export default class SearchListMessages extends BaseCommand { const seenCursors = new Set(); while (pages < 500) { - const query: Record = { + const query: Record = { query: flags['query'], order: flags['order'], 'created_from': flags['created-from'], 'created_to': flags['created-to'], - 'chat_ids': flags['chat-ids'], - 'user_ids': flags['user-ids'], + 'chat_ids': flags['chat-ids']?.split(','), + 'user_ids': flags['user-ids']?.split(','), active: flags['active'], limit: flags.limit, cursor: nextCursor, @@ -82,6 +82,7 @@ export default class SearchListMessages extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; @@ -117,8 +118,8 @@ export default class SearchListMessages extends BaseCommand { order: flags['order'], 'created_from': flags['created-from'], 'created_to': flags['created-to'], - 'chat_ids': flags['chat-ids'], - 'user_ids': flags['user-ids'], + 'chat_ids': flags['chat-ids']?.split(','), + 'user_ids': flags['user-ids']?.split(','), active: flags['active'], limit: flags.limit, cursor: flags.cursor, diff --git a/packages/cli/src/commands/search/list-users.ts b/packages/cli/src/commands/search/list-users.ts index 798f5dba..2b09facd 100644 --- a/packages/cli/src/commands/search/list-users.ts +++ b/packages/cli/src/commands/search/list-users.ts @@ -66,13 +66,13 @@ export default class SearchListUsers extends BaseCommand { const seenCursors = new Set(); while (pages < 500) { - const query: Record = { + const query: Record = { query: flags['query'], sort: flags['sort'], order: flags['order'], 'created_from': flags['created-from'], 'created_to': flags['created-to'], - 'company_roles': flags['company-roles'], + 'company_roles': flags['company-roles']?.split(','), limit: flags.limit, cursor: nextCursor, }; @@ -80,6 +80,7 @@ export default class SearchListUsers extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; @@ -116,7 +117,7 @@ export default class SearchListUsers extends BaseCommand { order: flags['order'], 'created_from': flags['created-from'], 'created_to': flags['created-to'], - 'company_roles': flags['company-roles'], + 'company_roles': flags['company-roles']?.split(','), limit: flags.limit, cursor: flags.cursor, }, diff --git a/packages/cli/src/commands/security/list.ts b/packages/cli/src/commands/security/list.ts index 2cf09c22..a863fba6 100644 --- a/packages/cli/src/commands/security/list.ts +++ b/packages/cli/src/commands/security/list.ts @@ -69,7 +69,7 @@ export default class SecurityList extends BaseCommand { const seenCursors = new Set(); while (pages < 500) { - const query: Record = { + const query: Record = { 'start_time': flags['start-time'], 'end_time': flags['end-time'], 'event_key': flags['event-key'], @@ -84,6 +84,7 @@ export default class SecurityList extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; diff --git a/packages/cli/src/commands/tasks/list.ts b/packages/cli/src/commands/tasks/list.ts index ec226366..f5ef4764 100644 --- a/packages/cli/src/commands/tasks/list.ts +++ b/packages/cli/src/commands/tasks/list.ts @@ -46,7 +46,7 @@ export default class TasksList extends BaseCommand { const seenCursors = new Set(); while (pages < 500) { - const query: Record = { + const query: Record = { limit: flags.limit, cursor: nextCursor, }; @@ -54,6 +54,7 @@ export default class TasksList extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; diff --git a/packages/cli/src/commands/users/list.ts b/packages/cli/src/commands/users/list.ts index f95faee4..32c8135d 100644 --- a/packages/cli/src/commands/users/list.ts +++ b/packages/cli/src/commands/users/list.ts @@ -49,7 +49,7 @@ export default class UsersList extends BaseCommand { const seenCursors = new Set(); while (pages < 500) { - const query: Record = { + const query: Record = { query: flags['query'], limit: flags.limit, cursor: nextCursor, @@ -58,6 +58,7 @@ export default class UsersList extends BaseCommand { const body = response.data as Record; const items = body.data as unknown[]; if (items) allData.push(...items); + if (!items || items.length === 0) break; const meta = body.meta as Record | undefined; const paginate = meta?.paginate as Record | undefined; nextCursor = paginate?.next_page as string | undefined; diff --git a/packages/cli/tests/commands.test.ts b/packages/cli/tests/commands.test.ts index ef99ce6b..ced43575 100644 --- a/packages/cli/tests/commands.test.ts +++ b/packages/cli/tests/commands.test.ts @@ -376,12 +376,14 @@ describe('generated commands — functional tests', () => { // ----- Array query (search list-messages) ----- describe('search list-messages', () => { - it('--chat-ids 1,2,3 → query chat_ids', async () => { + it('--chat-ids 1,2,3 → query chat_ids[] repeated', async () => { mockFetchForEndpoint('/search/messages', 'GET'); await runCommand(['search', 'list-messages', '--chat-ids', '1,2,3'], { root: CLI_ROOT }); expect(fetchCalls().length).toBeGreaterThan(0); const url = fetchCalls()[0][0] as string; - expect(url).toContain('chat_ids='); + expect(url).toContain('chat_ids%5B%5D=1'); + expect(url).toContain('chat_ids%5B%5D=2'); + expect(url).toContain('chat_ids%5B%5D=3'); }); }); }); diff --git a/packages/generator/src/lang/csharp.ts b/packages/generator/src/lang/csharp.ts index 69e4ae9f..bc6da496 100644 --- a/packages/generator/src/lang/csharp.ts +++ b/packages/generator/src/lang/csharp.ts @@ -645,9 +645,12 @@ function emitPaginationMethod(lines: string[], op: IROperation, ir: IR): void { const baseName = `${snakeToPascal(op.methodName)}Async`; lines.push(`${indent2} var response = await ${baseName}(${callArgs.join(', ')}).ConfigureAwait(false);`); + const rt = ir.responses.find((r) => r.name === op.successResponse.responseRef); + const metaAccess = rt?.metaIsRequired ? 'response.Meta.Paginate.NextPage' : 'response.Meta?.Paginate?.NextPage'; lines.push(`${indent2} items.AddRange(response.Data);`); - lines.push(`${indent2} cursor = response.Meta?.Paginate?.NextPage;`); - lines.push(`${indent2}} while (cursor != null);`); + lines.push(`${indent2} if (response.Data.Count == 0) break;`); + lines.push(`${indent2} cursor = ${metaAccess};`); + lines.push(rt?.metaIsRequired ? `${indent2}} while (true);` : `${indent2}} while (cursor != null);`); lines.push(`${indent2}return items;`); lines.push(`${indent}}`); } @@ -696,9 +699,7 @@ function getReturnType( if (resp.isRedirect) return 'string'; if (!resp.hasBody) return null; if (resp.isList) { - const rt = ir.responses.find( - (r) => r.dataRef === resp.dataRef && r.dataIsArray, - ); + const rt = ir.responses.find((r) => r.name === resp.responseRef); return rt?.name ?? 'object'; } if (resp.isUnwrap && resp.dataRef) return csClientTypeRef(resp.dataRef); @@ -777,13 +778,15 @@ function emitMethodBody( // Escape curly braces in param name for C# string interpolation const paramKey = p.name.replace(/\{/g, '{{').replace(/\}/g, '}}'); if (p.isArray) { + const itemIsEnum = p.type.kind === 'array' && p.type.items?.kind === 'enum'; + const itemExpr = itemIsEnum ? 'PachcaUtils.EnumToApiString(item)' : 'item.ToString()!'; if (p.required) { lines.push(`${indent2}foreach (var item in ${paramName})`); - lines.push(`${indent2} queryParts.Add($"${paramKey}={Uri.EscapeDataString(item.ToString()!)}");`); + lines.push(`${indent2} queryParts.Add($"${paramKey}={Uri.EscapeDataString(${itemExpr})}");`); } else { lines.push(`${indent2}if (${paramName} != null)`); lines.push(`${indent2} foreach (var item in ${paramName})`); - lines.push(`${indent2} queryParts.Add($"${paramKey}={Uri.EscapeDataString(item.ToString()!)}");`); + lines.push(`${indent2} queryParts.Add($"${paramKey}={Uri.EscapeDataString(${itemExpr})}");`); } } else { const valueExpr = queryParamValueExpr(p); @@ -916,9 +919,7 @@ function emitResponseHandling( } else if (resp.isList) { lines.push(`${indent2} case ${resp.statusCode}:`); // Use same lookup as getReturnType for consistency - const foundResp = ir.responses.find( - (r) => r.dataRef === resp.dataRef && r.dataIsArray, - ); + const foundResp = ir.responses.find((r) => r.name === resp.responseRef); const rt = foundResp?.name ?? 'object'; lines.push(`${indent2} return PachcaUtils.Deserialize<${rt}>(json);`); } else if (resp.isUnwrap && resp.dataRef) { diff --git a/packages/generator/src/lang/go.ts b/packages/generator/src/lang/go.ts index 081daae1..c427953f 100644 --- a/packages/generator/src/lang/go.ts +++ b/packages/generator/src/lang/go.ts @@ -65,8 +65,8 @@ function goPrimitive( if (ft.primitive === 'boolean') return 'bool'; if (ft.primitive === 'any') return 'any'; if (ft.primitive === 'string') { - if (opts.forParam && (ft.format === 'date' || ft.format === 'date-time')) return 'time.Time'; - if (opts.forModelField && !opts.nullable && (ft.format === 'date' || ft.format === 'date-time')) { + if (opts.forParam && ft.format === 'date-time') return 'time.Time'; + if (opts.forModelField && !opts.nullable && ft.format === 'date-time') { return 'time.Time'; } return 'string'; @@ -281,7 +281,7 @@ function generateTypes(ir: IR): string { const needTime = [ ...ir.models.flatMap((m) => m.fields), ...ir.params.flatMap((p) => p.params), - ].some((f) => f.type.kind === 'primitive' && f.type.primitive === 'string' && (f.type.format === 'date' || f.type.format === 'date-time')); + ].some((f) => f.type.kind === 'primitive' && f.type.primitive === 'string' && f.type.format === 'date-time'); const needFmtStrings = ir.models.some((m) => m.name === 'ApiError'); const needIO = ir.models.some((m) => m.fields.some((f) => f.type.kind === 'binary')); const hasUnions = ir.unions.length > 0; @@ -342,7 +342,7 @@ function goReturn(op: IROperation, ir: IR): string { if (op.successResponse.isRedirect) return '(string, error)'; if (!op.successResponse.hasBody) return 'error'; if (op.successResponse.isList) { - const rt = ir.responses.find((r) => r.dataRef === op.successResponse.dataRef && r.dataIsArray); + const rt = ir.responses.find((r) => r.name === op.successResponse.responseRef); return `(*${rt?.name ?? 'any'}, error)`; } return `(*${op.successResponse.dataRef ?? 'any'}, error)`; @@ -473,11 +473,14 @@ function emitOp(lines: string[], op: IROperation, ir: IR): void { const hasReqParams = op.queryParams.some((q) => q.required); for (const p of op.queryParams) { const pn = goExportName(p.sdkName); - const isTime = p.type.kind === 'primitive' && p.type.primitive === 'string' && (p.type.format === 'date' || p.type.format === 'date-time'); + const isTime = p.type.kind === 'primitive' && p.type.primitive === 'string' && p.type.format === 'date-time'; if (p.isArray) { - lines.push(`\tfor _, v := range params.${pn} {`); - lines.push(`\t\tq.Add(${JSON.stringify(p.name)}, fmt.Sprintf("%v", v))`); - lines.push('\t}'); + const indent = hasReqParams ? '\t' : '\t\t'; + if (!hasReqParams) lines.push(`\tif params != nil {`); + lines.push(`${indent}for _, v := range params.${pn} {`); + lines.push(`${indent}\tq.Add(${JSON.stringify(p.name)}, fmt.Sprintf("%v", v))`); + lines.push(`${indent}}`); + if (!hasReqParams) lines.push('\t}'); } else if (p.required) { let conv: string; if (isTime) conv = `params.${pn}.Format(time.RFC3339)`; @@ -534,7 +537,7 @@ function emitOp(lines: string[], op: IROperation, ir: IR): void { lines.push(`\tcase ${op.successResponse.statusCode === 201 ? 'http.StatusCreated' : 'http.StatusNoContent'}:`); lines.push('\t\treturn nil'); } else if (op.successResponse.isList) { - const rt = ir.responses.find((r) => r.dataRef === op.successResponse.dataRef && r.dataIsArray); + const rt = ir.responses.find((r) => r.name === op.successResponse.responseRef); lines.push(`\tcase ${op.successResponse.statusCode === 201 ? 'http.StatusCreated' : 'http.StatusOK'}:`); lines.push(`\t\tvar result ${rt?.name ?? 'any'}`); lines.push('\t\tif err := json.NewDecoder(resp.Body).Decode(&result); err != nil {'); @@ -562,14 +565,23 @@ function emitOp(lines: string[], op: IROperation, ir: IR): void { if (op.hasOAuthError) { lines.push('\tcase http.StatusUnauthorized:'); lines.push('\t\tvar e OAuthError'); - lines.push('\t\tjson.NewDecoder(resp.Body).Decode(&e)'); + lines.push('\t\tif err := json.NewDecoder(resp.Body).Decode(&e); err != nil {'); + lines.push('\t\t\te.Err = fmt.Sprintf("HTTP 401: %v", err)'); + lines.push('\t\t}'); lines.push(`\t\t${retOAuth()}`); } if (op.hasApiError || ir.models.some((m) => m.name === 'ApiError')) { lines.push('\tdefault:'); lines.push('\t\tvar e ApiError'); - lines.push('\t\tjson.NewDecoder(resp.Body).Decode(&e)'); + lines.push('\t\tif err := json.NewDecoder(resp.Body).Decode(&e); err != nil {'); + const retFmt = op.successResponse.isRedirect + ? 'return "", fmt.Errorf("HTTP %d: %w", resp.StatusCode, err)' + : !op.successResponse.hasBody + ? 'return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err)' + : 'return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err)'; + lines.push(`\t\t\t${retFmt}`); + lines.push('\t\t}'); lines.push(`\t\t${retApi()}`); } else { lines.push('\tdefault:'); @@ -614,15 +626,19 @@ function emitPaginationMethod(lines: string[], op: IROperation, ir: IR): void { callArgs.push(hasReq ? '*params' : 'params'); } + const rt = ir.responses.find((r) => r.name === op.successResponse.responseRef); + const metaNilCheck = rt?.metaIsRequired ? '' : ' || result.Meta == nil'; + const metaAccess = rt?.metaIsRequired ? 'result.Meta.Paginate.NextPage' : 'result.Meta.Paginate.NextPage'; lines.push(`\t\tresult, err := s.${goMethodName(op)}(${callArgs.join(', ')})`); lines.push('\t\tif err != nil {'); lines.push('\t\t\treturn nil, err'); lines.push('\t\t}'); lines.push('\t\titems = append(items, result.Data...)'); - lines.push('\t\tif result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil {'); + lines.push(`\t\tif len(result.Data) == 0${metaNilCheck} {`); lines.push('\t\t\treturn items, nil'); lines.push('\t\t}'); - lines.push('\t\tcursor = result.Meta.Paginate.NextPage'); + lines.push(`\t\tnextPage := ${metaAccess}`); + lines.push('\t\tcursor = &nextPage'); lines.push('\t}'); lines.push('}'); } diff --git a/packages/generator/src/lang/kotlin.ts b/packages/generator/src/lang/kotlin.ts index cc7cb125..05888d63 100644 --- a/packages/generator/src/lang/kotlin.ts +++ b/packages/generator/src/lang/kotlin.ts @@ -458,9 +458,12 @@ function emitPaginationMethod(lines: string[], op: IROperation, ir: IR): void { ? `${op.methodName}(${callArgs.join(', ')})` : `${op.methodName}(\n${callArgs.map(a => `${indent2} ${a},`).join('\n')}\n${indent2} )`; lines.push(`${indent2} val response = ${callStr}`); + const rt = ir.responses.find((r) => r.name === op.successResponse.responseRef); + const metaAccess = rt?.metaIsRequired ? 'response.meta.paginate.nextPage' : 'response.meta?.paginate?.nextPage'; lines.push(`${indent2} items.addAll(response.data)`); - lines.push(`${indent2} cursor = response.meta?.paginate?.nextPage`); - lines.push(`${indent2}} while (cursor != null)`); + lines.push(`${indent2} if (response.data.isEmpty()) break`); + lines.push(`${indent2} cursor = ${metaAccess}`); + lines.push(rt?.metaIsRequired ? `${indent2}} while (true)` : `${indent2}} while (cursor != null)`); lines.push(`${indent2}return items`); lines.push(`${indent}}`); } @@ -510,9 +513,7 @@ function getReturnType( if (resp.isRedirect) return 'String'; if (!resp.hasBody) return null; if (resp.isList) { - const rt = ir.responses.find( - (r) => r.dataRef === resp.dataRef && r.dataIsArray, - ); + const rt = ir.responses.find((r) => r.name === resp.responseRef); return rt?.name ?? 'Any'; } if (resp.isUnwrap && resp.dataRef) return resp.dataRef; @@ -593,13 +594,15 @@ function emitMethodBody( ); for (const p of op.queryParams) { if (p.isArray) { + const itemIsEnum = p.type.kind === 'array' && p.type.items?.kind === 'enum'; + const itemExpr = itemIsEnum ? 'it.value' : 'it'; if (p.required) { lines.push( - `${indent3}${p.sdkName}.forEach { parameter("${p.name}", it) }`, + `${indent3}${p.sdkName}.forEach { parameter("${p.name}", ${itemExpr}) }`, ); } else { lines.push( - `${indent3}${p.sdkName}?.forEach { parameter("${p.name}", it) }`, + `${indent3}${p.sdkName}?.forEach { parameter("${p.name}", ${itemExpr}) }`, ); } } else { diff --git a/packages/generator/src/lang/python.ts b/packages/generator/src/lang/python.ts index 7edd0ab0..322146ac 100644 --- a/packages/generator/src/lang/python.ts +++ b/packages/generator/src/lang/python.ts @@ -277,9 +277,7 @@ function opReturnType(op: IROperation, ir: IR): string { if (op.successResponse.isRedirect) return 'str'; if (!op.successResponse.hasBody) return 'None'; if (op.successResponse.isList) { - const rt = ir.responses.find( - (r) => r.dataRef === op.successResponse.dataRef && r.dataIsArray, - ); + const rt = ir.responses.find((r) => r.name === op.successResponse.responseRef); return rt?.name ?? 'object'; } return op.successResponse.dataRef ?? 'object'; @@ -336,9 +334,7 @@ function collectClientImports(ir: IR): string[] { } if (op.successResponse.hasBody && !op.successResponse.isRedirect) { if (op.successResponse.isList) { - const rt = ir.responses.find( - (r) => r.dataRef === op.successResponse.dataRef && r.dataIsArray, - ); + const rt = ir.responses.find((r) => r.name === op.successResponse.responseRef); if (rt) add(rt.name); if (op.isPaginated && op.successResponse.dataRef) { add(op.successResponse.dataRef); @@ -472,7 +468,8 @@ function emitOperation(lines: string[], op: IROperation, ir: IR): void { const v = `params.${paramName}`; const maybe = p.required ? v : `params.${paramName}`; if (p.isArray) { - lines.push(` if ${maybe} is not None:`); + const guard = p.required ? `${maybe} is not None` : `params is not None and ${maybe} is not None`; + lines.push(` if ${guard}:`); lines.push(` for v in ${v}:`); lines.push(` query.append((${JSON.stringify(p.name)}, str(v)))`); } else { @@ -560,9 +557,7 @@ function emitOperation(lines: string[], op: IROperation, ir: IR): void { lines.push(` case ${op.successResponse.statusCode}:`); lines.push(' return'); } else if (op.successResponse.isList) { - const rt = ir.responses.find( - (r) => r.dataRef === op.successResponse.dataRef && r.dataIsArray, - ); + const rt = ir.responses.find((r) => r.name === op.successResponse.responseRef); lines.push(` case ${op.successResponse.statusCode}:`); lines.push(` return deserialize(${rt?.name ?? 'object'}, body)`); } else if (op.successResponse.isUnwrap && op.successResponse.dataRef) { @@ -627,10 +622,16 @@ function emitPaginationMethod(lines: string[], op: IROperation, ir: IR): void { } lines.push(` response = await self.${pyMethodName(op)}(${callParts.join(', ')})`); } + const rt = ir.responses.find((r) => r.name === op.successResponse.responseRef); + const metaAccess = rt?.metaIsRequired ? 'response.meta.paginate.next_page' : 'response.meta.paginate.next_page if response.meta else None'; lines.push(' items.extend(response.data)'); - lines.push(' cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None'); - lines.push(' if not cursor:'); + lines.push(' if not response.data:'); lines.push(' break'); + lines.push(` cursor = ${metaAccess}`); + if (!rt?.metaIsRequired) { + lines.push(' if not cursor:'); + lines.push(' break'); + } lines.push(' return items'); } diff --git a/packages/generator/src/lang/swift.ts b/packages/generator/src/lang/swift.ts index d6b8d780..9ca82aea 100644 --- a/packages/generator/src/lang/swift.ts +++ b/packages/generator/src/lang/swift.ts @@ -35,7 +35,7 @@ function swiftType(ft: IRFieldType, opts: { nullable?: boolean } = {}): string { else if (ft.primitive === 'number') base = 'Double'; else if (ft.primitive === 'boolean') base = 'Bool'; else if (ft.primitive === 'any') base = 'AnyCodable'; - else if (ft.format === 'date' || ft.format === 'date-time') base = opts.nullable ? 'String' : 'Date'; + else if (ft.format === 'date-time') base = opts.nullable ? 'String' : 'Date'; else base = 'String'; break; case 'enum': @@ -249,7 +249,7 @@ function opReturn(op: IROperation, ir: IR): string { if (op.successResponse.isRedirect) return 'String'; if (!op.successResponse.hasBody) return 'Void'; if (op.successResponse.isList) { - const rt = ir.responses.find((r) => r.dataRef === op.successResponse.dataRef && r.dataIsArray); + const rt = ir.responses.find((r) => r.name === op.successResponse.responseRef); return rt?.name ?? 'String'; } return op.successResponse.dataRef ?? 'String'; @@ -278,13 +278,16 @@ function emitOperation(lines: string[], op: IROperation, ir: IR): void { if (op.deprecated) lines.push(' @available(*, deprecated)'); lines.push(` public func ${op.methodName}(${args.join(', ')}) async throws -> ${opReturn(op, ir)} {`); if (op.queryParams.length > 0) { - const swiftUrlBase = op.externalUrl ? `\\(${op.externalUrl})` : `\\(baseURL)${op.path}`; + let swiftUrlBase = op.externalUrl ? `\\(${op.externalUrl})` : `\\(baseURL)${op.path}`; + for (const p of op.pathParams) { + swiftUrlBase = swiftUrlBase.replace(`{${p.name}}`, `\\(${snakeToCamel(p.sdkName)})`); + } lines.push(` var components = URLComponents(string: "${swiftUrlBase}")!`); lines.push(' var queryItems: [URLQueryItem] = []'); for (const q of op.queryParams) { const n = snakeToCamel(q.sdkName); const isEnum = q.type.kind === 'enum'; - const isDate = q.type.kind === 'primitive' && (q.type.format === 'date' || q.type.format === 'date-time'); + const isDate = q.type.kind === 'primitive' && q.type.format === 'date-time'; const isModel = q.type.kind === 'model' || q.type.kind === 'record'; function valueExpr(varName: string): string { if (isEnum) return `${varName}.rawValue`; @@ -330,7 +333,14 @@ function emitOperation(lines: string[], op: IROperation, ir: IR): void { lines.push(' request.setValue("application/json", forHTTPHeaderField: "Content-Type")'); if (shouldUnwrapBody(rb)) { const f = rb.unwrapField!; - lines.push(` request.httpBody = try JSONSerialization.data(withJSONObject: [${JSON.stringify(f.name)}: ${swiftIdentifier(f.name)}])`); + const varName = swiftIdentifier(f.name); + let valueExpr = varName; + if (f.type.kind === 'enum') { + valueExpr = `${varName}.rawValue`; + } else if (f.type.kind === 'array' && f.type.items?.kind === 'enum') { + valueExpr = `${varName}.map { $0.rawValue }`; + } + lines.push(` request.httpBody = try JSONSerialization.data(withJSONObject: [${JSON.stringify(f.name)}: ${valueExpr}])`); } else { lines.push(' request.httpBody = try serialize(body)'); } @@ -452,10 +462,13 @@ function emitPaginationMethod(lines: string[], op: IROperation, ir: IR): void { } } + const rt = ir.responses.find((r) => r.name === op.successResponse.responseRef); + const metaAccess = rt?.metaIsRequired ? 'response.meta.paginate.nextPage' : 'response.meta?.paginate.nextPage'; lines.push(` let response = try await ${op.methodName}(${callArgs.join(', ')})`); lines.push(' items.append(contentsOf: response.data)'); - lines.push(' cursor = response.meta?.paginate?.nextPage'); - lines.push(' } while cursor != nil'); + lines.push(' if response.data.isEmpty { break }'); + lines.push(` cursor = ${metaAccess}`); + lines.push(rt?.metaIsRequired ? ' } while true' : ' } while cursor != nil'); lines.push(' return items'); lines.push(' }'); } diff --git a/packages/generator/src/lang/typescript.ts b/packages/generator/src/lang/typescript.ts index 07ad6716..3c42ddca 100644 --- a/packages/generator/src/lang/typescript.ts +++ b/packages/generator/src/lang/typescript.ts @@ -339,11 +339,7 @@ function responseTypeName(op: IROperation, ir: IR): string { if (op.successResponse.isRedirect) return 'string'; if (!op.successResponse.hasBody) return 'void'; if (op.successResponse.isList) { - const rt = ir.responses.find( - (r) => - r.dataRef === op.successResponse.dataRef && - r.dataIsArray, - ); + const rt = ir.responses.find((r) => r.name === op.successResponse.responseRef); return rt?.name ?? 'unknown'; } return op.successResponse.dataRef ?? 'unknown'; @@ -656,9 +652,16 @@ function emitPaginationMethod(lines: string[], op: IROperation, ir: IR): void { for (const p of op.pathParams) callArgs.push(p.sdkName); if (paramsType) callArgs.push('{ ...params, cursor } as ' + paramsType); lines.push(` const response = await this.${op.methodName}(${callArgs.join(', ')});`); + const rt = ir.responses.find((r) => r.name === op.successResponse.responseRef); + const metaAccess = rt?.metaIsRequired ? 'response.meta.paginate.nextPage' : 'response.meta?.paginate.nextPage'; lines.push(' items.push(...response.data);'); - lines.push(' cursor = response.meta?.paginate?.nextPage;'); - lines.push(' } while (cursor);'); + lines.push(' if (response.data.length === 0) break;'); + lines.push(` cursor = ${metaAccess};`); + if (rt?.metaIsRequired) { + lines.push(' } while (true);'); + } else { + lines.push(' } while (cursor);'); + } lines.push(' return items;'); lines.push(' }'); } diff --git a/packages/generator/src/transform.ts b/packages/generator/src/transform.ts index 48a6d816..f332a1f6 100644 --- a/packages/generator/src/transform.ts +++ b/packages/generator/src/transform.ts @@ -41,10 +41,15 @@ function isUnion(schema: Schema): boolean { // ----- Field type resolution ----- function resolveFieldType(schema: Schema): IRFieldType { - // $ref → enum or model reference + // $ref → enum, array, or model reference if (schema.$ref) { const name = refName(schema.$ref); - return { kind: isEnumSchema(schema) ? 'enum' : 'model', ref: name }; + if (isEnumSchema(schema)) return { kind: 'enum', ref: name }; + // Array-type refs (e.g. TagNamesFilter: type: array, items: string) should be inlined + if (getSchemaType(schema) === 'array' && schema.items) { + return { kind: 'array', items: resolveFieldType(schema.items) }; + } + return { kind: 'model', ref: name }; } // anyOf / oneOf → union @@ -393,12 +398,24 @@ function transformParam(param: Parameter): IRParam { type = { kind: 'array', items: type }; } + // Wire name: use first x-param-names entry if available (e.g. "sort[{field}]" → "sort[id]") + let wireName = (param['x-param-names'] && param['x-param-names'].length > 0 && typeof param['x-param-names'][0] === 'object') + ? param['x-param-names'][0].name + : param.name; + + const isArrayParam = isArray || type.kind === 'array'; + + // Array query params need [] suffix for Rails/Rack to parse as arrays + if (isArrayParam && !wireName.endsWith('[]')) { + wireName += '[]'; + } + return { - name: param.name, + name: wireName, sdkName, type, required: !!param.required, - isArray, + isArray: isArrayParam, }; } @@ -695,6 +712,9 @@ export function transform(spec: ParsedAPI): IR { unions.push(transformUnion(name, schema, spec.schemas)); } else if (isEnumSchema(schema)) { enums.push(transformEnum(name, schema)); + } else if (getSchemaType(schema) === 'array') { + // Array-type schemas (e.g. TagNamesFilter) are inlined as array types in field references + continue; } else { models.push(transformModel(name, schema)); } diff --git a/packages/generator/tests/array-no-brackets/fixture.yaml b/packages/generator/tests/array-no-brackets/fixture.yaml new file mode 100644 index 00000000..fe0190b2 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/fixture.yaml @@ -0,0 +1,109 @@ +openapi: 3.0.0 +info: + title: Test API — Array Params Without Brackets + version: 1.0.0 +servers: + - url: https://api.pachca.com/api/shared/v1 +tags: + - name: Search +paths: + /search/messages: + get: + operationId: SearchOperations_searchMessages + description: Поиск сообщений с array-фильтрами без скобок в имени + x-paginated: true + parameters: + - name: query + in: query + required: true + description: Поисковый запрос + schema: + type: string + - name: chat_ids + in: query + required: true + description: Фильтр по чатам (required, без скобок в имени) + schema: + type: array + items: + type: integer + format: int32 + - name: user_ids + in: query + required: false + description: Фильтр по авторам (без скобок в имени) + schema: + type: array + items: + type: integer + format: int32 + - name: limit + in: query + required: false + description: Количество записей + schema: + type: integer + format: int32 + - name: cursor + in: query + required: false + description: Курсор пагинации + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + $ref: '#/components/schemas/MessageResult' + meta: + $ref: '#/components/schemas/PaginationMeta' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + tags: + - Search +components: + schemas: + MessageResult: + type: object + required: + - id + - content + properties: + id: + type: integer + format: int32 + content: + type: string + + PaginationMeta: + type: object + required: + - paginate + properties: + paginate: + type: object + required: + - next_page + properties: + next_page: + type: string + + OAuthError: + type: object + properties: + error: + type: string diff --git a/packages/generator/tests/array-no-brackets/snapshots/cs/Client.cs b/packages/generator/tests/array-no-brackets/snapshots/cs/Client.cs new file mode 100644 index 00000000..6a2a2a81 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/cs/Client.cs @@ -0,0 +1,99 @@ +#nullable enable + +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Text.Json; +using System.Threading; + +namespace Pachca.Sdk; + +public sealed class SearchService +{ + private readonly string _baseUrl; + private readonly HttpClient _client; + + internal SearchService(string baseUrl, HttpClient client) + { + _baseUrl = baseUrl; + _client = client; + } + + public async System.Threading.Tasks.Task SearchMessagesAsync( + string query, + List chatIds, + List? userIds = null, + int? limit = null, + string? cursor = null, + CancellationToken cancellationToken = default) + { + var queryParts = new List(); + queryParts.Add($"query={Uri.EscapeDataString(query)}"); + foreach (var item in chatIds) + queryParts.Add($"chat_ids[]={Uri.EscapeDataString(item.ToString()!)}"); + if (userIds != null) + foreach (var item in userIds) + queryParts.Add($"user_ids[]={Uri.EscapeDataString(item.ToString()!)}"); + if (limit != null) + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); + if (cursor != null) + queryParts.Add($"cursor={Uri.EscapeDataString(cursor)}"); + var url = $"{_baseUrl}/search/messages" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); + using var request = new HttpRequestMessage(HttpMethod.Get, url); + using var response = await PachcaUtils.SendWithRetryAsync(_client, request, cancellationToken).ConfigureAwait(false); + var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 200: + return PachcaUtils.Deserialize(json); + case 401: + throw PachcaUtils.Deserialize(json); + default: + throw new InvalidOperationException($"Unexpected status code: {(int)response.StatusCode}"); + } + } + + public async System.Threading.Tasks.Task> SearchMessagesAllAsync( + string query, + List chatIds, + List? userIds = null, + int? limit = null, + CancellationToken cancellationToken = default) + { + var items = new List(); + string? cursor = null; + do + { + var response = await SearchMessagesAsync(query: query, chatIds: chatIds, userIds: userIds, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); + items.AddRange(response.Data); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); + return items; + } +} + +public sealed class PachcaClient : IDisposable +{ + private readonly HttpClient _client; + + public SearchService Search { get; } + + public PachcaClient(string token, string baseUrl = "https://api.pachca.com/api/shared/v1") + { + _client = new HttpClient(); + _client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("Bearer", token); + + Search = new SearchService(baseUrl, _client); + } + + public void Dispose() + { + _client.Dispose(); + GC.SuppressFinalize(this); + } +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/cs/Models.cs b/packages/generator/tests/array-no-brackets/snapshots/cs/Models.cs new file mode 100644 index 00000000..4f5ca99c --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/cs/Models.cs @@ -0,0 +1,42 @@ +#nullable enable + +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Pachca.Sdk; + +public class MessageResult +{ + [JsonPropertyName("id")] + public int Id { get; set; } = default!; + [JsonPropertyName("content")] + public string Content { get; set; } = default!; +} + +public class PaginationMetaPaginate +{ + [JsonPropertyName("next_page")] + public string NextPage { get; set; } = default!; +} + +public class PaginationMeta +{ + [JsonPropertyName("paginate")] + public PaginationMetaPaginate Paginate { get; set; } = default!; +} + +public class OAuthError : Exception +{ + [JsonPropertyName("error")] + public string? Error { get; set; } +} + +public class SearchMessagesResponse +{ + [JsonPropertyName("data")] + public List Data { get; set; } = new(); + [JsonPropertyName("meta")] + public PaginationMeta Meta { get; set; } = default!; +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/cs/Utils.cs b/packages/generator/tests/array-no-brackets/snapshots/cs/Utils.cs new file mode 100644 index 00000000..2cf57544 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/cs/Utils.cs @@ -0,0 +1,103 @@ +#nullable enable + +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Pachca.Sdk; + +internal static class PachcaUtils +{ + private const int MaxRetries = 3; + private static readonly HashSet Retryable5xx = new() { 500, 502, 503, 504 }; + private static readonly Random JitterRandom = new(); + + internal static readonly JsonSerializerOptions JsonOptions = new() + { + DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull, + PropertyNameCaseInsensitive = true, + }; + + private static TimeSpan AddJitter(TimeSpan delay) + { + var factor = 0.5 + JitterRandom.NextDouble() * 0.5; + return TimeSpan.FromMilliseconds(delay.TotalMilliseconds * factor); + } + + internal static async Task SendWithRetryAsync( + HttpClient client, + HttpRequestMessage request, + CancellationToken cancellationToken = default) + { + for (var attempt = 0; attempt <= MaxRetries; attempt++) + { + HttpRequestMessage req; + if (attempt == 0) + { + req = request; + } + else + { + req = await CloneRequestAsync(request).ConfigureAwait(false); + } + + var response = await client.SendAsync(req, cancellationToken).ConfigureAwait(false); + + if ((int)response.StatusCode == 429 && attempt < MaxRetries) + { + var delay = response.Headers.RetryAfter?.Delta + ?? TimeSpan.FromSeconds(Math.Pow(2, attempt)); + await System.Threading.Tasks.Task.Delay(delay, cancellationToken).ConfigureAwait(false); + response.Dispose(); + continue; + } + + if (Retryable5xx.Contains((int)response.StatusCode) && attempt < MaxRetries) + { + var delay = AddJitter(TimeSpan.FromSeconds(10 * Math.Pow(2, attempt))); + await System.Threading.Tasks.Task.Delay(delay, cancellationToken).ConfigureAwait(false); + response.Dispose(); + continue; + } + + return response; + } + + return await client.SendAsync( + await CloneRequestAsync(request).ConfigureAwait(false), + cancellationToken).ConfigureAwait(false); + } + + private static async Task CloneRequestAsync(HttpRequestMessage request) + { + var clone = new HttpRequestMessage(request.Method, request.RequestUri); + foreach (var header in request.Headers) + clone.Headers.TryAddWithoutValidation(header.Key, header.Value); + + if (request.Content != null) + { + var content = await request.Content.ReadAsByteArrayAsync().ConfigureAwait(false); + clone.Content = new ByteArrayContent(content); + if (request.Content.Headers.ContentType != null) + clone.Content.Headers.ContentType = request.Content.Headers.ContentType; + } + + return clone; + } + + internal static T Deserialize(string json) => + JsonSerializer.Deserialize(json, JsonOptions) + ?? throw new InvalidOperationException("Deserialization returned null"); + + internal static string Serialize(T value) => + JsonSerializer.Serialize(value, JsonOptions); + + internal static string EnumToApiString(T value) where T : struct, Enum => + JsonSerializer.Serialize(value, JsonOptions).Trim('"'); +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/cs/examples.json b/packages/generator/tests/array-no-brackets/snapshots/cs/examples.json new file mode 100644 index 00000000..599d862d --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/cs/examples.json @@ -0,0 +1,12 @@ +{ + "Client_Init": { + "usage": "using var client = new PachcaClient(\"YOUR_TOKEN\");", + "imports": [ + "PachcaClient" + ] + }, + "SearchOperations_searchMessages": { + "usage": "var chatIds = new List { 123 };\nvar userIds = new List { 123 };\nvar response = await client.Search.SearchMessagesAsync(\"example\", chatIds, userIds, 123, \"example\");", + "output": "SearchMessagesResponse(Data: List, Meta: PaginationMeta)" + } +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/go/client.go b/packages/generator/tests/array-no-brackets/snapshots/go/client.go new file mode 100644 index 00000000..26c835a4 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/go/client.go @@ -0,0 +1,150 @@ +package pachca + +import ( + "context" + "encoding/json" + "fmt" + "math/rand" + "net/http" + "net/url" + "strconv" + "time" +) + +type authTransport struct { + token string + base http.RoundTripper +} + +func (t *authTransport) RoundTrip(req *http.Request) (*http.Response, error) { + req.Header.Set("Authorization", "Bearer "+t.token) + return t.base.RoundTrip(req) +} + +const maxRetries = 3 + +var retryable5xx = map[int]bool{500: true, 502: true, 503: true, 504: true} + +func jitter(d time.Duration) time.Duration { + return time.Duration(float64(d) * (0.5 + rand.Float64()*0.5)) +} + +func doWithRetry(client *http.Client, req *http.Request) (*http.Response, error) { + for attempt := 0; ; attempt++ { + if attempt > 0 && req.GetBody != nil { + req.Body, _ = req.GetBody() + } + resp, err := client.Do(req) + if err != nil { + return nil, err + } + if resp.StatusCode == http.StatusTooManyRequests && attempt < maxRetries { + resp.Body.Close() + delay := time.Duration(1< 0 { url = baseURL[0] } + client := &http.Client{ + Transport: &authTransport{token: token, base: http.DefaultTransport}, + } + return &PachcaClient{ + Search: &SearchService{baseURL: url, client: client}, + } +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/go/examples.json b/packages/generator/tests/array-no-brackets/snapshots/go/examples.json new file mode 100644 index 00000000..4482cec2 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/go/examples.json @@ -0,0 +1,15 @@ +{ + "Client_Init": { + "usage": "client := pachca.NewPachcaClient(\"YOUR_TOKEN\")", + "imports": [ + "PachcaClient" + ] + }, + "SearchOperations_searchMessages": { + "usage": "params := SearchMessagesParams{\n\tQuery: \"example\",\n\tChatIDs: []int32{int32(123)},\n\tUserIDs: []int32{int32(123)},\n\tLimit: Ptr(int32(123)),\n\tCursor: Ptr(\"example\"),\n}\nresponse, err := client.Search.SearchMessages(ctx, params)", + "output": "SearchMessagesResponse{Data: []MessageResult, Meta: PaginationMeta}", + "imports": [ + "SearchMessagesParams" + ] + } +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/go/types.go b/packages/generator/tests/array-no-brackets/snapshots/go/types.go new file mode 100644 index 00000000..56ab3d96 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/go/types.go @@ -0,0 +1,38 @@ +package pachca + +type MessageResult struct { + ID int32 `json:"id"` + Content string `json:"content"` +} + +type PaginationMetaPaginate struct { + NextPage string `json:"next_page"` +} + +type PaginationMeta struct { + Paginate PaginationMetaPaginate `json:"paginate"` +} + +type OAuthError struct { + Err *string `json:"error,omitempty"` +} + +func (e *OAuthError) Error() string { + if e.Err != nil { + return *e.Err + } + return "oauth error" +} + +type SearchMessagesParams struct { + Query string + ChatIDs []int32 + UserIDs []int32 + Limit *int32 + Cursor *string +} + +type SearchMessagesResponse struct { + Data []MessageResult `json:"data"` + Meta PaginationMeta `json:"meta"` +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/go/utils.go b/packages/generator/tests/array-no-brackets/snapshots/go/utils.go new file mode 100644 index 00000000..d0527665 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/go/utils.go @@ -0,0 +1,6 @@ +package pachca + +// Ptr returns a pointer to the given value. +func Ptr[T any](v T) *T { + return &v +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/kt/Client.kt b/packages/generator/tests/array-no-brackets/snapshots/kt/Client.kt new file mode 100644 index 00000000..85fbc2e6 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/kt/Client.kt @@ -0,0 +1,97 @@ +package com.pachca.sdk + +import io.ktor.client.* +import io.ktor.client.call.* +import io.ktor.client.plugins.* +import io.ktor.client.plugins.auth.* +import io.ktor.client.plugins.auth.providers.* +import io.ktor.client.plugins.contentnegotiation.* +import io.ktor.client.request.* +import io.ktor.client.statement.* +import io.ktor.http.* +import io.ktor.serialization.kotlinx.json.* +import kotlinx.serialization.json.Json +import java.io.Closeable + +class SearchService internal constructor( + private val baseUrl: String, + private val client: HttpClient, +) { + suspend fun searchMessages( + query: String, + chatIds: List, + userIds: List? = null, + limit: Int? = null, + cursor: String? = null, + ): SearchMessagesResponse { + val response = client.get("$baseUrl/search/messages") { + parameter("query", query) + chatIds.forEach { parameter("chat_ids[]", it) } + userIds?.forEach { parameter("user_ids[]", it) } + limit?.let { parameter("limit", it) } + cursor?.let { parameter("cursor", it) } + } + return when (response.status.value) { + 200 -> response.body() + 401 -> throw response.body() + else -> throw RuntimeException("Unexpected status code: ${response.status.value}") + } + } + + suspend fun searchMessagesAll( + query: String, + chatIds: List, + userIds: List? = null, + limit: Int? = null, + ): List { + val items = mutableListOf() + var cursor: String? = null + do { + val response = searchMessages( + query = query, + chatIds = chatIds, + userIds = userIds, + limit = limit, + cursor = cursor, + ) + items.addAll(response.data) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) + return items + } +} + +class PachcaClient(token: String, baseUrl: String = "https://api.pachca.com/api/shared/v1") : Closeable { + private val client = HttpClient { + expectSuccess = false + install(ContentNegotiation) { + json(Json { explicitNulls = false }) + } + install(HttpRequestRetry) { + maxRetries = 3 + retryIf { _, response -> + response.status.value == 429 || response.status.value in setOf(500, 502, 503, 504) + } + delayMillis { retry -> + val retryAfter = response?.headers?.get("Retry-After")?.toLongOrNull() + if (retryAfter != null && response?.status?.value == 429) { + retryAfter * 1000L + } else { + val base = 10_000L * (1L shl retry) + val jitter = 0.5 + kotlin.random.Random.nextDouble() * 0.5 + (base * jitter).toLong() + } + } + } + defaultRequest { + bearerAuth(token) + } + } + + val search = SearchService(baseUrl, client) + + override fun close() { + client.close() + } +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/kt/Models.kt b/packages/generator/tests/array-no-brackets/snapshots/kt/Models.kt new file mode 100644 index 00000000..6e1cd9d7 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/kt/Models.kt @@ -0,0 +1,31 @@ +package com.pachca.sdk + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class MessageResult( + val id: Int, + val content: String, +) + +@Serializable +data class PaginationMetaPaginate( + @SerialName("next_page") val nextPage: String, +) + +@Serializable +data class PaginationMeta( + val paginate: PaginationMetaPaginate, +) + +@Serializable +data class OAuthError( + val error: String? = null, +) : Exception() + +@Serializable +data class SearchMessagesResponse( + val data: List, + val meta: PaginationMeta, +) diff --git a/packages/generator/tests/array-no-brackets/snapshots/kt/examples.json b/packages/generator/tests/array-no-brackets/snapshots/kt/examples.json new file mode 100644 index 00000000..16676c4b --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/kt/examples.json @@ -0,0 +1,12 @@ +{ + "Client_Init": { + "usage": "val client = PachcaClient(\"YOUR_TOKEN\")", + "imports": [ + "PachcaClient" + ] + }, + "SearchOperations_searchMessages": { + "usage": "val chatIds = listOf(123)\nval userIds = listOf(123)\nval response = client.search.searchMessages(query = \"example\", chatIds = chatIds, userIds = userIds, limit = 123, cursor = \"example\")", + "output": "SearchMessagesResponse(data: List, meta: PaginationMeta)" + } +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/py/__init__.py b/packages/generator/tests/array-no-brackets/snapshots/py/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/packages/generator/tests/array-no-brackets/snapshots/py/client.py b/packages/generator/tests/array-no-brackets/snapshots/py/client.py new file mode 100644 index 00000000..1b7d7ffe --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/py/client.py @@ -0,0 +1,76 @@ +from __future__ import annotations + +import httpx + +from .models import ( + SearchMessagesParams, + SearchMessagesResponse, + MessageResult, + OAuthError, +) +from .utils import deserialize, RetryTransport + +class SearchService: + def __init__(self, client: httpx.AsyncClient) -> None: + self._client = client + + async def search_messages( + self, + params: SearchMessagesParams, + ) -> SearchMessagesResponse: + query: list[tuple[str, str]] = [] + query.append(("query", params.query)) + if params.chat_ids is not None: + for v in params.chat_ids: + query.append(("chat_ids[]", str(v))) + if params is not None and params.user_ids is not None: + for v in params.user_ids: + query.append(("user_ids[]", str(v))) + if params is not None and params.limit is not None: + query.append(("limit", str(params.limit))) + if params is not None and params.cursor is not None: + query.append(("cursor", params.cursor)) + response = await self._client.get( + "/search/messages", + params=query, + ) + body = response.json() + match response.status_code: + case 200: + return deserialize(SearchMessagesResponse, body) + case 401: + raise deserialize(OAuthError, body) + case _: + raise RuntimeError( + f"Unexpected status code: {response.status_code}" + ) + + async def search_messages_all( + self, + params: SearchMessagesParams, + ) -> list[MessageResult]: + items: list[MessageResult] = [] + cursor: str | None = None + while True: + if params is None: + params = SearchMessagesParams() + params.cursor = cursor + response = await self.search_messages(params=params) + items.extend(response.data) + if not response.data: + break + cursor = response.meta.paginate.next_page + return items + + +class PachcaClient: + def __init__(self, token: str, base_url: str = "https://api.pachca.com/api/shared/v1") -> None: + self._client = httpx.AsyncClient( + base_url=base_url, + headers={"Authorization": f"Bearer {token}"}, + transport=RetryTransport(httpx.AsyncHTTPTransport()), + ) + self.search = SearchService(self._client) + + async def close(self) -> None: + await self._client.aclose() diff --git a/packages/generator/tests/array-no-brackets/snapshots/py/examples.json b/packages/generator/tests/array-no-brackets/snapshots/py/examples.json new file mode 100644 index 00000000..1a507f34 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/py/examples.json @@ -0,0 +1,15 @@ +{ + "Client_Init": { + "usage": "client = PachcaClient(\"YOUR_TOKEN\")", + "imports": [ + "PachcaClient" + ] + }, + "SearchOperations_searchMessages": { + "usage": "params = SearchMessagesParams(\n query=\"example\",\n chat_ids=[123],\n user_ids=[123],\n limit=123,\n cursor=\"example\"\n)\nresponse = await client.search.search_messages(params=params)", + "output": "SearchMessagesResponse(data: list[MessageResult], meta: PaginationMeta)", + "imports": [ + "SearchMessagesParams" + ] + } +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/py/models.py b/packages/generator/tests/array-no-brackets/snapshots/py/models.py new file mode 100644 index 00000000..88988a19 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/py/models.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +from dataclasses import dataclass + +@dataclass +class MessageResult: + id: int + content: str + + +@dataclass +class PaginationMetaPaginate: + next_page: str + + +@dataclass +class PaginationMeta: + paginate: PaginationMetaPaginate + + +@dataclass +class OAuthError(Exception): + error: str | None = None + + +@dataclass +class SearchMessagesParams: + query: str + chat_ids: list[int] + user_ids: list[int] | None = None + limit: int | None = None + cursor: str | None = None + + +@dataclass +class SearchMessagesResponse: + data: list[MessageResult] + meta: PaginationMeta diff --git a/packages/generator/tests/array-no-brackets/snapshots/py/utils.py b/packages/generator/tests/array-no-brackets/snapshots/py/utils.py new file mode 100644 index 00000000..d1494873 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/py/utils.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +import dataclasses +import keyword +from dataclasses import asdict, fields +from typing import Type, TypeVar, get_args, get_origin, get_type_hints + +import httpx + +T = TypeVar("T") + + +def _is_dataclass_type(tp: type) -> bool: + return isinstance(tp, type) and dataclasses.is_dataclass(tp) + + +def _resolve_type(tp: type) -> type | None: + """Extract a concrete dataclass type from Optional[X] or X | None.""" + origin = get_origin(tp) + if origin is list: + return None # lists are handled inline + args = get_args(tp) + for arg in args: + if _is_dataclass_type(arg): + return arg + if _is_dataclass_type(tp): + return tp + return None + + +def _resolve_list_item_type(tp: type) -> type | None: + """Extract the item type from list[X].""" + origin = get_origin(tp) + if origin is list: + args = get_args(tp) + if args: + return args[0] + return None + + +def deserialize(cls: Type[T], data: dict) -> T: + """Create a dataclass instance from a dict, recursively deserializing nested dataclasses.""" + field_map = {f.name: f for f in fields(cls)} + hints = get_type_hints(cls) + norm = {k.replace("-", "_").lower(): v for k, v in data.items()} + kwargs = {} + for k, v in norm.items(): + if k not in field_map: + k = f"{k}_" + if k not in field_map: + continue + f = field_map[k] + if isinstance(v, dict): + nested = _resolve_type(hints[f.name]) + if nested is not None: + v = deserialize(nested, v) + elif isinstance(v, list) and v: + item_tp = _resolve_list_item_type(hints[f.name]) + if item_tp is not None and _is_dataclass_type(item_tp): + v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + kwargs[k] = v + return cls(**kwargs) + + +def _strip_nones(val: object) -> object: + if isinstance(val, dict): + return { + (k[:-1] if k.endswith("_") and keyword.iskeyword(k[:-1]) else k): _strip_nones(v) + for k, v in val.items() if v is not None + } + if isinstance(val, list): + return [_strip_nones(v) for v in val] + return val + + +def serialize(obj: object) -> dict: + """Convert a dataclass to a dict, recursively omitting None values.""" + return _strip_nones(asdict(obj)) + + +_MAX_RETRIES = 3 +_RETRYABLE_5XX = {500, 502, 503, 504} + + +def _jitter(delay: float) -> float: + import random + return delay * (0.5 + random.random() * 0.5) + + +class RetryTransport(httpx.AsyncBaseTransport): + """Wraps an httpx transport with retry on 429 Too Many Requests and 5xx errors.""" + + def __init__(self, transport: httpx.AsyncBaseTransport, max_retries: int = _MAX_RETRIES) -> None: + self._transport = transport + self._max_retries = max_retries + + async def handle_async_request(self, request: httpx.Request) -> httpx.Response: + import asyncio + for attempt in range(self._max_retries + 1): + response = await self._transport.handle_async_request(request) + if response.status_code == 429 and attempt < self._max_retries: + retry_after = response.headers.get("retry-after") + delay = int(retry_after) if retry_after and retry_after.isdigit() else 2 ** attempt + await asyncio.sleep(delay) + continue + if response.status_code in _RETRYABLE_5XX and attempt < self._max_retries: + delay = _jitter(10 * (2 ** attempt)) + await asyncio.sleep(delay) + continue + return response + return response # unreachable diff --git a/packages/generator/tests/array-no-brackets/snapshots/swift/Client.swift b/packages/generator/tests/array-no-brackets/snapshots/swift/Client.swift new file mode 100644 index 00000000..3fe79eb7 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/swift/Client.swift @@ -0,0 +1,60 @@ +import Foundation +#if canImport(FoundationNetworking) +import FoundationNetworking +#endif + +public struct SearchService { + let baseURL: String + let headers: [String: String] + let session: URLSession + + init(baseURL: String, headers: [String: String], session: URLSession = .shared) { + self.baseURL = baseURL + self.headers = headers + self.session = session + } + + public func searchMessages(query: String, chatIds: [Int], userIds: [Int]? = nil, limit: Int? = nil, cursor: String? = nil) async throws -> SearchMessagesResponse { + var components = URLComponents(string: "\(baseURL)/search/messages")! + var queryItems: [URLQueryItem] = [] + queryItems.append(URLQueryItem(name: "query", value: String(query))) + chatIds.forEach { queryItems.append(URLQueryItem(name: "chat_ids[]", value: String($0))) } + if let userIds { userIds.forEach { queryItems.append(URLQueryItem(name: "user_ids[]", value: String($0))) } } + if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } + if let cursor { queryItems.append(URLQueryItem(name: "cursor", value: String(cursor))) } + if !queryItems.isEmpty { components.queryItems = queryItems } + var request = URLRequest(url: components.url!) + headers.forEach { request.setValue($1, forHTTPHeaderField: $0) } + let (data, urlResponse) = try await dataWithRetry(session: session, for: request) + let statusCode = (urlResponse as! HTTPURLResponse).statusCode + switch statusCode { + case 200: + return try deserialize(SearchMessagesResponse.self, from: data) + case 401: + throw try deserialize(OAuthError.self, from: data) + default: + throw URLError(.badServerResponse) + } + } + + public func searchMessagesAll(query: String, chatIds: [Int], userIds: [Int]? = nil, limit: Int? = nil) async throws -> [MessageResult] { + var items: [MessageResult] = [] + var cursor: String? = nil + repeat { + let response = try await searchMessages(query: query, chatIds: chatIds, userIds: userIds, limit: limit, cursor: cursor) + items.append(contentsOf: response.data) + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true + return items + } +} + +public struct PachcaClient { + public let search: SearchService + + public init(token: String, baseURL: String = "https://api.pachca.com/api/shared/v1") { + let headers = ["Authorization": "Bearer \(token)"] + self.search = SearchService(baseURL: baseURL, headers: headers) + } +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/swift/Models.swift b/packages/generator/tests/array-no-brackets/snapshots/swift/Models.swift new file mode 100644 index 00000000..6efcf51b --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/swift/Models.swift @@ -0,0 +1,47 @@ +import Foundation +#if canImport(FoundationNetworking) +import FoundationNetworking +#endif + +public struct MessageResult: Codable { + public let id: Int + public let content: String + + public init(id: Int, content: String) { + self.id = id + self.content = content + } +} + +public struct PaginationMetaPaginate: Codable { + public let nextPage: String + + public init(nextPage: String) { + self.nextPage = nextPage + } + + enum CodingKeys: String, CodingKey { + case nextPage = "next_page" + } +} + +public struct PaginationMeta: Codable { + public let paginate: PaginationMetaPaginate + + public init(paginate: PaginationMetaPaginate) { + self.paginate = paginate + } +} + +public struct OAuthError: Codable, Error { + public let error: String? + + public init(error: String? = nil) { + self.error = error + } +} + +public struct SearchMessagesResponse: Codable { + public let data: [MessageResult] + public let meta: PaginationMeta +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/swift/Utils.swift b/packages/generator/tests/array-no-brackets/snapshots/swift/Utils.swift new file mode 100644 index 00000000..d65d2a00 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/swift/Utils.swift @@ -0,0 +1,69 @@ +import Foundation +#if canImport(FoundationNetworking) +import FoundationNetworking +#endif + +let pachcaDecoder: JSONDecoder = { + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .iso8601 + return decoder +}() + +let pachcaEncoder: JSONEncoder = { + let encoder = JSONEncoder() + encoder.dateEncodingStrategy = .iso8601 + return encoder +}() + +func serialize(_ value: T) throws -> Data { + let data = try pachcaEncoder.encode(value) + let json = try JSONSerialization.jsonObject(with: data) + return try JSONSerialization.data(withJSONObject: stripNulls(json)) +} + +func deserialize(_ type: T.Type, from data: Data) throws -> T { + return try pachcaDecoder.decode(type, from: data) +} + +private let maxRetries = 3 +private let retryable5xx: Set = [500, 502, 503, 504] + +private func jitter(_ delay: UInt64) -> UInt64 { + return UInt64(Double(delay) * (0.5 + Double.random(in: 0..<0.5))) +} + +func dataWithRetry(session: URLSession, for request: URLRequest, delegate: (any URLSessionTaskDelegate)? = nil) async throws -> (Data, URLResponse) { + for attempt in 0...maxRetries { + let (data, response) = try await session.data(for: request, delegate: delegate) + if let http = response as? HTTPURLResponse, http.statusCode == 429, attempt < maxRetries { + let delay: UInt64 + if let ra = http.value(forHTTPHeaderField: "Retry-After"), let secs = UInt64(ra) { + delay = secs * 1_000_000_000 + } else { + delay = UInt64(pow(2.0, Double(attempt))) * 1_000_000_000 + } + try await _Concurrency.Task.sleep(nanoseconds: delay) + continue + } + if let http = response as? HTTPURLResponse, retryable5xx.contains(http.statusCode), attempt < maxRetries { + let delay = jitter(10 * UInt64(pow(2.0, Double(attempt))) * 1_000_000_000) + try await _Concurrency.Task.sleep(nanoseconds: delay) + continue + } + return (data, response) + } + return try await session.data(for: request, delegate: delegate) // unreachable +} + +private func stripNulls(_ value: Any) -> Any { + if let dict = value as? [String: Any] { + return dict.compactMapValues { v -> Any? in + if v is NSNull { return nil } + return stripNulls(v) + } + } + if let arr = value as? [Any] { + return arr.map(stripNulls) + } + return value +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/swift/examples.json b/packages/generator/tests/array-no-brackets/snapshots/swift/examples.json new file mode 100644 index 00000000..b8790c95 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/swift/examples.json @@ -0,0 +1,12 @@ +{ + "Client_Init": { + "usage": "let client = PachcaClient(token: \"YOUR_TOKEN\")", + "imports": [ + "PachcaClient" + ] + }, + "SearchOperations_searchMessages": { + "usage": "let chatIds = [123]\nlet userIds = [123]\nlet response = try await client.search.searchMessages(query: \"example\", chatIds: chatIds, userIds: userIds, limit: 123, cursor: \"example\")", + "output": "SearchMessagesResponse(data: [MessageResult], meta: PaginationMeta)" + } +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/ts/client.ts b/packages/generator/tests/array-no-brackets/snapshots/ts/client.ts new file mode 100644 index 00000000..e2ad6748 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/ts/client.ts @@ -0,0 +1,60 @@ +import { + SearchMessagesParams, + SearchMessagesResponse, + MessageResult, + OAuthError, +} from "./types"; +import { deserialize, fetchWithRetry } from "./utils"; + +class SearchService { + constructor( + private baseUrl: string, + private headers: Record, + ) {} + + async searchMessages(params: SearchMessagesParams): Promise { + const query = new URLSearchParams(); + query.set("query", params.query); + if (params.chatIds !== undefined) { + params.chatIds.forEach((v) => query.append("chat_ids[]", String(v))); + } + if (params?.userIds !== undefined) { + params.userIds.forEach((v) => query.append("user_ids[]", String(v))); + } + if (params?.limit !== undefined) query.set("limit", String(params.limit)); + if (params?.cursor !== undefined) query.set("cursor", params.cursor); + const response = await fetchWithRetry(`${this.baseUrl}/search/messages?${query}`, { + headers: this.headers, + }); + const body = await response.json(); + switch (response.status) { + case 200: + return deserialize(body) as SearchMessagesResponse; + case 401: + throw new OAuthError(body.error); + default: + throw new Error(`HTTP ${response.status}: ${JSON.stringify(body)}`); + } + } + + async searchMessagesAll(params: Omit): Promise { + const items: MessageResult[] = []; + let cursor: string | undefined; + do { + const response = await this.searchMessages({ ...params, cursor } as SearchMessagesParams); + items.push(...response.data); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); + return items; + } +} + +export class PachcaClient { + readonly search: SearchService; + + constructor(token: string, baseUrl: string = "https://api.pachca.com/api/shared/v1") { + const headers = { Authorization: `Bearer ${token}` }; + this.search = new SearchService(baseUrl, headers); + } +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/ts/examples.json b/packages/generator/tests/array-no-brackets/snapshots/ts/examples.json new file mode 100644 index 00000000..89214d07 --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/ts/examples.json @@ -0,0 +1,12 @@ +{ + "Client_Init": { + "usage": "const client = new PachcaClient(\"YOUR_TOKEN\")", + "imports": [ + "PachcaClient" + ] + }, + "SearchOperations_searchMessages": { + "usage": "const response = client.search.searchMessages({\n query: \"example\",\n chatIds: [123],\n userIds: [123],\n limit: 123,\n cursor: \"example\"\n})", + "output": "SearchMessagesResponse({ data: MessageResult[], meta: PaginationMeta })" + } +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/ts/types.ts b/packages/generator/tests/array-no-brackets/snapshots/ts/types.ts new file mode 100644 index 00000000..96e7963d --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/ts/types.ts @@ -0,0 +1,31 @@ +export interface MessageResult { + id: number; + content: string; +} + +export interface PaginationMeta { + paginate: { + nextPage: string; + }; +} + +export class OAuthError extends Error { + error?: string; + constructor(error?: string) { + super(error); + this.error = error; + } +} + +export interface SearchMessagesParams { + query: string; + chatIds: number[]; + userIds?: number[]; + limit?: number; + cursor?: string; +} + +export interface SearchMessagesResponse { + data: MessageResult[]; + meta: PaginationMeta; +} diff --git a/packages/generator/tests/array-no-brackets/snapshots/ts/utils.ts b/packages/generator/tests/array-no-brackets/snapshots/ts/utils.ts new file mode 100644 index 00000000..5cf7ef4a --- /dev/null +++ b/packages/generator/tests/array-no-brackets/snapshots/ts/utils.ts @@ -0,0 +1,58 @@ +function snakeToCamel(str: string): string { + const camel = str.replace(/[-_]([a-zA-Z])/g, (_, c) => c.toUpperCase()); + return camel.charAt(0).toLowerCase() + camel.slice(1); +} + +function camelToSnake(str: string): string { + return str + .replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2") + .replace(/([a-z0-9])([A-Z])/g, "$1_$2") + .toLowerCase(); +} + +export function deserialize(obj: unknown): unknown { + if (Array.isArray(obj)) return obj.map(deserialize); + if (obj !== null && typeof obj === "object") { + return Object.fromEntries( + Object.entries(obj).map(([k, v]) => [snakeToCamel(k), deserialize(v)]), + ); + } + return obj; +} + +export function serialize(obj: unknown): unknown { + if (Array.isArray(obj)) return obj.map(serialize); + if (obj !== null && typeof obj === "object") { + return Object.fromEntries( + Object.entries(obj) + .filter(([, v]) => v !== undefined) + .map(([k, v]) => [camelToSnake(k), serialize(v)]), + ); + } + return obj; +} + +const MAX_RETRIES = 3; +const RETRYABLE_5XX = new Set([500, 502, 503, 504]); + +function jitter(delay: number): number { + return delay * (0.5 + Math.random() * 0.5); +} + +export async function fetchWithRetry(input: RequestInfo | URL, init?: RequestInit): Promise { + for (let attempt = 0; ; attempt++) { + const response = await fetch(input, init); + if (response.status === 429 && attempt < MAX_RETRIES) { + const retryAfter = response.headers.get("retry-after"); + const delay = retryAfter ? Number(retryAfter) * 1000 : 1000 * Math.pow(2, attempt); + await new Promise((r) => setTimeout(r, delay)); + continue; + } + if (RETRYABLE_5XX.has(response.status) && attempt < MAX_RETRIES) { + const delay = jitter(10000 * Math.pow(2, attempt)); + await new Promise((r) => setTimeout(r, delay)); + continue; + } + return response; + } +} diff --git a/packages/generator/tests/crud/snapshots/cs/Client.cs b/packages/generator/tests/crud/snapshots/cs/Client.cs index 23f28beb..76042131 100644 --- a/packages/generator/tests/crud/snapshots/cs/Client.cs +++ b/packages/generator/tests/crud/snapshots/cs/Client.cs @@ -69,6 +69,7 @@ public async System.Threading.Tasks.Task> ListChatsAllAsync( { var response = await ListChatsAsync(availability: availability, limit: limit, cursor: cursor, sortField: sortField, sortOrder: sortOrder, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); + if (response.Data.Count == 0) break; cursor = response.Meta?.Paginate?.NextPage; } while (cursor != null); return items; diff --git a/packages/generator/tests/crud/snapshots/go/client.go b/packages/generator/tests/crud/snapshots/go/client.go index a6effee1..96f742c1 100644 --- a/packages/generator/tests/crud/snapshots/go/client.go +++ b/packages/generator/tests/crud/snapshots/go/client.go @@ -105,11 +105,15 @@ func (s *ChatsService) ListChats(ctx context.Context, params *ListChatsParams) ( return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -127,10 +131,11 @@ func (s *ChatsService) ListChatsAll(ctx context.Context, params *ListChatsParams return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 || result.Meta == nil { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } @@ -155,11 +160,15 @@ func (s *ChatsService) GetChat(ctx context.Context, id int32) (*Chat, error) { return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -190,11 +199,15 @@ func (s *ChatsService) CreateChat(ctx context.Context, request ChatCreateRequest return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -225,11 +238,15 @@ func (s *ChatsService) UpdateChat(ctx context.Context, id int32, request ChatUpd return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -249,11 +266,15 @@ func (s *ChatsService) ArchiveChat(ctx context.Context, id int32) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -273,11 +294,15 @@ func (s *ChatsService) DeleteChat(ctx context.Context, id int32) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } diff --git a/packages/generator/tests/crud/snapshots/kt/Client.kt b/packages/generator/tests/crud/snapshots/kt/Client.kt index 6736208c..6633ee76 100644 --- a/packages/generator/tests/crud/snapshots/kt/Client.kt +++ b/packages/generator/tests/crud/snapshots/kt/Client.kt @@ -55,6 +55,7 @@ class ChatsService internal constructor( sortOrder = sortOrder, ) items.addAll(response.data) + if (response.data.isEmpty()) break cursor = response.meta?.paginate?.nextPage } while (cursor != null) return items diff --git a/packages/generator/tests/crud/snapshots/py/client.py b/packages/generator/tests/crud/snapshots/py/client.py index e73999ce..32b12fd9 100644 --- a/packages/generator/tests/crud/snapshots/py/client.py +++ b/packages/generator/tests/crud/snapshots/py/client.py @@ -59,7 +59,9 @@ async def list_chats_all( params.cursor = cursor response = await self.list_chats(params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None + if not response.data: + break + cursor = response.meta.paginate.next_page if response.meta else None if not cursor: break return items diff --git a/packages/generator/tests/crud/snapshots/swift/Client.swift b/packages/generator/tests/crud/snapshots/swift/Client.swift index a08a1a28..5393783b 100644 --- a/packages/generator/tests/crud/snapshots/swift/Client.swift +++ b/packages/generator/tests/crud/snapshots/swift/Client.swift @@ -43,7 +43,8 @@ public struct ChatsService { repeat { let response = try await listChats(availability: availability, limit: limit, cursor: cursor, sortField: sortField, sortOrder: sortOrder) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage + if response.data.isEmpty { break } + cursor = response.meta?.paginate.nextPage } while cursor != nil return items } diff --git a/packages/generator/tests/crud/snapshots/ts/client.ts b/packages/generator/tests/crud/snapshots/ts/client.ts index c00d7c3f..a8c48e5d 100644 --- a/packages/generator/tests/crud/snapshots/ts/client.ts +++ b/packages/generator/tests/crud/snapshots/ts/client.ts @@ -43,7 +43,8 @@ class ChatsService { do { const response = await this.listChats({ ...params, cursor } as ListChatsParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; + if (response.data.length === 0) break; + cursor = response.meta?.paginate.nextPage; } while (cursor); return items; } diff --git a/packages/generator/tests/date-format/fixture.yaml b/packages/generator/tests/date-format/fixture.yaml new file mode 100644 index 00000000..7376a9f6 --- /dev/null +++ b/packages/generator/tests/date-format/fixture.yaml @@ -0,0 +1,161 @@ +openapi: 3.0.0 +info: + title: Test API — Date Format + version: 1.0.0 +servers: + - url: https://api.pachca.com/api/shared/v1 +tags: + - name: Export +paths: + /exports: + post: + operationId: ExportOperations_createExport + description: Создание экспорта с date-only и date-time полями + parameters: [] + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/Export' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + tags: + - Export + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ExportRequest' + /events: + get: + operationId: EventOperations_listEvents + description: Получение событий с date query параметрами + parameters: + - name: date_from + in: query + required: true + description: Дата начала (date-only) + schema: + type: string + format: date + - name: date_to + in: query + required: false + description: Дата окончания (date-only) + schema: + type: string + format: date + - name: created_after + in: query + required: false + description: Создано после (date-time) + schema: + type: string + format: date-time + - name: limit + in: query + required: false + description: Количество записей + schema: + type: integer + format: int32 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: '#/components/schemas/Event' + tags: + - Export +components: + schemas: + ExportRequest: + type: object + required: + - start_at + - end_at + - webhook_url + properties: + start_at: + type: string + format: date + description: Дата начала (YYYY-MM-DD) + example: '2025-03-20' + end_at: + type: string + format: date + description: Дата окончания (YYYY-MM-DD) + example: '2025-03-20' + webhook_url: + type: string + description: URL для вебхука + + Export: + type: object + required: + - id + - start_at + - end_at + - status + - created_at + properties: + id: + type: integer + format: int32 + start_at: + type: string + format: date + description: Дата начала + end_at: + type: string + format: date + description: Дата окончания + status: + type: string + description: Статус экспорта + created_at: + type: string + format: date-time + description: Дата создания + + Event: + type: object + required: + - id + - type + - occurred_at + properties: + id: + type: integer + format: int32 + type: + type: string + occurred_at: + type: string + format: date-time + + OAuthError: + type: object + properties: + error: + type: string diff --git a/packages/generator/tests/date-format/snapshots/cs/Client.cs b/packages/generator/tests/date-format/snapshots/cs/Client.cs new file mode 100644 index 00000000..efebc212 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/cs/Client.cs @@ -0,0 +1,92 @@ +#nullable enable + +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Text.Json; +using System.Threading; + +namespace Pachca.Sdk; + +public sealed class ExportService +{ + private readonly string _baseUrl; + private readonly HttpClient _client; + + internal ExportService(string baseUrl, HttpClient client) + { + _baseUrl = baseUrl; + _client = client; + } + + public async System.Threading.Tasks.Task ListEventsAsync( + DateOnly dateFrom, + DateOnly? dateTo = null, + DateTimeOffset? createdAfter = null, + int? limit = null, + CancellationToken cancellationToken = default) + { + var queryParts = new List(); + queryParts.Add($"date_from={Uri.EscapeDataString(dateFrom)}"); + if (dateTo != null) + queryParts.Add($"date_to={Uri.EscapeDataString(dateTo)}"); + if (createdAfter != null) + queryParts.Add($"created_after={Uri.EscapeDataString(createdAfter.Value.ToString("o"))}"); + if (limit != null) + queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); + var url = $"{_baseUrl}/events" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); + using var request = new HttpRequestMessage(HttpMethod.Get, url); + using var response = await PachcaUtils.SendWithRetryAsync(_client, request, cancellationToken).ConfigureAwait(false); + var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 200: + return PachcaUtils.Deserialize(json); + default: + throw new InvalidOperationException($"Unexpected status code: {(int)response.StatusCode}"); + } + } + + public async System.Threading.Tasks.Task CreateExportAsync(ExportRequest request, CancellationToken cancellationToken = default) + { + var url = $"{_baseUrl}/exports"; + using var httpRequest = new HttpRequestMessage(HttpMethod.Post, url); + httpRequest.Content = new StringContent(PachcaUtils.Serialize(request), Encoding.UTF8, "application/json"); + using var response = await PachcaUtils.SendWithRetryAsync(_client, httpRequest, cancellationToken).ConfigureAwait(false); + var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 201: + return PachcaUtils.Deserialize(json).Data; + case 401: + throw PachcaUtils.Deserialize(json); + default: + throw new InvalidOperationException($"Unexpected status code: {(int)response.StatusCode}"); + } + } +} + +public sealed class PachcaClient : IDisposable +{ + private readonly HttpClient _client; + + public ExportService Export { get; } + + public PachcaClient(string token, string baseUrl = "https://api.pachca.com/api/shared/v1") + { + _client = new HttpClient(); + _client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("Bearer", token); + + Export = new ExportService(baseUrl, _client); + } + + public void Dispose() + { + _client.Dispose(); + GC.SuppressFinalize(this); + } +} diff --git a/packages/generator/tests/date-format/snapshots/cs/Models.cs b/packages/generator/tests/date-format/snapshots/cs/Models.cs new file mode 100644 index 00000000..81d24265 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/cs/Models.cs @@ -0,0 +1,60 @@ +#nullable enable + +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Pachca.Sdk; + +public class ExportRequest +{ + [JsonPropertyName("start_at")] + public DateOnly StartAt { get; set; } = default!; + [JsonPropertyName("end_at")] + public DateOnly EndAt { get; set; } = default!; + [JsonPropertyName("webhook_url")] + public string WebhookUrl { get; set; } = default!; +} + +public class Export +{ + [JsonPropertyName("id")] + public int Id { get; set; } = default!; + [JsonPropertyName("start_at")] + public DateOnly StartAt { get; set; } = default!; + [JsonPropertyName("end_at")] + public DateOnly EndAt { get; set; } = default!; + [JsonPropertyName("status")] + public string Status { get; set; } = default!; + [JsonPropertyName("created_at")] + public DateTimeOffset CreatedAt { get; set; } = default!; +} + +public class Event +{ + [JsonPropertyName("id")] + public int Id { get; set; } = default!; + [JsonPropertyName("type")] + public string Type { get; set; } = default!; + [JsonPropertyName("occurred_at")] + public DateTimeOffset OccurredAt { get; set; } = default!; +} + +public class OAuthError : Exception +{ + [JsonPropertyName("error")] + public string? Error { get; set; } +} + +public class ListEventsResponse +{ + [JsonPropertyName("data")] + public List Data { get; set; } = new(); +} + +public class ExportDataWrapper +{ + [JsonPropertyName("data")] + public Export Data { get; set; } = default!; +} diff --git a/packages/generator/tests/date-format/snapshots/cs/Utils.cs b/packages/generator/tests/date-format/snapshots/cs/Utils.cs new file mode 100644 index 00000000..2cf57544 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/cs/Utils.cs @@ -0,0 +1,103 @@ +#nullable enable + +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Pachca.Sdk; + +internal static class PachcaUtils +{ + private const int MaxRetries = 3; + private static readonly HashSet Retryable5xx = new() { 500, 502, 503, 504 }; + private static readonly Random JitterRandom = new(); + + internal static readonly JsonSerializerOptions JsonOptions = new() + { + DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull, + PropertyNameCaseInsensitive = true, + }; + + private static TimeSpan AddJitter(TimeSpan delay) + { + var factor = 0.5 + JitterRandom.NextDouble() * 0.5; + return TimeSpan.FromMilliseconds(delay.TotalMilliseconds * factor); + } + + internal static async Task SendWithRetryAsync( + HttpClient client, + HttpRequestMessage request, + CancellationToken cancellationToken = default) + { + for (var attempt = 0; attempt <= MaxRetries; attempt++) + { + HttpRequestMessage req; + if (attempt == 0) + { + req = request; + } + else + { + req = await CloneRequestAsync(request).ConfigureAwait(false); + } + + var response = await client.SendAsync(req, cancellationToken).ConfigureAwait(false); + + if ((int)response.StatusCode == 429 && attempt < MaxRetries) + { + var delay = response.Headers.RetryAfter?.Delta + ?? TimeSpan.FromSeconds(Math.Pow(2, attempt)); + await System.Threading.Tasks.Task.Delay(delay, cancellationToken).ConfigureAwait(false); + response.Dispose(); + continue; + } + + if (Retryable5xx.Contains((int)response.StatusCode) && attempt < MaxRetries) + { + var delay = AddJitter(TimeSpan.FromSeconds(10 * Math.Pow(2, attempt))); + await System.Threading.Tasks.Task.Delay(delay, cancellationToken).ConfigureAwait(false); + response.Dispose(); + continue; + } + + return response; + } + + return await client.SendAsync( + await CloneRequestAsync(request).ConfigureAwait(false), + cancellationToken).ConfigureAwait(false); + } + + private static async Task CloneRequestAsync(HttpRequestMessage request) + { + var clone = new HttpRequestMessage(request.Method, request.RequestUri); + foreach (var header in request.Headers) + clone.Headers.TryAddWithoutValidation(header.Key, header.Value); + + if (request.Content != null) + { + var content = await request.Content.ReadAsByteArrayAsync().ConfigureAwait(false); + clone.Content = new ByteArrayContent(content); + if (request.Content.Headers.ContentType != null) + clone.Content.Headers.ContentType = request.Content.Headers.ContentType; + } + + return clone; + } + + internal static T Deserialize(string json) => + JsonSerializer.Deserialize(json, JsonOptions) + ?? throw new InvalidOperationException("Deserialization returned null"); + + internal static string Serialize(T value) => + JsonSerializer.Serialize(value, JsonOptions); + + internal static string EnumToApiString(T value) where T : struct, Enum => + JsonSerializer.Serialize(value, JsonOptions).Trim('"'); +} diff --git a/packages/generator/tests/date-format/snapshots/cs/examples.json b/packages/generator/tests/date-format/snapshots/cs/examples.json new file mode 100644 index 00000000..120c78f4 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/cs/examples.json @@ -0,0 +1,19 @@ +{ + "Client_Init": { + "usage": "using var client = new PachcaClient(\"YOUR_TOKEN\");", + "imports": [ + "PachcaClient" + ] + }, + "EventOperations_listEvents": { + "usage": "var response = await client.Export.ListEventsAsync(DateOnly.Parse(\"2024-01-01\"), DateOnly.Parse(\"2024-01-01\"), DateTimeOffset.UtcNow, 123);", + "output": "ListEventsResponse(Data: List)" + }, + "ExportOperations_createExport": { + "usage": "var request = new ExportRequest\n{\n StartAt = DateOnly.Parse(\"2025-03-20\"),\n EndAt = DateOnly.Parse(\"2025-03-20\"),\n WebhookUrl = \"example\"\n};\nvar response = await client.Export.CreateExportAsync(request);", + "output": "Export(Id: int, StartAt: DateOnly, EndAt: DateOnly, Status: string, CreatedAt: DateTimeOffset)", + "imports": [ + "ExportRequest" + ] + } +} diff --git a/packages/generator/tests/date-format/snapshots/go/client.go b/packages/generator/tests/date-format/snapshots/go/client.go new file mode 100644 index 00000000..89de56c8 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/go/client.go @@ -0,0 +1,156 @@ +package pachca + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "math/rand" + "net/http" + "net/url" + "strconv" + "time" +) + +type authTransport struct { + token string + base http.RoundTripper +} + +func (t *authTransport) RoundTrip(req *http.Request) (*http.Response, error) { + req.Header.Set("Authorization", "Bearer "+t.token) + return t.base.RoundTrip(req) +} + +const maxRetries = 3 + +var retryable5xx = map[int]bool{500: true, 502: true, 503: true, 504: true} + +func jitter(d time.Duration) time.Duration { + return time.Duration(float64(d) * (0.5 + rand.Float64()*0.5)) +} + +func doWithRetry(client *http.Client, req *http.Request) (*http.Response, error) { + for attempt := 0; ; attempt++ { + if attempt > 0 && req.GetBody != nil { + req.Body, _ = req.GetBody() + } + resp, err := client.Do(req) + if err != nil { + return nil, err + } + if resp.StatusCode == http.StatusTooManyRequests && attempt < maxRetries { + resp.Body.Close() + delay := time.Duration(1< 0 { url = baseURL[0] } + client := &http.Client{ + Transport: &authTransport{token: token, base: http.DefaultTransport}, + } + return &PachcaClient{ + Export: &ExportService{baseURL: url, client: client}, + } +} diff --git a/packages/generator/tests/date-format/snapshots/go/examples.json b/packages/generator/tests/date-format/snapshots/go/examples.json new file mode 100644 index 00000000..a73f6bf6 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/go/examples.json @@ -0,0 +1,22 @@ +{ + "Client_Init": { + "usage": "client := pachca.NewPachcaClient(\"YOUR_TOKEN\")", + "imports": [ + "PachcaClient" + ] + }, + "EventOperations_listEvents": { + "usage": "params := ListEventsParams{\n\tDateFrom: \"2024-01-01\",\n\tDateTo: Ptr(\"2024-01-01\"),\n\tCreatedAfter: Ptr(\"2024-01-01T00:00:00Z\"),\n\tLimit: Ptr(int32(123)),\n}\nresponse, err := client.Export.ListEvents(ctx, params)", + "output": "ListEventsResponse{Data: []Event}", + "imports": [ + "ListEventsParams" + ] + }, + "ExportOperations_createExport": { + "usage": "request := ExportRequest{\n\tStartAt: \"2025-03-20\",\n\tEndAt: \"2025-03-20\",\n\tWebhookURL: \"example\",\n}\nresponse, err := client.Export.CreateExport(ctx, request)", + "output": "Export{ID: int32, StartAt: string, EndAt: string, Status: string, CreatedAt: string}", + "imports": [ + "ExportRequest" + ] + } +} diff --git a/packages/generator/tests/date-format/snapshots/go/types.go b/packages/generator/tests/date-format/snapshots/go/types.go new file mode 100644 index 00000000..eda829e9 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/go/types.go @@ -0,0 +1,47 @@ +package pachca + +import ( + "time" +) + +type ExportRequest struct { + StartAt string `json:"start_at"` + EndAt string `json:"end_at"` + WebhookURL string `json:"webhook_url"` +} + +type Export struct { + ID int32 `json:"id"` + StartAt string `json:"start_at"` + EndAt string `json:"end_at"` + Status string `json:"status"` + CreatedAt time.Time `json:"created_at"` +} + +type Event struct { + ID int32 `json:"id"` + Type string `json:"type"` + OccurredAt time.Time `json:"occurred_at"` +} + +type OAuthError struct { + Err *string `json:"error,omitempty"` +} + +func (e *OAuthError) Error() string { + if e.Err != nil { + return *e.Err + } + return "oauth error" +} + +type ListEventsParams struct { + DateFrom string + DateTo *string + CreatedAfter *time.Time + Limit *int32 +} + +type ListEventsResponse struct { + Data []Event `json:"data"` +} diff --git a/packages/generator/tests/date-format/snapshots/go/utils.go b/packages/generator/tests/date-format/snapshots/go/utils.go new file mode 100644 index 00000000..d0527665 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/go/utils.go @@ -0,0 +1,6 @@ +package pachca + +// Ptr returns a pointer to the given value. +func Ptr[T any](v T) *T { + return &v +} diff --git a/packages/generator/tests/date-format/snapshots/kt/Client.kt b/packages/generator/tests/date-format/snapshots/kt/Client.kt new file mode 100644 index 00000000..e058663a --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/kt/Client.kt @@ -0,0 +1,83 @@ +package com.pachca.sdk + +import io.ktor.client.* +import io.ktor.client.call.* +import io.ktor.client.plugins.* +import io.ktor.client.plugins.auth.* +import io.ktor.client.plugins.auth.providers.* +import io.ktor.client.plugins.contentnegotiation.* +import io.ktor.client.request.* +import io.ktor.client.statement.* +import io.ktor.http.* +import io.ktor.serialization.kotlinx.json.* +import kotlinx.serialization.json.Json +import java.io.Closeable + +class ExportService internal constructor( + private val baseUrl: String, + private val client: HttpClient, +) { + suspend fun listEvents( + dateFrom: String, + dateTo: String? = null, + createdAfter: String? = null, + limit: Int? = null, + ): ListEventsResponse { + val response = client.get("$baseUrl/events") { + parameter("date_from", dateFrom) + dateTo?.let { parameter("date_to", it) } + createdAfter?.let { parameter("created_after", it) } + limit?.let { parameter("limit", it) } + } + return when (response.status.value) { + 200 -> response.body() + else -> throw RuntimeException("Unexpected status code: ${response.status.value}") + } + } + + suspend fun createExport(request: ExportRequest): Export { + val response = client.post("$baseUrl/exports") { + contentType(ContentType.Application.Json) + setBody(request) + } + return when (response.status.value) { + 201 -> response.body().data + 401 -> throw response.body() + else -> throw RuntimeException("Unexpected status code: ${response.status.value}") + } + } +} + +class PachcaClient(token: String, baseUrl: String = "https://api.pachca.com/api/shared/v1") : Closeable { + private val client = HttpClient { + expectSuccess = false + install(ContentNegotiation) { + json(Json { explicitNulls = false }) + } + install(HttpRequestRetry) { + maxRetries = 3 + retryIf { _, response -> + response.status.value == 429 || response.status.value in setOf(500, 502, 503, 504) + } + delayMillis { retry -> + val retryAfter = response?.headers?.get("Retry-After")?.toLongOrNull() + if (retryAfter != null && response?.status?.value == 429) { + retryAfter * 1000L + } else { + val base = 10_000L * (1L shl retry) + val jitter = 0.5 + kotlin.random.Random.nextDouble() * 0.5 + (base * jitter).toLong() + } + } + } + defaultRequest { + bearerAuth(token) + } + } + + val export = ExportService(baseUrl, client) + + override fun close() { + client.close() + } +} diff --git a/packages/generator/tests/date-format/snapshots/kt/Models.kt b/packages/generator/tests/date-format/snapshots/kt/Models.kt new file mode 100644 index 00000000..9bd1acf9 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/kt/Models.kt @@ -0,0 +1,40 @@ +package com.pachca.sdk + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ExportRequest( + @SerialName("start_at") val startAt: String, + @SerialName("end_at") val endAt: String, + @SerialName("webhook_url") val webhookUrl: String, +) + +@Serializable +data class Export( + val id: Int, + @SerialName("start_at") val startAt: String, + @SerialName("end_at") val endAt: String, + val status: String, + @SerialName("created_at") val createdAt: String, +) + +@Serializable +data class Event( + val id: Int, + val type: String, + @SerialName("occurred_at") val occurredAt: String, +) + +@Serializable +data class OAuthError( + val error: String? = null, +) : Exception() + +@Serializable +data class ListEventsResponse( + val data: List, +) + +@Serializable +data class ExportDataWrapper(val data: Export) diff --git a/packages/generator/tests/date-format/snapshots/kt/examples.json b/packages/generator/tests/date-format/snapshots/kt/examples.json new file mode 100644 index 00000000..c147ac32 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/kt/examples.json @@ -0,0 +1,19 @@ +{ + "Client_Init": { + "usage": "val client = PachcaClient(\"YOUR_TOKEN\")", + "imports": [ + "PachcaClient" + ] + }, + "EventOperations_listEvents": { + "usage": "val response = client.export.listEvents(dateFrom = \"2024-01-01\", dateTo = \"2024-01-01\", createdAfter = \"2024-01-01T00:00:00Z\", limit = 123)", + "output": "ListEventsResponse(data: List)" + }, + "ExportOperations_createExport": { + "usage": "val request = ExportRequest(\n startAt = \"2025-03-20\",\n endAt = \"2025-03-20\",\n webhookUrl = \"example\"\n)\nval response = client.export.createExport(request = request)", + "output": "Export(id: Int, startAt: String, endAt: String, status: String, createdAt: String)", + "imports": [ + "ExportRequest" + ] + } +} diff --git a/packages/generator/tests/date-format/snapshots/py/__init__.py b/packages/generator/tests/date-format/snapshots/py/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/packages/generator/tests/date-format/snapshots/py/client.py b/packages/generator/tests/date-format/snapshots/py/client.py new file mode 100644 index 00000000..3022d2d4 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/py/client.py @@ -0,0 +1,73 @@ +from __future__ import annotations + +import httpx + +from .models import ( + ListEventsParams, + ListEventsResponse, + OAuthError, + ExportRequest, + Export, +) +from .utils import deserialize, serialize, RetryTransport + +class ExportService: + def __init__(self, client: httpx.AsyncClient) -> None: + self._client = client + + async def list_events( + self, + params: ListEventsParams, + ) -> ListEventsResponse: + query: list[tuple[str, str]] = [] + query.append(("date_from", params.date_from)) + if params is not None and params.date_to is not None: + query.append(("date_to", params.date_to)) + if params is not None and params.created_after is not None: + query.append(("created_after", params.created_after)) + if params is not None and params.limit is not None: + query.append(("limit", str(params.limit))) + response = await self._client.get( + "/events", + params=query, + ) + body = response.json() + match response.status_code: + case 200: + return deserialize(ListEventsResponse, body) + case _: + raise RuntimeError( + f"Unexpected status code: {response.status_code}" + ) + + async def create_export( + self, + request: ExportRequest, + ) -> Export: + response = await self._client.post( + "/exports", + json=serialize(request), + ) + body = response.json() + match response.status_code: + case 201: + return deserialize(Export, body["data"]) + case 401: + raise deserialize(OAuthError, body) + case _: + raise RuntimeError( + f"Unexpected status code: {response.status_code}" + ) + + +class PachcaClient: + def __init__(self, token: str, base_url: str = "https://api.pachca.com/api/shared/v1") -> None: + self._client = httpx.AsyncClient( + base_url=base_url, + headers={"Authorization": f"Bearer {token}"}, + transport=RetryTransport(httpx.AsyncHTTPTransport()), + ) + self.export = ExportService(self._client) + + async def close(self) -> None: + await self._client.aclose() diff --git a/packages/generator/tests/date-format/snapshots/py/examples.json b/packages/generator/tests/date-format/snapshots/py/examples.json new file mode 100644 index 00000000..c377c83f --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/py/examples.json @@ -0,0 +1,22 @@ +{ + "Client_Init": { + "usage": "client = PachcaClient(\"YOUR_TOKEN\")", + "imports": [ + "PachcaClient" + ] + }, + "EventOperations_listEvents": { + "usage": "params = ListEventsParams(\n date_from=\"2024-01-01\",\n date_to=\"2024-01-01\",\n created_after=\"2024-01-01T00:00:00Z\",\n limit=123\n)\nresponse = await client.export.list_events(params=params)", + "output": "ListEventsResponse(data: list[Event])", + "imports": [ + "ListEventsParams" + ] + }, + "ExportOperations_createExport": { + "usage": "request = ExportRequest(\n start_at=\"2025-03-20\",\n end_at=\"2025-03-20\",\n webhook_url=\"example\"\n)\nresponse = await client.export.create_export(request=request)", + "output": "Export(id: int, start_at: str, end_at: str, status: str, created_at: str)", + "imports": [ + "ExportRequest" + ] + } +} diff --git a/packages/generator/tests/date-format/snapshots/py/models.py b/packages/generator/tests/date-format/snapshots/py/models.py new file mode 100644 index 00000000..71e2a4ec --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/py/models.py @@ -0,0 +1,43 @@ +from __future__ import annotations + +from dataclasses import dataclass + +@dataclass +class ExportRequest: + start_at: str + end_at: str + webhook_url: str + + +@dataclass +class Export: + id: int + start_at: str + end_at: str + status: str + created_at: str + + +@dataclass +class Event: + id: int + type: str + occurred_at: str + + +@dataclass +class OAuthError(Exception): + error: str | None = None + + +@dataclass +class ListEventsParams: + date_from: str + date_to: str | None = None + created_after: str | None = None + limit: int | None = None + + +@dataclass +class ListEventsResponse: + data: list[Event] diff --git a/packages/generator/tests/date-format/snapshots/py/utils.py b/packages/generator/tests/date-format/snapshots/py/utils.py new file mode 100644 index 00000000..d1494873 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/py/utils.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +import dataclasses +import keyword +from dataclasses import asdict, fields +from typing import Type, TypeVar, get_args, get_origin, get_type_hints + +import httpx + +T = TypeVar("T") + + +def _is_dataclass_type(tp: type) -> bool: + return isinstance(tp, type) and dataclasses.is_dataclass(tp) + + +def _resolve_type(tp: type) -> type | None: + """Extract a concrete dataclass type from Optional[X] or X | None.""" + origin = get_origin(tp) + if origin is list: + return None # lists are handled inline + args = get_args(tp) + for arg in args: + if _is_dataclass_type(arg): + return arg + if _is_dataclass_type(tp): + return tp + return None + + +def _resolve_list_item_type(tp: type) -> type | None: + """Extract the item type from list[X].""" + origin = get_origin(tp) + if origin is list: + args = get_args(tp) + if args: + return args[0] + return None + + +def deserialize(cls: Type[T], data: dict) -> T: + """Create a dataclass instance from a dict, recursively deserializing nested dataclasses.""" + field_map = {f.name: f for f in fields(cls)} + hints = get_type_hints(cls) + norm = {k.replace("-", "_").lower(): v for k, v in data.items()} + kwargs = {} + for k, v in norm.items(): + if k not in field_map: + k = f"{k}_" + if k not in field_map: + continue + f = field_map[k] + if isinstance(v, dict): + nested = _resolve_type(hints[f.name]) + if nested is not None: + v = deserialize(nested, v) + elif isinstance(v, list) and v: + item_tp = _resolve_list_item_type(hints[f.name]) + if item_tp is not None and _is_dataclass_type(item_tp): + v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + kwargs[k] = v + return cls(**kwargs) + + +def _strip_nones(val: object) -> object: + if isinstance(val, dict): + return { + (k[:-1] if k.endswith("_") and keyword.iskeyword(k[:-1]) else k): _strip_nones(v) + for k, v in val.items() if v is not None + } + if isinstance(val, list): + return [_strip_nones(v) for v in val] + return val + + +def serialize(obj: object) -> dict: + """Convert a dataclass to a dict, recursively omitting None values.""" + return _strip_nones(asdict(obj)) + + +_MAX_RETRIES = 3 +_RETRYABLE_5XX = {500, 502, 503, 504} + + +def _jitter(delay: float) -> float: + import random + return delay * (0.5 + random.random() * 0.5) + + +class RetryTransport(httpx.AsyncBaseTransport): + """Wraps an httpx transport with retry on 429 Too Many Requests and 5xx errors.""" + + def __init__(self, transport: httpx.AsyncBaseTransport, max_retries: int = _MAX_RETRIES) -> None: + self._transport = transport + self._max_retries = max_retries + + async def handle_async_request(self, request: httpx.Request) -> httpx.Response: + import asyncio + for attempt in range(self._max_retries + 1): + response = await self._transport.handle_async_request(request) + if response.status_code == 429 and attempt < self._max_retries: + retry_after = response.headers.get("retry-after") + delay = int(retry_after) if retry_after and retry_after.isdigit() else 2 ** attempt + await asyncio.sleep(delay) + continue + if response.status_code in _RETRYABLE_5XX and attempt < self._max_retries: + delay = _jitter(10 * (2 ** attempt)) + await asyncio.sleep(delay) + continue + return response + return response # unreachable diff --git a/packages/generator/tests/date-format/snapshots/swift/Client.swift b/packages/generator/tests/date-format/snapshots/swift/Client.swift new file mode 100644 index 00000000..65a2ecac --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/swift/Client.swift @@ -0,0 +1,63 @@ +import Foundation +#if canImport(FoundationNetworking) +import FoundationNetworking +#endif + +public struct ExportService { + let baseURL: String + let headers: [String: String] + let session: URLSession + + init(baseURL: String, headers: [String: String], session: URLSession = .shared) { + self.baseURL = baseURL + self.headers = headers + self.session = session + } + + public func listEvents(dateFrom: String, dateTo: String? = nil, createdAfter: String? = nil, limit: Int? = nil) async throws -> ListEventsResponse { + var components = URLComponents(string: "\(baseURL)/events")! + var queryItems: [URLQueryItem] = [] + queryItems.append(URLQueryItem(name: "date_from", value: String(dateFrom))) + if let dateTo { queryItems.append(URLQueryItem(name: "date_to", value: String(dateTo))) } + if let createdAfter { queryItems.append(URLQueryItem(name: "created_after", value: createdAfter)) } + if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } + if !queryItems.isEmpty { components.queryItems = queryItems } + var request = URLRequest(url: components.url!) + headers.forEach { request.setValue($1, forHTTPHeaderField: $0) } + let (data, urlResponse) = try await dataWithRetry(session: session, for: request) + let statusCode = (urlResponse as! HTTPURLResponse).statusCode + switch statusCode { + case 200: + return try deserialize(ListEventsResponse.self, from: data) + default: + throw URLError(.badServerResponse) + } + } + + public func createExport(request body: ExportRequest) async throws -> Export { + var request = URLRequest(url: URL(string: "\(baseURL)/exports")!) + request.httpMethod = "POST" + headers.forEach { request.setValue($1, forHTTPHeaderField: $0) } + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + request.httpBody = try serialize(body) + let (data, urlResponse) = try await dataWithRetry(session: session, for: request) + let statusCode = (urlResponse as! HTTPURLResponse).statusCode + switch statusCode { + case 201: + return try deserialize(ExportDataWrapper.self, from: data).data + case 401: + throw try deserialize(OAuthError.self, from: data) + default: + throw URLError(.badServerResponse) + } + } +} + +public struct PachcaClient { + public let export: ExportService + + public init(token: String, baseURL: String = "https://api.pachca.com/api/shared/v1") { + let headers = ["Authorization": "Bearer \(token)"] + self.export = ExportService(baseURL: baseURL, headers: headers) + } +} diff --git a/packages/generator/tests/date-format/snapshots/swift/Models.swift b/packages/generator/tests/date-format/snapshots/swift/Models.swift new file mode 100644 index 00000000..5fa67b2c --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/swift/Models.swift @@ -0,0 +1,80 @@ +import Foundation +#if canImport(FoundationNetworking) +import FoundationNetworking +#endif + +public struct ExportRequest: Codable { + public let startAt: String + public let endAt: String + public let webhookUrl: String + + public init(startAt: String, endAt: String, webhookUrl: String) { + self.startAt = startAt + self.endAt = endAt + self.webhookUrl = webhookUrl + } + + enum CodingKeys: String, CodingKey { + case startAt = "start_at" + case endAt = "end_at" + case webhookUrl = "webhook_url" + } +} + +public struct Export: Codable { + public let id: Int + public let startAt: String + public let endAt: String + public let status: String + public let createdAt: Date + + public init(id: Int, startAt: String, endAt: String, status: String, createdAt: Date) { + self.id = id + self.startAt = startAt + self.endAt = endAt + self.status = status + self.createdAt = createdAt + } + + enum CodingKeys: String, CodingKey { + case id + case startAt = "start_at" + case endAt = "end_at" + case status + case createdAt = "created_at" + } +} + +public struct Event: Codable { + public let id: Int + public let type: String + public let occurredAt: Date + + public init(id: Int, type: String, occurredAt: Date) { + self.id = id + self.type = type + self.occurredAt = occurredAt + } + + enum CodingKeys: String, CodingKey { + case id + case type + case occurredAt = "occurred_at" + } +} + +public struct OAuthError: Codable, Error { + public let error: String? + + public init(error: String? = nil) { + self.error = error + } +} + +public struct ListEventsResponse: Codable { + public let data: [Event] +} + +struct ExportDataWrapper: Codable { + let data: Export +} diff --git a/packages/generator/tests/date-format/snapshots/swift/Utils.swift b/packages/generator/tests/date-format/snapshots/swift/Utils.swift new file mode 100644 index 00000000..d65d2a00 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/swift/Utils.swift @@ -0,0 +1,69 @@ +import Foundation +#if canImport(FoundationNetworking) +import FoundationNetworking +#endif + +let pachcaDecoder: JSONDecoder = { + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .iso8601 + return decoder +}() + +let pachcaEncoder: JSONEncoder = { + let encoder = JSONEncoder() + encoder.dateEncodingStrategy = .iso8601 + return encoder +}() + +func serialize(_ value: T) throws -> Data { + let data = try pachcaEncoder.encode(value) + let json = try JSONSerialization.jsonObject(with: data) + return try JSONSerialization.data(withJSONObject: stripNulls(json)) +} + +func deserialize(_ type: T.Type, from data: Data) throws -> T { + return try pachcaDecoder.decode(type, from: data) +} + +private let maxRetries = 3 +private let retryable5xx: Set = [500, 502, 503, 504] + +private func jitter(_ delay: UInt64) -> UInt64 { + return UInt64(Double(delay) * (0.5 + Double.random(in: 0..<0.5))) +} + +func dataWithRetry(session: URLSession, for request: URLRequest, delegate: (any URLSessionTaskDelegate)? = nil) async throws -> (Data, URLResponse) { + for attempt in 0...maxRetries { + let (data, response) = try await session.data(for: request, delegate: delegate) + if let http = response as? HTTPURLResponse, http.statusCode == 429, attempt < maxRetries { + let delay: UInt64 + if let ra = http.value(forHTTPHeaderField: "Retry-After"), let secs = UInt64(ra) { + delay = secs * 1_000_000_000 + } else { + delay = UInt64(pow(2.0, Double(attempt))) * 1_000_000_000 + } + try await _Concurrency.Task.sleep(nanoseconds: delay) + continue + } + if let http = response as? HTTPURLResponse, retryable5xx.contains(http.statusCode), attempt < maxRetries { + let delay = jitter(10 * UInt64(pow(2.0, Double(attempt))) * 1_000_000_000) + try await _Concurrency.Task.sleep(nanoseconds: delay) + continue + } + return (data, response) + } + return try await session.data(for: request, delegate: delegate) // unreachable +} + +private func stripNulls(_ value: Any) -> Any { + if let dict = value as? [String: Any] { + return dict.compactMapValues { v -> Any? in + if v is NSNull { return nil } + return stripNulls(v) + } + } + if let arr = value as? [Any] { + return arr.map(stripNulls) + } + return value +} diff --git a/packages/generator/tests/date-format/snapshots/swift/examples.json b/packages/generator/tests/date-format/snapshots/swift/examples.json new file mode 100644 index 00000000..4d2dc269 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/swift/examples.json @@ -0,0 +1,19 @@ +{ + "Client_Init": { + "usage": "let client = PachcaClient(token: \"YOUR_TOKEN\")", + "imports": [ + "PachcaClient" + ] + }, + "EventOperations_listEvents": { + "usage": "let response = try await client.export.listEvents(dateFrom: \"2024-01-01\", dateTo: \"2024-01-01\", createdAfter: \"2024-01-01T00:00:00Z\", limit: 123)", + "output": "ListEventsResponse(data: [Event])" + }, + "ExportOperations_createExport": { + "usage": "let body = ExportRequest(\n startAt: \"2025-03-20\",\n endAt: \"2025-03-20\",\n webhookUrl: \"example\"\n)\nlet response = try await client.export.createExport(body: body)", + "output": "Export(id: Int, startAt: String, endAt: String, status: String, createdAt: String)", + "imports": [ + "ExportRequest" + ] + } +} diff --git a/packages/generator/tests/date-format/snapshots/ts/client.ts b/packages/generator/tests/date-format/snapshots/ts/client.ts new file mode 100644 index 00000000..fd9491f1 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/ts/client.ts @@ -0,0 +1,59 @@ +import { + ListEventsParams, + ListEventsResponse, + OAuthError, + ExportRequest, + Export, +} from "./types"; +import { deserialize, serialize, fetchWithRetry } from "./utils"; + +class ExportService { + constructor( + private baseUrl: string, + private headers: Record, + ) {} + + async listEvents(params: ListEventsParams): Promise { + const query = new URLSearchParams(); + query.set("date_from", params.dateFrom); + if (params?.dateTo !== undefined) query.set("date_to", params.dateTo); + if (params?.createdAfter !== undefined) query.set("created_after", params.createdAfter); + if (params?.limit !== undefined) query.set("limit", String(params.limit)); + const response = await fetchWithRetry(`${this.baseUrl}/events?${query}`, { + headers: this.headers, + }); + const body = await response.json(); + switch (response.status) { + case 200: + return deserialize(body) as ListEventsResponse; + default: + throw new Error(`HTTP ${response.status}: ${JSON.stringify(body)}`); + } + } + + async createExport(request: ExportRequest): Promise { + const response = await fetchWithRetry(`${this.baseUrl}/exports`, { + method: "POST", + headers: { ...this.headers, "Content-Type": "application/json" }, + body: JSON.stringify(serialize(request)), + }); + const body = await response.json(); + switch (response.status) { + case 201: + return deserialize(body.data) as Export; + case 401: + throw new OAuthError(body.error); + default: + throw new Error(`HTTP ${response.status}: ${JSON.stringify(body)}`); + } + } +} + +export class PachcaClient { + readonly export: ExportService; + + constructor(token: string, baseUrl: string = "https://api.pachca.com/api/shared/v1") { + const headers = { Authorization: `Bearer ${token}` }; + this.export = new ExportService(baseUrl, headers); + } +} diff --git a/packages/generator/tests/date-format/snapshots/ts/examples.json b/packages/generator/tests/date-format/snapshots/ts/examples.json new file mode 100644 index 00000000..6ae799da --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/ts/examples.json @@ -0,0 +1,19 @@ +{ + "Client_Init": { + "usage": "const client = new PachcaClient(\"YOUR_TOKEN\")", + "imports": [ + "PachcaClient" + ] + }, + "EventOperations_listEvents": { + "usage": "const response = client.export.listEvents({\n dateFrom: \"2024-01-01\",\n dateTo: \"2024-01-01\",\n createdAfter: \"2024-01-01T00:00:00Z\",\n limit: 123\n})", + "output": "ListEventsResponse({ data: Event[] })" + }, + "ExportOperations_createExport": { + "usage": "const request: ExportRequest = {\n startAt: \"2025-03-20\",\n endAt: \"2025-03-20\",\n webhookUrl: \"example\"\n}\nconst response = client.export.createExport(request)", + "output": "Export({ id: number, startAt: string, endAt: string, status: string, createdAt: string })", + "imports": [ + "ExportRequest" + ] + } +} diff --git a/packages/generator/tests/date-format/snapshots/ts/types.ts b/packages/generator/tests/date-format/snapshots/ts/types.ts new file mode 100644 index 00000000..30390130 --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/ts/types.ts @@ -0,0 +1,38 @@ +export interface ExportRequest { + startAt: string; + endAt: string; + webhookUrl: string; +} + +export interface Export { + id: number; + startAt: string; + endAt: string; + status: string; + createdAt: string; +} + +export interface Event { + id: number; + type: string; + occurredAt: string; +} + +export class OAuthError extends Error { + error?: string; + constructor(error?: string) { + super(error); + this.error = error; + } +} + +export interface ListEventsParams { + dateFrom: string; + dateTo?: string; + createdAfter?: string; + limit?: number; +} + +export interface ListEventsResponse { + data: Event[]; +} diff --git a/packages/generator/tests/date-format/snapshots/ts/utils.ts b/packages/generator/tests/date-format/snapshots/ts/utils.ts new file mode 100644 index 00000000..5cf7ef4a --- /dev/null +++ b/packages/generator/tests/date-format/snapshots/ts/utils.ts @@ -0,0 +1,58 @@ +function snakeToCamel(str: string): string { + const camel = str.replace(/[-_]([a-zA-Z])/g, (_, c) => c.toUpperCase()); + return camel.charAt(0).toLowerCase() + camel.slice(1); +} + +function camelToSnake(str: string): string { + return str + .replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2") + .replace(/([a-z0-9])([A-Z])/g, "$1_$2") + .toLowerCase(); +} + +export function deserialize(obj: unknown): unknown { + if (Array.isArray(obj)) return obj.map(deserialize); + if (obj !== null && typeof obj === "object") { + return Object.fromEntries( + Object.entries(obj).map(([k, v]) => [snakeToCamel(k), deserialize(v)]), + ); + } + return obj; +} + +export function serialize(obj: unknown): unknown { + if (Array.isArray(obj)) return obj.map(serialize); + if (obj !== null && typeof obj === "object") { + return Object.fromEntries( + Object.entries(obj) + .filter(([, v]) => v !== undefined) + .map(([k, v]) => [camelToSnake(k), serialize(v)]), + ); + } + return obj; +} + +const MAX_RETRIES = 3; +const RETRYABLE_5XX = new Set([500, 502, 503, 504]); + +function jitter(delay: number): number { + return delay * (0.5 + Math.random() * 0.5); +} + +export async function fetchWithRetry(input: RequestInfo | URL, init?: RequestInit): Promise { + for (let attempt = 0; ; attempt++) { + const response = await fetch(input, init); + if (response.status === 429 && attempt < MAX_RETRIES) { + const retryAfter = response.headers.get("retry-after"); + const delay = retryAfter ? Number(retryAfter) * 1000 : 1000 * Math.pow(2, attempt); + await new Promise((r) => setTimeout(r, delay)); + continue; + } + if (RETRYABLE_5XX.has(response.status) && attempt < MAX_RETRIES) { + const delay = jitter(10000 * Math.pow(2, attempt)); + await new Promise((r) => setTimeout(r, delay)); + continue; + } + return response; + } +} diff --git a/packages/generator/tests/edge-cases/snapshots/cs/Client.cs b/packages/generator/tests/edge-cases/snapshots/cs/Client.cs index 5eee19dc..169b2f0c 100644 --- a/packages/generator/tests/edge-cases/snapshots/cs/Client.cs +++ b/packages/generator/tests/edge-cases/snapshots/cs/Client.cs @@ -33,7 +33,8 @@ public async System.Threading.Tasks.Task ListEventsAsync( if (isActive != null) queryParts.Add($"is_active={Uri.EscapeDataString((isActive.Value ? "true" : "false"))}"); if (scopes != null) - queryParts.Add($"scopes={Uri.EscapeDataString(scopes.ToString()!)}"); + foreach (var item in scopes) + queryParts.Add($"scopes[]={Uri.EscapeDataString(PachcaUtils.EnumToApiString(item))}"); if (filter != null) queryParts.Add($"filter={Uri.EscapeDataString(filter.ToString()!)}"); var url = $"{_baseUrl}/events" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); diff --git a/packages/generator/tests/edge-cases/snapshots/go/client.go b/packages/generator/tests/edge-cases/snapshots/go/client.go index a68b10de..2cf4d53d 100644 --- a/packages/generator/tests/edge-cases/snapshots/go/client.go +++ b/packages/generator/tests/edge-cases/snapshots/go/client.go @@ -76,8 +76,10 @@ func (s *EventsService) ListEvents(ctx context.Context, params *ListEventsParams if params != nil && params.IsActive != nil { q.Set("is_active", fmt.Sprintf("%v", *params.IsActive)) } - if params != nil && params.Scopes != nil { - q.Set("scopes", fmt.Sprintf("%v", params.Scopes)) + if params != nil { + for _, v := range params.Scopes { + q.Add("scopes[]", fmt.Sprintf("%v", v)) + } } if params != nil && params.Filter != nil { q.Set("filter", fmt.Sprintf("%v", *params.Filter)) diff --git a/packages/generator/tests/edge-cases/snapshots/kt/Client.kt b/packages/generator/tests/edge-cases/snapshots/kt/Client.kt index b7734d03..8c0178c2 100644 --- a/packages/generator/tests/edge-cases/snapshots/kt/Client.kt +++ b/packages/generator/tests/edge-cases/snapshots/kt/Client.kt @@ -25,7 +25,7 @@ class EventsService internal constructor( ): ListEventsResponse { val response = client.get("$baseUrl/events") { isActive?.let { parameter("is_active", it) } - scopes?.let { parameter("scopes", it) } + scopes?.forEach { parameter("scopes[]", it.value) } filter?.let { parameter("filter", it) } } return when (response.status.value) { diff --git a/packages/generator/tests/edge-cases/snapshots/py/client.py b/packages/generator/tests/edge-cases/snapshots/py/client.py index 687f9eb9..f28be640 100644 --- a/packages/generator/tests/edge-cases/snapshots/py/client.py +++ b/packages/generator/tests/edge-cases/snapshots/py/client.py @@ -20,13 +20,14 @@ async def list_events( self, params: ListEventsParams | None = None, ) -> ListEventsResponse: - query: dict[str, str] = {} + query: list[tuple[str, str]] = [] if params is not None and params.is_active is not None: - query["is_active"] = str(params.is_active).lower() + query.append(("is_active", str(params.is_active).lower())) if params is not None and params.scopes is not None: - query["scopes"] = params.scopes + for v in params.scopes: + query.append(("scopes[]", str(v))) if params is not None and params.filter is not None: - query["filter"] = params.filter + query.append(("filter", params.filter)) response = await self._client.get( "/events", params=query, diff --git a/packages/generator/tests/edge-cases/snapshots/swift/Client.swift b/packages/generator/tests/edge-cases/snapshots/swift/Client.swift index 0cb2aa07..d55becbb 100644 --- a/packages/generator/tests/edge-cases/snapshots/swift/Client.swift +++ b/packages/generator/tests/edge-cases/snapshots/swift/Client.swift @@ -18,7 +18,7 @@ public struct EventsService { var components = URLComponents(string: "\(baseURL)/events")! var queryItems: [URLQueryItem] = [] if let isActive { queryItems.append(URLQueryItem(name: "is_active", value: String(isActive))) } - if let scopes { scopes.forEach { queryItems.append(URLQueryItem(name: "scopes", value: $0.rawValue)) } } + if let scopes { scopes.forEach { queryItems.append(URLQueryItem(name: "scopes[]", value: $0.rawValue)) } } if let filter { queryItems.append(URLQueryItem(name: "filter", value: String(data: try serialize(filter), encoding: .utf8)!)) } if !queryItems.isEmpty { components.queryItems = queryItems } var request = URLRequest(url: components.url!) @@ -38,7 +38,7 @@ public struct EventsService { request.httpMethod = "PUT" headers.forEach { request.setValue($1, forHTTPHeaderField: $0) } request.setValue("application/json", forHTTPHeaderField: "Content-Type") - request.httpBody = try JSONSerialization.data(withJSONObject: ["scope": scope]) + request.httpBody = try JSONSerialization.data(withJSONObject: ["scope": scope.rawValue]) let (data, urlResponse) = try await dataWithRetry(session: session, for: request) let statusCode = (urlResponse as! HTTPURLResponse).statusCode switch statusCode { diff --git a/packages/generator/tests/edge-cases/snapshots/ts/client.ts b/packages/generator/tests/edge-cases/snapshots/ts/client.ts index 769675da..51393421 100644 --- a/packages/generator/tests/edge-cases/snapshots/ts/client.ts +++ b/packages/generator/tests/edge-cases/snapshots/ts/client.ts @@ -16,7 +16,9 @@ class EventsService { async listEvents(params?: ListEventsParams): Promise { const query = new URLSearchParams(); if (params?.isActive !== undefined) query.set("is_active", String(params.isActive)); - if (params?.scopes !== undefined) query.set("scopes", String(params.scopes)); + if (params?.scopes !== undefined) { + params.scopes.forEach((v) => query.append("scopes[]", String(v))); + } if (params?.filter !== undefined) query.set("filter", String(params.filter)); const url = `${this.baseUrl}/events${query.toString() ? `?${query}` : ""}`; const response = await fetchWithRetry(url, { diff --git a/packages/generator/tests/patch/snapshots/go/client.go b/packages/generator/tests/patch/snapshots/go/client.go index 7aa12eb2..24401c3f 100644 --- a/packages/generator/tests/patch/snapshots/go/client.go +++ b/packages/generator/tests/patch/snapshots/go/client.go @@ -90,7 +90,9 @@ func (s *ItemsService) PatchItem(ctx context.Context, id int32, request ItemPatc return &result.Data, nil default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } diff --git a/packages/generator/tests/record/snapshots/go/client.go b/packages/generator/tests/record/snapshots/go/client.go index d1c1119a..e8c4ebf3 100644 --- a/packages/generator/tests/record/snapshots/go/client.go +++ b/packages/generator/tests/record/snapshots/go/client.go @@ -84,11 +84,15 @@ func (s *LinkPreviewsService) CreateLinkPreviews(ctx context.Context, id int32, return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } diff --git a/packages/generator/tests/redirect/snapshots/go/client.go b/packages/generator/tests/redirect/snapshots/go/client.go index 9069939b..e0ce9ffa 100644 --- a/packages/generator/tests/redirect/snapshots/go/client.go +++ b/packages/generator/tests/redirect/snapshots/go/client.go @@ -83,11 +83,15 @@ func (s *CommonService) DownloadExport(ctx context.Context, id int32) (string, e return location, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return "", &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return "", fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return "", &e } } diff --git a/packages/generator/tests/search/snapshots/cs/Client.cs b/packages/generator/tests/search/snapshots/cs/Client.cs index 00bb7bb6..850b1e1c 100644 --- a/packages/generator/tests/search/snapshots/cs/Client.cs +++ b/packages/generator/tests/search/snapshots/cs/Client.cs @@ -82,8 +82,9 @@ public async System.Threading.Tasks.Task> SearchMessag { var response = await SearchMessagesAsync(query: query, chatIds: chatIds, userIds: userIds, createdFrom: createdFrom, createdTo: createdTo, sort: sort, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } } diff --git a/packages/generator/tests/search/snapshots/go/client.go b/packages/generator/tests/search/snapshots/go/client.go index 828079e1..91b8a3e6 100644 --- a/packages/generator/tests/search/snapshots/go/client.go +++ b/packages/generator/tests/search/snapshots/go/client.go @@ -111,7 +111,9 @@ func (s *SearchService) SearchMessages(ctx context.Context, params SearchMessage return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode) @@ -131,10 +133,11 @@ func (s *SearchService) SearchMessagesAll(ctx context.Context, params *SearchMes return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } diff --git a/packages/generator/tests/search/snapshots/kt/Client.kt b/packages/generator/tests/search/snapshots/kt/Client.kt index 13681255..6ddad5f3 100644 --- a/packages/generator/tests/search/snapshots/kt/Client.kt +++ b/packages/generator/tests/search/snapshots/kt/Client.kt @@ -67,8 +67,9 @@ class SearchService internal constructor( cursor = cursor, ) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } } diff --git a/packages/generator/tests/search/snapshots/py/client.py b/packages/generator/tests/search/snapshots/py/client.py index b7f30dd4..6a4354dd 100644 --- a/packages/generator/tests/search/snapshots/py/client.py +++ b/packages/generator/tests/search/snapshots/py/client.py @@ -21,10 +21,10 @@ async def search_messages( ) -> SearchMessagesResponse: query: list[tuple[str, str]] = [] query.append(("query", params.query)) - if params.chat_ids is not None: + if params is not None and params.chat_ids is not None: for v in params.chat_ids: query.append(("chat_ids[]", str(v))) - if params.user_ids is not None: + if params is not None and params.user_ids is not None: for v in params.user_ids: query.append(("user_ids[]", str(v))) if params is not None and params.created_from is not None: @@ -64,9 +64,9 @@ async def search_messages_all( params.cursor = cursor response = await self.search_messages(params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items diff --git a/packages/generator/tests/search/snapshots/swift/Client.swift b/packages/generator/tests/search/snapshots/swift/Client.swift index 98fc752e..abc85d4e 100644 --- a/packages/generator/tests/search/snapshots/swift/Client.swift +++ b/packages/generator/tests/search/snapshots/swift/Client.swift @@ -46,8 +46,9 @@ public struct SearchService { repeat { let response = try await searchMessages(query: query, chatIds: chatIds, userIds: userIds, createdFrom: createdFrom, createdTo: createdTo, sort: sort, limit: limit, cursor: cursor) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } } diff --git a/packages/generator/tests/search/snapshots/ts/client.ts b/packages/generator/tests/search/snapshots/ts/client.ts index aa0b0e4a..9a1b5848 100644 --- a/packages/generator/tests/search/snapshots/ts/client.ts +++ b/packages/generator/tests/search/snapshots/ts/client.ts @@ -46,8 +46,9 @@ class SearchService { do { const response = await this.searchMessages({ ...params, cursor } as SearchMessagesParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } } diff --git a/packages/generator/tests/unwrap/snapshots/go/client.go b/packages/generator/tests/unwrap/snapshots/go/client.go index 72b6405e..0a81614b 100644 --- a/packages/generator/tests/unwrap/snapshots/go/client.go +++ b/packages/generator/tests/unwrap/snapshots/go/client.go @@ -84,11 +84,15 @@ func (s *MembersService) AddMembers(ctx context.Context, id int32, memberIds []i return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -124,11 +128,15 @@ func (s *ChatsService) CreateChat(ctx context.Context, request ChatCreateRequest return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -148,11 +156,15 @@ func (s *ChatsService) ArchiveChat(ctx context.Context, id int32) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } diff --git a/packages/generator/tests/upload/snapshots/go/client.go b/packages/generator/tests/upload/snapshots/go/client.go index e2d07fe2..5a586743 100644 --- a/packages/generator/tests/upload/snapshots/go/client.go +++ b/packages/generator/tests/upload/snapshots/go/client.go @@ -104,7 +104,9 @@ func (s *CommonService) UploadFile(ctx context.Context, directUrl string, reques return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: return fmt.Errorf("unexpected status code: %d", resp.StatusCode) @@ -132,7 +134,9 @@ func (s *CommonService) GetUploadParams(ctx context.Context) (*UploadParams, err return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode) diff --git a/packages/spec/openapi.en.yaml b/packages/spec/openapi.en.yaml index d94ebf3a..1c940d96 100644 --- a/packages/spec/openapi.en.yaml +++ b/packages/spec/openapi.en.yaml @@ -123,6 +123,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -413,6 +414,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -985,6 +987,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -1473,6 +1476,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -1753,6 +1757,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -1941,6 +1946,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -2540,6 +2546,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -2631,6 +2638,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -3481,6 +3489,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -3921,6 +3930,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -4427,6 +4437,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -6646,6 +6657,8 @@ components: description: View PaginationMeta: type: object + required: + - paginate properties: paginate: type: object @@ -6654,6 +6667,8 @@ components: type: string description: Next page pagination cursor example: eyJxZCO2MiwiZGlyIjomSNYjIn3 + required: + - next_page description: Helper information description: Pagination metadata Reaction: diff --git a/packages/spec/openapi.yaml b/packages/spec/openapi.yaml index 0367426a..a0e356f1 100644 --- a/packages/spec/openapi.yaml +++ b/packages/spec/openapi.yaml @@ -123,6 +123,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -404,6 +405,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -962,6 +964,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -1436,6 +1439,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -1713,6 +1717,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -1890,6 +1895,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -2470,6 +2476,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -2561,6 +2568,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -3398,6 +3406,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -3830,6 +3839,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -4326,6 +4336,7 @@ paths: type: object required: - data + - meta properties: data: type: array @@ -6515,6 +6526,8 @@ components: description: Представление PaginationMeta: type: object + required: + - paginate properties: paginate: type: object @@ -6523,6 +6536,8 @@ components: type: string description: Курсор пагинации следующей страницы example: eyJxZCO2MiwiZGlyIjomSNYjIn3 + required: + - next_page description: Вспомогательная информация description: Метаданные пагинации Reaction: diff --git a/packages/spec/typespec.tsp b/packages/spec/typespec.tsp index 08dcfcfc..98783f4d 100644 --- a/packages/spec/typespec.tsp +++ b/packages/spec/typespec.tsp @@ -1110,10 +1110,10 @@ model Task { @doc("Метаданные пагинации") model PaginationMeta { @doc("Вспомогательная информация") - paginate?: { + paginate: { @doc("Курсор пагинации следующей страницы") @example("eyJxZCO2MiwiZGlyIjomSNYjIn3") - next_page?: string; + next_page: string; }; } @@ -1145,7 +1145,7 @@ model DataResponse { @doc("Обертка ответа с данными и пагинацией") model PaginatedDataResponse { data: T; - meta?: PaginationMeta; + meta: PaginationMeta; } diff --git a/sdk/csharp/generated/Client.cs b/sdk/csharp/generated/Client.cs index 2b7948d2..fd268a65 100644 --- a/sdk/csharp/generated/Client.cs +++ b/sdk/csharp/generated/Client.cs @@ -86,8 +86,9 @@ public async System.Threading.Tasks.Task> GetAuditEventsAllAsyn { var response = await GetAuditEventsAsync(startTime: startTime, endTime: endTime, eventKey: eventKey, actorId: actorId, actorType: actorType, entityId: entityId, entityType: entityType, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } } @@ -138,8 +139,9 @@ public async System.Threading.Tasks.Task> GetWebhookEventsAll { var response = await GetWebhookEventsAsync(limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } @@ -205,7 +207,7 @@ public async System.Threading.Tasks.Task ListChatsAsync( { var queryParts = new List(); if (sortId != null) - queryParts.Add($"sort[{{field}}]={Uri.EscapeDataString(PachcaUtils.EnumToApiString(sortId.Value))}"); + queryParts.Add($"sort[id]={Uri.EscapeDataString(PachcaUtils.EnumToApiString(sortId.Value))}"); if (availability != null) queryParts.Add($"availability={Uri.EscapeDataString(PachcaUtils.EnumToApiString(availability.Value))}"); if (lastMessageAtAfter != null) @@ -248,8 +250,9 @@ public async System.Threading.Tasks.Task> ListChatsAllAsync( { var response = await ListChatsAsync(sortId: sortId, availability: availability, lastMessageAtAfter: lastMessageAtAfter, lastMessageAtBefore: lastMessageAtBefore, personal: personal, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } @@ -510,8 +513,9 @@ public async System.Threading.Tasks.Task> ListMembersAllAsync( { var response = await ListMembersAsync(id, role: role, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } @@ -651,14 +655,15 @@ internal GroupTagsService(string baseUrl, HttpClient client) } public async System.Threading.Tasks.Task ListTagsAsync( - TagNamesFilter? names = null, + List? names = null, int? limit = null, string? cursor = null, CancellationToken cancellationToken = default) { var queryParts = new List(); if (names != null) - queryParts.Add($"names={Uri.EscapeDataString(names.ToString()!)}"); + foreach (var item in names) + queryParts.Add($"names[]={Uri.EscapeDataString(item.ToString()!)}"); if (limit != null) queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) @@ -679,7 +684,7 @@ public async System.Threading.Tasks.Task ListTagsAsync( } public async System.Threading.Tasks.Task> ListTagsAllAsync( - TagNamesFilter? names = null, + List? names = null, int? limit = null, CancellationToken cancellationToken = default) { @@ -689,8 +694,9 @@ public async System.Threading.Tasks.Task> ListTagsAllAsync( { var response = await ListTagsAsync(names: names, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } @@ -711,7 +717,7 @@ public async System.Threading.Tasks.Task GetTagAsync(int id, Cancellat } } - public async System.Threading.Tasks.Task GetTagUsersAsync( + public async System.Threading.Tasks.Task GetTagUsersAsync( int id, int? limit = null, string? cursor = null, @@ -729,7 +735,7 @@ public async System.Threading.Tasks.Task GetTagUsersAsync( switch ((int)response.StatusCode) { case 200: - return PachcaUtils.Deserialize(json); + return PachcaUtils.Deserialize(json); case 401: throw PachcaUtils.Deserialize(json); default: @@ -748,8 +754,9 @@ public async System.Threading.Tasks.Task> GetTagUsersAllAsync( { var response = await GetTagUsersAsync(id, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } @@ -831,7 +838,7 @@ public async System.Threading.Tasks.Task ListChatMessa var queryParts = new List(); queryParts.Add($"chat_id={Uri.EscapeDataString(chatId.ToString()!)}"); if (sortId != null) - queryParts.Add($"sort[{{field}}]={Uri.EscapeDataString(PachcaUtils.EnumToApiString(sortId.Value))}"); + queryParts.Add($"sort[id]={Uri.EscapeDataString(PachcaUtils.EnumToApiString(sortId.Value))}"); if (limit != null) queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) @@ -863,8 +870,9 @@ public async System.Threading.Tasks.Task> ListChatMessagesAllAsync { var response = await ListChatMessagesAsync(chatId: chatId, sortId: sortId, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } @@ -1057,8 +1065,9 @@ public async System.Threading.Tasks.Task> ListReactionsAllAsync( { var response = await ListReactionsAsync(id, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } @@ -1302,7 +1311,7 @@ internal SearchService(string baseUrl, HttpClient client) _client = client; } - public async System.Threading.Tasks.Task SearchChatsAsync( + public async System.Threading.Tasks.Task SearchChatsAsync( string? query = null, int? limit = null, string? cursor = null, @@ -1340,7 +1349,7 @@ public async System.Threading.Tasks.Task SearchChatsAsync( switch ((int)response.StatusCode) { case 200: - return PachcaUtils.Deserialize(json); + return PachcaUtils.Deserialize(json); case 401: throw PachcaUtils.Deserialize(json); default: @@ -1365,12 +1374,13 @@ public async System.Threading.Tasks.Task> SearchChatsAllAsync( { var response = await SearchChatsAsync(query: query, limit: limit, cursor: cursor, order: order, createdFrom: createdFrom, createdTo: createdTo, active: active, chatSubtype: chatSubtype, personal: personal, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } - public async System.Threading.Tasks.Task SearchMessagesAsync( + public async System.Threading.Tasks.Task SearchMessagesAsync( string? query = null, int? limit = null, string? cursor = null, @@ -1396,9 +1406,11 @@ public async System.Threading.Tasks.Task SearchMessage if (createdTo != null) queryParts.Add($"created_to={Uri.EscapeDataString(createdTo.Value.ToString("o"))}"); if (chatIds != null) - queryParts.Add($"chat_ids={Uri.EscapeDataString(chatIds.ToString()!)}"); + foreach (var item in chatIds) + queryParts.Add($"chat_ids[]={Uri.EscapeDataString(item.ToString()!)}"); if (userIds != null) - queryParts.Add($"user_ids={Uri.EscapeDataString(userIds.ToString()!)}"); + foreach (var item in userIds) + queryParts.Add($"user_ids[]={Uri.EscapeDataString(item.ToString()!)}"); if (active != null) queryParts.Add($"active={Uri.EscapeDataString((active.Value ? "true" : "false"))}"); var url = $"{_baseUrl}/search/messages" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); @@ -1408,7 +1420,7 @@ public async System.Threading.Tasks.Task SearchMessage switch ((int)response.StatusCode) { case 200: - return PachcaUtils.Deserialize(json); + return PachcaUtils.Deserialize(json); case 401: throw PachcaUtils.Deserialize(json); default: @@ -1433,12 +1445,13 @@ public async System.Threading.Tasks.Task> SearchMessagesAllAsync( { var response = await SearchMessagesAsync(query: query, limit: limit, cursor: cursor, order: order, createdFrom: createdFrom, createdTo: createdTo, chatIds: chatIds, userIds: userIds, active: active, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } - public async System.Threading.Tasks.Task SearchUsersAsync( + public async System.Threading.Tasks.Task SearchUsersAsync( string? query = null, int? limit = null, string? cursor = null, @@ -1465,7 +1478,8 @@ public async System.Threading.Tasks.Task SearchUsersAsync( if (createdTo != null) queryParts.Add($"created_to={Uri.EscapeDataString(createdTo.Value.ToString("o"))}"); if (companyRoles != null) - queryParts.Add($"company_roles={Uri.EscapeDataString(companyRoles.ToString()!)}"); + foreach (var item in companyRoles) + queryParts.Add($"company_roles[]={Uri.EscapeDataString(PachcaUtils.EnumToApiString(item))}"); var url = $"{_baseUrl}/search/users" + (queryParts.Count > 0 ? "?" + string.Join("&", queryParts) : ""); using var request = new HttpRequestMessage(HttpMethod.Get, url); using var response = await PachcaUtils.SendWithRetryAsync(_client, request, cancellationToken).ConfigureAwait(false); @@ -1473,7 +1487,7 @@ public async System.Threading.Tasks.Task SearchUsersAsync( switch ((int)response.StatusCode) { case 200: - return PachcaUtils.Deserialize(json); + return PachcaUtils.Deserialize(json); case 401: throw PachcaUtils.Deserialize(json); default: @@ -1497,8 +1511,9 @@ public async System.Threading.Tasks.Task> SearchUsersAllAsync( { var response = await SearchUsersAsync(query: query, limit: limit, cursor: cursor, sort: sort, order: order, createdFrom: createdFrom, createdTo: createdTo, companyRoles: companyRoles, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } } @@ -1549,8 +1564,9 @@ public async System.Threading.Tasks.Task ListTasksAsync( { var response = await ListTasksAsync(limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } @@ -1639,7 +1655,7 @@ internal UsersService(string baseUrl, HttpClient client) _client = client; } - public async System.Threading.Tasks.Task ListUsersAsync( + public async System.Threading.Tasks.Task ListUsersAsync( string? query = null, int? limit = null, string? cursor = null, @@ -1659,7 +1675,7 @@ public async System.Threading.Tasks.Task ListUsersAsync( switch ((int)response.StatusCode) { case 200: - return PachcaUtils.Deserialize(json); + return PachcaUtils.Deserialize(json); case 401: throw PachcaUtils.Deserialize(json); default: @@ -1678,8 +1694,9 @@ public async System.Threading.Tasks.Task> ListUsersAllAsync( { var response = await ListUsersAsync(query: query, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; - } while (cursor != null); + if (response.Data.Count == 0) break; + cursor = response.Meta.Paginate.NextPage; + } while (true); return items; } diff --git a/sdk/csharp/generated/Models.cs b/sdk/csharp/generated/Models.cs index da921263..e9ccbdc0 100644 --- a/sdk/csharp/generated/Models.cs +++ b/sdk/csharp/generated/Models.cs @@ -2243,13 +2243,13 @@ public class OpenViewRequest public class PaginationMetaPaginate { [JsonPropertyName("next_page")] - public string? NextPage { get; set; } + public string NextPage { get; set; } = default!; } public class PaginationMeta { [JsonPropertyName("paginate")] - public PaginationMetaPaginate? Paginate { get; set; } + public PaginationMetaPaginate Paginate { get; set; } = default!; } public class Reaction @@ -2306,8 +2306,6 @@ public class StatusUpdateRequest public StatusUpdateRequestStatus Status { get; set; } = default!; } -public class TagNamesFilter { } - public class Task { [JsonPropertyName("id")] @@ -2665,7 +2663,7 @@ public class GetAuditEventsResponse [JsonPropertyName("data")] public List Data { get; set; } = new(); [JsonPropertyName("meta")] - public PaginationMeta? Meta { get; set; } + public PaginationMeta Meta { get; set; } = default!; } public class ListChatsResponse @@ -2673,7 +2671,7 @@ public class ListChatsResponse [JsonPropertyName("data")] public List Data { get; set; } = new(); [JsonPropertyName("meta")] - public PaginationMeta? Meta { get; set; } + public PaginationMeta Meta { get; set; } = default!; } public class ListMembersResponse @@ -2681,7 +2679,7 @@ public class ListMembersResponse [JsonPropertyName("data")] public List Data { get; set; } = new(); [JsonPropertyName("meta")] - public PaginationMeta? Meta { get; set; } + public PaginationMeta Meta { get; set; } = default!; } public class ListPropertiesResponse @@ -2695,7 +2693,7 @@ public class ListTagsResponse [JsonPropertyName("data")] public List Data { get; set; } = new(); [JsonPropertyName("meta")] - public PaginationMeta? Meta { get; set; } + public PaginationMeta Meta { get; set; } = default!; } public class GetTagUsersResponse @@ -2703,7 +2701,7 @@ public class GetTagUsersResponse [JsonPropertyName("data")] public List Data { get; set; } = new(); [JsonPropertyName("meta")] - public PaginationMeta? Meta { get; set; } + public PaginationMeta Meta { get; set; } = default!; } public class ListChatMessagesResponse @@ -2711,7 +2709,7 @@ public class ListChatMessagesResponse [JsonPropertyName("data")] public List Data { get; set; } = new(); [JsonPropertyName("meta")] - public PaginationMeta? Meta { get; set; } + public PaginationMeta Meta { get; set; } = default!; } public class ListReactionsResponse @@ -2719,7 +2717,7 @@ public class ListReactionsResponse [JsonPropertyName("data")] public List Data { get; set; } = new(); [JsonPropertyName("meta")] - public PaginationMeta? Meta { get; set; } + public PaginationMeta Meta { get; set; } = default!; } public class SearchChatsResponse @@ -2751,7 +2749,7 @@ public class ListTasksResponse [JsonPropertyName("data")] public List Data { get; set; } = new(); [JsonPropertyName("meta")] - public PaginationMeta? Meta { get; set; } + public PaginationMeta Meta { get; set; } = default!; } public class ListUsersResponse @@ -2759,7 +2757,7 @@ public class ListUsersResponse [JsonPropertyName("data")] public List Data { get; set; } = new(); [JsonPropertyName("meta")] - public PaginationMeta? Meta { get; set; } + public PaginationMeta Meta { get; set; } = default!; } public class GetWebhookEventsResponse @@ -2767,7 +2765,7 @@ public class GetWebhookEventsResponse [JsonPropertyName("data")] public List Data { get; set; } = new(); [JsonPropertyName("meta")] - public PaginationMeta? Meta { get; set; } + public PaginationMeta Meta { get; set; } = default!; } public class BotResponseDataWrapper diff --git a/sdk/csharp/generated/README.md b/sdk/csharp/generated/README.md index 90e201e9..bf907f17 100644 --- a/sdk/csharp/generated/README.md +++ b/sdk/csharp/generated/README.md @@ -62,12 +62,13 @@ var message = await client.Messages.CreateMessageAsync(...); // Message, не Me // Вручную var chats = new List(); string? cursor = null; -do +while (true) { var response = await client.Chats.ListChatsAsync(cursor: cursor); + if (response.Data.Count == 0) break; chats.AddRange(response.Data); - cursor = response.Meta?.Paginate?.NextPage; -} while (cursor != null); + cursor = response.Meta.Paginate.NextPage; +} // Автоматически var allChats = await client.Chats.ListChatsAllAsync(); diff --git a/sdk/csharp/generated/examples.json b/sdk/csharp/generated/examples.json index 50133935..6e56e583 100644 --- a/sdk/csharp/generated/examples.json +++ b/sdk/csharp/generated/examples.json @@ -7,14 +7,14 @@ }, "SecurityOperations_getAuditEvents": { "usage": "var response = await client.Security.GetAuditEventsAsync(DateTimeOffset.Parse(\"2025-05-01T09:11:00Z\"), DateTimeOffset.Parse(\"2025-05-02T09:11:00Z\"), AuditEventKey.UserLogin, \"98765\", \"User\", \"98765\", \"User\", 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", - "output": "GetAuditEventsResponse(Data: List, Meta: PaginationMeta?)", + "output": "GetAuditEventsResponse(Data: List, Meta: PaginationMeta)", "imports": [ "AuditEventKey" ] }, "BotOperations_getWebhookEvents": { "usage": "var response = await client.Bots.GetWebhookEventsAsync(1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", - "output": "GetWebhookEventsResponse(Data: List, Meta: PaginationMeta?)" + "output": "GetWebhookEventsResponse(Data: List, Meta: PaginationMeta)" }, "BotOperations_updateBot": { "usage": "var request = new BotUpdateRequest { Bot = new BotUpdateRequestBot { Webhook = new BotUpdateRequestBotWebhook { OutgoingUrl = \"https://www.website.com/tasks/new\" } } };\nvar response = await client.Bots.UpdateBotAsync(1738816, request);", @@ -30,7 +30,7 @@ }, "ChatOperations_listChats": { "usage": "var response = await client.Chats.ListChatsAsync(SortOrder.Desc, ChatAvailability.IsMember, DateTimeOffset.Parse(\"2025-01-01T00:00:00.000Z\"), DateTimeOffset.Parse(\"2025-02-01T00:00:00.000Z\"), false, 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", - "output": "ListChatsResponse(Data: List, Meta: PaginationMeta?)", + "output": "ListChatsResponse(Data: List, Meta: PaginationMeta)", "imports": [ "ChatAvailability", "SortOrder" @@ -91,7 +91,7 @@ }, "ChatMemberOperations_listMembers": { "usage": "var response = await client.Members.ListMembersAsync(334, ChatMemberRoleFilter.All, 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", - "output": "ListMembersResponse(Data: List, Meta: PaginationMeta?)", + "output": "ListMembersResponse(Data: List, Meta: PaginationMeta)", "imports": [ "ChatMemberRoleFilter" ] @@ -121,11 +121,8 @@ "usage": "await client.Members.RemoveMemberAsync(334, 186);" }, "GroupTagOperations_listTags": { - "usage": "var names = new TagNamesFilter();\nvar response = await client.GroupTags.ListTagsAsync(names, 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", - "output": "ListTagsResponse(Data: List, Meta: PaginationMeta?)", - "imports": [ - "TagNamesFilter" - ] + "usage": "var names = new List { \"example\" };\nvar response = await client.GroupTags.ListTagsAsync(names, 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", + "output": "ListTagsResponse(Data: List, Meta: PaginationMeta)" }, "GroupTagOperations_getTag": { "usage": "var response = await client.GroupTags.GetTagAsync(9111);", @@ -133,7 +130,7 @@ }, "GroupTagOperations_getTagUsers": { "usage": "var response = await client.GroupTags.GetTagUsersAsync(9111, 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", - "output": "GetTagUsersResponse(Data: List, Meta: PaginationMeta?)" + "output": "GetTagUsersResponse(Data: List, Meta: PaginationMeta)" }, "GroupTagOperations_createTag": { "usage": "var request = new GroupTagRequest { GroupTag = new GroupTagRequestGroupTag { Name = \"Новое название тега\" } };\nvar response = await client.GroupTags.CreateTagAsync(request);", @@ -156,7 +153,7 @@ }, "ChatMessageOperations_listChatMessages": { "usage": "var response = await client.Messages.ListChatMessagesAsync(198, SortOrder.Desc, 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", - "output": "ListChatMessagesResponse(Data: List, Meta: PaginationMeta?)", + "output": "ListChatMessagesResponse(Data: List, Meta: PaginationMeta)", "imports": [ "SortOrder" ] @@ -206,7 +203,7 @@ }, "ReactionOperations_listReactions": { "usage": "var response = await client.Reactions.ListReactionsAsync(194275, 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", - "output": "ListReactionsResponse(Data: List, Meta: PaginationMeta?)" + "output": "ListReactionsResponse(Data: List, Meta: PaginationMeta)" }, "ReactionOperations_addReaction": { "usage": "var request = new ReactionRequest { Code = \"👍\", Name = \":+1:\" };\nvar response = await client.Reactions.AddReactionAsync(7231942, request);", @@ -279,7 +276,7 @@ }, "TaskOperations_listTasks": { "usage": "var response = await client.Tasks.ListTasksAsync(1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", - "output": "ListTasksResponse(Data: List, Meta: PaginationMeta?)" + "output": "ListTasksResponse(Data: List, Meta: PaginationMeta)" }, "TaskOperations_getTask": { "usage": "var response = await client.Tasks.GetTaskAsync(22283);", @@ -311,7 +308,7 @@ }, "UserOperations_listUsers": { "usage": "var response = await client.Users.ListUsersAsync(\"Олег\", 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", - "output": "ListUsersResponse(Data: List, Meta: PaginationMeta?)" + "output": "ListUsersResponse(Data: List, Meta: PaginationMeta)" }, "UserOperations_getUser": { "usage": "var response = await client.Users.GetUserAsync(12);", diff --git a/sdk/go/README.md b/sdk/go/README.md index d7e16303..9e4db7c4 100644 --- a/sdk/go/README.md +++ b/sdk/go/README.md @@ -68,11 +68,10 @@ var cursor *string for { result, err := client.Chats.ListChats(ctx, &pachca.ListChatsParams{Cursor: cursor}) if err != nil { break } + if len(result.Data) == 0 { break } chats = append(chats, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { - break - } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } // Автоматически diff --git a/sdk/go/generated/client.go b/sdk/go/generated/client.go index f5190cee..65c91f90 100644 --- a/sdk/go/generated/client.go +++ b/sdk/go/generated/client.go @@ -120,11 +120,15 @@ func (s *SecurityService) GetAuditEvents(ctx context.Context, params *GetAuditEv return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -142,10 +146,11 @@ func (s *SecurityService) GetAuditEventsAll(ctx context.Context, params *GetAudi return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } @@ -185,11 +190,15 @@ func (s *BotsService) GetWebhookEvents(ctx context.Context, params *GetWebhookEv return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -207,10 +216,11 @@ func (s *BotsService) GetWebhookEventsAll(ctx context.Context, params *GetWebhoo return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } @@ -240,11 +250,15 @@ func (s *BotsService) UpdateBot(ctx context.Context, id int32, request BotUpdate return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -264,11 +278,15 @@ func (s *BotsService) DeleteWebhookEvent(ctx context.Context, id string) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -285,7 +303,7 @@ func (s *ChatsService) ListChats(ctx context.Context, params *ListChatsParams) ( } q := u.Query() if params != nil && params.SortID != nil { - q.Set("sort[{field}]", string(*params.SortID)) + q.Set("sort[id]", string(*params.SortID)) } if params != nil && params.Availability != nil { q.Set("availability", string(*params.Availability)) @@ -324,11 +342,15 @@ func (s *ChatsService) ListChats(ctx context.Context, params *ListChatsParams) ( return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -346,10 +368,11 @@ func (s *ChatsService) ListChatsAll(ctx context.Context, params *ListChatsParams return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } @@ -374,11 +397,15 @@ func (s *ChatsService) GetChat(ctx context.Context, id int32) (*Chat, error) { return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -409,11 +436,15 @@ func (s *ChatsService) CreateChat(ctx context.Context, request ChatCreateRequest return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -444,11 +475,15 @@ func (s *ChatsService) UpdateChat(ctx context.Context, id int32, request ChatUpd return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -468,11 +503,15 @@ func (s *ChatsService) ArchiveChat(ctx context.Context, id int32) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -492,11 +531,15 @@ func (s *ChatsService) UnarchiveChat(ctx context.Context, id int32) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -525,11 +568,15 @@ func (s *CommonService) DownloadExport(ctx context.Context, id int32) (string, e return location, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return "", &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return "", fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return "", &e } } @@ -560,11 +607,15 @@ func (s *CommonService) ListProperties(ctx context.Context, params ListPropertie return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -589,11 +640,15 @@ func (s *CommonService) RequestExport(ctx context.Context, request ExportRequest return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -637,7 +692,9 @@ func (s *CommonService) UploadFile(ctx context.Context, directUrl string, reques return nil default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -661,11 +718,15 @@ func (s *CommonService) GetUploadParams(ctx context.Context) (*UploadParams, err return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -709,11 +770,15 @@ func (s *MembersService) ListMembers(ctx context.Context, id int32, params *List return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -731,10 +796,11 @@ func (s *MembersService) ListMembersAll(ctx context.Context, id int32, params *L return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } @@ -758,11 +824,15 @@ func (s *MembersService) AddTags(ctx context.Context, id int32, groupTagIds []in return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -787,11 +857,15 @@ func (s *MembersService) AddMembers(ctx context.Context, id int32, request AddMe return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -816,11 +890,15 @@ func (s *MembersService) UpdateMemberRole(ctx context.Context, id int32, userId return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -840,11 +918,15 @@ func (s *MembersService) RemoveTag(ctx context.Context, id int32, tagId int32) e return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -864,11 +946,15 @@ func (s *MembersService) LeaveChat(ctx context.Context, id int32) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -888,11 +974,15 @@ func (s *MembersService) RemoveMember(ctx context.Context, id int32, userId int3 return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -908,8 +998,10 @@ func (s *GroupTagsService) ListTags(ctx context.Context, params *ListTagsParams) return nil, err } q := u.Query() - if params != nil && params.Names != nil { - q.Set("names", fmt.Sprintf("%v", *params.Names)) + if params != nil { + for _, v := range params.Names { + q.Add("names[]", fmt.Sprintf("%v", v)) + } } if params != nil && params.Limit != nil { q.Set("limit", fmt.Sprintf("%v", *params.Limit)) @@ -936,11 +1028,15 @@ func (s *GroupTagsService) ListTags(ctx context.Context, params *ListTagsParams) return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -958,10 +1054,11 @@ func (s *GroupTagsService) ListTagsAll(ctx context.Context, params *ListTagsPara return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } @@ -986,16 +1083,20 @@ func (s *GroupTagsService) GetTag(ctx context.Context, id int32) (*GroupTag, err return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } -func (s *GroupTagsService) GetTagUsers(ctx context.Context, id int32, params *GetTagUsersParams) (*ListMembersResponse, error) { +func (s *GroupTagsService) GetTagUsers(ctx context.Context, id int32, params *GetTagUsersParams) (*GetTagUsersResponse, error) { u, err := url.Parse(fmt.Sprintf("%s/group_tags/%v/users", s.baseURL, id)) if err != nil { return nil, err @@ -1019,18 +1120,22 @@ func (s *GroupTagsService) GetTagUsers(ctx context.Context, id int32, params *Ge defer resp.Body.Close() switch resp.StatusCode { case http.StatusOK: - var result ListMembersResponse + var result GetTagUsersResponse if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { return nil, err } return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1048,10 +1153,11 @@ func (s *GroupTagsService) GetTagUsersAll(ctx context.Context, id int32, params return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } @@ -1081,11 +1187,15 @@ func (s *GroupTagsService) CreateTag(ctx context.Context, request GroupTagReques return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1116,11 +1226,15 @@ func (s *GroupTagsService) UpdateTag(ctx context.Context, id int32, request Grou return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1140,11 +1254,15 @@ func (s *GroupTagsService) DeleteTag(ctx context.Context, id int32) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -1162,7 +1280,7 @@ func (s *MessagesService) ListChatMessages(ctx context.Context, params ListChatM q := u.Query() q.Set("chat_id", fmt.Sprintf("%v", params.ChatID)) if params.SortID != nil { - q.Set("sort[{field}]", string(*params.SortID)) + q.Set("sort[id]", string(*params.SortID)) } if params.Limit != nil { q.Set("limit", fmt.Sprintf("%v", *params.Limit)) @@ -1189,11 +1307,15 @@ func (s *MessagesService) ListChatMessages(ctx context.Context, params ListChatM return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1211,10 +1333,11 @@ func (s *MessagesService) ListChatMessagesAll(ctx context.Context, params *ListC return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } @@ -1239,11 +1362,15 @@ func (s *MessagesService) GetMessage(ctx context.Context, id int32) (*Message, e return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1274,11 +1401,15 @@ func (s *MessagesService) CreateMessage(ctx context.Context, request MessageCrea return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1298,11 +1429,15 @@ func (s *MessagesService) PinMessage(ctx context.Context, id int32) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -1333,11 +1468,15 @@ func (s *MessagesService) UpdateMessage(ctx context.Context, id int32, request M return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1357,11 +1496,15 @@ func (s *MessagesService) DeleteMessage(ctx context.Context, id int32) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -1381,11 +1524,15 @@ func (s *MessagesService) UnpinMessage(ctx context.Context, id int32) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -1415,11 +1562,15 @@ func (s *LinkPreviewsService) CreateLinkPreviews(ctx context.Context, id int32, return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -1460,11 +1611,15 @@ func (s *ReactionsService) ListReactions(ctx context.Context, id int32, params * return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1482,10 +1637,11 @@ func (s *ReactionsService) ListReactionsAll(ctx context.Context, id int32, param return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } @@ -1513,11 +1669,15 @@ func (s *ReactionsService) AddReaction(ctx context.Context, id int32, request Re return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1547,11 +1707,15 @@ func (s *ReactionsService) RemoveReaction(ctx context.Context, id int32, params return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -1592,11 +1756,15 @@ func (s *ReadMembersService) ListReadMembers(ctx context.Context, id int32, para return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1627,11 +1795,15 @@ func (s *ThreadsService) GetThread(ctx context.Context, id int32) (*Thread, erro return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1657,11 +1829,15 @@ func (s *ThreadsService) CreateThread(ctx context.Context, id int32) (*Thread, e return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1692,11 +1868,15 @@ func (s *ProfileService) GetTokenInfo(ctx context.Context) (*AccessTokenInfo, er return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1722,11 +1902,15 @@ func (s *ProfileService) GetProfile(ctx context.Context) (*User, error) { return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1750,11 +1934,15 @@ func (s *ProfileService) GetStatus(ctx context.Context) (*any, error) { return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1785,11 +1973,15 @@ func (s *ProfileService) UpdateStatus(ctx context.Context, request StatusUpdateR return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1809,11 +2001,15 @@ func (s *ProfileService) DeleteStatus(ctx context.Context) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -1823,7 +2019,7 @@ type SearchService struct { client *http.Client } -func (s *SearchService) SearchChats(ctx context.Context, params *SearchChatsParams) (*ListChatsResponse, error) { +func (s *SearchService) SearchChats(ctx context.Context, params *SearchChatsParams) (*SearchChatsResponse, error) { u, err := url.Parse(fmt.Sprintf("%s/search/chats", s.baseURL)) if err != nil { return nil, err @@ -1868,18 +2064,22 @@ func (s *SearchService) SearchChats(ctx context.Context, params *SearchChatsPara defer resp.Body.Close() switch resp.StatusCode { case http.StatusOK: - var result ListChatsResponse + var result SearchChatsResponse if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { return nil, err } return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1897,14 +2097,15 @@ func (s *SearchService) SearchChatsAll(ctx context.Context, params *SearchChatsP return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } -func (s *SearchService) SearchMessages(ctx context.Context, params *SearchMessagesParams) (*ListChatMessagesResponse, error) { +func (s *SearchService) SearchMessages(ctx context.Context, params *SearchMessagesParams) (*SearchMessagesResponse, error) { u, err := url.Parse(fmt.Sprintf("%s/search/messages", s.baseURL)) if err != nil { return nil, err @@ -1928,11 +2129,15 @@ func (s *SearchService) SearchMessages(ctx context.Context, params *SearchMessag if params != nil && params.CreatedTo != nil { q.Set("created_to", params.CreatedTo.Format(time.RFC3339)) } - if params != nil && params.ChatIDs != nil { - q.Set("chat_ids", fmt.Sprintf("%v", params.ChatIDs)) + if params != nil { + for _, v := range params.ChatIDs { + q.Add("chat_ids[]", fmt.Sprintf("%v", v)) + } } - if params != nil && params.UserIDs != nil { - q.Set("user_ids", fmt.Sprintf("%v", params.UserIDs)) + if params != nil { + for _, v := range params.UserIDs { + q.Add("user_ids[]", fmt.Sprintf("%v", v)) + } } if params != nil && params.Active != nil { q.Set("active", fmt.Sprintf("%v", *params.Active)) @@ -1949,18 +2154,22 @@ func (s *SearchService) SearchMessages(ctx context.Context, params *SearchMessag defer resp.Body.Close() switch resp.StatusCode { case http.StatusOK: - var result ListChatMessagesResponse + var result SearchMessagesResponse if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { return nil, err } return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -1978,14 +2187,15 @@ func (s *SearchService) SearchMessagesAll(ctx context.Context, params *SearchMes return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } -func (s *SearchService) SearchUsers(ctx context.Context, params *SearchUsersParams) (*ListMembersResponse, error) { +func (s *SearchService) SearchUsers(ctx context.Context, params *SearchUsersParams) (*SearchUsersResponse, error) { u, err := url.Parse(fmt.Sprintf("%s/search/users", s.baseURL)) if err != nil { return nil, err @@ -2012,8 +2222,10 @@ func (s *SearchService) SearchUsers(ctx context.Context, params *SearchUsersPara if params != nil && params.CreatedTo != nil { q.Set("created_to", params.CreatedTo.Format(time.RFC3339)) } - if params != nil && params.CompanyRoles != nil { - q.Set("company_roles", fmt.Sprintf("%v", params.CompanyRoles)) + if params != nil { + for _, v := range params.CompanyRoles { + q.Add("company_roles[]", fmt.Sprintf("%v", v)) + } } u.RawQuery = q.Encode() req, err := http.NewRequestWithContext(ctx, "GET", u.String(), nil) @@ -2027,18 +2239,22 @@ func (s *SearchService) SearchUsers(ctx context.Context, params *SearchUsersPara defer resp.Body.Close() switch resp.StatusCode { case http.StatusOK: - var result ListMembersResponse + var result SearchUsersResponse if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { return nil, err } return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -2056,10 +2272,11 @@ func (s *SearchService) SearchUsersAll(ctx context.Context, params *SearchUsersP return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } @@ -2099,11 +2316,15 @@ func (s *TasksService) ListTasks(ctx context.Context, params *ListTasksParams) ( return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -2121,10 +2342,11 @@ func (s *TasksService) ListTasksAll(ctx context.Context, params *ListTasksParams return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } @@ -2149,11 +2371,15 @@ func (s *TasksService) GetTask(ctx context.Context, id int32) (*Task, error) { return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -2184,11 +2410,15 @@ func (s *TasksService) CreateTask(ctx context.Context, request TaskCreateRequest return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -2219,11 +2449,15 @@ func (s *TasksService) UpdateTask(ctx context.Context, id int32, request TaskUpd return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -2243,11 +2477,15 @@ func (s *TasksService) DeleteTask(ctx context.Context, id int32) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -2257,7 +2495,7 @@ type UsersService struct { client *http.Client } -func (s *UsersService) ListUsers(ctx context.Context, params *ListUsersParams) (*ListMembersResponse, error) { +func (s *UsersService) ListUsers(ctx context.Context, params *ListUsersParams) (*ListUsersResponse, error) { u, err := url.Parse(fmt.Sprintf("%s/users", s.baseURL)) if err != nil { return nil, err @@ -2284,18 +2522,22 @@ func (s *UsersService) ListUsers(ctx context.Context, params *ListUsersParams) ( defer resp.Body.Close() switch resp.StatusCode { case http.StatusOK: - var result ListMembersResponse + var result ListUsersResponse if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { return nil, err } return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -2313,10 +2555,11 @@ func (s *UsersService) ListUsersAll(ctx context.Context, params *ListUsersParams return nil, err } items = append(items, result.Data...) - if result.Meta == nil || result.Meta.Paginate == nil || result.Meta.Paginate.NextPage == nil { + if len(result.Data) == 0 { return items, nil } - cursor = result.Meta.Paginate.NextPage + nextPage := result.Meta.Paginate.NextPage + cursor = &nextPage } } @@ -2341,11 +2584,15 @@ func (s *UsersService) GetUser(ctx context.Context, id int32) (*User, error) { return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -2369,11 +2616,15 @@ func (s *UsersService) GetUserStatus(ctx context.Context, userId int32) (*any, e return &result, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -2404,11 +2655,15 @@ func (s *UsersService) CreateUser(ctx context.Context, request UserCreateRequest return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -2439,11 +2694,15 @@ func (s *UsersService) UpdateUser(ctx context.Context, id int32, request UserUpd return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -2474,11 +2733,15 @@ func (s *UsersService) UpdateUserStatus(ctx context.Context, userId int32, reque return &result.Data, nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return nil, &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return nil, &e } } @@ -2498,11 +2761,15 @@ func (s *UsersService) DeleteUser(ctx context.Context, id int32) error { return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -2522,11 +2789,15 @@ func (s *UsersService) DeleteUserStatus(ctx context.Context, userId int32) error return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } @@ -2556,11 +2827,15 @@ func (s *ViewsService) OpenView(ctx context.Context, request OpenViewRequest) er return nil case http.StatusUnauthorized: var e OAuthError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } return &e default: var e ApiError - json.NewDecoder(resp.Body).Decode(&e) + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } return &e } } diff --git a/sdk/go/generated/examples.json b/sdk/go/generated/examples.json index f83d2c02..f59df0fb 100644 --- a/sdk/go/generated/examples.json +++ b/sdk/go/generated/examples.json @@ -7,7 +7,7 @@ }, "SecurityOperations_getAuditEvents": { "usage": "params := &GetAuditEventsParams{\n\tStartTime: Ptr(\"2025-05-01T09:11:00Z\"),\n\tEndTime: Ptr(\"2025-05-02T09:11:00Z\"),\n\tEventKey: Ptr(AuditEventKeyUserLogin),\n\tActorID: Ptr(\"98765\"),\n\tActorType: Ptr(\"User\"),\n\tEntityID: Ptr(\"98765\"),\n\tEntityType: Ptr(\"User\"),\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.Security.GetAuditEvents(ctx, params)", - "output": "GetAuditEventsResponse{Data: []AuditEvent, Meta: *PaginationMeta}", + "output": "GetAuditEventsResponse{Data: []AuditEvent, Meta: PaginationMeta}", "imports": [ "AuditEventKey", "GetAuditEventsParams" @@ -15,7 +15,7 @@ }, "BotOperations_getWebhookEvents": { "usage": "params := &GetWebhookEventsParams{\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.Bots.GetWebhookEvents(ctx, params)", - "output": "GetWebhookEventsResponse{Data: []WebhookEvent, Meta: *PaginationMeta}", + "output": "GetWebhookEventsResponse{Data: []WebhookEvent, Meta: PaginationMeta}", "imports": [ "GetWebhookEventsParams" ] @@ -34,7 +34,7 @@ }, "ChatOperations_listChats": { "usage": "params := &ListChatsParams{\n\tSortID: Ptr(SortOrderDesc),\n\tAvailability: Ptr(ChatAvailabilityIsMember),\n\tLastMessageAtAfter: Ptr(\"2025-01-01T00:00:00.000Z\"),\n\tLastMessageAtBefore: Ptr(\"2025-02-01T00:00:00.000Z\"),\n\tPersonal: Ptr(false),\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.Chats.ListChats(ctx, params)", - "output": "ListChatsResponse{Data: []Chat, Meta: *PaginationMeta}", + "output": "ListChatsResponse{Data: []Chat, Meta: PaginationMeta}", "imports": [ "ChatAvailability", "ListChatsParams", @@ -97,7 +97,7 @@ }, "ChatMemberOperations_listMembers": { "usage": "params := &ListMembersParams{\n\tRole: Ptr(ChatMemberRoleFilterAll),\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.Members.ListMembers(ctx, int32(334), params)", - "output": "ListMembersResponse{Data: []User, Meta: *PaginationMeta}", + "output": "ListMembersResponse{Data: []User, Meta: PaginationMeta}", "imports": [ "ChatMemberRoleFilter", "ListMembersParams" @@ -128,11 +128,10 @@ "usage": "client.Members.RemoveMember(ctx, int32(334), int32(186))" }, "GroupTagOperations_listTags": { - "usage": "params := &ListTagsParams{\n\tNames: Ptr(TagNamesFilter{}),\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.GroupTags.ListTags(ctx, params)", - "output": "ListTagsResponse{Data: []GroupTag, Meta: *PaginationMeta}", + "usage": "params := &ListTagsParams{\n\tNames: []string{\"example\"},\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.GroupTags.ListTags(ctx, params)", + "output": "ListTagsResponse{Data: []GroupTag, Meta: PaginationMeta}", "imports": [ - "ListTagsParams", - "TagNamesFilter" + "ListTagsParams" ] }, "GroupTagOperations_getTag": { @@ -141,7 +140,7 @@ }, "GroupTagOperations_getTagUsers": { "usage": "params := &GetTagUsersParams{\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.GroupTags.GetTagUsers(ctx, int32(9111), params)", - "output": "GetTagUsersResponse{Data: []User, Meta: *PaginationMeta}", + "output": "GetTagUsersResponse{Data: []User, Meta: PaginationMeta}", "imports": [ "GetTagUsersParams" ] @@ -167,7 +166,7 @@ }, "ChatMessageOperations_listChatMessages": { "usage": "params := ListChatMessagesParams{\n\tChatID: int32(198),\n\tSortID: Ptr(SortOrderDesc),\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.Messages.ListChatMessages(ctx, params)", - "output": "ListChatMessagesResponse{Data: []Message, Meta: *PaginationMeta}", + "output": "ListChatMessagesResponse{Data: []Message, Meta: PaginationMeta}", "imports": [ "ListChatMessagesParams", "SortOrder" @@ -218,7 +217,7 @@ }, "ReactionOperations_listReactions": { "usage": "params := &ListReactionsParams{\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.Reactions.ListReactions(ctx, int32(194275), params)", - "output": "ListReactionsResponse{Data: []Reaction, Meta: *PaginationMeta}", + "output": "ListReactionsResponse{Data: []Reaction, Meta: PaginationMeta}", "imports": [ "ListReactionsParams" ] @@ -303,7 +302,7 @@ }, "TaskOperations_listTasks": { "usage": "params := &ListTasksParams{\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.Tasks.ListTasks(ctx, params)", - "output": "ListTasksResponse{Data: []Task, Meta: *PaginationMeta}", + "output": "ListTasksResponse{Data: []Task, Meta: PaginationMeta}", "imports": [ "ListTasksParams" ] @@ -338,7 +337,7 @@ }, "UserOperations_listUsers": { "usage": "params := &ListUsersParams{\n\tQuery: Ptr(\"Олег\"),\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.Users.ListUsers(ctx, params)", - "output": "ListUsersResponse{Data: []User, Meta: *PaginationMeta}", + "output": "ListUsersResponse{Data: []User, Meta: PaginationMeta}", "imports": [ "ListUsersParams" ] diff --git a/sdk/go/generated/types.go b/sdk/go/generated/types.go index f92d4dbe..dd50b370 100644 --- a/sdk/go/generated/types.go +++ b/sdk/go/generated/types.go @@ -529,11 +529,11 @@ type CustomPropertyDefinition struct { } type ExportRequest struct { - StartAt time.Time `json:"start_at"` - EndAt time.Time `json:"end_at"` - WebhookURL string `json:"webhook_url"` - ChatIDs []int32 `json:"chat_ids,omitempty"` - SkipChatsFile *bool `json:"skip_chats_file,omitempty"` + StartAt string `json:"start_at"` + EndAt string `json:"end_at"` + WebhookURL string `json:"webhook_url"` + ChatIDs []int32 `json:"chat_ids,omitempty"` + SkipChatsFile *bool `json:"skip_chats_file,omitempty"` } type File struct { @@ -727,11 +727,11 @@ type OpenViewRequest struct { } type PaginationMetaPaginate struct { - NextPage *string `json:"next_page,omitempty"` + NextPage string `json:"next_page"` } type PaginationMeta struct { - Paginate *PaginationMetaPaginate `json:"paginate,omitempty"` + Paginate PaginationMetaPaginate `json:"paginate"` } type Reaction struct { @@ -778,9 +778,6 @@ type StatusUpdateRequest struct { Status StatusUpdateRequestStatus `json:"status"` } -type TagNamesFilter struct { -} - type Task struct { ID int32 `json:"id"` Kind TaskKind `json:"kind"` @@ -968,12 +965,12 @@ type ViewBlockCheckboxOption struct { } type ViewBlockDate struct { - Type string `json:"type"` // always "date" - Name string `json:"name"` - Label string `json:"label"` - InitialDate *time.Time `json:"initial_date,omitempty"` - Required *bool `json:"required,omitempty"` - Hint *string `json:"hint,omitempty"` + Type string `json:"type"` // always "date" + Name string `json:"name"` + Label string `json:"label"` + InitialDate *string `json:"initial_date,omitempty"` + Required *bool `json:"required,omitempty"` + Hint *string `json:"hint,omitempty"` } type ViewBlockDivider struct { @@ -1393,7 +1390,7 @@ type ListPropertiesParams struct { } type ListTagsParams struct { - Names *TagNamesFilter + Names []string Limit *int32 Cursor *string } @@ -1477,18 +1474,18 @@ type GetWebhookEventsParams struct { } type GetAuditEventsResponse struct { - Data []AuditEvent `json:"data"` - Meta *PaginationMeta `json:"meta,omitempty"` + Data []AuditEvent `json:"data"` + Meta PaginationMeta `json:"meta"` } type ListChatsResponse struct { - Data []Chat `json:"data"` - Meta *PaginationMeta `json:"meta,omitempty"` + Data []Chat `json:"data"` + Meta PaginationMeta `json:"meta"` } type ListMembersResponse struct { - Data []User `json:"data"` - Meta *PaginationMeta `json:"meta,omitempty"` + Data []User `json:"data"` + Meta PaginationMeta `json:"meta"` } type ListPropertiesResponse struct { @@ -1496,23 +1493,23 @@ type ListPropertiesResponse struct { } type ListTagsResponse struct { - Data []GroupTag `json:"data"` - Meta *PaginationMeta `json:"meta,omitempty"` + Data []GroupTag `json:"data"` + Meta PaginationMeta `json:"meta"` } type GetTagUsersResponse struct { - Data []User `json:"data"` - Meta *PaginationMeta `json:"meta,omitempty"` + Data []User `json:"data"` + Meta PaginationMeta `json:"meta"` } type ListChatMessagesResponse struct { - Data []Message `json:"data"` - Meta *PaginationMeta `json:"meta,omitempty"` + Data []Message `json:"data"` + Meta PaginationMeta `json:"meta"` } type ListReactionsResponse struct { - Data []Reaction `json:"data"` - Meta *PaginationMeta `json:"meta,omitempty"` + Data []Reaction `json:"data"` + Meta PaginationMeta `json:"meta"` } type SearchChatsResponse struct { @@ -1531,16 +1528,16 @@ type SearchUsersResponse struct { } type ListTasksResponse struct { - Data []Task `json:"data"` - Meta *PaginationMeta `json:"meta,omitempty"` + Data []Task `json:"data"` + Meta PaginationMeta `json:"meta"` } type ListUsersResponse struct { - Data []User `json:"data"` - Meta *PaginationMeta `json:"meta,omitempty"` + Data []User `json:"data"` + Meta PaginationMeta `json:"meta"` } type GetWebhookEventsResponse struct { - Data []WebhookEvent `json:"data"` - Meta *PaginationMeta `json:"meta,omitempty"` + Data []WebhookEvent `json:"data"` + Meta PaginationMeta `json:"meta"` } diff --git a/sdk/kotlin/README.md b/sdk/kotlin/README.md index eff87768..163f6706 100644 --- a/sdk/kotlin/README.md +++ b/sdk/kotlin/README.md @@ -69,11 +69,12 @@ val message = pachca.messages.createMessage(...) // Message, не MessageRespon // Вручную val chats = mutableListOf() var cursor: String? = null -do { +while (true) { val response = pachca.chats.listChats(cursor = cursor) + if (response.data.isEmpty()) break chats.addAll(response.data) - cursor = response.meta?.paginate?.nextPage -} while (cursor != null) + cursor = response.meta.paginate.nextPage +} // Автоматически val allChats = pachca.chats.listChatsAll() diff --git a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Client.kt b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Client.kt index 67eae581..961c68e2 100644 --- a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Client.kt +++ b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Client.kt @@ -72,8 +72,9 @@ class SecurityService internal constructor( cursor = cursor, ) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } } @@ -100,8 +101,9 @@ class BotsService internal constructor( do { val response = getWebhookEvents(limit = limit, cursor = cursor) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } @@ -141,7 +143,7 @@ class ChatsService internal constructor( cursor: String? = null, ): ListChatsResponse { val response = client.get("$baseUrl/chats") { - sortId?.let { parameter("sort[{field}]", it.value) } + sortId?.let { parameter("sort[id]", it.value) } availability?.let { parameter("availability", it.value) } lastMessageAtAfter?.let { parameter("last_message_at_after", it) } lastMessageAtBefore?.let { parameter("last_message_at_before", it) } @@ -177,8 +179,9 @@ class ChatsService internal constructor( cursor = cursor, ) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } @@ -343,8 +346,9 @@ class MembersService internal constructor( cursor = cursor, ) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } @@ -421,12 +425,12 @@ class GroupTagsService internal constructor( private val client: HttpClient, ) { suspend fun listTags( - names: TagNamesFilter? = null, + names: List? = null, limit: Int? = null, cursor: String? = null, ): ListTagsResponse { val response = client.get("$baseUrl/group_tags") { - names?.let { parameter("names", it) } + names?.forEach { parameter("names[]", it) } limit?.let { parameter("limit", it) } cursor?.let { parameter("cursor", it) } } @@ -437,14 +441,15 @@ class GroupTagsService internal constructor( } } - suspend fun listTagsAll(names: TagNamesFilter? = null, limit: Int? = null): List { + suspend fun listTagsAll(names: List? = null, limit: Int? = null): List { val items = mutableListOf() var cursor: String? = null do { val response = listTags(names = names, limit = limit, cursor = cursor) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } @@ -461,7 +466,7 @@ class GroupTagsService internal constructor( id: Int, limit: Int? = null, cursor: String? = null, - ): ListMembersResponse { + ): GetTagUsersResponse { val response = client.get("$baseUrl/group_tags/$id/users") { limit?.let { parameter("limit", it) } cursor?.let { parameter("cursor", it) } @@ -479,8 +484,9 @@ class GroupTagsService internal constructor( do { val response = getTagUsers(id = id, limit = limit, cursor = cursor) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } @@ -530,7 +536,7 @@ class MessagesService internal constructor( ): ListChatMessagesResponse { val response = client.get("$baseUrl/messages") { parameter("chat_id", chatId) - sortId?.let { parameter("sort[{field}]", it.value) } + sortId?.let { parameter("sort[id]", it.value) } limit?.let { parameter("limit", it) } cursor?.let { parameter("cursor", it) } } @@ -556,8 +562,9 @@ class MessagesService internal constructor( cursor = cursor, ) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } @@ -665,8 +672,9 @@ class ReactionsService internal constructor( do { val response = listReactions(id = id, limit = limit, cursor = cursor) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } @@ -810,7 +818,7 @@ class SearchService internal constructor( active: Boolean? = null, chatSubtype: ChatSubtype? = null, personal: Boolean? = null, - ): ListChatsResponse { + ): SearchChatsResponse { val response = client.get("$baseUrl/search/chats") { query?.let { parameter("query", it) } limit?.let { parameter("limit", it) } @@ -854,8 +862,9 @@ class SearchService internal constructor( personal = personal, ) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } @@ -869,7 +878,7 @@ class SearchService internal constructor( chatIds: List? = null, userIds: List? = null, active: Boolean? = null, - ): ListChatMessagesResponse { + ): SearchMessagesResponse { val response = client.get("$baseUrl/search/messages") { query?.let { parameter("query", it) } limit?.let { parameter("limit", it) } @@ -877,8 +886,8 @@ class SearchService internal constructor( order?.let { parameter("order", it.value) } createdFrom?.let { parameter("created_from", it) } createdTo?.let { parameter("created_to", it) } - chatIds?.let { parameter("chat_ids", it) } - userIds?.let { parameter("user_ids", it) } + chatIds?.forEach { parameter("chat_ids[]", it) } + userIds?.forEach { parameter("user_ids[]", it) } active?.let { parameter("active", it) } } return when (response.status.value) { @@ -913,8 +922,9 @@ class SearchService internal constructor( active = active, ) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } @@ -927,7 +937,7 @@ class SearchService internal constructor( createdFrom: String? = null, createdTo: String? = null, companyRoles: List? = null, - ): ListMembersResponse { + ): SearchUsersResponse { val response = client.get("$baseUrl/search/users") { query?.let { parameter("query", it) } limit?.let { parameter("limit", it) } @@ -936,7 +946,7 @@ class SearchService internal constructor( order?.let { parameter("order", it.value) } createdFrom?.let { parameter("created_from", it) } createdTo?.let { parameter("created_to", it) } - companyRoles?.let { parameter("company_roles", it) } + companyRoles?.forEach { parameter("company_roles[]", it.value) } } return when (response.status.value) { 200 -> response.body() @@ -968,8 +978,9 @@ class SearchService internal constructor( companyRoles = companyRoles, ) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } } @@ -996,8 +1007,9 @@ class TasksService internal constructor( do { val response = listTasks(limit = limit, cursor = cursor) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } @@ -1052,7 +1064,7 @@ class UsersService internal constructor( query: String? = null, limit: Int? = null, cursor: String? = null, - ): ListMembersResponse { + ): ListUsersResponse { val response = client.get("$baseUrl/users") { query?.let { parameter("query", it) } limit?.let { parameter("limit", it) } @@ -1071,8 +1083,9 @@ class UsersService internal constructor( do { val response = listUsers(query = query, limit = limit, cursor = cursor) items.addAll(response.data) - cursor = response.meta?.paginate?.nextPage - } while (cursor != null) + if (response.data.isEmpty()) break + cursor = response.meta.paginate.nextPage + } while (true) return items } diff --git a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt index 2060e1f5..9dbe5245 100644 --- a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt +++ b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt @@ -1116,12 +1116,12 @@ data class OpenViewRequest( @Serializable data class PaginationMetaPaginate( - @SerialName("next_page") val nextPage: String? = null, + @SerialName("next_page") val nextPage: String, ) @Serializable data class PaginationMeta( - val paginate: PaginationMetaPaginate? = null, + val paginate: PaginationMetaPaginate, ) @Serializable @@ -1163,9 +1163,6 @@ data class StatusUpdateRequest( val status: StatusUpdateRequestStatus, ) -@Serializable -class TagNamesFilter - @Serializable data class Task( val id: Int, @@ -1395,19 +1392,19 @@ data class WebhookMessageThread( @Serializable data class GetAuditEventsResponse( val data: List, - val meta: PaginationMeta? = null, + val meta: PaginationMeta, ) @Serializable data class ListChatsResponse( val data: List, - val meta: PaginationMeta? = null, + val meta: PaginationMeta, ) @Serializable data class ListMembersResponse( val data: List, - val meta: PaginationMeta? = null, + val meta: PaginationMeta, ) @Serializable @@ -1418,25 +1415,25 @@ data class ListPropertiesResponse( @Serializable data class ListTagsResponse( val data: List, - val meta: PaginationMeta? = null, + val meta: PaginationMeta, ) @Serializable data class GetTagUsersResponse( val data: List, - val meta: PaginationMeta? = null, + val meta: PaginationMeta, ) @Serializable data class ListChatMessagesResponse( val data: List, - val meta: PaginationMeta? = null, + val meta: PaginationMeta, ) @Serializable data class ListReactionsResponse( val data: List, - val meta: PaginationMeta? = null, + val meta: PaginationMeta, ) @Serializable @@ -1460,19 +1457,19 @@ data class SearchUsersResponse( @Serializable data class ListTasksResponse( val data: List, - val meta: PaginationMeta? = null, + val meta: PaginationMeta, ) @Serializable data class ListUsersResponse( val data: List, - val meta: PaginationMeta? = null, + val meta: PaginationMeta, ) @Serializable data class GetWebhookEventsResponse( val data: List, - val meta: PaginationMeta? = null, + val meta: PaginationMeta, ) @Serializable diff --git a/sdk/kotlin/generated/src/main/kotlin/com/pachca/examples.json b/sdk/kotlin/generated/src/main/kotlin/com/pachca/examples.json index 31e73649..cda93883 100644 --- a/sdk/kotlin/generated/src/main/kotlin/com/pachca/examples.json +++ b/sdk/kotlin/generated/src/main/kotlin/com/pachca/examples.json @@ -7,14 +7,14 @@ }, "SecurityOperations_getAuditEvents": { "usage": "val response = client.security.getAuditEvents(startTime = \"2025-05-01T09:11:00Z\", endTime = \"2025-05-02T09:11:00Z\", eventKey = AuditEventKey.USER_LOGIN, actorId = \"98765\", actorType = \"User\", entityId = \"98765\", entityType = \"User\", limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "GetAuditEventsResponse(data: List, meta: PaginationMeta?)", + "output": "GetAuditEventsResponse(data: List, meta: PaginationMeta)", "imports": [ "AuditEventKey" ] }, "BotOperations_getWebhookEvents": { "usage": "val response = client.bots.getWebhookEvents(limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "GetWebhookEventsResponse(data: List, meta: PaginationMeta?)" + "output": "GetWebhookEventsResponse(data: List, meta: PaginationMeta)" }, "BotOperations_updateBot": { "usage": "val request = BotUpdateRequest(bot = BotUpdateRequestBot(webhook = BotUpdateRequestBotWebhook(outgoingUrl = \"https://www.website.com/tasks/new\")))\nval response = client.bots.updateBot(id = 1738816, request = request)", @@ -30,7 +30,7 @@ }, "ChatOperations_listChats": { "usage": "val response = client.chats.listChats(sortId = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = \"2025-01-01T00:00:00.000Z\", lastMessageAtBefore = \"2025-02-01T00:00:00.000Z\", personal = false, limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListChatsResponse(data: List, meta: PaginationMeta?)", + "output": "ListChatsResponse(data: List, meta: PaginationMeta)", "imports": [ "ChatAvailability", "SortOrder" @@ -91,7 +91,7 @@ }, "ChatMemberOperations_listMembers": { "usage": "val response = client.members.listMembers(id = 334, role = ChatMemberRoleFilter.ALL, limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListMembersResponse(data: List, meta: PaginationMeta?)", + "output": "ListMembersResponse(data: List, meta: PaginationMeta)", "imports": [ "ChatMemberRoleFilter" ] @@ -121,11 +121,8 @@ "usage": "client.members.removeMember(id = 334, userId = 186)" }, "GroupTagOperations_listTags": { - "usage": "val names = TagNamesFilter()\nval response = client.groupTags.listTags(names = names, limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListTagsResponse(data: List, meta: PaginationMeta?)", - "imports": [ - "TagNamesFilter" - ] + "usage": "val names = listOf(\"example\")\nval response = client.groupTags.listTags(names = names, limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", + "output": "ListTagsResponse(data: List, meta: PaginationMeta)" }, "GroupTagOperations_getTag": { "usage": "val response = client.groupTags.getTag(id = 9111)", @@ -133,7 +130,7 @@ }, "GroupTagOperations_getTagUsers": { "usage": "val response = client.groupTags.getTagUsers(id = 9111, limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "GetTagUsersResponse(data: List, meta: PaginationMeta?)" + "output": "GetTagUsersResponse(data: List, meta: PaginationMeta)" }, "GroupTagOperations_createTag": { "usage": "val request = GroupTagRequest(groupTag = GroupTagRequestGroupTag(name = \"Новое название тега\"))\nval response = client.groupTags.createTag(request = request)", @@ -156,7 +153,7 @@ }, "ChatMessageOperations_listChatMessages": { "usage": "val response = client.messages.listChatMessages(chatId = 198, sortId = SortOrder.DESC, limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListChatMessagesResponse(data: List, meta: PaginationMeta?)", + "output": "ListChatMessagesResponse(data: List, meta: PaginationMeta)", "imports": [ "SortOrder" ] @@ -206,7 +203,7 @@ }, "ReactionOperations_listReactions": { "usage": "val response = client.reactions.listReactions(id = 194275, limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListReactionsResponse(data: List, meta: PaginationMeta?)" + "output": "ListReactionsResponse(data: List, meta: PaginationMeta)" }, "ReactionOperations_addReaction": { "usage": "val request = ReactionRequest(code = \"👍\", name = \":+1:\")\nval response = client.reactions.addReaction(id = 7231942, request = request)", @@ -279,7 +276,7 @@ }, "TaskOperations_listTasks": { "usage": "val response = client.tasks.listTasks(limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListTasksResponse(data: List, meta: PaginationMeta?)" + "output": "ListTasksResponse(data: List, meta: PaginationMeta)" }, "TaskOperations_getTask": { "usage": "val response = client.tasks.getTask(id = 22283)", @@ -311,7 +308,7 @@ }, "UserOperations_listUsers": { "usage": "val response = client.users.listUsers(query = \"Олег\", limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListUsersResponse(data: List, meta: PaginationMeta?)" + "output": "ListUsersResponse(data: List, meta: PaginationMeta)" }, "UserOperations_getUser": { "usage": "val response = client.users.getUser(id = 12)", diff --git a/sdk/python/generated/README.md b/sdk/python/generated/README.md index d1e2a460..de807b50 100644 --- a/sdk/python/generated/README.md +++ b/sdk/python/generated/README.md @@ -61,10 +61,10 @@ chats = [] cursor = None while True: response = await client.chats.list_chats(cursor=cursor) - chats.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + chats.extend(response.data) + cursor = response.meta.paginate.next_page # Автоматически all_chats = await client.chats.list_chats_all() diff --git a/sdk/python/generated/pachca/client.py b/sdk/python/generated/pachca/client.py index c767669c..1fc9023a 100644 --- a/sdk/python/generated/pachca/client.py +++ b/sdk/python/generated/pachca/client.py @@ -36,8 +36,8 @@ ListTagsParams, ListTagsResponse, GroupTag, - TagNamesFilter, GetTagUsersParams, + GetTagUsersResponse, GroupTagRequest, ListChatMessagesParams, ListChatMessagesResponse, @@ -56,9 +56,12 @@ StatusUpdateRequest, UserStatus, SearchChatsParams, + SearchChatsResponse, ChatSubtype, SearchMessagesParams, + SearchMessagesResponse, SearchUsersParams, + SearchUsersResponse, SearchSortOrder, ListTasksParams, ListTasksResponse, @@ -66,6 +69,7 @@ TaskCreateRequest, TaskUpdateRequest, ListUsersParams, + ListUsersResponse, UserCreateRequest, UserUpdateRequest, OpenViewRequest, @@ -124,9 +128,9 @@ async def get_audit_events_all( params.cursor = cursor response = await self.get_audit_events(params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items @@ -168,9 +172,9 @@ async def get_webhook_events_all( params.cursor = cursor response = await self.get_webhook_events(params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items async def update_bot( @@ -217,7 +221,7 @@ async def list_chats( ) -> ListChatsResponse: query: dict[str, str] = {} if params is not None and params.sort_id is not None: - query["sort[{field}]"] = params.sort_id + query["sort[id]"] = params.sort_id if params is not None and params.availability is not None: query["availability"] = params.availability if params is not None and params.last_message_at_after is not None: @@ -255,9 +259,9 @@ async def list_chats_all( params.cursor = cursor response = await self.list_chats(params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items async def get_chat( @@ -485,9 +489,9 @@ async def list_members_all( params.cursor = cursor response = await self.list_members(id, params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items async def add_tags( @@ -598,13 +602,14 @@ async def list_tags( self, params: ListTagsParams | None = None, ) -> ListTagsResponse: - query: dict[str, str] = {} + query: list[tuple[str, str]] = [] if params is not None and params.names is not None: - query["names"] = params.names + for v in params.names: + query.append(("names[]", str(v))) if params is not None and params.limit is not None: - query["limit"] = str(params.limit) + query.append(("limit", str(params.limit))) if params is not None and params.cursor is not None: - query["cursor"] = params.cursor + query.append(("cursor", params.cursor)) response = await self._client.get( "/group_tags", params=query, @@ -630,9 +635,9 @@ async def list_tags_all( params.cursor = cursor response = await self.list_tags(params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items async def get_tag( @@ -655,7 +660,7 @@ async def get_tag_users( self, id: int, params: GetTagUsersParams | None = None, - ) -> ListMembersResponse: + ) -> GetTagUsersResponse: query: dict[str, str] = {} if params is not None and params.limit is not None: query["limit"] = str(params.limit) @@ -668,7 +673,7 @@ async def get_tag_users( body = response.json() match response.status_code: case 200: - return deserialize(ListMembersResponse, body) + return deserialize(GetTagUsersResponse, body) case 401: raise deserialize(OAuthError, body) case _: @@ -687,9 +692,9 @@ async def get_tag_users_all( params.cursor = cursor response = await self.get_tag_users(id, params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items async def create_tag( @@ -754,7 +759,7 @@ async def list_chat_messages( query: list[tuple[str, str]] = [] query.append(("chat_id", str(params.chat_id))) if params is not None and params.sort_id is not None: - query.append(("sort[{field}]", params.sort_id)) + query.append(("sort[id]", params.sort_id)) if params is not None and params.limit is not None: query.append(("limit", str(params.limit))) if params is not None and params.cursor is not None: @@ -784,9 +789,9 @@ async def list_chat_messages_all( params.cursor = cursor response = await self.list_chat_messages(params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items async def get_message( @@ -948,9 +953,9 @@ async def list_reactions_all( params.cursor = cursor response = await self.list_reactions(id, params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items async def add_reaction( @@ -1142,7 +1147,7 @@ def __init__(self, client: httpx.AsyncClient) -> None: async def search_chats( self, params: SearchChatsParams | None = None, - ) -> ListChatsResponse: + ) -> SearchChatsResponse: query: dict[str, str] = {} if params is not None and params.query is not None: query["query"] = params.query @@ -1169,7 +1174,7 @@ async def search_chats( body = response.json() match response.status_code: case 200: - return deserialize(ListChatsResponse, body) + return deserialize(SearchChatsResponse, body) case 401: raise deserialize(OAuthError, body) case _: @@ -1187,34 +1192,36 @@ async def search_chats_all( params.cursor = cursor response = await self.search_chats(params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items async def search_messages( self, params: SearchMessagesParams | None = None, - ) -> ListChatMessagesResponse: - query: dict[str, str] = {} + ) -> SearchMessagesResponse: + query: list[tuple[str, str]] = [] if params is not None and params.query is not None: - query["query"] = params.query + query.append(("query", params.query)) if params is not None and params.limit is not None: - query["limit"] = str(params.limit) + query.append(("limit", str(params.limit))) if params is not None and params.cursor is not None: - query["cursor"] = params.cursor + query.append(("cursor", params.cursor)) if params is not None and params.order is not None: - query["order"] = params.order + query.append(("order", params.order)) if params is not None and params.created_from is not None: - query["created_from"] = params.created_from + query.append(("created_from", params.created_from)) if params is not None and params.created_to is not None: - query["created_to"] = params.created_to + query.append(("created_to", params.created_to)) if params is not None and params.chat_ids is not None: - query["chat_ids"] = params.chat_ids + for v in params.chat_ids: + query.append(("chat_ids[]", str(v))) if params is not None and params.user_ids is not None: - query["user_ids"] = params.user_ids + for v in params.user_ids: + query.append(("user_ids[]", str(v))) if params is not None and params.active is not None: - query["active"] = str(params.active).lower() + query.append(("active", str(params.active).lower())) response = await self._client.get( "/search/messages", params=query, @@ -1222,7 +1229,7 @@ async def search_messages( body = response.json() match response.status_code: case 200: - return deserialize(ListChatMessagesResponse, body) + return deserialize(SearchMessagesResponse, body) case 401: raise deserialize(OAuthError, body) case _: @@ -1240,32 +1247,33 @@ async def search_messages_all( params.cursor = cursor response = await self.search_messages(params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items async def search_users( self, params: SearchUsersParams | None = None, - ) -> ListMembersResponse: - query: dict[str, str] = {} + ) -> SearchUsersResponse: + query: list[tuple[str, str]] = [] if params is not None and params.query is not None: - query["query"] = params.query + query.append(("query", params.query)) if params is not None and params.limit is not None: - query["limit"] = str(params.limit) + query.append(("limit", str(params.limit))) if params is not None and params.cursor is not None: - query["cursor"] = params.cursor + query.append(("cursor", params.cursor)) if params is not None and params.sort is not None: - query["sort"] = params.sort + query.append(("sort", params.sort)) if params is not None and params.order is not None: - query["order"] = params.order + query.append(("order", params.order)) if params is not None and params.created_from is not None: - query["created_from"] = params.created_from + query.append(("created_from", params.created_from)) if params is not None and params.created_to is not None: - query["created_to"] = params.created_to + query.append(("created_to", params.created_to)) if params is not None and params.company_roles is not None: - query["company_roles"] = params.company_roles + for v in params.company_roles: + query.append(("company_roles[]", str(v))) response = await self._client.get( "/search/users", params=query, @@ -1273,7 +1281,7 @@ async def search_users( body = response.json() match response.status_code: case 200: - return deserialize(ListMembersResponse, body) + return deserialize(SearchUsersResponse, body) case 401: raise deserialize(OAuthError, body) case _: @@ -1291,9 +1299,9 @@ async def search_users_all( params.cursor = cursor response = await self.search_users(params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items @@ -1335,9 +1343,9 @@ async def list_tasks_all( params.cursor = cursor response = await self.list_tasks(params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items async def get_task( @@ -1414,7 +1422,7 @@ def __init__(self, client: httpx.AsyncClient) -> None: async def list_users( self, params: ListUsersParams | None = None, - ) -> ListMembersResponse: + ) -> ListUsersResponse: query: dict[str, str] = {} if params is not None and params.query is not None: query["query"] = params.query @@ -1429,7 +1437,7 @@ async def list_users( body = response.json() match response.status_code: case 200: - return deserialize(ListMembersResponse, body) + return deserialize(ListUsersResponse, body) case 401: raise deserialize(OAuthError, body) case _: @@ -1447,9 +1455,9 @@ async def list_users_all( params.cursor = cursor response = await self.list_users(params=params) items.extend(response.data) - cursor = response.meta.paginate.next_page if response.meta and response.meta.paginate else None - if not cursor: + if not response.data: break + cursor = response.meta.paginate.next_page return items async def get_user( diff --git a/sdk/python/generated/pachca/examples.json b/sdk/python/generated/pachca/examples.json index 339733ff..51254fc6 100644 --- a/sdk/python/generated/pachca/examples.json +++ b/sdk/python/generated/pachca/examples.json @@ -7,7 +7,7 @@ }, "SecurityOperations_getAuditEvents": { "usage": "params = GetAuditEventsParams(\n start_time=\"2025-05-01T09:11:00Z\",\n end_time=\"2025-05-02T09:11:00Z\",\n event_key=AuditEventKey.USER_LOGIN,\n actor_id=\"98765\",\n actor_type=\"User\",\n entity_id=\"98765\",\n entity_type=\"User\",\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.security.get_audit_events(params=params)", - "output": "GetAuditEventsResponse(data: list[AuditEvent], meta: PaginationMeta | None)", + "output": "GetAuditEventsResponse(data: list[AuditEvent], meta: PaginationMeta)", "imports": [ "AuditEventKey", "GetAuditEventsParams" @@ -15,7 +15,7 @@ }, "BotOperations_getWebhookEvents": { "usage": "params = GetWebhookEventsParams(limit=1, cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")\nresponse = await client.bots.get_webhook_events(params=params)", - "output": "GetWebhookEventsResponse(data: list[WebhookEvent], meta: PaginationMeta | None)", + "output": "GetWebhookEventsResponse(data: list[WebhookEvent], meta: PaginationMeta)", "imports": [ "GetWebhookEventsParams" ] @@ -34,7 +34,7 @@ }, "ChatOperations_listChats": { "usage": "params = ListChatsParams(\n sort_id=SortOrder.DESC,\n availability=ChatAvailability.IS_MEMBER,\n last_message_at_after=\"2025-01-01T00:00:00.000Z\",\n last_message_at_before=\"2025-02-01T00:00:00.000Z\",\n personal=False,\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.chats.list_chats(params=params)", - "output": "ListChatsResponse(data: list[Chat], meta: PaginationMeta | None)", + "output": "ListChatsResponse(data: list[Chat], meta: PaginationMeta)", "imports": [ "ChatAvailability", "ListChatsParams", @@ -97,7 +97,7 @@ }, "ChatMemberOperations_listMembers": { "usage": "params = ListMembersParams(\n role=ChatMemberRoleFilter.ALL,\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.members.list_members(id=334, params=params)", - "output": "ListMembersResponse(data: list[User], meta: PaginationMeta | None)", + "output": "ListMembersResponse(data: list[User], meta: PaginationMeta)", "imports": [ "ChatMemberRoleFilter", "ListMembersParams" @@ -128,11 +128,10 @@ "usage": "await client.members.remove_member(id=334, user_id=186)" }, "GroupTagOperations_listTags": { - "usage": "params = ListTagsParams(\n names=TagNamesFilter(),\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.group_tags.list_tags(params=params)", - "output": "ListTagsResponse(data: list[GroupTag], meta: PaginationMeta | None)", + "usage": "params = ListTagsParams(\n names=[\"example\"],\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.group_tags.list_tags(params=params)", + "output": "ListTagsResponse(data: list[GroupTag], meta: PaginationMeta)", "imports": [ - "ListTagsParams", - "TagNamesFilter" + "ListTagsParams" ] }, "GroupTagOperations_getTag": { @@ -141,7 +140,7 @@ }, "GroupTagOperations_getTagUsers": { "usage": "params = GetTagUsersParams(limit=1, cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")\nresponse = await client.group_tags.get_tag_users(id=9111, params=params)", - "output": "GetTagUsersResponse(data: list[User], meta: PaginationMeta | None)", + "output": "GetTagUsersResponse(data: list[User], meta: PaginationMeta)", "imports": [ "GetTagUsersParams" ] @@ -167,7 +166,7 @@ }, "ChatMessageOperations_listChatMessages": { "usage": "params = ListChatMessagesParams(\n chat_id=198,\n sort_id=SortOrder.DESC,\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.messages.list_chat_messages(params=params)", - "output": "ListChatMessagesResponse(data: list[Message], meta: PaginationMeta | None)", + "output": "ListChatMessagesResponse(data: list[Message], meta: PaginationMeta)", "imports": [ "ListChatMessagesParams", "SortOrder" @@ -218,7 +217,7 @@ }, "ReactionOperations_listReactions": { "usage": "params = ListReactionsParams(limit=1, cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")\nresponse = await client.reactions.list_reactions(id=194275, params=params)", - "output": "ListReactionsResponse(data: list[Reaction], meta: PaginationMeta | None)", + "output": "ListReactionsResponse(data: list[Reaction], meta: PaginationMeta)", "imports": [ "ListReactionsParams" ] @@ -303,7 +302,7 @@ }, "TaskOperations_listTasks": { "usage": "params = ListTasksParams(limit=1, cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")\nresponse = await client.tasks.list_tasks(params=params)", - "output": "ListTasksResponse(data: list[Task], meta: PaginationMeta | None)", + "output": "ListTasksResponse(data: list[Task], meta: PaginationMeta)", "imports": [ "ListTasksParams" ] @@ -338,7 +337,7 @@ }, "UserOperations_listUsers": { "usage": "params = ListUsersParams(\n query=\"Олег\",\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.users.list_users(params=params)", - "output": "ListUsersResponse(data: list[User], meta: PaginationMeta | None)", + "output": "ListUsersResponse(data: list[User], meta: PaginationMeta)", "imports": [ "ListUsersParams" ] diff --git a/sdk/python/generated/pachca/models.py b/sdk/python/generated/pachca/models.py index 48ad7978..13ec9a19 100644 --- a/sdk/python/generated/pachca/models.py +++ b/sdk/python/generated/pachca/models.py @@ -763,12 +763,12 @@ class OpenViewRequest: @dataclass class PaginationMetaPaginate: - next_page: str | None = None + next_page: str @dataclass class PaginationMeta: - paginate: PaginationMetaPaginate | None = None + paginate: PaginationMetaPaginate @dataclass @@ -822,11 +822,6 @@ class StatusUpdateRequest: status: StatusUpdateRequestStatus -@dataclass -class TagNamesFilter: - pass - - @dataclass class Task: id: int @@ -1209,7 +1204,7 @@ class ListPropertiesParams: @dataclass class ListTagsParams: - names: TagNamesFilter | None = None + names: list[str] | None = None limit: int | None = None cursor: str | None = None @@ -1306,19 +1301,19 @@ class GetWebhookEventsParams: @dataclass class GetAuditEventsResponse: data: list[AuditEvent] - meta: PaginationMeta | None = None + meta: PaginationMeta @dataclass class ListChatsResponse: data: list[Chat] - meta: PaginationMeta | None = None + meta: PaginationMeta @dataclass class ListMembersResponse: data: list[User] - meta: PaginationMeta | None = None + meta: PaginationMeta @dataclass @@ -1329,25 +1324,25 @@ class ListPropertiesResponse: @dataclass class ListTagsResponse: data: list[GroupTag] - meta: PaginationMeta | None = None + meta: PaginationMeta @dataclass class GetTagUsersResponse: data: list[User] - meta: PaginationMeta | None = None + meta: PaginationMeta @dataclass class ListChatMessagesResponse: data: list[Message] - meta: PaginationMeta | None = None + meta: PaginationMeta @dataclass class ListReactionsResponse: data: list[Reaction] - meta: PaginationMeta | None = None + meta: PaginationMeta @dataclass @@ -1371,16 +1366,16 @@ class SearchUsersResponse: @dataclass class ListTasksResponse: data: list[Task] - meta: PaginationMeta | None = None + meta: PaginationMeta @dataclass class ListUsersResponse: data: list[User] - meta: PaginationMeta | None = None + meta: PaginationMeta @dataclass class GetWebhookEventsResponse: data: list[WebhookEvent] - meta: PaginationMeta | None = None + meta: PaginationMeta diff --git a/sdk/swift/README.md b/sdk/swift/README.md index 5c58c162..d723fc75 100644 --- a/sdk/swift/README.md +++ b/sdk/swift/README.md @@ -70,9 +70,10 @@ var chats: [Chat] = [] var cursor: String? = nil repeat { let response = try await pachca.chats.listChats(cursor: cursor) + if response.data.isEmpty { break } chats.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage -} while cursor != nil + cursor = response.meta.paginate.nextPage +} while true // Автоматически let allChats = try await pachca.chats.listChatsAll() diff --git a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Client.swift b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Client.swift index 9f45447f..caf0986c 100644 --- a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Client.swift +++ b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Client.swift @@ -47,8 +47,9 @@ public struct SecurityService { repeat { let response = try await getAuditEvents(startTime: startTime, endTime: endTime, eventKey: eventKey, actorId: actorId, actorType: actorType, entityId: entityId, entityType: entityType, limit: limit, cursor: cursor) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } } @@ -90,8 +91,9 @@ public struct BotsService { repeat { let response = try await getWebhookEvents(limit: limit, cursor: cursor) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } @@ -144,7 +146,7 @@ public struct ChatsService { public func listChats(sortId: SortOrder? = nil, availability: ChatAvailability? = nil, lastMessageAtAfter: String? = nil, lastMessageAtBefore: String? = nil, personal: Bool? = nil, limit: Int? = nil, cursor: String? = nil) async throws -> ListChatsResponse { var components = URLComponents(string: "\(baseURL)/chats")! var queryItems: [URLQueryItem] = [] - if let sortId { queryItems.append(URLQueryItem(name: "sort[{field}]", value: sortId.rawValue)) } + if let sortId { queryItems.append(URLQueryItem(name: "sort[id]", value: sortId.rawValue)) } if let availability { queryItems.append(URLQueryItem(name: "availability", value: availability.rawValue)) } if let lastMessageAtAfter { queryItems.append(URLQueryItem(name: "last_message_at_after", value: lastMessageAtAfter)) } if let lastMessageAtBefore { queryItems.append(URLQueryItem(name: "last_message_at_before", value: lastMessageAtBefore)) } @@ -172,8 +174,9 @@ public struct ChatsService { repeat { let response = try await listChats(sortId: sortId, availability: availability, lastMessageAtAfter: lastMessageAtAfter, lastMessageAtBefore: lastMessageAtBefore, personal: personal, limit: limit, cursor: cursor) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } @@ -393,7 +396,7 @@ public struct MembersService { } public func listMembers(id: Int, role: ChatMemberRoleFilter? = nil, limit: Int? = nil, cursor: String? = nil) async throws -> ListMembersResponse { - var components = URLComponents(string: "\(baseURL)/chats/{id}/members")! + var components = URLComponents(string: "\(baseURL)/chats/\(id)/members")! var queryItems: [URLQueryItem] = [] if let role { queryItems.append(URLQueryItem(name: "role", value: role.rawValue)) } if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } @@ -419,8 +422,9 @@ public struct MembersService { repeat { let response = try await listMembers(id: id, role: role, limit: limit, cursor: cursor) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } @@ -465,7 +469,7 @@ public struct MembersService { request.httpMethod = "PUT" headers.forEach { request.setValue($1, forHTTPHeaderField: $0) } request.setValue("application/json", forHTTPHeaderField: "Content-Type") - request.httpBody = try JSONSerialization.data(withJSONObject: ["role": role]) + request.httpBody = try JSONSerialization.data(withJSONObject: ["role": role.rawValue]) let (data, urlResponse) = try await dataWithRetry(session: session, for: request) let statusCode = (urlResponse as! HTTPURLResponse).statusCode switch statusCode { @@ -538,10 +542,10 @@ public struct GroupTagsService { self.session = session } - public func listTags(names: TagNamesFilter? = nil, limit: Int? = nil, cursor: String? = nil) async throws -> ListTagsResponse { + public func listTags(names: [String]? = nil, limit: Int? = nil, cursor: String? = nil) async throws -> ListTagsResponse { var components = URLComponents(string: "\(baseURL)/group_tags")! var queryItems: [URLQueryItem] = [] - if let names { queryItems.append(URLQueryItem(name: "names", value: String(data: try serialize(names), encoding: .utf8)!)) } + if let names { names.forEach { queryItems.append(URLQueryItem(name: "names[]", value: String($0))) } } if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } if let cursor { queryItems.append(URLQueryItem(name: "cursor", value: String(cursor))) } if !queryItems.isEmpty { components.queryItems = queryItems } @@ -559,14 +563,15 @@ public struct GroupTagsService { } } - public func listTagsAll(names: TagNamesFilter? = nil, limit: Int? = nil) async throws -> [GroupTag] { + public func listTagsAll(names: [String]? = nil, limit: Int? = nil) async throws -> [GroupTag] { var items: [GroupTag] = [] var cursor: String? = nil repeat { let response = try await listTags(names: names, limit: limit, cursor: cursor) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } @@ -585,8 +590,8 @@ public struct GroupTagsService { } } - public func getTagUsers(id: Int, limit: Int? = nil, cursor: String? = nil) async throws -> ListMembersResponse { - var components = URLComponents(string: "\(baseURL)/group_tags/{id}/users")! + public func getTagUsers(id: Int, limit: Int? = nil, cursor: String? = nil) async throws -> GetTagUsersResponse { + var components = URLComponents(string: "\(baseURL)/group_tags/\(id)/users")! var queryItems: [URLQueryItem] = [] if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } if let cursor { queryItems.append(URLQueryItem(name: "cursor", value: String(cursor))) } @@ -597,7 +602,7 @@ public struct GroupTagsService { let statusCode = (urlResponse as! HTTPURLResponse).statusCode switch statusCode { case 200: - return try deserialize(ListMembersResponse.self, from: data) + return try deserialize(GetTagUsersResponse.self, from: data) case 401: throw try deserialize(OAuthError.self, from: data) default: @@ -611,8 +616,9 @@ public struct GroupTagsService { repeat { let response = try await getTagUsers(id: id, limit: limit, cursor: cursor) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } @@ -684,7 +690,7 @@ public struct MessagesService { var components = URLComponents(string: "\(baseURL)/messages")! var queryItems: [URLQueryItem] = [] queryItems.append(URLQueryItem(name: "chat_id", value: String(chatId))) - if let sortId { queryItems.append(URLQueryItem(name: "sort[{field}]", value: sortId.rawValue)) } + if let sortId { queryItems.append(URLQueryItem(name: "sort[id]", value: sortId.rawValue)) } if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } if let cursor { queryItems.append(URLQueryItem(name: "cursor", value: String(cursor))) } if !queryItems.isEmpty { components.queryItems = queryItems } @@ -708,8 +714,9 @@ public struct MessagesService { repeat { let response = try await listChatMessages(chatId: chatId, sortId: sortId, limit: limit, cursor: cursor) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } @@ -855,7 +862,7 @@ public struct ReactionsService { } public func listReactions(id: Int, limit: Int? = nil, cursor: String? = nil) async throws -> ListReactionsResponse { - var components = URLComponents(string: "\(baseURL)/messages/{id}/reactions")! + var components = URLComponents(string: "\(baseURL)/messages/\(id)/reactions")! var queryItems: [URLQueryItem] = [] if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } if let cursor { queryItems.append(URLQueryItem(name: "cursor", value: String(cursor))) } @@ -880,8 +887,9 @@ public struct ReactionsService { repeat { let response = try await listReactions(id: id, limit: limit, cursor: cursor) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } @@ -904,7 +912,7 @@ public struct ReactionsService { } public func removeReaction(id: Int, code: String, name: String? = nil) async throws -> Void { - var components = URLComponents(string: "\(baseURL)/messages/{id}/reactions")! + var components = URLComponents(string: "\(baseURL)/messages/\(id)/reactions")! var queryItems: [URLQueryItem] = [] queryItems.append(URLQueryItem(name: "code", value: String(code))) if let name { queryItems.append(URLQueryItem(name: "name", value: String(name))) } @@ -937,7 +945,7 @@ public struct ReadMembersService { } public func listReadMembers(id: Int, limit: Int? = nil, cursor: String? = nil) async throws -> String { - var components = URLComponents(string: "\(baseURL)/messages/{id}/read_member_ids")! + var components = URLComponents(string: "\(baseURL)/messages/\(id)/read_member_ids")! var queryItems: [URLQueryItem] = [] if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } if let cursor { queryItems.append(URLQueryItem(name: "cursor", value: String(cursor))) } @@ -1102,7 +1110,7 @@ public struct SearchService { self.session = session } - public func searchChats(query: String? = nil, limit: Int? = nil, cursor: String? = nil, order: SortOrder? = nil, createdFrom: String? = nil, createdTo: String? = nil, active: Bool? = nil, chatSubtype: ChatSubtype? = nil, personal: Bool? = nil) async throws -> ListChatsResponse { + public func searchChats(query: String? = nil, limit: Int? = nil, cursor: String? = nil, order: SortOrder? = nil, createdFrom: String? = nil, createdTo: String? = nil, active: Bool? = nil, chatSubtype: ChatSubtype? = nil, personal: Bool? = nil) async throws -> SearchChatsResponse { var components = URLComponents(string: "\(baseURL)/search/chats")! var queryItems: [URLQueryItem] = [] if let query { queryItems.append(URLQueryItem(name: "query", value: String(query))) } @@ -1121,7 +1129,7 @@ public struct SearchService { let statusCode = (urlResponse as! HTTPURLResponse).statusCode switch statusCode { case 200: - return try deserialize(ListChatsResponse.self, from: data) + return try deserialize(SearchChatsResponse.self, from: data) case 401: throw try deserialize(OAuthError.self, from: data) default: @@ -1135,12 +1143,13 @@ public struct SearchService { repeat { let response = try await searchChats(query: query, limit: limit, cursor: cursor, order: order, createdFrom: createdFrom, createdTo: createdTo, active: active, chatSubtype: chatSubtype, personal: personal) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } - public func searchMessages(query: String? = nil, limit: Int? = nil, cursor: String? = nil, order: SortOrder? = nil, createdFrom: String? = nil, createdTo: String? = nil, chatIds: [Int]? = nil, userIds: [Int]? = nil, active: Bool? = nil) async throws -> ListChatMessagesResponse { + public func searchMessages(query: String? = nil, limit: Int? = nil, cursor: String? = nil, order: SortOrder? = nil, createdFrom: String? = nil, createdTo: String? = nil, chatIds: [Int]? = nil, userIds: [Int]? = nil, active: Bool? = nil) async throws -> SearchMessagesResponse { var components = URLComponents(string: "\(baseURL)/search/messages")! var queryItems: [URLQueryItem] = [] if let query { queryItems.append(URLQueryItem(name: "query", value: String(query))) } @@ -1149,8 +1158,8 @@ public struct SearchService { if let order { queryItems.append(URLQueryItem(name: "order", value: order.rawValue)) } if let createdFrom { queryItems.append(URLQueryItem(name: "created_from", value: createdFrom)) } if let createdTo { queryItems.append(URLQueryItem(name: "created_to", value: createdTo)) } - if let chatIds { chatIds.forEach { queryItems.append(URLQueryItem(name: "chat_ids", value: String($0))) } } - if let userIds { userIds.forEach { queryItems.append(URLQueryItem(name: "user_ids", value: String($0))) } } + if let chatIds { chatIds.forEach { queryItems.append(URLQueryItem(name: "chat_ids[]", value: String($0))) } } + if let userIds { userIds.forEach { queryItems.append(URLQueryItem(name: "user_ids[]", value: String($0))) } } if let active { queryItems.append(URLQueryItem(name: "active", value: String(active))) } if !queryItems.isEmpty { components.queryItems = queryItems } var request = URLRequest(url: components.url!) @@ -1159,7 +1168,7 @@ public struct SearchService { let statusCode = (urlResponse as! HTTPURLResponse).statusCode switch statusCode { case 200: - return try deserialize(ListChatMessagesResponse.self, from: data) + return try deserialize(SearchMessagesResponse.self, from: data) case 401: throw try deserialize(OAuthError.self, from: data) default: @@ -1173,12 +1182,13 @@ public struct SearchService { repeat { let response = try await searchMessages(query: query, limit: limit, cursor: cursor, order: order, createdFrom: createdFrom, createdTo: createdTo, chatIds: chatIds, userIds: userIds, active: active) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } - public func searchUsers(query: String? = nil, limit: Int? = nil, cursor: String? = nil, sort: SearchSortOrder? = nil, order: SortOrder? = nil, createdFrom: String? = nil, createdTo: String? = nil, companyRoles: [UserRole]? = nil) async throws -> ListMembersResponse { + public func searchUsers(query: String? = nil, limit: Int? = nil, cursor: String? = nil, sort: SearchSortOrder? = nil, order: SortOrder? = nil, createdFrom: String? = nil, createdTo: String? = nil, companyRoles: [UserRole]? = nil) async throws -> SearchUsersResponse { var components = URLComponents(string: "\(baseURL)/search/users")! var queryItems: [URLQueryItem] = [] if let query { queryItems.append(URLQueryItem(name: "query", value: String(query))) } @@ -1188,7 +1198,7 @@ public struct SearchService { if let order { queryItems.append(URLQueryItem(name: "order", value: order.rawValue)) } if let createdFrom { queryItems.append(URLQueryItem(name: "created_from", value: createdFrom)) } if let createdTo { queryItems.append(URLQueryItem(name: "created_to", value: createdTo)) } - if let companyRoles { companyRoles.forEach { queryItems.append(URLQueryItem(name: "company_roles", value: $0.rawValue)) } } + if let companyRoles { companyRoles.forEach { queryItems.append(URLQueryItem(name: "company_roles[]", value: $0.rawValue)) } } if !queryItems.isEmpty { components.queryItems = queryItems } var request = URLRequest(url: components.url!) headers.forEach { request.setValue($1, forHTTPHeaderField: $0) } @@ -1196,7 +1206,7 @@ public struct SearchService { let statusCode = (urlResponse as! HTTPURLResponse).statusCode switch statusCode { case 200: - return try deserialize(ListMembersResponse.self, from: data) + return try deserialize(SearchUsersResponse.self, from: data) case 401: throw try deserialize(OAuthError.self, from: data) default: @@ -1210,8 +1220,9 @@ public struct SearchService { repeat { let response = try await searchUsers(query: query, limit: limit, cursor: cursor, sort: sort, order: order, createdFrom: createdFrom, createdTo: createdTo, companyRoles: companyRoles) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } } @@ -1253,8 +1264,9 @@ public struct TasksService { repeat { let response = try await listTasks(limit: limit, cursor: cursor) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } @@ -1337,7 +1349,7 @@ public struct UsersService { self.session = session } - public func listUsers(query: String? = nil, limit: Int? = nil, cursor: String? = nil) async throws -> ListMembersResponse { + public func listUsers(query: String? = nil, limit: Int? = nil, cursor: String? = nil) async throws -> ListUsersResponse { var components = URLComponents(string: "\(baseURL)/users")! var queryItems: [URLQueryItem] = [] if let query { queryItems.append(URLQueryItem(name: "query", value: String(query))) } @@ -1350,7 +1362,7 @@ public struct UsersService { let statusCode = (urlResponse as! HTTPURLResponse).statusCode switch statusCode { case 200: - return try deserialize(ListMembersResponse.self, from: data) + return try deserialize(ListUsersResponse.self, from: data) case 401: throw try deserialize(OAuthError.self, from: data) default: @@ -1364,8 +1376,9 @@ public struct UsersService { repeat { let response = try await listUsers(query: query, limit: limit, cursor: cursor) items.append(contentsOf: response.data) - cursor = response.meta?.paginate?.nextPage - } while cursor != nil + if response.data.isEmpty { break } + cursor = response.meta.paginate.nextPage + } while true return items } diff --git a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift index 198e4f36..66e20bd1 100644 --- a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift +++ b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift @@ -1030,13 +1030,13 @@ public struct CustomPropertyDefinition: Codable { } public struct ExportRequest: Codable { - public let startAt: Date - public let endAt: Date + public let startAt: String + public let endAt: String public let webhookUrl: String public let chatIds: [Int]? public let skipChatsFile: Bool? - public init(startAt: Date, endAt: Date, webhookUrl: String, chatIds: [Int]? = nil, skipChatsFile: Bool? = nil) { + public init(startAt: String, endAt: String, webhookUrl: String, chatIds: [Int]? = nil, skipChatsFile: Bool? = nil) { self.startAt = startAt self.endAt = endAt self.webhookUrl = webhookUrl @@ -1589,9 +1589,9 @@ public struct OpenViewRequest: Codable { } public struct PaginationMetaPaginate: Codable { - public let nextPage: String? + public let nextPage: String - public init(nextPage: String? = nil) { + public init(nextPage: String) { self.nextPage = nextPage } @@ -1601,9 +1601,9 @@ public struct PaginationMetaPaginate: Codable { } public struct PaginationMeta: Codable { - public let paginate: PaginationMetaPaginate? + public let paginate: PaginationMetaPaginate - public init(paginate: PaginationMetaPaginate? = nil) { + public init(paginate: PaginationMetaPaginate) { self.paginate = paginate } } @@ -1726,9 +1726,6 @@ public struct StatusUpdateRequest: Codable { } } -public struct TagNamesFilter: Codable { -} - public struct Task: Codable { public let id: Int public let kind: TaskKind @@ -2747,17 +2744,17 @@ public enum WebhookPayloadUnion: Codable { public struct GetAuditEventsResponse: Codable { public let data: [AuditEvent] - public var meta: PaginationMeta? = nil + public let meta: PaginationMeta } public struct ListChatsResponse: Codable { public let data: [Chat] - public var meta: PaginationMeta? = nil + public let meta: PaginationMeta } public struct ListMembersResponse: Codable { public let data: [User] - public var meta: PaginationMeta? = nil + public let meta: PaginationMeta } public struct ListPropertiesResponse: Codable { @@ -2766,22 +2763,22 @@ public struct ListPropertiesResponse: Codable { public struct ListTagsResponse: Codable { public let data: [GroupTag] - public var meta: PaginationMeta? = nil + public let meta: PaginationMeta } public struct GetTagUsersResponse: Codable { public let data: [User] - public var meta: PaginationMeta? = nil + public let meta: PaginationMeta } public struct ListChatMessagesResponse: Codable { public let data: [Message] - public var meta: PaginationMeta? = nil + public let meta: PaginationMeta } public struct ListReactionsResponse: Codable { public let data: [Reaction] - public var meta: PaginationMeta? = nil + public let meta: PaginationMeta } public struct SearchChatsResponse: Codable { @@ -2801,17 +2798,17 @@ public struct SearchUsersResponse: Codable { public struct ListTasksResponse: Codable { public let data: [Task] - public var meta: PaginationMeta? = nil + public let meta: PaginationMeta } public struct ListUsersResponse: Codable { public let data: [User] - public var meta: PaginationMeta? = nil + public let meta: PaginationMeta } public struct GetWebhookEventsResponse: Codable { public let data: [WebhookEvent] - public var meta: PaginationMeta? = nil + public let meta: PaginationMeta } struct BotResponseDataWrapper: Codable { diff --git a/sdk/swift/generated/examples.json b/sdk/swift/generated/examples.json index 4deae97b..af825387 100644 --- a/sdk/swift/generated/examples.json +++ b/sdk/swift/generated/examples.json @@ -7,14 +7,14 @@ }, "SecurityOperations_getAuditEvents": { "usage": "let response = try await client.security.getAuditEvents(startTime: \"2025-05-01T09:11:00Z\", endTime: \"2025-05-02T09:11:00Z\", eventKey: .userLogin, actorId: \"98765\", actorType: \"User\", entityId: \"98765\", entityType: \"User\", limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "GetAuditEventsResponse(data: [AuditEvent], meta: PaginationMeta?)", + "output": "GetAuditEventsResponse(data: [AuditEvent], meta: PaginationMeta)", "imports": [ "AuditEventKey" ] }, "BotOperations_getWebhookEvents": { "usage": "let response = try await client.bots.getWebhookEvents(limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "GetWebhookEventsResponse(data: [WebhookEvent], meta: PaginationMeta?)" + "output": "GetWebhookEventsResponse(data: [WebhookEvent], meta: PaginationMeta)" }, "BotOperations_updateBot": { "usage": "let body = BotUpdateRequest(bot: BotUpdateRequestBot(webhook: BotUpdateRequestBotWebhook(outgoingUrl: \"https://www.website.com/tasks/new\")))\nlet response = try await client.bots.updateBot(id: 1738816, body: body)", @@ -30,7 +30,7 @@ }, "ChatOperations_listChats": { "usage": "let response = try await client.chats.listChats(sortId: .desc, availability: .isMember, lastMessageAtAfter: \"2025-01-01T00:00:00.000Z\", lastMessageAtBefore: \"2025-02-01T00:00:00.000Z\", personal: false, limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListChatsResponse(data: [Chat], meta: PaginationMeta?)", + "output": "ListChatsResponse(data: [Chat], meta: PaginationMeta)", "imports": [ "ChatAvailability", "SortOrder" @@ -91,7 +91,7 @@ }, "ChatMemberOperations_listMembers": { "usage": "let response = try await client.members.listMembers(id: 334, role: .all, limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListMembersResponse(data: [User], meta: PaginationMeta?)", + "output": "ListMembersResponse(data: [User], meta: PaginationMeta)", "imports": [ "ChatMemberRoleFilter" ] @@ -121,11 +121,8 @@ "usage": "try await client.members.removeMember(id: 334, userId: 186)" }, "GroupTagOperations_listTags": { - "usage": "let names = TagNamesFilter()\nlet response = try await client.groupTags.listTags(names: names, limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListTagsResponse(data: [GroupTag], meta: PaginationMeta?)", - "imports": [ - "TagNamesFilter" - ] + "usage": "let names = [\"example\"]\nlet response = try await client.groupTags.listTags(names: names, limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", + "output": "ListTagsResponse(data: [GroupTag], meta: PaginationMeta)" }, "GroupTagOperations_getTag": { "usage": "let response = try await client.groupTags.getTag(id: 9111)", @@ -133,7 +130,7 @@ }, "GroupTagOperations_getTagUsers": { "usage": "let response = try await client.groupTags.getTagUsers(id: 9111, limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "GetTagUsersResponse(data: [User], meta: PaginationMeta?)" + "output": "GetTagUsersResponse(data: [User], meta: PaginationMeta)" }, "GroupTagOperations_createTag": { "usage": "let body = GroupTagRequest(groupTag: GroupTagRequestGroupTag(name: \"Новое название тега\"))\nlet response = try await client.groupTags.createTag(body: body)", @@ -156,7 +153,7 @@ }, "ChatMessageOperations_listChatMessages": { "usage": "let response = try await client.messages.listChatMessages(chatId: 198, sortId: .desc, limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListChatMessagesResponse(data: [Message], meta: PaginationMeta?)", + "output": "ListChatMessagesResponse(data: [Message], meta: PaginationMeta)", "imports": [ "SortOrder" ] @@ -206,7 +203,7 @@ }, "ReactionOperations_listReactions": { "usage": "let response = try await client.reactions.listReactions(id: 194275, limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListReactionsResponse(data: [Reaction], meta: PaginationMeta?)" + "output": "ListReactionsResponse(data: [Reaction], meta: PaginationMeta)" }, "ReactionOperations_addReaction": { "usage": "let body = ReactionRequest(code: \"👍\", name: \":+1:\")\nlet response = try await client.reactions.addReaction(id: 7231942, body: body)", @@ -279,7 +276,7 @@ }, "TaskOperations_listTasks": { "usage": "let response = try await client.tasks.listTasks(limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListTasksResponse(data: [Task], meta: PaginationMeta?)" + "output": "ListTasksResponse(data: [Task], meta: PaginationMeta)" }, "TaskOperations_getTask": { "usage": "let response = try await client.tasks.getTask(id: 22283)", @@ -311,7 +308,7 @@ }, "UserOperations_listUsers": { "usage": "let response = try await client.users.listUsers(query: \"Олег\", limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", - "output": "ListUsersResponse(data: [User], meta: PaginationMeta?)" + "output": "ListUsersResponse(data: [User], meta: PaginationMeta)" }, "UserOperations_getUser": { "usage": "let response = try await client.users.getUser(id: 12)", diff --git a/sdk/typescript/README.md b/sdk/typescript/README.md index e3b1f9c4..26966a5c 100644 --- a/sdk/typescript/README.md +++ b/sdk/typescript/README.md @@ -49,11 +49,12 @@ const message = await pachca.messages.createMessage(...); // Message, не { dat // Вручную let cursor: string | undefined; const chats: Chat[] = []; -do { +for (;;) { const response = await pachca.chats.listChats({ cursor }); + if (response.data.length === 0) break; chats.push(...response.data); - cursor = response.meta?.paginate?.nextPage; -} while (cursor); + cursor = response.meta.paginate.nextPage; +} // Автоматически const allChats = await pachca.chats.listChatsAll(); diff --git a/sdk/typescript/src/generated/client.ts b/sdk/typescript/src/generated/client.ts index 466a0ad8..1e0569fb 100644 --- a/sdk/typescript/src/generated/client.ts +++ b/sdk/typescript/src/generated/client.ts @@ -28,6 +28,7 @@ import { ListTagsResponse, GroupTag, GetTagUsersParams, + GetTagUsersResponse, GroupTagRequest, ListChatMessagesParams, ListChatMessagesResponse, @@ -46,14 +47,18 @@ import { StatusUpdateRequest, UserStatus, SearchChatsParams, + SearchChatsResponse, SearchMessagesParams, + SearchMessagesResponse, SearchUsersParams, + SearchUsersResponse, ListTasksParams, ListTasksResponse, Task, TaskCreateRequest, TaskUpdateRequest, ListUsersParams, + ListUsersResponse, UserCreateRequest, UserUpdateRequest, OpenViewRequest, @@ -98,8 +103,9 @@ class SecurityService { do { const response = await this.getAuditEvents({ ...params, cursor } as GetAuditEventsParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } } @@ -135,8 +141,9 @@ class BotsService { do { const response = await this.getWebhookEvents({ ...params, cursor } as GetWebhookEventsParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } @@ -181,7 +188,7 @@ class ChatsService { async listChats(params?: ListChatsParams): Promise { const query = new URLSearchParams(); - if (params?.sortId !== undefined) query.set("sort[{field}]", params.sortId); + if (params?.sortId !== undefined) query.set("sort[id]", params.sortId); if (params?.availability !== undefined) query.set("availability", params.availability); if (params?.lastMessageAtAfter !== undefined) query.set("last_message_at_after", params.lastMessageAtAfter); if (params?.lastMessageAtBefore !== undefined) query.set("last_message_at_before", params.lastMessageAtBefore); @@ -209,8 +216,9 @@ class ChatsService { do { const response = await this.listChats({ ...params, cursor } as ListChatsParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } @@ -425,8 +433,9 @@ class MembersService { do { const response = await this.listMembers(id, { ...params, cursor } as ListMembersParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } @@ -532,7 +541,9 @@ class GroupTagsService { async listTags(params?: ListTagsParams): Promise { const query = new URLSearchParams(); - if (params?.names !== undefined) query.set("names", String(params.names)); + if (params?.names !== undefined) { + params.names.forEach((v) => query.append("names[]", String(v))); + } if (params?.limit !== undefined) query.set("limit", String(params.limit)); if (params?.cursor !== undefined) query.set("cursor", params.cursor); const url = `${this.baseUrl}/group_tags${query.toString() ? `?${query}` : ""}`; @@ -556,8 +567,9 @@ class GroupTagsService { do { const response = await this.listTags({ ...params, cursor } as ListTagsParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } @@ -576,7 +588,7 @@ class GroupTagsService { } } - async getTagUsers(id: number, params?: GetTagUsersParams): Promise { + async getTagUsers(id: number, params?: GetTagUsersParams): Promise { const query = new URLSearchParams(); if (params?.limit !== undefined) query.set("limit", String(params.limit)); if (params?.cursor !== undefined) query.set("cursor", params.cursor); @@ -587,7 +599,7 @@ class GroupTagsService { const body = await response.json(); switch (response.status) { case 200: - return deserialize(body) as ListMembersResponse; + return deserialize(body) as GetTagUsersResponse; case 401: throw new OAuthError(body.error); default: @@ -601,8 +613,9 @@ class GroupTagsService { do { const response = await this.getTagUsers(id, { ...params, cursor } as GetTagUsersParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } @@ -665,7 +678,7 @@ class MessagesService { async listChatMessages(params: ListChatMessagesParams): Promise { const query = new URLSearchParams(); query.set("chat_id", String(params.chatId)); - if (params?.sortId !== undefined) query.set("sort[{field}]", params.sortId); + if (params?.sortId !== undefined) query.set("sort[id]", params.sortId); if (params?.limit !== undefined) query.set("limit", String(params.limit)); if (params?.cursor !== undefined) query.set("cursor", params.cursor); const response = await fetchWithRetry(`${this.baseUrl}/messages?${query}`, { @@ -688,8 +701,9 @@ class MessagesService { do { const response = await this.listChatMessages({ ...params, cursor } as ListChatMessagesParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } @@ -842,8 +856,9 @@ class ReactionsService { do { const response = await this.listReactions(id, { ...params, cursor } as ListReactionsParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } @@ -1037,7 +1052,7 @@ class SearchService { private headers: Record, ) {} - async searchChats(params?: SearchChatsParams): Promise { + async searchChats(params?: SearchChatsParams): Promise { const query = new URLSearchParams(); if (params?.query !== undefined) query.set("query", params.query); if (params?.limit !== undefined) query.set("limit", String(params.limit)); @@ -1055,7 +1070,7 @@ class SearchService { const body = await response.json(); switch (response.status) { case 200: - return deserialize(body) as ListChatsResponse; + return deserialize(body) as SearchChatsResponse; case 401: throw new OAuthError(body.error); default: @@ -1069,12 +1084,13 @@ class SearchService { do { const response = await this.searchChats({ ...params, cursor } as SearchChatsParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } - async searchMessages(params?: SearchMessagesParams): Promise { + async searchMessages(params?: SearchMessagesParams): Promise { const query = new URLSearchParams(); if (params?.query !== undefined) query.set("query", params.query); if (params?.limit !== undefined) query.set("limit", String(params.limit)); @@ -1082,8 +1098,12 @@ class SearchService { if (params?.order !== undefined) query.set("order", params.order); if (params?.createdFrom !== undefined) query.set("created_from", params.createdFrom); if (params?.createdTo !== undefined) query.set("created_to", params.createdTo); - if (params?.chatIds !== undefined) query.set("chat_ids", String(params.chatIds)); - if (params?.userIds !== undefined) query.set("user_ids", String(params.userIds)); + if (params?.chatIds !== undefined) { + params.chatIds.forEach((v) => query.append("chat_ids[]", String(v))); + } + if (params?.userIds !== undefined) { + params.userIds.forEach((v) => query.append("user_ids[]", String(v))); + } if (params?.active !== undefined) query.set("active", String(params.active)); const url = `${this.baseUrl}/search/messages${query.toString() ? `?${query}` : ""}`; const response = await fetchWithRetry(url, { @@ -1092,7 +1112,7 @@ class SearchService { const body = await response.json(); switch (response.status) { case 200: - return deserialize(body) as ListChatMessagesResponse; + return deserialize(body) as SearchMessagesResponse; case 401: throw new OAuthError(body.error); default: @@ -1106,12 +1126,13 @@ class SearchService { do { const response = await this.searchMessages({ ...params, cursor } as SearchMessagesParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } - async searchUsers(params?: SearchUsersParams): Promise { + async searchUsers(params?: SearchUsersParams): Promise { const query = new URLSearchParams(); if (params?.query !== undefined) query.set("query", params.query); if (params?.limit !== undefined) query.set("limit", String(params.limit)); @@ -1120,7 +1141,9 @@ class SearchService { if (params?.order !== undefined) query.set("order", params.order); if (params?.createdFrom !== undefined) query.set("created_from", params.createdFrom); if (params?.createdTo !== undefined) query.set("created_to", params.createdTo); - if (params?.companyRoles !== undefined) query.set("company_roles", String(params.companyRoles)); + if (params?.companyRoles !== undefined) { + params.companyRoles.forEach((v) => query.append("company_roles[]", String(v))); + } const url = `${this.baseUrl}/search/users${query.toString() ? `?${query}` : ""}`; const response = await fetchWithRetry(url, { headers: this.headers, @@ -1128,7 +1151,7 @@ class SearchService { const body = await response.json(); switch (response.status) { case 200: - return deserialize(body) as ListMembersResponse; + return deserialize(body) as SearchUsersResponse; case 401: throw new OAuthError(body.error); default: @@ -1142,8 +1165,9 @@ class SearchService { do { const response = await this.searchUsers({ ...params, cursor } as SearchUsersParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } } @@ -1179,8 +1203,9 @@ class TasksService { do { const response = await this.listTasks({ ...params, cursor } as ListTasksParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } @@ -1255,7 +1280,7 @@ class UsersService { private headers: Record, ) {} - async listUsers(params?: ListUsersParams): Promise { + async listUsers(params?: ListUsersParams): Promise { const query = new URLSearchParams(); if (params?.query !== undefined) query.set("query", params.query); if (params?.limit !== undefined) query.set("limit", String(params.limit)); @@ -1267,7 +1292,7 @@ class UsersService { const body = await response.json(); switch (response.status) { case 200: - return deserialize(body) as ListMembersResponse; + return deserialize(body) as ListUsersResponse; case 401: throw new OAuthError(body.error); default: @@ -1281,8 +1306,9 @@ class UsersService { do { const response = await this.listUsers({ ...params, cursor } as ListUsersParams); items.push(...response.data); - cursor = response.meta?.paginate?.nextPage; - } while (cursor); + if (response.data.length === 0) break; + cursor = response.meta.paginate.nextPage; + } while (true); return items; } diff --git a/sdk/typescript/src/generated/examples.json b/sdk/typescript/src/generated/examples.json index d0aef1ba..a2535929 100644 --- a/sdk/typescript/src/generated/examples.json +++ b/sdk/typescript/src/generated/examples.json @@ -7,14 +7,14 @@ }, "SecurityOperations_getAuditEvents": { "usage": "const response = client.security.getAuditEvents({\n startTime: \"2025-05-01T09:11:00Z\",\n endTime: \"2025-05-02T09:11:00Z\",\n eventKey: AuditEventKey.UserLogin,\n actorId: \"98765\",\n actorType: \"User\",\n entityId: \"98765\",\n entityType: \"User\",\n limit: 1,\n cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n})", - "output": "GetAuditEventsResponse({ data: AuditEvent[], meta?: PaginationMeta })", + "output": "GetAuditEventsResponse({ data: AuditEvent[], meta: PaginationMeta })", "imports": [ "AuditEventKey" ] }, "BotOperations_getWebhookEvents": { "usage": "const response = client.bots.getWebhookEvents({ limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\" })", - "output": "GetWebhookEventsResponse({ data: WebhookEvent[], meta?: PaginationMeta })" + "output": "GetWebhookEventsResponse({ data: WebhookEvent[], meta: PaginationMeta })" }, "BotOperations_updateBot": { "usage": "const request: BotUpdateRequest = { bot: { webhook: { outgoingUrl: \"https://www.website.com/tasks/new\" } } }\nconst response = client.bots.updateBot(1738816, request)", @@ -30,7 +30,7 @@ }, "ChatOperations_listChats": { "usage": "const response = client.chats.listChats({\n sortId: SortOrder.Desc,\n availability: ChatAvailability.IsMember,\n lastMessageAtAfter: \"2025-01-01T00:00:00.000Z\",\n lastMessageAtBefore: \"2025-02-01T00:00:00.000Z\",\n personal: false,\n limit: 1,\n cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n})", - "output": "ListChatsResponse({ data: Chat[], meta?: PaginationMeta })", + "output": "ListChatsResponse({ data: Chat[], meta: PaginationMeta })", "imports": [ "ChatAvailability", "SortOrder" @@ -91,7 +91,7 @@ }, "ChatMemberOperations_listMembers": { "usage": "const response = client.members.listMembers(334, {\n role: ChatMemberRoleFilter.All,\n limit: 1,\n cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n})", - "output": "ListMembersResponse({ data: User[], meta?: PaginationMeta })", + "output": "ListMembersResponse({ data: User[], meta: PaginationMeta })", "imports": [ "ChatMemberRoleFilter" ] @@ -121,11 +121,8 @@ "usage": "client.members.removeMember(334, 186)" }, "GroupTagOperations_listTags": { - "usage": "const response = client.groupTags.listTags({\n names: {},\n limit: 1,\n cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n})", - "output": "ListTagsResponse({ data: GroupTag[], meta?: PaginationMeta })", - "imports": [ - "TagNamesFilter" - ] + "usage": "const response = client.groupTags.listTags({\n names: [\"example\"],\n limit: 1,\n cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n})", + "output": "ListTagsResponse({ data: GroupTag[], meta: PaginationMeta })" }, "GroupTagOperations_getTag": { "usage": "const response = client.groupTags.getTag(9111)", @@ -133,7 +130,7 @@ }, "GroupTagOperations_getTagUsers": { "usage": "const response = client.groupTags.getTagUsers(9111, { limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\" })", - "output": "GetTagUsersResponse({ data: User[], meta?: PaginationMeta })" + "output": "GetTagUsersResponse({ data: User[], meta: PaginationMeta })" }, "GroupTagOperations_createTag": { "usage": "const request: GroupTagRequest = { groupTag: { name: \"Новое название тега\" } }\nconst response = client.groupTags.createTag(request)", @@ -156,7 +153,7 @@ }, "ChatMessageOperations_listChatMessages": { "usage": "const response = client.messages.listChatMessages({\n chatId: 198,\n sortId: SortOrder.Desc,\n limit: 1,\n cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n})", - "output": "ListChatMessagesResponse({ data: Message[], meta?: PaginationMeta })", + "output": "ListChatMessagesResponse({ data: Message[], meta: PaginationMeta })", "imports": [ "SortOrder" ] @@ -206,7 +203,7 @@ }, "ReactionOperations_listReactions": { "usage": "const response = client.reactions.listReactions(194275, { limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\" })", - "output": "ListReactionsResponse({ data: Reaction[], meta?: PaginationMeta })" + "output": "ListReactionsResponse({ data: Reaction[], meta: PaginationMeta })" }, "ReactionOperations_addReaction": { "usage": "const request: ReactionRequest = { code: \"👍\", name: \":+1:\" }\nconst response = client.reactions.addReaction(7231942, request)", @@ -279,7 +276,7 @@ }, "TaskOperations_listTasks": { "usage": "const response = client.tasks.listTasks({ limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\" })", - "output": "ListTasksResponse({ data: Task[], meta?: PaginationMeta })" + "output": "ListTasksResponse({ data: Task[], meta: PaginationMeta })" }, "TaskOperations_getTask": { "usage": "const response = client.tasks.getTask(22283)", @@ -311,7 +308,7 @@ }, "UserOperations_listUsers": { "usage": "const response = client.users.listUsers({\n query: \"Олег\",\n limit: 1,\n cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n})", - "output": "ListUsersResponse({ data: User[], meta?: PaginationMeta })" + "output": "ListUsersResponse({ data: User[], meta: PaginationMeta })" }, "UserOperations_getUser": { "usage": "const response = client.users.getUser(12)", diff --git a/sdk/typescript/src/generated/types.ts b/sdk/typescript/src/generated/types.ts index 46d7c0cc..45fd1f57 100644 --- a/sdk/typescript/src/generated/types.ts +++ b/sdk/typescript/src/generated/types.ts @@ -843,8 +843,8 @@ export interface OpenViewRequest { } export interface PaginationMeta { - paginate?: { - nextPage?: string; + paginate: { + nextPage: string; }; } @@ -888,9 +888,6 @@ export interface StatusUpdateRequest { }; } -export interface TagNamesFilter { -} - export interface Task { id: number; kind: TaskKind; @@ -1220,7 +1217,7 @@ export interface ListPropertiesParams { } export interface ListTagsParams { - names?: TagNamesFilter; + names?: string[]; limit?: number; cursor?: string; } @@ -1305,17 +1302,17 @@ export interface GetWebhookEventsParams { export interface GetAuditEventsResponse { data: AuditEvent[]; - meta?: PaginationMeta; + meta: PaginationMeta; } export interface ListChatsResponse { data: Chat[]; - meta?: PaginationMeta; + meta: PaginationMeta; } export interface ListMembersResponse { data: User[]; - meta?: PaginationMeta; + meta: PaginationMeta; } export interface ListPropertiesResponse { @@ -1324,22 +1321,22 @@ export interface ListPropertiesResponse { export interface ListTagsResponse { data: GroupTag[]; - meta?: PaginationMeta; + meta: PaginationMeta; } export interface GetTagUsersResponse { data: User[]; - meta?: PaginationMeta; + meta: PaginationMeta; } export interface ListChatMessagesResponse { data: Message[]; - meta?: PaginationMeta; + meta: PaginationMeta; } export interface ListReactionsResponse { data: Reaction[]; - meta?: PaginationMeta; + meta: PaginationMeta; } export interface SearchChatsResponse { @@ -1359,15 +1356,15 @@ export interface SearchUsersResponse { export interface ListTasksResponse { data: Task[]; - meta?: PaginationMeta; + meta: PaginationMeta; } export interface ListUsersResponse { data: User[]; - meta?: PaginationMeta; + meta: PaginationMeta; } export interface GetWebhookEventsResponse { data: WebhookEvent[]; - meta?: PaginationMeta; + meta: PaginationMeta; } From f1d585492a86dd15d0b0a70d34435677487a4cb4 Mon Sep 17 00:00:00 2001 From: lookinway Date: Mon, 6 Apr 2026 19:45:13 +0300 Subject: [PATCH 18/37] more more fixes --- apps/docs/content/api/models.mdx | 2 +- apps/docs/content/guides/n8n/advanced.mdx | 15 + apps/docs/content/guides/n8n/resources.mdx | 14 +- apps/docs/content/updates.mdx | 17 +- .../skills/pachca-profile/SKILL.md | 19 + .../.well-known/skills/pachca-users/SKILL.md | 20 + apps/docs/public/api/authorization.md | 2 + apps/docs/public/api/chats/list.md | 5 +- apps/docs/public/api/messages/list.md | 5 +- apps/docs/public/api/models.md | 2 +- apps/docs/public/api/profile/delete-avatar.md | 103 + apps/docs/public/api/profile/update-avatar.md | 152 ++ apps/docs/public/api/users/remove-avatar.md | 140 ++ apps/docs/public/api/users/update-avatar.md | 189 ++ apps/docs/public/guides/cli.md | 4 + apps/docs/public/guides/n8n/advanced.md | 16 + apps/docs/public/guides/n8n/resources.md | 14 +- apps/docs/public/guides/sdk/csharp.md | 6 +- apps/docs/public/guides/sdk/go.md | 7 +- apps/docs/public/guides/sdk/kotlin.md | 7 +- apps/docs/public/guides/sdk/python.md | 9 +- apps/docs/public/guides/sdk/swift.md | 6 +- apps/docs/public/guides/sdk/typescript.md | 9 +- apps/docs/public/guides/workflows.md | 16 + apps/docs/public/llms-full.txt | 1986 +++++++++++------ apps/docs/public/llms.txt | 4 + .../public/pachca.postman_collection.json | 110 + apps/docs/public/skill.md | 4 + apps/docs/public/updates.md | 24 + integrations/n8n/README.md | 10 +- .../n8n/nodes/Pachca/GenericFunctions.ts | 37 +- integrations/n8n/nodes/Pachca/SharedRouter.ts | 34 +- .../n8n/nodes/Pachca/V2/ChatDescription.ts | 22 + .../n8n/nodes/Pachca/V2/MessageDescription.ts | 21 + .../n8n/nodes/Pachca/V2/ProfileDescription.ts | 19 + .../n8n/nodes/Pachca/V2/UserDescription.ts | 49 + integrations/n8n/scripts/generate-n8n.ts | 29 +- integrations/n8n/tests/router.test.ts | 65 + packages/cli/README.md | 4 + packages/cli/oclif.manifest.json | 2 +- packages/cli/scripts/generate-cli.ts | 35 +- packages/cli/src/commands/chats/list.ts | 17 +- packages/cli/src/commands/members/list.ts | 1 + packages/cli/src/commands/messages/list.ts | 23 +- .../cli/src/commands/profile/delete-avatar.ts | 55 + .../cli/src/commands/profile/update-avatar.ts | 59 + .../cli/src/commands/users/remove-avatar.ts | 58 + .../cli/src/commands/users/update-avatar.ts | 62 + packages/cli/src/data/alternatives.json | 4 + packages/cli/src/data/changelog.json | 26 + packages/cli/src/data/workflows.json | 43 + packages/cli/tests/commands.test.ts | 9 +- packages/cli/tests/generate-cli.test.ts | 9 +- packages/generator/src/lang/csharp.ts | 13 +- packages/generator/src/lang/go.ts | 13 +- packages/generator/src/lang/kotlin.ts | 11 +- packages/generator/src/lang/python.ts | 14 +- packages/generator/src/lang/swift.ts | 9 +- packages/generator/src/lang/typescript.ts | 14 +- packages/spec/openapi.en.yaml | 300 ++- packages/spec/openapi.yaml | 300 ++- packages/spec/overlay.en.yaml | 71 +- packages/spec/scripts/apply-overlay.ts | 16 + packages/spec/typespec.tsp | 201 +- packages/spec/workflows.ts | 58 + sdk/csharp/generated/Client.cs | 105 +- sdk/csharp/generated/Models.cs | 97 + sdk/csharp/generated/examples.json | 20 +- sdk/go/generated/client.go | 170 +- sdk/go/generated/examples.json | 20 +- sdk/go/generated/types.go | 33 +- .../src/main/kotlin/com/pachca/Client.kt | 74 +- .../src/main/kotlin/com/pachca/Models.kt | 37 + .../src/main/kotlin/com/pachca/examples.json | 20 +- sdk/python/generated/pachca/client.py | 82 +- sdk/python/generated/pachca/examples.json | 20 +- sdk/python/generated/pachca/models.py | 34 +- .../Pachca/GeneratedSources/Client.swift | 112 +- .../Pachca/GeneratedSources/Models.swift | 48 + sdk/swift/generated/examples.json | 20 +- sdk/typescript/src/generated/client.ts | 75 +- sdk/typescript/src/generated/examples.json | 20 +- sdk/typescript/src/generated/types.ts | 35 +- skills/pachca-profile/SKILL.md | 19 + skills/pachca-users/SKILL.md | 20 + 85 files changed, 4864 insertions(+), 817 deletions(-) create mode 100644 apps/docs/public/api/profile/delete-avatar.md create mode 100644 apps/docs/public/api/profile/update-avatar.md create mode 100644 apps/docs/public/api/users/remove-avatar.md create mode 100644 apps/docs/public/api/users/update-avatar.md create mode 100644 packages/cli/src/commands/profile/delete-avatar.ts create mode 100644 packages/cli/src/commands/profile/update-avatar.ts create mode 100644 packages/cli/src/commands/users/remove-avatar.ts create mode 100644 packages/cli/src/commands/users/update-avatar.ts diff --git a/apps/docs/content/api/models.mdx b/apps/docs/content/api/models.mdx index 223164b2..b90064f1 100644 --- a/apps/docs/content/api/models.mdx +++ b/apps/docs/content/api/models.mdx @@ -8,7 +8,7 @@ hideTableOfContents: true Все модели данных, возвращаемые в ответах API. Каждая модель содержит связанные методы и таблицу свойств. -Методы [Получение подписи](POST /uploads) и [Загрузка файла](POST /direct_url) не возвращают модели данных. +Методы [Получение подписи](POST /uploads), [Загрузка файла](POST /direct_url), [Загрузка аватара](PUT /profile/avatar), [Удаление аватара](DELETE /profile/avatar), [Загрузка аватара сотрудника](PUT /users/{user_id}/avatar) и [Удаление аватара сотрудника](DELETE /users/{user_id}/avatar) не возвращают модели данных. diff --git a/apps/docs/content/guides/n8n/advanced.mdx b/apps/docs/content/guides/n8n/advanced.mdx index e6eb95e3..b681e3c9 100644 --- a/apps/docs/content/guides/n8n/advanced.mdx +++ b/apps/docs/content/guides/n8n/advanced.mdx @@ -30,6 +30,21 @@ description: "Экспорт сообщений, загрузка файлов, --- +## Загрузка аватара + +Операции **Update Avatar** для ресурсов **Profile** и **User** позволяют загружать аватар через `multipart/form-data`. + +**Как использовать:** + +1. **HTTP Request** или **Read Binary File** — загрузите изображение в бинарное свойство (по умолчанию `data`) +2. **Pachca** (Profile > Update Avatar или User > Update Avatar) — в поле **Input Binary Field** укажите имя бинарного свойства + +Для удаления аватара используйте операцию **Delete Avatar** — она не требует параметров (для User — только `userId`). + +Операции с аватарами сотрудников (User > Update/Delete Avatar) требуют прав администратора. + +--- + ## Экспорт сообщений Ресурс **Chat Export** позволяет выгружать сообщения из чатов. Экспорт выполняется асинхронно: вы запрашиваете экспорт, а Пачка присылает уведомление на вебхук, когда архив готов. diff --git a/apps/docs/content/guides/n8n/resources.mdx b/apps/docs/content/guides/n8n/resources.mdx index 3a7dcf5e..90a57a5a 100644 --- a/apps/docs/content/guides/n8n/resources.mdx +++ b/apps/docs/content/guides/n8n/resources.mdx @@ -20,11 +20,11 @@ description: Все 18 ресурсов и более 60 операций рас | 1 | [Message](#message) | 7 | Сообщения: создание, редактирование, удаление, закрепление | | | 2 | [Chat](#chat) | 6 | Чаты: создание, обновление, архивация | | | 3 | [Chat Member](#chat-member) | 7 | Участники чата: добавление, удаление, роли, теги | да | -| 4 | [User](#user) | 8 | Сотрудники: CRUD, статус | | +| 4 | [User](#user) | 10 | Сотрудники: CRUD, аватар, статус | | | 5 | [Group Tag](#group-tag) | 6 | Теги сотрудников: CRUD, список пользователей | | | 6 | [Thread](#thread) | 2 | Треды: создание, получение | | | 7 | [Reaction](#reaction) | 3 | Реакции: создание, удаление, список | | -| 8 | [Profile](#profile) | 5 | Мой профиль: информация, статус | | +| 8 | [Profile](#profile) | 7 | Мой профиль: информация, аватар, статус | | | 9 | [Task](#task) | 5 | Задачи: полный CRUD | | | 10 | [Bot](#bot) | 3 | Боты: обновление, события, удаление событий | | | 11 | [File](#file) | 1 | Загрузка файлов через S3 | | @@ -56,6 +56,8 @@ description: Все 18 ресурсов и более 60 операций рас **Ключевые параметры Create:** `entityId` (ID чата или пользователя), `content` (текст, Markdown), `entityType` (discussion, user, thread), `files`, `buttons`, `parentMessageId`. +**Сортировка в Get Many:** параметры `sort` (по умолчанию `id`) и `order` (`asc` / `desc`) определяют порядок выдачи сообщений. + --- @@ -73,6 +75,8 @@ description: Все 18 ресурсов и более 60 операций рас | Archive | [Архивация чата](PUT /chats/{id}/archive) | | Unarchive | [Разархивация чата](PUT /chats/{id}/unarchive) | +**Сортировка в Get Many:** параметры `sort` (`id` или `last_message_at`) и `order` (`asc` / `desc`). Также доступны фильтры `availability`, `lastMessageAtAfter`, `lastMessageAtBefore`. + --- ## Chat Member @@ -104,6 +108,8 @@ description: Все 18 ресурсов и более 60 операций рас | Get | [Информация о сотруднике](GET /users/{id}) | | Update | [Обновление сотрудника](PUT /users/{id}) | | Delete | [Удаление сотрудника](DELETE /users/{id}) | +| Update Avatar | [Обновление аватара](PUT /users/{user_id}/avatar) | +| Delete Avatar | [Удаление аватара](DELETE /users/{user_id}/avatar) | | Get Status | [Получение статуса](GET /users/{user_id}/status) | | Update Status | [Обновление статуса](PUT /users/{user_id}/status) | | Delete Status | [Удаление статуса](DELETE /users/{user_id}/status) | @@ -156,10 +162,14 @@ description: Все 18 ресурсов и более 60 операций рас |----------|-----| | Get | [Информация о профиле](GET /profile) | | Get Info | [Информация о токене](GET /oauth/token/info) | +| Update Avatar | [Обновление аватара](PUT /profile/avatar) | +| Delete Avatar | [Удаление аватара](DELETE /profile/avatar) | | Get Status | [Получение статуса](GET /profile/status) | | Update Status | [Обновление статуса](PUT /profile/status) | | Delete Status | [Удаление статуса](DELETE /profile/status) | +**Загрузка аватара:** операция Update Avatar принимает бинарные данные из предыдущего узла (например, HTTP Request или Read Binary File). В поле **Input Binary Field** укажите имя бинарного свойства (по умолчанию `data`). + --- ## Task diff --git a/apps/docs/content/updates.mdx b/apps/docs/content/updates.mdx index 7ea59dc4..c18b6d88 100644 --- a/apps/docs/content/updates.mdx +++ b/apps/docs/content/updates.mdx @@ -9,9 +9,20 @@ useUpdatesComponent: true Автоматически отслеживайте обновления: подпишитесь на [RSS-ленту](/feed.xml) или используйте [markdown-версию этой страницы](/updates.md) для интеграции с инструментами и AI-агентами. - + -## n8n Node v2 +## Аватары, сортировка и n8n Node v2 + +Были добавлены новые методы для управления аватарами: + +- [Загрузка аватара](PUT /profile/avatar) +- [Удаление аватара](DELETE /profile/avatar) +- [Загрузка аватара сотрудника](PUT /users/{user_id}/avatar) +- [Удаление аватара сотрудника](DELETE /users/{user_id}/avatar) + +С помощью этих методов вы можете загружать и удалять аватары для своего профиля и для сотрудников вашей компании. + +В методах [Список чатов](GET /chats) и [Список сообщений чата](GET /messages) добавлен новый формат параметров сортировки: `sort` (поле сортировки) и `order` (направление: `asc` или `desc`). Расширение [n8n](/guides/n8n/overview) для Пачки обновлено до версии 2.0.0. Нода автоматически генерируется из OpenAPI-спецификации и всегда синхронизирована с актуальным API. @@ -22,6 +33,8 @@ useUpdatesComponent: true - **AI Tool Use** — использование узлов как инструментов AI Agent - **Полная [обратная совместимость](/guides/n8n/migration)** — все существующие workflow на v1 продолжают работать без изменений +В [CLI](/guides/cli) добавлены команды для управления аватарами и обновлены параметры сортировки (`--sort` и `--order`). Все 6 SDK обновлены: [TypeScript](/guides/sdk/typescript), [Python](/guides/sdk/python), [Go](/guides/sdk/go), [Kotlin](/guides/sdk/kotlin), [Swift](/guides/sdk/swift) и [C#](/guides/sdk/csharp). + ## C# SDK diff --git a/apps/docs/public/.well-known/skills/pachca-profile/SKILL.md b/apps/docs/public/.well-known/skills/pachca-profile/SKILL.md index 8a4df339..a5fd95df 100644 --- a/apps/docs/public/.well-known/skills/pachca-profile/SKILL.md +++ b/apps/docs/public/.well-known/skills/pachca-profile/SKILL.md @@ -102,6 +102,23 @@ Help: `npx @pachca/cli --help` | Workflows: `npx @pachca/cli guide` > Кастомные поля настраиваются администратором пространства. +### Загрузить аватар профиля + +1. Загрузи аватар из файла: + ```bash + pachca profile update-avatar --file=<путь_к_файлу> + ``` + > Файл изображения передается в формате multipart/form-data + + +### Удалить аватар профиля + +1. Удали аватар: + ```bash + pachca profile delete-avatar --force + ``` + + ## Limitations - Rate limit: ~50 req/sec. On 429 — wait and retry. @@ -115,6 +132,8 @@ Help: `npx @pachca/cli --help` | Workflows: `npx @pachca/cli guide` | GET | /custom_properties | Список дополнительных полей | | GET | /oauth/token/info | Информация о токене | | GET | /profile | Информация о профиле | +| PUT | /profile/avatar | Загрузка аватара | +| DELETE | /profile/avatar | Удаление аватара | | GET | /profile/status | Текущий статус | | PUT | /profile/status | Новый статус | | DELETE | /profile/status | Удаление статуса | diff --git a/apps/docs/public/.well-known/skills/pachca-users/SKILL.md b/apps/docs/public/.well-known/skills/pachca-users/SKILL.md index 8d28d6b5..b11fc1ae 100644 --- a/apps/docs/public/.well-known/skills/pachca-users/SKILL.md +++ b/apps/docs/public/.well-known/skills/pachca-users/SKILL.md @@ -158,6 +158,24 @@ Help: `npx @pachca/cli --help` | Workflows: `npx @pachca/cli guide` ``` +### Загрузить аватар сотрудника + +1. Загрузи аватар сотруднику: + ```bash + pachca users update-avatar --file=<путь_к_файлу> + ``` + > Требует прав администратора. Файл передается в формате multipart/form-data + + +### Удалить аватар сотрудника + +1. Удали аватар сотрудника: + ```bash + pachca users remove-avatar --force + ``` + > Требует прав администратора + + ## Limitations - Rate limit: ~50 req/sec. On 429 — wait and retry. @@ -181,6 +199,8 @@ Help: `npx @pachca/cli --help` | Workflows: `npx @pachca/cli guide` | GET | /users/{id} | Информация о сотруднике | | PUT | /users/{id} | Редактирование сотрудника | | DELETE | /users/{id} | Удаление сотрудника | +| PUT | /users/{user_id}/avatar | Загрузка аватара сотрудника | +| DELETE | /users/{user_id}/avatar | Удаление аватара сотрудника | | GET | /users/{user_id}/status | Статус сотрудника | | PUT | /users/{user_id}/status | Новый статус сотрудника | | DELETE | /users/{user_id}/status | Удаление статуса сотрудника | diff --git a/apps/docs/public/api/authorization.md b/apps/docs/public/api/authorization.md index 1c4c7a2c..14aff33b 100644 --- a/apps/docs/public/api/authorization.md +++ b/apps/docs/public/api/authorization.md @@ -117,8 +117,10 @@ Authorization: Bearer | `profile:read` | Просмотр информации о своем профиле | Все | | `profile_status:read` | Просмотр статуса профиля | Все | | `profile_status:write` | Изменение и удаление статуса профиля | Все | +| `profile_avatar:write` | Изменение и удаление аватара профиля | Все | | `user_status:read` | Просмотр статуса сотрудника | Владелец, Администратор | | `user_status:write` | Изменение и удаление статуса сотрудника | Владелец, Администратор | +| `user_avatar:write` | Изменение и удаление аватара сотрудника | Владелец, Администратор | | `custom_properties:read` | Просмотр дополнительных полей | Все | | `audit_events:read` | Просмотр журнала аудита | Владелец | | `tasks:read` | Просмотр задач | Все | diff --git a/apps/docs/public/api/chats/list.md b/apps/docs/public/api/chats/list.md index 78310704..cd9467c8 100644 --- a/apps/docs/public/api/chats/list.md +++ b/apps/docs/public/api/chats/list.md @@ -12,7 +12,8 @@ ### Query параметры -- `sort[{field}]: string` (default: desc) — Составной параметр сортировки сущностей выборки +- `sort: string` (default: id) — Поле сортировки +- `order: string` (default: desc) — Направление сортировки - `availability: string` (default: is_member) — Параметр, который отвечает за доступность и выборку чатов для пользователя - `last_message_at_after: date-time` — Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не раньше чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ). - `last_message_at_before: date-time` — Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не позже чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ). @@ -25,7 +26,7 @@ ```bash # Для получения следующей страницы используйте cursor из meta.paginate.next_page -curl "https://api.pachca.com/api/shared/v1/chats?sort[id]=desc&availability=is_member&last_message_at_after=2025-01-01T00:00:00.000Z&last_message_at_before=2025-02-01T00:00:00.000Z&personal=false&limit=1" \ +curl "https://api.pachca.com/api/shared/v1/chats?sort=id&order=desc&availability=is_member&last_message_at_after=2025-01-01T00:00:00.000Z&last_message_at_before=2025-02-01T00:00:00.000Z&personal=false&limit=1" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" ``` diff --git a/apps/docs/public/api/messages/list.md b/apps/docs/public/api/messages/list.md index 4e4327d8..28ad2acc 100644 --- a/apps/docs/public/api/messages/list.md +++ b/apps/docs/public/api/messages/list.md @@ -15,7 +15,8 @@ ### Query параметры - `chat_id: integer, int32` (required) — Идентификатор чата (беседа, канал, диалог или чат треда) -- `sort[{field}]: string` (default: desc) — Составной параметр сортировки сущностей выборки +- `sort: string` (default: id) — Поле сортировки +- `order: string` (default: desc) — Направление сортировки - `limit: integer, int32` (default: 50) — Количество возвращаемых сущностей за один запрос - `cursor: string` — Курсор для пагинации (из `meta.paginate.next_page`) @@ -24,7 +25,7 @@ ```bash # Для получения следующей страницы используйте cursor из meta.paginate.next_page -curl "https://api.pachca.com/api/shared/v1/messages?chat_id=198&sort[id]=desc&limit=1" \ +curl "https://api.pachca.com/api/shared/v1/messages?chat_id=198&sort=id&order=desc&limit=1" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" ``` diff --git a/apps/docs/public/api/models.md b/apps/docs/public/api/models.md index 668d3749..0ee247d2 100644 --- a/apps/docs/public/api/models.md +++ b/apps/docs/public/api/models.md @@ -3,7 +3,7 @@ Все модели данных, возвращаемые в ответах API. Каждая модель содержит связанные методы и таблицу свойств. -> Методы [Получение подписи](POST /uploads) и [Загрузка файла](POST /direct_url) не возвращают модели данных. +> Методы [Получение подписи](POST /uploads), [Загрузка файла](POST /direct_url), [Загрузка аватара](PUT /profile/avatar), [Удаление аватара](DELETE /profile/avatar), [Загрузка аватара сотрудника](PUT /users/{user_id}/avatar) и [Удаление аватара сотрудника](DELETE /users/{user_id}/avatar) не возвращают модели данных. ## Дополнительное поле diff --git a/apps/docs/public/api/profile/delete-avatar.md b/apps/docs/public/api/profile/delete-avatar.md new file mode 100644 index 00000000..6b4418b6 --- /dev/null +++ b/apps/docs/public/api/profile/delete-avatar.md @@ -0,0 +1,103 @@ +# Удаление аватара + +**Метод**: `DELETE` + +**Путь**: `/profile/avatar` + +> **Скоуп:** `profile_avatar:write` + +Метод для удаления аватара своего профиля. + +## Пример запроса + +```bash +curl -X DELETE "https://api.pachca.com/api/shared/v1/profile/avatar" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" +``` + +## Ответы + +### 204: There is no content to send for this request, but the headers may be useful. + +### 401: Access is unauthorized. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + +### 402: Client error + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + +### 403: Access is forbidden. + +**Схема ответа при ошибке:** + +**anyOf** - один из вариантов: + +- **ApiError**: Ошибка API (используется для 400, 402, 403, 404, 409, 410, 422) + - `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` +- **OAuthError**: Ошибка OAuth авторизации (используется для 401 и 403) + - `error: string` (required) — Код ошибки + - `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + diff --git a/apps/docs/public/api/profile/update-avatar.md b/apps/docs/public/api/profile/update-avatar.md new file mode 100644 index 00000000..120c3c2a --- /dev/null +++ b/apps/docs/public/api/profile/update-avatar.md @@ -0,0 +1,152 @@ +# Загрузка аватара + +**Метод**: `PUT` + +**Путь**: `/profile/avatar` + +> **Скоуп:** `profile_avatar:write` + +Метод для загрузки или обновления аватара своего профиля. Файл передается в формате `multipart/form-data`. + +## Тело запроса + + +## Пример запроса + +```bash +curl -X PUT "https://api.pachca.com/api/shared/v1/profile/avatar" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ + -F "image=@filename.png" +``` + +## Ответы + +### 200: The request has succeeded. + +**Схема ответа:** + +- `data: object` (required) — Данные аватара + - `image_url: string` (required) — URL аватара + +**Пример ответа:** + +```json +{ + "data": { + "image_url": "https://pachca-prod.s3.amazonaws.com/uploads/0001/0001/image.jpg" + } +} +``` + +### 401: Access is unauthorized. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + +### 402: Client error + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + +### 403: Access is forbidden. + +**Схема ответа при ошибке:** + +**anyOf** - один из вариантов: + +- **ApiError**: Ошибка API (используется для 400, 402, 403, 404, 409, 410, 422) + - `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` +- **OAuthError**: Ошибка OAuth авторизации (используется для 401 и 403) + - `error: string` (required) — Код ошибки + - `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + +### 422: Client error + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + diff --git a/apps/docs/public/api/users/remove-avatar.md b/apps/docs/public/api/users/remove-avatar.md new file mode 100644 index 00000000..02549d6c --- /dev/null +++ b/apps/docs/public/api/users/remove-avatar.md @@ -0,0 +1,140 @@ +# Удаление аватара сотрудника + +**Метод**: `DELETE` + +**Путь**: `/users/{user_id}/avatar` + +> **Скоуп:** `user_avatar:write` + +Метод для удаления аватара сотрудника. + +## Параметры + +### Path параметры + +- `user_id: integer, int32` (required) — Идентификатор пользователя + + +## Пример запроса + +```bash +curl -X DELETE "https://api.pachca.com/api/shared/v1/users/12/avatar" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" +``` + +## Ответы + +### 204: There is no content to send for this request, but the headers may be useful. + +### 401: Access is unauthorized. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + +### 402: Client error + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + +### 403: Access is forbidden. + +**Схема ответа при ошибке:** + +**anyOf** - один из вариантов: + +- **ApiError**: Ошибка API (используется для 400, 402, 403, 404, 409, 410, 422) + - `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` +- **OAuthError**: Ошибка OAuth авторизации (используется для 401 и 403) + - `error: string` (required) — Код ошибки + - `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + +### 404: The server cannot find the requested resource. + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + diff --git a/apps/docs/public/api/users/update-avatar.md b/apps/docs/public/api/users/update-avatar.md new file mode 100644 index 00000000..292ead33 --- /dev/null +++ b/apps/docs/public/api/users/update-avatar.md @@ -0,0 +1,189 @@ +# Загрузка аватара сотрудника + +**Метод**: `PUT` + +**Путь**: `/users/{user_id}/avatar` + +> **Скоуп:** `user_avatar:write` + +Метод для загрузки или обновления аватара сотрудника. Файл передается в формате `multipart/form-data`. + +## Параметры + +### Path параметры + +- `user_id: integer, int32` (required) — Идентификатор пользователя + + +## Тело запроса + + +## Пример запроса + +```bash +curl -X PUT "https://api.pachca.com/api/shared/v1/users/12/avatar" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ + -F "image=@filename.png" +``` + +## Ответы + +### 200: The request has succeeded. + +**Схема ответа:** + +- `data: object` (required) — Данные аватара + - `image_url: string` (required) — URL аватара + +**Пример ответа:** + +```json +{ + "data": { + "image_url": "https://pachca-prod.s3.amazonaws.com/uploads/0001/0001/image.jpg" + } +} +``` + +### 401: Access is unauthorized. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + +### 402: Client error + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + +### 403: Access is forbidden. + +**Схема ответа при ошибке:** + +**anyOf** - один из вариантов: + +- **ApiError**: Ошибка API (используется для 400, 402, 403, 404, 409, 410, 422) + - `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` +- **OAuthError**: Ошибка OAuth авторизации (используется для 401 и 403) + - `error: string` (required) — Код ошибки + - `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + +### 404: The server cannot find the requested resource. + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + +### 422: Client error + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + diff --git a/apps/docs/public/guides/cli.md b/apps/docs/public/guides/cli.md index 08fcd781..f996d69d 100644 --- a/apps/docs/public/guides/cli.md +++ b/apps/docs/public/guides/cli.md @@ -132,15 +132,19 @@ dev.pachca.com/api/members/add → pachca members add | `pachca profile get-info` | Информация о токене | | `pachca profile get` | Информация о профиле | | `pachca profile get-status` | Текущий статус | +| `pachca profile update-avatar` | Загрузка аватара | | `pachca profile update-status` | Новый статус | +| `pachca profile delete-avatar` | Удаление аватара | | `pachca profile delete-status` | Удаление статуса | | `pachca users create` | Создать сотрудника | | `pachca users list` | Список сотрудников | | `pachca users get` | Информация о сотруднике | | `pachca users get-status` | Статус сотрудника | | `pachca users update` | Редактирование сотрудника | +| `pachca users update-avatar` | Загрузка аватара сотрудника | | `pachca users update-status` | Новый статус сотрудника | | `pachca users delete` | Удаление сотрудника | +| `pachca users remove-avatar` | Удаление аватара сотрудника | | `pachca users remove-status` | Удаление статуса сотрудника | | `pachca group-tags create` | Новый тег | | `pachca group-tags list` | Список тегов сотрудников | diff --git a/apps/docs/public/guides/n8n/advanced.md b/apps/docs/public/guides/n8n/advanced.md index a4a91234..124da1d4 100644 --- a/apps/docs/public/guides/n8n/advanced.md +++ b/apps/docs/public/guides/n8n/advanced.md @@ -28,6 +28,22 @@ Подробнее — в [документации загрузки файлов](/api/file-uploads). +--- + +## Загрузка аватара + +Операции **Update Avatar** для ресурсов **Profile** и **User** позволяют загружать аватар через `multipart/form-data`. + +**Как использовать:** + +1. **HTTP Request** или **Read Binary File** — загрузите изображение в бинарное свойство (по умолчанию `data`) +2. **Pachca** (Profile > Update Avatar или User > Update Avatar) — в поле **Input Binary Field** укажите имя бинарного свойства + +Для удаления аватара используйте операцию **Delete Avatar** — она не требует параметров (для User — только `userId`). + +> Операции с аватарами сотрудников (User > Update/Delete Avatar) требуют прав администратора. + + --- ## Экспорт сообщений diff --git a/apps/docs/public/guides/n8n/resources.md b/apps/docs/public/guides/n8n/resources.md index 04ba0ab8..73d6f2bc 100644 --- a/apps/docs/public/guides/n8n/resources.md +++ b/apps/docs/public/guides/n8n/resources.md @@ -22,11 +22,11 @@ | 1 | [Message](#message) | 7 | Сообщения: создание, редактирование, удаление, закрепление | | | 2 | [Chat](#chat) | 6 | Чаты: создание, обновление, архивация | | | 3 | [Chat Member](#chat-member) | 7 | Участники чата: добавление, удаление, роли, теги | да | -| 4 | [User](#user) | 8 | Сотрудники: CRUD, статус | | +| 4 | [User](#user) | 10 | Сотрудники: CRUD, аватар, статус | | | 5 | [Group Tag](#group-tag) | 6 | Теги сотрудников: CRUD, список пользователей | | | 6 | [Thread](#thread) | 2 | Треды: создание, получение | | | 7 | [Reaction](#reaction) | 3 | Реакции: создание, удаление, список | | -| 8 | [Profile](#profile) | 5 | Мой профиль: информация, статус | | +| 8 | [Profile](#profile) | 7 | Мой профиль: информация, аватар, статус | | | 9 | [Task](#task) | 5 | Задачи: полный CRUD | | | 10 | [Bot](#bot) | 3 | Боты: обновление, события, удаление событий | | | 11 | [File](#file) | 1 | Загрузка файлов через S3 | | @@ -59,6 +59,8 @@ **Ключевые параметры Create:** `entityId` (ID чата или пользователя), `content` (текст, Markdown), `entityType` (discussion, user, thread), `files`, `buttons`, `parentMessageId`. +**Сортировка в Get Many:** параметры `sort` (по умолчанию `id`) и `order` (`asc` / `desc`) определяют порядок выдачи сообщений. + ![Настройка Message Get Many с Entity ID и Return All](/images/n8n/message-get-many.avif) *Настройка Message → Get Many* @@ -79,6 +81,8 @@ | Archive | [Архивация чата](PUT /chats/{id}/archive) | | Unarchive | [Разархивация чата](PUT /chats/{id}/unarchive) | +**Сортировка в Get Many:** параметры `sort` (`id` или `last_message_at`) и `order` (`asc` / `desc`). Также доступны фильтры `availability`, `lastMessageAtAfter`, `lastMessageAtBefore`. + --- ## Chat Member @@ -111,6 +115,8 @@ | Get | [Информация о сотруднике](GET /users/{id}) | | Update | [Обновление сотрудника](PUT /users/{id}) | | Delete | [Удаление сотрудника](DELETE /users/{id}) | +| Update Avatar | [Обновление аватара](PUT /users/{user_id}/avatar) | +| Delete Avatar | [Удаление аватара](DELETE /users/{user_id}/avatar) | | Get Status | [Получение статуса](GET /users/{user_id}/status) | | Update Status | [Обновление статуса](PUT /users/{user_id}/status) | | Delete Status | [Удаление статуса](DELETE /users/{user_id}/status) | @@ -163,10 +169,14 @@ |----------|-----| | Get | [Информация о профиле](GET /profile) | | Get Info | [Информация о токене](GET /oauth/token/info) | +| Update Avatar | [Обновление аватара](PUT /profile/avatar) | +| Delete Avatar | [Удаление аватара](DELETE /profile/avatar) | | Get Status | [Получение статуса](GET /profile/status) | | Update Status | [Обновление статуса](PUT /profile/status) | | Delete Status | [Удаление статуса](DELETE /profile/status) | +**Загрузка аватара:** операция Update Avatar принимает бинарные данные из предыдущего узла (например, HTTP Request или Read Binary File). В поле **Input Binary Field** укажите имя бинарного свойства (по умолчанию `data`). + --- ## Task diff --git a/apps/docs/public/guides/sdk/csharp.md b/apps/docs/public/guides/sdk/csharp.md index 6d9a19b7..825ce660 100644 --- a/apps/docs/public/guides/sdk/csharp.md +++ b/apps/docs/public/guides/sdk/csharp.md @@ -69,15 +69,19 @@ using var client = new PachcaClient("YOUR_TOKEN", "https://custom-api.example.co | `client.Profile.GetTokenInfoAsync()` | [Информация о токене](/api/profile/get-info) | | `client.Profile.GetProfileAsync()` | [Информация о профиле](/api/profile/get) | | `client.Profile.GetStatusAsync()` | [Текущий статус](/api/profile/get-status) | +| `client.Profile.UpdateProfileAvatarAsync()` | [Загрузка аватара](/api/profile/update-avatar) | | `client.Profile.UpdateStatusAsync()` | [Новый статус](/api/profile/update-status) | +| `client.Profile.DeleteProfileAvatarAsync()` | [Удаление аватара](/api/profile/delete-avatar) | | `client.Profile.DeleteStatusAsync()` | [Удаление статуса](/api/profile/delete-status) | | `client.Users.CreateUserAsync()` | [Создать сотрудника](/api/users/create) | | `client.Users.ListUsersAsync()` | [Список сотрудников](/api/users/list) | | `client.Users.GetUserAsync()` | [Информация о сотруднике](/api/users/get) | | `client.Users.GetUserStatusAsync()` | [Статус сотрудника](/api/users/get-status) | | `client.Users.UpdateUserAsync()` | [Редактирование сотрудника](/api/users/update) | +| `client.Users.UpdateUserAvatarAsync()` | [Загрузка аватара сотрудника](/api/users/update-avatar) | | `client.Users.UpdateUserStatusAsync()` | [Новый статус сотрудника](/api/users/update-status) | | `client.Users.DeleteUserAsync()` | [Удаление сотрудника](/api/users/delete) | +| `client.Users.DeleteUserAvatarAsync()` | [Удаление аватара сотрудника](/api/users/remove-avatar) | | `client.Users.DeleteUserStatusAsync()` | [Удаление статуса сотрудника](/api/users/remove-status) | | `client.GroupTags.CreateTagAsync()` | [Новый тег](/api/group-tags/create) | | `client.GroupTags.ListTagsAsync()` | [Список тегов сотрудников](/api/group-tags/list) | @@ -137,7 +141,7 @@ using var client = new PachcaClient("YOUR_TOKEN", "https://custom-api.example.co using Pachca.Sdk; // Список чатов -var response = await client.Chats.ListChatsAsync(SortOrder.Desc, ChatAvailability.IsMember, DateTimeOffset.Parse("2025-01-01T00:00:00.000Z"), DateTimeOffset.Parse("2025-02-01T00:00:00.000Z"), false, 1, "eyJpZCI6MTAsImRpciI6ImFzYyJ9"); +var response = await client.Chats.ListChatsAsync(ChatSortField.Id, SortOrder.Desc, ChatAvailability.IsMember, DateTimeOffset.Parse("2025-01-01T00:00:00.000Z"), DateTimeOffset.Parse("2025-02-01T00:00:00.000Z"), false, 1, "eyJpZCI6MTAsImRpciI6ImFzYyJ9"); // → ListChatsResponse(Data: List, Meta: PaginationMeta) ``` diff --git a/apps/docs/public/guides/sdk/go.md b/apps/docs/public/guides/sdk/go.md index 508efeff..697d7fc8 100644 --- a/apps/docs/public/guides/sdk/go.md +++ b/apps/docs/public/guides/sdk/go.md @@ -76,15 +76,19 @@ user, err := client.Profile.GetProfile(ctx) | `client.Profile.GetTokenInfo()` | [Информация о токене](/api/profile/get-info) | | `client.Profile.GetProfile()` | [Информация о профиле](/api/profile/get) | | `client.Profile.GetStatus()` | [Текущий статус](/api/profile/get-status) | +| `client.Profile.UpdateProfileAvatar()` | [Загрузка аватара](/api/profile/update-avatar) | | `client.Profile.UpdateStatus()` | [Новый статус](/api/profile/update-status) | +| `client.Profile.DeleteProfileAvatar()` | [Удаление аватара](/api/profile/delete-avatar) | | `client.Profile.DeleteStatus()` | [Удаление статуса](/api/profile/delete-status) | | `client.Users.CreateUser()` | [Создать сотрудника](/api/users/create) | | `client.Users.ListUsers()` | [Список сотрудников](/api/users/list) | | `client.Users.GetUser()` | [Информация о сотруднике](/api/users/get) | | `client.Users.GetUserStatus()` | [Статус сотрудника](/api/users/get-status) | | `client.Users.UpdateUser()` | [Редактирование сотрудника](/api/users/update) | +| `client.Users.UpdateUserAvatar()` | [Загрузка аватара сотрудника](/api/users/update-avatar) | | `client.Users.UpdateUserStatus()` | [Новый статус сотрудника](/api/users/update-status) | | `client.Users.DeleteUser()` | [Удаление сотрудника](/api/users/delete) | +| `client.Users.DeleteUserAvatar()` | [Удаление аватара сотрудника](/api/users/remove-avatar) | | `client.Users.DeleteUserStatus()` | [Удаление статуса сотрудника](/api/users/remove-status) | | `client.GroupTags.CreateTag()` | [Новый тег](/api/group-tags/create) | | `client.GroupTags.ListTags()` | [Список тегов сотрудников](/api/group-tags/list) | @@ -145,7 +149,8 @@ import pachca "github.com/pachca/openapi/sdk/go/generated" // Список чатов params := &ListChatsParams{ - SortID: Ptr(SortOrderDesc), + Sort: Ptr(ChatSortFieldID), + Order: Ptr(SortOrderDesc), Availability: Ptr(ChatAvailabilityIsMember), LastMessageAtAfter: Ptr("2025-01-01T00:00:00.000Z"), LastMessageAtBefore: Ptr("2025-02-01T00:00:00.000Z"), diff --git a/apps/docs/public/guides/sdk/kotlin.md b/apps/docs/public/guides/sdk/kotlin.md index 7de11adb..0f24ff51 100644 --- a/apps/docs/public/guides/sdk/kotlin.md +++ b/apps/docs/public/guides/sdk/kotlin.md @@ -84,15 +84,19 @@ client.close() | `client.profile.getTokenInfo()` | [Информация о токене](/api/profile/get-info) | | `client.profile.getProfile()` | [Информация о профиле](/api/profile/get) | | `client.profile.getStatus()` | [Текущий статус](/api/profile/get-status) | +| `client.profile.updateProfileAvatar()` | [Загрузка аватара](/api/profile/update-avatar) | | `client.profile.updateStatus()` | [Новый статус](/api/profile/update-status) | +| `client.profile.deleteProfileAvatar()` | [Удаление аватара](/api/profile/delete-avatar) | | `client.profile.deleteStatus()` | [Удаление статуса](/api/profile/delete-status) | | `client.users.createUser()` | [Создать сотрудника](/api/users/create) | | `client.users.listUsers()` | [Список сотрудников](/api/users/list) | | `client.users.getUser()` | [Информация о сотруднике](/api/users/get) | | `client.users.getUserStatus()` | [Статус сотрудника](/api/users/get-status) | | `client.users.updateUser()` | [Редактирование сотрудника](/api/users/update) | +| `client.users.updateUserAvatar()` | [Загрузка аватара сотрудника](/api/users/update-avatar) | | `client.users.updateUserStatus()` | [Новый статус сотрудника](/api/users/update-status) | | `client.users.deleteUser()` | [Удаление сотрудника](/api/users/delete) | +| `client.users.deleteUserAvatar()` | [Удаление аватара сотрудника](/api/users/remove-avatar) | | `client.users.deleteUserStatus()` | [Удаление статуса сотрудника](/api/users/remove-status) | | `client.groupTags.createTag()` | [Новый тег](/api/group-tags/create) | | `client.groupTags.listTags()` | [Список тегов сотрудников](/api/group-tags/list) | @@ -150,10 +154,11 @@ client.close() ```kotlin import com.pachca.sdk.ChatAvailability +import com.pachca.sdk.ChatSortField import com.pachca.sdk.SortOrder // Список чатов -val response = client.chats.listChats(sortId = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = "2025-01-01T00:00:00.000Z", lastMessageAtBefore = "2025-02-01T00:00:00.000Z", personal = false, limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") +val response = client.chats.listChats(sort = ChatSortField.ID, order = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = "2025-01-01T00:00:00.000Z", lastMessageAtBefore = "2025-02-01T00:00:00.000Z", personal = false, limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") // → ListChatsResponse(data: List, meta: PaginationMeta) ``` diff --git a/apps/docs/public/guides/sdk/python.md b/apps/docs/public/guides/sdk/python.md index 9c082809..8052a539 100644 --- a/apps/docs/public/guides/sdk/python.md +++ b/apps/docs/public/guides/sdk/python.md @@ -74,15 +74,19 @@ await client.close() | `client.profile.get_token_info()` | [Информация о токене](/api/profile/get-info) | | `client.profile.get_profile()` | [Информация о профиле](/api/profile/get) | | `client.profile.get_status()` | [Текущий статус](/api/profile/get-status) | +| `client.profile.update_profile_avatar()` | [Загрузка аватара](/api/profile/update-avatar) | | `client.profile.update_status()` | [Новый статус](/api/profile/update-status) | +| `client.profile.delete_profile_avatar()` | [Удаление аватара](/api/profile/delete-avatar) | | `client.profile.delete_status()` | [Удаление статуса](/api/profile/delete-status) | | `client.users.create_user()` | [Создать сотрудника](/api/users/create) | | `client.users.list_users()` | [Список сотрудников](/api/users/list) | | `client.users.get_user()` | [Информация о сотруднике](/api/users/get) | | `client.users.get_user_status()` | [Статус сотрудника](/api/users/get-status) | | `client.users.update_user()` | [Редактирование сотрудника](/api/users/update) | +| `client.users.update_user_avatar()` | [Загрузка аватара сотрудника](/api/users/update-avatar) | | `client.users.update_user_status()` | [Новый статус сотрудника](/api/users/update-status) | | `client.users.delete_user()` | [Удаление сотрудника](/api/users/delete) | +| `client.users.delete_user_avatar()` | [Удаление аватара сотрудника](/api/users/remove-avatar) | | `client.users.delete_user_status()` | [Удаление статуса сотрудника](/api/users/remove-status) | | `client.group_tags.create_tag()` | [Новый тег](/api/group-tags/create) | | `client.group_tags.list_tags()` | [Список тегов сотрудников](/api/group-tags/list) | @@ -139,11 +143,12 @@ await client.close() **GET с параметрами:** ```python -from pachca.models import ChatAvailability, ListChatsParams, SortOrder +from pachca.models import ChatAvailability, ChatSortField, ListChatsParams, SortOrder # Список чатов params = ListChatsParams( - sort_id=SortOrder.DESC, + sort=ChatSortField.ID, + order=SortOrder.DESC, availability=ChatAvailability.IS_MEMBER, last_message_at_after="2025-01-01T00:00:00.000Z", last_message_at_before="2025-02-01T00:00:00.000Z", diff --git a/apps/docs/public/guides/sdk/swift.md b/apps/docs/public/guides/sdk/swift.md index c5c616b3..8dea1e77 100644 --- a/apps/docs/public/guides/sdk/swift.md +++ b/apps/docs/public/guides/sdk/swift.md @@ -75,15 +75,19 @@ let client = PachcaClient(token: "YOUR_TOKEN", baseURL: "https://custom-api.exam | `client.profile.getTokenInfo()` | [Информация о токене](/api/profile/get-info) | | `client.profile.getProfile()` | [Информация о профиле](/api/profile/get) | | `client.profile.getStatus()` | [Текущий статус](/api/profile/get-status) | +| `client.profile.updateProfileAvatar()` | [Загрузка аватара](/api/profile/update-avatar) | | `client.profile.updateStatus()` | [Новый статус](/api/profile/update-status) | +| `client.profile.deleteProfileAvatar()` | [Удаление аватара](/api/profile/delete-avatar) | | `client.profile.deleteStatus()` | [Удаление статуса](/api/profile/delete-status) | | `client.users.createUser()` | [Создать сотрудника](/api/users/create) | | `client.users.listUsers()` | [Список сотрудников](/api/users/list) | | `client.users.getUser()` | [Информация о сотруднике](/api/users/get) | | `client.users.getUserStatus()` | [Статус сотрудника](/api/users/get-status) | | `client.users.updateUser()` | [Редактирование сотрудника](/api/users/update) | +| `client.users.updateUserAvatar()` | [Загрузка аватара сотрудника](/api/users/update-avatar) | | `client.users.updateUserStatus()` | [Новый статус сотрудника](/api/users/update-status) | | `client.users.deleteUser()` | [Удаление сотрудника](/api/users/delete) | +| `client.users.deleteUserAvatar()` | [Удаление аватара сотрудника](/api/users/remove-avatar) | | `client.users.deleteUserStatus()` | [Удаление статуса сотрудника](/api/users/remove-status) | | `client.groupTags.createTag()` | [Новый тег](/api/group-tags/create) | | `client.groupTags.listTags()` | [Список тегов сотрудников](/api/group-tags/list) | @@ -143,7 +147,7 @@ let client = PachcaClient(token: "YOUR_TOKEN", baseURL: "https://custom-api.exam import PachcaSDK // Список чатов -let response = try await client.chats.listChats(sortId: .desc, availability: .isMember, lastMessageAtAfter: "2025-01-01T00:00:00.000Z", lastMessageAtBefore: "2025-02-01T00:00:00.000Z", personal: false, limit: 1, cursor: "eyJpZCI6MTAsImRpciI6ImFzYyJ9") +let response = try await client.chats.listChats(sort: .id, order: .desc, availability: .isMember, lastMessageAtAfter: "2025-01-01T00:00:00.000Z", lastMessageAtBefore: "2025-02-01T00:00:00.000Z", personal: false, limit: 1, cursor: "eyJpZCI6MTAsImRpciI6ImFzYyJ9") // → ListChatsResponse(data: [Chat], meta: PaginationMeta) ``` diff --git a/apps/docs/public/guides/sdk/typescript.md b/apps/docs/public/guides/sdk/typescript.md index 1e46d9cd..78fc4506 100644 --- a/apps/docs/public/guides/sdk/typescript.md +++ b/apps/docs/public/guides/sdk/typescript.md @@ -67,15 +67,19 @@ const client = new PachcaClient("YOUR_TOKEN", "https://custom-api.example.com/ap | `client.profile.getTokenInfo()` | [Информация о токене](/api/profile/get-info) | | `client.profile.getProfile()` | [Информация о профиле](/api/profile/get) | | `client.profile.getStatus()` | [Текущий статус](/api/profile/get-status) | +| `client.profile.updateProfileAvatar()` | [Загрузка аватара](/api/profile/update-avatar) | | `client.profile.updateStatus()` | [Новый статус](/api/profile/update-status) | +| `client.profile.deleteProfileAvatar()` | [Удаление аватара](/api/profile/delete-avatar) | | `client.profile.deleteStatus()` | [Удаление статуса](/api/profile/delete-status) | | `client.users.createUser()` | [Создать сотрудника](/api/users/create) | | `client.users.listUsers()` | [Список сотрудников](/api/users/list) | | `client.users.getUser()` | [Информация о сотруднике](/api/users/get) | | `client.users.getUserStatus()` | [Статус сотрудника](/api/users/get-status) | | `client.users.updateUser()` | [Редактирование сотрудника](/api/users/update) | +| `client.users.updateUserAvatar()` | [Загрузка аватара сотрудника](/api/users/update-avatar) | | `client.users.updateUserStatus()` | [Новый статус сотрудника](/api/users/update-status) | | `client.users.deleteUser()` | [Удаление сотрудника](/api/users/delete) | +| `client.users.deleteUserAvatar()` | [Удаление аватара сотрудника](/api/users/remove-avatar) | | `client.users.deleteUserStatus()` | [Удаление статуса сотрудника](/api/users/remove-status) | | `client.groupTags.createTag()` | [Новый тег](/api/group-tags/create) | | `client.groupTags.listTags()` | [Список тегов сотрудников](/api/group-tags/list) | @@ -132,11 +136,12 @@ const client = new PachcaClient("YOUR_TOKEN", "https://custom-api.example.com/ap **GET с параметрами:** ```typescript -import { ChatAvailability, SortOrder } from "@pachca/sdk" +import { ChatAvailability, ChatSortField, SortOrder } from "@pachca/sdk" // Список чатов const response = client.chats.listChats({ - sortId: SortOrder.Desc, + sort: ChatSortField.Id, + order: SortOrder.Desc, availability: ChatAvailability.IsMember, lastMessageAtAfter: "2025-01-01T00:00:00.000Z", lastMessageAtBefore: "2025-02-01T00:00:00.000Z", diff --git a/apps/docs/public/guides/workflows.md b/apps/docs/public/guides/workflows.md index 6bf3f358..ffec4a40 100644 --- a/apps/docs/public/guides/workflows.md +++ b/apps/docs/public/guides/workflows.md @@ -37,6 +37,14 @@ > Кастомные поля настраиваются администратором пространства. +**Загрузить аватар профиля** + +1. Загрузи аватар из файла + +**Удалить аватар профиля** + +1. Удали аватар + ### pachca-users **Получить сотрудника по ID** @@ -85,6 +93,14 @@ 2. Установить статус 3. Удалить статус +**Загрузить аватар сотрудника** + +1. Загрузи аватар сотруднику + +**Удалить аватар сотрудника** + +1. Удали аватар сотрудника + ### pachca-chats **Создать канал и пригласить участников** diff --git a/apps/docs/public/llms-full.txt b/apps/docs/public/llms-full.txt index 8041c84b..8b963c29 100644 --- a/apps/docs/public/llms-full.txt +++ b/apps/docs/public/llms-full.txt @@ -602,15 +602,19 @@ dev.pachca.com/api/members/add → pachca members add | `pachca profile get-info` | Информация о токене | | `pachca profile get` | Информация о профиле | | `pachca profile get-status` | Текущий статус | +| `pachca profile update-avatar` | Загрузка аватара | | `pachca profile update-status` | Новый статус | +| `pachca profile delete-avatar` | Удаление аватара | | `pachca profile delete-status` | Удаление статуса | | `pachca users create` | Создать сотрудника | | `pachca users list` | Список сотрудников | | `pachca users get` | Информация о сотруднике | | `pachca users get-status` | Статус сотрудника | | `pachca users update` | Редактирование сотрудника | +| `pachca users update-avatar` | Загрузка аватара сотрудника | | `pachca users update-status` | Новый статус сотрудника | | `pachca users delete` | Удаление сотрудника | +| `pachca users remove-avatar` | Удаление аватара сотрудника | | `pachca users remove-status` | Удаление статуса сотрудника | | `pachca group-tags create` | Новый тег | | `pachca group-tags list` | Список тегов сотрудников | @@ -1242,15 +1246,19 @@ const client = new PachcaClient("YOUR_TOKEN", "https://custom-api.example.com/ap | `client.profile.getTokenInfo()` | [Информация о токене](/api/profile/get-info) | | `client.profile.getProfile()` | [Информация о профиле](/api/profile/get) | | `client.profile.getStatus()` | [Текущий статус](/api/profile/get-status) | +| `client.profile.updateProfileAvatar()` | [Загрузка аватара](/api/profile/update-avatar) | | `client.profile.updateStatus()` | [Новый статус](/api/profile/update-status) | +| `client.profile.deleteProfileAvatar()` | [Удаление аватара](/api/profile/delete-avatar) | | `client.profile.deleteStatus()` | [Удаление статуса](/api/profile/delete-status) | | `client.users.createUser()` | [Создать сотрудника](/api/users/create) | | `client.users.listUsers()` | [Список сотрудников](/api/users/list) | | `client.users.getUser()` | [Информация о сотруднике](/api/users/get) | | `client.users.getUserStatus()` | [Статус сотрудника](/api/users/get-status) | | `client.users.updateUser()` | [Редактирование сотрудника](/api/users/update) | +| `client.users.updateUserAvatar()` | [Загрузка аватара сотрудника](/api/users/update-avatar) | | `client.users.updateUserStatus()` | [Новый статус сотрудника](/api/users/update-status) | | `client.users.deleteUser()` | [Удаление сотрудника](/api/users/delete) | +| `client.users.deleteUserAvatar()` | [Удаление аватара сотрудника](/api/users/remove-avatar) | | `client.users.deleteUserStatus()` | [Удаление статуса сотрудника](/api/users/remove-status) | | `client.groupTags.createTag()` | [Новый тег](/api/group-tags/create) | | `client.groupTags.listTags()` | [Список тегов сотрудников](/api/group-tags/list) | @@ -1307,11 +1315,12 @@ const client = new PachcaClient("YOUR_TOKEN", "https://custom-api.example.com/ap **GET с параметрами:** ```typescript -import { ChatAvailability, SortOrder } from "@pachca/sdk" +import { ChatAvailability, ChatSortField, SortOrder } from "@pachca/sdk" // Список чатов const response = client.chats.listChats({ - sortId: SortOrder.Desc, + sort: ChatSortField.Id, + order: SortOrder.Desc, availability: ChatAvailability.IsMember, lastMessageAtAfter: "2025-01-01T00:00:00.000Z", lastMessageAtBefore: "2025-02-01T00:00:00.000Z", @@ -1641,15 +1650,19 @@ await client.close() | `client.profile.get_token_info()` | [Информация о токене](/api/profile/get-info) | | `client.profile.get_profile()` | [Информация о профиле](/api/profile/get) | | `client.profile.get_status()` | [Текущий статус](/api/profile/get-status) | +| `client.profile.update_profile_avatar()` | [Загрузка аватара](/api/profile/update-avatar) | | `client.profile.update_status()` | [Новый статус](/api/profile/update-status) | +| `client.profile.delete_profile_avatar()` | [Удаление аватара](/api/profile/delete-avatar) | | `client.profile.delete_status()` | [Удаление статуса](/api/profile/delete-status) | | `client.users.create_user()` | [Создать сотрудника](/api/users/create) | | `client.users.list_users()` | [Список сотрудников](/api/users/list) | | `client.users.get_user()` | [Информация о сотруднике](/api/users/get) | | `client.users.get_user_status()` | [Статус сотрудника](/api/users/get-status) | | `client.users.update_user()` | [Редактирование сотрудника](/api/users/update) | +| `client.users.update_user_avatar()` | [Загрузка аватара сотрудника](/api/users/update-avatar) | | `client.users.update_user_status()` | [Новый статус сотрудника](/api/users/update-status) | | `client.users.delete_user()` | [Удаление сотрудника](/api/users/delete) | +| `client.users.delete_user_avatar()` | [Удаление аватара сотрудника](/api/users/remove-avatar) | | `client.users.delete_user_status()` | [Удаление статуса сотрудника](/api/users/remove-status) | | `client.group_tags.create_tag()` | [Новый тег](/api/group-tags/create) | | `client.group_tags.list_tags()` | [Список тегов сотрудников](/api/group-tags/list) | @@ -1706,11 +1719,12 @@ await client.close() **GET с параметрами:** ```python -from pachca.models import ChatAvailability, ListChatsParams, SortOrder +from pachca.models import ChatAvailability, ChatSortField, ListChatsParams, SortOrder # Список чатов params = ListChatsParams( - sort_id=SortOrder.DESC, + sort=ChatSortField.ID, + order=SortOrder.DESC, availability=ChatAvailability.IS_MEMBER, last_message_at_after="2025-01-01T00:00:00.000Z", last_message_at_before="2025-02-01T00:00:00.000Z", @@ -2030,15 +2044,19 @@ user, err := client.Profile.GetProfile(ctx) | `client.Profile.GetTokenInfo()` | [Информация о токене](/api/profile/get-info) | | `client.Profile.GetProfile()` | [Информация о профиле](/api/profile/get) | | `client.Profile.GetStatus()` | [Текущий статус](/api/profile/get-status) | +| `client.Profile.UpdateProfileAvatar()` | [Загрузка аватара](/api/profile/update-avatar) | | `client.Profile.UpdateStatus()` | [Новый статус](/api/profile/update-status) | +| `client.Profile.DeleteProfileAvatar()` | [Удаление аватара](/api/profile/delete-avatar) | | `client.Profile.DeleteStatus()` | [Удаление статуса](/api/profile/delete-status) | | `client.Users.CreateUser()` | [Создать сотрудника](/api/users/create) | | `client.Users.ListUsers()` | [Список сотрудников](/api/users/list) | | `client.Users.GetUser()` | [Информация о сотруднике](/api/users/get) | | `client.Users.GetUserStatus()` | [Статус сотрудника](/api/users/get-status) | | `client.Users.UpdateUser()` | [Редактирование сотрудника](/api/users/update) | +| `client.Users.UpdateUserAvatar()` | [Загрузка аватара сотрудника](/api/users/update-avatar) | | `client.Users.UpdateUserStatus()` | [Новый статус сотрудника](/api/users/update-status) | | `client.Users.DeleteUser()` | [Удаление сотрудника](/api/users/delete) | +| `client.Users.DeleteUserAvatar()` | [Удаление аватара сотрудника](/api/users/remove-avatar) | | `client.Users.DeleteUserStatus()` | [Удаление статуса сотрудника](/api/users/remove-status) | | `client.GroupTags.CreateTag()` | [Новый тег](/api/group-tags/create) | | `client.GroupTags.ListTags()` | [Список тегов сотрудников](/api/group-tags/list) | @@ -2099,7 +2117,8 @@ import pachca "github.com/pachca/openapi/sdk/go/generated" // Список чатов params := &ListChatsParams{ - SortID: Ptr(SortOrderDesc), + Sort: Ptr(ChatSortFieldID), + Order: Ptr(SortOrderDesc), Availability: Ptr(ChatAvailabilityIsMember), LastMessageAtAfter: Ptr("2025-01-01T00:00:00.000Z"), LastMessageAtBefore: Ptr("2025-02-01T00:00:00.000Z"), @@ -2451,15 +2470,19 @@ client.close() | `client.profile.getTokenInfo()` | [Информация о токене](/api/profile/get-info) | | `client.profile.getProfile()` | [Информация о профиле](/api/profile/get) | | `client.profile.getStatus()` | [Текущий статус](/api/profile/get-status) | +| `client.profile.updateProfileAvatar()` | [Загрузка аватара](/api/profile/update-avatar) | | `client.profile.updateStatus()` | [Новый статус](/api/profile/update-status) | +| `client.profile.deleteProfileAvatar()` | [Удаление аватара](/api/profile/delete-avatar) | | `client.profile.deleteStatus()` | [Удаление статуса](/api/profile/delete-status) | | `client.users.createUser()` | [Создать сотрудника](/api/users/create) | | `client.users.listUsers()` | [Список сотрудников](/api/users/list) | | `client.users.getUser()` | [Информация о сотруднике](/api/users/get) | | `client.users.getUserStatus()` | [Статус сотрудника](/api/users/get-status) | | `client.users.updateUser()` | [Редактирование сотрудника](/api/users/update) | +| `client.users.updateUserAvatar()` | [Загрузка аватара сотрудника](/api/users/update-avatar) | | `client.users.updateUserStatus()` | [Новый статус сотрудника](/api/users/update-status) | | `client.users.deleteUser()` | [Удаление сотрудника](/api/users/delete) | +| `client.users.deleteUserAvatar()` | [Удаление аватара сотрудника](/api/users/remove-avatar) | | `client.users.deleteUserStatus()` | [Удаление статуса сотрудника](/api/users/remove-status) | | `client.groupTags.createTag()` | [Новый тег](/api/group-tags/create) | | `client.groupTags.listTags()` | [Список тегов сотрудников](/api/group-tags/list) | @@ -2517,10 +2540,11 @@ client.close() ```kotlin import com.pachca.sdk.ChatAvailability +import com.pachca.sdk.ChatSortField import com.pachca.sdk.SortOrder // Список чатов -val response = client.chats.listChats(sortId = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = "2025-01-01T00:00:00.000Z", lastMessageAtBefore = "2025-02-01T00:00:00.000Z", personal = false, limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") +val response = client.chats.listChats(sort = ChatSortField.ID, order = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = "2025-01-01T00:00:00.000Z", lastMessageAtBefore = "2025-02-01T00:00:00.000Z", personal = false, limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") // → ListChatsResponse(data: List, meta: PaginationMeta) ``` @@ -2843,15 +2867,19 @@ let client = PachcaClient(token: "YOUR_TOKEN", baseURL: "https://custom-api.exam | `client.profile.getTokenInfo()` | [Информация о токене](/api/profile/get-info) | | `client.profile.getProfile()` | [Информация о профиле](/api/profile/get) | | `client.profile.getStatus()` | [Текущий статус](/api/profile/get-status) | +| `client.profile.updateProfileAvatar()` | [Загрузка аватара](/api/profile/update-avatar) | | `client.profile.updateStatus()` | [Новый статус](/api/profile/update-status) | +| `client.profile.deleteProfileAvatar()` | [Удаление аватара](/api/profile/delete-avatar) | | `client.profile.deleteStatus()` | [Удаление статуса](/api/profile/delete-status) | | `client.users.createUser()` | [Создать сотрудника](/api/users/create) | | `client.users.listUsers()` | [Список сотрудников](/api/users/list) | | `client.users.getUser()` | [Информация о сотруднике](/api/users/get) | | `client.users.getUserStatus()` | [Статус сотрудника](/api/users/get-status) | | `client.users.updateUser()` | [Редактирование сотрудника](/api/users/update) | +| `client.users.updateUserAvatar()` | [Загрузка аватара сотрудника](/api/users/update-avatar) | | `client.users.updateUserStatus()` | [Новый статус сотрудника](/api/users/update-status) | | `client.users.deleteUser()` | [Удаление сотрудника](/api/users/delete) | +| `client.users.deleteUserAvatar()` | [Удаление аватара сотрудника](/api/users/remove-avatar) | | `client.users.deleteUserStatus()` | [Удаление статуса сотрудника](/api/users/remove-status) | | `client.groupTags.createTag()` | [Новый тег](/api/group-tags/create) | | `client.groupTags.listTags()` | [Список тегов сотрудников](/api/group-tags/list) | @@ -2911,7 +2939,7 @@ let client = PachcaClient(token: "YOUR_TOKEN", baseURL: "https://custom-api.exam import PachcaSDK // Список чатов -let response = try await client.chats.listChats(sortId: .desc, availability: .isMember, lastMessageAtAfter: "2025-01-01T00:00:00.000Z", lastMessageAtBefore: "2025-02-01T00:00:00.000Z", personal: false, limit: 1, cursor: "eyJpZCI6MTAsImRpciI6ImFzYyJ9") +let response = try await client.chats.listChats(sort: .id, order: .desc, availability: .isMember, lastMessageAtAfter: "2025-01-01T00:00:00.000Z", lastMessageAtBefore: "2025-02-01T00:00:00.000Z", personal: false, limit: 1, cursor: "eyJpZCI6MTAsImRpciI6ImFzYyJ9") // → ListChatsResponse(data: [Chat], meta: PaginationMeta) ``` @@ -3210,15 +3238,19 @@ using var client = new PachcaClient("YOUR_TOKEN", "https://custom-api.example.co | `client.Profile.GetTokenInfoAsync()` | [Информация о токене](/api/profile/get-info) | | `client.Profile.GetProfileAsync()` | [Информация о профиле](/api/profile/get) | | `client.Profile.GetStatusAsync()` | [Текущий статус](/api/profile/get-status) | +| `client.Profile.UpdateProfileAvatarAsync()` | [Загрузка аватара](/api/profile/update-avatar) | | `client.Profile.UpdateStatusAsync()` | [Новый статус](/api/profile/update-status) | +| `client.Profile.DeleteProfileAvatarAsync()` | [Удаление аватара](/api/profile/delete-avatar) | | `client.Profile.DeleteStatusAsync()` | [Удаление статуса](/api/profile/delete-status) | | `client.Users.CreateUserAsync()` | [Создать сотрудника](/api/users/create) | | `client.Users.ListUsersAsync()` | [Список сотрудников](/api/users/list) | | `client.Users.GetUserAsync()` | [Информация о сотруднике](/api/users/get) | | `client.Users.GetUserStatusAsync()` | [Статус сотрудника](/api/users/get-status) | | `client.Users.UpdateUserAsync()` | [Редактирование сотрудника](/api/users/update) | +| `client.Users.UpdateUserAvatarAsync()` | [Загрузка аватара сотрудника](/api/users/update-avatar) | | `client.Users.UpdateUserStatusAsync()` | [Новый статус сотрудника](/api/users/update-status) | | `client.Users.DeleteUserAsync()` | [Удаление сотрудника](/api/users/delete) | +| `client.Users.DeleteUserAvatarAsync()` | [Удаление аватара сотрудника](/api/users/remove-avatar) | | `client.Users.DeleteUserStatusAsync()` | [Удаление статуса сотрудника](/api/users/remove-status) | | `client.GroupTags.CreateTagAsync()` | [Новый тег](/api/group-tags/create) | | `client.GroupTags.ListTagsAsync()` | [Список тегов сотрудников](/api/group-tags/list) | @@ -3278,7 +3310,7 @@ using var client = new PachcaClient("YOUR_TOKEN", "https://custom-api.example.co using Pachca.Sdk; // Список чатов -var response = await client.Chats.ListChatsAsync(SortOrder.Desc, ChatAvailability.IsMember, DateTimeOffset.Parse("2025-01-01T00:00:00.000Z"), DateTimeOffset.Parse("2025-02-01T00:00:00.000Z"), false, 1, "eyJpZCI6MTAsImRpciI6ImFzYyJ9"); +var response = await client.Chats.ListChatsAsync(ChatSortField.Id, SortOrder.Desc, ChatAvailability.IsMember, DateTimeOffset.Parse("2025-01-01T00:00:00.000Z"), DateTimeOffset.Parse("2025-02-01T00:00:00.000Z"), false, 1, "eyJpZCI6MTAsImRpciI6ImFzYyJ9"); // → ListChatsResponse(Data: List, Meta: PaginationMeta) ``` @@ -3612,6 +3644,14 @@ var response = await client.Tasks.CreateTaskAsync(request); > Кастомные поля настраиваются администратором пространства. +**Загрузить аватар профиля** + +1. Загрузи аватар из файла + +**Удалить аватар профиля** + +1. Удали аватар + ### pachca-users **Получить сотрудника по ID** @@ -3660,6 +3700,14 @@ var response = await client.Tasks.CreateTaskAsync(request); 2. Установить статус 3. Удалить статус +**Загрузить аватар сотрудника** + +1. Загрузи аватар сотруднику + +**Удалить аватар сотрудника** + +1. Удали аватар сотрудника + ### pachca-chats **Создать канал и пригласить участников** @@ -5785,11 +5833,11 @@ Workflow — визуальный редактор, в котором выстр | 1 | [Message](#message) | 7 | Сообщения: создание, редактирование, удаление, закрепление | | | 2 | [Chat](#chat) | 6 | Чаты: создание, обновление, архивация | | | 3 | [Chat Member](#chat-member) | 7 | Участники чата: добавление, удаление, роли, теги | да | -| 4 | [User](#user) | 8 | Сотрудники: CRUD, статус | | +| 4 | [User](#user) | 10 | Сотрудники: CRUD, аватар, статус | | | 5 | [Group Tag](#group-tag) | 6 | Теги сотрудников: CRUD, список пользователей | | | 6 | [Thread](#thread) | 2 | Треды: создание, получение | | | 7 | [Reaction](#reaction) | 3 | Реакции: создание, удаление, список | | -| 8 | [Profile](#profile) | 5 | Мой профиль: информация, статус | | +| 8 | [Profile](#profile) | 7 | Мой профиль: информация, аватар, статус | | | 9 | [Task](#task) | 5 | Задачи: полный CRUD | | | 10 | [Bot](#bot) | 3 | Боты: обновление, события, удаление событий | | | 11 | [File](#file) | 1 | Загрузка файлов через S3 | | @@ -5822,6 +5870,8 @@ Workflow — визуальный редактор, в котором выстр **Ключевые параметры Create:** `entityId` (ID чата или пользователя), `content` (текст, Markdown), `entityType` (discussion, user, thread), `files`, `buttons`, `parentMessageId`. +**Сортировка в Get Many:** параметры `sort` (по умолчанию `id`) и `order` (`asc` / `desc`) определяют порядок выдачи сообщений. + ![Настройка Message Get Many с Entity ID и Return All](/images/n8n/message-get-many.avif) *Настройка Message → Get Many* @@ -5842,6 +5892,8 @@ Workflow — визуальный редактор, в котором выстр | Archive | [Архивация чата](PUT /chats/{id}/archive) | | Unarchive | [Разархивация чата](PUT /chats/{id}/unarchive) | +**Сортировка в Get Many:** параметры `sort` (`id` или `last_message_at`) и `order` (`asc` / `desc`). Также доступны фильтры `availability`, `lastMessageAtAfter`, `lastMessageAtBefore`. + --- ## Chat Member @@ -5874,6 +5926,8 @@ Workflow — визуальный редактор, в котором выстр | Get | [Информация о сотруднике](GET /users/{id}) | | Update | [Обновление сотрудника](PUT /users/{id}) | | Delete | [Удаление сотрудника](DELETE /users/{id}) | +| Update Avatar | [Обновление аватара](PUT /users/{user_id}/avatar) | +| Delete Avatar | [Удаление аватара](DELETE /users/{user_id}/avatar) | | Get Status | [Получение статуса](GET /users/{user_id}/status) | | Update Status | [Обновление статуса](PUT /users/{user_id}/status) | | Delete Status | [Удаление статуса](DELETE /users/{user_id}/status) | @@ -5926,10 +5980,14 @@ Workflow — визуальный редактор, в котором выстр |----------|-----| | Get | [Информация о профиле](GET /profile) | | Get Info | [Информация о токене](GET /oauth/token/info) | +| Update Avatar | [Обновление аватара](PUT /profile/avatar) | +| Delete Avatar | [Удаление аватара](DELETE /profile/avatar) | | Get Status | [Получение статуса](GET /profile/status) | | Update Status | [Обновление статуса](PUT /profile/status) | | Delete Status | [Удаление статуса](DELETE /profile/status) | +**Загрузка аватара:** операция Update Avatar принимает бинарные данные из предыдущего узла (например, HTTP Request или Read Binary File). В поле **Input Binary Field** укажите имя бинарного свойства (по умолчанию `data`). + --- ## Task @@ -6530,6 +6588,22 @@ Trigger автоматически отклоняет события старш Подробнее — в [документации загрузки файлов](/api/file-uploads). +--- + +## Загрузка аватара + +Операции **Update Avatar** для ресурсов **Profile** и **User** позволяют загружать аватар через `multipart/form-data`. + +**Как использовать:** + +1. **HTTP Request** или **Read Binary File** — загрузите изображение в бинарное свойство (по умолчанию `data`) +2. **Pachca** (Profile > Update Avatar или User > Update Avatar) — в поле **Input Binary Field** укажите имя бинарного свойства + +Для удаления аватара используйте операцию **Delete Avatar** — она не требует параметров (для User — только `userId`). + +> Операции с аватарами сотрудников (User > Update/Delete Avatar) требуют прав администратора. + + --- ## Экспорт сообщений @@ -7105,6 +7179,30 @@ Albato — платформа для интеграции различных с > Автоматически отслеживайте обновления: подпишитесь на [RSS-ленту](/feed.xml) или используйте [markdown-версию этой страницы](/updates.md) для интеграции с инструментами и AI-агентами. + + +## Аватары пользователей + +Были добавлены новые методы для управления аватарами: + +- [Загрузка аватара](PUT /profile/avatar) +- [Удаление аватара](DELETE /profile/avatar) +- [Загрузка аватара сотрудника](PUT /users/{user_id}/avatar) +- [Удаление аватара сотрудника](DELETE /users/{user_id}/avatar) + +С помощью этих методов вы можете загружать и удалять аватары для своего профиля и для сотрудников вашей компании. + + + +## Параметры сортировки + +Были обновлены следующие методы: + +- [Список чатов](GET /chats) +- [Список сообщений чата](GET /messages) + +Добавлен новый формат параметров сортировки: `sort` (поле сортировки) и `order` (направление: `asc` или `desc`). + ## n8n Node v2 @@ -7745,8 +7843,10 @@ Authorization: Bearer | `profile:read` | Просмотр информации о своем профиле | Все | | `profile_status:read` | Просмотр статуса профиля | Все | | `profile_status:write` | Изменение и удаление статуса профиля | Все | +| `profile_avatar:write` | Изменение и удаление аватара профиля | Все | | `user_status:read` | Просмотр статуса сотрудника | Владелец, Администратор | | `user_status:write` | Изменение и удаление статуса сотрудника | Владелец, Администратор | +| `user_avatar:write` | Изменение и удаление аватара сотрудника | Владелец, Администратор | | `custom_properties:read` | Просмотр дополнительных полей | Все | | `audit_events:read` | Просмотр журнала аудита | Владелец | | `tasks:read` | Просмотр задач | Все | @@ -8299,7 +8399,7 @@ await fetch(`${BASE}/messages`, { Все модели данных, возвращаемые в ответах API. Каждая модель содержит связанные методы и таблицу свойств. -> Методы [Получение подписи](POST /uploads) и [Загрузка файла](POST /direct_url) не возвращают модели данных. +> Методы [Получение подписи](POST /uploads), [Загрузка файла](POST /direct_url), [Загрузка аватара](PUT /profile/avatar), [Удаление аватара](DELETE /profile/avatar), [Загрузка аватара сотрудника](PUT /users/{user_id}/avatar) и [Удаление аватара сотрудника](DELETE /users/{user_id}/avatar) не возвращают модели данных. ## Дополнительное поле @@ -9674,21 +9774,25 @@ curl "https://api.pachca.com/api/shared/v1/profile" \ --- -# Текущий статус +# Загрузка аватара -**Метод**: `GET` +**Метод**: `PUT` -**Путь**: `/profile/status` +**Путь**: `/profile/avatar` -> **Скоуп:** `profile_status:read` +> **Скоуп:** `profile_avatar:write` + +Метод для загрузки или обновления аватара своего профиля. Файл передается в формате `multipart/form-data`. + +## Тело запроса -Метод для получения информации о своем статусе. ## Пример запроса ```bash -curl "https://api.pachca.com/api/shared/v1/profile/status" \ - -H "Authorization: Bearer YOUR_ACCESS_TOKEN" +curl -X PUT "https://api.pachca.com/api/shared/v1/profile/avatar" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ + -F "image=@filename.png" ``` ## Ответы @@ -9697,26 +9801,15 @@ curl "https://api.pachca.com/api/shared/v1/profile/status" \ **Схема ответа:** -- `data: object` (required) — Статус пользователя - - `emoji: string` (required) — Emoji символ статуса - - `title: string` (required) — Текст статуса - - `expires_at: date-time` (required) — Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - - `is_away: boolean` (required) — Режим «Нет на месте» - - `away_message: object` (required) — Сообщение при режиме «Нет на месте». Отображается в профиле пользователя, а также при отправке ему личного сообщения или упоминании в чате. - - `text: string` (required) — Текст сообщения +- `data: object` (required) — Данные аватара + - `image_url: string` (required) — URL аватара **Пример ответа:** ```json { "data": { - "emoji": "🎮", - "title": "Очень занят", - "expires_at": "2024-04-08T10:00:00.000Z", - "is_away": false, - "away_message": { - "text": "Я в отпуске до 15 апреля. По срочным вопросам обращайтесь к @ivanov." - } + "image_url": "https://pachca-prod.s3.amazonaws.com/uploads/0001/0001/image.jpg" } } ``` @@ -9737,112 +9830,7 @@ curl "https://api.pachca.com/api/shared/v1/profile/status" \ } ``` -### 403: Access is forbidden. - -**Схема ответа при ошибке:** - -- `error: string` (required) — Код ошибки -- `error_description: string` (required) — Описание ошибки - -**Пример ответа:** - -```json -{ - "error": "invalid_token", - "error_description": "Access token is missing" -} -``` - - ---- - -# Новый статус - -**Метод**: `PUT` - -**Путь**: `/profile/status` - -> **Скоуп:** `profile_status:write` - -Метод для установки себе нового статуса. - -## Тело запроса - -**Обязательно** - -Формат: `application/json` - -### Схема - -- `status: object` (required) - - `emoji: string` (required) — Emoji символ статуса - - `title: string` (required) — Текст статуса - - `expires_at: date-time` — Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - - `is_away: boolean` — Режим «Нет на месте» - - `away_message: string` (max length: 1024) — Текст сообщения при режиме «Нет на месте». Отображается в профиле и при личных сообщениях/упоминаниях. - -### Пример - -```json -{ - "status": { - "emoji": "🎮", - "title": "Очень занят", - "expires_at": "2024-04-08T10:00:00.000Z", - "is_away": true, - "away_message": "Вернусь после 15:00" - } -} -``` - -## Пример запроса - -```bash -curl -X PUT "https://api.pachca.com/api/shared/v1/profile/status" \ - -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "status": { - "emoji": "🎮", - "title": "Очень занят", - "expires_at": "2024-04-08T10:00:00.000Z", - "is_away": true, - "away_message": "Вернусь после 15:00" - } -}' -``` - -## Ответы - -### 200: The request has succeeded. - -**Схема ответа:** - -- `data: object` (required) — Статус пользователя - - `emoji: string` (required) — Emoji символ статуса - - `title: string` (required) — Текст статуса - - `expires_at: date-time` (required) — Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - - `is_away: boolean` (required) — Режим «Нет на месте» - - `away_message: object` (required) — Сообщение при режиме «Нет на месте». Отображается в профиле пользователя, а также при отправке ему личного сообщения или упоминании в чате. - - `text: string` (required) — Текст сообщения - -**Пример ответа:** - -```json -{ - "data": { - "emoji": "🎮", - "title": "Очень занят", - "expires_at": "2024-04-08T10:00:00.000Z", - "is_away": false, - "away_message": { - "text": "Я в отпуске до 15 апреля. По срочным вопросам обращайтесь к @ivanov." - } - } -} -``` - -### 400: The server could not understand the request due to invalid syntax. +### 402: Client error **Схема ответа при ошибке:** @@ -9872,35 +9860,39 @@ curl -X PUT "https://api.pachca.com/api/shared/v1/profile/status" \ } ``` -### 401: Access is unauthorized. - -**Схема ответа при ошибке:** - -- `error: string` (required) — Код ошибки -- `error_description: string` (required) — Описание ошибки - -**Пример ответа:** - -```json -{ - "error": "invalid_token", - "error_description": "Access token is missing" -} -``` - ### 403: Access is forbidden. **Схема ответа при ошибке:** -- `error: string` (required) — Код ошибки -- `error_description: string` (required) — Описание ошибки +**anyOf** - один из вариантов: + +- **ApiError**: Ошибка API (используется для 400, 402, 403, 404, 409, 410, 422) + - `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` +- **OAuthError**: Ошибка OAuth авторизации (используется для 401 и 403) + - `error: string` (required) — Код ошибки + - `error_description: string` (required) — Описание ошибки **Пример ответа:** ```json { - "error": "invalid_token", - "error_description": "Access token is missing" + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] } ``` @@ -9937,20 +9929,20 @@ curl -X PUT "https://api.pachca.com/api/shared/v1/profile/status" \ --- -# Удаление статуса +# Удаление аватара **Метод**: `DELETE` -**Путь**: `/profile/status` +**Путь**: `/profile/avatar` -> **Скоуп:** `profile_status:write` +> **Скоуп:** `profile_avatar:write` -Метод для удаления своего статуса. +Метод для удаления аватара своего профиля. ## Пример запроса ```bash -curl -X DELETE "https://api.pachca.com/api/shared/v1/profile/status" \ +curl -X DELETE "https://api.pachca.com/api/shared/v1/profile/avatar" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" ``` @@ -9974,128 +9966,986 @@ curl -X DELETE "https://api.pachca.com/api/shared/v1/profile/status" \ } ``` -### 403: Access is forbidden. +### 402: Client error **Схема ответа при ошибке:** -- `error: string` (required) — Код ошибки -- `error_description: string` (required) — Описание ошибки +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` **Пример ответа:** ```json { - "error": "invalid_token", - "error_description": "Access token is missing" + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] } ``` +### 403: Access is forbidden. ---- - -## API: Users - -# Создать сотрудника - -**Метод**: `POST` - -**Путь**: `/users` - -> **Скоуп:** `users:create` - -Метод для создания нового сотрудника в вашей компании. +**Схема ответа при ошибке:** -Вы можете заполнять дополнительные поля сотрудника, которые созданы в вашей компании. Получить актуальный список идентификаторов дополнительных полей сотрудника вы можете в методе [Список дополнительных полей](GET /custom_properties). +**anyOf** - один из вариантов: + +- **ApiError**: Ошибка API (используется для 400, 402, 403, 404, 409, 410, 422) + - `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` +- **OAuthError**: Ошибка OAuth авторизации (используется для 401 и 403) + - `error: string` (required) — Код ошибки + - `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + + +--- + +# Текущий статус + +**Метод**: `GET` + +**Путь**: `/profile/status` + +> **Скоуп:** `profile_status:read` + +Метод для получения информации о своем статусе. + +## Пример запроса + +```bash +curl "https://api.pachca.com/api/shared/v1/profile/status" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" +``` + +## Ответы + +### 200: The request has succeeded. + +**Схема ответа:** + +- `data: object` (required) — Статус пользователя + - `emoji: string` (required) — Emoji символ статуса + - `title: string` (required) — Текст статуса + - `expires_at: date-time` (required) — Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ + - `is_away: boolean` (required) — Режим «Нет на месте» + - `away_message: object` (required) — Сообщение при режиме «Нет на месте». Отображается в профиле пользователя, а также при отправке ему личного сообщения или упоминании в чате. + - `text: string` (required) — Текст сообщения + +**Пример ответа:** + +```json +{ + "data": { + "emoji": "🎮", + "title": "Очень занят", + "expires_at": "2024-04-08T10:00:00.000Z", + "is_away": false, + "away_message": { + "text": "Я в отпуске до 15 апреля. По срочным вопросам обращайтесь к @ivanov." + } + } +} +``` + +### 401: Access is unauthorized. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + +### 403: Access is forbidden. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + + +--- + +# Новый статус + +**Метод**: `PUT` + +**Путь**: `/profile/status` + +> **Скоуп:** `profile_status:write` + +Метод для установки себе нового статуса. ## Тело запроса -**Обязательно** +**Обязательно** + +Формат: `application/json` + +### Схема + +- `status: object` (required) + - `emoji: string` (required) — Emoji символ статуса + - `title: string` (required) — Текст статуса + - `expires_at: date-time` — Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ + - `is_away: boolean` — Режим «Нет на месте» + - `away_message: string` (max length: 1024) — Текст сообщения при режиме «Нет на месте». Отображается в профиле и при личных сообщениях/упоминаниях. + +### Пример + +```json +{ + "status": { + "emoji": "🎮", + "title": "Очень занят", + "expires_at": "2024-04-08T10:00:00.000Z", + "is_away": true, + "away_message": "Вернусь после 15:00" + } +} +``` + +## Пример запроса + +```bash +curl -X PUT "https://api.pachca.com/api/shared/v1/profile/status" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "status": { + "emoji": "🎮", + "title": "Очень занят", + "expires_at": "2024-04-08T10:00:00.000Z", + "is_away": true, + "away_message": "Вернусь после 15:00" + } +}' +``` + +## Ответы + +### 200: The request has succeeded. + +**Схема ответа:** + +- `data: object` (required) — Статус пользователя + - `emoji: string` (required) — Emoji символ статуса + - `title: string` (required) — Текст статуса + - `expires_at: date-time` (required) — Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ + - `is_away: boolean` (required) — Режим «Нет на месте» + - `away_message: object` (required) — Сообщение при режиме «Нет на месте». Отображается в профиле пользователя, а также при отправке ему личного сообщения или упоминании в чате. + - `text: string` (required) — Текст сообщения + +**Пример ответа:** + +```json +{ + "data": { + "emoji": "🎮", + "title": "Очень занят", + "expires_at": "2024-04-08T10:00:00.000Z", + "is_away": false, + "away_message": { + "text": "Я в отпуске до 15 апреля. По срочным вопросам обращайтесь к @ivanov." + } + } +} +``` + +### 400: The server could not understand the request due to invalid syntax. + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + +### 401: Access is unauthorized. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + +### 403: Access is forbidden. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + +### 422: Client error + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + + +--- + +# Удаление статуса + +**Метод**: `DELETE` + +**Путь**: `/profile/status` + +> **Скоуп:** `profile_status:write` + +Метод для удаления своего статуса. + +## Пример запроса + +```bash +curl -X DELETE "https://api.pachca.com/api/shared/v1/profile/status" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" +``` + +## Ответы + +### 204: There is no content to send for this request, but the headers may be useful. + +### 401: Access is unauthorized. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + +### 403: Access is forbidden. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + + +--- + +## API: Users + +# Создать сотрудника + +**Метод**: `POST` + +**Путь**: `/users` + +> **Скоуп:** `users:create` + +Метод для создания нового сотрудника в вашей компании. + +Вы можете заполнять дополнительные поля сотрудника, которые созданы в вашей компании. Получить актуальный список идентификаторов дополнительных полей сотрудника вы можете в методе [Список дополнительных полей](GET /custom_properties). + +## Тело запроса + +**Обязательно** + +Формат: `application/json` + +### Схема + +- `user: object` (required) + - `first_name: string` — Имя + - `last_name: string` — Фамилия + - `email: string` (required) — Электронная почта + - `phone_number: string` — Телефон + - `nickname: string` — Имя пользователя + - `department: string` — Департамент + - `title: string` — Должность + - `role: string` — Уровень доступа + Значения: `admin` — Администратор, `user` — Сотрудник, `multi_guest` — Мульти-гость + - `suspended: boolean` — Деактивация пользователя + - `list_tags: array of string` — Массив тегов, привязываемых к сотруднику + - `custom_properties: array of object` — Задаваемые дополнительные поля + - `id: integer, int32` (required) — Идентификатор поля + - `value: string` (required) — Устанавливаемое значение +- `skip_email_notify: boolean` — Пропуск этапа отправки приглашения сотруднику. Сотруднику не будет отправлено письмо на электронную почту с приглашением создать аккаунт. Полезно при предварительном создании аккаунтов перед входом через SSO. + +### Пример + +```json +{ + "user": { + "first_name": "Олег", + "last_name": "Петров", + "email": "olegp@example.com", + "phone_number": "+79001234567", + "nickname": "olegpetrov", + "department": "Продукт", + "title": "CIO", + "role": "user", + "suspended": false, + "list_tags": [ + "Product", + "Design" + ], + "custom_properties": [ + { + "id": 1678, + "value": "Санкт-Петербург" + } + ] + }, + "skip_email_notify": true +} +``` + +## Пример запроса + +```bash +curl "https://api.pachca.com/api/shared/v1/users" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "user": { + "first_name": "Олег", + "last_name": "Петров", + "email": "olegp@example.com", + "phone_number": "+79001234567", + "nickname": "olegpetrov", + "department": "Продукт", + "title": "CIO", + "role": "user", + "suspended": false, + "list_tags": [ + "Product", + "Design" + ], + "custom_properties": [ + { + "id": 1678, + "value": "Санкт-Петербург" + } + ] + }, + "skip_email_notify": true +}' +``` + +## Ответы + +### 201: The request has succeeded and a new resource has been created as a result. + +**Схема ответа:** + +- `data: object` (required) — Сотрудник + - `id: integer, int32` (required) — Идентификатор пользователя + - `first_name: string` (required) — Имя + - `last_name: string` (required) — Фамилия + - `nickname: string` (required) — Имя пользователя + - `email: string` (required) — Электронная почта + - `phone_number: string` (required) — Телефон + - `department: string` (required) — Департамент + - `title: string` (required) — Должность + - `role: string` (required) — Уровень доступа + Значения: `admin` — Администратор, `user` — Сотрудник, `multi_guest` — Мульти-гость, `guest` — Гость + - `suspended: boolean` (required) — Деактивация пользователя + - `invite_status: string` (required) — Статус приглашения + Значения: `confirmed` — Принято, `sent` — Отправлено + - `list_tags: array of string` (required) — Массив тегов, привязанных к сотруднику + - `custom_properties: array of object` (required) — Дополнительные поля сотрудника + - `id: integer, int32` (required) — Идентификатор поля + - `name: string` (required) — Название поля + - `data_type: string` (required) — Тип поля + Значения: `string` — Строковое значение, `number` — Числовое значение, `date` — Дата, `link` — Ссылка + - `value: string` (required) — Значение + - `user_status: object` (required) — Статус + - `emoji: string` (required) — Emoji символ статуса + - `title: string` (required) — Текст статуса + - `expires_at: date-time` (required) — Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ + - `is_away: boolean` (required) — Режим «Нет на месте» + - `away_message: object` (required) — Сообщение при режиме «Нет на месте». Отображается в профиле пользователя, а также при отправке ему личного сообщения или упоминании в чате. + - `text: string` (required) — Текст сообщения + - `bot: boolean` (required) — Является ботом + - `sso: boolean` (required) — Использует ли пользователь SSO + - `created_at: date-time` (required) — Дата создания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ + - `last_activity_at: date-time` (required) — Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ + - `time_zone: string` (required) — Часовой пояс пользователя + - `image_url: string` (required) — Ссылка на скачивание аватарки пользователя + +**Пример ответа:** + +```json +{ + "data": { + "id": 12, + "first_name": "Олег", + "last_name": "Петров", + "nickname": "", + "email": "olegp@example.com", + "phone_number": "", + "department": "Продукт", + "title": "CIO", + "role": "admin", + "suspended": false, + "invite_status": "confirmed", + "list_tags": [ + "Product", + "Design" + ], + "custom_properties": [ + { + "id": 1678, + "name": "Город", + "data_type": "string", + "value": "Санкт-Петербург" + } + ], + "user_status": { + "emoji": "🎮", + "title": "Очень занят", + "expires_at": "2024-04-08T10:00:00.000Z", + "is_away": false, + "away_message": { + "text": "Я в отпуске до 15 апреля. По срочным вопросам обращайтесь к @ivanov." + } + }, + "bot": false, + "sso": false, + "created_at": "2020-06-08T09:32:57.000Z", + "last_activity_at": "2025-01-20T13:40:07.000Z", + "time_zone": "Europe/Moscow", + "image_url": "https://app.pachca.com/users/12/photo.jpg" + } +} +``` + +### 400: The server could not understand the request due to invalid syntax. + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + +### 401: Access is unauthorized. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + +### 402: Client error + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + +### 403: Access is forbidden. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + +### 422: Client error + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + + +--- + +# Список сотрудников + +**Метод**: `GET` + +**Путь**: `/users` + +> **Скоуп:** `users:read` + +Метод для получения актуального списка сотрудников вашей компании. + +## Параметры + +### Query параметры + +- `query: string` — Поисковая фраза для фильтрации результатов. Поиск работает по полям: `first_name` (имя), `last_name` (фамилия), `email` (электронная почта), `phone_number` (телефон) и `nickname` (никнейм). +- `limit: integer, int32` (default: 50) — Количество возвращаемых сущностей за один запрос +- `cursor: string` — Курсор для пагинации (из `meta.paginate.next_page`) + + +## Пример запроса + +```bash +# Для получения следующей страницы используйте cursor из meta.paginate.next_page +curl "https://api.pachca.com/api/shared/v1/users?query=Олег&limit=1" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" +``` + +## Ответы + +### 200: The request has succeeded. + +**Схема ответа:** + +- `data: array of object` (required) + - `id: integer, int32` (required) — Идентификатор пользователя + - `first_name: string` (required) — Имя + - `last_name: string` (required) — Фамилия + - `nickname: string` (required) — Имя пользователя + - `email: string` (required) — Электронная почта + - `phone_number: string` (required) — Телефон + - `department: string` (required) — Департамент + - `title: string` (required) — Должность + - `role: string` (required) — Уровень доступа + Значения: `admin` — Администратор, `user` — Сотрудник, `multi_guest` — Мульти-гость, `guest` — Гость + - `suspended: boolean` (required) — Деактивация пользователя + - `invite_status: string` (required) — Статус приглашения + Значения: `confirmed` — Принято, `sent` — Отправлено + - `list_tags: array of string` (required) — Массив тегов, привязанных к сотруднику + - `custom_properties: array of object` (required) — Дополнительные поля сотрудника + - `id: integer, int32` (required) — Идентификатор поля + - `name: string` (required) — Название поля + - `data_type: string` (required) — Тип поля + Значения: `string` — Строковое значение, `number` — Числовое значение, `date` — Дата, `link` — Ссылка + - `value: string` (required) — Значение + - `user_status: object` (required) — Статус + - `emoji: string` (required) — Emoji символ статуса + - `title: string` (required) — Текст статуса + - `expires_at: date-time` (required) — Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ + - `is_away: boolean` (required) — Режим «Нет на месте» + - `away_message: object` (required) — Сообщение при режиме «Нет на месте». Отображается в профиле пользователя, а также при отправке ему личного сообщения или упоминании в чате. + - `text: string` (required) — Текст сообщения + - `bot: boolean` (required) — Является ботом + - `sso: boolean` (required) — Использует ли пользователь SSO + - `created_at: date-time` (required) — Дата создания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ + - `last_activity_at: date-time` (required) — Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ + - `time_zone: string` (required) — Часовой пояс пользователя + - `image_url: string` (required) — Ссылка на скачивание аватарки пользователя +- `meta: object` (required) — Метаданные пагинации + - `paginate: object` (required) — Вспомогательная информация + - `next_page: string` (required) — Курсор пагинации следующей страницы + +**Пример ответа:** + +```json +{ + "data": [ + { + "id": 12, + "first_name": "Олег", + "last_name": "Петров", + "nickname": "", + "email": "olegp@example.com", + "phone_number": "", + "department": "Продукт", + "title": "CIO", + "role": "admin", + "suspended": false, + "invite_status": "confirmed", + "list_tags": [ + "Product", + "Design" + ], + "custom_properties": [ + { + "id": 1678, + "name": "Город", + "data_type": "string", + "value": "Санкт-Петербург" + } + ], + "user_status": { + "emoji": "🎮", + "title": "Очень занят", + "expires_at": "2024-04-08T10:00:00.000Z", + "is_away": false, + "away_message": { + "text": "Я в отпуске до 15 апреля. По срочным вопросам обращайтесь к @ivanov." + } + }, + "bot": false, + "sso": false, + "created_at": "2020-06-08T09:32:57.000Z", + "last_activity_at": "2025-01-20T13:40:07.000Z", + "time_zone": "Europe/Moscow", + "image_url": "https://app.pachca.com/users/12/photo.jpg" + } + ], + "meta": { + "paginate": { + "next_page": "eyJxZCO2MiwiZGlyIjomSNYjIn3" + } + } +} +``` + +### 400: The server could not understand the request due to invalid syntax. + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + +### 401: Access is unauthorized. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** + +```json +{ + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + +### 402: Client error + +**Схема ответа при ошибке:** -Формат: `application/json` +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` -### Схема +**Пример ответа:** -- `user: object` (required) - - `first_name: string` — Имя - - `last_name: string` — Фамилия - - `email: string` (required) — Электронная почта - - `phone_number: string` — Телефон - - `nickname: string` — Имя пользователя - - `department: string` — Департамент - - `title: string` — Должность - - `role: string` — Уровень доступа - Значения: `admin` — Администратор, `user` — Сотрудник, `multi_guest` — Мульти-гость - - `suspended: boolean` — Деактивация пользователя - - `list_tags: array of string` — Массив тегов, привязываемых к сотруднику - - `custom_properties: array of object` — Задаваемые дополнительные поля - - `id: integer, int32` (required) — Идентификатор поля - - `value: string` (required) — Устанавливаемое значение -- `skip_email_notify: boolean` — Пропуск этапа отправки приглашения сотруднику. Сотруднику не будет отправлено письмо на электронную почту с приглашением создать аккаунт. Полезно при предварительном создании аккаунтов перед входом через SSO. +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` -### Пример +### 403: Access is forbidden. + +**Схема ответа при ошибке:** + +- `error: string` (required) — Код ошибки +- `error_description: string` (required) — Описание ошибки + +**Пример ответа:** ```json { - "user": { - "first_name": "Олег", - "last_name": "Петров", - "email": "olegp@example.com", - "phone_number": "+79001234567", - "nickname": "olegpetrov", - "department": "Продукт", - "title": "CIO", - "role": "user", - "suspended": false, - "list_tags": [ - "Product", - "Design" - ], - "custom_properties": [ - { - "id": 1678, - "value": "Санкт-Петербург" - } - ] - }, - "skip_email_notify": true + "error": "invalid_token", + "error_description": "Access token is missing" +} +``` + +### 422: Client error + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] } ``` + +--- + +# Информация о сотруднике + +**Метод**: `GET` + +**Путь**: `/users/{id}` + +> **Скоуп:** `users:read` + +Метод для получения информации о сотруднике. + +Для получения сотрудника вам необходимо знать его `id` и указать его в `URL` запроса. + +## Параметры + +### Path параметры + +- `id: integer, int32` (required) — Идентификатор пользователя + + ## Пример запроса ```bash -curl "https://api.pachca.com/api/shared/v1/users" \ - -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "user": { - "first_name": "Олег", - "last_name": "Петров", - "email": "olegp@example.com", - "phone_number": "+79001234567", - "nickname": "olegpetrov", - "department": "Продукт", - "title": "CIO", - "role": "user", - "suspended": false, - "list_tags": [ - "Product", - "Design" - ], - "custom_properties": [ - { - "id": 1678, - "value": "Санкт-Петербург" - } - ] - }, - "skip_email_notify": true -}' +curl "https://api.pachca.com/api/shared/v1/users/12" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" ``` ## Ответы -### 201: The request has succeeded and a new resource has been created as a result. +### 200: The request has succeeded. **Схема ответа:** @@ -10181,36 +11031,6 @@ curl "https://api.pachca.com/api/shared/v1/users" \ } ``` -### 400: The server could not understand the request due to invalid syntax. - -**Схема ответа при ошибке:** - -- `errors: array of object` (required) — Массив ошибок - - `key: string` (required) — Ключ поля с ошибкой - - `value: string` (required) — Значение поля, которое вызвало ошибку - - `message: string` (required) — Сообщение об ошибке - - `code: string` (required) — Код ошибки - Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) - - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` - **Структура значений Record:** - - Тип значения: `any` - -**Пример ответа:** - -```json -{ - "errors": [ - { - "key": "field.name", - "value": "invalid_value", - "message": "Поле не может быть пустым", - "code": "blank", - "payload": null - } - ] -} -``` - ### 401: Access is unauthorized. **Схема ответа при ошибке:** @@ -10273,7 +11093,7 @@ curl "https://api.pachca.com/api/shared/v1/users" \ } ``` -### 422: Client error +### 404: The server cannot find the requested resource. **Схема ответа при ошибке:** @@ -10306,31 +11126,104 @@ curl "https://api.pachca.com/api/shared/v1/users" \ --- -# Список сотрудников +# Редактирование сотрудника -**Метод**: `GET` +**Метод**: `PUT` -**Путь**: `/users` +**Путь**: `/users/{id}` -> **Скоуп:** `users:read` +> **Скоуп:** `users:update` -Метод для получения актуального списка сотрудников вашей компании. +Метод для редактирования сотрудника. + +Для редактирования сотрудника вам необходимо знать его `id` и указать его в `URL` запроса. Все редактируемые параметры сотрудника указываются в теле запроса. Получить актуальный список идентификаторов дополнительных полей сотрудника вы можете в методе [Список дополнительных полей](GET /custom_properties). ## Параметры -### Query параметры +### Path параметры -- `query: string` — Поисковая фраза для фильтрации результатов. Поиск работает по полям: `first_name` (имя), `last_name` (фамилия), `email` (электронная почта), `phone_number` (телефон) и `nickname` (никнейм). -- `limit: integer, int32` (default: 50) — Количество возвращаемых сущностей за один запрос -- `cursor: string` — Курсор для пагинации (из `meta.paginate.next_page`) +- `id: integer, int32` (required) — Идентификатор пользователя + + +## Тело запроса + +**Обязательно** + +Формат: `application/json` + +### Схема + +- `user: object` (required) — Собранный объект параметров редактируемого сотрудника + - `first_name: string` — Имя + - `last_name: string` — Фамилия + - `email: string` — Электронная почта + - `phone_number: string` — Телефон + - `nickname: string` — Имя пользователя + - `department: string` — Департамент + - `title: string` — Должность + - `role: string` — Уровень доступа + Значения: `admin` — Администратор, `user` — Сотрудник, `multi_guest` — Мульти-гость + - `suspended: boolean` — Деактивация пользователя + - `list_tags: array of string` — Массив тегов, привязываемых к сотруднику + - `custom_properties: array of object` — Задаваемые дополнительные поля + - `id: integer, int32` (required) — Идентификатор поля + - `value: string` (required) — Устанавливаемое значение + +### Пример +```json +{ + "user": { + "first_name": "Олег", + "last_name": "Петров", + "email": "olegpetrov@example.com", + "phone_number": "+79001234567", + "nickname": "olegpetrov", + "department": "Отдел разработки", + "title": "Старший разработчик", + "role": "user", + "suspended": false, + "list_tags": [ + "Product" + ], + "custom_properties": [ + { + "id": 1678, + "value": "Санкт-Петербург" + } + ] + } +} +``` ## Пример запроса ```bash -# Для получения следующей страницы используйте cursor из meta.paginate.next_page -curl "https://api.pachca.com/api/shared/v1/users?query=Олег&limit=1" \ - -H "Authorization: Bearer YOUR_ACCESS_TOKEN" +curl -X PUT "https://api.pachca.com/api/shared/v1/users/12" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "user": { + "first_name": "Олег", + "last_name": "Петров", + "email": "olegpetrov@example.com", + "phone_number": "+79001234567", + "nickname": "olegpetrov", + "department": "Отдел разработки", + "title": "Старший разработчик", + "role": "user", + "suspended": false, + "list_tags": [ + "Product" + ], + "custom_properties": [ + { + "id": 1678, + "value": "Санкт-Петербург" + } + ] + } +}' ``` ## Ответы @@ -10339,7 +11232,7 @@ curl "https://api.pachca.com/api/shared/v1/users?query=Олег&limit=1" \ **Схема ответа:** -- `data: array of object` (required) +- `data: object` (required) — Сотрудник - `id: integer, int32` (required) — Идентификатор пользователя - `first_name: string` (required) — Имя - `last_name: string` (required) — Фамилия @@ -10373,60 +11266,50 @@ curl "https://api.pachca.com/api/shared/v1/users?query=Олег&limit=1" \ - `last_activity_at: date-time` (required) — Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - `time_zone: string` (required) — Часовой пояс пользователя - `image_url: string` (required) — Ссылка на скачивание аватарки пользователя -- `meta: object` (required) — Метаданные пагинации - - `paginate: object` (required) — Вспомогательная информация - - `next_page: string` (required) — Курсор пагинации следующей страницы **Пример ответа:** ```json { - "data": [ - { - "id": 12, - "first_name": "Олег", - "last_name": "Петров", - "nickname": "", - "email": "olegp@example.com", - "phone_number": "", - "department": "Продукт", - "title": "CIO", - "role": "admin", - "suspended": false, - "invite_status": "confirmed", - "list_tags": [ - "Product", - "Design" - ], - "custom_properties": [ - { - "id": 1678, - "name": "Город", - "data_type": "string", - "value": "Санкт-Петербург" - } - ], - "user_status": { - "emoji": "🎮", - "title": "Очень занят", - "expires_at": "2024-04-08T10:00:00.000Z", - "is_away": false, - "away_message": { - "text": "Я в отпуске до 15 апреля. По срочным вопросам обращайтесь к @ivanov." - } - }, - "bot": false, - "sso": false, - "created_at": "2020-06-08T09:32:57.000Z", - "last_activity_at": "2025-01-20T13:40:07.000Z", - "time_zone": "Europe/Moscow", - "image_url": "https://app.pachca.com/users/12/photo.jpg" - } - ], - "meta": { - "paginate": { - "next_page": "eyJxZCO2MiwiZGlyIjomSNYjIn3" - } + "data": { + "id": 12, + "first_name": "Олег", + "last_name": "Петров", + "nickname": "", + "email": "olegp@example.com", + "phone_number": "", + "department": "Продукт", + "title": "CIO", + "role": "admin", + "suspended": false, + "invite_status": "confirmed", + "list_tags": [ + "Product", + "Design" + ], + "custom_properties": [ + { + "id": 1678, + "name": "Город", + "data_type": "string", + "value": "Санкт-Петербург" + } + ], + "user_status": { + "emoji": "🎮", + "title": "Очень занят", + "expires_at": "2024-04-08T10:00:00.000Z", + "is_away": false, + "away_message": { + "text": "Я в отпуске до 15 апреля. По срочным вопросам обращайтесь к @ivanov." + } + }, + "bot": false, + "sso": false, + "created_at": "2020-06-08T09:32:57.000Z", + "last_activity_at": "2025-01-20T13:40:07.000Z", + "time_zone": "Europe/Moscow", + "image_url": "https://app.pachca.com/users/12/photo.jpg" } } ``` @@ -10523,6 +11406,36 @@ curl "https://api.pachca.com/api/shared/v1/users?query=Олег&limit=1" \ } ``` +### 404: The server cannot find the requested resource. + +**Схема ответа при ошибке:** + +- `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` + +**Пример ответа:** + +```json +{ + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] +} +``` + ### 422: Client error **Схема ответа при ошибке:** @@ -10556,17 +11469,17 @@ curl "https://api.pachca.com/api/shared/v1/users?query=Олег&limit=1" \ --- -# Информация о сотруднике +# Удаление сотрудника -**Метод**: `GET` +**Метод**: `DELETE` **Путь**: `/users/{id}` -> **Скоуп:** `users:read` +> **Скоуп:** `users:delete` -Метод для получения информации о сотруднике. +Метод для удаления сотрудника. -Для получения сотрудника вам необходимо знать его `id` и указать его в `URL` запроса. +Для удаления сотрудника вам необходимо знать его `id` и указать его в `URL` запроса. ## Параметры @@ -10575,101 +11488,17 @@ curl "https://api.pachca.com/api/shared/v1/users?query=Олег&limit=1" \ - `id: integer, int32` (required) — Идентификатор пользователя -## Пример запроса - -```bash -curl "https://api.pachca.com/api/shared/v1/users/12" \ - -H "Authorization: Bearer YOUR_ACCESS_TOKEN" -``` - -## Ответы - -### 200: The request has succeeded. - -**Схема ответа:** - -- `data: object` (required) — Сотрудник - - `id: integer, int32` (required) — Идентификатор пользователя - - `first_name: string` (required) — Имя - - `last_name: string` (required) — Фамилия - - `nickname: string` (required) — Имя пользователя - - `email: string` (required) — Электронная почта - - `phone_number: string` (required) — Телефон - - `department: string` (required) — Департамент - - `title: string` (required) — Должность - - `role: string` (required) — Уровень доступа - Значения: `admin` — Администратор, `user` — Сотрудник, `multi_guest` — Мульти-гость, `guest` — Гость - - `suspended: boolean` (required) — Деактивация пользователя - - `invite_status: string` (required) — Статус приглашения - Значения: `confirmed` — Принято, `sent` — Отправлено - - `list_tags: array of string` (required) — Массив тегов, привязанных к сотруднику - - `custom_properties: array of object` (required) — Дополнительные поля сотрудника - - `id: integer, int32` (required) — Идентификатор поля - - `name: string` (required) — Название поля - - `data_type: string` (required) — Тип поля - Значения: `string` — Строковое значение, `number` — Числовое значение, `date` — Дата, `link` — Ссылка - - `value: string` (required) — Значение - - `user_status: object` (required) — Статус - - `emoji: string` (required) — Emoji символ статуса - - `title: string` (required) — Текст статуса - - `expires_at: date-time` (required) — Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - - `is_away: boolean` (required) — Режим «Нет на месте» - - `away_message: object` (required) — Сообщение при режиме «Нет на месте». Отображается в профиле пользователя, а также при отправке ему личного сообщения или упоминании в чате. - - `text: string` (required) — Текст сообщения - - `bot: boolean` (required) — Является ботом - - `sso: boolean` (required) — Использует ли пользователь SSO - - `created_at: date-time` (required) — Дата создания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - - `last_activity_at: date-time` (required) — Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - - `time_zone: string` (required) — Часовой пояс пользователя - - `image_url: string` (required) — Ссылка на скачивание аватарки пользователя - -**Пример ответа:** - -```json -{ - "data": { - "id": 12, - "first_name": "Олег", - "last_name": "Петров", - "nickname": "", - "email": "olegp@example.com", - "phone_number": "", - "department": "Продукт", - "title": "CIO", - "role": "admin", - "suspended": false, - "invite_status": "confirmed", - "list_tags": [ - "Product", - "Design" - ], - "custom_properties": [ - { - "id": 1678, - "name": "Город", - "data_type": "string", - "value": "Санкт-Петербург" - } - ], - "user_status": { - "emoji": "🎮", - "title": "Очень занят", - "expires_at": "2024-04-08T10:00:00.000Z", - "is_away": false, - "away_message": { - "text": "Я в отпуске до 15 апреля. По срочным вопросам обращайтесь к @ivanov." - } - }, - "bot": false, - "sso": false, - "created_at": "2020-06-08T09:32:57.000Z", - "last_activity_at": "2025-01-20T13:40:07.000Z", - "time_zone": "Europe/Moscow", - "image_url": "https://app.pachca.com/users/12/photo.jpg" - } -} +## Пример запроса + +```bash +curl -X DELETE "https://api.pachca.com/api/shared/v1/users/12" \ + -H "Authorization: Bearer YOUR_ACCESS_TOKEN" ``` +## Ответы + +### 204: There is no content to send for this request, but the headers may be useful. + ### 401: Access is unauthorized. **Схема ответа при ошибке:** @@ -10765,104 +11594,32 @@ curl "https://api.pachca.com/api/shared/v1/users/12" \ --- -# Редактирование сотрудника +# Загрузка аватара сотрудника **Метод**: `PUT` -**Путь**: `/users/{id}` - -> **Скоуп:** `users:update` +**Путь**: `/users/{user_id}/avatar` -Метод для редактирования сотрудника. +> **Скоуп:** `user_avatar:write` -Для редактирования сотрудника вам необходимо знать его `id` и указать его в `URL` запроса. Все редактируемые параметры сотрудника указываются в теле запроса. Получить актуальный список идентификаторов дополнительных полей сотрудника вы можете в методе [Список дополнительных полей](GET /custom_properties). +Метод для загрузки или обновления аватара сотрудника. Файл передается в формате `multipart/form-data`. ## Параметры ### Path параметры -- `id: integer, int32` (required) — Идентификатор пользователя +- `user_id: integer, int32` (required) — Идентификатор пользователя ## Тело запроса -**Обязательно** - -Формат: `application/json` - -### Схема - -- `user: object` (required) — Собранный объект параметров редактируемого сотрудника - - `first_name: string` — Имя - - `last_name: string` — Фамилия - - `email: string` — Электронная почта - - `phone_number: string` — Телефон - - `nickname: string` — Имя пользователя - - `department: string` — Департамент - - `title: string` — Должность - - `role: string` — Уровень доступа - Значения: `admin` — Администратор, `user` — Сотрудник, `multi_guest` — Мульти-гость - - `suspended: boolean` — Деактивация пользователя - - `list_tags: array of string` — Массив тегов, привязываемых к сотруднику - - `custom_properties: array of object` — Задаваемые дополнительные поля - - `id: integer, int32` (required) — Идентификатор поля - - `value: string` (required) — Устанавливаемое значение - -### Пример - -```json -{ - "user": { - "first_name": "Олег", - "last_name": "Петров", - "email": "olegpetrov@example.com", - "phone_number": "+79001234567", - "nickname": "olegpetrov", - "department": "Отдел разработки", - "title": "Старший разработчик", - "role": "user", - "suspended": false, - "list_tags": [ - "Product" - ], - "custom_properties": [ - { - "id": 1678, - "value": "Санкт-Петербург" - } - ] - } -} -``` ## Пример запроса ```bash -curl -X PUT "https://api.pachca.com/api/shared/v1/users/12" \ +curl -X PUT "https://api.pachca.com/api/shared/v1/users/12/avatar" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "user": { - "first_name": "Олег", - "last_name": "Петров", - "email": "olegpetrov@example.com", - "phone_number": "+79001234567", - "nickname": "olegpetrov", - "department": "Отдел разработки", - "title": "Старший разработчик", - "role": "user", - "suspended": false, - "list_tags": [ - "Product" - ], - "custom_properties": [ - { - "id": 1678, - "value": "Санкт-Петербург" - } - ] - } -}' + -F "image=@filename.png" ``` ## Ответы @@ -10871,118 +11628,19 @@ curl -X PUT "https://api.pachca.com/api/shared/v1/users/12" \ **Схема ответа:** -- `data: object` (required) — Сотрудник - - `id: integer, int32` (required) — Идентификатор пользователя - - `first_name: string` (required) — Имя - - `last_name: string` (required) — Фамилия - - `nickname: string` (required) — Имя пользователя - - `email: string` (required) — Электронная почта - - `phone_number: string` (required) — Телефон - - `department: string` (required) — Департамент - - `title: string` (required) — Должность - - `role: string` (required) — Уровень доступа - Значения: `admin` — Администратор, `user` — Сотрудник, `multi_guest` — Мульти-гость, `guest` — Гость - - `suspended: boolean` (required) — Деактивация пользователя - - `invite_status: string` (required) — Статус приглашения - Значения: `confirmed` — Принято, `sent` — Отправлено - - `list_tags: array of string` (required) — Массив тегов, привязанных к сотруднику - - `custom_properties: array of object` (required) — Дополнительные поля сотрудника - - `id: integer, int32` (required) — Идентификатор поля - - `name: string` (required) — Название поля - - `data_type: string` (required) — Тип поля - Значения: `string` — Строковое значение, `number` — Числовое значение, `date` — Дата, `link` — Ссылка - - `value: string` (required) — Значение - - `user_status: object` (required) — Статус - - `emoji: string` (required) — Emoji символ статуса - - `title: string` (required) — Текст статуса - - `expires_at: date-time` (required) — Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - - `is_away: boolean` (required) — Режим «Нет на месте» - - `away_message: object` (required) — Сообщение при режиме «Нет на месте». Отображается в профиле пользователя, а также при отправке ему личного сообщения или упоминании в чате. - - `text: string` (required) — Текст сообщения - - `bot: boolean` (required) — Является ботом - - `sso: boolean` (required) — Использует ли пользователь SSO - - `created_at: date-time` (required) — Дата создания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - - `last_activity_at: date-time` (required) — Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ - - `time_zone: string` (required) — Часовой пояс пользователя - - `image_url: string` (required) — Ссылка на скачивание аватарки пользователя +- `data: object` (required) — Данные аватара + - `image_url: string` (required) — URL аватара **Пример ответа:** ```json { "data": { - "id": 12, - "first_name": "Олег", - "last_name": "Петров", - "nickname": "", - "email": "olegp@example.com", - "phone_number": "", - "department": "Продукт", - "title": "CIO", - "role": "admin", - "suspended": false, - "invite_status": "confirmed", - "list_tags": [ - "Product", - "Design" - ], - "custom_properties": [ - { - "id": 1678, - "name": "Город", - "data_type": "string", - "value": "Санкт-Петербург" - } - ], - "user_status": { - "emoji": "🎮", - "title": "Очень занят", - "expires_at": "2024-04-08T10:00:00.000Z", - "is_away": false, - "away_message": { - "text": "Я в отпуске до 15 апреля. По срочным вопросам обращайтесь к @ivanov." - } - }, - "bot": false, - "sso": false, - "created_at": "2020-06-08T09:32:57.000Z", - "last_activity_at": "2025-01-20T13:40:07.000Z", - "time_zone": "Europe/Moscow", - "image_url": "https://app.pachca.com/users/12/photo.jpg" + "image_url": "https://pachca-prod.s3.amazonaws.com/uploads/0001/0001/image.jpg" } } ``` -### 400: The server could not understand the request due to invalid syntax. - -**Схема ответа при ошибке:** - -- `errors: array of object` (required) — Массив ошибок - - `key: string` (required) — Ключ поля с ошибкой - - `value: string` (required) — Значение поля, которое вызвало ошибку - - `message: string` (required) — Сообщение об ошибке - - `code: string` (required) — Код ошибки - Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) - - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` - **Структура значений Record:** - - Тип значения: `any` - -**Пример ответа:** - -```json -{ - "errors": [ - { - "key": "field.name", - "value": "invalid_value", - "message": "Поле не может быть пустым", - "code": "blank", - "payload": null - } - ] -} -``` - ### 401: Access is unauthorized. **Схема ответа при ошибке:** @@ -11033,15 +11691,35 @@ curl -X PUT "https://api.pachca.com/api/shared/v1/users/12" \ **Схема ответа при ошибке:** -- `error: string` (required) — Код ошибки -- `error_description: string` (required) — Описание ошибки +**anyOf** - один из вариантов: + +- **ApiError**: Ошибка API (используется для 400, 402, 403, 404, 409, 410, 422) + - `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` +- **OAuthError**: Ошибка OAuth авторизации (используется для 401 и 403) + - `error: string` (required) — Код ошибки + - `error_description: string` (required) — Описание ошибки **Пример ответа:** ```json { - "error": "invalid_token", - "error_description": "Access token is missing" + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] } ``` @@ -11108,29 +11786,27 @@ curl -X PUT "https://api.pachca.com/api/shared/v1/users/12" \ --- -# Удаление сотрудника +# Удаление аватара сотрудника **Метод**: `DELETE` -**Путь**: `/users/{id}` - -> **Скоуп:** `users:delete` +**Путь**: `/users/{user_id}/avatar` -Метод для удаления сотрудника. +> **Скоуп:** `user_avatar:write` -Для удаления сотрудника вам необходимо знать его `id` и указать его в `URL` запроса. +Метод для удаления аватара сотрудника. ## Параметры ### Path параметры -- `id: integer, int32` (required) — Идентификатор пользователя +- `user_id: integer, int32` (required) — Идентификатор пользователя ## Пример запроса ```bash -curl -X DELETE "https://api.pachca.com/api/shared/v1/users/12" \ +curl -X DELETE "https://api.pachca.com/api/shared/v1/users/12/avatar" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" ``` @@ -11188,15 +11864,35 @@ curl -X DELETE "https://api.pachca.com/api/shared/v1/users/12" \ **Схема ответа при ошибке:** -- `error: string` (required) — Код ошибки -- `error_description: string` (required) — Описание ошибки +**anyOf** - один из вариантов: + +- **ApiError**: Ошибка API (используется для 400, 402, 403, 404, 409, 410, 422) + - `errors: array of object` (required) — Массив ошибок + - `key: string` (required) — Ключ поля с ошибкой + - `value: string` (required) — Значение поля, которое вызвало ошибку + - `message: string` (required) — Сообщение об ошибке + - `code: string` (required) — Код ошибки + Значения: `blank` — Обязательное поле (не может быть пустым), `too_long` — Слишком длинное значение (пояснения вы получите в поле message), `invalid` — Поле не соответствует правилам (пояснения вы получите в поле message), `inclusion` — Поле имеет непредусмотренное значение, `exclusion` — Поле имеет недопустимое значение, `taken` — Название для этого поля уже существует, `wrong_emoji` — Emoji статуса не может содержать значения отличные от Emoji символа, `not_found` — Объект не найден, `already_exists` — Объект уже существует (пояснения вы получите в поле message), `personal_chat` — Ошибка личного чата (пояснения вы получите в поле message), `displayed_error` — Отображаемая ошибка (пояснения вы получите в поле message), `not_authorized` — Действие запрещено, `invalid_date_range` — Выбран слишком большой диапазон дат, `invalid_webhook_url` — Некорректный URL вебхука, `rate_limit` — Достигнут лимит запросов, `licenses_limit` — Превышен лимит активных сотрудников (пояснения вы получите в поле message), `user_limit` — Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций), `unique_limit` — Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций), `general_limit` — Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций), `unhandled` — Ошибка выполнения запроса (пояснения вы получите в поле message), `trigger_not_found` — Не удалось найти идентификатор события, `trigger_expired` — Время жизни идентификатора события истекло, `required` — Обязательный параметр не передан, `in` — Недопустимое значение (не входит в список допустимых), `not_applicable` — Значение неприменимо в данном контексте (пояснения вы получите в поле message), `self_update` — Нельзя изменить свои собственные данные, `owner_protected` — Нельзя изменить данные владельца, `already_assigned` — Значение уже назначено, `forbidden` — Недостаточно прав для выполнения действия (пояснения вы получите в поле message), `permission_denied` — Доступ запрещён (недостаточно прав), `access_denied` — Доступ запрещён, `wrong_params` — Некорректные параметры запроса (пояснения вы получите в поле message), `payment_required` — Требуется оплата, `min_length` — Значение слишком короткое (пояснения вы получите в поле message), `max_length` — Значение слишком длинное (пояснения вы получите в поле message), `use_of_system_words` — Использовано зарезервированное системное слово (here, all) + - `payload: Record` (required) — Дополнительные данные об ошибке. Содержимое зависит от кода ошибки: `{id: number}` — при ошибке кастомного свойства (идентификатор свойства), `{record: {type: string, id: number}, query: string}` — при ошибке авторизации. В большинстве случаев `null` + **Структура значений Record:** + - Тип значения: `any` +- **OAuthError**: Ошибка OAuth авторизации (используется для 401 и 403) + - `error: string` (required) — Код ошибки + - `error_description: string` (required) — Описание ошибки **Пример ответа:** ```json { - "error": "invalid_token", - "error_description": "Access token is missing" + "errors": [ + { + "key": "field.name", + "value": "invalid_value", + "message": "Поле не может быть пустым", + "code": "blank", + "payload": null + } + ] } ``` @@ -13083,7 +13779,8 @@ curl "https://api.pachca.com/api/shared/v1/chats" \ ### Query параметры -- `sort[{field}]: string` (default: desc) — Составной параметр сортировки сущностей выборки +- `sort: string` (default: id) — Поле сортировки +- `order: string` (default: desc) — Направление сортировки - `availability: string` (default: is_member) — Параметр, который отвечает за доступность и выборку чатов для пользователя - `last_message_at_after: date-time` — Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не раньше чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ). - `last_message_at_before: date-time` — Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не позже чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ). @@ -13096,7 +13793,7 @@ curl "https://api.pachca.com/api/shared/v1/chats" \ ```bash # Для получения следующей страницы используйте cursor из meta.paginate.next_page -curl "https://api.pachca.com/api/shared/v1/chats?sort[id]=desc&availability=is_member&last_message_at_after=2025-01-01T00:00:00.000Z&last_message_at_before=2025-02-01T00:00:00.000Z&personal=false&limit=1" \ +curl "https://api.pachca.com/api/shared/v1/chats?sort=id&order=desc&availability=is_member&last_message_at_after=2025-01-01T00:00:00.000Z&last_message_at_before=2025-02-01T00:00:00.000Z&personal=false&limit=1" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" ``` @@ -15678,7 +16375,8 @@ curl "https://api.pachca.com/api/shared/v1/messages" \ ### Query параметры - `chat_id: integer, int32` (required) — Идентификатор чата (беседа, канал, диалог или чат треда) -- `sort[{field}]: string` (default: desc) — Составной параметр сортировки сущностей выборки +- `sort: string` (default: id) — Поле сортировки +- `order: string` (default: desc) — Направление сортировки - `limit: integer, int32` (default: 50) — Количество возвращаемых сущностей за один запрос - `cursor: string` — Курсор для пагинации (из `meta.paginate.next_page`) @@ -15687,7 +16385,7 @@ curl "https://api.pachca.com/api/shared/v1/messages" \ ```bash # Для получения следующей страницы используйте cursor из meta.paginate.next_page -curl "https://api.pachca.com/api/shared/v1/messages?chat_id=198&sort[id]=desc&limit=1" \ +curl "https://api.pachca.com/api/shared/v1/messages?chat_id=198&sort=id&order=desc&limit=1" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" ``` diff --git a/apps/docs/public/llms.txt b/apps/docs/public/llms.txt index 1f381b44..55ae6fc0 100644 --- a/apps/docs/public/llms.txt +++ b/apps/docs/public/llms.txt @@ -68,6 +68,8 @@ pachca guide "отправить сообщение" # CLI guide for humans ## Profile - [Информация о токене](https://dev.pachca.com/api/profile/get-info.md): GET /oauth/token/info - [Информация о профиле](https://dev.pachca.com/api/profile/get.md): GET /profile +- [Загрузка аватара](https://dev.pachca.com/api/profile/update-avatar.md): PUT /profile/avatar +- [Удаление аватара](https://dev.pachca.com/api/profile/delete-avatar.md): DELETE /profile/avatar - [Текущий статус](https://dev.pachca.com/api/profile/get-status.md): GET /profile/status - [Новый статус](https://dev.pachca.com/api/profile/update-status.md): PUT /profile/status - [Удаление статуса](https://dev.pachca.com/api/profile/delete-status.md): DELETE /profile/status @@ -78,6 +80,8 @@ pachca guide "отправить сообщение" # CLI guide for humans - [Информация о сотруднике](https://dev.pachca.com/api/users/get.md): GET /users/{id} - [Редактирование сотрудника](https://dev.pachca.com/api/users/update.md): PUT /users/{id} - [Удаление сотрудника](https://dev.pachca.com/api/users/delete.md): DELETE /users/{id} +- [Загрузка аватара сотрудника](https://dev.pachca.com/api/users/update-avatar.md): PUT /users/{user_id}/avatar +- [Удаление аватара сотрудника](https://dev.pachca.com/api/users/remove-avatar.md): DELETE /users/{user_id}/avatar - [Статус сотрудника](https://dev.pachca.com/api/users/get-status.md): GET /users/{user_id}/status - [Новый статус сотрудника](https://dev.pachca.com/api/users/update-status.md): PUT /users/{user_id}/status - [Удаление статуса сотрудника](https://dev.pachca.com/api/users/remove-status.md): DELETE /users/{user_id}/status diff --git a/apps/docs/public/pachca.postman_collection.json b/apps/docs/public/pachca.postman_collection.json index 848e2692..53d59b85 100644 --- a/apps/docs/public/pachca.postman_collection.json +++ b/apps/docs/public/pachca.postman_collection.json @@ -183,6 +183,54 @@ } } }, + { + "name": "Загрузка аватара", + "request": { + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/profile/avatar", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "profile", + "avatar" + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"image\": \"0101010101010101\"\n}", + "options": { + "raw": { + "language": "json" + } + } + } + } + }, + { + "name": "Удаление аватара", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "{{baseUrl}}/profile/avatar", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "profile", + "avatar" + ] + } + } + }, { "name": "Текущий статус", "request": { @@ -382,6 +430,68 @@ } } }, + { + "name": "Загрузка аватара сотрудника", + "request": { + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/users/:user_id/avatar", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":user_id", + "avatar" + ], + "variable": [ + { + "key": "user_id", + "value": "" + } + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"image\": \"0101010101010101\"\n}", + "options": { + "raw": { + "language": "json" + } + } + } + } + }, + { + "name": "Удаление аватара сотрудника", + "request": { + "method": "DELETE", + "header": [], + "url": { + "raw": "{{baseUrl}}/users/:user_id/avatar", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "users", + ":user_id", + "avatar" + ], + "variable": [ + { + "key": "user_id", + "value": "" + } + ] + } + } + }, { "name": "Статус сотрудника", "request": { diff --git a/apps/docs/public/skill.md b/apps/docs/public/skill.md index 353b6a9c..0d9d4003 100644 --- a/apps/docs/public/skill.md +++ b/apps/docs/public/skill.md @@ -61,6 +61,8 @@ Tokens are long-lived and do not expire. They can be reset by the admin/owner in ### Profile - `GET /oauth/token/info` — Get token info - `GET /profile` — Get profile +- `PUT /profile/avatar` — Update profile avatar +- `DELETE /profile/avatar` — Delete profile avatar - `GET /profile/status` — Get status - `PUT /profile/status` — Update status - `DELETE /profile/status` — Delete status @@ -71,6 +73,8 @@ Tokens are long-lived and do not expire. They can be reset by the admin/owner in - `GET /users/{id}` — Get user - `PUT /users/{id}` — Update user - `DELETE /users/{id}` — Delete user +- `PUT /users/{user_id}/avatar` — Update user avatar +- `DELETE /users/{user_id}/avatar` — Delete user avatar - `GET /users/{user_id}/status` — Get user status - `PUT /users/{user_id}/status` — Update user status - `DELETE /users/{user_id}/status` — Delete user status diff --git a/apps/docs/public/updates.md b/apps/docs/public/updates.md index dd7e20dc..a73aa801 100644 --- a/apps/docs/public/updates.md +++ b/apps/docs/public/updates.md @@ -4,6 +4,30 @@ > Автоматически отслеживайте обновления: подпишитесь на [RSS-ленту](/feed.xml) или используйте [markdown-версию этой страницы](/updates.md) для интеграции с инструментами и AI-агентами. + + +## Аватары пользователей + +Были добавлены новые методы для управления аватарами: + +- [Загрузка аватара](PUT /profile/avatar) +- [Удаление аватара](DELETE /profile/avatar) +- [Загрузка аватара сотрудника](PUT /users/{user_id}/avatar) +- [Удаление аватара сотрудника](DELETE /users/{user_id}/avatar) + +С помощью этих методов вы можете загружать и удалять аватары для своего профиля и для сотрудников вашей компании. + + + +## Параметры сортировки + +Были обновлены следующие методы: + +- [Список чатов](GET /chats) +- [Список сообщений чата](GET /messages) + +Добавлен новый формат параметров сортировки: `sort` (поле сортировки) и `order` (направление: `asc` или `desc`). + ## n8n Node v2 diff --git a/integrations/n8n/README.md b/integrations/n8n/README.md index a72f66c5..7047df73 100644 --- a/integrations/n8n/README.md +++ b/integrations/n8n/README.md @@ -30,7 +30,7 @@ tar -xzf n8n-nodes-pachca.tgz -C ~/.n8n/nodes/ ### Pachca -Main node for interacting with the Pachca API. Supports 18 resources and 60+ operations: +Main node for interacting with the Pachca API. Supports 18 resources and 65+ operations: | Resource | Operations | |----------|-----------| @@ -44,14 +44,14 @@ Main node for interacting with the Pachca API. Supports 18 resources and 60+ ope | Group Tag | Create, Get, Get Many, Update, Delete, Get Many Users | | Link Preview | Create | | Message | Create, Get, Get Many, Update, Delete, Pin, Unpin | -| Profile | Get Info, Get, Get/Update/Delete Status | +| Profile | Get Info, Get, Update/Delete Avatar, Get/Update/Delete Status | | Reaction | Create, Delete, Get Many | | Read Member | Get Many | | Search | Chats, Messages, Users | | Security | Get Many | | Task | Create, Get, Get Many, Update, Delete | | Thread | Create, Get | -| User | Create, Get, Get Many, Update, Delete, Get/Update/Delete Status | +| User | Create, Get, Get Many, Update, Delete, Update/Delete Avatar, Get/Update/Delete Status | ### Pachca Trigger @@ -129,6 +129,10 @@ Create modal forms with three builder modes: Forms require a `trigger_id` from a `button_pressed` webhook event (valid for 3 seconds). +### Avatar Upload + +Upload avatar images for profiles and users via `multipart/form-data`. Uses binary data from a previous node (HTTP Request, Read Binary File). The **Input Binary Field** parameter (default: `data`) specifies which binary property contains the image. + ### File Upload Two-stage S3 upload with automatic retry. Sources: **URL** or **Binary Data** from previous workflow nodes. diff --git a/integrations/n8n/nodes/Pachca/GenericFunctions.ts b/integrations/n8n/nodes/Pachca/GenericFunctions.ts index 74818905..d42fff22 100644 --- a/integrations/n8n/nodes/Pachca/GenericFunctions.ts +++ b/integrations/n8n/nodes/Pachca/GenericFunctions.ts @@ -269,6 +269,7 @@ export function buildMultipartBody( fileBuffer: Buffer, fileName: string, contentType: string, + fileFieldName = 'file', ): { body: Buffer; contentType: string } { const boundary = `----WebKitFormBoundary${crypto.randomBytes(16).toString('hex')}`; const parts: Buffer[] = []; @@ -288,7 +289,7 @@ export function buildMultipartBody( // File last parts.push( Buffer.from( - `--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${safeName}"\r\nContent-Type: ${contentType}\r\n\r\n`, + `--${boundary}\r\nContent-Disposition: form-data; name="${fileFieldName}"; filename="${safeName}"\r\nContent-Type: ${contentType}\r\n\r\n`, ), ); parts.push(fileBuffer); @@ -300,6 +301,40 @@ export function buildMultipartBody( }; } +/** + * Upload avatar image via multipart/form-data. + * Reads binary data from the input and sends it to the avatar endpoint. + */ +export async function uploadAvatar( + ctx: IExecuteFunctions, + itemIndex: number, + url: string, +): Promise { + const binaryProperty = ctx.getNodeParameter('image', itemIndex, 'data') as string; + const binaryData = ctx.helpers.assertBinaryData(itemIndex, binaryProperty); + const fileBuffer = await ctx.helpers.getBinaryDataBuffer(itemIndex, binaryProperty); + const fileName = binaryData.fileName || 'avatar.jpg'; + const mimeType = binaryData.mimeType || detectMimeType(fileName); + + const multipart = buildMultipartBody({}, fileBuffer, fileName, mimeType, 'image'); + + const credentials = await ctx.getCredentials('pachcaApi'); + const base = sanitizeBaseUrl(credentials.baseUrl as string); + + const response = await ctx.helpers.httpRequestWithAuthentication.call(ctx, 'pachcaApi', { + method: 'PUT', + url: `${base}${url}`, + body: multipart.body, + headers: { 'Content-Type': multipart.contentType }, + }); + + if (typeof response === 'object' && response !== null) { + const data = (response as IDataObject).data; + return (data as IDataObject) ?? (response as IDataObject); + } + return { success: true } as unknown as IDataObject; +} + // ============================================================================ // BOT ID AUTO-DETECTION // ============================================================================ diff --git a/integrations/n8n/nodes/Pachca/SharedRouter.ts b/integrations/n8n/nodes/Pachca/SharedRouter.ts index e9f25670..225af4a6 100644 --- a/integrations/n8n/nodes/Pachca/SharedRouter.ts +++ b/integrations/n8n/nodes/Pachca/SharedRouter.ts @@ -12,6 +12,7 @@ import { cleanFileAttachments, resolveFormBlocksFromParams, uploadFileToS3, + uploadAvatar, splitAndValidateCommaList, simplifyItem, FORM_TEMPLATES, @@ -139,7 +140,7 @@ const ROUTES: Record> = { method: 'GET' as IHttpRequestMethods, path: '/chats', paginated: true, - queryMap: [{ api: 'availability', n8n: 'availability' }, { api: 'last_message_at_after', n8n: 'lastMessageAtAfter' }, { api: 'last_message_at_before', n8n: 'lastMessageAtBefore' }], + queryMap: [{ api: 'sort', n8n: 'sort' }, { api: 'order', n8n: 'order' }, { api: 'availability', n8n: 'availability' }, { api: 'last_message_at_after', n8n: 'lastMessageAtAfter' }, { api: 'last_message_at_before', n8n: 'lastMessageAtBefore' }], optionalQueryMap: [{ api: 'personal', n8n: 'personal' }], }, get: { @@ -327,7 +328,7 @@ const ROUTES: Record> = { method: 'GET' as IHttpRequestMethods, path: '/messages', paginated: true, - queryMap: [{ api: 'chat_id', n8n: 'chatId', locator: true, required: true }], + queryMap: [{ api: 'chat_id', n8n: 'chatId', locator: true, required: true }, { api: 'sort', n8n: 'sort' }, { api: 'order', n8n: 'order' }], }, get: { method: 'GET' as IHttpRequestMethods, @@ -444,6 +445,15 @@ const ROUTES: Record> = { method: 'GET' as IHttpRequestMethods, path: '/profile', }, + updateAvatar: { + method: 'PUT' as IHttpRequestMethods, + path: '/profile/avatar', + special: 'avatarUpload', + }, + deleteAvatar: { + method: 'DELETE' as IHttpRequestMethods, + path: '/profile/avatar', + }, getStatus: { method: 'GET' as IHttpRequestMethods, path: '/profile/status', @@ -601,6 +611,17 @@ const ROUTES: Record> = { path: '/users/{id}', pathParams: [{ api: 'id', n8n: 'id', locator: true, v1Fallback: 'userId' }], }, + updateAvatar: { + method: 'PUT' as IHttpRequestMethods, + path: '/users/{user_id}/avatar', + pathParams: [{ api: 'user_id', n8n: 'userId' }], + special: 'avatarUpload', + }, + deleteAvatar: { + method: 'DELETE' as IHttpRequestMethods, + path: '/users/{user_id}/avatar', + pathParams: [{ api: 'user_id', n8n: 'userId' }], + }, getStatus: { method: 'GET' as IHttpRequestMethods, path: '/users/{user_id}/status', @@ -781,6 +802,15 @@ async function executeRoute( } return [{ json: { id: exportId, success: true } as unknown as IDataObject }]; } + if (route.special === 'avatarUpload') { + let avatarUrl = route.path; + for (const pp of route.pathParams ?? []) { + const value = this.getNodeParameter(pp.n8n, i) as number; + avatarUrl = avatarUrl.replace(`{${pp.api}}`, String(value)); + } + const result = await uploadAvatar(this, i, avatarUrl); + return [{ json: result }]; + } // === Build URL with path params === let url = route.path; for (const pp of route.pathParams ?? []) { diff --git a/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts b/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts index 9222e464..c48fe7ae 100644 --- a/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/ChatDescription.ts @@ -121,6 +121,28 @@ export const chatFields: INodeProperties[] = [ description: 'Whether to return a simplified version of the response instead of all fields', displayOptions: { show: { resource: ['chat'], operation: ['getAll'] } }, }, + { + displayName: 'Sort', + name: 'sort', + type: 'options', + options: [{ name: 'ID', value: 'id', description: 'By chat ID' }, +{ name: 'Last Message At', value: 'last_message_at', description: 'By last message date and time' }], + default: "id", + description: 'Sort field', + displayOptions: { show: { resource: ['chat'], operation: ['getAll'] } }, + routing: { send: { type: 'query', property: 'sort' } }, + }, + { + displayName: 'Order', + name: 'order', + type: 'options', + options: [{ name: 'Asc', value: 'asc', description: 'Ascending' }, +{ name: 'Desc', value: 'desc', description: 'Descending' }], + default: "desc", + description: 'Sort direction', + displayOptions: { show: { resource: ['chat'], operation: ['getAll'] } }, + routing: { send: { type: 'query', property: 'order' } }, + }, { displayName: 'Availability', name: 'availability', diff --git a/integrations/n8n/nodes/Pachca/V2/MessageDescription.ts b/integrations/n8n/nodes/Pachca/V2/MessageDescription.ts index ee5deb5a..b9b1f586 100644 --- a/integrations/n8n/nodes/Pachca/V2/MessageDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/MessageDescription.ts @@ -340,6 +340,27 @@ export const messageFields: INodeProperties[] = [ displayOptions: { show: { resource: ['message'], operation: ['getAll'] } }, routing: { send: { type: 'query', property: 'chat_id' } }, }, + { + displayName: 'Sort', + name: 'sort', + type: 'options', + options: [{ name: 'ID', value: 'id', description: 'By message ID' }], + default: "id", + description: 'Sort field', + displayOptions: { show: { resource: ['message'], operation: ['getAll'] } }, + routing: { send: { type: 'query', property: 'sort' } }, + }, + { + displayName: 'Order', + name: 'order', + type: 'options', + options: [{ name: 'Asc', value: 'asc', description: 'Ascending' }, +{ name: 'Desc', value: 'desc', description: 'Descending' }], + default: "desc", + description: 'Sort direction', + displayOptions: { show: { resource: ['message'], operation: ['getAll'] } }, + routing: { send: { type: 'query', property: 'order' } }, + }, { displayName: 'ID', name: 'id', diff --git a/integrations/n8n/nodes/Pachca/V2/ProfileDescription.ts b/integrations/n8n/nodes/Pachca/V2/ProfileDescription.ts index 21af5acf..cbc38570 100644 --- a/integrations/n8n/nodes/Pachca/V2/ProfileDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/ProfileDescription.ts @@ -8,6 +8,11 @@ export const profileOperations: INodeProperties[] = [ noDataExpression: true, displayOptions: { show: { resource: ['profile'] } }, options: [ + { + name: 'Delete Avatar', + value: 'deleteAvatar', + action: 'Delete profile avatar', + }, { name: 'Delete Status', value: 'deleteStatus', @@ -28,6 +33,11 @@ export const profileOperations: INodeProperties[] = [ value: 'getStatus', action: 'Get profile status', }, + { + name: 'Update Avatar', + value: 'updateAvatar', + action: 'Update profile avatar', + }, { name: 'Update Status', value: 'updateStatus', @@ -55,6 +65,15 @@ export const profileFields: INodeProperties[] = [ description: 'Whether to return a simplified version of the response instead of all fields', displayOptions: { show: { resource: ['profile'], operation: ['get'] } }, }, + { + displayName: 'Input Binary Field', + name: 'image', + type: 'string', + required: true, + default: "data", + description: 'Name of the binary property containing the avatar image. Use a previous node (e.g. HTTP Request, Read Binary File) to load the image.', + displayOptions: { show: { resource: ['profile'], operation: ['updateAvatar'] } }, + }, { displayName: 'Simplify', name: 'simplify', diff --git a/integrations/n8n/nodes/Pachca/V2/UserDescription.ts b/integrations/n8n/nodes/Pachca/V2/UserDescription.ts index 310a2b62..af72c1d3 100644 --- a/integrations/n8n/nodes/Pachca/V2/UserDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/UserDescription.ts @@ -18,6 +18,11 @@ export const userOperations: INodeProperties[] = [ value: 'delete', action: 'Delete a user', }, + { + name: 'Delete Avatar', + value: 'deleteAvatar', + action: 'Delete user avatar', + }, { name: 'Delete Status', value: 'deleteStatus', @@ -43,6 +48,11 @@ export const userOperations: INodeProperties[] = [ value: 'update', action: 'Update a user', }, + { + name: 'Update Avatar', + value: 'updateAvatar', + action: 'Update user avatar', + }, { name: 'Update Status', value: 'updateStatus', @@ -471,6 +481,45 @@ export const userFields: INodeProperties[] = [ default: '', displayOptions: { show: { resource: ['user'], operation: ['delete'] } }, }, + { + displayName: 'User ID', + name: 'userId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['user'], operation: ['updateAvatar'] } }, + }, + { + displayName: 'Requires admin permissions', + name: 'userUpdateAvatarNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['user'], operation: ['updateAvatar'] } }, + }, + { + displayName: 'Input Binary Field', + name: 'image', + type: 'string', + required: true, + default: "data", + description: 'Name of the binary property containing the avatar image. Use a previous node (e.g. HTTP Request, Read Binary File) to load the image.', + displayOptions: { show: { resource: ['user'], operation: ['updateAvatar'] } }, + }, + { + displayName: 'User ID', + name: 'userId', + type: 'number', + required: true, + default: 0, + displayOptions: { show: { resource: ['user'], operation: ['deleteAvatar'] } }, + }, + { + displayName: 'Requires admin permissions', + name: 'userDeleteAvatarNotice', + type: 'notice', + default: '', + displayOptions: { show: { resource: ['user'], operation: ['deleteAvatar'] } }, + }, { displayName: 'User ID', name: 'userId', diff --git a/integrations/n8n/scripts/generate-n8n.ts b/integrations/n8n/scripts/generate-n8n.ts index 1af7f99a..1769be5b 100644 --- a/integrations/n8n/scripts/generate-n8n.ts +++ b/integrations/n8n/scripts/generate-n8n.ts @@ -971,6 +971,20 @@ function generateResourceDescription( requiredFields = requiredFields.filter(f => f.name !== 'blocks'); } + // Avatar upload: replace `image` body field with binary property reference + if (getSpecialHandler(resource, op.v2Op) === 'avatarUpload') { + requiredFields = requiredFields.filter(f => f.name !== 'image'); + lines.push(`\t{`); + lines.push(`\t\tdisplayName: 'Input Binary Field',`); + lines.push(`\t\tname: 'image',`); + lines.push(`\t\ttype: 'string',`); + lines.push(`\t\trequired: true,`); + lines.push(`\t\tdefault: "data",`); + lines.push(`\t\tdescription: 'Name of the binary property containing the avatar image. Use a previous node (e.g. HTTP Request, Read Binary File) to load the image.',`); + lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); + lines.push(`\t},`); + } + for (const field of requiredFields) { lines.push(generateFieldProperty(field, resource, op, allResourceValues, allOpValues, true)); } @@ -2484,6 +2498,7 @@ function getSpecialHandler(resource: string, v2Op: string): string | null { if (resource === 'bot' && v2Op === 'update') return 'botWebhook'; if (resource === 'user' && v2Op === 'getAll') return 'userGetAllFilters'; if (resource === 'export' && v2Op === 'get') return 'exportDownload'; + if ((resource === 'profile' || resource === 'user') && v2Op === 'updateAvatar') return 'avatarUpload'; return null; } @@ -2547,8 +2562,8 @@ function buildRouteEntry(resource: string, op: OperationInfo): string { const special = getSpecialHandler(resource, v2Op); if (special) parts.push(`special: '${special}'`); - // For file upload, skip body/query — handled entirely by special handler - if (special === 'fileUpload') { + // For file upload / avatar upload, skip body/query — handled entirely by special handler + if (special === 'fileUpload' || special === 'avatarUpload') { return `\t\t${v2Op}: {\n\t\t\t${parts.join(',\n\t\t\t')},\n\t\t}`; } @@ -2769,6 +2784,7 @@ import { \tcleanFileAttachments, \tresolveFormBlocksFromParams, \tuploadFileToS3, +\tuploadAvatar, \tsplitAndValidateCommaList, \tsimplifyItem, \tFORM_TEMPLATES, @@ -2927,6 +2943,15 @@ async function executeRoute( \t\t} \t\treturn [{ json: { id: exportId, success: true } as unknown as IDataObject }]; \t} +\tif (route.special === 'avatarUpload') { +\t\tlet avatarUrl = route.path; +\t\tfor (const pp of route.pathParams ?? []) { +\t\t\tconst value = this.getNodeParameter(pp.n8n, i) as number; +\t\t\tavatarUrl = avatarUrl.replace(\`{\${pp.api}}\`, String(value)); +\t\t} +\t\tconst result = await uploadAvatar(this, i, avatarUrl); +\t\treturn [{ json: result }]; +\t} \t// === Build URL with path params === \tlet url = route.path; \tfor (const pp of route.pathParams ?? []) { diff --git a/integrations/n8n/tests/router.test.ts b/integrations/n8n/tests/router.test.ts index 14a79489..e2492e40 100644 --- a/integrations/n8n/tests/router.test.ts +++ b/integrations/n8n/tests/router.test.ts @@ -466,6 +466,71 @@ describe('Special: botWebhook', () => { }); }); +describe('Special: avatarUpload', () => { + it('profile.updateAvatar calls uploadAvatar with /profile/avatar', async () => { + const spy = vi.spyOn(GenericFunctions, 'uploadAvatar').mockResolvedValue({ + id: 1, + image_url: 'https://example.com/avatar.jpg', + }); + + const ctx = createMockContext({ + resource: 'profile', + operation: 'updateAvatar', + params: { image: 'data' }, + }); + const result = await runRouter(ctx); + expect(result[0][0].json).toHaveProperty('image_url', 'https://example.com/avatar.jpg'); + expect(spy).toHaveBeenCalledTimes(1); + expect(spy.mock.calls[0][2]).toBe('/profile/avatar'); + + spy.mockRestore(); + }); + + it('user.updateAvatar calls uploadAvatar with /users/{user_id}/avatar', async () => { + const spy = vi.spyOn(GenericFunctions, 'uploadAvatar').mockResolvedValue({ + id: 42, + image_url: 'https://example.com/user-avatar.jpg', + }); + + const ctx = createMockContext({ + resource: 'user', + operation: 'updateAvatar', + params: { image: 'data', userId: 42 }, + }); + const result = await runRouter(ctx); + expect(result[0][0].json).toHaveProperty('image_url', 'https://example.com/user-avatar.jpg'); + expect(spy).toHaveBeenCalledTimes(1); + expect(spy.mock.calls[0][2]).toBe('/users/42/avatar'); + + spy.mockRestore(); + }); + + it('profile.deleteAvatar sends DELETE /profile/avatar', async () => { + const ctx = createMockContext({ + resource: 'profile', + operation: 'deleteAvatar', + }); + mockResponse(ctx, { statusCode: 204, body: {} }); + const result = await runRouter(ctx); + expect(ctx._calls[0].method).toBe('DELETE'); + expect(ctx._calls[0].url).toContain('/profile/avatar'); + expect(result[0][0].json).toEqual({ success: true }); + }); + + it('user.deleteAvatar sends DELETE /users/{user_id}/avatar', async () => { + const ctx = createMockContext({ + resource: 'user', + operation: 'deleteAvatar', + params: { userId: 42 }, + }); + mockResponse(ctx, { statusCode: 204, body: {} }); + const result = await runRouter(ctx); + expect(ctx._calls[0].method).toBe('DELETE'); + expect(ctx._calls[0].url).toContain('/users/42/avatar'); + expect(result[0][0].json).toEqual({ success: true }); + }); +}); + describe('Special: fileUpload', () => { it('calls uploadFileToS3', async () => { const spy = vi.spyOn(GenericFunctions, 'uploadFileToS3').mockResolvedValue({ diff --git a/packages/cli/README.md b/packages/cli/README.md index a1a03378..2ac5d674 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -171,6 +171,8 @@ pachca guide # список всех сценариев |---------|---------| | `pachca profile get-info` | Информация о токене | | `pachca profile get` | Информация о профиле | +| `pachca profile update-avatar` | Загрузка аватара | +| `pachca profile delete-avatar` | Удаление аватара | | `pachca profile get-status` | Текущий статус | | `pachca profile update-status` | Новый статус | | `pachca profile delete-status` | Удаление статуса | @@ -202,6 +204,8 @@ pachca guide # список всех сценариев | `pachca users get` | Информация о сотруднике | | `pachca users update` | Редактирование сотрудника | | `pachca users delete` | Удаление сотрудника | +| `pachca users update-avatar` | Загрузка аватара сотрудника | +| `pachca users remove-avatar` | Удаление аватара сотрудника | | `pachca users get-status` | Статус сотрудника | | `pachca users update-status` | Новый статус сотрудника | | `pachca users remove-status` | Удаление статуса сотрудника | diff --git a/packages/cli/oclif.manifest.json b/packages/cli/oclif.manifest.json index 9e8a35de..e2eee9a7 100644 --- a/packages/cli/oclif.manifest.json +++ b/packages/cli/oclif.manifest.json @@ -1 +1 @@ -{"commands":{"api":{"aliases":[],"args":{"method":{"description":"HTTP method (GET, POST, PUT, DELETE)","name":"method","options":["GET","POST","PUT","DELETE","PATCH"],"required":true},"path":{"description":"API path (e.g., /messages)","name":"path","required":true}},"description":"Произвольный запрос к API","examples":["<%= config.bin %> api GET /messages --query chat_id=123","<%= config.bin %> api POST /messages -F message[chat_id]=12345 -f message[content]=\"Привет\"","<%= config.bin %> api POST /messages --input payload.json","<%= config.bin %> api GET /profile -o yaml"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"raw-field":{"char":"f","description":"String field (key=value)","name":"raw-field","hasDynamicHelp":false,"multiple":true,"type":"option"},"field":{"char":"F","description":"Typed field (numbers/bools auto-converted, @file reads file)","name":"field","hasDynamicHelp":false,"multiple":true,"type":"option"},"input":{"description":"JSON file to send as body (- for stdin)","name":"input","hasDynamicHelp":false,"multiple":false,"type":"option"},"query":{"description":"Query parameter (key=value)","name":"query","hasDynamicHelp":false,"multiple":true,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"api","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":false,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","api.js"]},"auth:list":{"aliases":[],"args":{},"description":"Список сохранённых профилей","examples":["<%= config.bin %> auth list","<%= config.bin %> auth list -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","list.js"]},"auth:login":{"aliases":[],"args":{},"description":"Авторизация и сохранение токена","examples":["<%= config.bin %> auth login","<%= config.bin %> auth login --profile personal","<%= config.bin %> auth login --profile ci --token $PACHCA_TOKEN"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile name (default: \"default\")","name":"profile","default":"default","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Token to save (skips prompt)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:login","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","login.js"]},"auth:logout":{"aliases":[],"args":{"profile":{"description":"Profile name to remove","name":"profile","required":false}},"description":"Удаление сохранённого профиля","examples":["<%= config.bin %> auth logout bot-notify","<%= config.bin %> auth logout"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:logout","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","logout.js"]},"auth:status":{"aliases":[],"args":{},"description":"Статус текущего профиля","examples":["<%= config.bin %> auth status","<%= config.bin %> auth status -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","status.js"]},"auth:switch":{"aliases":[],"args":{"profile":{"description":"Profile name to switch to","name":"profile","required":true}},"description":"Переключение активного профиля","examples":["<%= config.bin %> auth switch bot-support"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:switch","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","switch.js"]},"bots:list-events":{"aliases":[],"args":{},"description":"История событий","examples":["Обработка событий через историю (polling):\n $ pachca bots list-events"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"bots:list-events","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"webhooks:events:read","apiMethod":"GET","apiPath":"/webhooks/events","defaultColumns":["id","created_at","event_type","payload"],"isESM":true,"relativePath":["dist","commands","bots","list-events.js"]},"bots:remove-event":{"aliases":[],"args":{"id":{"description":"Идентификатор события (pachca bots list)","name":"id","required":true}},"description":"Удаление события","examples":["Обработка событий через историю (polling):\n $ pachca bots remove-event"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"bots:remove-event","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"webhooks:events:delete","apiMethod":"DELETE","apiPath":"/webhooks/events/{id}","isESM":true,"relativePath":["dist","commands","bots","remove-event.js"]},"bots:update":{"aliases":[],"args":{"id":{"description":"Идентификатор бота (pachca bots list)","name":"id","required":true}},"description":"Редактирование бота","examples":["Обновить Webhook URL бота:\n $ pachca bots update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"webhook":{"description":"Объект параметров вебхука","name":"webhook","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"bots:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"bots:write","apiMethod":"PUT","apiPath":"/bots/{id}","defaultColumns":["id"],"requiredFlags":["webhook"],"isESM":true,"relativePath":["dist","commands","bots","update.js"]},"changelog":{"aliases":[],"args":{},"description":"История изменений CLI","examples":["<%= config.bin %> changelog","<%= config.bin %> changelog -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"changelog","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","changelog.js"]},"chats:archive":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Архивация чата","examples":["Архивация и управление чатом:\n $ pachca chats archive","Найти и заархивировать неактивные чаты:\n $ pachca chats archive"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:archive","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:archive","apiMethod":"PUT","apiPath":"/chats/{id}/archive","isESM":true,"relativePath":["dist","commands","chats","archive.js"]},"chats:create":{"aliases":[],"args":{},"description":"Новый чат","examples":["Создать канал и пригласить участников:\n $ pachca chats create","Создать проектную беседу из шаблона:\n $ pachca chats create","Найти активные чаты за период:\n $ pachca chats list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"},"member-ids":{"description":"Массив идентификаторов пользователей, которые станут участниками","name":"member-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"group-tag-ids":{"description":"Массив идентификаторов тегов, которые станут участниками","name":"group-tag-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"channel":{"description":"Является каналом","name":"channel","allowNo":true,"type":"boolean"},"public":{"description":"Открытый доступ","name":"public","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:create","apiMethod":"POST","apiPath":"/chats","defaultColumns":["id","name","created_at","owner_id","channel"],"requiredFlags":["name"],"isESM":true,"relativePath":["dist","commands","chats","create.js"]},"chats:get":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Информация о чате","examples":["Переименовать или обновить чат:\n $ pachca chats update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:read","apiMethod":"GET","apiPath":"/chats/{id}","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","chats","get.js"]},"chats:list":{"aliases":[],"args":{},"description":"Список чатов","examples":["Создать канал и пригласить участников:\n $ pachca chats create","Создать проектную беседу из шаблона:\n $ pachca chats create","Найти активные чаты за период:\n $ pachca chats list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"sort":{"description":"Поле сортировки (id — идентификатор чата, last-message-at — дата и время создания последнего сообщения)","name":"sort","hasDynamicHelp":false,"multiple":false,"options":["id","last-message-at"],"type":"option"},"order":{"description":"Порядок сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"availability":{"description":"Параметр, который отвечает за доступность и выборку чатов для пользователя","name":"availability","hasDynamicHelp":false,"multiple":false,"type":"option"},"last-message-at-after":{"description":"Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не раньше чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).","name":"last-message-at-after","hasDynamicHelp":false,"multiple":false,"type":"option"},"last-message-at-before":{"description":"Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не позже чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).","name":"last-message-at-before","hasDynamicHelp":false,"multiple":false,"type":"option"},"personal":{"description":"Фильтрация по личным и групповым чатам. Если параметр не указан, возвращаются любые чаты.","name":"personal","allowNo":true,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:read","apiMethod":"GET","apiPath":"/chats","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","chats","list.js"]},"chats:unarchive":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Разархивация чата","examples":["Архивация и управление чатом:\n $ pachca chats unarchive"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:unarchive","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:archive","apiMethod":"PUT","apiPath":"/chats/{id}/unarchive","isESM":true,"relativePath":["dist","commands","chats","unarchive.js"]},"chats:update":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Обновление чата","examples":["Переименовать или обновить чат:\n $ pachca chats update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"},"public":{"description":"Открытый доступ","name":"public","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:update","apiMethod":"PUT","apiPath":"/chats/{id}","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","chats","update.js"]},"commands":{"aliases":[],"args":{},"description":"Список всех команд","examples":["<%= config.bin %> commands","<%= config.bin %> commands --available","<%= config.bin %> commands --available -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"available":{"description":"Show only commands available to current token","name":"available","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"commands","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","commands.js"]},"common:custom-properties":{"aliases":[],"args":{},"description":"Список дополнительных полей","examples":["Получить кастомные поля профиля:\n $ pachca common custom-properties"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"entity-type":{"description":"Тип сущности","name":"entity-type","hasDynamicHelp":false,"multiple":false,"options":["User","Task"],"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:custom-properties","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"custom_properties:read","apiMethod":"GET","apiPath":"/custom_properties","defaultColumns":["id","name","data_type"],"requiredFlags":["entity-type"],"isESM":true,"relativePath":["dist","commands","common","custom-properties.js"]},"common:direct-url":{"aliases":[],"args":{},"description":"Загрузка файла","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"direct-url":{"description":"URL для отправки запроса (получается из ответа POST /uploads)","name":"direct-url","required":true,"hasDynamicHelp":false,"multiple":false,"type":"option"},"content-disposition":{"description":"Параметр Content-Disposition, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"content-disposition","hasDynamicHelp":false,"multiple":false,"type":"option"},"acl":{"description":"Параметр acl, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"acl","hasDynamicHelp":false,"multiple":false,"type":"option"},"policy":{"description":"Параметр policy, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"policy","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-credential":{"description":"Параметр x-amz-credential, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-credential","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-algorithm":{"description":"Параметр x-amz-algorithm, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-algorithm","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-date":{"description":"Параметр x-amz-date, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-date","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-signature":{"description":"Параметр x-amz-signature, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-signature","hasDynamicHelp":false,"multiple":false,"type":"option"},"key":{"description":"Параметр key, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"key","hasDynamicHelp":false,"multiple":false,"type":"option"},"file":{"description":"Файл для загрузки","name":"file","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:direct-url","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"apiMethod":"POST","apiPath":"/direct_url","requiredFlags":["content-disposition","acl","policy","x-amz-credential","x-amz-algorithm","x-amz-date","x-amz-signature","key"],"isESM":true,"relativePath":["dist","commands","common","direct-url.js"]},"common:get-exports":{"aliases":[],"args":{"id":{"description":"Идентификатор экспорта","name":"id","required":true}},"description":"Скачать архив экспорта","examples":["Экспорт истории чата:\n $ pachca common get-exports"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"save":{"description":"Путь для сохранения файла","name":"save","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:get-exports","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_exports:read","plan":"corporation","apiMethod":"GET","apiPath":"/chats/exports/{id}","isESM":true,"relativePath":["dist","commands","common","get-exports.js"]},"common:request-export":{"aliases":[],"args":{},"description":"Экспорт сообщений","examples":["Экспорт истории чата:\n $ pachca common request-export"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"start-at":{"description":"Дата начала для экспорта (ISO-8601, UTC+0) в формате YYYY-MM-DD","name":"start-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"end-at":{"description":"Дата окончания для экспорта (ISO-8601, UTC+0) в формате YYYY-MM-DD","name":"end-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"webhook-url":{"description":"Адрес, на который будет отправлен вебхук по завершению экспорта","name":"webhook-url","hasDynamicHelp":false,"multiple":false,"type":"option"},"chat-ids":{"description":"Массив идентификаторов чатов. Указывается, если нужно получить сообщения только некоторых чатов.","name":"chat-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"skip-chats-file":{"description":"Пропуск формирования файла со списком чатов (chats.json)","name":"skip-chats-file","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:request-export","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_exports:write","plan":"corporation","apiMethod":"POST","apiPath":"/chats/exports","requiredFlags":["start-at","end-at","webhook-url"],"isESM":true,"relativePath":["dist","commands","common","request-export.js"]},"common:uploads":{"aliases":[],"args":{},"description":"Получение подписи, ключа и других параметров","examples":["Изменить вложения сообщения:\n $ pachca common uploads"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:uploads","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"uploads:write","apiMethod":"POST","apiPath":"/uploads","defaultColumns":["Content-Disposition","acl","policy","x-amz-credential","x-amz-algorithm"],"isESM":true,"relativePath":["dist","commands","common","uploads.js"]},"config:get":{"aliases":[],"args":{"key":{"description":"Configuration key","name":"key","required":true}},"description":"Получение значения конфигурации","examples":["<%= config.bin %> config get defaults.output"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"config:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","config","get.js"]},"config:list":{"aliases":[],"args":{},"description":"Список всех настроек","examples":["<%= config.bin %> config list","<%= config.bin %> config list -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"config:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","config","list.js"]},"config:set":{"aliases":[],"args":{"key":{"description":"Configuration key","name":"key","required":true},"value":{"description":"Configuration value","name":"value","required":true}},"description":"Установка значения конфигурации","examples":["<%= config.bin %> config set defaults.output json","<%= config.bin %> config set defaults.timeout 60"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"config:set","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","config","set.js"]},"doctor":{"aliases":[],"args":{},"description":"Диагностика окружения: Node.js, сеть, токен, конфигурация","examples":["<%= config.bin %> doctor","<%= config.bin %> doctor -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"doctor","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","doctor.js"]},"group-tags:create":{"aliases":[],"args":{},"description":"Новый тег","examples":["Массовое создание сотрудников с тегами:\n $ pachca group-tags create","Получить всех сотрудников тега/департамента:\n $ pachca group-tags list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название тега","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:write","apiMethod":"POST","apiPath":"/group_tags","defaultColumns":["id","name","users_count"],"requiredFlags":["name"],"isESM":true,"relativePath":["dist","commands","group-tags","create.js"]},"group-tags:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Удаление тега","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:write","apiMethod":"DELETE","apiPath":"/group_tags/{id}","isESM":true,"relativePath":["dist","commands","group-tags","delete.js"]},"group-tags:get":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Информация о теге","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:read","apiMethod":"GET","apiPath":"/group_tags/{id}","defaultColumns":["id","name","users_count"],"isESM":true,"relativePath":["dist","commands","group-tags","get.js"]},"group-tags:list":{"aliases":[],"args":{},"description":"Список тегов сотрудников","examples":["Массовое создание сотрудников с тегами:\n $ pachca group-tags create","Получить всех сотрудников тега/департамента:\n $ pachca group-tags list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"names":{"description":"Массив названий тегов, по которым вы хотите отфильтровать список (через запятую)","name":"names","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:read","apiMethod":"GET","apiPath":"/group_tags","defaultColumns":["id","name","users_count"],"isESM":true,"relativePath":["dist","commands","group-tags","list.js"]},"group-tags:list-users":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Список сотрудников тега","examples":["Получить всех сотрудников тега/департамента:\n $ pachca group-tags list-users"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:list-users","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:read","apiMethod":"GET","apiPath":"/group_tags/{id}/users","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","group-tags","list-users.js"]},"group-tags:update":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Редактирование тега","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название тега","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:write","apiMethod":"PUT","apiPath":"/group_tags/{id}","defaultColumns":["id","name","users_count"],"requiredFlags":["name"],"isESM":true,"relativePath":["dist","commands","group-tags","update.js"]},"guide":{"aliases":[],"args":{"query":{"description":"Search query","name":"query","required":false}},"description":"Поиск сценариев использования","examples":["<%= config.bin %> guide \"отправить файл\"","<%= config.bin %> guide \"создать бота\"","<%= config.bin %> guide"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"guide","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","guide.js"]},"introspect":{"aliases":[],"args":{"command":{"description":"Command name (e.g., \"messages create\")","name":"command","required":false}},"description":"Метаданные команды в машиночитаемом формате","examples":["<%= config.bin %> introspect messages create","<%= config.bin %> introspect"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"introspect","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":false,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","introspect.js"]},"link-previews:add":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Unfurl (разворачивание ссылок)","examples":["Разворачивание ссылок (unfurling):\n $ pachca link-previews add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"link-previews":{"description":"`JSON` карта предпросмотров ссылок, где каждый ключ — `URL`, который был получен в исходящем вебхуке о новом сообщении.","name":"link-previews","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"link-previews:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"link_previews:write","apiMethod":"POST","apiPath":"/messages/{id}/link_previews","requiredFlags":["link-previews"],"isESM":true,"relativePath":["dist","commands","link-previews","add.js"]},"members:add":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (беседа, канал или чат треда)","name":"id","required":true}},"description":"Добавление пользователей","examples":["Подписаться на тред сообщения:\n $ pachca members add","Упомянуть пользователя по имени:\n $ pachca members list","Создать канал и пригласить участников:\n $ pachca members add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"member-ids":{"description":"Массив идентификаторов пользователей, которые станут участниками","name":"member-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"silent":{"description":"Не создавать в чате системное сообщение о добавлении участника","name":"silent","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"POST","apiPath":"/chats/{id}/members","requiredFlags":["member-ids"],"isESM":true,"relativePath":["dist","commands","members","add.js"]},"members:add-group-tags":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true}},"description":"Добавление тегов","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"group-tag-ids":{"description":"Массив идентификаторов тегов, которые станут участниками","name":"group-tag-ids","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:add-group-tags","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"POST","apiPath":"/chats/{id}/group_tags","requiredFlags":["group-tag-ids"],"isESM":true,"relativePath":["dist","commands","members","add-group-tags.js"]},"members:leave":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true}},"description":"Выход из беседы или канала","examples":["Архивация и управление чатом:\n $ pachca members leave"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:leave","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:leave","apiMethod":"DELETE","apiPath":"/chats/{id}/leave","isESM":true,"relativePath":["dist","commands","members","leave.js"]},"members:list":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true}},"description":"Список участников чата","examples":["Подписаться на тред сообщения:\n $ pachca members add","Упомянуть пользователя по имени:\n $ pachca members list","Создать канал и пригласить участников:\n $ pachca members add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"role":{"description":"Роль в чате","name":"role","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:read","apiMethod":"GET","apiPath":"/chats/{id}/members","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","members","list.js"]},"members:remove":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true},"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Исключение пользователя","examples":["Архивация и управление чатом:\n $ pachca members update","Архивация и управление чатом:\n $ pachca members remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:remove","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"DELETE","apiPath":"/chats/{id}/members/{user_id}","isESM":true,"relativePath":["dist","commands","members","remove.js"]},"members:remove-group-tag":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true},"tag_id":{"description":"Идентификатор тега (pachca tags list)","name":"tag_id","required":true}},"description":"Исключение тега","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:remove-group-tag","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"DELETE","apiPath":"/chats/{id}/group_tags/{tag_id}","isESM":true,"relativePath":["dist","commands","members","remove-group-tag.js"]},"members:update":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true},"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Редактирование роли","examples":["Архивация и управление чатом:\n $ pachca members update","Архивация и управление чатом:\n $ pachca members remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"role":{"description":"Роль","name":"role","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"PUT","apiPath":"/chats/{id}/members/{user_id}","requiredFlags":["role"],"isESM":true,"relativePath":["dist","commands","members","update.js"]},"messages:create":{"aliases":[],"args":{},"description":"Новое сообщение","examples":["Найти чат по имени и отправить сообщение:\n $ pachca messages create","Отправить сообщение в канал или беседу (если chat_id известен):\n $ pachca messages create","Отправить личное сообщение пользователю:\n $ pachca messages create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"entity-type":{"description":"Тип сущности","name":"entity-type","hasDynamicHelp":false,"multiple":false,"type":"option"},"entity-id":{"description":"Идентификатор сущности (pachca chats list | pachca users list)","name":"entity-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"content":{"description":"Текст сообщения","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"files":{"description":"Прикрепляемые файлы","name":"files","hasDynamicHelp":false,"multiple":false,"type":"option"},"buttons":{"description":"Массив строк, каждая из которых представлена массивом кнопок. Максимум 100 кнопок у сообщения, до 8 кнопок в строке.","name":"buttons","hasDynamicHelp":false,"multiple":false,"type":"option"},"parent-message-id":{"description":"Идентификатор сообщения. Указывается в случае, если вы отправляете ответ на другое сообщение.","name":"parent-message-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-avatar-url":{"description":"Ссылка на специальную аватарку отправителя для этого сообщения. Использование этого поля возможно только с access_token бота. (макс. 255 символов)","name":"display-avatar-url","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-name":{"description":"Полное специальное имя отправителя для этого сообщения. Использование этого поля возможно только с access_token бота. (макс. 255 символов)","name":"display-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"skip-invite-mentions":{"description":"Пропуск добавления упоминаемых пользователей в тред. Работает только при отправке сообщения в тред.","name":"skip-invite-mentions","allowNo":true,"type":"boolean"},"link-preview":{"description":"Отображение предпросмотра первой найденной ссылки в тексте сообщения","name":"link-preview","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:create","apiMethod":"POST","apiPath":"/messages","defaultColumns":["id","content","created_at","entity_type","entity_id"],"requiredFlags":["entity-id","content"],"isESM":true,"relativePath":["dist","commands","messages","create.js"]},"messages:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Удаление сообщения","examples":["Получить вложения из сообщения:\n $ pachca messages get","Отредактировать сообщение:\n $ pachca messages update","Изменить вложения сообщения:\n $ pachca messages get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:delete","apiMethod":"DELETE","apiPath":"/messages/{id}","isESM":true,"relativePath":["dist","commands","messages","delete.js"]},"messages:get":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Информация о сообщении","examples":["Получить вложения из сообщения:\n $ pachca messages get","Отредактировать сообщение:\n $ pachca messages update","Изменить вложения сообщения:\n $ pachca messages get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:read","apiMethod":"GET","apiPath":"/messages/{id}","defaultColumns":["id","content","created_at","entity_type","entity_id"],"isESM":true,"relativePath":["dist","commands","messages","get.js"]},"messages:list":{"aliases":[],"args":{},"description":"Список сообщений чата","examples":["Найти чат по имени и отправить сообщение:\n $ pachca messages create","Отправить сообщение в канал или беседу (если chat_id известен):\n $ pachca messages create","Отправить личное сообщение пользователю:\n $ pachca messages create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"chat-id":{"description":"Идентификатор чата (беседа, канал, диалог или чат треда)","name":"chat-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"sort":{"description":"Поле сортировки (id — идентификатор сообщения)","name":"sort","hasDynamicHelp":false,"multiple":false,"options":["id"],"type":"option"},"order":{"description":"Порядок сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:read","apiMethod":"GET","apiPath":"/messages","defaultColumns":["id","content","created_at","entity_type","entity_id"],"requiredFlags":["chat-id"],"isESM":true,"relativePath":["dist","commands","messages","list.js"]},"messages:pin":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Закрепление сообщения","examples":["Закрепить/открепить сообщение:\n $ pachca messages pin","Закрепить/открепить сообщение:\n $ pachca messages unpin"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:pin","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"pins:write","apiMethod":"POST","apiPath":"/messages/{id}/pin","isESM":true,"relativePath":["dist","commands","messages","pin.js"]},"messages:unpin":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Открепление сообщения","examples":["Закрепить/открепить сообщение:\n $ pachca messages pin","Закрепить/открепить сообщение:\n $ pachca messages unpin"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:unpin","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"pins:write","apiMethod":"DELETE","apiPath":"/messages/{id}/pin","isESM":true,"relativePath":["dist","commands","messages","unpin.js"]},"messages:update":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Редактирование сообщения","examples":["Получить вложения из сообщения:\n $ pachca messages get","Отредактировать сообщение:\n $ pachca messages update","Изменить вложения сообщения:\n $ pachca messages get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"content":{"description":"Текст сообщения","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"files":{"description":"Прикрепляемые файлы","name":"files","hasDynamicHelp":false,"multiple":false,"type":"option"},"buttons":{"description":"Массив строк, каждая из которых представлена массивом кнопок. Максимум 100 кнопок у сообщения, до 8 кнопок в строке. Для удаления кнопок пришлите пустой массив.","name":"buttons","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-avatar-url":{"description":"Ссылка на специальную аватарку отправителя для этого сообщения. Использование этого поля возможно только с access_token бота.","name":"display-avatar-url","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-name":{"description":"Полное специальное имя отправителя для этого сообщения. Использование этого поля возможно только с access_token бота.","name":"display-name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:update","apiMethod":"PUT","apiPath":"/messages/{id}","defaultColumns":["id","content","created_at","entity_type","entity_id"],"isESM":true,"relativePath":["dist","commands","messages","update.js"]},"profile:delete-status":{"aliases":[],"args":{},"description":"Удаление статуса","examples":["Установить статус:\n $ pachca profile update-status","Сбросить статус:\n $ pachca profile delete-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:delete-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_status:write","apiMethod":"DELETE","apiPath":"/profile/status","isESM":true,"relativePath":["dist","commands","profile","delete-status.js"]},"profile:get":{"aliases":[],"args":{},"description":"Информация о профиле","examples":["Получить свой профиль:\n $ pachca profile get","Получить кастомные поля профиля:\n $ pachca profile get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile:read","apiMethod":"GET","apiPath":"/profile","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","profile","get.js"]},"profile:get-info":{"aliases":[],"args":{},"description":"Информация о токене","examples":["Проверить свой токен:\n $ pachca profile get-info"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:get-info","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"apiMethod":"GET","apiPath":"/oauth/token/info","defaultColumns":["id","name","created_at","token","user_id"],"isESM":true,"relativePath":["dist","commands","profile","get-info.js"]},"profile:get-status":{"aliases":[],"args":{},"description":"Текущий статус","examples":["Установить статус:\n $ pachca profile update-status","Сбросить статус:\n $ pachca profile delete-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:get-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_status:read","apiMethod":"GET","apiPath":"/profile/status","defaultColumns":["title","emoji","expires_at","is_away"],"isESM":true,"relativePath":["dist","commands","profile","get-status.js"]},"profile:update-status":{"aliases":[],"args":{},"description":"Новый статус","examples":["Установить статус:\n $ pachca profile update-status","Сбросить статус:\n $ pachca profile delete-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"emoji":{"description":"Emoji символ статуса","name":"emoji","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Текст статуса","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"expires-at":{"description":"Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ","name":"expires-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"is-away":{"description":"Режим «Нет на месте»","name":"is-away","allowNo":true,"type":"boolean"},"away-message":{"description":"Текст сообщения при режиме «Нет на месте». Отображается в профиле и при личных сообщениях/упоминаниях. (макс. 1024 символов)","name":"away-message","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:update-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_status:write","apiMethod":"PUT","apiPath":"/profile/status","defaultColumns":["title","emoji","expires_at","is_away"],"requiredFlags":["emoji","title"],"isESM":true,"relativePath":["dist","commands","profile","update-status.js"]},"reactions:add":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Добавление реакции","examples":["Добавить реакцию на сообщение:\n $ pachca reactions add","Добавить реакцию на сообщение:\n $ pachca reactions remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"code":{"description":"Emoji символ реакции","name":"code","hasDynamicHelp":false,"multiple":false,"type":"option"},"name":{"description":"Текстовое имя эмодзи (используется для кастомных эмодзи)","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"reactions:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"reactions:write","apiMethod":"POST","apiPath":"/messages/{id}/reactions","defaultColumns":["name","created_at","user_id","code"],"requiredFlags":["code"],"isESM":true,"relativePath":["dist","commands","reactions","add.js"]},"reactions:list":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Список реакций","examples":["Добавить реакцию на сообщение:\n $ pachca reactions add","Добавить реакцию на сообщение:\n $ pachca reactions remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"reactions:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"reactions:read","apiMethod":"GET","apiPath":"/messages/{id}/reactions","defaultColumns":["name","created_at","user_id","code"],"isESM":true,"relativePath":["dist","commands","reactions","list.js"]},"reactions:remove":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Удаление реакции","examples":["Добавить реакцию на сообщение:\n $ pachca reactions add","Добавить реакцию на сообщение:\n $ pachca reactions remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"code":{"description":"Emoji символ реакции","name":"code","hasDynamicHelp":false,"multiple":false,"type":"option"},"name":{"description":"Текстовое имя эмодзи (используется для кастомных эмодзи)","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"reactions:remove","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"reactions:write","apiMethod":"DELETE","apiPath":"/messages/{id}/reactions","requiredFlags":["code"],"isESM":true,"relativePath":["dist","commands","reactions","remove.js"]},"read-member:list-readers":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Список прочитавших сообщение","examples":["Проверить, кто прочитал сообщение:\n $ pachca read-member list-readers"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"read-member:list-readers","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:read","apiMethod":"GET","apiPath":"/messages/{id}/read_member_ids","isESM":true,"relativePath":["dist","commands","read-member","list-readers.js"]},"search:list-chats":{"aliases":[],"args":{},"description":"Поиск чатов","examples":["Найти чат по имени и отправить сообщение:\n $ pachca search list-chats","Найти чат по названию:\n $ pachca search list-chats"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Текст поискового запроса","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"created-from":{"description":"Фильтр по дате создания (от)","name":"created-from","hasDynamicHelp":false,"multiple":false,"type":"option"},"created-to":{"description":"Фильтр по дате создания (до)","name":"created-to","hasDynamicHelp":false,"multiple":false,"type":"option"},"active":{"description":"Фильтр по активности чата","name":"active","allowNo":true,"type":"boolean"},"chat-subtype":{"description":"Фильтр по типу чата","name":"chat-subtype","hasDynamicHelp":false,"multiple":false,"options":["discussion","thread"],"type":"option"},"personal":{"description":"Фильтр по личным чатам","name":"personal","allowNo":true,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"search:list-chats","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"search:chats","apiMethod":"GET","apiPath":"/search/chats","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","search","list-chats.js"]},"search:list-messages":{"aliases":[],"args":{},"description":"Поиск сообщений","examples":["Найти сообщение по тексту:\n $ pachca search list-messages"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Текст поискового запроса","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"created-from":{"description":"Фильтр по дате создания (от)","name":"created-from","hasDynamicHelp":false,"multiple":false,"type":"option"},"created-to":{"description":"Фильтр по дате создания (до)","name":"created-to","hasDynamicHelp":false,"multiple":false,"type":"option"},"chat-ids":{"description":"Фильтр по ID чатов (через запятую)","name":"chat-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"user-ids":{"description":"Фильтр по ID авторов сообщений (через запятую)","name":"user-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"active":{"description":"Фильтр по активности чата","name":"active","allowNo":true,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"search:list-messages","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"search:messages","apiMethod":"GET","apiPath":"/search/messages","defaultColumns":["id","content","created_at","entity_type","entity_id"],"isESM":true,"relativePath":["dist","commands","search","list-messages.js"]},"search:list-users":{"aliases":[],"args":{},"description":"Поиск сотрудников","examples":["Отправить личное сообщение пользователю:\n $ pachca search list-users","Упомянуть пользователя по имени:\n $ pachca search list-users","Найти сотрудника по имени:\n $ pachca search list-users"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Текст поискового запроса","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"sort":{"description":"Сортировка результатов","name":"sort","hasDynamicHelp":false,"multiple":false,"options":["by_score","alphabetical"],"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"created-from":{"description":"Фильтр по дате создания (от)","name":"created-from","hasDynamicHelp":false,"multiple":false,"type":"option"},"created-to":{"description":"Фильтр по дате создания (до)","name":"created-to","hasDynamicHelp":false,"multiple":false,"type":"option"},"company-roles":{"description":"Фильтр по ролям сотрудников (через запятую)","name":"company-roles","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"search:list-users","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"search:users","apiMethod":"GET","apiPath":"/search/users","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","search","list-users.js"]},"security:list":{"aliases":[],"args":{},"description":"Журнал аудита событий","examples":["Получить журнал аудита событий:\n $ pachca security list","Мониторинг подозрительных входов:\n $ pachca security list","Экспорт логов за период:\n $ pachca security list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"start-time":{"description":"Начальная метка времени (включительно)","name":"start-time","hasDynamicHelp":false,"multiple":false,"type":"option"},"end-time":{"description":"Конечная метка времени (исключительно)","name":"end-time","hasDynamicHelp":false,"multiple":false,"type":"option"},"event-key":{"description":"Фильтр по конкретному типу события","name":"event-key","hasDynamicHelp":false,"multiple":false,"options":["user_login","user_logout","user_2fa_fail","user_2fa_success","user_created","user_deleted","user_role_changed","user_updated","tag_created","tag_deleted","user_added_to_tag","user_removed_from_tag","chat_created","chat_renamed","chat_permission_changed","user_chat_join","user_chat_leave","tag_added_to_chat","tag_removed_from_chat","message_updated","message_deleted","message_created","reaction_created","reaction_deleted","thread_created","access_token_created","access_token_updated","access_token_destroy","kms_encrypt","kms_decrypt","audit_events_accessed","dlp_violation_detected","search_users_api","search_chats_api","search_messages_api"],"type":"option"},"actor-id":{"description":"Идентификатор пользователя, выполнившего действие","name":"actor-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"actor-type":{"description":"Тип актора","name":"actor-type","hasDynamicHelp":false,"multiple":false,"type":"option"},"entity-id":{"description":"Идентификатор затронутой сущности","name":"entity-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"entity-type":{"description":"Тип сущности","name":"entity-type","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"security:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"audit_events:read","plan":"corporation","apiMethod":"GET","apiPath":"/audit_events","defaultColumns":["id","created_at","event_key","entity_id","entity_type"],"isESM":true,"relativePath":["dist","commands","security","list.js"]},"tasks:create":{"aliases":[],"args":{},"description":"Новое напоминание","examples":["Форма заявки/запроса:\n $ pachca tasks create","Создать напоминание:\n $ pachca tasks create","Получить список предстоящих задач:\n $ pachca tasks list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"kind":{"description":"Тип","name":"kind","hasDynamicHelp":false,"multiple":false,"type":"option"},"content":{"description":"Описание (по умолчанию — название типа)","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"due-at":{"description":"Срок выполнения напоминания (ISO-8601) в формате YYYY-MM-DDThh:mm:ss.sssTZD. Если указано время 23:59:59.000, то напоминание будет создано на весь день (без указания времени).","name":"due-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"priority":{"description":"Приоритет: 1, 2 (важно) или 3 (очень важно).","name":"priority","hasDynamicHelp":false,"multiple":false,"type":"option"},"performer-ids":{"description":"Массив идентификаторов пользователей, привязываемых к напоминанию как «ответственные» (по умолчанию ответственным назначается вы)","name":"performer-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"chat-id":{"description":"Идентификатор чата, к которому привязывается напоминание (pachca chats list)","name":"chat-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"all-day":{"description":"Напоминание на весь день (без указания времени)","name":"all-day","allowNo":true,"type":"boolean"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:create","apiMethod":"POST","apiPath":"/tasks","defaultColumns":["id","content","created_at","kind","due_at"],"requiredFlags":["kind"],"isESM":true,"relativePath":["dist","commands","tasks","create.js"]},"tasks:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор напоминания (pachca tasks list)","name":"id","required":true}},"description":"Удаление напоминания","examples":["Получить задачу по ID:\n $ pachca tasks get","Отметить задачу выполненной:\n $ pachca tasks update","Обновить задачу (перенести срок, сменить ответственных):\n $ pachca tasks update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:delete","apiMethod":"DELETE","apiPath":"/tasks/{id}","isESM":true,"relativePath":["dist","commands","tasks","delete.js"]},"tasks:get":{"aliases":[],"args":{"id":{"description":"Идентификатор напоминания (pachca tasks list)","name":"id","required":true}},"description":"Информация о напоминании","examples":["Получить задачу по ID:\n $ pachca tasks get","Отметить задачу выполненной:\n $ pachca tasks update","Обновить задачу (перенести срок, сменить ответственных):\n $ pachca tasks update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:read","apiMethod":"GET","apiPath":"/tasks/{id}","defaultColumns":["id","content","created_at","kind","due_at"],"isESM":true,"relativePath":["dist","commands","tasks","get.js"]},"tasks:list":{"aliases":[],"args":{},"description":"Список напоминаний","examples":["Форма заявки/запроса:\n $ pachca tasks create","Создать напоминание:\n $ pachca tasks create","Получить список предстоящих задач:\n $ pachca tasks list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:read","apiMethod":"GET","apiPath":"/tasks","defaultColumns":["id","content","created_at","kind","due_at"],"isESM":true,"relativePath":["dist","commands","tasks","list.js"]},"tasks:update":{"aliases":[],"args":{"id":{"description":"Идентификатор напоминания (pachca tasks list)","name":"id","required":true}},"description":"Редактирование напоминания","examples":["Получить задачу по ID:\n $ pachca tasks get","Отметить задачу выполненной:\n $ pachca tasks update","Обновить задачу (перенести срок, сменить ответственных):\n $ pachca tasks update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"kind":{"description":"Тип","name":"kind","hasDynamicHelp":false,"multiple":false,"type":"option"},"content":{"description":"Описание","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"due-at":{"description":"Срок выполнения напоминания (ISO-8601) в формате YYYY-MM-DDThh:mm:ss.sssTZD. Если указано время 23:59:59.000, то напоминание будет создано на весь день (без указания времени).","name":"due-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"priority":{"description":"Приоритет: 1, 2 (важно) или 3 (очень важно).","name":"priority","hasDynamicHelp":false,"multiple":false,"type":"option"},"performer-ids":{"description":"Массив идентификаторов пользователей, привязываемых к напоминанию как «ответственные»","name":"performer-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"status":{"description":"Статус","name":"status","hasDynamicHelp":false,"multiple":false,"type":"option"},"all-day":{"description":"Напоминание на весь день (без указания времени)","name":"all-day","allowNo":true,"type":"boolean"},"done-at":{"description":"Дата и время выполнения напоминания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ","name":"done-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:update","apiMethod":"PUT","apiPath":"/tasks/{id}","defaultColumns":["id","content","created_at","kind","due_at"],"isESM":true,"relativePath":["dist","commands","tasks","update.js"]},"threads:add":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Новый тред","examples":["Ответить в тред (комментарий к сообщению):\n $ pachca thread add","Подписаться на тред сообщения:\n $ pachca thread add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"threads:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"threads:create","apiMethod":"POST","apiPath":"/messages/{id}/thread","defaultColumns":["id","chat_id","message_id","message_chat_id","updated_at"],"isESM":true,"relativePath":["dist","commands","threads","add.js"]},"threads:get":{"aliases":[],"args":{"id":{"description":"Идентификатор треда","name":"id","required":true}},"description":"Информация о треде","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"threads:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"threads:read","apiMethod":"GET","apiPath":"/threads/{id}","defaultColumns":["id","chat_id","message_id","message_chat_id","updated_at"],"isESM":true,"relativePath":["dist","commands","threads","get.js"]},"upgrade":{"aliases":[],"args":{},"description":"Обновить CLI до последней версии","examples":["<%= config.bin %> upgrade"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"upgrade","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","upgrade.js"]},"upload":{"aliases":[],"args":{"file":{"description":"Путь к файлу или - для stdin","name":"file","required":true}},"description":"Загрузить файл (получает подпись и загружает автоматически)","examples":["<%= config.bin %> upload photo.jpg","cat data.csv | <%= config.bin %> upload -"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"upload","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"uploads:write","isESM":true,"relativePath":["dist","commands","upload.js"]},"users:create":{"aliases":[],"args":{},"description":"Создать сотрудника","examples":["Проверить, кто прочитал сообщение:\n $ pachca users list","Разослать уведомление нескольким пользователям:\n $ pachca users list","Массовое создание сотрудников с тегами:\n $ pachca users create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"first-name":{"description":"Имя","name":"first-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"last-name":{"description":"Фамилия","name":"last-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"email":{"description":"Электронная почта","name":"email","hasDynamicHelp":false,"multiple":false,"type":"option"},"phone-number":{"description":"Телефон","name":"phone-number","hasDynamicHelp":false,"multiple":false,"type":"option"},"nickname":{"description":"Имя пользователя","name":"nickname","hasDynamicHelp":false,"multiple":false,"type":"option"},"department":{"description":"Департамент","name":"department","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Должность","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"role":{"description":"Уровень доступа","name":"role","hasDynamicHelp":false,"multiple":false,"type":"option"},"suspended":{"description":"Деактивация пользователя","name":"suspended","allowNo":true,"type":"boolean"},"list-tags":{"description":"Массив тегов, привязываемых к сотруднику","name":"list-tags","hasDynamicHelp":false,"multiple":false,"type":"option"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"},"skip-email-notify":{"description":"Пропуск этапа отправки приглашения сотруднику. Сотруднику не будет отправлено письмо на электронную почту с приглашением создать аккаунт. Полезно при предварительном создании аккаунтов перед входом через SSO.","name":"skip-email-notify","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:create","apiMethod":"POST","apiPath":"/users","defaultColumns":["id","title","first_name","last_name","email"],"requiredFlags":["email"],"isESM":true,"relativePath":["dist","commands","users","create.js"]},"users:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор пользователя (pachca users list)","name":"id","required":true}},"description":"Удаление сотрудника","examples":["Получить сотрудника по ID:\n $ pachca users get","Массовое создание сотрудников с тегами:\n $ pachca users update","Offboarding сотрудника:\n $ pachca users update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:delete","apiMethod":"DELETE","apiPath":"/users/{id}","isESM":true,"relativePath":["dist","commands","users","delete.js"]},"users:get":{"aliases":[],"args":{"id":{"description":"Идентификатор пользователя (pachca users list)","name":"id","required":true}},"description":"Информация о сотруднике","examples":["Получить сотрудника по ID:\n $ pachca users get","Массовое создание сотрудников с тегами:\n $ pachca users update","Offboarding сотрудника:\n $ pachca users update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:read","apiMethod":"GET","apiPath":"/users/{id}","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","users","get.js"]},"users:get-status":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Статус сотрудника","examples":["Управление статусом сотрудника:\n $ pachca users get-status","Управление статусом сотрудника:\n $ pachca users update-status","Управление статусом сотрудника:\n $ pachca users remove-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:get-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_status:read","apiMethod":"GET","apiPath":"/users/{user_id}/status","defaultColumns":["title","emoji","expires_at","is_away"],"isESM":true,"relativePath":["dist","commands","users","get-status.js"]},"users:list":{"aliases":[],"args":{},"description":"Список сотрудников","examples":["Проверить, кто прочитал сообщение:\n $ pachca users list","Разослать уведомление нескольким пользователям:\n $ pachca users list","Массовое создание сотрудников с тегами:\n $ pachca users create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Поисковая фраза для фильтрации результатов. Поиск работает по полям: `first_name` (имя), `last_name` (фамилия), `email` (электронная почта), `phone_number` (телефон) и `nickname` (никнейм).","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:read","apiMethod":"GET","apiPath":"/users","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","users","list.js"]},"users:remove-status":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Удаление статуса сотрудника","examples":["Управление статусом сотрудника:\n $ pachca users get-status","Управление статусом сотрудника:\n $ pachca users update-status","Управление статусом сотрудника:\n $ pachca users remove-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:remove-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_status:write","apiMethod":"DELETE","apiPath":"/users/{user_id}/status","isESM":true,"relativePath":["dist","commands","users","remove-status.js"]},"users:update":{"aliases":[],"args":{"id":{"description":"Идентификатор пользователя (pachca users list)","name":"id","required":true}},"description":"Редактирование сотрудника","examples":["Получить сотрудника по ID:\n $ pachca users get","Массовое создание сотрудников с тегами:\n $ pachca users update","Offboarding сотрудника:\n $ pachca users update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"first-name":{"description":"Имя","name":"first-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"last-name":{"description":"Фамилия","name":"last-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"email":{"description":"Электронная почта","name":"email","hasDynamicHelp":false,"multiple":false,"type":"option"},"phone-number":{"description":"Телефон","name":"phone-number","hasDynamicHelp":false,"multiple":false,"type":"option"},"nickname":{"description":"Имя пользователя","name":"nickname","hasDynamicHelp":false,"multiple":false,"type":"option"},"department":{"description":"Департамент","name":"department","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Должность","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"role":{"description":"Уровень доступа","name":"role","hasDynamicHelp":false,"multiple":false,"type":"option"},"suspended":{"description":"Деактивация пользователя","name":"suspended","allowNo":true,"type":"boolean"},"list-tags":{"description":"Массив тегов, привязываемых к сотруднику","name":"list-tags","hasDynamicHelp":false,"multiple":false,"type":"option"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:update","apiMethod":"PUT","apiPath":"/users/{id}","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","users","update.js"]},"users:update-status":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Новый статус сотрудника","examples":["Управление статусом сотрудника:\n $ pachca users get-status","Управление статусом сотрудника:\n $ pachca users update-status","Управление статусом сотрудника:\n $ pachca users remove-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"emoji":{"description":"Emoji символ статуса","name":"emoji","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Текст статуса","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"expires-at":{"description":"Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ","name":"expires-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"is-away":{"description":"Режим «Нет на месте»","name":"is-away","allowNo":true,"type":"boolean"},"away-message":{"description":"Текст сообщения при режиме «Нет на месте». Отображается в профиле и при личных сообщениях/упоминаниях. (макс. 1024 символов)","name":"away-message","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:update-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_status:write","apiMethod":"PUT","apiPath":"/users/{user_id}/status","defaultColumns":["title","emoji","expires_at","is_away"],"requiredFlags":["emoji","title"],"isESM":true,"relativePath":["dist","commands","users","update-status.js"]},"version":{"aliases":[],"args":{},"description":"Версия CLI","examples":["<%= config.bin %> version"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"version","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","version.js"]},"views:open":{"aliases":[],"args":{},"description":"Открытие представления","examples":["Показать интерактивную форму пользователю:\n $ pachca views open","Опрос сотрудников через форму:\n $ pachca views open","Форма заявки/запроса:\n $ pachca views open"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"title":{"description":"Заголовок представления (макс. 24 символов)","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"close-text":{"description":"Текст кнопки закрытия представления (макс. 24 символов)","name":"close-text","hasDynamicHelp":false,"multiple":false,"type":"option"},"submit-text":{"description":"Текст кнопки отправки формы (макс. 24 символов)","name":"submit-text","hasDynamicHelp":false,"multiple":false,"type":"option"},"blocks":{"description":"Массив блоков представления","name":"blocks","hasDynamicHelp":false,"multiple":false,"type":"option"},"type":{"description":"Способ открытия представления","name":"type","hasDynamicHelp":false,"multiple":false,"options":["modal"],"type":"option"},"trigger-id":{"description":"Уникальный идентификатор события (полученный, например, в исходящем вебхуке о нажатии кнопки)","name":"trigger-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"private-metadata":{"description":"Необязательная строка, которая будет отправлена в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для передачи в формате `JSON` какой то дополнительной информации вместе с заполненной пользователем формой. (макс. 3000 символов)","name":"private-metadata","hasDynamicHelp":false,"multiple":false,"type":"option"},"callback-id":{"description":"Необязательный идентификатор для распознавания этого представления, который будет отправлен в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для понимания, какую форму должен был заполнить пользователь. (макс. 255 символов)","name":"callback-id","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"views:open","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"views:write","apiMethod":"POST","apiPath":"/views/open","requiredFlags":["title","blocks","type","trigger-id"],"isESM":true,"relativePath":["dist","commands","views","open.js"]}},"version":"0.0.0"} \ No newline at end of file +{"commands":{"api":{"aliases":[],"args":{"method":{"description":"HTTP method (GET, POST, PUT, DELETE)","name":"method","options":["GET","POST","PUT","DELETE","PATCH"],"required":true},"path":{"description":"API path (e.g., /messages)","name":"path","required":true}},"description":"Произвольный запрос к API","examples":["<%= config.bin %> api GET /messages --query chat_id=123","<%= config.bin %> api POST /messages -F message[chat_id]=12345 -f message[content]=\"Привет\"","<%= config.bin %> api POST /messages --input payload.json","<%= config.bin %> api GET /profile -o yaml"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"raw-field":{"char":"f","description":"String field (key=value)","name":"raw-field","hasDynamicHelp":false,"multiple":true,"type":"option"},"field":{"char":"F","description":"Typed field (numbers/bools auto-converted, @file reads file)","name":"field","hasDynamicHelp":false,"multiple":true,"type":"option"},"input":{"description":"JSON file to send as body (- for stdin)","name":"input","hasDynamicHelp":false,"multiple":false,"type":"option"},"query":{"description":"Query parameter (key=value)","name":"query","hasDynamicHelp":false,"multiple":true,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"api","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":false,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","api.js"]},"auth:list":{"aliases":[],"args":{},"description":"Список сохранённых профилей","examples":["<%= config.bin %> auth list","<%= config.bin %> auth list -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","list.js"]},"auth:login":{"aliases":[],"args":{},"description":"Авторизация и сохранение токена","examples":["<%= config.bin %> auth login","<%= config.bin %> auth login --profile personal","<%= config.bin %> auth login --profile ci --token $PACHCA_TOKEN"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile name (default: \"default\")","name":"profile","default":"default","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Token to save (skips prompt)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:login","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","login.js"]},"auth:logout":{"aliases":[],"args":{"profile":{"description":"Profile name to remove","name":"profile","required":false}},"description":"Удаление сохранённого профиля","examples":["<%= config.bin %> auth logout bot-notify","<%= config.bin %> auth logout"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:logout","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","logout.js"]},"auth:status":{"aliases":[],"args":{},"description":"Статус текущего профиля","examples":["<%= config.bin %> auth status","<%= config.bin %> auth status -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","status.js"]},"auth:switch":{"aliases":[],"args":{"profile":{"description":"Profile name to switch to","name":"profile","required":true}},"description":"Переключение активного профиля","examples":["<%= config.bin %> auth switch bot-support"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:switch","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","switch.js"]},"bots:list-events":{"aliases":[],"args":{},"description":"История событий","examples":["Обработка событий через историю (polling):\n $ pachca bots list-events"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"bots:list-events","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"webhooks:events:read","apiMethod":"GET","apiPath":"/webhooks/events","defaultColumns":["id","created_at","event_type","payload"],"isESM":true,"relativePath":["dist","commands","bots","list-events.js"]},"bots:remove-event":{"aliases":[],"args":{"id":{"description":"Идентификатор события (pachca bots list)","name":"id","required":true}},"description":"Удаление события","examples":["Обработка событий через историю (polling):\n $ pachca bots remove-event"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"bots:remove-event","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"webhooks:events:delete","apiMethod":"DELETE","apiPath":"/webhooks/events/{id}","isESM":true,"relativePath":["dist","commands","bots","remove-event.js"]},"bots:update":{"aliases":[],"args":{"id":{"description":"Идентификатор бота (pachca bots list)","name":"id","required":true}},"description":"Редактирование бота","examples":["Обновить Webhook URL бота:\n $ pachca bots update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"webhook":{"description":"Объект параметров вебхука","name":"webhook","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"bots:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"bots:write","apiMethod":"PUT","apiPath":"/bots/{id}","defaultColumns":["id"],"requiredFlags":["webhook"],"isESM":true,"relativePath":["dist","commands","bots","update.js"]},"changelog":{"aliases":[],"args":{},"description":"История изменений CLI","examples":["<%= config.bin %> changelog","<%= config.bin %> changelog -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"changelog","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","changelog.js"]},"chats:archive":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Архивация чата","examples":["Архивация и управление чатом:\n $ pachca chats archive","Найти и заархивировать неактивные чаты:\n $ pachca chats archive"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:archive","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:archive","apiMethod":"PUT","apiPath":"/chats/{id}/archive","isESM":true,"relativePath":["dist","commands","chats","archive.js"]},"chats:create":{"aliases":[],"args":{},"description":"Новый чат","examples":["Создать канал и пригласить участников:\n $ pachca chats create","Создать проектную беседу из шаблона:\n $ pachca chats create","Найти активные чаты за период:\n $ pachca chats list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"},"member-ids":{"description":"Массив идентификаторов пользователей, которые станут участниками","name":"member-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"group-tag-ids":{"description":"Массив идентификаторов тегов, которые станут участниками","name":"group-tag-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"channel":{"description":"Является каналом","name":"channel","allowNo":true,"type":"boolean"},"public":{"description":"Открытый доступ","name":"public","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:create","apiMethod":"POST","apiPath":"/chats","defaultColumns":["id","name","created_at","owner_id","channel"],"requiredFlags":["name"],"isESM":true,"relativePath":["dist","commands","chats","create.js"]},"chats:get":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Информация о чате","examples":["Переименовать или обновить чат:\n $ pachca chats update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:read","apiMethod":"GET","apiPath":"/chats/{id}","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","chats","get.js"]},"chats:list":{"aliases":[],"args":{},"description":"Список чатов","examples":["Создать канал и пригласить участников:\n $ pachca chats create","Создать проектную беседу из шаблона:\n $ pachca chats create","Найти активные чаты за период:\n $ pachca chats list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"sort":{"description":"Поле сортировки","name":"sort","hasDynamicHelp":false,"multiple":false,"options":["id","last_message_at"],"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"availability":{"description":"Параметр, который отвечает за доступность и выборку чатов для пользователя","name":"availability","hasDynamicHelp":false,"multiple":false,"options":["is_member","public"],"type":"option"},"last-message-at-after":{"description":"Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не раньше чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).","name":"last-message-at-after","hasDynamicHelp":false,"multiple":false,"type":"option"},"last-message-at-before":{"description":"Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не позже чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).","name":"last-message-at-before","hasDynamicHelp":false,"multiple":false,"type":"option"},"personal":{"description":"Фильтрация по личным и групповым чатам. Если параметр не указан, возвращаются любые чаты.","name":"personal","allowNo":true,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:read","apiMethod":"GET","apiPath":"/chats","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","chats","list.js"]},"chats:unarchive":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Разархивация чата","examples":["Архивация и управление чатом:\n $ pachca chats unarchive"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:unarchive","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:archive","apiMethod":"PUT","apiPath":"/chats/{id}/unarchive","isESM":true,"relativePath":["dist","commands","chats","unarchive.js"]},"chats:update":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Обновление чата","examples":["Переименовать или обновить чат:\n $ pachca chats update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"},"public":{"description":"Открытый доступ","name":"public","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:update","apiMethod":"PUT","apiPath":"/chats/{id}","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","chats","update.js"]},"commands":{"aliases":[],"args":{},"description":"Список всех команд","examples":["<%= config.bin %> commands","<%= config.bin %> commands --available","<%= config.bin %> commands --available -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"available":{"description":"Show only commands available to current token","name":"available","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"commands","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","commands.js"]},"common:custom-properties":{"aliases":[],"args":{},"description":"Список дополнительных полей","examples":["Получить кастомные поля профиля:\n $ pachca common custom-properties"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"entity-type":{"description":"Тип сущности","name":"entity-type","hasDynamicHelp":false,"multiple":false,"options":["User","Task"],"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:custom-properties","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"custom_properties:read","apiMethod":"GET","apiPath":"/custom_properties","defaultColumns":["id","name","data_type"],"requiredFlags":["entity-type"],"isESM":true,"relativePath":["dist","commands","common","custom-properties.js"]},"common:direct-url":{"aliases":[],"args":{},"description":"Загрузка файла","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"direct-url":{"description":"URL для отправки запроса (получается из ответа POST /uploads)","name":"direct-url","required":true,"hasDynamicHelp":false,"multiple":false,"type":"option"},"content-disposition":{"description":"Параметр Content-Disposition, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"content-disposition","hasDynamicHelp":false,"multiple":false,"type":"option"},"acl":{"description":"Параметр acl, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"acl","hasDynamicHelp":false,"multiple":false,"type":"option"},"policy":{"description":"Параметр policy, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"policy","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-credential":{"description":"Параметр x-amz-credential, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-credential","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-algorithm":{"description":"Параметр x-amz-algorithm, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-algorithm","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-date":{"description":"Параметр x-amz-date, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-date","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-signature":{"description":"Параметр x-amz-signature, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-signature","hasDynamicHelp":false,"multiple":false,"type":"option"},"key":{"description":"Параметр key, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"key","hasDynamicHelp":false,"multiple":false,"type":"option"},"file":{"description":"Файл для загрузки","name":"file","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:direct-url","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"apiMethod":"POST","apiPath":"/direct_url","requiredFlags":["content-disposition","acl","policy","x-amz-credential","x-amz-algorithm","x-amz-date","x-amz-signature","key"],"isESM":true,"relativePath":["dist","commands","common","direct-url.js"]},"common:get-exports":{"aliases":[],"args":{"id":{"description":"Идентификатор экспорта","name":"id","required":true}},"description":"Скачать архив экспорта","examples":["Экспорт истории чата:\n $ pachca common get-exports"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"save":{"description":"Путь для сохранения файла","name":"save","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:get-exports","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_exports:read","plan":"corporation","apiMethod":"GET","apiPath":"/chats/exports/{id}","isESM":true,"relativePath":["dist","commands","common","get-exports.js"]},"common:request-export":{"aliases":[],"args":{},"description":"Экспорт сообщений","examples":["Экспорт истории чата:\n $ pachca common request-export"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"start-at":{"description":"Дата начала для экспорта (ISO-8601, UTC+0) в формате YYYY-MM-DD","name":"start-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"end-at":{"description":"Дата окончания для экспорта (ISO-8601, UTC+0) в формате YYYY-MM-DD","name":"end-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"webhook-url":{"description":"Адрес, на который будет отправлен вебхук по завершению экспорта","name":"webhook-url","hasDynamicHelp":false,"multiple":false,"type":"option"},"chat-ids":{"description":"Массив идентификаторов чатов. Указывается, если нужно получить сообщения только некоторых чатов.","name":"chat-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"skip-chats-file":{"description":"Пропуск формирования файла со списком чатов (chats.json)","name":"skip-chats-file","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:request-export","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_exports:write","plan":"corporation","apiMethod":"POST","apiPath":"/chats/exports","requiredFlags":["start-at","end-at","webhook-url"],"isESM":true,"relativePath":["dist","commands","common","request-export.js"]},"common:uploads":{"aliases":[],"args":{},"description":"Получение подписи, ключа и других параметров","examples":["Изменить вложения сообщения:\n $ pachca common uploads"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:uploads","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"uploads:write","apiMethod":"POST","apiPath":"/uploads","defaultColumns":["Content-Disposition","acl","policy","x-amz-credential","x-amz-algorithm"],"isESM":true,"relativePath":["dist","commands","common","uploads.js"]},"config:get":{"aliases":[],"args":{"key":{"description":"Configuration key","name":"key","required":true}},"description":"Получение значения конфигурации","examples":["<%= config.bin %> config get defaults.output"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"config:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","config","get.js"]},"config:list":{"aliases":[],"args":{},"description":"Список всех настроек","examples":["<%= config.bin %> config list","<%= config.bin %> config list -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"config:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","config","list.js"]},"config:set":{"aliases":[],"args":{"key":{"description":"Configuration key","name":"key","required":true},"value":{"description":"Configuration value","name":"value","required":true}},"description":"Установка значения конфигурации","examples":["<%= config.bin %> config set defaults.output json","<%= config.bin %> config set defaults.timeout 60"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"config:set","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","config","set.js"]},"doctor":{"aliases":[],"args":{},"description":"Диагностика окружения: Node.js, сеть, токен, конфигурация","examples":["<%= config.bin %> doctor","<%= config.bin %> doctor -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"doctor","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","doctor.js"]},"group-tags:create":{"aliases":[],"args":{},"description":"Новый тег","examples":["Массовое создание сотрудников с тегами:\n $ pachca group-tags create","Получить всех сотрудников тега/департамента:\n $ pachca group-tags list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название тега","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:write","apiMethod":"POST","apiPath":"/group_tags","defaultColumns":["id","name","users_count"],"requiredFlags":["name"],"isESM":true,"relativePath":["dist","commands","group-tags","create.js"]},"group-tags:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Удаление тега","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:write","apiMethod":"DELETE","apiPath":"/group_tags/{id}","isESM":true,"relativePath":["dist","commands","group-tags","delete.js"]},"group-tags:get":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Информация о теге","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:read","apiMethod":"GET","apiPath":"/group_tags/{id}","defaultColumns":["id","name","users_count"],"isESM":true,"relativePath":["dist","commands","group-tags","get.js"]},"group-tags:list":{"aliases":[],"args":{},"description":"Список тегов сотрудников","examples":["Массовое создание сотрудников с тегами:\n $ pachca group-tags create","Получить всех сотрудников тега/департамента:\n $ pachca group-tags list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"names":{"description":"Массив названий тегов, по которым вы хотите отфильтровать список (через запятую)","name":"names","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:read","apiMethod":"GET","apiPath":"/group_tags","defaultColumns":["id","name","users_count"],"isESM":true,"relativePath":["dist","commands","group-tags","list.js"]},"group-tags:list-users":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Список сотрудников тега","examples":["Получить всех сотрудников тега/департамента:\n $ pachca group-tags list-users"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:list-users","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:read","apiMethod":"GET","apiPath":"/group_tags/{id}/users","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","group-tags","list-users.js"]},"group-tags:update":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Редактирование тега","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название тега","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:write","apiMethod":"PUT","apiPath":"/group_tags/{id}","defaultColumns":["id","name","users_count"],"requiredFlags":["name"],"isESM":true,"relativePath":["dist","commands","group-tags","update.js"]},"guide":{"aliases":[],"args":{"query":{"description":"Search query","name":"query","required":false}},"description":"Поиск сценариев использования","examples":["<%= config.bin %> guide \"отправить файл\"","<%= config.bin %> guide \"создать бота\"","<%= config.bin %> guide"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"guide","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","guide.js"]},"introspect":{"aliases":[],"args":{"command":{"description":"Command name (e.g., \"messages create\")","name":"command","required":false}},"description":"Метаданные команды в машиночитаемом формате","examples":["<%= config.bin %> introspect messages create","<%= config.bin %> introspect"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"introspect","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":false,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","introspect.js"]},"link-previews:add":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Unfurl (разворачивание ссылок)","examples":["Разворачивание ссылок (unfurling):\n $ pachca link-previews add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"link-previews":{"description":"`JSON` карта предпросмотров ссылок, где каждый ключ — `URL`, который был получен в исходящем вебхуке о новом сообщении.","name":"link-previews","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"link-previews:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"link_previews:write","apiMethod":"POST","apiPath":"/messages/{id}/link_previews","requiredFlags":["link-previews"],"isESM":true,"relativePath":["dist","commands","link-previews","add.js"]},"members:add":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (беседа, канал или чат треда)","name":"id","required":true}},"description":"Добавление пользователей","examples":["Подписаться на тред сообщения:\n $ pachca members add","Упомянуть пользователя по имени:\n $ pachca members list","Создать канал и пригласить участников:\n $ pachca members add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"member-ids":{"description":"Массив идентификаторов пользователей, которые станут участниками","name":"member-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"silent":{"description":"Не создавать в чате системное сообщение о добавлении участника","name":"silent","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"POST","apiPath":"/chats/{id}/members","requiredFlags":["member-ids"],"isESM":true,"relativePath":["dist","commands","members","add.js"]},"members:add-group-tags":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true}},"description":"Добавление тегов","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"group-tag-ids":{"description":"Массив идентификаторов тегов, которые станут участниками","name":"group-tag-ids","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:add-group-tags","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"POST","apiPath":"/chats/{id}/group_tags","requiredFlags":["group-tag-ids"],"isESM":true,"relativePath":["dist","commands","members","add-group-tags.js"]},"members:leave":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true}},"description":"Выход из беседы или канала","examples":["Архивация и управление чатом:\n $ pachca members leave"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:leave","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:leave","apiMethod":"DELETE","apiPath":"/chats/{id}/leave","isESM":true,"relativePath":["dist","commands","members","leave.js"]},"members:list":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true}},"description":"Список участников чата","examples":["Подписаться на тред сообщения:\n $ pachca members add","Упомянуть пользователя по имени:\n $ pachca members list","Создать канал и пригласить участников:\n $ pachca members add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"role":{"description":"Роль в чате","name":"role","hasDynamicHelp":false,"multiple":false,"options":["all","owner","admin","editor","member"],"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:read","apiMethod":"GET","apiPath":"/chats/{id}/members","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","members","list.js"]},"members:remove":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true},"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Исключение пользователя","examples":["Архивация и управление чатом:\n $ pachca members update","Архивация и управление чатом:\n $ pachca members remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:remove","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"DELETE","apiPath":"/chats/{id}/members/{user_id}","isESM":true,"relativePath":["dist","commands","members","remove.js"]},"members:remove-group-tag":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true},"tag_id":{"description":"Идентификатор тега (pachca tags list)","name":"tag_id","required":true}},"description":"Исключение тега","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:remove-group-tag","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"DELETE","apiPath":"/chats/{id}/group_tags/{tag_id}","isESM":true,"relativePath":["dist","commands","members","remove-group-tag.js"]},"members:update":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true},"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Редактирование роли","examples":["Архивация и управление чатом:\n $ pachca members update","Архивация и управление чатом:\n $ pachca members remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"role":{"description":"Роль","name":"role","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"PUT","apiPath":"/chats/{id}/members/{user_id}","requiredFlags":["role"],"isESM":true,"relativePath":["dist","commands","members","update.js"]},"messages:create":{"aliases":[],"args":{},"description":"Новое сообщение","examples":["Найти чат по имени и отправить сообщение:\n $ pachca messages create","Отправить сообщение в канал или беседу (если chat_id известен):\n $ pachca messages create","Отправить личное сообщение пользователю:\n $ pachca messages create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"entity-type":{"description":"Тип сущности","name":"entity-type","hasDynamicHelp":false,"multiple":false,"type":"option"},"entity-id":{"description":"Идентификатор сущности (pachca chats list | pachca users list)","name":"entity-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"content":{"description":"Текст сообщения","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"files":{"description":"Прикрепляемые файлы","name":"files","hasDynamicHelp":false,"multiple":false,"type":"option"},"buttons":{"description":"Массив строк, каждая из которых представлена массивом кнопок. Максимум 100 кнопок у сообщения, до 8 кнопок в строке.","name":"buttons","hasDynamicHelp":false,"multiple":false,"type":"option"},"parent-message-id":{"description":"Идентификатор сообщения. Указывается в случае, если вы отправляете ответ на другое сообщение.","name":"parent-message-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-avatar-url":{"description":"Ссылка на специальную аватарку отправителя для этого сообщения. Использование этого поля возможно только с access_token бота. (макс. 255 символов)","name":"display-avatar-url","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-name":{"description":"Полное специальное имя отправителя для этого сообщения. Использование этого поля возможно только с access_token бота. (макс. 255 символов)","name":"display-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"skip-invite-mentions":{"description":"Пропуск добавления упоминаемых пользователей в тред. Работает только при отправке сообщения в тред.","name":"skip-invite-mentions","allowNo":true,"type":"boolean"},"link-preview":{"description":"Отображение предпросмотра первой найденной ссылки в тексте сообщения","name":"link-preview","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:create","apiMethod":"POST","apiPath":"/messages","defaultColumns":["id","content","created_at","entity_type","entity_id"],"requiredFlags":["entity-id","content"],"isESM":true,"relativePath":["dist","commands","messages","create.js"]},"messages:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Удаление сообщения","examples":["Получить вложения из сообщения:\n $ pachca messages get","Отредактировать сообщение:\n $ pachca messages update","Изменить вложения сообщения:\n $ pachca messages get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:delete","apiMethod":"DELETE","apiPath":"/messages/{id}","isESM":true,"relativePath":["dist","commands","messages","delete.js"]},"messages:get":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Информация о сообщении","examples":["Получить вложения из сообщения:\n $ pachca messages get","Отредактировать сообщение:\n $ pachca messages update","Изменить вложения сообщения:\n $ pachca messages get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:read","apiMethod":"GET","apiPath":"/messages/{id}","defaultColumns":["id","content","created_at","entity_type","entity_id"],"isESM":true,"relativePath":["dist","commands","messages","get.js"]},"messages:list":{"aliases":[],"args":{"chat_id":{"description":"Идентификатор чата (беседа, канал, диалог или чат треда)","name":"chat_id","required":false}},"description":"Список сообщений чата","examples":["Найти чат по имени и отправить сообщение:\n $ pachca messages create","Отправить сообщение в канал или беседу (если chat_id известен):\n $ pachca messages create","Отправить личное сообщение пользователю:\n $ pachca messages create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"chat-id":{"description":"Идентификатор чата (беседа, канал, диалог или чат треда)","name":"chat-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"sort":{"description":"Поле сортировки","name":"sort","hasDynamicHelp":false,"multiple":false,"options":["id"],"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:read","apiMethod":"GET","apiPath":"/messages","defaultColumns":["id","content","created_at","entity_type","entity_id"],"requiredFlags":["chat-id"],"isESM":true,"relativePath":["dist","commands","messages","list.js"]},"messages:pin":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Закрепление сообщения","examples":["Закрепить/открепить сообщение:\n $ pachca messages pin","Закрепить/открепить сообщение:\n $ pachca messages unpin"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:pin","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"pins:write","apiMethod":"POST","apiPath":"/messages/{id}/pin","isESM":true,"relativePath":["dist","commands","messages","pin.js"]},"messages:unpin":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Открепление сообщения","examples":["Закрепить/открепить сообщение:\n $ pachca messages pin","Закрепить/открепить сообщение:\n $ pachca messages unpin"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:unpin","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"pins:write","apiMethod":"DELETE","apiPath":"/messages/{id}/pin","isESM":true,"relativePath":["dist","commands","messages","unpin.js"]},"messages:update":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Редактирование сообщения","examples":["Получить вложения из сообщения:\n $ pachca messages get","Отредактировать сообщение:\n $ pachca messages update","Изменить вложения сообщения:\n $ pachca messages get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"content":{"description":"Текст сообщения","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"files":{"description":"Прикрепляемые файлы","name":"files","hasDynamicHelp":false,"multiple":false,"type":"option"},"buttons":{"description":"Массив строк, каждая из которых представлена массивом кнопок. Максимум 100 кнопок у сообщения, до 8 кнопок в строке. Для удаления кнопок пришлите пустой массив.","name":"buttons","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-avatar-url":{"description":"Ссылка на специальную аватарку отправителя для этого сообщения. Использование этого поля возможно только с access_token бота.","name":"display-avatar-url","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-name":{"description":"Полное специальное имя отправителя для этого сообщения. Использование этого поля возможно только с access_token бота.","name":"display-name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:update","apiMethod":"PUT","apiPath":"/messages/{id}","defaultColumns":["id","content","created_at","entity_type","entity_id"],"isESM":true,"relativePath":["dist","commands","messages","update.js"]},"profile:delete-avatar":{"aliases":[],"args":{},"description":"Удаление аватара","examples":["Загрузить аватар профиля:\n $ pachca profile update-avatar","Удалить аватар профиля:\n $ pachca profile delete-avatar"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:delete-avatar","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_avatar:write","apiMethod":"DELETE","apiPath":"/profile/avatar","isESM":true,"relativePath":["dist","commands","profile","delete-avatar.js"]},"profile:delete-status":{"aliases":[],"args":{},"description":"Удаление статуса","examples":["Установить статус:\n $ pachca profile update-status","Сбросить статус:\n $ pachca profile delete-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:delete-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_status:write","apiMethod":"DELETE","apiPath":"/profile/status","isESM":true,"relativePath":["dist","commands","profile","delete-status.js"]},"profile:get":{"aliases":[],"args":{},"description":"Информация о профиле","examples":["Получить свой профиль:\n $ pachca profile get","Получить кастомные поля профиля:\n $ pachca profile get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile:read","apiMethod":"GET","apiPath":"/profile","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","profile","get.js"]},"profile:get-info":{"aliases":[],"args":{},"description":"Информация о токене","examples":["Проверить свой токен:\n $ pachca profile get-info"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:get-info","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"apiMethod":"GET","apiPath":"/oauth/token/info","defaultColumns":["id","name","created_at","token","user_id"],"isESM":true,"relativePath":["dist","commands","profile","get-info.js"]},"profile:get-status":{"aliases":[],"args":{},"description":"Текущий статус","examples":["Установить статус:\n $ pachca profile update-status","Сбросить статус:\n $ pachca profile delete-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:get-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_status:read","apiMethod":"GET","apiPath":"/profile/status","defaultColumns":["title","emoji","expires_at","is_away"],"isESM":true,"relativePath":["dist","commands","profile","get-status.js"]},"profile:update-avatar":{"aliases":[],"args":{},"description":"Загрузка аватара","examples":["Загрузить аватар профиля:\n $ pachca profile update-avatar","Удалить аватар профиля:\n $ pachca profile delete-avatar"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"file":{"description":"Файл изображения для аватара","name":"file","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:update-avatar","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_avatar:write","apiMethod":"PUT","apiPath":"/profile/avatar","defaultColumns":["image_url"],"isESM":true,"relativePath":["dist","commands","profile","update-avatar.js"]},"profile:update-status":{"aliases":[],"args":{},"description":"Новый статус","examples":["Установить статус:\n $ pachca profile update-status","Сбросить статус:\n $ pachca profile delete-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"emoji":{"description":"Emoji символ статуса","name":"emoji","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Текст статуса","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"expires-at":{"description":"Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ","name":"expires-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"is-away":{"description":"Режим «Нет на месте»","name":"is-away","allowNo":true,"type":"boolean"},"away-message":{"description":"Текст сообщения при режиме «Нет на месте». Отображается в профиле и при личных сообщениях/упоминаниях. (макс. 1024 символов)","name":"away-message","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:update-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_status:write","apiMethod":"PUT","apiPath":"/profile/status","defaultColumns":["title","emoji","expires_at","is_away"],"requiredFlags":["emoji","title"],"isESM":true,"relativePath":["dist","commands","profile","update-status.js"]},"reactions:add":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Добавление реакции","examples":["Добавить реакцию на сообщение:\n $ pachca reactions add","Добавить реакцию на сообщение:\n $ pachca reactions remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"code":{"description":"Emoji символ реакции","name":"code","hasDynamicHelp":false,"multiple":false,"type":"option"},"name":{"description":"Текстовое имя эмодзи (используется для кастомных эмодзи)","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"reactions:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"reactions:write","apiMethod":"POST","apiPath":"/messages/{id}/reactions","defaultColumns":["name","created_at","user_id","code"],"requiredFlags":["code"],"isESM":true,"relativePath":["dist","commands","reactions","add.js"]},"reactions:list":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Список реакций","examples":["Добавить реакцию на сообщение:\n $ pachca reactions add","Добавить реакцию на сообщение:\n $ pachca reactions remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"reactions:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"reactions:read","apiMethod":"GET","apiPath":"/messages/{id}/reactions","defaultColumns":["name","created_at","user_id","code"],"isESM":true,"relativePath":["dist","commands","reactions","list.js"]},"reactions:remove":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Удаление реакции","examples":["Добавить реакцию на сообщение:\n $ pachca reactions add","Добавить реакцию на сообщение:\n $ pachca reactions remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"code":{"description":"Emoji символ реакции","name":"code","hasDynamicHelp":false,"multiple":false,"type":"option"},"name":{"description":"Текстовое имя эмодзи (используется для кастомных эмодзи)","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"reactions:remove","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"reactions:write","apiMethod":"DELETE","apiPath":"/messages/{id}/reactions","requiredFlags":["code"],"isESM":true,"relativePath":["dist","commands","reactions","remove.js"]},"read-member:list-readers":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Список прочитавших сообщение","examples":["Проверить, кто прочитал сообщение:\n $ pachca read-member list-readers"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"read-member:list-readers","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:read","apiMethod":"GET","apiPath":"/messages/{id}/read_member_ids","isESM":true,"relativePath":["dist","commands","read-member","list-readers.js"]},"search:list-chats":{"aliases":[],"args":{},"description":"Поиск чатов","examples":["Найти чат по имени и отправить сообщение:\n $ pachca search list-chats","Найти чат по названию:\n $ pachca search list-chats"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Текст поискового запроса","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"created-from":{"description":"Фильтр по дате создания (от)","name":"created-from","hasDynamicHelp":false,"multiple":false,"type":"option"},"created-to":{"description":"Фильтр по дате создания (до)","name":"created-to","hasDynamicHelp":false,"multiple":false,"type":"option"},"active":{"description":"Фильтр по активности чата","name":"active","allowNo":true,"type":"boolean"},"chat-subtype":{"description":"Фильтр по типу чата","name":"chat-subtype","hasDynamicHelp":false,"multiple":false,"options":["discussion","thread"],"type":"option"},"personal":{"description":"Фильтр по личным чатам","name":"personal","allowNo":true,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"search:list-chats","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"search:chats","apiMethod":"GET","apiPath":"/search/chats","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","search","list-chats.js"]},"search:list-messages":{"aliases":[],"args":{},"description":"Поиск сообщений","examples":["Найти сообщение по тексту:\n $ pachca search list-messages"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Текст поискового запроса","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"created-from":{"description":"Фильтр по дате создания (от)","name":"created-from","hasDynamicHelp":false,"multiple":false,"type":"option"},"created-to":{"description":"Фильтр по дате создания (до)","name":"created-to","hasDynamicHelp":false,"multiple":false,"type":"option"},"chat-ids":{"description":"Фильтр по ID чатов (через запятую)","name":"chat-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"user-ids":{"description":"Фильтр по ID авторов сообщений (через запятую)","name":"user-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"active":{"description":"Фильтр по активности чата","name":"active","allowNo":true,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"search:list-messages","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"search:messages","apiMethod":"GET","apiPath":"/search/messages","defaultColumns":["id","content","created_at","entity_type","entity_id"],"isESM":true,"relativePath":["dist","commands","search","list-messages.js"]},"search:list-users":{"aliases":[],"args":{},"description":"Поиск сотрудников","examples":["Отправить личное сообщение пользователю:\n $ pachca search list-users","Упомянуть пользователя по имени:\n $ pachca search list-users","Найти сотрудника по имени:\n $ pachca search list-users"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Текст поискового запроса","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"sort":{"description":"Сортировка результатов","name":"sort","hasDynamicHelp":false,"multiple":false,"options":["by_score","alphabetical"],"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"created-from":{"description":"Фильтр по дате создания (от)","name":"created-from","hasDynamicHelp":false,"multiple":false,"type":"option"},"created-to":{"description":"Фильтр по дате создания (до)","name":"created-to","hasDynamicHelp":false,"multiple":false,"type":"option"},"company-roles":{"description":"Фильтр по ролям сотрудников (через запятую)","name":"company-roles","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"search:list-users","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"search:users","apiMethod":"GET","apiPath":"/search/users","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","search","list-users.js"]},"security:list":{"aliases":[],"args":{},"description":"Журнал аудита событий","examples":["Получить журнал аудита событий:\n $ pachca security list","Мониторинг подозрительных входов:\n $ pachca security list","Экспорт логов за период:\n $ pachca security list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"start-time":{"description":"Начальная метка времени (включительно)","name":"start-time","hasDynamicHelp":false,"multiple":false,"type":"option"},"end-time":{"description":"Конечная метка времени (исключительно)","name":"end-time","hasDynamicHelp":false,"multiple":false,"type":"option"},"event-key":{"description":"Фильтр по конкретному типу события","name":"event-key","hasDynamicHelp":false,"multiple":false,"options":["user_login","user_logout","user_2fa_fail","user_2fa_success","user_created","user_deleted","user_role_changed","user_updated","tag_created","tag_deleted","user_added_to_tag","user_removed_from_tag","chat_created","chat_renamed","chat_permission_changed","user_chat_join","user_chat_leave","tag_added_to_chat","tag_removed_from_chat","message_updated","message_deleted","message_created","reaction_created","reaction_deleted","thread_created","access_token_created","access_token_updated","access_token_destroy","kms_encrypt","kms_decrypt","audit_events_accessed","dlp_violation_detected","search_users_api","search_chats_api","search_messages_api"],"type":"option"},"actor-id":{"description":"Идентификатор пользователя, выполнившего действие","name":"actor-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"actor-type":{"description":"Тип актора","name":"actor-type","hasDynamicHelp":false,"multiple":false,"type":"option"},"entity-id":{"description":"Идентификатор затронутой сущности","name":"entity-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"entity-type":{"description":"Тип сущности","name":"entity-type","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"security:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"audit_events:read","plan":"corporation","apiMethod":"GET","apiPath":"/audit_events","defaultColumns":["id","created_at","event_key","entity_id","entity_type"],"isESM":true,"relativePath":["dist","commands","security","list.js"]},"tasks:create":{"aliases":[],"args":{},"description":"Новое напоминание","examples":["Форма заявки/запроса:\n $ pachca tasks create","Создать напоминание:\n $ pachca tasks create","Получить список предстоящих задач:\n $ pachca tasks list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"kind":{"description":"Тип","name":"kind","hasDynamicHelp":false,"multiple":false,"type":"option"},"content":{"description":"Описание (по умолчанию — название типа)","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"due-at":{"description":"Срок выполнения напоминания (ISO-8601) в формате YYYY-MM-DDThh:mm:ss.sssTZD. Если указано время 23:59:59.000, то напоминание будет создано на весь день (без указания времени).","name":"due-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"priority":{"description":"Приоритет: 1, 2 (важно) или 3 (очень важно).","name":"priority","hasDynamicHelp":false,"multiple":false,"type":"option"},"performer-ids":{"description":"Массив идентификаторов пользователей, привязываемых к напоминанию как «ответственные» (по умолчанию ответственным назначается вы)","name":"performer-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"chat-id":{"description":"Идентификатор чата, к которому привязывается напоминание (pachca chats list)","name":"chat-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"all-day":{"description":"Напоминание на весь день (без указания времени)","name":"all-day","allowNo":true,"type":"boolean"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:create","apiMethod":"POST","apiPath":"/tasks","defaultColumns":["id","content","created_at","kind","due_at"],"requiredFlags":["kind"],"isESM":true,"relativePath":["dist","commands","tasks","create.js"]},"tasks:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор напоминания (pachca tasks list)","name":"id","required":true}},"description":"Удаление напоминания","examples":["Получить задачу по ID:\n $ pachca tasks get","Отметить задачу выполненной:\n $ pachca tasks update","Обновить задачу (перенести срок, сменить ответственных):\n $ pachca tasks update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:delete","apiMethod":"DELETE","apiPath":"/tasks/{id}","isESM":true,"relativePath":["dist","commands","tasks","delete.js"]},"tasks:get":{"aliases":[],"args":{"id":{"description":"Идентификатор напоминания (pachca tasks list)","name":"id","required":true}},"description":"Информация о напоминании","examples":["Получить задачу по ID:\n $ pachca tasks get","Отметить задачу выполненной:\n $ pachca tasks update","Обновить задачу (перенести срок, сменить ответственных):\n $ pachca tasks update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:read","apiMethod":"GET","apiPath":"/tasks/{id}","defaultColumns":["id","content","created_at","kind","due_at"],"isESM":true,"relativePath":["dist","commands","tasks","get.js"]},"tasks:list":{"aliases":[],"args":{},"description":"Список напоминаний","examples":["Форма заявки/запроса:\n $ pachca tasks create","Создать напоминание:\n $ pachca tasks create","Получить список предстоящих задач:\n $ pachca tasks list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:read","apiMethod":"GET","apiPath":"/tasks","defaultColumns":["id","content","created_at","kind","due_at"],"isESM":true,"relativePath":["dist","commands","tasks","list.js"]},"tasks:update":{"aliases":[],"args":{"id":{"description":"Идентификатор напоминания (pachca tasks list)","name":"id","required":true}},"description":"Редактирование напоминания","examples":["Получить задачу по ID:\n $ pachca tasks get","Отметить задачу выполненной:\n $ pachca tasks update","Обновить задачу (перенести срок, сменить ответственных):\n $ pachca tasks update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"kind":{"description":"Тип","name":"kind","hasDynamicHelp":false,"multiple":false,"type":"option"},"content":{"description":"Описание","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"due-at":{"description":"Срок выполнения напоминания (ISO-8601) в формате YYYY-MM-DDThh:mm:ss.sssTZD. Если указано время 23:59:59.000, то напоминание будет создано на весь день (без указания времени).","name":"due-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"priority":{"description":"Приоритет: 1, 2 (важно) или 3 (очень важно).","name":"priority","hasDynamicHelp":false,"multiple":false,"type":"option"},"performer-ids":{"description":"Массив идентификаторов пользователей, привязываемых к напоминанию как «ответственные»","name":"performer-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"status":{"description":"Статус","name":"status","hasDynamicHelp":false,"multiple":false,"type":"option"},"all-day":{"description":"Напоминание на весь день (без указания времени)","name":"all-day","allowNo":true,"type":"boolean"},"done-at":{"description":"Дата и время выполнения напоминания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ","name":"done-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:update","apiMethod":"PUT","apiPath":"/tasks/{id}","defaultColumns":["id","content","created_at","kind","due_at"],"isESM":true,"relativePath":["dist","commands","tasks","update.js"]},"threads:add":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Новый тред","examples":["Ответить в тред (комментарий к сообщению):\n $ pachca thread add","Подписаться на тред сообщения:\n $ pachca thread add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"threads:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"threads:create","apiMethod":"POST","apiPath":"/messages/{id}/thread","defaultColumns":["id","chat_id","message_id","message_chat_id","updated_at"],"isESM":true,"relativePath":["dist","commands","threads","add.js"]},"threads:get":{"aliases":[],"args":{"id":{"description":"Идентификатор треда","name":"id","required":true}},"description":"Информация о треде","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"threads:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"threads:read","apiMethod":"GET","apiPath":"/threads/{id}","defaultColumns":["id","chat_id","message_id","message_chat_id","updated_at"],"isESM":true,"relativePath":["dist","commands","threads","get.js"]},"upgrade":{"aliases":[],"args":{},"description":"Обновить CLI до последней версии","examples":["<%= config.bin %> upgrade"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"upgrade","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","upgrade.js"]},"upload":{"aliases":[],"args":{"file":{"description":"Путь к файлу или - для stdin","name":"file","required":true}},"description":"Загрузить файл (получает подпись и загружает автоматически)","examples":["<%= config.bin %> upload photo.jpg","cat data.csv | <%= config.bin %> upload -"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"upload","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"uploads:write","isESM":true,"relativePath":["dist","commands","upload.js"]},"users:create":{"aliases":[],"args":{},"description":"Создать сотрудника","examples":["Проверить, кто прочитал сообщение:\n $ pachca users list","Разослать уведомление нескольким пользователям:\n $ pachca users list","Массовое создание сотрудников с тегами:\n $ pachca users create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"first-name":{"description":"Имя","name":"first-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"last-name":{"description":"Фамилия","name":"last-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"email":{"description":"Электронная почта","name":"email","hasDynamicHelp":false,"multiple":false,"type":"option"},"phone-number":{"description":"Телефон","name":"phone-number","hasDynamicHelp":false,"multiple":false,"type":"option"},"nickname":{"description":"Имя пользователя","name":"nickname","hasDynamicHelp":false,"multiple":false,"type":"option"},"department":{"description":"Департамент","name":"department","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Должность","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"role":{"description":"Уровень доступа","name":"role","hasDynamicHelp":false,"multiple":false,"type":"option"},"suspended":{"description":"Деактивация пользователя","name":"suspended","allowNo":true,"type":"boolean"},"list-tags":{"description":"Массив тегов, привязываемых к сотруднику","name":"list-tags","hasDynamicHelp":false,"multiple":false,"type":"option"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"},"skip-email-notify":{"description":"Пропуск этапа отправки приглашения сотруднику. Сотруднику не будет отправлено письмо на электронную почту с приглашением создать аккаунт. Полезно при предварительном создании аккаунтов перед входом через SSO.","name":"skip-email-notify","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:create","apiMethod":"POST","apiPath":"/users","defaultColumns":["id","title","first_name","last_name","email"],"requiredFlags":["email"],"isESM":true,"relativePath":["dist","commands","users","create.js"]},"users:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор пользователя (pachca users list)","name":"id","required":true}},"description":"Удаление сотрудника","examples":["Получить сотрудника по ID:\n $ pachca users get","Массовое создание сотрудников с тегами:\n $ pachca users update","Offboarding сотрудника:\n $ pachca users update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:delete","apiMethod":"DELETE","apiPath":"/users/{id}","isESM":true,"relativePath":["dist","commands","users","delete.js"]},"users:get":{"aliases":[],"args":{"id":{"description":"Идентификатор пользователя (pachca users list)","name":"id","required":true}},"description":"Информация о сотруднике","examples":["Получить сотрудника по ID:\n $ pachca users get","Массовое создание сотрудников с тегами:\n $ pachca users update","Offboarding сотрудника:\n $ pachca users update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:read","apiMethod":"GET","apiPath":"/users/{id}","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","users","get.js"]},"users:get-status":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Статус сотрудника","examples":["Управление статусом сотрудника:\n $ pachca users get-status","Управление статусом сотрудника:\n $ pachca users update-status","Управление статусом сотрудника:\n $ pachca users remove-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:get-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_status:read","apiMethod":"GET","apiPath":"/users/{user_id}/status","defaultColumns":["title","emoji","expires_at","is_away"],"isESM":true,"relativePath":["dist","commands","users","get-status.js"]},"users:list":{"aliases":[],"args":{},"description":"Список сотрудников","examples":["Проверить, кто прочитал сообщение:\n $ pachca users list","Разослать уведомление нескольким пользователям:\n $ pachca users list","Массовое создание сотрудников с тегами:\n $ pachca users create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Поисковая фраза для фильтрации результатов. Поиск работает по полям: `first_name` (имя), `last_name` (фамилия), `email` (электронная почта), `phone_number` (телефон) и `nickname` (никнейм).","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:read","apiMethod":"GET","apiPath":"/users","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","users","list.js"]},"users:remove-avatar":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Удаление аватара сотрудника","examples":["Загрузить аватар сотрудника:\n $ pachca users update-avatar","Удалить аватар сотрудника:\n $ pachca users remove-avatar"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:remove-avatar","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_avatar:write","apiMethod":"DELETE","apiPath":"/users/{user_id}/avatar","isESM":true,"relativePath":["dist","commands","users","remove-avatar.js"]},"users:remove-status":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Удаление статуса сотрудника","examples":["Управление статусом сотрудника:\n $ pachca users get-status","Управление статусом сотрудника:\n $ pachca users update-status","Управление статусом сотрудника:\n $ pachca users remove-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:remove-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_status:write","apiMethod":"DELETE","apiPath":"/users/{user_id}/status","isESM":true,"relativePath":["dist","commands","users","remove-status.js"]},"users:update":{"aliases":[],"args":{"id":{"description":"Идентификатор пользователя (pachca users list)","name":"id","required":true}},"description":"Редактирование сотрудника","examples":["Получить сотрудника по ID:\n $ pachca users get","Массовое создание сотрудников с тегами:\n $ pachca users update","Offboarding сотрудника:\n $ pachca users update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"first-name":{"description":"Имя","name":"first-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"last-name":{"description":"Фамилия","name":"last-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"email":{"description":"Электронная почта","name":"email","hasDynamicHelp":false,"multiple":false,"type":"option"},"phone-number":{"description":"Телефон","name":"phone-number","hasDynamicHelp":false,"multiple":false,"type":"option"},"nickname":{"description":"Имя пользователя","name":"nickname","hasDynamicHelp":false,"multiple":false,"type":"option"},"department":{"description":"Департамент","name":"department","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Должность","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"role":{"description":"Уровень доступа","name":"role","hasDynamicHelp":false,"multiple":false,"type":"option"},"suspended":{"description":"Деактивация пользователя","name":"suspended","allowNo":true,"type":"boolean"},"list-tags":{"description":"Массив тегов, привязываемых к сотруднику","name":"list-tags","hasDynamicHelp":false,"multiple":false,"type":"option"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:update","apiMethod":"PUT","apiPath":"/users/{id}","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","users","update.js"]},"users:update-avatar":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Загрузка аватара сотрудника","examples":["Загрузить аватар сотрудника:\n $ pachca users update-avatar","Удалить аватар сотрудника:\n $ pachca users remove-avatar"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"file":{"description":"Файл изображения для аватара","name":"file","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:update-avatar","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_avatar:write","apiMethod":"PUT","apiPath":"/users/{user_id}/avatar","defaultColumns":["image_url"],"isESM":true,"relativePath":["dist","commands","users","update-avatar.js"]},"users:update-status":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Новый статус сотрудника","examples":["Управление статусом сотрудника:\n $ pachca users get-status","Управление статусом сотрудника:\n $ pachca users update-status","Управление статусом сотрудника:\n $ pachca users remove-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"emoji":{"description":"Emoji символ статуса","name":"emoji","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Текст статуса","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"expires-at":{"description":"Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ","name":"expires-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"is-away":{"description":"Режим «Нет на месте»","name":"is-away","allowNo":true,"type":"boolean"},"away-message":{"description":"Текст сообщения при режиме «Нет на месте». Отображается в профиле и при личных сообщениях/упоминаниях. (макс. 1024 символов)","name":"away-message","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:update-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_status:write","apiMethod":"PUT","apiPath":"/users/{user_id}/status","defaultColumns":["title","emoji","expires_at","is_away"],"requiredFlags":["emoji","title"],"isESM":true,"relativePath":["dist","commands","users","update-status.js"]},"version":{"aliases":[],"args":{},"description":"Версия CLI","examples":["<%= config.bin %> version"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"version","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","version.js"]},"views:open":{"aliases":[],"args":{},"description":"Открытие представления","examples":["Показать интерактивную форму пользователю:\n $ pachca views open","Опрос сотрудников через форму:\n $ pachca views open","Форма заявки/запроса:\n $ pachca views open"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"title":{"description":"Заголовок представления (макс. 24 символов)","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"close-text":{"description":"Текст кнопки закрытия представления (макс. 24 символов)","name":"close-text","hasDynamicHelp":false,"multiple":false,"type":"option"},"submit-text":{"description":"Текст кнопки отправки формы (макс. 24 символов)","name":"submit-text","hasDynamicHelp":false,"multiple":false,"type":"option"},"blocks":{"description":"Массив блоков представления","name":"blocks","hasDynamicHelp":false,"multiple":false,"type":"option"},"type":{"description":"Способ открытия представления","name":"type","hasDynamicHelp":false,"multiple":false,"options":["modal"],"type":"option"},"trigger-id":{"description":"Уникальный идентификатор события (полученный, например, в исходящем вебхуке о нажатии кнопки)","name":"trigger-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"private-metadata":{"description":"Необязательная строка, которая будет отправлена в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для передачи в формате `JSON` какой то дополнительной информации вместе с заполненной пользователем формой. (макс. 3000 символов)","name":"private-metadata","hasDynamicHelp":false,"multiple":false,"type":"option"},"callback-id":{"description":"Необязательный идентификатор для распознавания этого представления, который будет отправлен в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для понимания, какую форму должен был заполнить пользователь. (макс. 255 символов)","name":"callback-id","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"views:open","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"views:write","apiMethod":"POST","apiPath":"/views/open","requiredFlags":["title","blocks","type","trigger-id"],"isESM":true,"relativePath":["dist","commands","views","open.js"]}},"version":"0.0.0"} \ No newline at end of file diff --git a/packages/cli/scripts/generate-cli.ts b/packages/cli/scripts/generate-cli.ts index 5f08e76b..d54e0ef6 100644 --- a/packages/cli/scripts/generate-cli.ts +++ b/packages/cli/scripts/generate-cli.ts @@ -355,6 +355,24 @@ function generateCommandCode(p: CommandGenParams): string { }),`; }); + // For list commands with a single required ID query param, add it as an optional positional arg + // e.g., `pachca messages list 36988817` as a shortcut for `--chat-id=36988817` + let shortcutArg: { paramName: string; flagName: string; argType: string } | null = null; + if (p.isList && requiredQueryFlags.length === 1 && requiredQueryFlags[0].flagName.endsWith('-id')) { + const param = p.queryParams.find((q) => q.required && toKebabCase(q.name) === requiredQueryFlags[0].flagName); + if (param) { + shortcutArg = { + paramName: param.name, + flagName: requiredQueryFlags[0].flagName, + argType: getOclifArgType(param.schema), + }; + argsCode.push(` ${param.name}: Args.${shortcutArg.argType}({ + description: ${JSON.stringify(param.description || param.name)}, + required: false, + }),`); + } + } + // Build flags for query params const queryFlagLines: string[] = []; for (const param of p.queryParams) { @@ -383,12 +401,15 @@ function generateCommandCode(p: CommandGenParams): string { } const flagName = toKebabCase(param.name); - const flagType = getOclifFlagType(param.schema); + // Resolve allOf to get enum/type/default from $ref schemas (e.g., SortOrder, ChatSortField) + const resolvedParamSchema = resolveAllOf(param.schema); + const flagType = getOclifFlagType(resolvedParamSchema); const extras: string[] = []; - if (param.schema.enum) extras.push(` options: ${JSON.stringify(param.schema.enum)},`); + if (resolvedParamSchema.enum) extras.push(` options: ${JSON.stringify(resolvedParamSchema.enum)},`); + if (resolvedParamSchema.default !== undefined) extras.push(` default: ${JSON.stringify(resolvedParamSchema.default)},`); if (flagType === 'boolean') extras.push(` allowNo: true,`); const extrasStr = extras.length > 0 ? '\n' + extras.join('\n') : ''; - const arrayHint = param.schema.type === 'array' ? ' (через запятую)' : ''; + const arrayHint = resolvedParamSchema.type === 'array' ? ' (через запятую)' : ''; queryFlagLines.push(` '${flagName}': Flags.${flagType}({ description: ${JSON.stringify(param.description || param.name)}${arrayHint ? ` + ${JSON.stringify(arrayHint)}` : ''},${extrasStr} }),`); @@ -474,6 +495,14 @@ function generateCommandCode(p: CommandGenParams): string { runBodyLines.push(` const { args, flags } = await this.parse(${p.className});`); runBodyLines.push(` this.parsedFlags = flags;`); + // Populate flag from positional arg shortcut (e.g., `messages list 123` → --chat-id=123) + if (shortcutArg) { + runBodyLines.push(''); + runBodyLines.push(` if (args.${shortcutArg.paramName} !== undefined && (flags as Record)['${shortcutArg.flagName}'] === undefined) {`); + runBodyLines.push(` (flags as Record)['${shortcutArg.flagName}'] = args.${shortcutArg.paramName};`); + runBodyLines.push(` }`); + } + // Stdin support for text fields if (p.stdinField) { const flagName = toKebabCase(p.stdinField.name); diff --git a/packages/cli/src/commands/chats/list.ts b/packages/cli/src/commands/chats/list.ts index 3c065e23..c8d8de38 100644 --- a/packages/cli/src/commands/chats/list.ts +++ b/packages/cli/src/commands/chats/list.ts @@ -22,16 +22,17 @@ export default class ChatsList extends BaseCommand { static override flags = { ...BaseCommand.baseFlags, - sort: Flags.string({ - description: "Поле сортировки (id — идентификатор чата, last-message-at — дата и время создания последнего сообщения)", - options: ["id","last-message-at"], + 'sort': Flags.string({ + description: "Поле сортировки", + options: ["id","last_message_at"], }), - order: Flags.string({ - description: "Порядок сортировки", + 'order': Flags.string({ + description: "Направление сортировки", options: ["asc","desc"], }), 'availability': Flags.string({ description: "Параметр, который отвечает за доступность и выборку чатов для пользователя", + options: ["is_member","public"], }), 'last-message-at-after': Flags.string({ description: "Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не раньше чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).", @@ -68,7 +69,8 @@ export default class ChatsList extends BaseCommand { while (pages < 500) { const query: Record = { - ...(flags.sort ? { [`sort[${flags.sort.replace(/-/g, '_')}]`]: flags.order || 'desc' } : {}), + sort: flags['sort'], + order: flags['order'], availability: flags['availability'], 'last_message_at_after': flags['last-message-at-after'], 'last_message_at_before': flags['last-message-at-before'], @@ -112,7 +114,8 @@ export default class ChatsList extends BaseCommand { method: 'GET', path: '/chats', query: { - ...(flags.sort ? { [`sort[${flags.sort.replace(/-/g, '_')}]`]: flags.order || 'desc' } : {}), + sort: flags['sort'], + order: flags['order'], availability: flags['availability'], 'last_message_at_after': flags['last-message-at-after'], 'last_message_at_before': flags['last-message-at-before'], diff --git a/packages/cli/src/commands/members/list.ts b/packages/cli/src/commands/members/list.ts index 1612ad67..13be4ee3 100644 --- a/packages/cli/src/commands/members/list.ts +++ b/packages/cli/src/commands/members/list.ts @@ -27,6 +27,7 @@ export default class MembersList extends BaseCommand { ...BaseCommand.baseFlags, 'role': Flags.string({ description: "Роль в чате", + options: ["all","owner","admin","editor","member"], }), limit: Flags.integer({ description: 'Количество результатов на страницу', diff --git a/packages/cli/src/commands/messages/list.ts b/packages/cli/src/commands/messages/list.ts index 8b44d241..a59235e5 100644 --- a/packages/cli/src/commands/messages/list.ts +++ b/packages/cli/src/commands/messages/list.ts @@ -19,7 +19,10 @@ export default class MessagesList extends BaseCommand { static requiredFlags = ["chat-id"]; static override args = { - + chat_id: Args.integer({ + description: "Идентификатор чата (беседа, канал, диалог или чат треда)", + required: false, + }), }; static override flags = { @@ -27,12 +30,12 @@ export default class MessagesList extends BaseCommand { 'chat-id': Flags.integer({ description: "Идентификатор чата (беседа, канал, диалог или чат треда)", }), - sort: Flags.string({ - description: "Поле сортировки (id — идентификатор сообщения)", + 'sort': Flags.string({ + description: "Поле сортировки", options: ["id"], }), - order: Flags.string({ - description: "Порядок сортировки", + 'order': Flags.string({ + description: "Направление сортировки", options: ["asc","desc"], }), limit: Flags.integer({ @@ -51,6 +54,10 @@ export default class MessagesList extends BaseCommand { const { args, flags } = await this.parse(MessagesList); this.parsedFlags = flags; + if (args.chat_id !== undefined && (flags as Record)['chat-id'] === undefined) { + (flags as Record)['chat-id'] = args.chat_id; + } + const missingRequired: { flag: string; label: string; type: string }[] = [ { flag: 'chat-id', label: "Идентификатор чата (беседа, канал, диалог или чат треда)", type: 'integer' }, ].filter((f) => (flags as Record)[f.flag] === undefined || (flags as Record)[f.flag] === null); @@ -82,7 +89,8 @@ export default class MessagesList extends BaseCommand { while (pages < 500) { const query: Record = { 'chat_id': flags['chat-id'], - ...(flags.sort ? { [`sort[${flags.sort.replace(/-/g, '_')}]`]: flags.order || 'desc' } : {}), + sort: flags['sort'], + order: flags['order'], limit: flags.limit, cursor: nextCursor, }; @@ -123,7 +131,8 @@ export default class MessagesList extends BaseCommand { path: '/messages', query: { 'chat_id': flags['chat-id'], - ...(flags.sort ? { [`sort[${flags.sort.replace(/-/g, '_')}]`]: flags.order || 'desc' } : {}), + sort: flags['sort'], + order: flags['order'], limit: flags.limit, cursor: flags.cursor, }, diff --git a/packages/cli/src/commands/profile/delete-avatar.ts b/packages/cli/src/commands/profile/delete-avatar.ts new file mode 100644 index 00000000..815252d3 --- /dev/null +++ b/packages/cli/src/commands/profile/delete-avatar.ts @@ -0,0 +1,55 @@ +// Auto-generated from openapi.yaml — DO NOT EDIT +import { Args, Flags } from '@oclif/core'; +import { BaseCommand } from '../../base-command.js'; +import * as clack from '@clack/prompts'; + +export default class ProfileDeleteAvatar extends BaseCommand { + static override description = "Удаление аватара"; + + static override examples = [ + "Загрузить аватар профиля:\n $ pachca profile update-avatar", + "Удалить аватар профиля:\n $ pachca profile delete-avatar" + ]; + + static scope = "profile_avatar:write"; + static apiMethod = "DELETE"; + static apiPath = "/profile/avatar"; + + static override args = { + + }; + + static override flags = { + ...BaseCommand.baseFlags, + force: Flags.boolean({ + description: 'Пропустить подтверждение', + default: false, + }), + }; + + async run(): Promise { + const { args, flags } = await this.parse(ProfileDeleteAvatar); + this.parsedFlags = flags; + + if (!flags.force) { + if (!this.isInteractive()) { + this.validationError( + [{ message: 'Деструктивная операция требует флага --force', flag: 'force' }], + { type: 'PACHCA_DESTRUCTIVE_OP_ERROR', hint: "pachca profile delete-avatar --force" }, + ); + } + const confirm = await clack.confirm({ message: 'Вы уверены?' }); + if (clack.isCancel(confirm) || !confirm) { + process.stderr.write('Отменено.\n'); + this.exit(0); + } + } + + const { data } = await this.apiRequest({ + method: 'DELETE', + path: '/profile/avatar', + }); + + this.success('Удалено'); + } +} diff --git a/packages/cli/src/commands/profile/update-avatar.ts b/packages/cli/src/commands/profile/update-avatar.ts new file mode 100644 index 00000000..4018da61 --- /dev/null +++ b/packages/cli/src/commands/profile/update-avatar.ts @@ -0,0 +1,59 @@ +// Auto-generated from openapi.yaml — DO NOT EDIT +import { Args, Flags } from '@oclif/core'; +import { BaseCommand } from '../../base-command.js'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; + +export default class ProfileUpdateAvatar extends BaseCommand { + static override description = "Загрузка аватара"; + + static override examples = [ + "Загрузить аватар профиля:\n $ pachca profile update-avatar", + "Удалить аватар профиля:\n $ pachca profile delete-avatar" + ]; + + static scope = "profile_avatar:write"; + static apiMethod = "PUT"; + static apiPath = "/profile/avatar"; + static defaultColumns = ["image_url"]; + + static override args = { + + }; + + static override flags = { + ...BaseCommand.baseFlags, + file: Flags.string({ + description: "Файл изображения для аватара", + }), + }; + + async run(): Promise { + const { args, flags } = await this.parse(ProfileUpdateAvatar); + this.parsedFlags = flags; + + let formData: FormData | undefined; + if (flags.file) { + formData = new FormData(); + if (flags.file === '-') { + const chunks: Buffer[] = []; + for await (const chunk of process.stdin) chunks.push(chunk as Buffer); + const blob = new Blob([Buffer.concat(chunks)]); + formData.append('image', blob, 'stdin'); + } else { + const blob = new Blob([fs.readFileSync(flags.file)]); + formData.append('image', blob, path.basename(flags.file)); + } + } + + const { data } = await this.apiRequest({ + method: 'PUT', + path: '/profile/avatar', + formData, + }); + + const responseBody = data as Record; + const result = responseBody.data ?? responseBody; + this.output(result); + } +} diff --git a/packages/cli/src/commands/users/remove-avatar.ts b/packages/cli/src/commands/users/remove-avatar.ts new file mode 100644 index 00000000..37106544 --- /dev/null +++ b/packages/cli/src/commands/users/remove-avatar.ts @@ -0,0 +1,58 @@ +// Auto-generated from openapi.yaml — DO NOT EDIT +import { Args, Flags } from '@oclif/core'; +import { BaseCommand } from '../../base-command.js'; +import * as clack from '@clack/prompts'; + +export default class UsersRemoveAvatar extends BaseCommand { + static override description = "Удаление аватара сотрудника"; + + static override examples = [ + "Загрузить аватар сотрудника:\n $ pachca users update-avatar", + "Удалить аватар сотрудника:\n $ pachca users remove-avatar" + ]; + + static scope = "user_avatar:write"; + static apiMethod = "DELETE"; + static apiPath = "/users/{user_id}/avatar"; + + static override args = { + user_id: Args.integer({ + description: "Идентификатор пользователя (pachca users list)", + required: true, + }), + }; + + static override flags = { + ...BaseCommand.baseFlags, + force: Flags.boolean({ + description: 'Пропустить подтверждение', + default: false, + }), + }; + + async run(): Promise { + const { args, flags } = await this.parse(UsersRemoveAvatar); + this.parsedFlags = flags; + + if (!flags.force) { + if (!this.isInteractive()) { + this.validationError( + [{ message: 'Деструктивная операция требует флага --force', flag: 'force' }], + { type: 'PACHCA_DESTRUCTIVE_OP_ERROR', hint: "pachca users remove-avatar --force" }, + ); + } + const confirm = await clack.confirm({ message: 'Вы уверены?' }); + if (clack.isCancel(confirm) || !confirm) { + process.stderr.write('Отменено.\n'); + this.exit(0); + } + } + + const { data } = await this.apiRequest({ + method: 'DELETE', + path: `/users/${args.user_id}/avatar`, + }); + + this.success('Удалено'); + } +} diff --git a/packages/cli/src/commands/users/update-avatar.ts b/packages/cli/src/commands/users/update-avatar.ts new file mode 100644 index 00000000..7c7a9487 --- /dev/null +++ b/packages/cli/src/commands/users/update-avatar.ts @@ -0,0 +1,62 @@ +// Auto-generated from openapi.yaml — DO NOT EDIT +import { Args, Flags } from '@oclif/core'; +import { BaseCommand } from '../../base-command.js'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; + +export default class UsersUpdateAvatar extends BaseCommand { + static override description = "Загрузка аватара сотрудника"; + + static override examples = [ + "Загрузить аватар сотрудника:\n $ pachca users update-avatar", + "Удалить аватар сотрудника:\n $ pachca users remove-avatar" + ]; + + static scope = "user_avatar:write"; + static apiMethod = "PUT"; + static apiPath = "/users/{user_id}/avatar"; + static defaultColumns = ["image_url"]; + + static override args = { + user_id: Args.integer({ + description: "Идентификатор пользователя (pachca users list)", + required: true, + }), + }; + + static override flags = { + ...BaseCommand.baseFlags, + file: Flags.string({ + description: "Файл изображения для аватара", + }), + }; + + async run(): Promise { + const { args, flags } = await this.parse(UsersUpdateAvatar); + this.parsedFlags = flags; + + let formData: FormData | undefined; + if (flags.file) { + formData = new FormData(); + if (flags.file === '-') { + const chunks: Buffer[] = []; + for await (const chunk of process.stdin) chunks.push(chunk as Buffer); + const blob = new Blob([Buffer.concat(chunks)]); + formData.append('image', blob, 'stdin'); + } else { + const blob = new Blob([fs.readFileSync(flags.file)]); + formData.append('image', blob, path.basename(flags.file)); + } + } + + const { data } = await this.apiRequest({ + method: 'PUT', + path: `/users/${args.user_id}/avatar`, + formData, + }); + + const responseBody = data as Record; + const result = responseBody.data ?? responseBody; + this.output(result); + } +} diff --git a/packages/cli/src/data/alternatives.json b/packages/cli/src/data/alternatives.json index ab60b025..a5691d92 100644 --- a/packages/cli/src/data/alternatives.json +++ b/packages/cli/src/data/alternatives.json @@ -39,6 +39,8 @@ "threads:add": "Новый тред", "profile:get-info": "Информация о токене", "profile:get": "Информация о профиле", + "profile:update-avatar": "Загрузка аватара", + "profile:delete-avatar": "Удаление аватара", "profile:get-status": "Текущий статус", "profile:update-status": "Новый статус", "profile:delete-status": "Удаление статуса", @@ -57,6 +59,8 @@ "users:get": "Информация о сотруднике", "users:update": "Редактирование сотрудника", "users:delete": "Удаление сотрудника", + "users:update-avatar": "Загрузка аватара сотрудника", + "users:remove-avatar": "Удаление аватара сотрудника", "users:get-status": "Статус сотрудника", "users:update-status": "Новый статус сотрудника", "users:remove-status": "Удаление статуса сотрудника", diff --git a/packages/cli/src/data/changelog.json b/packages/cli/src/data/changelog.json index 7d0e4138..f1d850b7 100644 --- a/packages/cli/src/data/changelog.json +++ b/packages/cli/src/data/changelog.json @@ -1,4 +1,30 @@ [ + { + "version": "2026.4.1", + "date": "6 апреля 2026", + "changes": [ + { + "type": "+", + "command": "profile update-avatar", + "description": "Загрузка аватара профиля" + }, + { + "type": "+", + "command": "profile delete-avatar", + "description": "Удаление аватара профиля" + }, + { + "type": "+", + "command": "users update-avatar", + "description": "Загрузка аватара сотрудника" + }, + { + "type": "+", + "command": "users remove-avatar", + "description": "Удаление аватара сотрудника" + } + ] + }, { "version": "2026.3.10", "date": "21 марта 2026", diff --git a/packages/cli/src/data/workflows.json b/packages/cli/src/data/workflows.json index 2acb5135..3b06927b 100644 --- a/packages/cli/src/data/workflows.json +++ b/packages/cli/src/data/workflows.json @@ -598,6 +598,28 @@ } ] }, + { + "title": "Загрузить аватар сотрудника", + "skill": "pachca-users", + "steps": [ + { + "description": "Загрузи аватар сотруднику", + "command": "pachca users update-avatar --file=<путь_к_файлу>", + "notes": "Требует прав администратора. Файл передается в формате multipart/form-data" + } + ] + }, + { + "title": "Удалить аватар сотрудника", + "skill": "pachca-users", + "steps": [ + { + "description": "Удали аватар сотрудника", + "command": "pachca users remove-avatar --force", + "notes": "Требует прав администратора" + } + ] + }, { "title": "Создать напоминание", "skill": "pachca-tasks", @@ -727,6 +749,27 @@ } ] }, + { + "title": "Загрузить аватар профиля", + "skill": "pachca-profile", + "steps": [ + { + "description": "Загрузи аватар из файла", + "command": "pachca profile update-avatar --file=<путь_к_файлу>", + "notes": "Файл изображения передается в формате multipart/form-data" + } + ] + }, + { + "title": "Удалить аватар профиля", + "skill": "pachca-profile", + "steps": [ + { + "description": "Удали аватар", + "command": "pachca profile delete-avatar --force" + } + ] + }, { "title": "Найти сообщение по тексту", "skill": "pachca-search", diff --git a/packages/cli/tests/commands.test.ts b/packages/cli/tests/commands.test.ts index ced43575..c246f90c 100644 --- a/packages/cli/tests/commands.test.ts +++ b/packages/cli/tests/commands.test.ts @@ -360,16 +360,17 @@ describe('generated commands — functional tests', () => { }); }); - // ----- Composite query params (chats list) ----- + // ----- Sort query params (chats list) ----- describe('chats list', () => { - it('--sort last-message-at --order desc → query sort[last_message_at]=desc', async () => { + it('--sort last_message_at --order desc → query sort=last_message_at&order=desc', async () => { mockFetchForEndpoint('/chats', 'GET'); - const { stdout, stderr, error } = await runCommand(['chats', 'list', '--sort', 'last-message-at', '--order', 'desc'], { root: CLI_ROOT }); + const { stdout, stderr, error } = await runCommand(['chats', 'list', '--sort', 'last_message_at', '--order', 'desc'], { root: CLI_ROOT }); expect(error).toBeUndefined(); expect(fetchCalls().length).toBeGreaterThan(0); const url = fetchCalls()[0][0] as string; - expect(url).toContain('sort%5Blast_message_at%5D=desc'); + expect(url).toContain('sort=last_message_at'); + expect(url).toContain('order=desc'); }); }); diff --git a/packages/cli/tests/generate-cli.test.ts b/packages/cli/tests/generate-cli.test.ts index cc58c4a1..565bd92b 100644 --- a/packages/cli/tests/generate-cli.test.ts +++ b/packages/cli/tests/generate-cli.test.ts @@ -156,15 +156,14 @@ describe('generate-cli', () => { expect(content).not.toMatch(/'xAmz\w+':\s*Flags/); }); - it('should generate --sort and --order flags for composite sort params', () => { + it('should generate --sort and --order flags for sort params', () => { const content = fs.readFileSync( path.join(COMMANDS_DIR, 'chats', 'list.ts'), 'utf-8', ); - // sort[{field}] with x-param-names → --sort with options + --order with asc/desc - expect(content).toContain('sort: Flags.string('); - expect(content).toContain('order: Flags.string('); - expect(content).toContain('"last-message-at"'); + // sort and order are separate query params + expect(content).toContain("'sort': Flags.string("); + expect(content).toContain("'order': Flags.string("); expect(content).not.toMatch(/'sort-id':\s*Flags/); expect(content).not.toMatch(/'sort-last-message-at':\s*Flags/); }); diff --git a/packages/generator/src/lang/csharp.ts b/packages/generator/src/lang/csharp.ts index bc6da496..44a82b9e 100644 --- a/packages/generator/src/lang/csharp.ts +++ b/packages/generator/src/lang/csharp.ts @@ -860,6 +860,7 @@ function emitMultipartBody( const binaryField = reqModel.fields.find((f) => f.type.kind === 'binary'); const nonBinaryFields = reqModel.fields.filter((f) => f.type.kind !== 'binary'); + const isUnwrapped = shouldUnwrapBody(op.requestBody!); if (op.externalUrl) { lines.push(`${indent2}var url = ${paramSdkName(op.externalUrl)};`); @@ -870,19 +871,19 @@ function emitMultipartBody( lines.push(`${indent2}using var content = new MultipartFormDataContent();`); for (const f of nonBinaryFields) { - const sdkName = fieldSdkName(f); + const sdk = isUnwrapped ? paramSdkName(f.name) : `request.${fieldSdkName(f)}`; const isOptional = !f.required || f.nullable; if (isOptional) { - lines.push(`${indent2}if (request.${sdkName} != null)`); - lines.push(`${indent2} content.Add(new StringContent($"{request.${sdkName}}"), "${f.name}");`); + lines.push(`${indent2}if (${sdk} != null)`); + lines.push(`${indent2} content.Add(new StringContent($"{${sdk}}"), "${f.name}");`); } else { - lines.push(`${indent2}content.Add(new StringContent($"{request.${sdkName}}"), "${f.name}");`); + lines.push(`${indent2}content.Add(new StringContent($"{${sdk}}"), "${f.name}");`); } } if (binaryField) { - const sdkName = fieldSdkName(binaryField); - lines.push(`${indent2}content.Add(new ByteArrayContent(request.${sdkName}), "${binaryField.name}", "${binaryField.name}");`); + const sdk = isUnwrapped ? paramSdkName(binaryField.name) : `request.${fieldSdkName(binaryField)}`; + lines.push(`${indent2}content.Add(new ByteArrayContent(${sdk}), "${binaryField.name}", "${binaryField.name}");`); } lines.push(`${indent2}using var httpRequest = new HttpRequestMessage(HttpMethod.${httpMethodName(op.method.toUpperCase())}, url);`); diff --git a/packages/generator/src/lang/go.ts b/packages/generator/src/lang/go.ts index c427953f..c6a9d48b 100644 --- a/packages/generator/src/lang/go.ts +++ b/packages/generator/src/lang/go.ts @@ -420,24 +420,29 @@ function emitOp(lines: string[], op: IROperation, ir: IR): void { lines.push('\tgo func() {'); lines.push('\t\tdefer pw.Close()'); lines.push('\t\tdefer writer.Close()'); + const isUnwrapped = shouldUnwrapBody(op.requestBody!); if (req) { const bin = req.fields.find((f) => f.type.kind === 'binary'); const non = req.fields.filter((f) => f.type.kind !== 'binary'); for (const f of non.filter((x) => isOptionalField(x))) { - lines.push(`\t\tif request.${goExportName(f.name)} != nil {`); - lines.push(`\t\t\twriter.WriteField(${JSON.stringify(f.name)}, fmt.Sprintf("%v", *request.${goExportName(f.name)}))`); + const ref = isUnwrapped ? snakeToCamel(f.name) : `request.${goExportName(f.name)}`; + const deref = isUnwrapped ? snakeToCamel(f.name) : `*request.${goExportName(f.name)}`; + lines.push(`\t\tif ${ref} != nil {`); + lines.push(`\t\t\twriter.WriteField(${JSON.stringify(f.name)}, fmt.Sprintf("%v", ${deref}))`); lines.push('\t\t}'); } for (const f of non.filter((x) => !isOptionalField(x))) { - lines.push(`\t\twriter.WriteField(${JSON.stringify(f.name)}, fmt.Sprintf("%v", request.${goExportName(f.name)}))`); + const ref = isUnwrapped ? snakeToCamel(f.name) : `request.${goExportName(f.name)}`; + lines.push(`\t\twriter.WriteField(${JSON.stringify(f.name)}, fmt.Sprintf("%v", ${ref}))`); } if (bin) { + const binRef = isUnwrapped ? snakeToCamel(bin.name) : `request.${goExportName(bin.name)}`; lines.push(`\t\tpart, err := writer.CreateFormFile(${JSON.stringify(bin.name)}, "upload")`); lines.push('\t\tif err != nil {'); lines.push('\t\t\tpw.CloseWithError(err)'); lines.push('\t\t\treturn'); lines.push('\t\t}'); - lines.push(`\t\tif _, err := io.Copy(part, request.${goExportName(bin.name)}); err != nil {`); + lines.push(`\t\tif _, err := io.Copy(part, ${binRef}); err != nil {`); lines.push('\t\t\tpw.CloseWithError(err)'); lines.push('\t\t\treturn'); lines.push('\t\t}'); diff --git a/packages/generator/src/lang/kotlin.ts b/packages/generator/src/lang/kotlin.ts index 05888d63..85217f12 100644 --- a/packages/generator/src/lang/kotlin.ts +++ b/packages/generator/src/lang/kotlin.ts @@ -681,29 +681,34 @@ function emitMultipartBody( (f) => f.type.kind !== 'binary', ); + const isUnwrapped = shouldUnwrapBody(op.requestBody!); + // Optional fields first (in schema order) for (const f of nonBinaryFields) { const sdkName = fieldSdkName(f); + const ref = isUnwrapped ? sdkName : `request.${sdkName}`; const isOptional = !f.required || f.nullable; if (isOptional) { lines.push( - `${indent4}request.${sdkName}?.let { append("${f.name}", it) }`, + `${indent4}${ref}?.let { append("${f.name}", it) }`, ); } } // Required fields for (const f of nonBinaryFields) { const sdkName = fieldSdkName(f); + const ref = isUnwrapped ? sdkName : `request.${sdkName}`; const isOptional = !f.required || f.nullable; if (!isOptional) { - lines.push(`${indent4}append("${f.name}", request.${sdkName})`); + lines.push(`${indent4}append("${f.name}", ${ref})`); } } // Binary field if (binaryField) { const sdkName = fieldSdkName(binaryField); + const ref = isUnwrapped ? sdkName : `request.${sdkName}`; lines.push( - `${indent4}append("${binaryField.name}", request.${sdkName}, Headers.build {`, + `${indent4}append("${binaryField.name}", ${ref}, Headers.build {`, ); lines.push( `${indent4} append(HttpHeaders.ContentDisposition, "filename=\\"${binaryField.name}\\"")`, diff --git a/packages/generator/src/lang/python.ts b/packages/generator/src/lang/python.ts index 322146ac..f05f8f21 100644 --- a/packages/generator/src/lang/python.ts +++ b/packages/generator/src/lang/python.ts @@ -409,22 +409,28 @@ function emitOperation(lines: string[], op: IROperation, ir: IR): void { if (isMultipart) { lines.push(` data: dict[str, str] = {}`); const req = ir.models.find((m) => m.name === op.requestBody!.schemaRef); + const isUnwrapped = shouldUnwrapBody(op.requestBody!); if (req) { const binary = req.fields.find((f) => f.type.kind === 'binary'); const nonBinary = req.fields.filter((f) => f.type.kind !== 'binary'); for (const f of nonBinary.filter((x) => !isOptionalField(x))) { + const ref = isUnwrapped ? pyFieldName(f) : `request.${pyFieldName(f)}`; lines.push( - ` data[${JSON.stringify(f.name)}] = request.${pyFieldName(f)}`, + ` data[${JSON.stringify(f.name)}] = ${ref}`, ); } for (const f of nonBinary.filter((x) => isOptionalField(x))) { - lines.push(` if request.${pyFieldName(f)} is not None:`); + const ref = isUnwrapped ? pyFieldName(f) : `request.${pyFieldName(f)}`; + lines.push(` if ${ref} is not None:`); lines.push( - ` data[${JSON.stringify(f.name)}] = request.${pyFieldName(f)}`, + ` data[${JSON.stringify(f.name)}] = ${ref}`, ); } + const binaryRef = binary + ? (isUnwrapped ? pyFieldName(binary) : `request.${pyFieldName(binary)}`) + : undefined; const filesExpr = binary - ? `{"${binary.name}": request.${pyFieldName(binary)}}` + ? `{"${binary.name}": ${binaryRef}}` : '{}'; const mpPathStr = op.externalUrl ? camelToSnake(op.externalUrl) diff --git a/packages/generator/src/lang/swift.ts b/packages/generator/src/lang/swift.ts index 9ca82aea..1901da80 100644 --- a/packages/generator/src/lang/swift.ts +++ b/packages/generator/src/lang/swift.ts @@ -356,19 +356,22 @@ function emitOperation(lines: string[], op: IROperation, ir: IR): void { lines.push(' data.append("\\(value)\\r\\n".data(using: .utf8)!)'); lines.push(' }'); const req = ir.models.find((m) => m.name === op.requestBody!.schemaRef); + const isUnwrapped = shouldUnwrapBody(op.requestBody!); if (req) { for (const f of req.fields.filter((x) => x.type.kind !== 'binary')) { const n = swiftIdentifier(f.name); - if (isOptionalField(f)) lines.push(` if let v = body.${n} { appendField(${JSON.stringify(f.name)}, String(describing: v)) }`); - else lines.push(` appendField(${JSON.stringify(f.name)}, String(describing: body.${n}))`); + const ref = isUnwrapped ? n : `body.${n}`; + if (isOptionalField(f)) lines.push(` if let v = ${ref} { appendField(${JSON.stringify(f.name)}, String(describing: v)) }`); + else lines.push(` appendField(${JSON.stringify(f.name)}, String(describing: ${ref}))`); } const bin = req.fields.find((x) => x.type.kind === 'binary'); if (bin) { const n = swiftIdentifier(bin.name); + const binRef = isUnwrapped ? n : `body.${n}`; lines.push(' data.append("--\\(boundary)\\r\\n".data(using: .utf8)!)'); lines.push(` data.append("Content-Disposition: form-data; name=\\"${bin.name}\\"; filename=\\"upload\\"\\r\\n".data(using: .utf8)!)`); lines.push(' data.append("Content-Type: application/octet-stream\\r\\n\\r\\n".data(using: .utf8)!)'); - lines.push(` data.append(body.${n})`); + lines.push(` data.append(${binRef})`); lines.push(' data.append("\\r\\n".data(using: .utf8)!)'); } } diff --git a/packages/generator/src/lang/typescript.ts b/packages/generator/src/lang/typescript.ts index 3c42ddca..a609fd7b 100644 --- a/packages/generator/src/lang/typescript.ts +++ b/packages/generator/src/lang/typescript.ts @@ -511,28 +511,32 @@ function emitOperation(lines: string[], op: IROperation, ir: IR): void { if (op.requestBody?.contentType === 'multipart') { lines.push(' const form = new FormData();'); const reqModel = ir.models.find((m) => m.name === op.requestBody!.schemaRef); + const isUnwrapped = shouldUnwrapBody(op.requestBody); if (reqModel) { const nonBinary = reqModel.fields.filter((f) => f.type.kind !== 'binary'); const binary = reqModel.fields.find((f) => f.type.kind === 'binary'); for (const f of nonBinary) { const sdk = fieldSdkName(f); + const ref = isUnwrapped ? sdk : `request.${sdk}`; const optional = !f.required || f.nullable; if (optional) { lines.push( - ` if (request.${sdk} !== undefined) form.set(${JSON.stringify(f.name)}, request.${sdk});`, + ` if (${ref} !== undefined) form.set(${JSON.stringify(f.name)}, ${ref});`, ); } } for (const f of nonBinary) { const sdk = fieldSdkName(f); + const ref = isUnwrapped ? sdk : `request.${sdk}`; const optional = !f.required || f.nullable; if (!optional) { - lines.push(` form.set(${JSON.stringify(f.name)}, request.${sdk});`); + lines.push(` form.set(${JSON.stringify(f.name)}, ${ref});`); } } if (binary) { const sdk = fieldSdkName(binary); - lines.push(` form.set(${JSON.stringify(binary.name)}, request.${sdk}, "upload");`); + const ref = isUnwrapped ? sdk : `request.${sdk}`; + lines.push(` form.set(${JSON.stringify(binary.name)}, ${ref}, "upload");`); } } const fetchUrl = op.externalUrl @@ -543,7 +547,9 @@ function emitOperation(lines: string[], op: IROperation, ir: IR): void { if (!op.noAuth) lines.push(' headers: this.headers,'); lines.push(' body: form,'); lines.push(' });'); - emitResponseSwitch(lines, op, ir, false); + const preloadBody = op.successResponse.hasBody && !op.successResponse.isRedirect; + if (preloadBody) lines.push(' const body = await response.json();'); + emitResponseSwitch(lines, op, ir, preloadBody); lines.push(' }'); return; } diff --git a/packages/spec/openapi.en.yaml b/packages/spec/openapi.en.yaml index 1c940d96..7a01a079 100644 --- a/packages/spec/openapi.en.yaml +++ b/packages/spec/openapi.en.yaml @@ -325,20 +325,25 @@ paths: Retrieve a list of chats based on the specified parameters. parameters: - - name: sort[{field}] + - name: sort + in: query + required: false + description: Sort field + schema: + allOf: + - $ref: '#/components/schemas/ChatSortField' + default: id + example: id + explode: false + - name: order in: query required: false - description: Sort order for the results + description: Sort direction schema: allOf: - $ref: '#/components/schemas/SortOrder' default: desc example: desc - x-param-names: - - name: sort[id] - description: Chat ID - - name: sort[last_message_at] - description: Date and time of the last message creation explode: false - name: availability in: query @@ -1902,18 +1907,25 @@ paths: example: 198 example: 198 explode: false - - name: sort[{field}] + - name: sort + in: query + required: false + description: Sort field + schema: + allOf: + - $ref: '#/components/schemas/MessageSortField' + default: id + example: id + explode: false + - name: order in: query required: false - description: Sort order for the results + description: Sort direction schema: allOf: - $ref: '#/components/schemas/SortOrder' default: desc example: desc - x-param-names: - - name: sort[id] - description: Message ID explode: false - name: limit in: query @@ -2814,6 +2826,104 @@ paths: - Profile x-requirements: scope: profile:read + /profile/avatar: + put: + operationId: ProfileAvatarOperations_updateProfileAvatar + description: |- + Upload avatar + + Upload or update your profile avatar. The file is sent in `multipart/form-data` format. + parameters: [] + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/AvatarData' + description: Response wrapper with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/ApiError' + - $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Profile + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + image: + type: string + format: binary + description: Avatar image file + required: + - image + x-requirements: + scope: profile_avatar:write + delete: + operationId: ProfileAvatarOperations_deleteProfileAvatar + description: |- + Delete avatar + + Delete your profile avatar. + parameters: [] + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/ApiError' + - $ref: '#/components/schemas/OAuthError' + tags: + - Profile + x-requirements: + scope: profile_avatar:write /profile/status: get: operationId: ProfileOperations_getStatus @@ -4164,6 +4274,134 @@ paths: - Users x-requirements: scope: users:delete + /users/{user_id}/avatar: + put: + operationId: UserAvatarOperations_updateUserAvatar + description: |- + Upload employee avatar + + Upload or update an employee's avatar. The file is sent in `multipart/form-data` format. + parameters: + - name: user_id + in: path + required: true + description: User ID + schema: + type: integer + format: int32 + example: 12 + example: 12 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/AvatarData' + description: Response wrapper with data + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/ApiError' + - $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Users + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + image: + type: string + format: binary + description: Avatar image file + required: + - image + x-requirements: + scope: user_avatar:write + delete: + operationId: UserAvatarOperations_deleteUserAvatar + description: |- + Delete employee avatar + + Delete an employee's avatar. + parameters: + - name: user_id + in: path + required: true + description: User ID + schema: + type: integer + format: int32 + example: 12 + example: 12 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/ApiError' + - $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Users + x-requirements: + scope: user_avatar:write /users/{user_id}/status: get: operationId: UserStatusOperations_getUserStatus @@ -5039,6 +5277,16 @@ components: search_users_api: Employee search via API search_chats_api: Chat search via API search_messages_api: Message search via API + AvatarData: + type: object + required: + - image_url + properties: + image_url: + type: string + description: Avatar URL + example: https://pachca-prod.s3.amazonaws.com/uploads/0001/0001/image.jpg + description: Avatar data BotResponse: type: object required: @@ -5367,6 +5615,15 @@ components: description: Webhook send date and time (UTC+0) in UNIX format example: 1747574400 description: Outgoing webhook payload for chat members + ChatSortField: + type: string + enum: + - id + - last_message_at + description: Chat sort field + x-enum-descriptions: + id: By chat ID + last_message_at: By last message date and time ChatSubtype: type: string enum: @@ -6100,6 +6357,13 @@ components: discussion: Conversation or channel thread: Thread user: User + MessageSortField: + type: string + enum: + - id + description: Message sort field + x-enum-descriptions: + id: By message ID MessageUpdateRequest: type: object required: @@ -6304,8 +6568,10 @@ components: - profile:read - profile_status:read - profile_status:write + - profile_avatar:write - user_status:read - user_status:write + - user_avatar:write - custom_properties:read - audit_events:read - tasks:read @@ -6459,12 +6725,20 @@ components: - admin - user - bot + profile_avatar_write: + - owner + - admin + - user + - bot user_status_read: - owner - admin user_status_write: - owner - admin + user_avatar_write: + - owner + - admin custom_properties_read: - owner - admin @@ -6573,8 +6847,10 @@ components: profile_read: View own profile information profile_status_read: View profile status profile_status_write: Update and delete profile status + profile_avatar_write: Update and delete profile avatar user_status_read: View employee status user_status_write: Update and delete employee status + user_avatar_write: Update and delete employee avatar custom_properties_read: View custom properties audit_events_read: View audit log tasks_read: View tasks diff --git a/packages/spec/openapi.yaml b/packages/spec/openapi.yaml index a0e356f1..edf795e2 100644 --- a/packages/spec/openapi.yaml +++ b/packages/spec/openapi.yaml @@ -320,20 +320,25 @@ paths: Метод для получения списка чатов по заданным параметрам. parameters: - - name: sort[{field}] + - name: sort + in: query + required: false + description: Поле сортировки + schema: + allOf: + - $ref: '#/components/schemas/ChatSortField' + default: id + example: id + explode: false + - name: order in: query required: false - description: Составной параметр сортировки сущностей выборки + description: Направление сортировки schema: allOf: - $ref: '#/components/schemas/SortOrder' default: desc example: desc - x-param-names: - - name: sort[id] - description: Идентификатор чата - - name: sort[last_message_at] - description: Дата и время создания последнего сообщения explode: false - name: availability in: query @@ -1851,18 +1856,25 @@ paths: example: 198 example: 198 explode: false - - name: sort[{field}] + - name: sort + in: query + required: false + description: Поле сортировки + schema: + allOf: + - $ref: '#/components/schemas/MessageSortField' + default: id + example: id + explode: false + - name: order in: query required: false - description: Составной параметр сортировки сущностей выборки + description: Направление сортировки schema: allOf: - $ref: '#/components/schemas/SortOrder' default: desc example: desc - x-param-names: - - name: sort[id] - description: Идентификатор сообщения explode: false - name: limit in: query @@ -2739,6 +2751,104 @@ paths: - Profile x-requirements: scope: profile:read + /profile/avatar: + put: + operationId: ProfileAvatarOperations_updateProfileAvatar + description: |- + Загрузка аватара + + Метод для загрузки или обновления аватара своего профиля. Файл передается в формате `multipart/form-data`. + parameters: [] + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/AvatarData' + description: Обертка ответа с данными + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/ApiError' + - $ref: '#/components/schemas/OAuthError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Profile + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + image: + type: string + format: binary + description: Файл изображения для аватара + required: + - image + x-requirements: + scope: profile_avatar:write + delete: + operationId: ProfileAvatarOperations_deleteProfileAvatar + description: |- + Удаление аватара + + Метод для удаления аватара своего профиля. + parameters: [] + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/ApiError' + - $ref: '#/components/schemas/OAuthError' + tags: + - Profile + x-requirements: + scope: profile_avatar:write /profile/status: get: operationId: ProfileOperations_getStatus @@ -4069,6 +4179,134 @@ paths: - Users x-requirements: scope: users:delete + /users/{user_id}/avatar: + put: + operationId: UserAvatarOperations_updateUserAvatar + description: |- + Загрузка аватара сотрудника + + Метод для загрузки или обновления аватара сотрудника. Файл передается в формате `multipart/form-data`. + parameters: + - name: user_id + in: path + required: true + description: Идентификатор пользователя + schema: + type: integer + format: int32 + example: 12 + example: 12 + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + $ref: '#/components/schemas/AvatarData' + description: Обертка ответа с данными + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/ApiError' + - $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '422': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Users + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + image: + type: string + format: binary + description: Файл изображения для аватара + required: + - image + x-requirements: + scope: user_avatar:write + delete: + operationId: UserAvatarOperations_deleteUserAvatar + description: |- + Удаление аватара сотрудника + + Метод для удаления аватара сотрудника. + parameters: + - name: user_id + in: path + required: true + description: Идентификатор пользователя + schema: + type: integer + format: int32 + example: 12 + example: 12 + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + '401': + description: Access is unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthError' + '402': + description: Client error + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + '403': + description: Access is forbidden. + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/ApiError' + - $ref: '#/components/schemas/OAuthError' + '404': + description: The server cannot find the requested resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ApiError' + tags: + - Users + x-requirements: + scope: user_avatar:write /users/{user_id}/status: get: operationId: UserStatusOperations_getUserStatus @@ -4929,6 +5167,16 @@ components: search_users_api: Поиск сотрудников через API search_chats_api: Поиск чатов через API search_messages_api: Поиск сообщений через API + AvatarData: + type: object + required: + - image_url + properties: + image_url: + type: string + description: URL аватара + example: https://pachca-prod.s3.amazonaws.com/uploads/0001/0001/image.jpg + description: Данные аватара BotResponse: type: object required: @@ -5257,6 +5505,15 @@ components: description: Дата и время отправки вебхука (UTC+0) в формате UNIX example: 1747574400 description: Структура исходящего вебхука об участниках чата + ChatSortField: + type: string + enum: + - id + - last_message_at + description: Поле сортировки чатов + x-enum-descriptions: + id: По идентификатору чата + last_message_at: По дате и времени создания последнего сообщения ChatSubtype: type: string enum: @@ -5977,6 +6234,13 @@ components: discussion: Беседа или канал thread: Тред user: Пользователь + MessageSortField: + type: string + enum: + - id + description: Поле сортировки сообщений + x-enum-descriptions: + id: По идентификатору сообщения MessageUpdateRequest: type: object required: @@ -6177,8 +6441,10 @@ components: - profile:read - profile_status:read - profile_status:write + - profile_avatar:write - user_status:read - user_status:write + - user_avatar:write - custom_properties:read - audit_events:read - tasks:read @@ -6332,12 +6598,20 @@ components: - admin - user - bot + profile_avatar_write: + - owner + - admin + - user + - bot user_status_read: - owner - admin user_status_write: - owner - admin + user_avatar_write: + - owner + - admin custom_properties_read: - owner - admin @@ -6446,8 +6720,10 @@ components: profile_read: Просмотр информации о своем профиле profile_status_read: Просмотр статуса профиля profile_status_write: Изменение и удаление статуса профиля + profile_avatar_write: Изменение и удаление аватара профиля user_status_read: Просмотр статуса сотрудника user_status_write: Изменение и удаление статуса сотрудника + user_avatar_write: Изменение и удаление аватара сотрудника custom_properties_read: Просмотр дополнительных полей audit_events_read: Просмотр журнала аудита tasks_read: Просмотр задач diff --git a/packages/spec/overlay.en.yaml b/packages/spec/overlay.en.yaml index 24fce969..c75471a5 100644 --- a/packages/spec/overlay.en.yaml +++ b/packages/spec/overlay.en.yaml @@ -70,9 +70,12 @@ actions: List chats Retrieve a list of chats based on the specified parameters. - - target: $.paths['/chats'].get.parameters[?(@.name=='sort[{field}]')] + - target: $.paths['/chats'].get.parameters[?(@.name=='sort')] update: - description: Sort order for the results + description: Sort field + - target: $.paths['/chats'].get.parameters[?(@.name=='order')] + update: + description: Sort direction - target: $.paths['/chats'].get.parameters[?(@.name=='availability')] update: description: Parameter that controls chat availability and filtering for the user @@ -402,9 +405,12 @@ actions: - target: $.paths['/messages'].get.parameters[?(@.name=='chat_id')] update: description: Chat ID (conversation, channel, direct message, or thread chat) - - target: $.paths['/messages'].get.parameters[?(@.name=='sort[{field}]')] + - target: $.paths['/messages'].get.parameters[?(@.name=='sort')] update: - description: Sort order for the results + description: Sort field + - target: $.paths['/messages'].get.parameters[?(@.name=='order')] + update: + description: Sort direction - target: $.paths['/messages'].get.parameters[?(@.name=='limit')] update: description: Number of records to return per request @@ -608,6 +614,21 @@ actions: Delete status Delete your current status. + - target: $.paths['/profile/avatar'].put + update: + description: |- + Upload avatar + + Upload or update your profile avatar. The file is sent in `multipart/form-data` format. + - target: $.paths['/profile/avatar'].put.requestBody.properties.image + update: + description: Avatar image file + - target: $.paths['/profile/avatar'].delete + update: + description: |- + Delete avatar + + Delete your profile avatar. - target: $.paths['/search/chats'].get update: description: |- @@ -885,6 +906,27 @@ actions: - target: $.paths['/users/{user_id}/status'].delete.parameters[?(@.name=='user_id')] update: description: User ID + - target: $.paths['/users/{user_id}/avatar'].put + update: + description: |- + Upload employee avatar + + Upload or update an employee's avatar. The file is sent in `multipart/form-data` format. + - target: $.paths['/users/{user_id}/avatar'].put.parameters[?(@.name=='user_id')] + update: + description: User ID + - target: $.paths['/users/{user_id}/avatar'].put.requestBody.properties.image + update: + description: Avatar image file + - target: $.paths['/users/{user_id}/avatar'].delete + update: + description: |- + Delete employee avatar + + Delete an employee's avatar. + - target: $.paths['/users/{user_id}/avatar'].delete.parameters[?(@.name=='user_id')] + update: + description: User ID - target: $.paths['/views/open'].post update: description: |- @@ -1212,6 +1254,12 @@ actions: search_users_api: Employee search via API search_chats_api: Chat search via API search_messages_api: Message search via API + - target: $.components.schemas.AvatarData + update: + description: Avatar data + - target: $.components.schemas.AvatarData.properties.image_url + update: + description: Avatar URL - target: $.components.schemas.BotResponse update: description: Bot parameters @@ -1396,6 +1444,14 @@ actions: - target: $.components.schemas.ChatMemberWebhookPayload.properties.webhook_timestamp update: description: Webhook send date and time (UTC+0) in UNIX format + - target: $.components.schemas.ChatSortField + update: + description: Chat sort field + - target: $.components.schemas.ChatSortField + update: + x-enum-descriptions: + id: By chat ID + last_message_at: By last message date and time - target: $.components.schemas.ChatSubtype update: description: Chat type @@ -3014,6 +3070,13 @@ actions: - target: $.components.schemas.MessageWebhookPayload.properties.thread.properties.message_chat_id update: description: Chat ID of the thread parent message + - target: $.components.schemas.MessageSortField + update: + description: Message sort field + - target: $.components.schemas.MessageSortField + update: + x-enum-descriptions: + id: By message ID # Task.custom_properties nested items - target: $.components.schemas.Task.properties.custom_properties.items.properties.id diff --git a/packages/spec/scripts/apply-overlay.ts b/packages/spec/scripts/apply-overlay.ts index 72030f96..ce2960bf 100644 --- a/packages/spec/scripts/apply-overlay.ts +++ b/packages/spec/scripts/apply-overlay.ts @@ -187,6 +187,22 @@ const RU_TO_EN: Record = { 'Обертка ответа с данными': 'Response wrapper with data', 'Обертка ответа поисковых результатов с данными и пагинацией': 'Search results response wrapper with data and pagination', + // Avatar model + 'Данные аватара': 'Avatar data', + 'URL аватара': 'Avatar URL', + 'Файл изображения для аватара': 'Avatar image file', + 'Изменение и удаление аватара профиля': 'Update and delete profile avatar', + 'Изменение и удаление аватара сотрудника': 'Update and delete employee avatar', + + // ChatSortField enum + 'Поле сортировки чатов': 'Chat sort field', + 'По идентификатору чата': 'By chat ID', + 'По дате и времени создания последнего сообщения': 'By date and time of the last message', + + // MessageSortField enum + 'Поле сортировки сообщений': 'Message sort field', + 'По идентификатору сообщения': 'By message ID', + // x-param-names descriptions 'Идентификатор чата': 'Chat ID', 'Дата и время создания последнего сообщения': 'Date and time of the last message creation', diff --git a/packages/spec/typespec.tsp b/packages/spec/typespec.tsp index 98783f4d..5a8fdc13 100644 --- a/packages/spec/typespec.tsp +++ b/packages/spec/typespec.tsp @@ -219,11 +219,33 @@ enum TaskStatus { enum SortOrder { @doc("По возрастанию") asc: "asc", - + @doc("По убыванию") desc: "desc", } +@doc("Поле сортировки чатов") +@extension("x-enum-descriptions", #{ + id: "По идентификатору чата", + last_message_at: "По дате и времени создания последнего сообщения", +}) +enum ChatSortField { + @doc("По идентификатору чата") + id: "id", + + @doc("По дате и времени создания последнего сообщения") + last_message_at: "last_message_at", +} + +@doc("Поле сортировки сообщений") +@extension("x-enum-descriptions", #{ + id: "По идентификатору сообщения", +}) +enum MessageSortField { + @doc("По идентификатору сообщения") + id: "id", +} + @doc("Сортировка результатов поиска") @extension("x-enum-descriptions", #{ by_score: "По релевантности", @@ -1149,6 +1171,13 @@ model PaginatedDataResponse { } +@doc("Данные аватара") +model AvatarData { + @doc("URL аватара") + @example("https://pachca-prod.s3.amazonaws.com/uploads/0001/0001/image.jpg") + image_url: string; +} + // ============================================================================ // OAuth Models // ============================================================================ @@ -1185,8 +1214,10 @@ model PaginatedDataResponse { profile_read: "Просмотр информации о своем профиле", profile_status_read: "Просмотр статуса профиля", profile_status_write: "Изменение и удаление статуса профиля", + profile_avatar_write: "Изменение и удаление аватара профиля", user_status_read: "Просмотр статуса сотрудника", user_status_write: "Изменение и удаление статуса сотрудника", + user_avatar_write: "Изменение и удаление аватара сотрудника", custom_properties_read: "Просмотр дополнительных полей", audit_events_read: "Просмотр журнала аудита", tasks_read: "Просмотр задач", @@ -1235,8 +1266,10 @@ model PaginatedDataResponse { profile_read: #["owner", "admin", "user", "bot"], profile_status_read: #["owner", "admin", "user", "bot"], profile_status_write: #["owner", "admin", "user", "bot"], + profile_avatar_write: #["owner", "admin", "user", "bot"], user_status_read: #["owner", "admin"], user_status_write: #["owner", "admin"], + user_avatar_write: #["owner", "admin"], custom_properties_read: #["owner", "admin", "user", "bot"], audit_events_read: #["owner"], tasks_read: #["owner", "admin", "user", "bot"], @@ -1342,12 +1375,18 @@ enum OAuthScope { @doc("Изменение и удаление статуса профиля") profile_status_write: "profile_status:write", + @doc("Изменение и удаление аватара профиля") + profile_avatar_write: "profile_avatar:write", + @doc("Просмотр статуса сотрудника") user_status_read: "user_status:read", @doc("Изменение и удаление статуса сотрудника") user_status_write: "user_status:write", + @doc("Изменение и удаление аватара сотрудника") + user_avatar_write: "user_avatar:write", + @doc("Просмотр дополнительных полей") custom_properties_read: "custom_properties:read", @@ -3284,6 +3323,69 @@ interface ProfileOperations { }; } +// ============================================================================ +// Profile Avatar Operations +// ============================================================================ + +@route("/profile") +@tag("Profile") +interface ProfileAvatarOperations { + @extension("x-requirements", #{ + scope: "profile_avatar:write", + }) + @doc(""" +Загрузка аватара + +Метод для загрузки или обновления аватара своего профиля. Файл передается в формате `multipart/form-data`. +""") + @route("/avatar") + @put + updateProfileAvatar( + @multipartBody body: { + @doc("Файл изображения для аватара") + image: HttpPart; + } + ): { + @statusCode _: 200; + @body body: DataResponse; + } | { + @statusCode _: 401; + @body body: OAuthError; + } | { + @statusCode _: 403; + @body body: ApiError | OAuthError; + } | { + @statusCode _: 402; + @body body: ApiError; + } | { + @statusCode _: 422; + @body body: ApiError; + }; + + @extension("x-requirements", #{ + scope: "profile_avatar:write", + }) + @doc(""" +Удаление аватара + +Метод для удаления аватара своего профиля. +""") + @route("/avatar") + @delete + deleteProfileAvatar(): { + @statusCode _: 204; + } | { + @statusCode _: 401; + @body body: OAuthError; + } | { + @statusCode _: 403; + @body body: ApiError | OAuthError; + } | { + @statusCode _: 402; + @body body: ApiError; + }; +} + // ============================================================================ // User Operations // ============================================================================ @@ -3571,6 +3673,82 @@ interface UserStatusOperations { }; } +// ============================================================================ +// User Avatar Operations +// ============================================================================ + +@route("/users") +@tag("Users") +interface UserAvatarOperations { + @extension("x-requirements", #{ + scope: "user_avatar:write", + }) + @doc(""" +Загрузка аватара сотрудника + +Метод для загрузки или обновления аватара сотрудника. Файл передается в формате `multipart/form-data`. +""") + @route("/{user_id}/avatar") + @put + updateUserAvatar( + @doc("Идентификатор пользователя") + @extension("example", 12) + @path user_id: int32, + @multipartBody body: { + @doc("Файл изображения для аватара") + image: HttpPart; + } + ): { + @statusCode _: 200; + @body body: DataResponse; + } | { + @statusCode _: 401; + @body body: OAuthError; + } | { + @statusCode _: 403; + @body body: ApiError | OAuthError; + } | { + @statusCode _: 404; + @body body: ApiError; + } | { + @statusCode _: 402; + @body body: ApiError; + } | { + @statusCode _: 422; + @body body: ApiError; + }; + + @extension("x-requirements", #{ + scope: "user_avatar:write", + }) + @doc(""" +Удаление аватара сотрудника + +Метод для удаления аватара сотрудника. +""") + @route("/{user_id}/avatar") + @delete + deleteUserAvatar( + @doc("Идентификатор пользователя") + @extension("example", 12) + @path user_id: int32 + ): { + @statusCode _: 204; + } | { + @statusCode _: 401; + @body body: OAuthError; + } | { + @statusCode _: 403; + @body body: ApiError | OAuthError; + } | { + @statusCode _: 404; + @body body: ApiError; + } | { + @statusCode _: 402; + @body body: ApiError; + }; +} + // ============================================================================ // Group Tag Operations // ============================================================================ @@ -3888,13 +4066,12 @@ interface ChatOperations { @extension("x-paginated", true) @get listChats( - @doc("Составной параметр сортировки сущностей выборки") - @extension("x-param-names", #[ - #{ name: "sort[id]", description: "Идентификатор чата" }, - #{ name: "sort[last_message_at]", description: "Дата и время создания последнего сообщения" } - ]) + @doc("Поле сортировки") + @extension("example", "id") + @query sort?: ChatSortField = ChatSortField.id, + @doc("Направление сортировки") @extension("example", "desc") - @query("sort[{field}]") sortField?: SortOrder = SortOrder.desc, + @query order?: SortOrder = SortOrder.desc, @doc("Параметр, который отвечает за доступность и выборку чатов для пользователя") @extension("example", "is_member") @query availability?: ChatAvailability = ChatAvailability.is_member, @@ -4614,12 +4791,12 @@ interface ChatMessageOperations { @doc("Идентификатор чата (беседа, канал, диалог или чат треда)") @extension("example", 198) @query chat_id: int32, - @doc("Составной параметр сортировки сущностей выборки") - @extension("x-param-names", #[ - #{ name: "sort[id]", description: "Идентификатор сообщения" } - ]) + @doc("Поле сортировки") + @extension("example", "id") + @query sort?: MessageSortField = MessageSortField.id, + @doc("Направление сортировки") @extension("example", "desc") - @query("sort[{field}]") sortField?: SortOrder = SortOrder.desc, + @query order?: SortOrder = SortOrder.desc, @doc("Количество возвращаемых сущностей за один запрос") @query @extension("example", 1) diff --git a/packages/spec/workflows.ts b/packages/spec/workflows.ts index 7caff284..02e03b91 100644 --- a/packages/spec/workflows.ts +++ b/packages/spec/workflows.ts @@ -1367,6 +1367,36 @@ export const WORKFLOWS: Record = { }, ], }, + { + title: 'Загрузить аватар сотрудника', + titleEn: 'Upload employee avatar', + steps: [ + { + description: 'Загрузи аватар сотруднику', + descriptionEn: 'Upload avatar for employee', + command: 'pachca users update-avatar --file=<путь_к_файлу>', + apiMethod: 'PUT', + apiPath: '/users/{user_id}/avatar', + notes: 'Требует прав администратора. Файл передается в формате multipart/form-data', + notesEn: 'Requires admin access. File is sent in multipart/form-data format', + }, + ], + }, + { + title: 'Удалить аватар сотрудника', + titleEn: 'Delete employee avatar', + steps: [ + { + description: 'Удали аватар сотрудника', + descriptionEn: 'Delete employee avatar', + command: 'pachca users remove-avatar --force', + apiMethod: 'DELETE', + apiPath: '/users/{user_id}/avatar', + notes: 'Требует прав администратора', + notesEn: 'Requires admin access', + }, + ], + }, ], 'pachca-tasks': [ { @@ -1575,6 +1605,34 @@ export const WORKFLOWS: Record = { notes: 'Кастомные поля настраиваются администратором пространства.', notesEn: 'Custom fields are configured by workspace admin.', }, + { + title: 'Загрузить аватар профиля', + titleEn: 'Upload profile avatar', + steps: [ + { + description: 'Загрузи аватар из файла', + descriptionEn: 'Upload avatar from file', + command: 'pachca profile update-avatar --file=<путь_к_файлу>', + apiMethod: 'PUT', + apiPath: '/profile/avatar', + notes: 'Файл изображения передается в формате multipart/form-data', + notesEn: 'Image file is sent in multipart/form-data format', + }, + ], + }, + { + title: 'Удалить аватар профиля', + titleEn: 'Delete profile avatar', + steps: [ + { + description: 'Удали аватар', + descriptionEn: 'Delete avatar', + command: 'pachca profile delete-avatar --force', + apiMethod: 'DELETE', + apiPath: '/profile/avatar', + }, + ], + }, ], 'pachca-search': [ { diff --git a/sdk/csharp/generated/Client.cs b/sdk/csharp/generated/Client.cs index fd268a65..873bf5f1 100644 --- a/sdk/csharp/generated/Client.cs +++ b/sdk/csharp/generated/Client.cs @@ -196,7 +196,8 @@ internal ChatsService(string baseUrl, HttpClient client) } public async System.Threading.Tasks.Task ListChatsAsync( - SortOrder? sortId = null, + ChatSortField? sort = null, + SortOrder? order = null, ChatAvailability? availability = null, DateTimeOffset? lastMessageAtAfter = null, DateTimeOffset? lastMessageAtBefore = null, @@ -206,8 +207,10 @@ public async System.Threading.Tasks.Task ListChatsAsync( CancellationToken cancellationToken = default) { var queryParts = new List(); - if (sortId != null) - queryParts.Add($"sort[id]={Uri.EscapeDataString(PachcaUtils.EnumToApiString(sortId.Value))}"); + if (sort != null) + queryParts.Add($"sort={Uri.EscapeDataString(PachcaUtils.EnumToApiString(sort.Value))}"); + if (order != null) + queryParts.Add($"order={Uri.EscapeDataString(PachcaUtils.EnumToApiString(order.Value))}"); if (availability != null) queryParts.Add($"availability={Uri.EscapeDataString(PachcaUtils.EnumToApiString(availability.Value))}"); if (lastMessageAtAfter != null) @@ -236,7 +239,8 @@ public async System.Threading.Tasks.Task ListChatsAsync( } public async System.Threading.Tasks.Task> ListChatsAllAsync( - SortOrder? sortId = null, + ChatSortField? sort = null, + SortOrder? order = null, ChatAvailability? availability = null, DateTimeOffset? lastMessageAtAfter = null, DateTimeOffset? lastMessageAtBefore = null, @@ -248,7 +252,7 @@ public async System.Threading.Tasks.Task> ListChatsAllAsync( string? cursor = null; do { - var response = await ListChatsAsync(sortId: sortId, availability: availability, lastMessageAtAfter: lastMessageAtAfter, lastMessageAtBefore: lastMessageAtBefore, personal: personal, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); + var response = await ListChatsAsync(sort: sort, order: order, availability: availability, lastMessageAtAfter: lastMessageAtAfter, lastMessageAtBefore: lastMessageAtBefore, personal: personal, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); if (response.Data.Count == 0) break; cursor = response.Meta.Paginate.NextPage; @@ -830,15 +834,18 @@ internal MessagesService(string baseUrl, HttpClient client) public async System.Threading.Tasks.Task ListChatMessagesAsync( int chatId, - SortOrder? sortId = null, + MessageSortField? sort = null, + SortOrder? order = null, int? limit = null, string? cursor = null, CancellationToken cancellationToken = default) { var queryParts = new List(); queryParts.Add($"chat_id={Uri.EscapeDataString(chatId.ToString()!)}"); - if (sortId != null) - queryParts.Add($"sort[id]={Uri.EscapeDataString(PachcaUtils.EnumToApiString(sortId.Value))}"); + if (sort != null) + queryParts.Add($"sort={Uri.EscapeDataString(PachcaUtils.EnumToApiString(sort.Value))}"); + if (order != null) + queryParts.Add($"order={Uri.EscapeDataString(PachcaUtils.EnumToApiString(order.Value))}"); if (limit != null) queryParts.Add($"limit={Uri.EscapeDataString(limit.Value.ToString()!)}"); if (cursor != null) @@ -860,7 +867,8 @@ public async System.Threading.Tasks.Task ListChatMessa public async System.Threading.Tasks.Task> ListChatMessagesAllAsync( int chatId, - SortOrder? sortId = null, + MessageSortField? sort = null, + SortOrder? order = null, int? limit = null, CancellationToken cancellationToken = default) { @@ -868,7 +876,7 @@ public async System.Threading.Tasks.Task> ListChatMessagesAllAsync string? cursor = null; do { - var response = await ListChatMessagesAsync(chatId: chatId, sortId: sortId, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); + var response = await ListChatMessagesAsync(chatId: chatId, sort: sort, order: order, limit: limit, cursor: cursor, cancellationToken: cancellationToken).ConfigureAwait(false); items.AddRange(response.Data); if (response.Data.Count == 0) break; cursor = response.Meta.Paginate.NextPage; @@ -1264,6 +1272,26 @@ public async System.Threading.Tasks.Task GetStatusAsync(CancellationToke } } + public async System.Threading.Tasks.Task UpdateProfileAvatarAsync(byte[] image, CancellationToken cancellationToken = default) + { + var url = $"{_baseUrl}/profile/avatar"; + using var content = new MultipartFormDataContent(); + content.Add(new ByteArrayContent(image), "image", "image"); + using var httpRequest = new HttpRequestMessage(HttpMethod.Put, url); + httpRequest.Content = content; + using var response = await PachcaUtils.SendWithRetryAsync(_client, httpRequest, cancellationToken).ConfigureAwait(false); + var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 200: + return PachcaUtils.Deserialize(json).Data; + case 401: + throw PachcaUtils.Deserialize(json); + default: + throw PachcaUtils.Deserialize(json); + } + } + public async System.Threading.Tasks.Task UpdateStatusAsync(StatusUpdateRequest request, CancellationToken cancellationToken = default) { var url = $"{_baseUrl}/profile/status"; @@ -1282,6 +1310,23 @@ public async System.Threading.Tasks.Task UpdateStatusAsync(StatusUpd } } + public async System.Threading.Tasks.Task DeleteProfileAvatarAsync(CancellationToken cancellationToken = default) + { + var url = $"{_baseUrl}/profile/avatar"; + using var request = new HttpRequestMessage(HttpMethod.Delete, url); + using var response = await PachcaUtils.SendWithRetryAsync(_client, request, cancellationToken).ConfigureAwait(false); + var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 204: + return; + case 401: + throw PachcaUtils.Deserialize(json); + default: + throw PachcaUtils.Deserialize(json); + } + } + public async System.Threading.Tasks.Task DeleteStatusAsync(CancellationToken cancellationToken = default) { var url = $"{_baseUrl}/profile/status"; @@ -1773,6 +1818,29 @@ public async System.Threading.Tasks.Task UpdateUserAsync( } } + public async System.Threading.Tasks.Task UpdateUserAvatarAsync( + int userId, + byte[] image, + CancellationToken cancellationToken = default) + { + var url = $"{_baseUrl}/users/{userId}/avatar"; + using var content = new MultipartFormDataContent(); + content.Add(new ByteArrayContent(image), "image", "image"); + using var httpRequest = new HttpRequestMessage(HttpMethod.Put, url); + httpRequest.Content = content; + using var response = await PachcaUtils.SendWithRetryAsync(_client, httpRequest, cancellationToken).ConfigureAwait(false); + var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 200: + return PachcaUtils.Deserialize(json).Data; + case 401: + throw PachcaUtils.Deserialize(json); + default: + throw PachcaUtils.Deserialize(json); + } + } + public async System.Threading.Tasks.Task UpdateUserStatusAsync( int userId, StatusUpdateRequest request, @@ -1811,6 +1879,23 @@ public async System.Threading.Tasks.Task DeleteUserAsync(int id, CancellationTok } } + public async System.Threading.Tasks.Task DeleteUserAvatarAsync(int userId, CancellationToken cancellationToken = default) + { + var url = $"{_baseUrl}/users/{userId}/avatar"; + using var request = new HttpRequestMessage(HttpMethod.Delete, url); + using var response = await PachcaUtils.SendWithRetryAsync(_client, request, cancellationToken).ConfigureAwait(false); + var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + switch ((int)response.StatusCode) + { + case 204: + return; + case 401: + throw PachcaUtils.Deserialize(json); + default: + throw PachcaUtils.Deserialize(json); + } + } + public async System.Threading.Tasks.Task DeleteUserStatusAsync(int userId, CancellationToken cancellationToken = default) { var url = $"{_baseUrl}/users/{userId}/status"; diff --git a/sdk/csharp/generated/Models.cs b/sdk/csharp/generated/Models.cs index e9ccbdc0..1c784ec5 100644 --- a/sdk/csharp/generated/Models.cs +++ b/sdk/csharp/generated/Models.cs @@ -295,6 +295,41 @@ public override void Write(Utf8JsonWriter writer, ChatMemberRoleFilter value, Js } } +/// Поле сортировки чатов +[JsonConverter(typeof(ChatSortFieldConverter))] +public enum ChatSortField +{ + /// По идентификатору чата + Id, + /// По дате и времени создания последнего сообщения + LastMessageAt, +} + +internal class ChatSortFieldConverter : JsonConverter +{ + public override ChatSortField Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var value = reader.GetString(); + return value switch + { + "id" => ChatSortField.Id, + "last_message_at" => ChatSortField.LastMessageAt, + _ => throw new JsonException($"Unknown ChatSortField value: {value}"), + }; + } + + public override void Write(Utf8JsonWriter writer, ChatSortField value, JsonSerializerOptions options) + { + var str = value switch + { + ChatSortField.Id => "id", + ChatSortField.LastMessageAt => "last_message_at", + _ => value.ToString(), + }; + writer.WriteStringValue(str); + } +} + /// Тип чата [JsonConverter(typeof(ChatSubtypeConverter))] public enum ChatSubtype @@ -517,6 +552,36 @@ public override void Write(Utf8JsonWriter writer, MessageEntityType value, JsonS } } +[JsonConverter(typeof(MessageSortFieldConverter))] +public enum MessageSortField +{ + /// По идентификатору сообщения + Id, +} + +internal class MessageSortFieldConverter : JsonConverter +{ + public override MessageSortField Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var value = reader.GetString(); + return value switch + { + "id" => MessageSortField.Id, + _ => throw new JsonException($"Unknown MessageSortField value: {value}"), + }; + } + + public override void Write(Utf8JsonWriter writer, MessageSortField value, JsonSerializerOptions options) + { + var str = value switch + { + MessageSortField.Id => "id", + _ => value.ToString(), + }; + writer.WriteStringValue(str); + } +} + /// Скоуп доступа OAuth токена [JsonConverter(typeof(OAuthScopeConverter))] public enum OAuthScope @@ -579,10 +644,14 @@ public enum OAuthScope ProfileStatusRead, /// Изменение и удаление статуса профиля ProfileStatusWrite, + /// Изменение и удаление аватара профиля + ProfileAvatarWrite, /// Просмотр статуса сотрудника UserStatusRead, /// Изменение и удаление статуса сотрудника UserStatusWrite, + /// Изменение и удаление аватара сотрудника + UserAvatarWrite, /// Просмотр дополнительных полей CustomPropertiesRead, /// Просмотр журнала аудита @@ -655,8 +724,10 @@ public override OAuthScope Read(ref Utf8JsonReader reader, Type typeToConvert, J "profile:read" => OAuthScope.ProfileRead, "profile_status:read" => OAuthScope.ProfileStatusRead, "profile_status:write" => OAuthScope.ProfileStatusWrite, + "profile_avatar:write" => OAuthScope.ProfileAvatarWrite, "user_status:read" => OAuthScope.UserStatusRead, "user_status:write" => OAuthScope.UserStatusWrite, + "user_avatar:write" => OAuthScope.UserAvatarWrite, "custom_properties:read" => OAuthScope.CustomPropertiesRead, "audit_events:read" => OAuthScope.AuditEventsRead, "tasks:read" => OAuthScope.TasksRead, @@ -711,8 +782,10 @@ public override void Write(Utf8JsonWriter writer, OAuthScope value, JsonSerializ OAuthScope.ProfileRead => "profile:read", OAuthScope.ProfileStatusRead => "profile_status:read", OAuthScope.ProfileStatusWrite => "profile_status:write", + OAuthScope.ProfileAvatarWrite => "profile_avatar:write", OAuthScope.UserStatusRead => "user_status:read", OAuthScope.UserStatusWrite => "user_status:write", + OAuthScope.UserAvatarWrite => "user_avatar:write", OAuthScope.CustomPropertiesRead => "custom_properties:read", OAuthScope.AuditEventsRead => "audit_events:read", OAuthScope.TasksRead => "tasks:read", @@ -1830,6 +1903,12 @@ public class AuditEvent public string UserAgent { get; set; } = default!; } +public class AvatarData +{ + [JsonPropertyName("image_url")] + public string ImageUrl { get; set; } = default!; +} + public class BotResponseWebhook { [JsonPropertyName("outgoing_url")] @@ -2658,6 +2737,18 @@ public class WebhookMessageThread public int MessageChatId { get; set; } = default!; } +public class UpdateProfileAvatarRequest +{ + [JsonIgnore] + public byte[] Image { get; set; } = Array.Empty(); +} + +public class UpdateUserAvatarRequest +{ + [JsonIgnore] + public byte[] Image { get; set; } = Array.Empty(); +} + public class GetAuditEventsResponse { [JsonPropertyName("data")] @@ -2810,6 +2901,12 @@ public class UserDataWrapper public User Data { get; set; } = default!; } +public class AvatarDataDataWrapper +{ + [JsonPropertyName("data")] + public AvatarData Data { get; set; } = default!; +} + public class UserStatusDataWrapper { [JsonPropertyName("data")] diff --git a/sdk/csharp/generated/examples.json b/sdk/csharp/generated/examples.json index 6e56e583..f0e7c425 100644 --- a/sdk/csharp/generated/examples.json +++ b/sdk/csharp/generated/examples.json @@ -29,10 +29,11 @@ "usage": "await client.Bots.DeleteWebhookEventAsync(\"01KAJZ2XDSS2S3DSW9EXJZ0TBV\");" }, "ChatOperations_listChats": { - "usage": "var response = await client.Chats.ListChatsAsync(SortOrder.Desc, ChatAvailability.IsMember, DateTimeOffset.Parse(\"2025-01-01T00:00:00.000Z\"), DateTimeOffset.Parse(\"2025-02-01T00:00:00.000Z\"), false, 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", + "usage": "var response = await client.Chats.ListChatsAsync(ChatSortField.Id, SortOrder.Desc, ChatAvailability.IsMember, DateTimeOffset.Parse(\"2025-01-01T00:00:00.000Z\"), DateTimeOffset.Parse(\"2025-02-01T00:00:00.000Z\"), false, 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", "output": "ListChatsResponse(Data: List, Meta: PaginationMeta)", "imports": [ "ChatAvailability", + "ChatSortField", "SortOrder" ] }, @@ -152,9 +153,10 @@ "usage": "await client.GroupTags.DeleteTagAsync(9111);" }, "ChatMessageOperations_listChatMessages": { - "usage": "var response = await client.Messages.ListChatMessagesAsync(198, SortOrder.Desc, 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", + "usage": "var response = await client.Messages.ListChatMessagesAsync(198, MessageSortField.Id, SortOrder.Desc, 1, \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\");", "output": "ListChatMessagesResponse(Data: List, Meta: PaginationMeta)", "imports": [ + "MessageSortField", "SortOrder" ] }, @@ -239,6 +241,10 @@ "usage": "var response = await client.Profile.GetStatusAsync();", "output": "object" }, + "ProfileAvatarOperations_updateProfileAvatar": { + "usage": "var response = await client.Profile.UpdateProfileAvatarAsync(Array.Empty());", + "output": "AvatarData(ImageUrl: string)" + }, "ProfileOperations_updateStatus": { "usage": "var request = new StatusUpdateRequest\n{\n Status = new StatusUpdateRequestStatus\n {\n Emoji = \"🎮\",\n Title = \"Очень занят\",\n ExpiresAt = DateTimeOffset.Parse(\"2024-04-08T10:00:00.000Z\"),\n IsAway = true,\n AwayMessage = \"Вернусь после 15:00\"\n }\n};\nvar response = await client.Profile.UpdateStatusAsync(request);", "output": "UserStatus(Emoji: string, Title: string, ExpiresAt: DateTimeOffset?, IsAway: bool, AwayMessage: UserStatusAwayMessage(Text: string)?)", @@ -247,6 +253,9 @@ "StatusUpdateRequestStatus" ] }, + "ProfileAvatarOperations_deleteProfileAvatar": { + "usage": "await client.Profile.DeleteProfileAvatarAsync();" + }, "ProfileOperations_deleteStatus": { "usage": "await client.Profile.DeleteStatusAsync();" }, @@ -338,6 +347,10 @@ "UserUpdateRequestUser" ] }, + "UserAvatarOperations_updateUserAvatar": { + "usage": "var response = await client.Users.UpdateUserAvatarAsync(12, Array.Empty());", + "output": "AvatarData(ImageUrl: string)" + }, "UserStatusOperations_updateUserStatus": { "usage": "var request = new StatusUpdateRequest\n{\n Status = new StatusUpdateRequestStatus\n {\n Emoji = \"🎮\",\n Title = \"Очень занят\",\n ExpiresAt = DateTimeOffset.Parse(\"2024-04-08T10:00:00.000Z\"),\n IsAway = true,\n AwayMessage = \"Вернусь после 15:00\"\n }\n};\nvar response = await client.Users.UpdateUserStatusAsync(12, request);", "output": "UserStatus(Emoji: string, Title: string, ExpiresAt: DateTimeOffset?, IsAway: bool, AwayMessage: UserStatusAwayMessage(Text: string)?)", @@ -349,6 +362,9 @@ "UserOperations_deleteUser": { "usage": "await client.Users.DeleteUserAsync(12);" }, + "UserAvatarOperations_deleteUserAvatar": { + "usage": "await client.Users.DeleteUserAvatarAsync(12);" + }, "UserStatusOperations_deleteUserStatus": { "usage": "await client.Users.DeleteUserStatusAsync(12);" }, diff --git a/sdk/go/generated/client.go b/sdk/go/generated/client.go index 65c91f90..2bf97491 100644 --- a/sdk/go/generated/client.go +++ b/sdk/go/generated/client.go @@ -302,8 +302,11 @@ func (s *ChatsService) ListChats(ctx context.Context, params *ListChatsParams) ( return nil, err } q := u.Query() - if params != nil && params.SortID != nil { - q.Set("sort[id]", string(*params.SortID)) + if params != nil && params.Sort != nil { + q.Set("sort", string(*params.Sort)) + } + if params != nil && params.Order != nil { + q.Set("order", string(*params.Order)) } if params != nil && params.Availability != nil { q.Set("availability", string(*params.Availability)) @@ -1279,8 +1282,11 @@ func (s *MessagesService) ListChatMessages(ctx context.Context, params ListChatM } q := u.Query() q.Set("chat_id", fmt.Sprintf("%v", params.ChatID)) - if params.SortID != nil { - q.Set("sort[id]", string(*params.SortID)) + if params.Sort != nil { + q.Set("sort", string(*params.Sort)) + } + if params.Order != nil { + q.Set("order", string(*params.Order)) } if params.Limit != nil { q.Set("limit", fmt.Sprintf("%v", *params.Limit)) @@ -1947,6 +1953,56 @@ func (s *ProfileService) GetStatus(ctx context.Context) (*any, error) { } } +func (s *ProfileService) UpdateProfileAvatar(ctx context.Context, image io.Reader) (*AvatarData, error) { + pr, pw := io.Pipe() + writer := multipart.NewWriter(pw) + go func() { + defer pw.Close() + defer writer.Close() + part, err := writer.CreateFormFile("image", "upload") + if err != nil { + pw.CloseWithError(err) + return + } + if _, err := io.Copy(part, image); err != nil { + pw.CloseWithError(err) + return + } + }() + req, err := http.NewRequestWithContext(ctx, "PUT", fmt.Sprintf("%s/profile/avatar", s.baseURL), pr) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", writer.FormDataContentType()) + resp, err := doWithRetry(s.client, req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + switch resp.StatusCode { + case http.StatusOK: + var result struct { + Data AvatarData `json:"data"` + } + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return nil, err + } + return &result.Data, nil + case http.StatusUnauthorized: + var e OAuthError + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } + return nil, &e + default: + var e ApiError + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } + return nil, &e + } +} + func (s *ProfileService) UpdateStatus(ctx context.Context, request StatusUpdateRequest) (*UserStatus, error) { body, err := json.Marshal(request) if err != nil { @@ -1986,6 +2042,34 @@ func (s *ProfileService) UpdateStatus(ctx context.Context, request StatusUpdateR } } +func (s *ProfileService) DeleteProfileAvatar(ctx context.Context) error { + req, err := http.NewRequestWithContext(ctx, "DELETE", fmt.Sprintf("%s/profile/avatar", s.baseURL), nil) + if err != nil { + return err + } + resp, err := doWithRetry(s.client, req) + if err != nil { + return err + } + defer resp.Body.Close() + switch resp.StatusCode { + case http.StatusNoContent: + return nil + case http.StatusUnauthorized: + var e OAuthError + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } + return &e + default: + var e ApiError + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } + return &e + } +} + func (s *ProfileService) DeleteStatus(ctx context.Context) error { req, err := http.NewRequestWithContext(ctx, "DELETE", fmt.Sprintf("%s/profile/status", s.baseURL), nil) if err != nil { @@ -2707,6 +2791,56 @@ func (s *UsersService) UpdateUser(ctx context.Context, id int32, request UserUpd } } +func (s *UsersService) UpdateUserAvatar(ctx context.Context, userId int32, image io.Reader) (*AvatarData, error) { + pr, pw := io.Pipe() + writer := multipart.NewWriter(pw) + go func() { + defer pw.Close() + defer writer.Close() + part, err := writer.CreateFormFile("image", "upload") + if err != nil { + pw.CloseWithError(err) + return + } + if _, err := io.Copy(part, image); err != nil { + pw.CloseWithError(err) + return + } + }() + req, err := http.NewRequestWithContext(ctx, "PUT", fmt.Sprintf("%s/users/%v/avatar", s.baseURL, userId), pr) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", writer.FormDataContentType()) + resp, err := doWithRetry(s.client, req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + switch resp.StatusCode { + case http.StatusOK: + var result struct { + Data AvatarData `json:"data"` + } + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return nil, err + } + return &result.Data, nil + case http.StatusUnauthorized: + var e OAuthError + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } + return nil, &e + default: + var e ApiError + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } + return nil, &e + } +} + func (s *UsersService) UpdateUserStatus(ctx context.Context, userId int32, request StatusUpdateRequest) (*UserStatus, error) { body, err := json.Marshal(request) if err != nil { @@ -2774,6 +2908,34 @@ func (s *UsersService) DeleteUser(ctx context.Context, id int32) error { } } +func (s *UsersService) DeleteUserAvatar(ctx context.Context, userId int32) error { + req, err := http.NewRequestWithContext(ctx, "DELETE", fmt.Sprintf("%s/users/%v/avatar", s.baseURL, userId), nil) + if err != nil { + return err + } + resp, err := doWithRetry(s.client, req) + if err != nil { + return err + } + defer resp.Body.Close() + switch resp.StatusCode { + case http.StatusNoContent: + return nil + case http.StatusUnauthorized: + var e OAuthError + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + e.Err = fmt.Sprintf("HTTP 401: %v", err) + } + return &e + default: + var e ApiError + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return fmt.Errorf("HTTP %d: %w", resp.StatusCode, err) + } + return &e + } +} + func (s *UsersService) DeleteUserStatus(ctx context.Context, userId int32) error { req, err := http.NewRequestWithContext(ctx, "DELETE", fmt.Sprintf("%s/users/%v/status", s.baseURL, userId), nil) if err != nil { diff --git a/sdk/go/generated/examples.json b/sdk/go/generated/examples.json index f59df0fb..1e2ae0f8 100644 --- a/sdk/go/generated/examples.json +++ b/sdk/go/generated/examples.json @@ -33,10 +33,11 @@ "usage": "client.Bots.DeleteWebhookEvent(ctx, \"01KAJZ2XDSS2S3DSW9EXJZ0TBV\")" }, "ChatOperations_listChats": { - "usage": "params := &ListChatsParams{\n\tSortID: Ptr(SortOrderDesc),\n\tAvailability: Ptr(ChatAvailabilityIsMember),\n\tLastMessageAtAfter: Ptr(\"2025-01-01T00:00:00.000Z\"),\n\tLastMessageAtBefore: Ptr(\"2025-02-01T00:00:00.000Z\"),\n\tPersonal: Ptr(false),\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.Chats.ListChats(ctx, params)", + "usage": "params := &ListChatsParams{\n\tSort: Ptr(ChatSortFieldID),\n\tOrder: Ptr(SortOrderDesc),\n\tAvailability: Ptr(ChatAvailabilityIsMember),\n\tLastMessageAtAfter: Ptr(\"2025-01-01T00:00:00.000Z\"),\n\tLastMessageAtBefore: Ptr(\"2025-02-01T00:00:00.000Z\"),\n\tPersonal: Ptr(false),\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.Chats.ListChats(ctx, params)", "output": "ListChatsResponse{Data: []Chat, Meta: PaginationMeta}", "imports": [ "ChatAvailability", + "ChatSortField", "ListChatsParams", "SortOrder" ] @@ -165,10 +166,11 @@ "usage": "client.GroupTags.DeleteTag(ctx, int32(9111))" }, "ChatMessageOperations_listChatMessages": { - "usage": "params := ListChatMessagesParams{\n\tChatID: int32(198),\n\tSortID: Ptr(SortOrderDesc),\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.Messages.ListChatMessages(ctx, params)", + "usage": "params := ListChatMessagesParams{\n\tChatID: int32(198),\n\tSort: Ptr(MessageSortFieldID),\n\tOrder: Ptr(SortOrderDesc),\n\tLimit: Ptr(int32(1)),\n\tCursor: Ptr(\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"),\n}\nresponse, err := client.Messages.ListChatMessages(ctx, params)", "output": "ListChatMessagesResponse{Data: []Message, Meta: PaginationMeta}", "imports": [ "ListChatMessagesParams", + "MessageSortField", "SortOrder" ] }, @@ -262,6 +264,10 @@ "usage": "response, err := client.Profile.GetStatus(ctx)", "output": "any" }, + "ProfileAvatarOperations_updateProfileAvatar": { + "usage": "response, err := client.Profile.UpdateProfileAvatar(ctx, bytes.NewReader(nil))", + "output": "AvatarData{ImageURL: string}" + }, "ProfileOperations_updateStatus": { "usage": "request := StatusUpdateRequest{\n\tStatus: StatusUpdateRequestStatus{\n\t\tEmoji: \"🎮\",\n\t\tTitle: \"Очень занят\",\n\t\tExpiresAt: Ptr(\"2024-04-08T10:00:00.000Z\"),\n\t\tIsAway: Ptr(true),\n\t\tAwayMessage: Ptr(\"Вернусь после 15:00\"),\n\t},\n}\nresponse, err := client.Profile.UpdateStatus(ctx, request)", "output": "UserStatus{Emoji: string, Title: string, ExpiresAt: *string, IsAway: bool, AwayMessage: *UserStatusAwayMessage{Text: string}}", @@ -270,6 +276,9 @@ "StatusUpdateRequestStatus" ] }, + "ProfileAvatarOperations_deleteProfileAvatar": { + "usage": "client.Profile.DeleteProfileAvatar(ctx)" + }, "ProfileOperations_deleteStatus": { "usage": "client.Profile.DeleteStatus(ctx)" }, @@ -370,6 +379,10 @@ "UserUpdateRequestUser" ] }, + "UserAvatarOperations_updateUserAvatar": { + "usage": "response, err := client.Users.UpdateUserAvatar(ctx, int32(12), bytes.NewReader(nil))", + "output": "AvatarData{ImageURL: string}" + }, "UserStatusOperations_updateUserStatus": { "usage": "request := StatusUpdateRequest{\n\tStatus: StatusUpdateRequestStatus{\n\t\tEmoji: \"🎮\",\n\t\tTitle: \"Очень занят\",\n\t\tExpiresAt: Ptr(\"2024-04-08T10:00:00.000Z\"),\n\t\tIsAway: Ptr(true),\n\t\tAwayMessage: Ptr(\"Вернусь после 15:00\"),\n\t},\n}\nresponse, err := client.Users.UpdateUserStatus(ctx, int32(12), request)", "output": "UserStatus{Emoji: string, Title: string, ExpiresAt: *string, IsAway: bool, AwayMessage: *UserStatusAwayMessage{Text: string}}", @@ -381,6 +394,9 @@ "UserOperations_deleteUser": { "usage": "client.Users.DeleteUser(ctx, int32(12))" }, + "UserAvatarOperations_deleteUserAvatar": { + "usage": "client.Users.DeleteUserAvatar(ctx, int32(12))" + }, "UserStatusOperations_deleteUserStatus": { "usage": "client.Users.DeleteUserStatus(ctx, int32(12))" }, diff --git a/sdk/go/generated/types.go b/sdk/go/generated/types.go index dd50b370..3e945649 100644 --- a/sdk/go/generated/types.go +++ b/sdk/go/generated/types.go @@ -73,6 +73,13 @@ const ( ChatMemberRoleFilterMember ChatMemberRoleFilter = "member" // Участник/подписчик ) +type ChatSortField string + +const ( + ChatSortFieldID ChatSortField = "id" // По идентификатору чата + ChatSortFieldLastMessageAt ChatSortField = "last_message_at" // По дате и времени создания последнего сообщения +) + type ChatSubtype string const ( @@ -118,6 +125,12 @@ const ( MessageEntityTypeUser MessageEntityType = "user" // Пользователь ) +type MessageSortField string + +const ( + MessageSortFieldID MessageSortField = "id" // По идентификатору сообщения +) + type OAuthScope string const ( @@ -150,8 +163,10 @@ const ( OAuthScopeProfileRead OAuthScope = "profile:read" // Просмотр информации о своем профиле OAuthScopeProfileStatusRead OAuthScope = "profile_status:read" // Просмотр статуса профиля OAuthScopeProfileStatusWrite OAuthScope = "profile_status:write" // Изменение и удаление статуса профиля + OAuthScopeProfileAvatarWrite OAuthScope = "profile_avatar:write" // Изменение и удаление аватара профиля OAuthScopeUserStatusRead OAuthScope = "user_status:read" // Просмотр статуса сотрудника OAuthScopeUserStatusWrite OAuthScope = "user_status:write" // Изменение и удаление статуса сотрудника + OAuthScopeUserAvatarWrite OAuthScope = "user_avatar:write" // Изменение и удаление аватара сотрудника OAuthScopeCustomPropertiesRead OAuthScope = "custom_properties:read" // Просмотр дополнительных полей OAuthScopeAuditEventsRead OAuthScope = "audit_events:read" // Просмотр журнала аудита OAuthScopeTasksRead OAuthScope = "tasks:read" // Просмотр задач @@ -424,6 +439,10 @@ type AuditEvent struct { UserAgent string `json:"user_agent"` } +type AvatarData struct { + ImageURL string `json:"image_url"` +} + type BotResponseWebhook struct { OutgoingURL string `json:"outgoing_url"` } @@ -1076,6 +1095,14 @@ type WebhookMessageThread struct { MessageChatID int32 `json:"message_chat_id"` } +type UpdateProfileAvatarRequest struct { + Image io.Reader `json:"image"` +} + +type UpdateUserAvatarRequest struct { + Image io.Reader `json:"image"` +} + type AuditEventDetailsUnion struct { AuditDetailsEmpty *AuditDetailsEmpty AuditDetailsUserUpdated *AuditDetailsUserUpdated @@ -1370,7 +1397,8 @@ type GetAuditEventsParams struct { } type ListChatsParams struct { - SortID *SortOrder + Sort *ChatSortField + Order *SortOrder Availability *ChatAvailability LastMessageAtAfter *time.Time LastMessageAtBefore *time.Time @@ -1402,7 +1430,8 @@ type GetTagUsersParams struct { type ListChatMessagesParams struct { ChatID int32 - SortID *SortOrder + Sort *MessageSortField + Order *SortOrder Limit *int32 Cursor *string } diff --git a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Client.kt b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Client.kt index 961c68e2..61660fee 100644 --- a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Client.kt +++ b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Client.kt @@ -134,7 +134,8 @@ class ChatsService internal constructor( private val client: HttpClient, ) { suspend fun listChats( - sortId: SortOrder? = null, + sort: ChatSortField? = null, + order: SortOrder? = null, availability: ChatAvailability? = null, lastMessageAtAfter: String? = null, lastMessageAtBefore: String? = null, @@ -143,7 +144,8 @@ class ChatsService internal constructor( cursor: String? = null, ): ListChatsResponse { val response = client.get("$baseUrl/chats") { - sortId?.let { parameter("sort[id]", it.value) } + sort?.let { parameter("sort", it.value) } + order?.let { parameter("order", it.value) } availability?.let { parameter("availability", it.value) } lastMessageAtAfter?.let { parameter("last_message_at_after", it) } lastMessageAtBefore?.let { parameter("last_message_at_before", it) } @@ -159,7 +161,8 @@ class ChatsService internal constructor( } suspend fun listChatsAll( - sortId: SortOrder? = null, + sort: ChatSortField? = null, + order: SortOrder? = null, availability: ChatAvailability? = null, lastMessageAtAfter: String? = null, lastMessageAtBefore: String? = null, @@ -170,7 +173,8 @@ class ChatsService internal constructor( var cursor: String? = null do { val response = listChats( - sortId = sortId, + sort = sort, + order = order, availability = availability, lastMessageAtAfter = lastMessageAtAfter, lastMessageAtBefore = lastMessageAtBefore, @@ -530,13 +534,15 @@ class MessagesService internal constructor( ) { suspend fun listChatMessages( chatId: Int, - sortId: SortOrder? = null, + sort: MessageSortField? = null, + order: SortOrder? = null, limit: Int? = null, cursor: String? = null, ): ListChatMessagesResponse { val response = client.get("$baseUrl/messages") { parameter("chat_id", chatId) - sortId?.let { parameter("sort[id]", it.value) } + sort?.let { parameter("sort", it.value) } + order?.let { parameter("order", it.value) } limit?.let { parameter("limit", it) } cursor?.let { parameter("cursor", it) } } @@ -549,7 +555,8 @@ class MessagesService internal constructor( suspend fun listChatMessagesAll( chatId: Int, - sortId: SortOrder? = null, + sort: MessageSortField? = null, + order: SortOrder? = null, limit: Int? = null, ): List { val items = mutableListOf() @@ -557,7 +564,8 @@ class MessagesService internal constructor( do { val response = listChatMessages( chatId = chatId, - sortId = sortId, + sort = sort, + order = order, limit = limit, cursor = cursor, ) @@ -782,6 +790,22 @@ class ProfileService internal constructor( } } + suspend fun updateProfileAvatar(image: ByteArray): AvatarData { + val response = client.submitFormWithBinaryData( + "$baseUrl/profile/avatar", + formData { + append("image", image, Headers.build { + append(HttpHeaders.ContentDisposition, "filename=\"image\"") + }) + }, + ) + return when (response.status.value) { + 200 -> response.body().data + 401 -> throw response.body() + else -> throw response.body() + } + } + suspend fun updateStatus(request: StatusUpdateRequest): UserStatus { val response = client.put("$baseUrl/profile/status") { contentType(ContentType.Application.Json) @@ -794,6 +818,15 @@ class ProfileService internal constructor( } } + suspend fun deleteProfileAvatar() { + val response = client.delete("$baseUrl/profile/avatar") + when (response.status.value) { + 204 -> return + 401 -> throw response.body() + else -> throw response.body() + } + } + suspend fun deleteStatus() { val response = client.delete("$baseUrl/profile/status") when (response.status.value) { @@ -1131,6 +1164,22 @@ class UsersService internal constructor( } } + suspend fun updateUserAvatar(userId: Int, image: ByteArray): AvatarData { + val response = client.submitFormWithBinaryData( + "$baseUrl/users/$userId/avatar", + formData { + append("image", image, Headers.build { + append(HttpHeaders.ContentDisposition, "filename=\"image\"") + }) + }, + ) + return when (response.status.value) { + 200 -> response.body().data + 401 -> throw response.body() + else -> throw response.body() + } + } + suspend fun updateUserStatus(userId: Int, request: StatusUpdateRequest): UserStatus { val response = client.put("$baseUrl/users/$userId/status") { contentType(ContentType.Application.Json) @@ -1152,6 +1201,15 @@ class UsersService internal constructor( } } + suspend fun deleteUserAvatar(userId: Int) { + val response = client.delete("$baseUrl/users/$userId/avatar") + when (response.status.value) { + 204 -> return + 401 -> throw response.body() + else -> throw response.body() + } + } + suspend fun deleteUserStatus(userId: Int) { val response = client.delete("$baseUrl/users/$userId/status") when (response.status.value) { diff --git a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt index 9dbe5245..8ce665ee 100644 --- a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt +++ b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt @@ -114,6 +114,15 @@ enum class ChatMemberRoleFilter(val value: String) { @SerialName("member") MEMBER("member"), } +/** Поле сортировки чатов */ +@Serializable +enum class ChatSortField(val value: String) { + /** По идентификатору чата */ + @SerialName("id") ID("id"), + /** По дате и времени создания последнего сообщения */ + @SerialName("last_message_at") LAST_MESSAGE_AT("last_message_at"), +} + /** Тип чата */ @Serializable enum class ChatSubtype(val value: String) { @@ -174,6 +183,12 @@ enum class MessageEntityType(val value: String) { @SerialName("user") USER("user"), } +@Serializable +enum class MessageSortField(val value: String) { + /** По идентификатору сообщения */ + @SerialName("id") ID("id"), +} + /** Скоуп доступа OAuth токена */ @Serializable enum class OAuthScope(val value: String) { @@ -235,10 +250,14 @@ enum class OAuthScope(val value: String) { @SerialName("profile_status:read") PROFILE_STATUS_READ("profile_status:read"), /** Изменение и удаление статуса профиля */ @SerialName("profile_status:write") PROFILE_STATUS_WRITE("profile_status:write"), + /** Изменение и удаление аватара профиля */ + @SerialName("profile_avatar:write") PROFILE_AVATAR_WRITE("profile_avatar:write"), /** Просмотр статуса сотрудника */ @SerialName("user_status:read") USER_STATUS_READ("user_status:read"), /** Изменение и удаление статуса сотрудника */ @SerialName("user_status:write") USER_STATUS_WRITE("user_status:write"), + /** Изменение и удаление аватара сотрудника */ + @SerialName("user_avatar:write") USER_AVATAR_WRITE("user_avatar:write"), /** Просмотр дополнительных полей */ @SerialName("custom_properties:read") CUSTOM_PROPERTIES_READ("custom_properties:read"), /** Просмотр журнала аудита */ @@ -841,6 +860,11 @@ data class AuditEvent( @SerialName("user_agent") val userAgent: String, ) +@Serializable +data class AvatarData( + @SerialName("image_url") val imageUrl: String, +) + @Serializable data class BotResponseWebhook( @SerialName("outgoing_url") val outgoingUrl: String, @@ -1389,6 +1413,16 @@ data class WebhookMessageThread( @SerialName("message_chat_id") val messageChatId: Int, ) +@Serializable +data class UpdateProfileAvatarRequest( + @Transient val image: ByteArray = ByteArray(0), +) + +@Serializable +data class UpdateUserAvatarRequest( + @Transient val image: ByteArray = ByteArray(0), +) + @Serializable data class GetAuditEventsResponse( val data: List, @@ -1493,6 +1527,9 @@ data class AccessTokenInfoDataWrapper(val data: AccessTokenInfo) @Serializable data class UserDataWrapper(val data: User) +@Serializable +data class AvatarDataDataWrapper(val data: AvatarData) + @Serializable data class UserStatusDataWrapper(val data: UserStatus) diff --git a/sdk/kotlin/generated/src/main/kotlin/com/pachca/examples.json b/sdk/kotlin/generated/src/main/kotlin/com/pachca/examples.json index cda93883..b6813ccc 100644 --- a/sdk/kotlin/generated/src/main/kotlin/com/pachca/examples.json +++ b/sdk/kotlin/generated/src/main/kotlin/com/pachca/examples.json @@ -29,10 +29,11 @@ "usage": "client.bots.deleteWebhookEvent(id = \"01KAJZ2XDSS2S3DSW9EXJZ0TBV\")" }, "ChatOperations_listChats": { - "usage": "val response = client.chats.listChats(sortId = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = \"2025-01-01T00:00:00.000Z\", lastMessageAtBefore = \"2025-02-01T00:00:00.000Z\", personal = false, limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", + "usage": "val response = client.chats.listChats(sort = ChatSortField.ID, order = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = \"2025-01-01T00:00:00.000Z\", lastMessageAtBefore = \"2025-02-01T00:00:00.000Z\", personal = false, limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", "output": "ListChatsResponse(data: List, meta: PaginationMeta)", "imports": [ "ChatAvailability", + "ChatSortField", "SortOrder" ] }, @@ -152,9 +153,10 @@ "usage": "client.groupTags.deleteTag(id = 9111)" }, "ChatMessageOperations_listChatMessages": { - "usage": "val response = client.messages.listChatMessages(chatId = 198, sortId = SortOrder.DESC, limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", + "usage": "val response = client.messages.listChatMessages(chatId = 198, sort = MessageSortField.ID, order = SortOrder.DESC, limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", "output": "ListChatMessagesResponse(data: List, meta: PaginationMeta)", "imports": [ + "MessageSortField", "SortOrder" ] }, @@ -239,6 +241,10 @@ "usage": "val response = client.profile.getStatus()", "output": "Any" }, + "ProfileAvatarOperations_updateProfileAvatar": { + "usage": "val image = ByteArray(0)\nval response = client.profile.updateProfileAvatar(image = image)", + "output": "AvatarData(imageUrl: String)" + }, "ProfileOperations_updateStatus": { "usage": "val request = StatusUpdateRequest(\n status = StatusUpdateRequestStatus(\n emoji = \"🎮\",\n title = \"Очень занят\",\n expiresAt = \"2024-04-08T10:00:00.000Z\",\n isAway = true,\n awayMessage = \"Вернусь после 15:00\"\n )\n)\nval response = client.profile.updateStatus(request = request)", "output": "UserStatus(emoji: String, title: String, expiresAt: String?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)", @@ -247,6 +253,9 @@ "StatusUpdateRequestStatus" ] }, + "ProfileAvatarOperations_deleteProfileAvatar": { + "usage": "client.profile.deleteProfileAvatar()" + }, "ProfileOperations_deleteStatus": { "usage": "client.profile.deleteStatus()" }, @@ -338,6 +347,10 @@ "UserUpdateRequestUser" ] }, + "UserAvatarOperations_updateUserAvatar": { + "usage": "val image = ByteArray(0)\nval response = client.users.updateUserAvatar(userId = 12, image = image)", + "output": "AvatarData(imageUrl: String)" + }, "UserStatusOperations_updateUserStatus": { "usage": "val request = StatusUpdateRequest(\n status = StatusUpdateRequestStatus(\n emoji = \"🎮\",\n title = \"Очень занят\",\n expiresAt = \"2024-04-08T10:00:00.000Z\",\n isAway = true,\n awayMessage = \"Вернусь после 15:00\"\n )\n)\nval response = client.users.updateUserStatus(userId = 12, request = request)", "output": "UserStatus(emoji: String, title: String, expiresAt: String?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)", @@ -349,6 +362,9 @@ "UserOperations_deleteUser": { "usage": "client.users.deleteUser(id = 12)" }, + "UserAvatarOperations_deleteUserAvatar": { + "usage": "client.users.deleteUserAvatar(userId = 12)" + }, "UserStatusOperations_deleteUserStatus": { "usage": "client.users.deleteUserStatus(userId = 12)" }, diff --git a/sdk/python/generated/pachca/client.py b/sdk/python/generated/pachca/client.py index 1fc9023a..a4a6a4b5 100644 --- a/sdk/python/generated/pachca/client.py +++ b/sdk/python/generated/pachca/client.py @@ -17,6 +17,7 @@ ListChatsParams, ListChatsResponse, Chat, + ChatSortField, SortOrder, ChatAvailability, ChatCreateRequest, @@ -42,6 +43,7 @@ ListChatMessagesParams, ListChatMessagesResponse, Message, + MessageSortField, MessageCreateRequest, MessageUpdateRequest, LinkPreviewsRequest, @@ -53,6 +55,7 @@ ListReadMembersParams, Thread, AccessTokenInfo, + AvatarData, StatusUpdateRequest, UserStatus, SearchChatsParams, @@ -220,8 +223,10 @@ async def list_chats( params: ListChatsParams | None = None, ) -> ListChatsResponse: query: dict[str, str] = {} - if params is not None and params.sort_id is not None: - query["sort[id]"] = params.sort_id + if params is not None and params.sort is not None: + query["sort"] = params.sort + if params is not None and params.order is not None: + query["order"] = params.order if params is not None and params.availability is not None: query["availability"] = params.availability if params is not None and params.last_message_at_after is not None: @@ -758,8 +763,10 @@ async def list_chat_messages( ) -> ListChatMessagesResponse: query: list[tuple[str, str]] = [] query.append(("chat_id", str(params.chat_id))) - if params is not None and params.sort_id is not None: - query.append(("sort[id]", params.sort_id)) + if params is not None and params.sort is not None: + query.append(("sort", params.sort)) + if params is not None and params.order is not None: + query.append(("order", params.order)) if params is not None and params.limit is not None: query.append(("limit", str(params.limit))) if params is not None and params.cursor is not None: @@ -1109,6 +1116,25 @@ async def get_status( case _: raise deserialize(ApiError, body) + async def update_profile_avatar( + self, + image: bytes, + ) -> AvatarData: + data: dict[str, str] = {} + response = await self._client.post( + "/profile/avatar", + data=data, + files={"image": image}, + ) + body = response.json() + match response.status_code: + case 200: + return deserialize(AvatarData, body["data"]) + case 401: + raise deserialize(OAuthError, body) + case _: + raise deserialize(ApiError, body) + async def update_status( self, request: StatusUpdateRequest, @@ -1126,6 +1152,19 @@ async def update_status( case _: raise deserialize(ApiError, body) + async def delete_profile_avatar( + self) -> None: + response = await self._client.delete( + "/profile/avatar", + ) + match response.status_code: + case 204: + return + case 401: + raise deserialize(OAuthError, response.json()) + case _: + raise deserialize(ApiError, response.json()) + async def delete_status( self) -> None: response = await self._client.delete( @@ -1527,6 +1566,26 @@ async def update_user( case _: raise deserialize(ApiError, body) + async def update_user_avatar( + self, + user_id: int, + image: bytes, + ) -> AvatarData: + data: dict[str, str] = {} + response = await self._client.post( + f"/users/{user_id}/avatar", + data=data, + files={"image": image}, + ) + body = response.json() + match response.status_code: + case 200: + return deserialize(AvatarData, body["data"]) + case 401: + raise deserialize(OAuthError, body) + case _: + raise deserialize(ApiError, body) + async def update_user_status( self, user_id: int, @@ -1560,6 +1619,21 @@ async def delete_user( case _: raise deserialize(ApiError, response.json()) + async def delete_user_avatar( + self, + user_id: int, + ) -> None: + response = await self._client.delete( + f"/users/{user_id}/avatar", + ) + match response.status_code: + case 204: + return + case 401: + raise deserialize(OAuthError, response.json()) + case _: + raise deserialize(ApiError, response.json()) + async def delete_user_status( self, user_id: int, diff --git a/sdk/python/generated/pachca/examples.json b/sdk/python/generated/pachca/examples.json index 51254fc6..6a180606 100644 --- a/sdk/python/generated/pachca/examples.json +++ b/sdk/python/generated/pachca/examples.json @@ -33,10 +33,11 @@ "usage": "await client.bots.delete_webhook_event(id=\"01KAJZ2XDSS2S3DSW9EXJZ0TBV\")" }, "ChatOperations_listChats": { - "usage": "params = ListChatsParams(\n sort_id=SortOrder.DESC,\n availability=ChatAvailability.IS_MEMBER,\n last_message_at_after=\"2025-01-01T00:00:00.000Z\",\n last_message_at_before=\"2025-02-01T00:00:00.000Z\",\n personal=False,\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.chats.list_chats(params=params)", + "usage": "params = ListChatsParams(\n sort=ChatSortField.ID,\n order=SortOrder.DESC,\n availability=ChatAvailability.IS_MEMBER,\n last_message_at_after=\"2025-01-01T00:00:00.000Z\",\n last_message_at_before=\"2025-02-01T00:00:00.000Z\",\n personal=False,\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.chats.list_chats(params=params)", "output": "ListChatsResponse(data: list[Chat], meta: PaginationMeta)", "imports": [ "ChatAvailability", + "ChatSortField", "ListChatsParams", "SortOrder" ] @@ -165,10 +166,11 @@ "usage": "await client.group_tags.delete_tag(id=9111)" }, "ChatMessageOperations_listChatMessages": { - "usage": "params = ListChatMessagesParams(\n chat_id=198,\n sort_id=SortOrder.DESC,\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.messages.list_chat_messages(params=params)", + "usage": "params = ListChatMessagesParams(\n chat_id=198,\n sort=MessageSortField.ID,\n order=SortOrder.DESC,\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.messages.list_chat_messages(params=params)", "output": "ListChatMessagesResponse(data: list[Message], meta: PaginationMeta)", "imports": [ "ListChatMessagesParams", + "MessageSortField", "SortOrder" ] }, @@ -262,6 +264,10 @@ "usage": "response = await client.profile.get_status()", "output": "object" }, + "ProfileAvatarOperations_updateProfileAvatar": { + "usage": "response = await client.profile.update_profile_avatar(image=b\"\")", + "output": "AvatarData(image_url: str)" + }, "ProfileOperations_updateStatus": { "usage": "request = StatusUpdateRequest(\n status=StatusUpdateRequestStatus(\n emoji=\"🎮\",\n title=\"Очень занят\",\n expires_at=\"2024-04-08T10:00:00.000Z\",\n is_away=True,\n away_message=\"Вернусь после 15:00\"\n )\n)\nresponse = await client.profile.update_status(request=request)", "output": "UserStatus(emoji: str, title: str, expires_at: str | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None)", @@ -270,6 +276,9 @@ "StatusUpdateRequestStatus" ] }, + "ProfileAvatarOperations_deleteProfileAvatar": { + "usage": "await client.profile.delete_profile_avatar()" + }, "ProfileOperations_deleteStatus": { "usage": "await client.profile.delete_status()" }, @@ -370,6 +379,10 @@ "UserUpdateRequestUser" ] }, + "UserAvatarOperations_updateUserAvatar": { + "usage": "response = await client.users.update_user_avatar(user_id=12, image=b\"\")", + "output": "AvatarData(image_url: str)" + }, "UserStatusOperations_updateUserStatus": { "usage": "request = StatusUpdateRequest(\n status=StatusUpdateRequestStatus(\n emoji=\"🎮\",\n title=\"Очень занят\",\n expires_at=\"2024-04-08T10:00:00.000Z\",\n is_away=True,\n away_message=\"Вернусь после 15:00\"\n )\n)\nresponse = await client.users.update_user_status(user_id=12, request=request)", "output": "UserStatus(emoji: str, title: str, expires_at: str | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None)", @@ -381,6 +394,9 @@ "UserOperations_deleteUser": { "usage": "await client.users.delete_user(id=12)" }, + "UserAvatarOperations_deleteUserAvatar": { + "usage": "await client.users.delete_user_avatar(user_id=12)" + }, "UserStatusOperations_deleteUserStatus": { "usage": "await client.users.delete_user_status(user_id=12)" }, diff --git a/sdk/python/generated/pachca/models.py b/sdk/python/generated/pachca/models.py index 13ec9a19..0b3551e4 100644 --- a/sdk/python/generated/pachca/models.py +++ b/sdk/python/generated/pachca/models.py @@ -69,6 +69,13 @@ class ChatMemberRoleFilter(StrEnum): MEMBER = "member" # Участник/подписчик +class ChatSortField(StrEnum): + """Поле сортировки чатов""" + + ID = "id" # По идентификатору чата + LAST_MESSAGE_AT = "last_message_at" # По дате и времени создания последнего сообщения + + class ChatSubtype(StrEnum): """Тип чата""" @@ -114,6 +121,10 @@ class MessageEntityType(StrEnum): USER = "user" # Пользователь +class MessageSortField(StrEnum): + ID = "id" # По идентификатору сообщения + + class OAuthScope(StrEnum): """Скоуп доступа OAuth токена""" @@ -146,8 +157,10 @@ class OAuthScope(StrEnum): PROFILE_READ = "profile:read" # Просмотр информации о своем профиле PROFILE_STATUS_READ = "profile_status:read" # Просмотр статуса профиля PROFILE_STATUS_WRITE = "profile_status:write" # Изменение и удаление статуса профиля + PROFILE_AVATAR_WRITE = "profile_avatar:write" # Изменение и удаление аватара профиля USER_STATUS_READ = "user_status:read" # Просмотр статуса сотрудника USER_STATUS_WRITE = "user_status:write" # Изменение и удаление статуса сотрудника + USER_AVATAR_WRITE = "user_avatar:write" # Изменение и удаление аватара сотрудника CUSTOM_PROPERTIES_READ = "custom_properties:read" # Просмотр дополнительных полей AUDIT_EVENTS_READ = "audit_events:read" # Просмотр журнала аудита TASKS_READ = "tasks:read" # Просмотр задач @@ -427,6 +440,11 @@ class AuditEvent: user_agent: str +@dataclass +class AvatarData: + image_url: str + + @dataclass class BotResponseWebhook: outgoing_url: str @@ -1157,6 +1175,16 @@ class WebhookMessageThread: message_chat_id: int +@dataclass +class UpdateProfileAvatarRequest: + image: bytes + + +@dataclass +class UpdateUserAvatarRequest: + image: bytes + + AuditEventDetailsUnion = Union[AuditDetailsEmpty, AuditDetailsUserUpdated, AuditDetailsRoleChanged, AuditDetailsTagName, AuditDetailsInitiator, AuditDetailsInviter, AuditDetailsChatRenamed, AuditDetailsChatPermission, AuditDetailsTagChat, AuditDetailsChatId, AuditDetailsTokenScopes, AuditDetailsKms, AuditDetailsDlp, AuditDetailsSearch] @@ -1181,7 +1209,8 @@ class GetAuditEventsParams: @dataclass class ListChatsParams: - sort_id: SortOrder | None = None + sort: ChatSortField | None = None + order: SortOrder | None = None availability: ChatAvailability | None = None last_message_at_after: str | None = None last_message_at_before: str | None = None @@ -1218,7 +1247,8 @@ class GetTagUsersParams: @dataclass class ListChatMessagesParams: chat_id: int - sort_id: SortOrder | None = None + sort: MessageSortField | None = None + order: SortOrder | None = None limit: int | None = None cursor: str | None = None diff --git a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Client.swift b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Client.swift index caf0986c..70429ed8 100644 --- a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Client.swift +++ b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Client.swift @@ -143,10 +143,11 @@ public struct ChatsService { self.session = session } - public func listChats(sortId: SortOrder? = nil, availability: ChatAvailability? = nil, lastMessageAtAfter: String? = nil, lastMessageAtBefore: String? = nil, personal: Bool? = nil, limit: Int? = nil, cursor: String? = nil) async throws -> ListChatsResponse { + public func listChats(sort: ChatSortField? = nil, order: SortOrder? = nil, availability: ChatAvailability? = nil, lastMessageAtAfter: String? = nil, lastMessageAtBefore: String? = nil, personal: Bool? = nil, limit: Int? = nil, cursor: String? = nil) async throws -> ListChatsResponse { var components = URLComponents(string: "\(baseURL)/chats")! var queryItems: [URLQueryItem] = [] - if let sortId { queryItems.append(URLQueryItem(name: "sort[id]", value: sortId.rawValue)) } + if let sort { queryItems.append(URLQueryItem(name: "sort", value: sort.rawValue)) } + if let order { queryItems.append(URLQueryItem(name: "order", value: order.rawValue)) } if let availability { queryItems.append(URLQueryItem(name: "availability", value: availability.rawValue)) } if let lastMessageAtAfter { queryItems.append(URLQueryItem(name: "last_message_at_after", value: lastMessageAtAfter)) } if let lastMessageAtBefore { queryItems.append(URLQueryItem(name: "last_message_at_before", value: lastMessageAtBefore)) } @@ -168,11 +169,11 @@ public struct ChatsService { } } - public func listChatsAll(sortId: SortOrder? = nil, availability: ChatAvailability? = nil, lastMessageAtAfter: String? = nil, lastMessageAtBefore: String? = nil, personal: Bool? = nil, limit: Int? = nil) async throws -> [Chat] { + public func listChatsAll(sort: ChatSortField? = nil, order: SortOrder? = nil, availability: ChatAvailability? = nil, lastMessageAtAfter: String? = nil, lastMessageAtBefore: String? = nil, personal: Bool? = nil, limit: Int? = nil) async throws -> [Chat] { var items: [Chat] = [] var cursor: String? = nil repeat { - let response = try await listChats(sortId: sortId, availability: availability, lastMessageAtAfter: lastMessageAtAfter, lastMessageAtBefore: lastMessageAtBefore, personal: personal, limit: limit, cursor: cursor) + let response = try await listChats(sort: sort, order: order, availability: availability, lastMessageAtAfter: lastMessageAtAfter, lastMessageAtBefore: lastMessageAtBefore, personal: personal, limit: limit, cursor: cursor) items.append(contentsOf: response.data) if response.data.isEmpty { break } cursor = response.meta.paginate.nextPage @@ -686,11 +687,12 @@ public struct MessagesService { self.session = session } - public func listChatMessages(chatId: Int, sortId: SortOrder? = nil, limit: Int? = nil, cursor: String? = nil) async throws -> ListChatMessagesResponse { + public func listChatMessages(chatId: Int, sort: MessageSortField? = nil, order: SortOrder? = nil, limit: Int? = nil, cursor: String? = nil) async throws -> ListChatMessagesResponse { var components = URLComponents(string: "\(baseURL)/messages")! var queryItems: [URLQueryItem] = [] queryItems.append(URLQueryItem(name: "chat_id", value: String(chatId))) - if let sortId { queryItems.append(URLQueryItem(name: "sort[id]", value: sortId.rawValue)) } + if let sort { queryItems.append(URLQueryItem(name: "sort", value: sort.rawValue)) } + if let order { queryItems.append(URLQueryItem(name: "order", value: order.rawValue)) } if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } if let cursor { queryItems.append(URLQueryItem(name: "cursor", value: String(cursor))) } if !queryItems.isEmpty { components.queryItems = queryItems } @@ -708,11 +710,11 @@ public struct MessagesService { } } - public func listChatMessagesAll(chatId: Int, sortId: SortOrder? = nil, limit: Int? = nil) async throws -> [Message] { + public func listChatMessagesAll(chatId: Int, sort: MessageSortField? = nil, order: SortOrder? = nil, limit: Int? = nil) async throws -> [Message] { var items: [Message] = [] var cursor: String? = nil repeat { - let response = try await listChatMessages(chatId: chatId, sortId: sortId, limit: limit, cursor: cursor) + let response = try await listChatMessages(chatId: chatId, sort: sort, order: order, limit: limit, cursor: cursor) items.append(contentsOf: response.data) if response.data.isEmpty { break } cursor = response.meta.paginate.nextPage @@ -1064,6 +1066,37 @@ public struct ProfileService { } } + public func updateProfileAvatar(image: Data) async throws -> AvatarData { + var request = URLRequest(url: URL(string: "\(baseURL)/profile/avatar")!) + request.httpMethod = "PUT" + headers.forEach { request.setValue($1, forHTTPHeaderField: $0) } + let boundary = UUID().uuidString + request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") + var data = Data() + func appendField(_ name: String, _ value: String) { + data.append("--\(boundary)\r\n".data(using: .utf8)!) + data.append("Content-Disposition: form-data; name=\"\(name)\"\r\n\r\n".data(using: .utf8)!) + data.append("\(value)\r\n".data(using: .utf8)!) + } + data.append("--\(boundary)\r\n".data(using: .utf8)!) + data.append("Content-Disposition: form-data; name=\"image\"; filename=\"upload\"\r\n".data(using: .utf8)!) + data.append("Content-Type: application/octet-stream\r\n\r\n".data(using: .utf8)!) + data.append(image) + data.append("\r\n".data(using: .utf8)!) + data.append("--\(boundary)--\r\n".data(using: .utf8)!) + request.httpBody = data + let (responseData, urlResponse) = try await dataWithRetry(session: session, for: request) + let statusCode = (urlResponse as! HTTPURLResponse).statusCode + switch statusCode { + case 200: + return try deserialize(AvatarDataDataWrapper.self, from: responseData).data + case 401: + throw try deserialize(OAuthError.self, from: responseData) + default: + throw try deserialize(ApiError.self, from: responseData) + } + } + public func updateStatus(request body: StatusUpdateRequest) async throws -> UserStatus { var request = URLRequest(url: URL(string: "\(baseURL)/profile/status")!) request.httpMethod = "PUT" @@ -1082,6 +1115,22 @@ public struct ProfileService { } } + public func deleteProfileAvatar() async throws -> Void { + var request = URLRequest(url: URL(string: "\(baseURL)/profile/avatar")!) + request.httpMethod = "DELETE" + headers.forEach { request.setValue($1, forHTTPHeaderField: $0) } + let (data, urlResponse) = try await dataWithRetry(session: session, for: request) + let statusCode = (urlResponse as! HTTPURLResponse).statusCode + switch statusCode { + case 204: + return + case 401: + throw try deserialize(OAuthError.self, from: data) + default: + throw try deserialize(ApiError.self, from: data) + } + } + public func deleteStatus() async throws -> Void { var request = URLRequest(url: URL(string: "\(baseURL)/profile/status")!) request.httpMethod = "DELETE" @@ -1448,6 +1497,37 @@ public struct UsersService { } } + public func updateUserAvatar(userId: Int, image: Data) async throws -> AvatarData { + var request = URLRequest(url: URL(string: "\(baseURL)/users/\(userId)/avatar")!) + request.httpMethod = "PUT" + headers.forEach { request.setValue($1, forHTTPHeaderField: $0) } + let boundary = UUID().uuidString + request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") + var data = Data() + func appendField(_ name: String, _ value: String) { + data.append("--\(boundary)\r\n".data(using: .utf8)!) + data.append("Content-Disposition: form-data; name=\"\(name)\"\r\n\r\n".data(using: .utf8)!) + data.append("\(value)\r\n".data(using: .utf8)!) + } + data.append("--\(boundary)\r\n".data(using: .utf8)!) + data.append("Content-Disposition: form-data; name=\"image\"; filename=\"upload\"\r\n".data(using: .utf8)!) + data.append("Content-Type: application/octet-stream\r\n\r\n".data(using: .utf8)!) + data.append(image) + data.append("\r\n".data(using: .utf8)!) + data.append("--\(boundary)--\r\n".data(using: .utf8)!) + request.httpBody = data + let (responseData, urlResponse) = try await dataWithRetry(session: session, for: request) + let statusCode = (urlResponse as! HTTPURLResponse).statusCode + switch statusCode { + case 200: + return try deserialize(AvatarDataDataWrapper.self, from: responseData).data + case 401: + throw try deserialize(OAuthError.self, from: responseData) + default: + throw try deserialize(ApiError.self, from: responseData) + } + } + public func updateUserStatus(userId: Int, request body: StatusUpdateRequest) async throws -> UserStatus { var request = URLRequest(url: URL(string: "\(baseURL)/users/\(userId)/status")!) request.httpMethod = "PUT" @@ -1482,6 +1562,22 @@ public struct UsersService { } } + public func deleteUserAvatar(userId: Int) async throws -> Void { + var request = URLRequest(url: URL(string: "\(baseURL)/users/\(userId)/avatar")!) + request.httpMethod = "DELETE" + headers.forEach { request.setValue($1, forHTTPHeaderField: $0) } + let (data, urlResponse) = try await dataWithRetry(session: session, for: request) + let statusCode = (urlResponse as! HTTPURLResponse).statusCode + switch statusCode { + case 204: + return + case 401: + throw try deserialize(OAuthError.self, from: data) + default: + throw try deserialize(ApiError.self, from: data) + } + } + public func deleteUserStatus(userId: Int) async throws -> Void { var request = URLRequest(url: URL(string: "\(baseURL)/users/\(userId)/status")!) request.httpMethod = "DELETE" diff --git a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift index 66e20bd1..d49ee451 100644 --- a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift +++ b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift @@ -105,6 +105,13 @@ public enum ChatMemberRoleFilter: String, Codable, CaseIterable { case member } +public enum ChatSortField: String, Codable, CaseIterable { + /// По идентификатору чата + case id + /// По дате и времени создания последнего сообщения + case lastMessageAt = "last_message_at" +} + public enum ChatSubtype: String, Codable, CaseIterable { /// Канал или беседа case discussion @@ -153,6 +160,11 @@ public enum MessageEntityType: String, Codable, CaseIterable { case user } +public enum MessageSortField: String, Codable, CaseIterable { + /// По идентификатору сообщения + case id +} + public enum OAuthScope: String, Codable, CaseIterable { /// Просмотр чатов и списка чатов case chatsRead = "chats:read" @@ -212,10 +224,14 @@ public enum OAuthScope: String, Codable, CaseIterable { case profileStatusRead = "profile_status:read" /// Изменение и удаление статуса профиля case profileStatusWrite = "profile_status:write" + /// Изменение и удаление аватара профиля + case profileAvatarWrite = "profile_avatar:write" /// Просмотр статуса сотрудника case userStatusRead = "user_status:read" /// Изменение и удаление статуса сотрудника case userStatusWrite = "user_status:write" + /// Изменение и удаление аватара сотрудника + case userAvatarWrite = "user_avatar:write" /// Просмотр дополнительных полей case customPropertiesRead = "custom_properties:read" /// Просмотр журнала аудита @@ -744,6 +760,18 @@ public struct AuditEvent: Codable { } } +public struct AvatarData: Codable { + public let imageUrl: String + + public init(imageUrl: String) { + self.imageUrl = imageUrl + } + + enum CodingKeys: String, CodingKey { + case imageUrl = "image_url" + } +} + public struct BotResponseWebhook: Codable { public let outgoingUrl: String @@ -2515,6 +2543,22 @@ public struct WebhookMessageThread: Codable { } } +public struct UpdateProfileAvatarRequest: Codable { + public var image: Data + + public init(image: Data) { + self.image = image + } +} + +public struct UpdateUserAvatarRequest: Codable { + public var image: Data + + public init(image: Data) { + self.image = image + } +} + public enum AuditEventDetailsUnion: Codable { case auditDetailsEmpty(AuditDetailsEmpty) case auditDetailsUserUpdated(AuditDetailsUserUpdated) @@ -2839,6 +2883,10 @@ struct UserDataWrapper: Codable { let data: User } +struct AvatarDataDataWrapper: Codable { + let data: AvatarData +} + struct UserStatusDataWrapper: Codable { let data: UserStatus } diff --git a/sdk/swift/generated/examples.json b/sdk/swift/generated/examples.json index af825387..d6665875 100644 --- a/sdk/swift/generated/examples.json +++ b/sdk/swift/generated/examples.json @@ -29,10 +29,11 @@ "usage": "try await client.bots.deleteWebhookEvent(id: \"01KAJZ2XDSS2S3DSW9EXJZ0TBV\")" }, "ChatOperations_listChats": { - "usage": "let response = try await client.chats.listChats(sortId: .desc, availability: .isMember, lastMessageAtAfter: \"2025-01-01T00:00:00.000Z\", lastMessageAtBefore: \"2025-02-01T00:00:00.000Z\", personal: false, limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", + "usage": "let response = try await client.chats.listChats(sort: .id, order: .desc, availability: .isMember, lastMessageAtAfter: \"2025-01-01T00:00:00.000Z\", lastMessageAtBefore: \"2025-02-01T00:00:00.000Z\", personal: false, limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", "output": "ListChatsResponse(data: [Chat], meta: PaginationMeta)", "imports": [ "ChatAvailability", + "ChatSortField", "SortOrder" ] }, @@ -152,9 +153,10 @@ "usage": "try await client.groupTags.deleteTag(id: 9111)" }, "ChatMessageOperations_listChatMessages": { - "usage": "let response = try await client.messages.listChatMessages(chatId: 198, sortId: .desc, limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", + "usage": "let response = try await client.messages.listChatMessages(chatId: 198, sort: .id, order: .desc, limit: 1, cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", "output": "ListChatMessagesResponse(data: [Message], meta: PaginationMeta)", "imports": [ + "MessageSortField", "SortOrder" ] }, @@ -239,6 +241,10 @@ "usage": "let response = try await client.profile.getStatus()", "output": "String" }, + "ProfileAvatarOperations_updateProfileAvatar": { + "usage": "let image = Data()\nlet response = try await client.profile.updateProfileAvatar(image: image)", + "output": "AvatarData(imageUrl: String)" + }, "ProfileOperations_updateStatus": { "usage": "let body = StatusUpdateRequest(\n status: StatusUpdateRequestStatus(\n emoji: \"🎮\",\n title: \"Очень занят\",\n expiresAt: \"2024-04-08T10:00:00.000Z\",\n isAway: true,\n awayMessage: \"Вернусь после 15:00\"\n )\n)\nlet response = try await client.profile.updateStatus(body: body)", "output": "UserStatus(emoji: String, title: String, expiresAt: String?, isAway: Bool, awayMessage: UserStatusAwayMessage(text: String)?)", @@ -247,6 +253,9 @@ "StatusUpdateRequestStatus" ] }, + "ProfileAvatarOperations_deleteProfileAvatar": { + "usage": "try await client.profile.deleteProfileAvatar()" + }, "ProfileOperations_deleteStatus": { "usage": "try await client.profile.deleteStatus()" }, @@ -338,6 +347,10 @@ "UserUpdateRequestUser" ] }, + "UserAvatarOperations_updateUserAvatar": { + "usage": "let image = Data()\nlet response = try await client.users.updateUserAvatar(userId: 12, image: image)", + "output": "AvatarData(imageUrl: String)" + }, "UserStatusOperations_updateUserStatus": { "usage": "let body = StatusUpdateRequest(\n status: StatusUpdateRequestStatus(\n emoji: \"🎮\",\n title: \"Очень занят\",\n expiresAt: \"2024-04-08T10:00:00.000Z\",\n isAway: true,\n awayMessage: \"Вернусь после 15:00\"\n )\n)\nlet response = try await client.users.updateUserStatus(userId: 12, body: body)", "output": "UserStatus(emoji: String, title: String, expiresAt: String?, isAway: Bool, awayMessage: UserStatusAwayMessage(text: String)?)", @@ -349,6 +362,9 @@ "UserOperations_deleteUser": { "usage": "try await client.users.deleteUser(id: 12)" }, + "UserAvatarOperations_deleteUserAvatar": { + "usage": "try await client.users.deleteUserAvatar(userId: 12)" + }, "UserStatusOperations_deleteUserStatus": { "usage": "try await client.users.deleteUserStatus(userId: 12)" }, diff --git a/sdk/typescript/src/generated/client.ts b/sdk/typescript/src/generated/client.ts index 1e0569fb..a8f706fb 100644 --- a/sdk/typescript/src/generated/client.ts +++ b/sdk/typescript/src/generated/client.ts @@ -44,6 +44,7 @@ import { ListReadMembersParams, Thread, AccessTokenInfo, + AvatarData, StatusUpdateRequest, UserStatus, SearchChatsParams, @@ -188,7 +189,8 @@ class ChatsService { async listChats(params?: ListChatsParams): Promise { const query = new URLSearchParams(); - if (params?.sortId !== undefined) query.set("sort[id]", params.sortId); + if (params?.sort !== undefined) query.set("sort", params.sort); + if (params?.order !== undefined) query.set("order", params.order); if (params?.availability !== undefined) query.set("availability", params.availability); if (params?.lastMessageAtAfter !== undefined) query.set("last_message_at_after", params.lastMessageAtAfter); if (params?.lastMessageAtBefore !== undefined) query.set("last_message_at_before", params.lastMessageAtBefore); @@ -678,7 +680,8 @@ class MessagesService { async listChatMessages(params: ListChatMessagesParams): Promise { const query = new URLSearchParams(); query.set("chat_id", String(params.chatId)); - if (params?.sortId !== undefined) query.set("sort[id]", params.sortId); + if (params?.sort !== undefined) query.set("sort", params.sort); + if (params?.order !== undefined) query.set("order", params.order); if (params?.limit !== undefined) query.set("limit", String(params.limit)); if (params?.cursor !== undefined) query.set("cursor", params.cursor); const response = await fetchWithRetry(`${this.baseUrl}/messages?${query}`, { @@ -1013,6 +1016,25 @@ class ProfileService { } } + async updateProfileAvatar(image: Blob): Promise { + const form = new FormData(); + form.set("image", image, "upload"); + const response = await fetchWithRetry(`${this.baseUrl}/profile/avatar`, { + method: "PUT", + headers: this.headers, + body: form, + }); + const body = await response.json(); + switch (response.status) { + case 200: + return deserialize(body.data) as AvatarData; + case 401: + throw new OAuthError(body.error); + default: + throw new ApiError(body.errors); + } + } + async updateStatus(request: StatusUpdateRequest): Promise { const response = await fetchWithRetry(`${this.baseUrl}/profile/status`, { method: "PUT", @@ -1030,6 +1052,21 @@ class ProfileService { } } + async deleteProfileAvatar(): Promise { + const response = await fetchWithRetry(`${this.baseUrl}/profile/avatar`, { + method: "DELETE", + headers: this.headers, + }); + switch (response.status) { + case 204: + return; + case 401: + throw new OAuthError(((await response.json()) as any).error); + default: + throw new ApiError(((await response.json()) as any).errors); + } + } + async deleteStatus(): Promise { const response = await fetchWithRetry(`${this.baseUrl}/profile/status`, { method: "DELETE", @@ -1376,6 +1413,25 @@ class UsersService { } } + async updateUserAvatar(userId: number, image: Blob): Promise { + const form = new FormData(); + form.set("image", image, "upload"); + const response = await fetchWithRetry(`${this.baseUrl}/users/${userId}/avatar`, { + method: "PUT", + headers: this.headers, + body: form, + }); + const body = await response.json(); + switch (response.status) { + case 200: + return deserialize(body.data) as AvatarData; + case 401: + throw new OAuthError(body.error); + default: + throw new ApiError(body.errors); + } + } + async updateUserStatus(userId: number, request: StatusUpdateRequest): Promise { const response = await fetchWithRetry(`${this.baseUrl}/users/${userId}/status`, { method: "PUT", @@ -1408,6 +1464,21 @@ class UsersService { } } + async deleteUserAvatar(userId: number): Promise { + const response = await fetchWithRetry(`${this.baseUrl}/users/${userId}/avatar`, { + method: "DELETE", + headers: this.headers, + }); + switch (response.status) { + case 204: + return; + case 401: + throw new OAuthError(((await response.json()) as any).error); + default: + throw new ApiError(((await response.json()) as any).errors); + } + } + async deleteUserStatus(userId: number): Promise { const response = await fetchWithRetry(`${this.baseUrl}/users/${userId}/status`, { method: "DELETE", diff --git a/sdk/typescript/src/generated/examples.json b/sdk/typescript/src/generated/examples.json index a2535929..268e58f5 100644 --- a/sdk/typescript/src/generated/examples.json +++ b/sdk/typescript/src/generated/examples.json @@ -29,10 +29,11 @@ "usage": "client.bots.deleteWebhookEvent(\"01KAJZ2XDSS2S3DSW9EXJZ0TBV\")" }, "ChatOperations_listChats": { - "usage": "const response = client.chats.listChats({\n sortId: SortOrder.Desc,\n availability: ChatAvailability.IsMember,\n lastMessageAtAfter: \"2025-01-01T00:00:00.000Z\",\n lastMessageAtBefore: \"2025-02-01T00:00:00.000Z\",\n personal: false,\n limit: 1,\n cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n})", + "usage": "const response = client.chats.listChats({\n sort: ChatSortField.Id,\n order: SortOrder.Desc,\n availability: ChatAvailability.IsMember,\n lastMessageAtAfter: \"2025-01-01T00:00:00.000Z\",\n lastMessageAtBefore: \"2025-02-01T00:00:00.000Z\",\n personal: false,\n limit: 1,\n cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n})", "output": "ListChatsResponse({ data: Chat[], meta: PaginationMeta })", "imports": [ "ChatAvailability", + "ChatSortField", "SortOrder" ] }, @@ -152,9 +153,10 @@ "usage": "client.groupTags.deleteTag(9111)" }, "ChatMessageOperations_listChatMessages": { - "usage": "const response = client.messages.listChatMessages({\n chatId: 198,\n sortId: SortOrder.Desc,\n limit: 1,\n cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n})", + "usage": "const response = client.messages.listChatMessages({\n chatId: 198,\n sort: MessageSortField.Id,\n order: SortOrder.Desc,\n limit: 1,\n cursor: \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n})", "output": "ListChatMessagesResponse({ data: Message[], meta: PaginationMeta })", "imports": [ + "MessageSortField", "SortOrder" ] }, @@ -239,6 +241,10 @@ "usage": "const response = client.profile.getStatus()", "output": "unknown" }, + "ProfileAvatarOperations_updateProfileAvatar": { + "usage": "const image = new Blob([])\nconst response = client.profile.updateProfileAvatar(image)", + "output": "AvatarData({ imageUrl: string })" + }, "ProfileOperations_updateStatus": { "usage": "const request: StatusUpdateRequest = {\n status: {\n emoji: \"🎮\",\n title: \"Очень занят\",\n expiresAt: \"2024-04-08T10:00:00.000Z\",\n isAway: true,\n awayMessage: \"Вернусь после 15:00\"\n }\n}\nconst response = client.profile.updateStatus(request)", "output": "UserStatus({ emoji: string, title: string, expiresAt: string | null, isAway: boolean, awayMessage: UserStatusAwayMessage({ text: string }) | null })", @@ -247,6 +253,9 @@ "StatusUpdateRequestStatus" ] }, + "ProfileAvatarOperations_deleteProfileAvatar": { + "usage": "client.profile.deleteProfileAvatar()" + }, "ProfileOperations_deleteStatus": { "usage": "client.profile.deleteStatus()" }, @@ -338,6 +347,10 @@ "UserUpdateRequestUser" ] }, + "UserAvatarOperations_updateUserAvatar": { + "usage": "const image = new Blob([])\nconst response = client.users.updateUserAvatar(12, image)", + "output": "AvatarData({ imageUrl: string })" + }, "UserStatusOperations_updateUserStatus": { "usage": "const request: StatusUpdateRequest = {\n status: {\n emoji: \"🎮\",\n title: \"Очень занят\",\n expiresAt: \"2024-04-08T10:00:00.000Z\",\n isAway: true,\n awayMessage: \"Вернусь после 15:00\"\n }\n}\nconst response = client.users.updateUserStatus(12, request)", "output": "UserStatus({ emoji: string, title: string, expiresAt: string | null, isAway: boolean, awayMessage: UserStatusAwayMessage({ text: string }) | null })", @@ -349,6 +362,9 @@ "UserOperations_deleteUser": { "usage": "client.users.deleteUser(12)" }, + "UserAvatarOperations_deleteUserAvatar": { + "usage": "client.users.deleteUserAvatar(12)" + }, "UserStatusOperations_deleteUserStatus": { "usage": "client.users.deleteUserStatus(12)" }, diff --git a/sdk/typescript/src/generated/types.ts b/sdk/typescript/src/generated/types.ts index 45fd1f57..0c17b10a 100644 --- a/sdk/typescript/src/generated/types.ts +++ b/sdk/typescript/src/generated/types.ts @@ -104,6 +104,14 @@ export enum ChatMemberRoleFilter { Member = "member", } +/** Поле сортировки чатов */ +export enum ChatSortField { + /** По идентификатору чата */ + Id = "id", + /** По дате и времени создания последнего сообщения */ + LastMessageAt = "last_message_at", +} + /** Тип чата */ export enum ChatSubtype { /** Канал или беседа */ @@ -158,6 +166,11 @@ export enum MessageEntityType { User = "user", } +export enum MessageSortField { + /** По идентификатору сообщения */ + Id = "id", +} + /** Скоуп доступа OAuth токена */ export enum OAuthScope { /** Просмотр чатов и списка чатов */ @@ -218,10 +231,14 @@ export enum OAuthScope { ProfileStatusRead = "profile_status:read", /** Изменение и удаление статуса профиля */ ProfileStatusWrite = "profile_status:write", + /** Изменение и удаление аватара профиля */ + ProfileAvatarWrite = "profile_avatar:write", /** Просмотр статуса сотрудника */ UserStatusRead = "user_status:read", /** Изменение и удаление статуса сотрудника */ UserStatusWrite = "user_status:write", + /** Изменение и удаление аватара сотрудника */ + UserAvatarWrite = "user_avatar:write", /** Просмотр дополнительных полей */ CustomPropertiesRead = "custom_properties:read", /** Просмотр журнала аудита */ @@ -557,6 +574,10 @@ export interface AuditEvent { userAgent: string; } +export interface AvatarData { + imageUrl: string; +} + export interface BotResponse { id: number; webhook: { @@ -1178,6 +1199,14 @@ export interface WebhookMessageThread { messageChatId: number; } +export interface UpdateProfileAvatarRequest { + image: Blob; +} + +export interface UpdateUserAvatarRequest { + image: Blob; +} + export type AuditEventDetailsUnion = AuditDetailsEmpty | AuditDetailsUserUpdated | AuditDetailsRoleChanged | AuditDetailsTagName | AuditDetailsInitiator | AuditDetailsInviter | AuditDetailsChatRenamed | AuditDetailsChatPermission | AuditDetailsTagChat | AuditDetailsChatId | AuditDetailsTokenScopes | AuditDetailsKms | AuditDetailsDlp | AuditDetailsSearch; export type ViewBlockUnion = ViewBlockHeader | ViewBlockPlainText | ViewBlockMarkdown | ViewBlockDivider | ViewBlockInput | ViewBlockSelect | ViewBlockRadio | ViewBlockCheckbox | ViewBlockDate | ViewBlockTime | ViewBlockFileInput; @@ -1197,7 +1226,8 @@ export interface GetAuditEventsParams { } export interface ListChatsParams { - sortId?: SortOrder; + sort?: ChatSortField; + order?: SortOrder; availability?: ChatAvailability; lastMessageAtAfter?: string; lastMessageAtBefore?: string; @@ -1229,7 +1259,8 @@ export interface GetTagUsersParams { export interface ListChatMessagesParams { chatId: number; - sortId?: SortOrder; + sort?: MessageSortField; + order?: SortOrder; limit?: number; cursor?: string; } diff --git a/skills/pachca-profile/SKILL.md b/skills/pachca-profile/SKILL.md index 8a4df339..a5fd95df 100644 --- a/skills/pachca-profile/SKILL.md +++ b/skills/pachca-profile/SKILL.md @@ -102,6 +102,23 @@ Help: `npx @pachca/cli --help` | Workflows: `npx @pachca/cli guide` > Кастомные поля настраиваются администратором пространства. +### Загрузить аватар профиля + +1. Загрузи аватар из файла: + ```bash + pachca profile update-avatar --file=<путь_к_файлу> + ``` + > Файл изображения передается в формате multipart/form-data + + +### Удалить аватар профиля + +1. Удали аватар: + ```bash + pachca profile delete-avatar --force + ``` + + ## Limitations - Rate limit: ~50 req/sec. On 429 — wait and retry. @@ -115,6 +132,8 @@ Help: `npx @pachca/cli --help` | Workflows: `npx @pachca/cli guide` | GET | /custom_properties | Список дополнительных полей | | GET | /oauth/token/info | Информация о токене | | GET | /profile | Информация о профиле | +| PUT | /profile/avatar | Загрузка аватара | +| DELETE | /profile/avatar | Удаление аватара | | GET | /profile/status | Текущий статус | | PUT | /profile/status | Новый статус | | DELETE | /profile/status | Удаление статуса | diff --git a/skills/pachca-users/SKILL.md b/skills/pachca-users/SKILL.md index 8d28d6b5..b11fc1ae 100644 --- a/skills/pachca-users/SKILL.md +++ b/skills/pachca-users/SKILL.md @@ -158,6 +158,24 @@ Help: `npx @pachca/cli --help` | Workflows: `npx @pachca/cli guide` ``` +### Загрузить аватар сотрудника + +1. Загрузи аватар сотруднику: + ```bash + pachca users update-avatar --file=<путь_к_файлу> + ``` + > Требует прав администратора. Файл передается в формате multipart/form-data + + +### Удалить аватар сотрудника + +1. Удали аватар сотрудника: + ```bash + pachca users remove-avatar --force + ``` + > Требует прав администратора + + ## Limitations - Rate limit: ~50 req/sec. On 429 — wait and retry. @@ -181,6 +199,8 @@ Help: `npx @pachca/cli --help` | Workflows: `npx @pachca/cli guide` | GET | /users/{id} | Информация о сотруднике | | PUT | /users/{id} | Редактирование сотрудника | | DELETE | /users/{id} | Удаление сотрудника | +| PUT | /users/{user_id}/avatar | Загрузка аватара сотрудника | +| DELETE | /users/{user_id}/avatar | Удаление аватара сотрудника | | GET | /users/{user_id}/status | Статус сотрудника | | PUT | /users/{user_id}/status | Новый статус сотрудника | | DELETE | /users/{user_id}/status | Удаление статуса сотрудника | From d6a7ff280ed8452f4c09e02a0d0734cce5e226bf Mon Sep 17 00:00:00 2001 From: lookinway Date: Mon, 6 Apr 2026 22:45:41 +0300 Subject: [PATCH 19/37] fix: remove form templates from n8n, add CLI avatars and sorting defaults - Remove FORM_TEMPLATES and template builder mode from n8n node (reviewer requirement) - Add CLI changelog entry for 2026.4.1 (avatars, sorting) - Fix CLI sort/order defaults for chats and messages list - Regenerate docs (updates.md, llms-full.txt) --- apps/docs/public/llms-full.txt | 19 +-- apps/docs/public/updates.md | 19 +-- .../n8n/nodes/Pachca/GenericFunctions.ts | 147 +----------------- integrations/n8n/nodes/Pachca/SharedRouter.ts | 11 -- .../n8n/nodes/Pachca/V1/FormDescription.ts | 56 +------ .../n8n/nodes/Pachca/V2/FormDescription.ts | 29 +--- integrations/n8n/scripts/generate-n8n.ts | 46 +----- integrations/n8n/tests/compatibility.test.ts | 34 ++-- integrations/n8n/tests/contract.test.ts | 2 +- .../n8n/tests/execute-helpers.test.ts | 30 ---- integrations/n8n/tests/router.test.ts | 16 -- integrations/n8n/tests/routes-spec.test.ts | 1 - packages/cli/CHANGELOG.md | 9 ++ packages/cli/oclif.manifest.json | 2 +- packages/cli/scripts/openapi-parser.ts | 5 +- packages/cli/src/commands/chats/list.ts | 3 + packages/cli/src/commands/members/list.ts | 1 + packages/cli/src/commands/messages/list.ts | 2 + packages/cli/src/data/changelog.json | 10 ++ 19 files changed, 59 insertions(+), 383 deletions(-) diff --git a/apps/docs/public/llms-full.txt b/apps/docs/public/llms-full.txt index 8b963c29..2b7742dc 100644 --- a/apps/docs/public/llms-full.txt +++ b/apps/docs/public/llms-full.txt @@ -7181,7 +7181,7 @@ Albato — платформа для интеграции различных с -## Аватары пользователей +## Аватары, сортировка и n8n Node v2 Были добавлены новые методы для управления аватарами: @@ -7192,20 +7192,7 @@ Albato — платформа для интеграции различных с С помощью этих методов вы можете загружать и удалять аватары для своего профиля и для сотрудников вашей компании. - - -## Параметры сортировки - -Были обновлены следующие методы: - -- [Список чатов](GET /chats) -- [Список сообщений чата](GET /messages) - -Добавлен новый формат параметров сортировки: `sort` (поле сортировки) и `order` (направление: `asc` или `desc`). - - - -## n8n Node v2 +В методах [Список чатов](GET /chats) и [Список сообщений чата](GET /messages) добавлен новый формат параметров сортировки: `sort` (поле сортировки) и `order` (направление: `asc` или `desc`). Расширение [n8n](/guides/n8n/overview) для Пачки обновлено до версии 2.0.0. Нода автоматически генерируется из OpenAPI-спецификации и всегда синхронизирована с актуальным API. @@ -7216,6 +7203,8 @@ Albato — платформа для интеграции различных с - **AI Tool Use** — использование узлов как инструментов AI Agent - **Полная [обратная совместимость](/guides/n8n/migration)** — все существующие workflow на v1 продолжают работать без изменений +В [CLI](/guides/cli) добавлены команды для управления аватарами и обновлены параметры сортировки (`--sort` и `--order`). Все 6 SDK обновлены: [TypeScript](/guides/sdk/typescript), [Python](/guides/sdk/python), [Go](/guides/sdk/go), [Kotlin](/guides/sdk/kotlin), [Swift](/guides/sdk/swift) и [C#](/guides/sdk/csharp). + ## C# SDK diff --git a/apps/docs/public/updates.md b/apps/docs/public/updates.md index a73aa801..8f383042 100644 --- a/apps/docs/public/updates.md +++ b/apps/docs/public/updates.md @@ -6,7 +6,7 @@ -## Аватары пользователей +## Аватары, сортировка и n8n Node v2 Были добавлены новые методы для управления аватарами: @@ -17,20 +17,7 @@ С помощью этих методов вы можете загружать и удалять аватары для своего профиля и для сотрудников вашей компании. - - -## Параметры сортировки - -Были обновлены следующие методы: - -- [Список чатов](GET /chats) -- [Список сообщений чата](GET /messages) - -Добавлен новый формат параметров сортировки: `sort` (поле сортировки) и `order` (направление: `asc` или `desc`). - - - -## n8n Node v2 +В методах [Список чатов](GET /chats) и [Список сообщений чата](GET /messages) добавлен новый формат параметров сортировки: `sort` (поле сортировки) и `order` (направление: `asc` или `desc`). Расширение [n8n](/guides/n8n/overview) для Пачки обновлено до версии 2.0.0. Нода автоматически генерируется из OpenAPI-спецификации и всегда синхронизирована с актуальным API. @@ -41,6 +28,8 @@ - **AI Tool Use** — использование узлов как инструментов AI Agent - **Полная [обратная совместимость](/guides/n8n/migration)** — все существующие workflow на v1 продолжают работать без изменений +В [CLI](/guides/cli) добавлены команды для управления аватарами и обновлены параметры сортировки (`--sort` и `--order`). Все 6 SDK обновлены: [TypeScript](/guides/sdk/typescript), [Python](/guides/sdk/python), [Go](/guides/sdk/go), [Kotlin](/guides/sdk/kotlin), [Swift](/guides/sdk/swift) и [C#](/guides/sdk/csharp). + ## C# SDK diff --git a/integrations/n8n/nodes/Pachca/GenericFunctions.ts b/integrations/n8n/nodes/Pachca/GenericFunctions.ts index d42fff22..37f24d38 100644 --- a/integrations/n8n/nodes/Pachca/GenericFunctions.ts +++ b/integrations/n8n/nodes/Pachca/GenericFunctions.ts @@ -59,145 +59,6 @@ const SIMPLIFY_FIELDS: Record = { export: ['id', 'status', 'created_at'], }; -// ============================================================================ -// FORM TEMPLATES -// ============================================================================ - -/** - * Predefined form templates for the template builder mode. - * Each template is an array of ViewBlock objects matching the Pachca forms API. - */ -export const FORM_TEMPLATES: Record = { - feedback: [ - { type: 'header', text: 'Обратная связь' }, - { - type: 'input', - name: 'feedback', - label: 'Ваш отзыв', - multiline: true, - required: true, - placeholder: 'Опишите ваш опыт...', - }, - { - type: 'select', - name: 'rating', - label: 'Оценка', - required: true, - options: [ - { text: '⭐ Отлично', value: '5' }, - { text: '👍 Хорошо', value: '4' }, - { text: '👌 Нормально', value: '3' }, - { text: '👎 Плохо', value: '2' }, - { text: '❌ Ужасно', value: '1' }, - ], - }, - ], - timeoff: [ - { type: 'header', text: 'Заявка на отпуск' }, - { type: 'date', name: 'date_start', label: 'Дата начала', required: true }, - { type: 'date', name: 'date_end', label: 'Дата окончания', required: true }, - { - type: 'radio', - name: 'accessibility', - label: 'Доступность', - options: [ - { text: 'Только телефон', value: 'phone_only' }, - { text: 'Телефон и мессенджер', value: 'phone_and_messenger' }, - { text: 'Недоступен', value: 'unavailable' }, - ], - }, - { - type: 'input', - name: 'info', - label: 'Комментарий', - multiline: true, - placeholder: 'Дополнительная информация...', - }, - { - type: 'file_input', - name: 'documents', - label: 'Документы', - max_files: 5, - }, - ], - survey: [ - { type: 'header', text: 'Опрос' }, - { - type: 'radio', - name: 'satisfaction', - label: 'Насколько вы довольны?', - required: true, - options: [ - { text: 'Полностью доволен', value: 'very_satisfied' }, - { text: 'Скорее доволен', value: 'satisfied' }, - { text: 'Скорее недоволен', value: 'dissatisfied' }, - { text: 'Совсем не доволен', value: 'very_dissatisfied' }, - ], - }, - { - type: 'checkbox', - name: 'features', - label: 'Какие функции вы используете?', - options: [ - { text: 'Чаты', value: 'chats' }, - { text: 'Задачи', value: 'tasks' }, - { text: 'Боты', value: 'bots' }, - { text: 'Формы', value: 'forms' }, - ], - }, - { - type: 'input', - name: 'suggestions', - label: 'Предложения по улучшению', - multiline: true, - }, - ], - bug_report: [ - { type: 'header', text: 'Отчёт об ошибке' }, - { - type: 'input', - name: 'title', - label: 'Краткое описание', - required: true, - placeholder: 'Что произошло?', - }, - { - type: 'input', - name: 'steps', - label: 'Шаги воспроизведения', - multiline: true, - required: true, - placeholder: '1. Открыть...\n2. Нажать...\n3. Увидеть ошибку', - }, - { - type: 'select', - name: 'severity', - label: 'Серьёзность', - required: true, - options: [ - { text: 'Критическая', value: 'critical' }, - { text: 'Высокая', value: 'high' }, - { text: 'Средняя', value: 'medium' }, - { text: 'Низкая', value: 'low' }, - ], - }, - { - type: 'file_input', - name: 'screenshots', - label: 'Скриншоты', - filetypes: ['png', 'jpg', 'gif', 'webp'], - max_files: 5, - }, - ], -}; - -// v1 backward compat: old template keys → same blocks as v2 equivalents -FORM_TEMPLATES.timeoff_request = FORM_TEMPLATES.timeoff; -FORM_TEMPLATES.feedback_form = FORM_TEMPLATES.feedback; -FORM_TEMPLATES.survey_form = FORM_TEMPLATES.survey; -FORM_TEMPLATES.task_request = FORM_TEMPLATES.bug_report; -FORM_TEMPLATES.access_request = FORM_TEMPLATES.feedback; - // ============================================================================ // WEBHOOK SIGNATURE VERIFICATION // ============================================================================ @@ -736,7 +597,7 @@ export function cleanFileAttachments( } /** - * Resolve form blocks from builder mode, template, or JSON input. + * Resolve form blocks from builder mode or JSON input. * Works with IExecuteFunctions context (execute() mode). */ export function resolveFormBlocksFromParams( @@ -810,12 +671,6 @@ export function resolveFormBlocksFromParams( return blocks; } - if (builderMode === 'template') { - let templateName: string; - try { templateName = ctx.getNodeParameter('formTemplate', itemIndex, '') as string; } catch { return []; } - return FORM_TEMPLATES[templateName] ?? []; - } - // JSON mode let rawBlocks: string; try { rawBlocks = ctx.getNodeParameter('formBlocks', itemIndex, '') as string; } catch { rawBlocks = ''; } diff --git a/integrations/n8n/nodes/Pachca/SharedRouter.ts b/integrations/n8n/nodes/Pachca/SharedRouter.ts index 225af4a6..883160ae 100644 --- a/integrations/n8n/nodes/Pachca/SharedRouter.ts +++ b/integrations/n8n/nodes/Pachca/SharedRouter.ts @@ -15,7 +15,6 @@ import { uploadAvatar, splitAndValidateCommaList, simplifyItem, - FORM_TEMPLATES, sanitizeBaseUrl, } from './GenericFunctions'; @@ -672,11 +671,6 @@ const ROUTES: Record> = { path: '/profile', special: 'formProcessSubmission', }, - getTemplates: { - method: 'GET' as IHttpRequestMethods, - path: '/profile', - special: 'formGetTemplates', - }, }, export: { create: { @@ -777,11 +771,6 @@ async function executeRoute( const inputData = this.getInputData()[i].json; return [{ json: inputData }]; } - if (route.special === 'formGetTemplates') { - return Object.entries(FORM_TEMPLATES).map(([key, blocks]) => ({ - json: { name: key, blocks } as unknown as IDataObject, - })); - } if (route.special === 'exportDownload') { const exportId = this.getNodeParameter('id', i) as number; const credentials = await this.getCredentials('pachcaApi'); diff --git a/integrations/n8n/nodes/Pachca/V1/FormDescription.ts b/integrations/n8n/nodes/Pachca/V1/FormDescription.ts index 05426271..8f11d243 100644 --- a/integrations/n8n/nodes/Pachca/V1/FormDescription.ts +++ b/integrations/n8n/nodes/Pachca/V1/FormDescription.ts @@ -24,13 +24,7 @@ export const formOperations: INodeProperties[] = [ action: 'Process form submission', description: 'Handle form submit and send response', }, - { - name: 'Get form templates', - value: 'getTemplates', - action: 'Get form templates', - description: 'Get list of available form templates', - }, - ], + ], default: 'createView', displayOptions: { show: { @@ -46,11 +40,6 @@ export const formFields: INodeProperties[] = [ name: 'formBuilderMode', type: 'options', options: [ - { - name: '📋 Use Template', - value: 'template', - description: 'Use preset template', - }, { name: '🎨 Visual Builder', value: 'builder', @@ -62,7 +51,7 @@ export const formFields: INodeProperties[] = [ description: 'Edit JSON directly', }, ], - default: 'template', + default: 'builder', description: 'Form creation method', displayOptions: { show: { @@ -71,47 +60,6 @@ export const formFields: INodeProperties[] = [ }, }, }, - { - displayName: 'Form Template', - name: 'formTemplate', - type: 'options', - options: [ - { - name: '📋 Timeoff Request', - value: 'timeoff_request', - description: 'Time-off request form', - }, - { - name: '💬 Feedback Form', - value: 'feedback_form', - description: 'Feedback form', - }, - { - name: '📝 Task Request', - value: 'task_request', - description: 'Task creation form', - }, - { - name: '📊 Survey Form', - value: 'survey_form', - description: 'Survey form', - }, - { - name: '🔐 Access Request', - value: 'access_request', - description: 'Access request form', - }, - ], - default: 'timeoff_request', - description: 'Select form template', - displayOptions: { - show: { - resource: ['form'], - operation: ['createView'], - formBuilderMode: ['template'], - }, - }, - }, { displayName: 'Form Title', name: 'formTitle', diff --git a/integrations/n8n/nodes/Pachca/V2/FormDescription.ts b/integrations/n8n/nodes/Pachca/V2/FormDescription.ts index 3120065f..dcf1f85f 100644 --- a/integrations/n8n/nodes/Pachca/V2/FormDescription.ts +++ b/integrations/n8n/nodes/Pachca/V2/FormDescription.ts @@ -104,33 +104,13 @@ export const formFields: INodeProperties[] = [ name: 'formBuilderMode', type: 'options', options: [ - { name: 'Template', value: 'template', displayOptions: { show: { '@version': [1] } } }, { name: 'Visual Builder', value: 'builder' }, { name: 'JSON', value: 'json' }, ], default: 'builder', - description: 'Build form visually, use a template, or paste JSON', + description: 'Build form visually or paste JSON', displayOptions: { show: { resource: ['form'], operation: ['create'] } }, }, - { - displayName: 'Template', - name: 'formTemplate', - type: 'options', - options: [ - { name: 'Access Request (V1)', value: 'access_request', description: 'Access request form' }, - { name: 'Bug Report', value: 'bug_report', description: 'Bug report with severity and screenshots' }, - { name: 'Feedback', value: 'feedback', description: 'Collect user feedback with rating' }, - { name: 'Feedback Form (V1)', value: 'feedback_form', description: 'Feedback form' }, - { name: 'Survey', value: 'survey', description: 'Multi-question survey with radio and checkboxes' }, - { name: 'Survey Form (V1)', value: 'survey_form', description: 'Survey form' }, - { name: 'Task Request (V1)', value: 'task_request', description: 'Task creation form' }, - { name: 'Time Off Request', value: 'timeoff', description: 'Vacation request with dates and documents' }, - { name: 'Time-Off Request (V1)', value: 'timeoff_request', description: 'Time-off request form' }, - ], - default: 'feedback', - description: 'Select a predefined form template', - displayOptions: { show: { resource: ['form'], operation: ['create'], formBuilderMode: ['template'] } }, - }, { displayName: 'Form Blocks', name: 'formBlocks', @@ -327,11 +307,4 @@ export const formFields: INodeProperties[] = [ description: 'Validation errors to send to user (JSON object with field names and messages)', displayOptions: { show: { resource: ['form'], operation: ['processSubmission'] } }, }, - { - displayName: 'This operation is deprecated. In v2, form templates are available directly in the Visual Builder mode when creating a form.', - name: 'getTemplatesNotice', - type: 'notice', - default: '', - displayOptions: { show: { resource: ['form'], operation: ['getTemplates'] } }, - }, ]; \ No newline at end of file diff --git a/integrations/n8n/scripts/generate-n8n.ts b/integrations/n8n/scripts/generate-n8n.ts index 1769be5b..c3f158fd 100644 --- a/integrations/n8n/scripts/generate-n8n.ts +++ b/integrations/n8n/scripts/generate-n8n.ts @@ -94,7 +94,7 @@ const V1_COMPAT_PARAMS: Record>> = update: { id: 'botId', outgoingUrl: 'webhookUrl' }, }, form: { - createView: { title: 'formTitle', blocks: 'formBlocks', builderMode: 'formBuilderMode', template: 'formTemplate' }, + createView: { title: 'formTitle', blocks: 'formBlocks', builderMode: 'formBuilderMode' }, }, }; @@ -1012,7 +1012,7 @@ function generateResourceDescription( lines.push(`\t},`); } - // Query parameters (non-pagination, skip template params with {}) + // Query parameters (non-pagination, skip parameterized params with {}) // Primary query params are required or named 'query' (shown top-level for all resources) const PRIMARY_QUERY_PARAMS = new Set(['query']); // Resources where optional query params should be wrapped in Additional Fields @@ -1188,42 +1188,19 @@ function generateResourceDescription( // Form builder for form create/createView (Phase 13) if (resource === 'form' && (op.v2Op === 'create' || op.v1Op === 'createView')) { - // Builder mode selector: Template (v1 only) / Visual Builder / JSON + // Builder mode selector: Visual Builder / JSON lines.push(`\t{`); lines.push(`\t\tdisplayName: 'Builder Mode',`); lines.push(`\t\tname: 'formBuilderMode',`); lines.push(`\t\ttype: 'options',`); lines.push(`\t\toptions: [`); - lines.push(`\t\t\t{ name: 'Template', value: 'template', displayOptions: { show: { '@version': [1] } } },`); lines.push(`\t\t\t{ name: 'Visual Builder', value: 'builder' },`); lines.push(`\t\t\t{ name: 'JSON', value: 'json' },`); lines.push(`\t\t],`); lines.push(`\t\tdefault: 'builder',`); - lines.push(`\t\tdescription: 'Build form visually, use a template, or paste JSON',`); + lines.push(`\t\tdescription: 'Build form visually or paste JSON',`); lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}] } },`); lines.push(`\t},`); - // Template selector (v1 only, shown in template mode) - lines.push(`\t{`); - lines.push(`\t\tdisplayName: 'Template',`); - lines.push(`\t\tname: 'formTemplate',`); - lines.push(`\t\ttype: 'options',`); - lines.push(`\t\toptions: [`); - // Sorted alphabetically by name (n8n lint: node-param-options-type-unsorted-items) - // All option names must be title-cased (n8n lint: node-param-display-name-miscased) - lines.push(`\t\t\t{ name: 'Access Request (V1)', value: 'access_request', description: 'Access request form' },`); - lines.push(`\t\t\t{ name: 'Bug Report', value: 'bug_report', description: 'Bug report with severity and screenshots' },`); - lines.push(`\t\t\t{ name: 'Feedback', value: 'feedback', description: 'Collect user feedback with rating' },`); - lines.push(`\t\t\t{ name: 'Feedback Form (V1)', value: 'feedback_form', description: 'Feedback form' },`); - lines.push(`\t\t\t{ name: 'Survey', value: 'survey', description: 'Multi-question survey with radio and checkboxes' },`); - lines.push(`\t\t\t{ name: 'Survey Form (V1)', value: 'survey_form', description: 'Survey form' },`); - lines.push(`\t\t\t{ name: 'Task Request (V1)', value: 'task_request', description: 'Task creation form' },`); - lines.push(`\t\t\t{ name: 'Time Off Request', value: 'timeoff', description: 'Vacation request with dates and documents' },`); - lines.push(`\t\t\t{ name: 'Time-Off Request (V1)', value: 'timeoff_request', description: 'Time-off request form' },`); - lines.push(`\t\t],`); - lines.push(`\t\tdefault: 'feedback',`); - lines.push(`\t\tdescription: 'Select a predefined form template',`); - lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: [${allOpValues.map(quote).join(', ')}], formBuilderMode: ['template'] } },`); - lines.push(`\t},`); // Visual builder — fixedCollection with all block types (shown in builder mode) lines.push(`\t{`); lines.push(`\t\tdisplayName: 'Form Blocks',`); @@ -1442,14 +1419,6 @@ function generateResourceDescription( lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: ['processSubmission'] } },`); lines.push(`\t},`); - // v1-only getTemplates notice - lines.push(`\t{`); - lines.push(`\t\tdisplayName: 'This operation is deprecated. In v2, form templates are available directly in the Visual Builder mode when creating a form.',`); - lines.push(`\t\tname: 'getTemplatesNotice',`); - lines.push(`\t\ttype: 'notice',`); - lines.push(`\t\tdefault: '',`); - lines.push(`\t\tdisplayOptions: { show: { resource: [${allResourceValues.map(quote).join(', ')}], operation: ['getTemplates'] } },`); - lines.push(`\t},`); } } @@ -2753,7 +2722,6 @@ function generateRouter(resourceOperations: Map): strin // V1-only form operations (no real API call) if (resource === 'form') { opEntries.push(`\t\tprocessSubmission: {\n\t\t\tmethod: 'GET' as IHttpRequestMethods,\n\t\t\tpath: '/profile',\n\t\t\tspecial: 'formProcessSubmission',\n\t\t}`); - opEntries.push(`\t\tgetTemplates: {\n\t\t\tmethod: 'GET' as IHttpRequestMethods,\n\t\t\tpath: '/profile',\n\t\t\tspecial: 'formGetTemplates',\n\t\t}`); } if (opEntries.length) { routeBlocks.push(`\t${resource}: {\n${opEntries.join(',\n')},\n\t}`); @@ -2787,7 +2755,6 @@ import { \tuploadAvatar, \tsplitAndValidateCommaList, \tsimplifyItem, -\tFORM_TEMPLATES, \tsanitizeBaseUrl, } from './GenericFunctions'; @@ -2918,11 +2885,6 @@ async function executeRoute( \t\tconst inputData = this.getInputData()[i].json; \t\treturn [{ json: inputData }]; \t} -\tif (route.special === 'formGetTemplates') { -\t\treturn Object.entries(FORM_TEMPLATES).map(([key, blocks]) => ({ -\t\t\tjson: { name: key, blocks } as unknown as IDataObject, -\t\t})); -\t} \tif (route.special === 'exportDownload') { \t\tconst exportId = this.getNodeParameter('id', i) as number; \t\tconst credentials = await this.getCredentials('pachcaApi'); diff --git a/integrations/n8n/tests/compatibility.test.ts b/integrations/n8n/tests/compatibility.test.ts index 439a2dc7..0a93c3de 100644 --- a/integrations/n8n/tests/compatibility.test.ts +++ b/integrations/n8n/tests/compatibility.test.ts @@ -577,10 +577,10 @@ describe('V1 top-level field duplicates', () => { }); // ============================================================================ -// NO TEMPLATE PARAMETERS (V2 files) +// NO PARAMETERIZED QUERY PARAMS (V2 files) // ============================================================================ -describe('No template parameters in output', () => { +describe('No parameterized query params in output', () => { it('should not have sort[{field}] parameter in V2 descriptions', () => { const files = fs.readdirSync(V2_DIR).filter(f => f.endsWith('Description.ts')); for (const file of files) { @@ -654,34 +654,26 @@ describe('Visual button constructor', () => { // FORM BUILDER (V2 file) // ============================================================================ -describe('Form builder (templates + JSON)', () => { +describe('Form builder (visual + JSON)', () => { let formContent: string; beforeAll(() => { formContent = fs.readFileSync(path.join(V2_DIR, 'FormDescription.ts'), 'utf-8'); }); - it('formBuilderMode field exists with template and json options', () => { + it('formBuilderMode field exists with builder and json options', () => { expect(formContent).toContain("name: 'formBuilderMode'"); - expect(formContent).toContain("value: 'template'"); + expect(formContent).toContain("value: 'builder'"); expect(formContent).toContain("value: 'json'"); }); - it('formBuilderMode field exists in the form fields section', () => { - expect(formContent).toContain("name: 'formBuilderMode'"); - }); - - it('formTemplate shown only in template mode', () => { - const match = formContent.match(/name: 'formTemplate'[\s\S]*?displayOptions: \{[^}]*formBuilderMode: \[([^\]]+)\]/); - expect(match).toBeTruthy(); - expect(match![1]).toContain("'template'"); - expect(match![1]).not.toContain("'json'"); - }); - - it('formTemplate has all 4 templates', () => { - expect(formContent).toContain("value: 'feedback'"); - expect(formContent).toContain("value: 'timeoff'"); - expect(formContent).toContain("value: 'survey'"); - expect(formContent).toContain("value: 'bug_report'"); + it('formBuilderMode has only builder and json options', () => { + const builderModeMatch = formContent.match(/name: 'formBuilderMode'[\s\S]*?options: \[([\s\S]*?)\]/); + expect(builderModeMatch).toBeTruthy(); + expect(builderModeMatch![1]).toContain("'builder'"); + expect(builderModeMatch![1]).toContain("'json'"); + // Only 2 options + const valueCount = (builderModeMatch![1].match(/value:/g) || []).length; + expect(valueCount).toBe(2); }); it('formBlocks shown for builder and json modes', () => { diff --git a/integrations/n8n/tests/contract.test.ts b/integrations/n8n/tests/contract.test.ts index 84fc938c..c1ed405b 100644 --- a/integrations/n8n/tests/contract.test.ts +++ b/integrations/n8n/tests/contract.test.ts @@ -144,7 +144,7 @@ const V1_COMPAT_PARAMS: Record>> = task: { create: { kind: 'taskKind', content: 'taskContent', dueAt: 'taskDueAt', priority: 'taskPriority' } }, status: { updateStatus: { emoji: 'statusEmoji', title: 'statusTitle', expiresAt: 'statusExpiresAt' } }, bot: { update: { id: 'botId', outgoingUrl: 'webhookUrl' } }, - form: { createView: { title: 'formTitle', blocks: 'formBlocks', builderMode: 'formBuilderMode', template: 'formTemplate' } }, + form: { createView: { title: 'formTitle', blocks: 'formBlocks', builderMode: 'formBuilderMode' } }, }; function getParamName(resource: string, op: string, fieldName: string): string { diff --git a/integrations/n8n/tests/execute-helpers.test.ts b/integrations/n8n/tests/execute-helpers.test.ts index 3e962a87..aefacc0c 100644 --- a/integrations/n8n/tests/execute-helpers.test.ts +++ b/integrations/n8n/tests/execute-helpers.test.ts @@ -10,7 +10,6 @@ import { splitAndValidateCommaList, uploadFileToS3, buildMultipartBody, - FORM_TEMPLATES, } from '../nodes/Pachca/GenericFunctions'; // ============================================================================ @@ -497,35 +496,6 @@ describe('resolveFormBlocksFromParams', () => { }); }); - describe('template mode', () => { - it('should return feedback template', () => { - const ctx = createMockCtx({ - formBuilderMode: 'template', - formTemplate: 'feedback', - }); - const result = resolveFormBlocksFromParams(ctx, 0); - expect(result).toEqual(FORM_TEMPLATES.feedback); - expect(result.length).toBeGreaterThan(0); - }); - - it('should return timeoff template', () => { - const ctx = createMockCtx({ - formBuilderMode: 'template', - formTemplate: 'timeoff', - }); - const result = resolveFormBlocksFromParams(ctx, 0); - expect(result).toEqual(FORM_TEMPLATES.timeoff); - expect(result.length).toBeGreaterThan(0); - }); - - it('should return empty array for unknown template', () => { - const ctx = createMockCtx({ - formBuilderMode: 'template', - formTemplate: 'nonexistent_template', - }); - expect(resolveFormBlocksFromParams(ctx, 0)).toEqual([]); - }); - }); describe('builder mode', () => { it('should build header block', () => { diff --git a/integrations/n8n/tests/router.test.ts b/integrations/n8n/tests/router.test.ts index e2492e40..bf7d616b 100644 --- a/integrations/n8n/tests/router.test.ts +++ b/integrations/n8n/tests/router.test.ts @@ -567,22 +567,6 @@ describe('Special: formProcessSubmission', () => { }); }); -describe('Special: formGetTemplates', () => { - it('returns all templates without API call', async () => { - const ctx = createMockContext({ - resource: 'form', - operation: 'getTemplates', - }); - const result = await runRouter(ctx); - const templateNames = result[0].map((item) => item.json.name); - expect(templateNames).toContain('feedback'); - expect(templateNames).toContain('timeoff'); - expect(templateNames).toContain('survey'); - expect(templateNames).toContain('bug_report'); - expect(ctx._calls).toHaveLength(0); // no API call - }); -}); - // ============================================================================ // SIMPLIFY MODE // ============================================================================ diff --git a/integrations/n8n/tests/routes-spec.test.ts b/integrations/n8n/tests/routes-spec.test.ts index 3f5a53c7..a56be8b8 100644 --- a/integrations/n8n/tests/routes-spec.test.ts +++ b/integrations/n8n/tests/routes-spec.test.ts @@ -125,7 +125,6 @@ const V1_ALIAS_OPS: Record = { // Special operations that don't map directly to an API endpoint const SPECIAL_NON_API_OPS = new Set([ 'form.processSubmission', - 'form.getTemplates', ]); // ============================================================================ diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 3273cb23..8cbc3ea3 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 2026.4.1 (6 апреля 2026) + +- **Добавлено** (profile update-avatar): Загрузка аватара профиля +- **Добавлено** (profile delete-avatar): Удаление аватара профиля +- **Добавлено** (users update-avatar): Загрузка аватара сотрудника +- **Добавлено** (users remove-avatar): Удаление аватара сотрудника +- **Изменено** (chats list, messages list): Исправлена сортировка: --order без --sort теперь корректно работает (sort по умолчанию id, order по умолчанию desc) +- **Изменено** (messages list): chat_id можно передать первым аргументом: pachca messages list 12345 + ## 2026.3.10 (21 марта 2026) - **Изменено** (messages create): Поле link_preview перемещено на верхний уровень тела запроса (раньше было внутри message) diff --git a/packages/cli/oclif.manifest.json b/packages/cli/oclif.manifest.json index e2eee9a7..3e302f3d 100644 --- a/packages/cli/oclif.manifest.json +++ b/packages/cli/oclif.manifest.json @@ -1 +1 @@ -{"commands":{"api":{"aliases":[],"args":{"method":{"description":"HTTP method (GET, POST, PUT, DELETE)","name":"method","options":["GET","POST","PUT","DELETE","PATCH"],"required":true},"path":{"description":"API path (e.g., /messages)","name":"path","required":true}},"description":"Произвольный запрос к API","examples":["<%= config.bin %> api GET /messages --query chat_id=123","<%= config.bin %> api POST /messages -F message[chat_id]=12345 -f message[content]=\"Привет\"","<%= config.bin %> api POST /messages --input payload.json","<%= config.bin %> api GET /profile -o yaml"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"raw-field":{"char":"f","description":"String field (key=value)","name":"raw-field","hasDynamicHelp":false,"multiple":true,"type":"option"},"field":{"char":"F","description":"Typed field (numbers/bools auto-converted, @file reads file)","name":"field","hasDynamicHelp":false,"multiple":true,"type":"option"},"input":{"description":"JSON file to send as body (- for stdin)","name":"input","hasDynamicHelp":false,"multiple":false,"type":"option"},"query":{"description":"Query parameter (key=value)","name":"query","hasDynamicHelp":false,"multiple":true,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"api","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":false,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","api.js"]},"auth:list":{"aliases":[],"args":{},"description":"Список сохранённых профилей","examples":["<%= config.bin %> auth list","<%= config.bin %> auth list -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","list.js"]},"auth:login":{"aliases":[],"args":{},"description":"Авторизация и сохранение токена","examples":["<%= config.bin %> auth login","<%= config.bin %> auth login --profile personal","<%= config.bin %> auth login --profile ci --token $PACHCA_TOKEN"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile name (default: \"default\")","name":"profile","default":"default","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Token to save (skips prompt)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:login","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","login.js"]},"auth:logout":{"aliases":[],"args":{"profile":{"description":"Profile name to remove","name":"profile","required":false}},"description":"Удаление сохранённого профиля","examples":["<%= config.bin %> auth logout bot-notify","<%= config.bin %> auth logout"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:logout","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","logout.js"]},"auth:status":{"aliases":[],"args":{},"description":"Статус текущего профиля","examples":["<%= config.bin %> auth status","<%= config.bin %> auth status -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","status.js"]},"auth:switch":{"aliases":[],"args":{"profile":{"description":"Profile name to switch to","name":"profile","required":true}},"description":"Переключение активного профиля","examples":["<%= config.bin %> auth switch bot-support"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:switch","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","switch.js"]},"bots:list-events":{"aliases":[],"args":{},"description":"История событий","examples":["Обработка событий через историю (polling):\n $ pachca bots list-events"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"bots:list-events","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"webhooks:events:read","apiMethod":"GET","apiPath":"/webhooks/events","defaultColumns":["id","created_at","event_type","payload"],"isESM":true,"relativePath":["dist","commands","bots","list-events.js"]},"bots:remove-event":{"aliases":[],"args":{"id":{"description":"Идентификатор события (pachca bots list)","name":"id","required":true}},"description":"Удаление события","examples":["Обработка событий через историю (polling):\n $ pachca bots remove-event"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"bots:remove-event","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"webhooks:events:delete","apiMethod":"DELETE","apiPath":"/webhooks/events/{id}","isESM":true,"relativePath":["dist","commands","bots","remove-event.js"]},"bots:update":{"aliases":[],"args":{"id":{"description":"Идентификатор бота (pachca bots list)","name":"id","required":true}},"description":"Редактирование бота","examples":["Обновить Webhook URL бота:\n $ pachca bots update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"webhook":{"description":"Объект параметров вебхука","name":"webhook","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"bots:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"bots:write","apiMethod":"PUT","apiPath":"/bots/{id}","defaultColumns":["id"],"requiredFlags":["webhook"],"isESM":true,"relativePath":["dist","commands","bots","update.js"]},"changelog":{"aliases":[],"args":{},"description":"История изменений CLI","examples":["<%= config.bin %> changelog","<%= config.bin %> changelog -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"changelog","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","changelog.js"]},"chats:archive":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Архивация чата","examples":["Архивация и управление чатом:\n $ pachca chats archive","Найти и заархивировать неактивные чаты:\n $ pachca chats archive"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:archive","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:archive","apiMethod":"PUT","apiPath":"/chats/{id}/archive","isESM":true,"relativePath":["dist","commands","chats","archive.js"]},"chats:create":{"aliases":[],"args":{},"description":"Новый чат","examples":["Создать канал и пригласить участников:\n $ pachca chats create","Создать проектную беседу из шаблона:\n $ pachca chats create","Найти активные чаты за период:\n $ pachca chats list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"},"member-ids":{"description":"Массив идентификаторов пользователей, которые станут участниками","name":"member-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"group-tag-ids":{"description":"Массив идентификаторов тегов, которые станут участниками","name":"group-tag-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"channel":{"description":"Является каналом","name":"channel","allowNo":true,"type":"boolean"},"public":{"description":"Открытый доступ","name":"public","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:create","apiMethod":"POST","apiPath":"/chats","defaultColumns":["id","name","created_at","owner_id","channel"],"requiredFlags":["name"],"isESM":true,"relativePath":["dist","commands","chats","create.js"]},"chats:get":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Информация о чате","examples":["Переименовать или обновить чат:\n $ pachca chats update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:read","apiMethod":"GET","apiPath":"/chats/{id}","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","chats","get.js"]},"chats:list":{"aliases":[],"args":{},"description":"Список чатов","examples":["Создать канал и пригласить участников:\n $ pachca chats create","Создать проектную беседу из шаблона:\n $ pachca chats create","Найти активные чаты за период:\n $ pachca chats list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"sort":{"description":"Поле сортировки","name":"sort","hasDynamicHelp":false,"multiple":false,"options":["id","last_message_at"],"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"availability":{"description":"Параметр, который отвечает за доступность и выборку чатов для пользователя","name":"availability","hasDynamicHelp":false,"multiple":false,"options":["is_member","public"],"type":"option"},"last-message-at-after":{"description":"Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не раньше чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).","name":"last-message-at-after","hasDynamicHelp":false,"multiple":false,"type":"option"},"last-message-at-before":{"description":"Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не позже чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).","name":"last-message-at-before","hasDynamicHelp":false,"multiple":false,"type":"option"},"personal":{"description":"Фильтрация по личным и групповым чатам. Если параметр не указан, возвращаются любые чаты.","name":"personal","allowNo":true,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:read","apiMethod":"GET","apiPath":"/chats","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","chats","list.js"]},"chats:unarchive":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Разархивация чата","examples":["Архивация и управление чатом:\n $ pachca chats unarchive"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:unarchive","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:archive","apiMethod":"PUT","apiPath":"/chats/{id}/unarchive","isESM":true,"relativePath":["dist","commands","chats","unarchive.js"]},"chats:update":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Обновление чата","examples":["Переименовать или обновить чат:\n $ pachca chats update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"},"public":{"description":"Открытый доступ","name":"public","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:update","apiMethod":"PUT","apiPath":"/chats/{id}","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","chats","update.js"]},"commands":{"aliases":[],"args":{},"description":"Список всех команд","examples":["<%= config.bin %> commands","<%= config.bin %> commands --available","<%= config.bin %> commands --available -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"available":{"description":"Show only commands available to current token","name":"available","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"commands","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","commands.js"]},"common:custom-properties":{"aliases":[],"args":{},"description":"Список дополнительных полей","examples":["Получить кастомные поля профиля:\n $ pachca common custom-properties"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"entity-type":{"description":"Тип сущности","name":"entity-type","hasDynamicHelp":false,"multiple":false,"options":["User","Task"],"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:custom-properties","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"custom_properties:read","apiMethod":"GET","apiPath":"/custom_properties","defaultColumns":["id","name","data_type"],"requiredFlags":["entity-type"],"isESM":true,"relativePath":["dist","commands","common","custom-properties.js"]},"common:direct-url":{"aliases":[],"args":{},"description":"Загрузка файла","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"direct-url":{"description":"URL для отправки запроса (получается из ответа POST /uploads)","name":"direct-url","required":true,"hasDynamicHelp":false,"multiple":false,"type":"option"},"content-disposition":{"description":"Параметр Content-Disposition, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"content-disposition","hasDynamicHelp":false,"multiple":false,"type":"option"},"acl":{"description":"Параметр acl, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"acl","hasDynamicHelp":false,"multiple":false,"type":"option"},"policy":{"description":"Параметр policy, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"policy","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-credential":{"description":"Параметр x-amz-credential, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-credential","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-algorithm":{"description":"Параметр x-amz-algorithm, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-algorithm","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-date":{"description":"Параметр x-amz-date, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-date","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-signature":{"description":"Параметр x-amz-signature, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-signature","hasDynamicHelp":false,"multiple":false,"type":"option"},"key":{"description":"Параметр key, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"key","hasDynamicHelp":false,"multiple":false,"type":"option"},"file":{"description":"Файл для загрузки","name":"file","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:direct-url","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"apiMethod":"POST","apiPath":"/direct_url","requiredFlags":["content-disposition","acl","policy","x-amz-credential","x-amz-algorithm","x-amz-date","x-amz-signature","key"],"isESM":true,"relativePath":["dist","commands","common","direct-url.js"]},"common:get-exports":{"aliases":[],"args":{"id":{"description":"Идентификатор экспорта","name":"id","required":true}},"description":"Скачать архив экспорта","examples":["Экспорт истории чата:\n $ pachca common get-exports"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"save":{"description":"Путь для сохранения файла","name":"save","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:get-exports","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_exports:read","plan":"corporation","apiMethod":"GET","apiPath":"/chats/exports/{id}","isESM":true,"relativePath":["dist","commands","common","get-exports.js"]},"common:request-export":{"aliases":[],"args":{},"description":"Экспорт сообщений","examples":["Экспорт истории чата:\n $ pachca common request-export"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"start-at":{"description":"Дата начала для экспорта (ISO-8601, UTC+0) в формате YYYY-MM-DD","name":"start-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"end-at":{"description":"Дата окончания для экспорта (ISO-8601, UTC+0) в формате YYYY-MM-DD","name":"end-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"webhook-url":{"description":"Адрес, на который будет отправлен вебхук по завершению экспорта","name":"webhook-url","hasDynamicHelp":false,"multiple":false,"type":"option"},"chat-ids":{"description":"Массив идентификаторов чатов. Указывается, если нужно получить сообщения только некоторых чатов.","name":"chat-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"skip-chats-file":{"description":"Пропуск формирования файла со списком чатов (chats.json)","name":"skip-chats-file","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:request-export","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_exports:write","plan":"corporation","apiMethod":"POST","apiPath":"/chats/exports","requiredFlags":["start-at","end-at","webhook-url"],"isESM":true,"relativePath":["dist","commands","common","request-export.js"]},"common:uploads":{"aliases":[],"args":{},"description":"Получение подписи, ключа и других параметров","examples":["Изменить вложения сообщения:\n $ pachca common uploads"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:uploads","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"uploads:write","apiMethod":"POST","apiPath":"/uploads","defaultColumns":["Content-Disposition","acl","policy","x-amz-credential","x-amz-algorithm"],"isESM":true,"relativePath":["dist","commands","common","uploads.js"]},"config:get":{"aliases":[],"args":{"key":{"description":"Configuration key","name":"key","required":true}},"description":"Получение значения конфигурации","examples":["<%= config.bin %> config get defaults.output"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"config:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","config","get.js"]},"config:list":{"aliases":[],"args":{},"description":"Список всех настроек","examples":["<%= config.bin %> config list","<%= config.bin %> config list -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"config:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","config","list.js"]},"config:set":{"aliases":[],"args":{"key":{"description":"Configuration key","name":"key","required":true},"value":{"description":"Configuration value","name":"value","required":true}},"description":"Установка значения конфигурации","examples":["<%= config.bin %> config set defaults.output json","<%= config.bin %> config set defaults.timeout 60"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"config:set","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","config","set.js"]},"doctor":{"aliases":[],"args":{},"description":"Диагностика окружения: Node.js, сеть, токен, конфигурация","examples":["<%= config.bin %> doctor","<%= config.bin %> doctor -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"doctor","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","doctor.js"]},"group-tags:create":{"aliases":[],"args":{},"description":"Новый тег","examples":["Массовое создание сотрудников с тегами:\n $ pachca group-tags create","Получить всех сотрудников тега/департамента:\n $ pachca group-tags list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название тега","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:write","apiMethod":"POST","apiPath":"/group_tags","defaultColumns":["id","name","users_count"],"requiredFlags":["name"],"isESM":true,"relativePath":["dist","commands","group-tags","create.js"]},"group-tags:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Удаление тега","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:write","apiMethod":"DELETE","apiPath":"/group_tags/{id}","isESM":true,"relativePath":["dist","commands","group-tags","delete.js"]},"group-tags:get":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Информация о теге","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:read","apiMethod":"GET","apiPath":"/group_tags/{id}","defaultColumns":["id","name","users_count"],"isESM":true,"relativePath":["dist","commands","group-tags","get.js"]},"group-tags:list":{"aliases":[],"args":{},"description":"Список тегов сотрудников","examples":["Массовое создание сотрудников с тегами:\n $ pachca group-tags create","Получить всех сотрудников тега/департамента:\n $ pachca group-tags list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"names":{"description":"Массив названий тегов, по которым вы хотите отфильтровать список (через запятую)","name":"names","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:read","apiMethod":"GET","apiPath":"/group_tags","defaultColumns":["id","name","users_count"],"isESM":true,"relativePath":["dist","commands","group-tags","list.js"]},"group-tags:list-users":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Список сотрудников тега","examples":["Получить всех сотрудников тега/департамента:\n $ pachca group-tags list-users"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:list-users","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:read","apiMethod":"GET","apiPath":"/group_tags/{id}/users","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","group-tags","list-users.js"]},"group-tags:update":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Редактирование тега","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название тега","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:write","apiMethod":"PUT","apiPath":"/group_tags/{id}","defaultColumns":["id","name","users_count"],"requiredFlags":["name"],"isESM":true,"relativePath":["dist","commands","group-tags","update.js"]},"guide":{"aliases":[],"args":{"query":{"description":"Search query","name":"query","required":false}},"description":"Поиск сценариев использования","examples":["<%= config.bin %> guide \"отправить файл\"","<%= config.bin %> guide \"создать бота\"","<%= config.bin %> guide"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"guide","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","guide.js"]},"introspect":{"aliases":[],"args":{"command":{"description":"Command name (e.g., \"messages create\")","name":"command","required":false}},"description":"Метаданные команды в машиночитаемом формате","examples":["<%= config.bin %> introspect messages create","<%= config.bin %> introspect"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"introspect","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":false,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","introspect.js"]},"link-previews:add":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Unfurl (разворачивание ссылок)","examples":["Разворачивание ссылок (unfurling):\n $ pachca link-previews add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"link-previews":{"description":"`JSON` карта предпросмотров ссылок, где каждый ключ — `URL`, который был получен в исходящем вебхуке о новом сообщении.","name":"link-previews","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"link-previews:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"link_previews:write","apiMethod":"POST","apiPath":"/messages/{id}/link_previews","requiredFlags":["link-previews"],"isESM":true,"relativePath":["dist","commands","link-previews","add.js"]},"members:add":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (беседа, канал или чат треда)","name":"id","required":true}},"description":"Добавление пользователей","examples":["Подписаться на тред сообщения:\n $ pachca members add","Упомянуть пользователя по имени:\n $ pachca members list","Создать канал и пригласить участников:\n $ pachca members add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"member-ids":{"description":"Массив идентификаторов пользователей, которые станут участниками","name":"member-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"silent":{"description":"Не создавать в чате системное сообщение о добавлении участника","name":"silent","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"POST","apiPath":"/chats/{id}/members","requiredFlags":["member-ids"],"isESM":true,"relativePath":["dist","commands","members","add.js"]},"members:add-group-tags":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true}},"description":"Добавление тегов","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"group-tag-ids":{"description":"Массив идентификаторов тегов, которые станут участниками","name":"group-tag-ids","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:add-group-tags","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"POST","apiPath":"/chats/{id}/group_tags","requiredFlags":["group-tag-ids"],"isESM":true,"relativePath":["dist","commands","members","add-group-tags.js"]},"members:leave":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true}},"description":"Выход из беседы или канала","examples":["Архивация и управление чатом:\n $ pachca members leave"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:leave","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:leave","apiMethod":"DELETE","apiPath":"/chats/{id}/leave","isESM":true,"relativePath":["dist","commands","members","leave.js"]},"members:list":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true}},"description":"Список участников чата","examples":["Подписаться на тред сообщения:\n $ pachca members add","Упомянуть пользователя по имени:\n $ pachca members list","Создать канал и пригласить участников:\n $ pachca members add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"role":{"description":"Роль в чате","name":"role","hasDynamicHelp":false,"multiple":false,"options":["all","owner","admin","editor","member"],"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:read","apiMethod":"GET","apiPath":"/chats/{id}/members","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","members","list.js"]},"members:remove":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true},"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Исключение пользователя","examples":["Архивация и управление чатом:\n $ pachca members update","Архивация и управление чатом:\n $ pachca members remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:remove","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"DELETE","apiPath":"/chats/{id}/members/{user_id}","isESM":true,"relativePath":["dist","commands","members","remove.js"]},"members:remove-group-tag":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true},"tag_id":{"description":"Идентификатор тега (pachca tags list)","name":"tag_id","required":true}},"description":"Исключение тега","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:remove-group-tag","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"DELETE","apiPath":"/chats/{id}/group_tags/{tag_id}","isESM":true,"relativePath":["dist","commands","members","remove-group-tag.js"]},"members:update":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true},"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Редактирование роли","examples":["Архивация и управление чатом:\n $ pachca members update","Архивация и управление чатом:\n $ pachca members remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"role":{"description":"Роль","name":"role","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"PUT","apiPath":"/chats/{id}/members/{user_id}","requiredFlags":["role"],"isESM":true,"relativePath":["dist","commands","members","update.js"]},"messages:create":{"aliases":[],"args":{},"description":"Новое сообщение","examples":["Найти чат по имени и отправить сообщение:\n $ pachca messages create","Отправить сообщение в канал или беседу (если chat_id известен):\n $ pachca messages create","Отправить личное сообщение пользователю:\n $ pachca messages create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"entity-type":{"description":"Тип сущности","name":"entity-type","hasDynamicHelp":false,"multiple":false,"type":"option"},"entity-id":{"description":"Идентификатор сущности (pachca chats list | pachca users list)","name":"entity-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"content":{"description":"Текст сообщения","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"files":{"description":"Прикрепляемые файлы","name":"files","hasDynamicHelp":false,"multiple":false,"type":"option"},"buttons":{"description":"Массив строк, каждая из которых представлена массивом кнопок. Максимум 100 кнопок у сообщения, до 8 кнопок в строке.","name":"buttons","hasDynamicHelp":false,"multiple":false,"type":"option"},"parent-message-id":{"description":"Идентификатор сообщения. Указывается в случае, если вы отправляете ответ на другое сообщение.","name":"parent-message-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-avatar-url":{"description":"Ссылка на специальную аватарку отправителя для этого сообщения. Использование этого поля возможно только с access_token бота. (макс. 255 символов)","name":"display-avatar-url","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-name":{"description":"Полное специальное имя отправителя для этого сообщения. Использование этого поля возможно только с access_token бота. (макс. 255 символов)","name":"display-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"skip-invite-mentions":{"description":"Пропуск добавления упоминаемых пользователей в тред. Работает только при отправке сообщения в тред.","name":"skip-invite-mentions","allowNo":true,"type":"boolean"},"link-preview":{"description":"Отображение предпросмотра первой найденной ссылки в тексте сообщения","name":"link-preview","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:create","apiMethod":"POST","apiPath":"/messages","defaultColumns":["id","content","created_at","entity_type","entity_id"],"requiredFlags":["entity-id","content"],"isESM":true,"relativePath":["dist","commands","messages","create.js"]},"messages:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Удаление сообщения","examples":["Получить вложения из сообщения:\n $ pachca messages get","Отредактировать сообщение:\n $ pachca messages update","Изменить вложения сообщения:\n $ pachca messages get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:delete","apiMethod":"DELETE","apiPath":"/messages/{id}","isESM":true,"relativePath":["dist","commands","messages","delete.js"]},"messages:get":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Информация о сообщении","examples":["Получить вложения из сообщения:\n $ pachca messages get","Отредактировать сообщение:\n $ pachca messages update","Изменить вложения сообщения:\n $ pachca messages get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:read","apiMethod":"GET","apiPath":"/messages/{id}","defaultColumns":["id","content","created_at","entity_type","entity_id"],"isESM":true,"relativePath":["dist","commands","messages","get.js"]},"messages:list":{"aliases":[],"args":{"chat_id":{"description":"Идентификатор чата (беседа, канал, диалог или чат треда)","name":"chat_id","required":false}},"description":"Список сообщений чата","examples":["Найти чат по имени и отправить сообщение:\n $ pachca messages create","Отправить сообщение в канал или беседу (если chat_id известен):\n $ pachca messages create","Отправить личное сообщение пользователю:\n $ pachca messages create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"chat-id":{"description":"Идентификатор чата (беседа, канал, диалог или чат треда)","name":"chat-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"sort":{"description":"Поле сортировки","name":"sort","hasDynamicHelp":false,"multiple":false,"options":["id"],"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:read","apiMethod":"GET","apiPath":"/messages","defaultColumns":["id","content","created_at","entity_type","entity_id"],"requiredFlags":["chat-id"],"isESM":true,"relativePath":["dist","commands","messages","list.js"]},"messages:pin":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Закрепление сообщения","examples":["Закрепить/открепить сообщение:\n $ pachca messages pin","Закрепить/открепить сообщение:\n $ pachca messages unpin"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:pin","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"pins:write","apiMethod":"POST","apiPath":"/messages/{id}/pin","isESM":true,"relativePath":["dist","commands","messages","pin.js"]},"messages:unpin":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Открепление сообщения","examples":["Закрепить/открепить сообщение:\n $ pachca messages pin","Закрепить/открепить сообщение:\n $ pachca messages unpin"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:unpin","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"pins:write","apiMethod":"DELETE","apiPath":"/messages/{id}/pin","isESM":true,"relativePath":["dist","commands","messages","unpin.js"]},"messages:update":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Редактирование сообщения","examples":["Получить вложения из сообщения:\n $ pachca messages get","Отредактировать сообщение:\n $ pachca messages update","Изменить вложения сообщения:\n $ pachca messages get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"content":{"description":"Текст сообщения","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"files":{"description":"Прикрепляемые файлы","name":"files","hasDynamicHelp":false,"multiple":false,"type":"option"},"buttons":{"description":"Массив строк, каждая из которых представлена массивом кнопок. Максимум 100 кнопок у сообщения, до 8 кнопок в строке. Для удаления кнопок пришлите пустой массив.","name":"buttons","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-avatar-url":{"description":"Ссылка на специальную аватарку отправителя для этого сообщения. Использование этого поля возможно только с access_token бота.","name":"display-avatar-url","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-name":{"description":"Полное специальное имя отправителя для этого сообщения. Использование этого поля возможно только с access_token бота.","name":"display-name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:update","apiMethod":"PUT","apiPath":"/messages/{id}","defaultColumns":["id","content","created_at","entity_type","entity_id"],"isESM":true,"relativePath":["dist","commands","messages","update.js"]},"profile:delete-avatar":{"aliases":[],"args":{},"description":"Удаление аватара","examples":["Загрузить аватар профиля:\n $ pachca profile update-avatar","Удалить аватар профиля:\n $ pachca profile delete-avatar"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:delete-avatar","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_avatar:write","apiMethod":"DELETE","apiPath":"/profile/avatar","isESM":true,"relativePath":["dist","commands","profile","delete-avatar.js"]},"profile:delete-status":{"aliases":[],"args":{},"description":"Удаление статуса","examples":["Установить статус:\n $ pachca profile update-status","Сбросить статус:\n $ pachca profile delete-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:delete-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_status:write","apiMethod":"DELETE","apiPath":"/profile/status","isESM":true,"relativePath":["dist","commands","profile","delete-status.js"]},"profile:get":{"aliases":[],"args":{},"description":"Информация о профиле","examples":["Получить свой профиль:\n $ pachca profile get","Получить кастомные поля профиля:\n $ pachca profile get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile:read","apiMethod":"GET","apiPath":"/profile","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","profile","get.js"]},"profile:get-info":{"aliases":[],"args":{},"description":"Информация о токене","examples":["Проверить свой токен:\n $ pachca profile get-info"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:get-info","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"apiMethod":"GET","apiPath":"/oauth/token/info","defaultColumns":["id","name","created_at","token","user_id"],"isESM":true,"relativePath":["dist","commands","profile","get-info.js"]},"profile:get-status":{"aliases":[],"args":{},"description":"Текущий статус","examples":["Установить статус:\n $ pachca profile update-status","Сбросить статус:\n $ pachca profile delete-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:get-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_status:read","apiMethod":"GET","apiPath":"/profile/status","defaultColumns":["title","emoji","expires_at","is_away"],"isESM":true,"relativePath":["dist","commands","profile","get-status.js"]},"profile:update-avatar":{"aliases":[],"args":{},"description":"Загрузка аватара","examples":["Загрузить аватар профиля:\n $ pachca profile update-avatar","Удалить аватар профиля:\n $ pachca profile delete-avatar"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"file":{"description":"Файл изображения для аватара","name":"file","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:update-avatar","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_avatar:write","apiMethod":"PUT","apiPath":"/profile/avatar","defaultColumns":["image_url"],"isESM":true,"relativePath":["dist","commands","profile","update-avatar.js"]},"profile:update-status":{"aliases":[],"args":{},"description":"Новый статус","examples":["Установить статус:\n $ pachca profile update-status","Сбросить статус:\n $ pachca profile delete-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"emoji":{"description":"Emoji символ статуса","name":"emoji","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Текст статуса","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"expires-at":{"description":"Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ","name":"expires-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"is-away":{"description":"Режим «Нет на месте»","name":"is-away","allowNo":true,"type":"boolean"},"away-message":{"description":"Текст сообщения при режиме «Нет на месте». Отображается в профиле и при личных сообщениях/упоминаниях. (макс. 1024 символов)","name":"away-message","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:update-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_status:write","apiMethod":"PUT","apiPath":"/profile/status","defaultColumns":["title","emoji","expires_at","is_away"],"requiredFlags":["emoji","title"],"isESM":true,"relativePath":["dist","commands","profile","update-status.js"]},"reactions:add":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Добавление реакции","examples":["Добавить реакцию на сообщение:\n $ pachca reactions add","Добавить реакцию на сообщение:\n $ pachca reactions remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"code":{"description":"Emoji символ реакции","name":"code","hasDynamicHelp":false,"multiple":false,"type":"option"},"name":{"description":"Текстовое имя эмодзи (используется для кастомных эмодзи)","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"reactions:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"reactions:write","apiMethod":"POST","apiPath":"/messages/{id}/reactions","defaultColumns":["name","created_at","user_id","code"],"requiredFlags":["code"],"isESM":true,"relativePath":["dist","commands","reactions","add.js"]},"reactions:list":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Список реакций","examples":["Добавить реакцию на сообщение:\n $ pachca reactions add","Добавить реакцию на сообщение:\n $ pachca reactions remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"reactions:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"reactions:read","apiMethod":"GET","apiPath":"/messages/{id}/reactions","defaultColumns":["name","created_at","user_id","code"],"isESM":true,"relativePath":["dist","commands","reactions","list.js"]},"reactions:remove":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Удаление реакции","examples":["Добавить реакцию на сообщение:\n $ pachca reactions add","Добавить реакцию на сообщение:\n $ pachca reactions remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"code":{"description":"Emoji символ реакции","name":"code","hasDynamicHelp":false,"multiple":false,"type":"option"},"name":{"description":"Текстовое имя эмодзи (используется для кастомных эмодзи)","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"reactions:remove","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"reactions:write","apiMethod":"DELETE","apiPath":"/messages/{id}/reactions","requiredFlags":["code"],"isESM":true,"relativePath":["dist","commands","reactions","remove.js"]},"read-member:list-readers":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Список прочитавших сообщение","examples":["Проверить, кто прочитал сообщение:\n $ pachca read-member list-readers"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"read-member:list-readers","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:read","apiMethod":"GET","apiPath":"/messages/{id}/read_member_ids","isESM":true,"relativePath":["dist","commands","read-member","list-readers.js"]},"search:list-chats":{"aliases":[],"args":{},"description":"Поиск чатов","examples":["Найти чат по имени и отправить сообщение:\n $ pachca search list-chats","Найти чат по названию:\n $ pachca search list-chats"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Текст поискового запроса","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"created-from":{"description":"Фильтр по дате создания (от)","name":"created-from","hasDynamicHelp":false,"multiple":false,"type":"option"},"created-to":{"description":"Фильтр по дате создания (до)","name":"created-to","hasDynamicHelp":false,"multiple":false,"type":"option"},"active":{"description":"Фильтр по активности чата","name":"active","allowNo":true,"type":"boolean"},"chat-subtype":{"description":"Фильтр по типу чата","name":"chat-subtype","hasDynamicHelp":false,"multiple":false,"options":["discussion","thread"],"type":"option"},"personal":{"description":"Фильтр по личным чатам","name":"personal","allowNo":true,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"search:list-chats","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"search:chats","apiMethod":"GET","apiPath":"/search/chats","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","search","list-chats.js"]},"search:list-messages":{"aliases":[],"args":{},"description":"Поиск сообщений","examples":["Найти сообщение по тексту:\n $ pachca search list-messages"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Текст поискового запроса","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"created-from":{"description":"Фильтр по дате создания (от)","name":"created-from","hasDynamicHelp":false,"multiple":false,"type":"option"},"created-to":{"description":"Фильтр по дате создания (до)","name":"created-to","hasDynamicHelp":false,"multiple":false,"type":"option"},"chat-ids":{"description":"Фильтр по ID чатов (через запятую)","name":"chat-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"user-ids":{"description":"Фильтр по ID авторов сообщений (через запятую)","name":"user-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"active":{"description":"Фильтр по активности чата","name":"active","allowNo":true,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"search:list-messages","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"search:messages","apiMethod":"GET","apiPath":"/search/messages","defaultColumns":["id","content","created_at","entity_type","entity_id"],"isESM":true,"relativePath":["dist","commands","search","list-messages.js"]},"search:list-users":{"aliases":[],"args":{},"description":"Поиск сотрудников","examples":["Отправить личное сообщение пользователю:\n $ pachca search list-users","Упомянуть пользователя по имени:\n $ pachca search list-users","Найти сотрудника по имени:\n $ pachca search list-users"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Текст поискового запроса","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"sort":{"description":"Сортировка результатов","name":"sort","hasDynamicHelp":false,"multiple":false,"options":["by_score","alphabetical"],"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"created-from":{"description":"Фильтр по дате создания (от)","name":"created-from","hasDynamicHelp":false,"multiple":false,"type":"option"},"created-to":{"description":"Фильтр по дате создания (до)","name":"created-to","hasDynamicHelp":false,"multiple":false,"type":"option"},"company-roles":{"description":"Фильтр по ролям сотрудников (через запятую)","name":"company-roles","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"search:list-users","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"search:users","apiMethod":"GET","apiPath":"/search/users","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","search","list-users.js"]},"security:list":{"aliases":[],"args":{},"description":"Журнал аудита событий","examples":["Получить журнал аудита событий:\n $ pachca security list","Мониторинг подозрительных входов:\n $ pachca security list","Экспорт логов за период:\n $ pachca security list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"start-time":{"description":"Начальная метка времени (включительно)","name":"start-time","hasDynamicHelp":false,"multiple":false,"type":"option"},"end-time":{"description":"Конечная метка времени (исключительно)","name":"end-time","hasDynamicHelp":false,"multiple":false,"type":"option"},"event-key":{"description":"Фильтр по конкретному типу события","name":"event-key","hasDynamicHelp":false,"multiple":false,"options":["user_login","user_logout","user_2fa_fail","user_2fa_success","user_created","user_deleted","user_role_changed","user_updated","tag_created","tag_deleted","user_added_to_tag","user_removed_from_tag","chat_created","chat_renamed","chat_permission_changed","user_chat_join","user_chat_leave","tag_added_to_chat","tag_removed_from_chat","message_updated","message_deleted","message_created","reaction_created","reaction_deleted","thread_created","access_token_created","access_token_updated","access_token_destroy","kms_encrypt","kms_decrypt","audit_events_accessed","dlp_violation_detected","search_users_api","search_chats_api","search_messages_api"],"type":"option"},"actor-id":{"description":"Идентификатор пользователя, выполнившего действие","name":"actor-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"actor-type":{"description":"Тип актора","name":"actor-type","hasDynamicHelp":false,"multiple":false,"type":"option"},"entity-id":{"description":"Идентификатор затронутой сущности","name":"entity-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"entity-type":{"description":"Тип сущности","name":"entity-type","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"security:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"audit_events:read","plan":"corporation","apiMethod":"GET","apiPath":"/audit_events","defaultColumns":["id","created_at","event_key","entity_id","entity_type"],"isESM":true,"relativePath":["dist","commands","security","list.js"]},"tasks:create":{"aliases":[],"args":{},"description":"Новое напоминание","examples":["Форма заявки/запроса:\n $ pachca tasks create","Создать напоминание:\n $ pachca tasks create","Получить список предстоящих задач:\n $ pachca tasks list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"kind":{"description":"Тип","name":"kind","hasDynamicHelp":false,"multiple":false,"type":"option"},"content":{"description":"Описание (по умолчанию — название типа)","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"due-at":{"description":"Срок выполнения напоминания (ISO-8601) в формате YYYY-MM-DDThh:mm:ss.sssTZD. Если указано время 23:59:59.000, то напоминание будет создано на весь день (без указания времени).","name":"due-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"priority":{"description":"Приоритет: 1, 2 (важно) или 3 (очень важно).","name":"priority","hasDynamicHelp":false,"multiple":false,"type":"option"},"performer-ids":{"description":"Массив идентификаторов пользователей, привязываемых к напоминанию как «ответственные» (по умолчанию ответственным назначается вы)","name":"performer-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"chat-id":{"description":"Идентификатор чата, к которому привязывается напоминание (pachca chats list)","name":"chat-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"all-day":{"description":"Напоминание на весь день (без указания времени)","name":"all-day","allowNo":true,"type":"boolean"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:create","apiMethod":"POST","apiPath":"/tasks","defaultColumns":["id","content","created_at","kind","due_at"],"requiredFlags":["kind"],"isESM":true,"relativePath":["dist","commands","tasks","create.js"]},"tasks:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор напоминания (pachca tasks list)","name":"id","required":true}},"description":"Удаление напоминания","examples":["Получить задачу по ID:\n $ pachca tasks get","Отметить задачу выполненной:\n $ pachca tasks update","Обновить задачу (перенести срок, сменить ответственных):\n $ pachca tasks update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:delete","apiMethod":"DELETE","apiPath":"/tasks/{id}","isESM":true,"relativePath":["dist","commands","tasks","delete.js"]},"tasks:get":{"aliases":[],"args":{"id":{"description":"Идентификатор напоминания (pachca tasks list)","name":"id","required":true}},"description":"Информация о напоминании","examples":["Получить задачу по ID:\n $ pachca tasks get","Отметить задачу выполненной:\n $ pachca tasks update","Обновить задачу (перенести срок, сменить ответственных):\n $ pachca tasks update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:read","apiMethod":"GET","apiPath":"/tasks/{id}","defaultColumns":["id","content","created_at","kind","due_at"],"isESM":true,"relativePath":["dist","commands","tasks","get.js"]},"tasks:list":{"aliases":[],"args":{},"description":"Список напоминаний","examples":["Форма заявки/запроса:\n $ pachca tasks create","Создать напоминание:\n $ pachca tasks create","Получить список предстоящих задач:\n $ pachca tasks list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:read","apiMethod":"GET","apiPath":"/tasks","defaultColumns":["id","content","created_at","kind","due_at"],"isESM":true,"relativePath":["dist","commands","tasks","list.js"]},"tasks:update":{"aliases":[],"args":{"id":{"description":"Идентификатор напоминания (pachca tasks list)","name":"id","required":true}},"description":"Редактирование напоминания","examples":["Получить задачу по ID:\n $ pachca tasks get","Отметить задачу выполненной:\n $ pachca tasks update","Обновить задачу (перенести срок, сменить ответственных):\n $ pachca tasks update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"kind":{"description":"Тип","name":"kind","hasDynamicHelp":false,"multiple":false,"type":"option"},"content":{"description":"Описание","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"due-at":{"description":"Срок выполнения напоминания (ISO-8601) в формате YYYY-MM-DDThh:mm:ss.sssTZD. Если указано время 23:59:59.000, то напоминание будет создано на весь день (без указания времени).","name":"due-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"priority":{"description":"Приоритет: 1, 2 (важно) или 3 (очень важно).","name":"priority","hasDynamicHelp":false,"multiple":false,"type":"option"},"performer-ids":{"description":"Массив идентификаторов пользователей, привязываемых к напоминанию как «ответственные»","name":"performer-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"status":{"description":"Статус","name":"status","hasDynamicHelp":false,"multiple":false,"type":"option"},"all-day":{"description":"Напоминание на весь день (без указания времени)","name":"all-day","allowNo":true,"type":"boolean"},"done-at":{"description":"Дата и время выполнения напоминания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ","name":"done-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:update","apiMethod":"PUT","apiPath":"/tasks/{id}","defaultColumns":["id","content","created_at","kind","due_at"],"isESM":true,"relativePath":["dist","commands","tasks","update.js"]},"threads:add":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Новый тред","examples":["Ответить в тред (комментарий к сообщению):\n $ pachca thread add","Подписаться на тред сообщения:\n $ pachca thread add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"threads:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"threads:create","apiMethod":"POST","apiPath":"/messages/{id}/thread","defaultColumns":["id","chat_id","message_id","message_chat_id","updated_at"],"isESM":true,"relativePath":["dist","commands","threads","add.js"]},"threads:get":{"aliases":[],"args":{"id":{"description":"Идентификатор треда","name":"id","required":true}},"description":"Информация о треде","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"threads:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"threads:read","apiMethod":"GET","apiPath":"/threads/{id}","defaultColumns":["id","chat_id","message_id","message_chat_id","updated_at"],"isESM":true,"relativePath":["dist","commands","threads","get.js"]},"upgrade":{"aliases":[],"args":{},"description":"Обновить CLI до последней версии","examples":["<%= config.bin %> upgrade"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"upgrade","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","upgrade.js"]},"upload":{"aliases":[],"args":{"file":{"description":"Путь к файлу или - для stdin","name":"file","required":true}},"description":"Загрузить файл (получает подпись и загружает автоматически)","examples":["<%= config.bin %> upload photo.jpg","cat data.csv | <%= config.bin %> upload -"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"upload","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"uploads:write","isESM":true,"relativePath":["dist","commands","upload.js"]},"users:create":{"aliases":[],"args":{},"description":"Создать сотрудника","examples":["Проверить, кто прочитал сообщение:\n $ pachca users list","Разослать уведомление нескольким пользователям:\n $ pachca users list","Массовое создание сотрудников с тегами:\n $ pachca users create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"first-name":{"description":"Имя","name":"first-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"last-name":{"description":"Фамилия","name":"last-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"email":{"description":"Электронная почта","name":"email","hasDynamicHelp":false,"multiple":false,"type":"option"},"phone-number":{"description":"Телефон","name":"phone-number","hasDynamicHelp":false,"multiple":false,"type":"option"},"nickname":{"description":"Имя пользователя","name":"nickname","hasDynamicHelp":false,"multiple":false,"type":"option"},"department":{"description":"Департамент","name":"department","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Должность","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"role":{"description":"Уровень доступа","name":"role","hasDynamicHelp":false,"multiple":false,"type":"option"},"suspended":{"description":"Деактивация пользователя","name":"suspended","allowNo":true,"type":"boolean"},"list-tags":{"description":"Массив тегов, привязываемых к сотруднику","name":"list-tags","hasDynamicHelp":false,"multiple":false,"type":"option"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"},"skip-email-notify":{"description":"Пропуск этапа отправки приглашения сотруднику. Сотруднику не будет отправлено письмо на электронную почту с приглашением создать аккаунт. Полезно при предварительном создании аккаунтов перед входом через SSO.","name":"skip-email-notify","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:create","apiMethod":"POST","apiPath":"/users","defaultColumns":["id","title","first_name","last_name","email"],"requiredFlags":["email"],"isESM":true,"relativePath":["dist","commands","users","create.js"]},"users:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор пользователя (pachca users list)","name":"id","required":true}},"description":"Удаление сотрудника","examples":["Получить сотрудника по ID:\n $ pachca users get","Массовое создание сотрудников с тегами:\n $ pachca users update","Offboarding сотрудника:\n $ pachca users update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:delete","apiMethod":"DELETE","apiPath":"/users/{id}","isESM":true,"relativePath":["dist","commands","users","delete.js"]},"users:get":{"aliases":[],"args":{"id":{"description":"Идентификатор пользователя (pachca users list)","name":"id","required":true}},"description":"Информация о сотруднике","examples":["Получить сотрудника по ID:\n $ pachca users get","Массовое создание сотрудников с тегами:\n $ pachca users update","Offboarding сотрудника:\n $ pachca users update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:read","apiMethod":"GET","apiPath":"/users/{id}","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","users","get.js"]},"users:get-status":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Статус сотрудника","examples":["Управление статусом сотрудника:\n $ pachca users get-status","Управление статусом сотрудника:\n $ pachca users update-status","Управление статусом сотрудника:\n $ pachca users remove-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:get-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_status:read","apiMethod":"GET","apiPath":"/users/{user_id}/status","defaultColumns":["title","emoji","expires_at","is_away"],"isESM":true,"relativePath":["dist","commands","users","get-status.js"]},"users:list":{"aliases":[],"args":{},"description":"Список сотрудников","examples":["Проверить, кто прочитал сообщение:\n $ pachca users list","Разослать уведомление нескольким пользователям:\n $ pachca users list","Массовое создание сотрудников с тегами:\n $ pachca users create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Поисковая фраза для фильтрации результатов. Поиск работает по полям: `first_name` (имя), `last_name` (фамилия), `email` (электронная почта), `phone_number` (телефон) и `nickname` (никнейм).","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:read","apiMethod":"GET","apiPath":"/users","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","users","list.js"]},"users:remove-avatar":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Удаление аватара сотрудника","examples":["Загрузить аватар сотрудника:\n $ pachca users update-avatar","Удалить аватар сотрудника:\n $ pachca users remove-avatar"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:remove-avatar","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_avatar:write","apiMethod":"DELETE","apiPath":"/users/{user_id}/avatar","isESM":true,"relativePath":["dist","commands","users","remove-avatar.js"]},"users:remove-status":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Удаление статуса сотрудника","examples":["Управление статусом сотрудника:\n $ pachca users get-status","Управление статусом сотрудника:\n $ pachca users update-status","Управление статусом сотрудника:\n $ pachca users remove-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:remove-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_status:write","apiMethod":"DELETE","apiPath":"/users/{user_id}/status","isESM":true,"relativePath":["dist","commands","users","remove-status.js"]},"users:update":{"aliases":[],"args":{"id":{"description":"Идентификатор пользователя (pachca users list)","name":"id","required":true}},"description":"Редактирование сотрудника","examples":["Получить сотрудника по ID:\n $ pachca users get","Массовое создание сотрудников с тегами:\n $ pachca users update","Offboarding сотрудника:\n $ pachca users update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"first-name":{"description":"Имя","name":"first-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"last-name":{"description":"Фамилия","name":"last-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"email":{"description":"Электронная почта","name":"email","hasDynamicHelp":false,"multiple":false,"type":"option"},"phone-number":{"description":"Телефон","name":"phone-number","hasDynamicHelp":false,"multiple":false,"type":"option"},"nickname":{"description":"Имя пользователя","name":"nickname","hasDynamicHelp":false,"multiple":false,"type":"option"},"department":{"description":"Департамент","name":"department","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Должность","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"role":{"description":"Уровень доступа","name":"role","hasDynamicHelp":false,"multiple":false,"type":"option"},"suspended":{"description":"Деактивация пользователя","name":"suspended","allowNo":true,"type":"boolean"},"list-tags":{"description":"Массив тегов, привязываемых к сотруднику","name":"list-tags","hasDynamicHelp":false,"multiple":false,"type":"option"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:update","apiMethod":"PUT","apiPath":"/users/{id}","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","users","update.js"]},"users:update-avatar":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Загрузка аватара сотрудника","examples":["Загрузить аватар сотрудника:\n $ pachca users update-avatar","Удалить аватар сотрудника:\n $ pachca users remove-avatar"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"file":{"description":"Файл изображения для аватара","name":"file","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:update-avatar","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_avatar:write","apiMethod":"PUT","apiPath":"/users/{user_id}/avatar","defaultColumns":["image_url"],"isESM":true,"relativePath":["dist","commands","users","update-avatar.js"]},"users:update-status":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Новый статус сотрудника","examples":["Управление статусом сотрудника:\n $ pachca users get-status","Управление статусом сотрудника:\n $ pachca users update-status","Управление статусом сотрудника:\n $ pachca users remove-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"emoji":{"description":"Emoji символ статуса","name":"emoji","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Текст статуса","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"expires-at":{"description":"Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ","name":"expires-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"is-away":{"description":"Режим «Нет на месте»","name":"is-away","allowNo":true,"type":"boolean"},"away-message":{"description":"Текст сообщения при режиме «Нет на месте». Отображается в профиле и при личных сообщениях/упоминаниях. (макс. 1024 символов)","name":"away-message","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:update-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_status:write","apiMethod":"PUT","apiPath":"/users/{user_id}/status","defaultColumns":["title","emoji","expires_at","is_away"],"requiredFlags":["emoji","title"],"isESM":true,"relativePath":["dist","commands","users","update-status.js"]},"version":{"aliases":[],"args":{},"description":"Версия CLI","examples":["<%= config.bin %> version"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"version","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","version.js"]},"views:open":{"aliases":[],"args":{},"description":"Открытие представления","examples":["Показать интерактивную форму пользователю:\n $ pachca views open","Опрос сотрудников через форму:\n $ pachca views open","Форма заявки/запроса:\n $ pachca views open"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"title":{"description":"Заголовок представления (макс. 24 символов)","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"close-text":{"description":"Текст кнопки закрытия представления (макс. 24 символов)","name":"close-text","hasDynamicHelp":false,"multiple":false,"type":"option"},"submit-text":{"description":"Текст кнопки отправки формы (макс. 24 символов)","name":"submit-text","hasDynamicHelp":false,"multiple":false,"type":"option"},"blocks":{"description":"Массив блоков представления","name":"blocks","hasDynamicHelp":false,"multiple":false,"type":"option"},"type":{"description":"Способ открытия представления","name":"type","hasDynamicHelp":false,"multiple":false,"options":["modal"],"type":"option"},"trigger-id":{"description":"Уникальный идентификатор события (полученный, например, в исходящем вебхуке о нажатии кнопки)","name":"trigger-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"private-metadata":{"description":"Необязательная строка, которая будет отправлена в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для передачи в формате `JSON` какой то дополнительной информации вместе с заполненной пользователем формой. (макс. 3000 символов)","name":"private-metadata","hasDynamicHelp":false,"multiple":false,"type":"option"},"callback-id":{"description":"Необязательный идентификатор для распознавания этого представления, который будет отправлен в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для понимания, какую форму должен был заполнить пользователь. (макс. 255 символов)","name":"callback-id","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"views:open","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"views:write","apiMethod":"POST","apiPath":"/views/open","requiredFlags":["title","blocks","type","trigger-id"],"isESM":true,"relativePath":["dist","commands","views","open.js"]}},"version":"0.0.0"} \ No newline at end of file +{"commands":{"api":{"aliases":[],"args":{"method":{"description":"HTTP method (GET, POST, PUT, DELETE)","name":"method","options":["GET","POST","PUT","DELETE","PATCH"],"required":true},"path":{"description":"API path (e.g., /messages)","name":"path","required":true}},"description":"Произвольный запрос к API","examples":["<%= config.bin %> api GET /messages --query chat_id=123","<%= config.bin %> api POST /messages -F message[chat_id]=12345 -f message[content]=\"Привет\"","<%= config.bin %> api POST /messages --input payload.json","<%= config.bin %> api GET /profile -o yaml"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"raw-field":{"char":"f","description":"String field (key=value)","name":"raw-field","hasDynamicHelp":false,"multiple":true,"type":"option"},"field":{"char":"F","description":"Typed field (numbers/bools auto-converted, @file reads file)","name":"field","hasDynamicHelp":false,"multiple":true,"type":"option"},"input":{"description":"JSON file to send as body (- for stdin)","name":"input","hasDynamicHelp":false,"multiple":false,"type":"option"},"query":{"description":"Query parameter (key=value)","name":"query","hasDynamicHelp":false,"multiple":true,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"api","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":false,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","api.js"]},"auth:list":{"aliases":[],"args":{},"description":"Список сохранённых профилей","examples":["<%= config.bin %> auth list","<%= config.bin %> auth list -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","list.js"]},"auth:login":{"aliases":[],"args":{},"description":"Авторизация и сохранение токена","examples":["<%= config.bin %> auth login","<%= config.bin %> auth login --profile personal","<%= config.bin %> auth login --profile ci --token $PACHCA_TOKEN"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile name (default: \"default\")","name":"profile","default":"default","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Token to save (skips prompt)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:login","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","login.js"]},"auth:logout":{"aliases":[],"args":{"profile":{"description":"Profile name to remove","name":"profile","required":false}},"description":"Удаление сохранённого профиля","examples":["<%= config.bin %> auth logout bot-notify","<%= config.bin %> auth logout"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:logout","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","logout.js"]},"auth:status":{"aliases":[],"args":{},"description":"Статус текущего профиля","examples":["<%= config.bin %> auth status","<%= config.bin %> auth status -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","status.js"]},"auth:switch":{"aliases":[],"args":{"profile":{"description":"Profile name to switch to","name":"profile","required":true}},"description":"Переключение активного профиля","examples":["<%= config.bin %> auth switch bot-support"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"auth:switch","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","auth","switch.js"]},"bots:list-events":{"aliases":[],"args":{},"description":"История событий","examples":["Обработка событий через историю (polling):\n $ pachca bots list-events"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"bots:list-events","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"webhooks:events:read","apiMethod":"GET","apiPath":"/webhooks/events","defaultColumns":["id","created_at","event_type","payload"],"isESM":true,"relativePath":["dist","commands","bots","list-events.js"]},"bots:remove-event":{"aliases":[],"args":{"id":{"description":"Идентификатор события (pachca bots list)","name":"id","required":true}},"description":"Удаление события","examples":["Обработка событий через историю (polling):\n $ pachca bots remove-event"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"bots:remove-event","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"webhooks:events:delete","apiMethod":"DELETE","apiPath":"/webhooks/events/{id}","isESM":true,"relativePath":["dist","commands","bots","remove-event.js"]},"bots:update":{"aliases":[],"args":{"id":{"description":"Идентификатор бота (pachca bots list)","name":"id","required":true}},"description":"Редактирование бота","examples":["Обновить Webhook URL бота:\n $ pachca bots update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"webhook":{"description":"Объект параметров вебхука","name":"webhook","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"bots:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"bots:write","apiMethod":"PUT","apiPath":"/bots/{id}","defaultColumns":["id"],"requiredFlags":["webhook"],"isESM":true,"relativePath":["dist","commands","bots","update.js"]},"changelog":{"aliases":[],"args":{},"description":"История изменений CLI","examples":["<%= config.bin %> changelog","<%= config.bin %> changelog -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"changelog","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","changelog.js"]},"chats:archive":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Архивация чата","examples":["Архивация и управление чатом:\n $ pachca chats archive","Найти и заархивировать неактивные чаты:\n $ pachca chats archive"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:archive","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:archive","apiMethod":"PUT","apiPath":"/chats/{id}/archive","isESM":true,"relativePath":["dist","commands","chats","archive.js"]},"chats:create":{"aliases":[],"args":{},"description":"Новый чат","examples":["Создать канал и пригласить участников:\n $ pachca chats create","Создать проектную беседу из шаблона:\n $ pachca chats create","Найти активные чаты за период:\n $ pachca chats list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"},"member-ids":{"description":"Массив идентификаторов пользователей, которые станут участниками","name":"member-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"group-tag-ids":{"description":"Массив идентификаторов тегов, которые станут участниками","name":"group-tag-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"channel":{"description":"Является каналом","name":"channel","allowNo":true,"type":"boolean"},"public":{"description":"Открытый доступ","name":"public","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:create","apiMethod":"POST","apiPath":"/chats","defaultColumns":["id","name","created_at","owner_id","channel"],"requiredFlags":["name"],"isESM":true,"relativePath":["dist","commands","chats","create.js"]},"chats:get":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Информация о чате","examples":["Переименовать или обновить чат:\n $ pachca chats update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:read","apiMethod":"GET","apiPath":"/chats/{id}","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","chats","get.js"]},"chats:list":{"aliases":[],"args":{},"description":"Список чатов","examples":["Создать канал и пригласить участников:\n $ pachca chats create","Создать проектную беседу из шаблона:\n $ pachca chats create","Найти активные чаты за период:\n $ pachca chats list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"sort":{"description":"Поле сортировки","name":"sort","default":"id","hasDynamicHelp":false,"multiple":false,"options":["id","last_message_at"],"type":"option"},"order":{"description":"Направление сортировки","name":"order","default":"desc","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"availability":{"description":"Параметр, который отвечает за доступность и выборку чатов для пользователя","name":"availability","default":"is_member","hasDynamicHelp":false,"multiple":false,"options":["is_member","public"],"type":"option"},"last-message-at-after":{"description":"Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не раньше чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).","name":"last-message-at-after","hasDynamicHelp":false,"multiple":false,"type":"option"},"last-message-at-before":{"description":"Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не позже чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).","name":"last-message-at-before","hasDynamicHelp":false,"multiple":false,"type":"option"},"personal":{"description":"Фильтрация по личным и групповым чатам. Если параметр не указан, возвращаются любые чаты.","name":"personal","allowNo":true,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:read","apiMethod":"GET","apiPath":"/chats","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","chats","list.js"]},"chats:unarchive":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Разархивация чата","examples":["Архивация и управление чатом:\n $ pachca chats unarchive"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:unarchive","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:archive","apiMethod":"PUT","apiPath":"/chats/{id}/unarchive","isESM":true,"relativePath":["dist","commands","chats","unarchive.js"]},"chats:update":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (pachca chats list)","name":"id","required":true}},"description":"Обновление чата","examples":["Переименовать или обновить чат:\n $ pachca chats update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"},"public":{"description":"Открытый доступ","name":"public","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"chats:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:update","apiMethod":"PUT","apiPath":"/chats/{id}","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","chats","update.js"]},"commands":{"aliases":[],"args":{},"description":"Список всех команд","examples":["<%= config.bin %> commands","<%= config.bin %> commands --available","<%= config.bin %> commands --available -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"available":{"description":"Show only commands available to current token","name":"available","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"commands","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","commands.js"]},"common:custom-properties":{"aliases":[],"args":{},"description":"Список дополнительных полей","examples":["Получить кастомные поля профиля:\n $ pachca common custom-properties"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"entity-type":{"description":"Тип сущности","name":"entity-type","hasDynamicHelp":false,"multiple":false,"options":["User","Task"],"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:custom-properties","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"custom_properties:read","apiMethod":"GET","apiPath":"/custom_properties","defaultColumns":["id","name","data_type"],"requiredFlags":["entity-type"],"isESM":true,"relativePath":["dist","commands","common","custom-properties.js"]},"common:direct-url":{"aliases":[],"args":{},"description":"Загрузка файла","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"direct-url":{"description":"URL для отправки запроса (получается из ответа POST /uploads)","name":"direct-url","required":true,"hasDynamicHelp":false,"multiple":false,"type":"option"},"content-disposition":{"description":"Параметр Content-Disposition, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"content-disposition","hasDynamicHelp":false,"multiple":false,"type":"option"},"acl":{"description":"Параметр acl, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"acl","hasDynamicHelp":false,"multiple":false,"type":"option"},"policy":{"description":"Параметр policy, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"policy","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-credential":{"description":"Параметр x-amz-credential, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-credential","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-algorithm":{"description":"Параметр x-amz-algorithm, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-algorithm","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-date":{"description":"Параметр x-amz-date, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-date","hasDynamicHelp":false,"multiple":false,"type":"option"},"x-amz-signature":{"description":"Параметр x-amz-signature, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"x-amz-signature","hasDynamicHelp":false,"multiple":false,"type":"option"},"key":{"description":"Параметр key, полученный в ответе на запрос [Получение подписи, ключа и других параметров](POST /uploads)","name":"key","hasDynamicHelp":false,"multiple":false,"type":"option"},"file":{"description":"Файл для загрузки","name":"file","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:direct-url","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"apiMethod":"POST","apiPath":"/direct_url","requiredFlags":["content-disposition","acl","policy","x-amz-credential","x-amz-algorithm","x-amz-date","x-amz-signature","key"],"isESM":true,"relativePath":["dist","commands","common","direct-url.js"]},"common:get-exports":{"aliases":[],"args":{"id":{"description":"Идентификатор экспорта","name":"id","required":true}},"description":"Скачать архив экспорта","examples":["Экспорт истории чата:\n $ pachca common get-exports"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"save":{"description":"Путь для сохранения файла","name":"save","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:get-exports","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_exports:read","plan":"corporation","apiMethod":"GET","apiPath":"/chats/exports/{id}","isESM":true,"relativePath":["dist","commands","common","get-exports.js"]},"common:request-export":{"aliases":[],"args":{},"description":"Экспорт сообщений","examples":["Экспорт истории чата:\n $ pachca common request-export"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"start-at":{"description":"Дата начала для экспорта (ISO-8601, UTC+0) в формате YYYY-MM-DD","name":"start-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"end-at":{"description":"Дата окончания для экспорта (ISO-8601, UTC+0) в формате YYYY-MM-DD","name":"end-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"webhook-url":{"description":"Адрес, на который будет отправлен вебхук по завершению экспорта","name":"webhook-url","hasDynamicHelp":false,"multiple":false,"type":"option"},"chat-ids":{"description":"Массив идентификаторов чатов. Указывается, если нужно получить сообщения только некоторых чатов.","name":"chat-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"skip-chats-file":{"description":"Пропуск формирования файла со списком чатов (chats.json)","name":"skip-chats-file","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:request-export","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_exports:write","plan":"corporation","apiMethod":"POST","apiPath":"/chats/exports","requiredFlags":["start-at","end-at","webhook-url"],"isESM":true,"relativePath":["dist","commands","common","request-export.js"]},"common:uploads":{"aliases":[],"args":{},"description":"Получение подписи, ключа и других параметров","examples":["Изменить вложения сообщения:\n $ pachca common uploads"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"common:uploads","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"uploads:write","apiMethod":"POST","apiPath":"/uploads","defaultColumns":["Content-Disposition","acl","policy","x-amz-credential","x-amz-algorithm"],"isESM":true,"relativePath":["dist","commands","common","uploads.js"]},"config:get":{"aliases":[],"args":{"key":{"description":"Configuration key","name":"key","required":true}},"description":"Получение значения конфигурации","examples":["<%= config.bin %> config get defaults.output"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"config:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","config","get.js"]},"config:list":{"aliases":[],"args":{},"description":"Список всех настроек","examples":["<%= config.bin %> config list","<%= config.bin %> config list -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"config:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","config","list.js"]},"config:set":{"aliases":[],"args":{"key":{"description":"Configuration key","name":"key","required":true},"value":{"description":"Configuration value","name":"value","required":true}},"description":"Установка значения конфигурации","examples":["<%= config.bin %> config set defaults.output json","<%= config.bin %> config set defaults.timeout 60"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"config:set","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","config","set.js"]},"doctor":{"aliases":[],"args":{},"description":"Диагностика окружения: Node.js, сеть, токен, конфигурация","examples":["<%= config.bin %> doctor","<%= config.bin %> doctor -o json"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"doctor","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","doctor.js"]},"group-tags:create":{"aliases":[],"args":{},"description":"Новый тег","examples":["Массовое создание сотрудников с тегами:\n $ pachca group-tags create","Получить всех сотрудников тега/департамента:\n $ pachca group-tags list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название тега","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:write","apiMethod":"POST","apiPath":"/group_tags","defaultColumns":["id","name","users_count"],"requiredFlags":["name"],"isESM":true,"relativePath":["dist","commands","group-tags","create.js"]},"group-tags:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Удаление тега","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:write","apiMethod":"DELETE","apiPath":"/group_tags/{id}","isESM":true,"relativePath":["dist","commands","group-tags","delete.js"]},"group-tags:get":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Информация о теге","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:read","apiMethod":"GET","apiPath":"/group_tags/{id}","defaultColumns":["id","name","users_count"],"isESM":true,"relativePath":["dist","commands","group-tags","get.js"]},"group-tags:list":{"aliases":[],"args":{},"description":"Список тегов сотрудников","examples":["Массовое создание сотрудников с тегами:\n $ pachca group-tags create","Получить всех сотрудников тега/департамента:\n $ pachca group-tags list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"names":{"description":"Массив названий тегов, по которым вы хотите отфильтровать список (через запятую)","name":"names","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:read","apiMethod":"GET","apiPath":"/group_tags","defaultColumns":["id","name","users_count"],"isESM":true,"relativePath":["dist","commands","group-tags","list.js"]},"group-tags:list-users":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Список сотрудников тега","examples":["Получить всех сотрудников тега/департамента:\n $ pachca group-tags list-users"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:list-users","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:read","apiMethod":"GET","apiPath":"/group_tags/{id}/users","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","group-tags","list-users.js"]},"group-tags:update":{"aliases":[],"args":{"id":{"description":"Идентификатор тега","name":"id","required":true}},"description":"Редактирование тега","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"name":{"description":"Название тега","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"group-tags:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"group_tags:write","apiMethod":"PUT","apiPath":"/group_tags/{id}","defaultColumns":["id","name","users_count"],"requiredFlags":["name"],"isESM":true,"relativePath":["dist","commands","group-tags","update.js"]},"guide":{"aliases":[],"args":{"query":{"description":"Search query","name":"query","required":false}},"description":"Поиск сценариев использования","examples":["<%= config.bin %> guide \"отправить файл\"","<%= config.bin %> guide \"создать бота\"","<%= config.bin %> guide"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"guide","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","guide.js"]},"introspect":{"aliases":[],"args":{"command":{"description":"Command name (e.g., \"messages create\")","name":"command","required":false}},"description":"Метаданные команды в машиночитаемом формате","examples":["<%= config.bin %> introspect messages create","<%= config.bin %> introspect"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"introspect","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":false,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","introspect.js"]},"link-previews:add":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Unfurl (разворачивание ссылок)","examples":["Разворачивание ссылок (unfurling):\n $ pachca link-previews add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"link-previews":{"description":"`JSON` карта предпросмотров ссылок, где каждый ключ — `URL`, который был получен в исходящем вебхуке о новом сообщении.","name":"link-previews","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"link-previews:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"link_previews:write","apiMethod":"POST","apiPath":"/messages/{id}/link_previews","requiredFlags":["link-previews"],"isESM":true,"relativePath":["dist","commands","link-previews","add.js"]},"members:add":{"aliases":[],"args":{"id":{"description":"Идентификатор чата (беседа, канал или чат треда)","name":"id","required":true}},"description":"Добавление пользователей","examples":["Подписаться на тред сообщения:\n $ pachca members add","Упомянуть пользователя по имени:\n $ pachca members list","Создать канал и пригласить участников:\n $ pachca members add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"member-ids":{"description":"Массив идентификаторов пользователей, которые станут участниками","name":"member-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"silent":{"description":"Не создавать в чате системное сообщение о добавлении участника","name":"silent","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"POST","apiPath":"/chats/{id}/members","requiredFlags":["member-ids"],"isESM":true,"relativePath":["dist","commands","members","add.js"]},"members:add-group-tags":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true}},"description":"Добавление тегов","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"group-tag-ids":{"description":"Массив идентификаторов тегов, которые станут участниками","name":"group-tag-ids","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:add-group-tags","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"POST","apiPath":"/chats/{id}/group_tags","requiredFlags":["group-tag-ids"],"isESM":true,"relativePath":["dist","commands","members","add-group-tags.js"]},"members:leave":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true}},"description":"Выход из беседы или канала","examples":["Архивация и управление чатом:\n $ pachca members leave"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:leave","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chats:leave","apiMethod":"DELETE","apiPath":"/chats/{id}/leave","isESM":true,"relativePath":["dist","commands","members","leave.js"]},"members:list":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true}},"description":"Список участников чата","examples":["Подписаться на тред сообщения:\n $ pachca members add","Упомянуть пользователя по имени:\n $ pachca members list","Создать канал и пригласить участников:\n $ pachca members add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"role":{"description":"Роль в чате","name":"role","default":"all","hasDynamicHelp":false,"multiple":false,"options":["all","owner","admin","editor","member"],"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:read","apiMethod":"GET","apiPath":"/chats/{id}/members","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","members","list.js"]},"members:remove":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true},"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Исключение пользователя","examples":["Архивация и управление чатом:\n $ pachca members update","Архивация и управление чатом:\n $ pachca members remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:remove","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"DELETE","apiPath":"/chats/{id}/members/{user_id}","isESM":true,"relativePath":["dist","commands","members","remove.js"]},"members:remove-group-tag":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true},"tag_id":{"description":"Идентификатор тега (pachca tags list)","name":"tag_id","required":true}},"description":"Исключение тега","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:remove-group-tag","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"DELETE","apiPath":"/chats/{id}/group_tags/{tag_id}","isESM":true,"relativePath":["dist","commands","members","remove-group-tag.js"]},"members:update":{"aliases":[],"args":{"id":{"description":"Идентификатор чата","name":"id","required":true},"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Редактирование роли","examples":["Архивация и управление чатом:\n $ pachca members update","Архивация и управление чатом:\n $ pachca members remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"role":{"description":"Роль","name":"role","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"members:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"chat_members:write","apiMethod":"PUT","apiPath":"/chats/{id}/members/{user_id}","requiredFlags":["role"],"isESM":true,"relativePath":["dist","commands","members","update.js"]},"messages:create":{"aliases":[],"args":{},"description":"Новое сообщение","examples":["Найти чат по имени и отправить сообщение:\n $ pachca messages create","Отправить сообщение в канал или беседу (если chat_id известен):\n $ pachca messages create","Отправить личное сообщение пользователю:\n $ pachca messages create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"entity-type":{"description":"Тип сущности","name":"entity-type","hasDynamicHelp":false,"multiple":false,"type":"option"},"entity-id":{"description":"Идентификатор сущности (pachca chats list | pachca users list)","name":"entity-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"content":{"description":"Текст сообщения","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"files":{"description":"Прикрепляемые файлы","name":"files","hasDynamicHelp":false,"multiple":false,"type":"option"},"buttons":{"description":"Массив строк, каждая из которых представлена массивом кнопок. Максимум 100 кнопок у сообщения, до 8 кнопок в строке.","name":"buttons","hasDynamicHelp":false,"multiple":false,"type":"option"},"parent-message-id":{"description":"Идентификатор сообщения. Указывается в случае, если вы отправляете ответ на другое сообщение.","name":"parent-message-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-avatar-url":{"description":"Ссылка на специальную аватарку отправителя для этого сообщения. Использование этого поля возможно только с access_token бота. (макс. 255 символов)","name":"display-avatar-url","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-name":{"description":"Полное специальное имя отправителя для этого сообщения. Использование этого поля возможно только с access_token бота. (макс. 255 символов)","name":"display-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"skip-invite-mentions":{"description":"Пропуск добавления упоминаемых пользователей в тред. Работает только при отправке сообщения в тред.","name":"skip-invite-mentions","allowNo":true,"type":"boolean"},"link-preview":{"description":"Отображение предпросмотра первой найденной ссылки в тексте сообщения","name":"link-preview","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:create","apiMethod":"POST","apiPath":"/messages","defaultColumns":["id","content","created_at","entity_type","entity_id"],"requiredFlags":["entity-id","content"],"isESM":true,"relativePath":["dist","commands","messages","create.js"]},"messages:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Удаление сообщения","examples":["Получить вложения из сообщения:\n $ pachca messages get","Отредактировать сообщение:\n $ pachca messages update","Изменить вложения сообщения:\n $ pachca messages get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:delete","apiMethod":"DELETE","apiPath":"/messages/{id}","isESM":true,"relativePath":["dist","commands","messages","delete.js"]},"messages:get":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Информация о сообщении","examples":["Получить вложения из сообщения:\n $ pachca messages get","Отредактировать сообщение:\n $ pachca messages update","Изменить вложения сообщения:\n $ pachca messages get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:read","apiMethod":"GET","apiPath":"/messages/{id}","defaultColumns":["id","content","created_at","entity_type","entity_id"],"isESM":true,"relativePath":["dist","commands","messages","get.js"]},"messages:list":{"aliases":[],"args":{"chat_id":{"description":"Идентификатор чата (беседа, канал, диалог или чат треда)","name":"chat_id","required":false}},"description":"Список сообщений чата","examples":["Найти чат по имени и отправить сообщение:\n $ pachca messages create","Отправить сообщение в канал или беседу (если chat_id известен):\n $ pachca messages create","Отправить личное сообщение пользователю:\n $ pachca messages create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"chat-id":{"description":"Идентификатор чата (беседа, канал, диалог или чат треда)","name":"chat-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"sort":{"description":"Поле сортировки","name":"sort","default":"id","hasDynamicHelp":false,"multiple":false,"options":["id"],"type":"option"},"order":{"description":"Направление сортировки","name":"order","default":"desc","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:read","apiMethod":"GET","apiPath":"/messages","defaultColumns":["id","content","created_at","entity_type","entity_id"],"requiredFlags":["chat-id"],"isESM":true,"relativePath":["dist","commands","messages","list.js"]},"messages:pin":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Закрепление сообщения","examples":["Закрепить/открепить сообщение:\n $ pachca messages pin","Закрепить/открепить сообщение:\n $ pachca messages unpin"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:pin","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"pins:write","apiMethod":"POST","apiPath":"/messages/{id}/pin","isESM":true,"relativePath":["dist","commands","messages","pin.js"]},"messages:unpin":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Открепление сообщения","examples":["Закрепить/открепить сообщение:\n $ pachca messages pin","Закрепить/открепить сообщение:\n $ pachca messages unpin"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:unpin","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"pins:write","apiMethod":"DELETE","apiPath":"/messages/{id}/pin","isESM":true,"relativePath":["dist","commands","messages","unpin.js"]},"messages:update":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения (pachca messages list)","name":"id","required":true}},"description":"Редактирование сообщения","examples":["Получить вложения из сообщения:\n $ pachca messages get","Отредактировать сообщение:\n $ pachca messages update","Изменить вложения сообщения:\n $ pachca messages get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"content":{"description":"Текст сообщения","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"files":{"description":"Прикрепляемые файлы","name":"files","hasDynamicHelp":false,"multiple":false,"type":"option"},"buttons":{"description":"Массив строк, каждая из которых представлена массивом кнопок. Максимум 100 кнопок у сообщения, до 8 кнопок в строке. Для удаления кнопок пришлите пустой массив.","name":"buttons","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-avatar-url":{"description":"Ссылка на специальную аватарку отправителя для этого сообщения. Использование этого поля возможно только с access_token бота.","name":"display-avatar-url","hasDynamicHelp":false,"multiple":false,"type":"option"},"display-name":{"description":"Полное специальное имя отправителя для этого сообщения. Использование этого поля возможно только с access_token бота.","name":"display-name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"messages:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:update","apiMethod":"PUT","apiPath":"/messages/{id}","defaultColumns":["id","content","created_at","entity_type","entity_id"],"isESM":true,"relativePath":["dist","commands","messages","update.js"]},"profile:delete-avatar":{"aliases":[],"args":{},"description":"Удаление аватара","examples":["Загрузить аватар профиля:\n $ pachca profile update-avatar","Удалить аватар профиля:\n $ pachca profile delete-avatar"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:delete-avatar","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_avatar:write","apiMethod":"DELETE","apiPath":"/profile/avatar","isESM":true,"relativePath":["dist","commands","profile","delete-avatar.js"]},"profile:delete-status":{"aliases":[],"args":{},"description":"Удаление статуса","examples":["Установить статус:\n $ pachca profile update-status","Сбросить статус:\n $ pachca profile delete-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:delete-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_status:write","apiMethod":"DELETE","apiPath":"/profile/status","isESM":true,"relativePath":["dist","commands","profile","delete-status.js"]},"profile:get":{"aliases":[],"args":{},"description":"Информация о профиле","examples":["Получить свой профиль:\n $ pachca profile get","Получить кастомные поля профиля:\n $ pachca profile get"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile:read","apiMethod":"GET","apiPath":"/profile","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","profile","get.js"]},"profile:get-info":{"aliases":[],"args":{},"description":"Информация о токене","examples":["Проверить свой токен:\n $ pachca profile get-info"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:get-info","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"apiMethod":"GET","apiPath":"/oauth/token/info","defaultColumns":["id","name","created_at","token","user_id"],"isESM":true,"relativePath":["dist","commands","profile","get-info.js"]},"profile:get-status":{"aliases":[],"args":{},"description":"Текущий статус","examples":["Установить статус:\n $ pachca profile update-status","Сбросить статус:\n $ pachca profile delete-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:get-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_status:read","apiMethod":"GET","apiPath":"/profile/status","defaultColumns":["title","emoji","expires_at","is_away"],"isESM":true,"relativePath":["dist","commands","profile","get-status.js"]},"profile:update-avatar":{"aliases":[],"args":{},"description":"Загрузка аватара","examples":["Загрузить аватар профиля:\n $ pachca profile update-avatar","Удалить аватар профиля:\n $ pachca profile delete-avatar"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"file":{"description":"Файл изображения для аватара","name":"file","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:update-avatar","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_avatar:write","apiMethod":"PUT","apiPath":"/profile/avatar","defaultColumns":["image_url"],"isESM":true,"relativePath":["dist","commands","profile","update-avatar.js"]},"profile:update-status":{"aliases":[],"args":{},"description":"Новый статус","examples":["Установить статус:\n $ pachca profile update-status","Сбросить статус:\n $ pachca profile delete-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"emoji":{"description":"Emoji символ статуса","name":"emoji","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Текст статуса","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"expires-at":{"description":"Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ","name":"expires-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"is-away":{"description":"Режим «Нет на месте»","name":"is-away","allowNo":true,"type":"boolean"},"away-message":{"description":"Текст сообщения при режиме «Нет на месте». Отображается в профиле и при личных сообщениях/упоминаниях. (макс. 1024 символов)","name":"away-message","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"profile:update-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"profile_status:write","apiMethod":"PUT","apiPath":"/profile/status","defaultColumns":["title","emoji","expires_at","is_away"],"requiredFlags":["emoji","title"],"isESM":true,"relativePath":["dist","commands","profile","update-status.js"]},"reactions:add":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Добавление реакции","examples":["Добавить реакцию на сообщение:\n $ pachca reactions add","Добавить реакцию на сообщение:\n $ pachca reactions remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"code":{"description":"Emoji символ реакции","name":"code","hasDynamicHelp":false,"multiple":false,"type":"option"},"name":{"description":"Текстовое имя эмодзи (используется для кастомных эмодзи)","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"reactions:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"reactions:write","apiMethod":"POST","apiPath":"/messages/{id}/reactions","defaultColumns":["name","created_at","user_id","code"],"requiredFlags":["code"],"isESM":true,"relativePath":["dist","commands","reactions","add.js"]},"reactions:list":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Список реакций","examples":["Добавить реакцию на сообщение:\n $ pachca reactions add","Добавить реакцию на сообщение:\n $ pachca reactions remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"reactions:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"reactions:read","apiMethod":"GET","apiPath":"/messages/{id}/reactions","defaultColumns":["name","created_at","user_id","code"],"isESM":true,"relativePath":["dist","commands","reactions","list.js"]},"reactions:remove":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Удаление реакции","examples":["Добавить реакцию на сообщение:\n $ pachca reactions add","Добавить реакцию на сообщение:\n $ pachca reactions remove"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"code":{"description":"Emoji символ реакции","name":"code","hasDynamicHelp":false,"multiple":false,"type":"option"},"name":{"description":"Текстовое имя эмодзи (используется для кастомных эмодзи)","name":"name","hasDynamicHelp":false,"multiple":false,"type":"option"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"reactions:remove","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"reactions:write","apiMethod":"DELETE","apiPath":"/messages/{id}/reactions","requiredFlags":["code"],"isESM":true,"relativePath":["dist","commands","reactions","remove.js"]},"read-member:list-readers":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Список прочитавших сообщение","examples":["Проверить, кто прочитал сообщение:\n $ pachca read-member list-readers"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"read-member:list-readers","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"messages:read","apiMethod":"GET","apiPath":"/messages/{id}/read_member_ids","isESM":true,"relativePath":["dist","commands","read-member","list-readers.js"]},"search:list-chats":{"aliases":[],"args":{},"description":"Поиск чатов","examples":["Найти чат по имени и отправить сообщение:\n $ pachca search list-chats","Найти чат по названию:\n $ pachca search list-chats"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Текст поискового запроса","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"created-from":{"description":"Фильтр по дате создания (от)","name":"created-from","hasDynamicHelp":false,"multiple":false,"type":"option"},"created-to":{"description":"Фильтр по дате создания (до)","name":"created-to","hasDynamicHelp":false,"multiple":false,"type":"option"},"active":{"description":"Фильтр по активности чата","name":"active","allowNo":true,"type":"boolean"},"chat-subtype":{"description":"Фильтр по типу чата","name":"chat-subtype","hasDynamicHelp":false,"multiple":false,"options":["discussion","thread"],"type":"option"},"personal":{"description":"Фильтр по личным чатам","name":"personal","allowNo":true,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"search:list-chats","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"search:chats","apiMethod":"GET","apiPath":"/search/chats","defaultColumns":["id","name","created_at","owner_id","channel"],"isESM":true,"relativePath":["dist","commands","search","list-chats.js"]},"search:list-messages":{"aliases":[],"args":{},"description":"Поиск сообщений","examples":["Найти сообщение по тексту:\n $ pachca search list-messages"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Текст поискового запроса","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"created-from":{"description":"Фильтр по дате создания (от)","name":"created-from","hasDynamicHelp":false,"multiple":false,"type":"option"},"created-to":{"description":"Фильтр по дате создания (до)","name":"created-to","hasDynamicHelp":false,"multiple":false,"type":"option"},"chat-ids":{"description":"Фильтр по ID чатов (через запятую)","name":"chat-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"user-ids":{"description":"Фильтр по ID авторов сообщений (через запятую)","name":"user-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"active":{"description":"Фильтр по активности чата","name":"active","allowNo":true,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"search:list-messages","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"search:messages","apiMethod":"GET","apiPath":"/search/messages","defaultColumns":["id","content","created_at","entity_type","entity_id"],"isESM":true,"relativePath":["dist","commands","search","list-messages.js"]},"search:list-users":{"aliases":[],"args":{},"description":"Поиск сотрудников","examples":["Отправить личное сообщение пользователю:\n $ pachca search list-users","Упомянуть пользователя по имени:\n $ pachca search list-users","Найти сотрудника по имени:\n $ pachca search list-users"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Текст поискового запроса","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"sort":{"description":"Сортировка результатов","name":"sort","hasDynamicHelp":false,"multiple":false,"options":["by_score","alphabetical"],"type":"option"},"order":{"description":"Направление сортировки","name":"order","hasDynamicHelp":false,"multiple":false,"options":["asc","desc"],"type":"option"},"created-from":{"description":"Фильтр по дате создания (от)","name":"created-from","hasDynamicHelp":false,"multiple":false,"type":"option"},"created-to":{"description":"Фильтр по дате создания (до)","name":"created-to","hasDynamicHelp":false,"multiple":false,"type":"option"},"company-roles":{"description":"Фильтр по ролям сотрудников (через запятую)","name":"company-roles","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"search:list-users","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"search:users","apiMethod":"GET","apiPath":"/search/users","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","search","list-users.js"]},"security:list":{"aliases":[],"args":{},"description":"Журнал аудита событий","examples":["Получить журнал аудита событий:\n $ pachca security list","Мониторинг подозрительных входов:\n $ pachca security list","Экспорт логов за период:\n $ pachca security list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"start-time":{"description":"Начальная метка времени (включительно)","name":"start-time","hasDynamicHelp":false,"multiple":false,"type":"option"},"end-time":{"description":"Конечная метка времени (исключительно)","name":"end-time","hasDynamicHelp":false,"multiple":false,"type":"option"},"event-key":{"description":"Фильтр по конкретному типу события","name":"event-key","hasDynamicHelp":false,"multiple":false,"options":["user_login","user_logout","user_2fa_fail","user_2fa_success","user_created","user_deleted","user_role_changed","user_updated","tag_created","tag_deleted","user_added_to_tag","user_removed_from_tag","chat_created","chat_renamed","chat_permission_changed","user_chat_join","user_chat_leave","tag_added_to_chat","tag_removed_from_chat","message_updated","message_deleted","message_created","reaction_created","reaction_deleted","thread_created","access_token_created","access_token_updated","access_token_destroy","kms_encrypt","kms_decrypt","audit_events_accessed","dlp_violation_detected","search_users_api","search_chats_api","search_messages_api"],"type":"option"},"actor-id":{"description":"Идентификатор пользователя, выполнившего действие","name":"actor-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"actor-type":{"description":"Тип актора","name":"actor-type","hasDynamicHelp":false,"multiple":false,"type":"option"},"entity-id":{"description":"Идентификатор затронутой сущности","name":"entity-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"entity-type":{"description":"Тип сущности","name":"entity-type","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"security:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"audit_events:read","plan":"corporation","apiMethod":"GET","apiPath":"/audit_events","defaultColumns":["id","created_at","event_key","entity_id","entity_type"],"isESM":true,"relativePath":["dist","commands","security","list.js"]},"tasks:create":{"aliases":[],"args":{},"description":"Новое напоминание","examples":["Форма заявки/запроса:\n $ pachca tasks create","Создать напоминание:\n $ pachca tasks create","Получить список предстоящих задач:\n $ pachca tasks list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"kind":{"description":"Тип","name":"kind","hasDynamicHelp":false,"multiple":false,"type":"option"},"content":{"description":"Описание (по умолчанию — название типа)","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"due-at":{"description":"Срок выполнения напоминания (ISO-8601) в формате YYYY-MM-DDThh:mm:ss.sssTZD. Если указано время 23:59:59.000, то напоминание будет создано на весь день (без указания времени).","name":"due-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"priority":{"description":"Приоритет: 1, 2 (важно) или 3 (очень важно).","name":"priority","hasDynamicHelp":false,"multiple":false,"type":"option"},"performer-ids":{"description":"Массив идентификаторов пользователей, привязываемых к напоминанию как «ответственные» (по умолчанию ответственным назначается вы)","name":"performer-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"chat-id":{"description":"Идентификатор чата, к которому привязывается напоминание (pachca chats list)","name":"chat-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"all-day":{"description":"Напоминание на весь день (без указания времени)","name":"all-day","allowNo":true,"type":"boolean"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:create","apiMethod":"POST","apiPath":"/tasks","defaultColumns":["id","content","created_at","kind","due_at"],"requiredFlags":["kind"],"isESM":true,"relativePath":["dist","commands","tasks","create.js"]},"tasks:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор напоминания (pachca tasks list)","name":"id","required":true}},"description":"Удаление напоминания","examples":["Получить задачу по ID:\n $ pachca tasks get","Отметить задачу выполненной:\n $ pachca tasks update","Обновить задачу (перенести срок, сменить ответственных):\n $ pachca tasks update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:delete","apiMethod":"DELETE","apiPath":"/tasks/{id}","isESM":true,"relativePath":["dist","commands","tasks","delete.js"]},"tasks:get":{"aliases":[],"args":{"id":{"description":"Идентификатор напоминания (pachca tasks list)","name":"id","required":true}},"description":"Информация о напоминании","examples":["Получить задачу по ID:\n $ pachca tasks get","Отметить задачу выполненной:\n $ pachca tasks update","Обновить задачу (перенести срок, сменить ответственных):\n $ pachca tasks update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:read","apiMethod":"GET","apiPath":"/tasks/{id}","defaultColumns":["id","content","created_at","kind","due_at"],"isESM":true,"relativePath":["dist","commands","tasks","get.js"]},"tasks:list":{"aliases":[],"args":{},"description":"Список напоминаний","examples":["Форма заявки/запроса:\n $ pachca tasks create","Создать напоминание:\n $ pachca tasks create","Получить список предстоящих задач:\n $ pachca tasks list"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:read","apiMethod":"GET","apiPath":"/tasks","defaultColumns":["id","content","created_at","kind","due_at"],"isESM":true,"relativePath":["dist","commands","tasks","list.js"]},"tasks:update":{"aliases":[],"args":{"id":{"description":"Идентификатор напоминания (pachca tasks list)","name":"id","required":true}},"description":"Редактирование напоминания","examples":["Получить задачу по ID:\n $ pachca tasks get","Отметить задачу выполненной:\n $ pachca tasks update","Обновить задачу (перенести срок, сменить ответственных):\n $ pachca tasks update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"kind":{"description":"Тип","name":"kind","hasDynamicHelp":false,"multiple":false,"type":"option"},"content":{"description":"Описание","name":"content","hasDynamicHelp":false,"multiple":false,"type":"option"},"due-at":{"description":"Срок выполнения напоминания (ISO-8601) в формате YYYY-MM-DDThh:mm:ss.sssTZD. Если указано время 23:59:59.000, то напоминание будет создано на весь день (без указания времени).","name":"due-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"priority":{"description":"Приоритет: 1, 2 (важно) или 3 (очень важно).","name":"priority","hasDynamicHelp":false,"multiple":false,"type":"option"},"performer-ids":{"description":"Массив идентификаторов пользователей, привязываемых к напоминанию как «ответственные»","name":"performer-ids","hasDynamicHelp":false,"multiple":false,"type":"option"},"status":{"description":"Статус","name":"status","hasDynamicHelp":false,"multiple":false,"type":"option"},"all-day":{"description":"Напоминание на весь день (без указания времени)","name":"all-day","allowNo":true,"type":"boolean"},"done-at":{"description":"Дата и время выполнения напоминания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ","name":"done-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"tasks:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"tasks:update","apiMethod":"PUT","apiPath":"/tasks/{id}","defaultColumns":["id","content","created_at","kind","due_at"],"isESM":true,"relativePath":["dist","commands","tasks","update.js"]},"threads:add":{"aliases":[],"args":{"id":{"description":"Идентификатор сообщения","name":"id","required":true}},"description":"Новый тред","examples":["Ответить в тред (комментарий к сообщению):\n $ pachca thread add","Подписаться на тред сообщения:\n $ pachca thread add"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"threads:add","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"threads:create","apiMethod":"POST","apiPath":"/messages/{id}/thread","defaultColumns":["id","chat_id","message_id","message_chat_id","updated_at"],"isESM":true,"relativePath":["dist","commands","threads","add.js"]},"threads:get":{"aliases":[],"args":{"id":{"description":"Идентификатор треда","name":"id","required":true}},"description":"Информация о треде","flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"threads:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"threads:read","apiMethod":"GET","apiPath":"/threads/{id}","defaultColumns":["id","chat_id","message_id","message_chat_id","updated_at"],"isESM":true,"relativePath":["dist","commands","threads","get.js"]},"upgrade":{"aliases":[],"args":{},"description":"Обновить CLI до последней версии","examples":["<%= config.bin %> upgrade"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"upgrade","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","upgrade.js"]},"upload":{"aliases":[],"args":{"file":{"description":"Путь к файлу или - для stdin","name":"file","required":true}},"description":"Загрузить файл (получает подпись и загружает автоматически)","examples":["<%= config.bin %> upload photo.jpg","cat data.csv | <%= config.bin %> upload -"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"upload","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"uploads:write","isESM":true,"relativePath":["dist","commands","upload.js"]},"users:create":{"aliases":[],"args":{},"description":"Создать сотрудника","examples":["Проверить, кто прочитал сообщение:\n $ pachca users list","Разослать уведомление нескольким пользователям:\n $ pachca users list","Массовое создание сотрудников с тегами:\n $ pachca users create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"first-name":{"description":"Имя","name":"first-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"last-name":{"description":"Фамилия","name":"last-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"email":{"description":"Электронная почта","name":"email","hasDynamicHelp":false,"multiple":false,"type":"option"},"phone-number":{"description":"Телефон","name":"phone-number","hasDynamicHelp":false,"multiple":false,"type":"option"},"nickname":{"description":"Имя пользователя","name":"nickname","hasDynamicHelp":false,"multiple":false,"type":"option"},"department":{"description":"Департамент","name":"department","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Должность","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"role":{"description":"Уровень доступа","name":"role","hasDynamicHelp":false,"multiple":false,"type":"option"},"suspended":{"description":"Деактивация пользователя","name":"suspended","allowNo":true,"type":"boolean"},"list-tags":{"description":"Массив тегов, привязываемых к сотруднику","name":"list-tags","hasDynamicHelp":false,"multiple":false,"type":"option"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"},"skip-email-notify":{"description":"Пропуск этапа отправки приглашения сотруднику. Сотруднику не будет отправлено письмо на электронную почту с приглашением создать аккаунт. Полезно при предварительном создании аккаунтов перед входом через SSO.","name":"skip-email-notify","allowNo":true,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:create","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:create","apiMethod":"POST","apiPath":"/users","defaultColumns":["id","title","first_name","last_name","email"],"requiredFlags":["email"],"isESM":true,"relativePath":["dist","commands","users","create.js"]},"users:delete":{"aliases":[],"args":{"id":{"description":"Идентификатор пользователя (pachca users list)","name":"id","required":true}},"description":"Удаление сотрудника","examples":["Получить сотрудника по ID:\n $ pachca users get","Массовое создание сотрудников с тегами:\n $ pachca users update","Offboarding сотрудника:\n $ pachca users update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:delete","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:delete","apiMethod":"DELETE","apiPath":"/users/{id}","isESM":true,"relativePath":["dist","commands","users","delete.js"]},"users:get":{"aliases":[],"args":{"id":{"description":"Идентификатор пользователя (pachca users list)","name":"id","required":true}},"description":"Информация о сотруднике","examples":["Получить сотрудника по ID:\n $ pachca users get","Массовое создание сотрудников с тегами:\n $ pachca users update","Offboarding сотрудника:\n $ pachca users update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:get","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:read","apiMethod":"GET","apiPath":"/users/{id}","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","users","get.js"]},"users:get-status":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Статус сотрудника","examples":["Управление статусом сотрудника:\n $ pachca users get-status","Управление статусом сотрудника:\n $ pachca users update-status","Управление статусом сотрудника:\n $ pachca users remove-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:get-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_status:read","apiMethod":"GET","apiPath":"/users/{user_id}/status","defaultColumns":["title","emoji","expires_at","is_away"],"isESM":true,"relativePath":["dist","commands","users","get-status.js"]},"users:list":{"aliases":[],"args":{},"description":"Список сотрудников","examples":["Проверить, кто прочитал сообщение:\n $ pachca users list","Разослать уведомление нескольким пользователям:\n $ pachca users list","Массовое создание сотрудников с тегами:\n $ pachca users create"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"query":{"description":"Поисковая фраза для фильтрации результатов. Поиск работает по полям: `first_name` (имя), `last_name` (фамилия), `email` (электронная почта), `phone_number` (телефон) и `nickname` (никнейм).","name":"query","hasDynamicHelp":false,"multiple":false,"type":"option"},"limit":{"description":"Количество результатов на страницу","name":"limit","hasDynamicHelp":false,"multiple":false,"type":"option"},"cursor":{"description":"Курсор для следующей страницы","name":"cursor","hasDynamicHelp":false,"multiple":false,"type":"option"},"all":{"description":"Загрузить все страницы автоматически","name":"all","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:list","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:read","apiMethod":"GET","apiPath":"/users","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","users","list.js"]},"users:remove-avatar":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Удаление аватара сотрудника","examples":["Загрузить аватар сотрудника:\n $ pachca users update-avatar","Удалить аватар сотрудника:\n $ pachca users remove-avatar"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:remove-avatar","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_avatar:write","apiMethod":"DELETE","apiPath":"/users/{user_id}/avatar","isESM":true,"relativePath":["dist","commands","users","remove-avatar.js"]},"users:remove-status":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Удаление статуса сотрудника","examples":["Управление статусом сотрудника:\n $ pachca users get-status","Управление статусом сотрудника:\n $ pachca users update-status","Управление статусом сотрудника:\n $ pachca users remove-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"force":{"description":"Пропустить подтверждение","name":"force","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:remove-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_status:write","apiMethod":"DELETE","apiPath":"/users/{user_id}/status","isESM":true,"relativePath":["dist","commands","users","remove-status.js"]},"users:update":{"aliases":[],"args":{"id":{"description":"Идентификатор пользователя (pachca users list)","name":"id","required":true}},"description":"Редактирование сотрудника","examples":["Получить сотрудника по ID:\n $ pachca users get","Массовое создание сотрудников с тегами:\n $ pachca users update","Offboarding сотрудника:\n $ pachca users update"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"first-name":{"description":"Имя","name":"first-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"last-name":{"description":"Фамилия","name":"last-name","hasDynamicHelp":false,"multiple":false,"type":"option"},"email":{"description":"Электронная почта","name":"email","hasDynamicHelp":false,"multiple":false,"type":"option"},"phone-number":{"description":"Телефон","name":"phone-number","hasDynamicHelp":false,"multiple":false,"type":"option"},"nickname":{"description":"Имя пользователя","name":"nickname","hasDynamicHelp":false,"multiple":false,"type":"option"},"department":{"description":"Департамент","name":"department","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Должность","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"role":{"description":"Уровень доступа","name":"role","hasDynamicHelp":false,"multiple":false,"type":"option"},"suspended":{"description":"Деактивация пользователя","name":"suspended","allowNo":true,"type":"boolean"},"list-tags":{"description":"Массив тегов, привязываемых к сотруднику","name":"list-tags","hasDynamicHelp":false,"multiple":false,"type":"option"},"custom-properties":{"description":"Задаваемые дополнительные поля","name":"custom-properties","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:update","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"users:update","apiMethod":"PUT","apiPath":"/users/{id}","defaultColumns":["id","title","first_name","last_name","email"],"isESM":true,"relativePath":["dist","commands","users","update.js"]},"users:update-avatar":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Загрузка аватара сотрудника","examples":["Загрузить аватар сотрудника:\n $ pachca users update-avatar","Удалить аватар сотрудника:\n $ pachca users remove-avatar"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"file":{"description":"Файл изображения для аватара","name":"file","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:update-avatar","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_avatar:write","apiMethod":"PUT","apiPath":"/users/{user_id}/avatar","defaultColumns":["image_url"],"isESM":true,"relativePath":["dist","commands","users","update-avatar.js"]},"users:update-status":{"aliases":[],"args":{"user_id":{"description":"Идентификатор пользователя (pachca users list)","name":"user_id","required":true}},"description":"Новый статус сотрудника","examples":["Управление статусом сотрудника:\n $ pachca users get-status","Управление статусом сотрудника:\n $ pachca users update-status","Управление статусом сотрудника:\n $ pachca users remove-status"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"emoji":{"description":"Emoji символ статуса","name":"emoji","hasDynamicHelp":false,"multiple":false,"type":"option"},"title":{"description":"Текст статуса","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"expires-at":{"description":"Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ","name":"expires-at","hasDynamicHelp":false,"multiple":false,"type":"option"},"is-away":{"description":"Режим «Нет на месте»","name":"is-away","allowNo":true,"type":"boolean"},"away-message":{"description":"Текст сообщения при режиме «Нет на месте». Отображается в профиле и при личных сообщениях/упоминаниях. (макс. 1024 символов)","name":"away-message","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"users:update-status","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"user_status:write","apiMethod":"PUT","apiPath":"/users/{user_id}/status","defaultColumns":["title","emoji","expires_at","is_away"],"requiredFlags":["emoji","title"],"isESM":true,"relativePath":["dist","commands","users","update-status.js"]},"version":{"aliases":[],"args":{},"description":"Версия CLI","examples":["<%= config.bin %> version"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"version","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"isESM":true,"relativePath":["dist","commands","version.js"]},"views:open":{"aliases":[],"args":{},"description":"Открытие представления","examples":["Показать интерактивную форму пользователю:\n $ pachca views open","Опрос сотрудников через форму:\n $ pachca views open","Форма заявки/запроса:\n $ pachca views open"],"flags":{"output":{"char":"o","description":"Output format: table, json, yaml, csv","name":"output","hasDynamicHelp":false,"multiple":false,"options":["table","json","yaml","csv"],"type":"option"},"columns":{"char":"c","description":"Columns to display (comma-separated)","name":"columns","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-header":{"description":"Hide table header","name":"no-header","allowNo":false,"type":"boolean"},"no-truncate":{"description":"Do not truncate values in table","name":"no-truncate","allowNo":false,"type":"boolean"},"profile":{"char":"p","description":"Profile to use for this command","name":"profile","hasDynamicHelp":false,"multiple":false,"type":"option"},"token":{"description":"Bearer token for this call (not saved)","name":"token","hasDynamicHelp":false,"multiple":false,"type":"option"},"quiet":{"char":"q","description":"Suppress output except errors","name":"quiet","allowNo":false,"type":"boolean"},"no-color":{"description":"Disable color output","name":"no-color","allowNo":false,"type":"boolean"},"verbose":{"char":"v","description":"Show HTTP request/response details","name":"verbose","allowNo":false,"type":"boolean"},"no-input":{"description":"Disable interactive prompts","name":"no-input","allowNo":false,"type":"boolean"},"dry-run":{"description":"Show HTTP request without sending","name":"dry-run","allowNo":false,"type":"boolean"},"timeout":{"description":"Request timeout in seconds","name":"timeout","hasDynamicHelp":false,"multiple":false,"type":"option"},"no-retry":{"description":"Disable auto-retry on 429/503","name":"no-retry","allowNo":false,"type":"boolean"},"json":{"description":"Output as JSON (alias for --output json)","hidden":true,"name":"json","allowNo":false,"type":"boolean"},"title":{"description":"Заголовок представления (макс. 24 символов)","name":"title","hasDynamicHelp":false,"multiple":false,"type":"option"},"close-text":{"description":"Текст кнопки закрытия представления (макс. 24 символов)","name":"close-text","hasDynamicHelp":false,"multiple":false,"type":"option"},"submit-text":{"description":"Текст кнопки отправки формы (макс. 24 символов)","name":"submit-text","hasDynamicHelp":false,"multiple":false,"type":"option"},"blocks":{"description":"Массив блоков представления","name":"blocks","hasDynamicHelp":false,"multiple":false,"type":"option"},"type":{"description":"Способ открытия представления","name":"type","hasDynamicHelp":false,"multiple":false,"options":["modal"],"type":"option"},"trigger-id":{"description":"Уникальный идентификатор события (полученный, например, в исходящем вебхуке о нажатии кнопки)","name":"trigger-id","hasDynamicHelp":false,"multiple":false,"type":"option"},"private-metadata":{"description":"Необязательная строка, которая будет отправлена в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для передачи в формате `JSON` какой то дополнительной информации вместе с заполненной пользователем формой. (макс. 3000 символов)","name":"private-metadata","hasDynamicHelp":false,"multiple":false,"type":"option"},"callback-id":{"description":"Необязательный идентификатор для распознавания этого представления, который будет отправлен в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для понимания, какую форму должен был заполнить пользователь. (макс. 255 символов)","name":"callback-id","hasDynamicHelp":false,"multiple":false,"type":"option"}},"hasDynamicHelp":false,"hiddenAliases":[],"id":"views:open","pluginAlias":"@pachca/cli","pluginName":"@pachca/cli","pluginType":"core","strict":true,"enableJsonFlag":false,"scope":"views:write","apiMethod":"POST","apiPath":"/views/open","requiredFlags":["title","blocks","type","trigger-id"],"isESM":true,"relativePath":["dist","commands","views","open.js"]}},"version":"0.0.0"} \ No newline at end of file diff --git a/packages/cli/scripts/openapi-parser.ts b/packages/cli/scripts/openapi-parser.ts index 9c2c62ee..91c7a726 100644 --- a/packages/cli/scripts/openapi-parser.ts +++ b/packages/cli/scripts/openapi-parser.ts @@ -246,8 +246,9 @@ export function parseOpenAPI(): Endpoint[] { export function resolveAllOf(schema: Schema): Schema { if (!schema.allOf || schema.allOf.length === 0) return schema; + const { allOf, ...siblings } = schema; let merged: Schema = {}; - for (const sub of schema.allOf) { + for (const sub of allOf) { const resolved = resolveAllOf(sub); merged = { ...merged, @@ -256,7 +257,7 @@ export function resolveAllOf(schema: Schema): Schema { required: [...(merged.required || []), ...(resolved.required || [])], }; } - return merged; + return { ...merged, ...siblings }; } export function getSchemaType(schema: Schema): string { diff --git a/packages/cli/src/commands/chats/list.ts b/packages/cli/src/commands/chats/list.ts index c8d8de38..055865be 100644 --- a/packages/cli/src/commands/chats/list.ts +++ b/packages/cli/src/commands/chats/list.ts @@ -25,14 +25,17 @@ export default class ChatsList extends BaseCommand { 'sort': Flags.string({ description: "Поле сортировки", options: ["id","last_message_at"], + default: "id", }), 'order': Flags.string({ description: "Направление сортировки", options: ["asc","desc"], + default: "desc", }), 'availability': Flags.string({ description: "Параметр, который отвечает за доступность и выборку чатов для пользователя", options: ["is_member","public"], + default: "is_member", }), 'last-message-at-after': Flags.string({ description: "Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не раньше чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).", diff --git a/packages/cli/src/commands/members/list.ts b/packages/cli/src/commands/members/list.ts index 13be4ee3..851c92be 100644 --- a/packages/cli/src/commands/members/list.ts +++ b/packages/cli/src/commands/members/list.ts @@ -28,6 +28,7 @@ export default class MembersList extends BaseCommand { 'role': Flags.string({ description: "Роль в чате", options: ["all","owner","admin","editor","member"], + default: "all", }), limit: Flags.integer({ description: 'Количество результатов на страницу', diff --git a/packages/cli/src/commands/messages/list.ts b/packages/cli/src/commands/messages/list.ts index a59235e5..b38807f1 100644 --- a/packages/cli/src/commands/messages/list.ts +++ b/packages/cli/src/commands/messages/list.ts @@ -33,10 +33,12 @@ export default class MessagesList extends BaseCommand { 'sort': Flags.string({ description: "Поле сортировки", options: ["id"], + default: "id", }), 'order': Flags.string({ description: "Направление сортировки", options: ["asc","desc"], + default: "desc", }), limit: Flags.integer({ description: 'Количество результатов на страницу', diff --git a/packages/cli/src/data/changelog.json b/packages/cli/src/data/changelog.json index f1d850b7..04224b53 100644 --- a/packages/cli/src/data/changelog.json +++ b/packages/cli/src/data/changelog.json @@ -22,6 +22,16 @@ "type": "+", "command": "users remove-avatar", "description": "Удаление аватара сотрудника" + }, + { + "type": "~", + "command": "chats list, messages list", + "description": "Исправлена сортировка: --order без --sort теперь корректно работает (sort по умолчанию id, order по умолчанию desc)" + }, + { + "type": "~", + "command": "messages list", + "description": "chat_id можно передать первым аргументом: pachca messages list 12345" } ] }, From 1de6ad8a6bc39c9ba1477253288e397eeb98f648 Mon Sep 17 00:00:00 2001 From: lookinway Date: Mon, 6 Apr 2026 22:57:08 +0300 Subject: [PATCH 20/37] fix(ci): turbo dependency race, concurrency, bun pinning, provenance - turbo.json: add ^build to generate-n8n to prevent parser race condition - sdk.yml: add concurrency group, --provenance for TS SDK, pin bun 1.3.4 - n8n.yml: add concurrency group, pin bun 1.3.4 - check.yml: add concurrency (cancel-in-progress for PRs) - deploy.yml: add concurrency (no cancel for production deploys) - gitlab.yml: add concurrency (no cancel for sync) --- .github/workflows/check.yml | 4 ++++ .github/workflows/deploy.yml | 4 ++++ .github/workflows/gitlab.yml | 4 ++++ .github/workflows/n8n.yml | 8 ++++++++ .github/workflows/sdk.yml | 12 +++++++++++- turbo.json | 2 +- 6 files changed, 32 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index c383265d..c2049aac 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -5,6 +5,10 @@ on: branches: - main +concurrency: + group: check-${{ github.ref }} + cancel-in-progress: true + jobs: check: name: Lint, typecheck, format diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index aa2c9845..fb182495 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -6,6 +6,10 @@ on: branches: - main +concurrency: + group: deploy + cancel-in-progress: false + jobs: build-site: name: Build & push image diff --git a/.github/workflows/gitlab.yml b/.github/workflows/gitlab.yml index e289dc45..ee9de7f9 100644 --- a/.github/workflows/gitlab.yml +++ b/.github/workflows/gitlab.yml @@ -4,6 +4,10 @@ on: branches: - main +concurrency: + group: gitlab-sync + cancel-in-progress: false + jobs: sync_gitlab: name: push github/main to gitlab/main diff --git a/.github/workflows/n8n.yml b/.github/workflows/n8n.yml index aeff6a2c..59e3a1a7 100644 --- a/.github/workflows/n8n.yml +++ b/.github/workflows/n8n.yml @@ -29,6 +29,10 @@ on: - 'packages/spec/scripts/**' workflow_dispatch: +concurrency: + group: n8n-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: generate-and-build: name: Generate & Build @@ -38,6 +42,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.3.4 - uses: actions/setup-node@v4 with: node-version: 22 @@ -85,6 +91,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.3.4 - uses: actions/setup-node@v4 with: node-version: 22 diff --git a/.github/workflows/sdk.yml b/.github/workflows/sdk.yml index 3921504b..67a64fcd 100644 --- a/.github/workflows/sdk.yml +++ b/.github/workflows/sdk.yml @@ -7,6 +7,10 @@ on: branches: [main] workflow_dispatch: +concurrency: + group: sdk-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: generate-and-build: name: Generate and build @@ -28,6 +32,8 @@ jobs: with: fetch-depth: 0 - uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.3.4 - uses: actions/setup-node@v4 with: node-version: 20 @@ -178,6 +184,8 @@ jobs: with: ref: v${{ needs.generate-and-build.outputs.version }} - uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.3.4 - uses: actions/setup-node@v4 with: node-version: 20 @@ -203,7 +211,7 @@ jobs: if npm view "@pachca/sdk@${VERSION}" version 2>/dev/null; then echo "Version ${VERSION} already published, skipping" else - npm publish --access public + npm publish --access public --provenance fi publish-cli: @@ -221,6 +229,8 @@ jobs: with: fetch-depth: 0 - uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.3.4 - uses: actions/setup-node@v4 with: node-version: 20 diff --git a/turbo.json b/turbo.json index 7a7f55ef..7c43fe47 100644 --- a/turbo.json +++ b/turbo.json @@ -46,7 +46,7 @@ "cache": true }, "generate-n8n": { - "dependsOn": ["@pachca/spec#generate", "@pachca/spec#overlay:apply"], + "dependsOn": ["^build", "@pachca/spec#generate", "@pachca/spec#overlay:apply"], "inputs": [ "../../packages/spec/openapi.yaml", "../../packages/spec/openapi.en.yaml", From b648dd5ed96b944269a57809a75cd16d6542284a Mon Sep 17 00:00:00 2001 From: lookinway Date: Mon, 6 Apr 2026 23:16:06 +0300 Subject: [PATCH 21/37] fix(ci): auto-increment generator version from npm - Remove manual version check, auto-calculate patch from npm registry - Base version (major.minor) stays in package.json for manual control - Add --provenance for supply chain security - Add E409 handler for publish idempotency - Fix concurrency: cancel-in-progress only for PRs --- .github/workflows/generator.yml | 53 +++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/.github/workflows/generator.yml b/.github/workflows/generator.yml index 12026063..4709e231 100644 --- a/.github/workflows/generator.yml +++ b/.github/workflows/generator.yml @@ -18,19 +18,15 @@ on: concurrency: group: generator-${{ github.ref }} - cancel-in-progress: true + cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: snapshot-tests: name: Snapshot tests runs-on: ubuntu-latest - outputs: - changed: ${{ steps.check.outputs.changed }} steps: - name: Checkout repo uses: actions/checkout@v4 - with: - fetch-depth: 0 - name: Setup Bun uses: oven-sh/setup-bun@v2 @@ -48,15 +44,8 @@ jobs: working-directory: packages/generator run: bun test - - name: Check for generator changes - if: github.event_name == 'push' - id: check - run: | - CHANGED=$(git diff --name-only HEAD~1 HEAD -- packages/generator/ packages/openapi-parser/ | grep -q . && echo true || echo false) - echo "changed=$CHANGED" >> $GITHUB_OUTPUT - publish-generator: - if: github.event_name == 'push' && needs.snapshot-tests.outputs.changed == 'true' + if: github.event_name == 'push' needs: snapshot-tests runs-on: ubuntu-latest concurrency: @@ -84,14 +73,40 @@ jobs: working-directory: packages/generator run: bun run build + - name: Set version (auto-increment patch) + id: version + working-directory: packages/generator + run: | + VERSION=$(node -e " + const { execSync } = require('child_process'); + const base = require('./package.json').version.split('.').slice(0, 2).join('.'); + let versions = []; + try { + const raw = execSync('npm view @pachca/generator versions --json', { stdio: ['pipe', 'pipe', 'pipe'] }).toString().trim(); + const parsed = JSON.parse(raw); + versions = Array.isArray(parsed) ? parsed : [parsed]; + } catch {} + const matching = versions.filter(v => v.startsWith(base + '.')); + const lastPatch = matching.length > 0 + ? Math.max(...matching.map(v => parseInt(v.split('.')[2]))) + : -1; + console.log(base + '.' + (lastPatch + 1)); + ") + echo "version=$VERSION" >> $GITHUB_OUTPUT + node -e "const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json'));p.version='$VERSION';fs.writeFileSync('package.json',JSON.stringify(p,null,2)+'\n')" + echo "Publishing @pachca/generator@$VERSION" + - name: Publish to npm working-directory: packages/generator env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: | - VERSION=$(node -e "console.log(require('./package.json').version)") - if npm view "@pachca/generator@${VERSION}" version 2>/dev/null; then - echo "Version ${VERSION} already published, skipping" - else - npm publish --access public --provenance - fi + OUTPUT=$(npm publish --access public --provenance 2>&1) || { + CODE=$? + if echo "$OUTPUT" | grep -q "E409\|already exists"; then + echo "Version ${{ steps.version.outputs.version }} already published, skipping" + else + echo "$OUTPUT" + exit $CODE + fi + } From cb8a61e9c16ea16c9b28125229e5910507d18753 Mon Sep 17 00:00:00 2001 From: lookinway Date: Mon, 6 Apr 2026 23:19:25 +0300 Subject: [PATCH 22/37] fix(ci): auto-increment n8n version from npm, remove changelog gate - Auto-calculate patch from npm registry (base major.minor from package.json) - Remove package.json/changelog.json version match check - changelog.json stays for manual release notes, no longer blocks publish - Add E409 handler for publish idempotency --- .github/workflows/n8n.yml | 49 +++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/.github/workflows/n8n.yml b/.github/workflows/n8n.yml index 59e3a1a7..d0b48f83 100644 --- a/.github/workflows/n8n.yml +++ b/.github/workflows/n8n.yml @@ -112,50 +112,53 @@ jobs: - name: Generate n8n node run: bun run integrations/n8n/scripts/generate-n8n.ts - - name: Check version + - name: Set version (auto-increment patch) id: version + working-directory: integrations/n8n run: | - PKG_VERSION=$(node -e "console.log(require('./integrations/n8n/package.json').version)") - CHANGELOG_VERSION=$(node -e "console.log(JSON.parse(require('fs').readFileSync('integrations/n8n/changelog.json'))[0].version)") - - if [ "$PKG_VERSION" != "$CHANGELOG_VERSION" ]; then - echo "::error::Version mismatch: package.json=$PKG_VERSION, changelog.json=$CHANGELOG_VERSION" - exit 1 - fi - - echo "version=$PKG_VERSION" >> $GITHUB_OUTPUT - - # Check if this version already exists on npm - PUBLISHED=$(node -e " + VERSION=$(node -e " const { execSync } = require('child_process'); + const base = require('./package.json').version.split('.').slice(0, 2).join('.'); + let versions = []; try { const raw = execSync('npm view n8n-nodes-pachca versions --json', { stdio: ['pipe', 'pipe', 'pipe'] }).toString().trim(); - const versions = JSON.parse(raw); - const list = Array.isArray(versions) ? versions : [versions]; - console.log(list.includes('$PKG_VERSION') ? 'yes' : 'no'); - } catch { console.log('no'); } + const parsed = JSON.parse(raw); + versions = Array.isArray(parsed) ? parsed : [parsed]; + } catch {} + const matching = versions.filter(v => v.startsWith(base + '.')); + const lastPatch = matching.length > 0 + ? Math.max(...matching.map(v => parseInt(v.split('.')[2]))) + : -1; + console.log(base + '.' + (lastPatch + 1)); ") - echo "published=$PUBLISHED" >> $GITHUB_OUTPUT + echo "version=$VERSION" >> $GITHUB_OUTPUT + node -e "const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json'));p.version='$VERSION';fs.writeFileSync('package.json',JSON.stringify(p,null,2)+'\n')" + echo "Publishing n8n-nodes-pachca@$VERSION" - name: Build n8n node - if: steps.version.outputs.published == 'no' working-directory: integrations/n8n run: bun run build - name: Scan community package - if: steps.version.outputs.published == 'no' working-directory: integrations/n8n run: bun x @n8n/scan-community-package . - name: Publish to npm - if: steps.version.outputs.published == 'no' working-directory: integrations/n8n env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - run: npm publish --access public --provenance + run: | + OUTPUT=$(npm publish --access public --provenance 2>&1) || { + CODE=$? + if echo "$OUTPUT" | grep -q "E409\|already exists"; then + echo "Version ${{ steps.version.outputs.version }} already published, skipping" + else + echo "$OUTPUT" + exit $CODE + fi + } - name: Create GitHub Release - if: steps.version.outputs.published == 'no' working-directory: integrations/n8n env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 2a274b68271716a48008771ecb223893b7a8b0be Mon Sep 17 00:00:00 2001 From: lookinway Date: Mon, 6 Apr 2026 23:29:49 +0300 Subject: [PATCH 23/37] ci(n8n): auto-versioning and smart change detection for publish - Add change detection to skip publish when only tests/scripts/docs change - Auto-increment patch version from npm (base major.minor from package.json) - Gate version/build/scan/publish/release steps on real source changes - Add fetch-depth: 0 for git history in publish job --- .github/workflows/n8n.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/.github/workflows/n8n.yml b/.github/workflows/n8n.yml index d0b48f83..f8fc7791 100644 --- a/.github/workflows/n8n.yml +++ b/.github/workflows/n8n.yml @@ -90,6 +90,8 @@ jobs: id-token: write steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 - uses: oven-sh/setup-bun@v2 with: bun-version: 1.3.4 @@ -112,7 +114,26 @@ jobs: - name: Generate n8n node run: bun run integrations/n8n/scripts/generate-n8n.ts + - name: Check for publishable changes + id: changes + run: | + # Check committed source changes (exclude tests, scripts, docs, config) + COMMITTED=$(git diff --name-only HEAD~1 HEAD -- integrations/n8n/ \ + | grep -v -E '^integrations/n8n/(tests/|scripts/|docs/|e2e/|eslint|tsconfig|\.gitignore|\.npmrc|vitest)' \ + | grep -q . && echo true || echo false) + # Check if generation produced different files (spec/generator changed) + GENERATED=$(git diff --name-only -- integrations/n8n/nodes/ integrations/n8n/credentials/ \ + | grep -q . && echo true || echo false) + if [ "$COMMITTED" = "true" ] || [ "$GENERATED" = "true" ]; then + echo "changed=true" >> $GITHUB_OUTPUT + echo "Publishable changes detected (committed=$COMMITTED, generated=$GENERATED)" + else + echo "changed=false" >> $GITHUB_OUTPUT + echo "No publishable changes, skipping publish" + fi + - name: Set version (auto-increment patch) + if: steps.changes.outputs.changed == 'true' id: version working-directory: integrations/n8n run: | @@ -136,14 +157,17 @@ jobs: echo "Publishing n8n-nodes-pachca@$VERSION" - name: Build n8n node + if: steps.changes.outputs.changed == 'true' working-directory: integrations/n8n run: bun run build - name: Scan community package + if: steps.changes.outputs.changed == 'true' working-directory: integrations/n8n run: bun x @n8n/scan-community-package . - name: Publish to npm + if: steps.changes.outputs.changed == 'true' working-directory: integrations/n8n env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} @@ -159,6 +183,7 @@ jobs: } - name: Create GitHub Release + if: steps.changes.outputs.changed == 'true' working-directory: integrations/n8n env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 0bdbb360397c1550c3ad9bd8930186d0bb28410a Mon Sep 17 00:00:00 2001 From: lookinway Date: Mon, 6 Apr 2026 23:43:30 +0300 Subject: [PATCH 24/37] docs: update n8n setup guide, images, llms, navigation --- apps/docs/components/layout/footer.tsx | 4 +- apps/docs/content/guides/n8n/setup.mdx | 14 +++- apps/docs/content/home.mdx | 1 + apps/docs/lib/navigation.ts | 6 +- apps/docs/lib/openapi/types.ts | 2 + apps/docs/lib/ordered-pages.ts | 22 ++++-- apps/docs/lib/tabs-config.ts | 2 +- apps/docs/public/guides/n8n/setup.md | 16 +++-- .../public/images/n8n/credentials-v2.avif | Bin 25534 -> 24243 bytes apps/docs/public/images/n8n/file-upload.avif | Bin 29533 -> 28248 bytes .../public/images/n8n/message-buttons.avif | Bin 30581 -> 34125 bytes .../public/images/n8n/message-get-many.avif | Bin 24294 -> 27576 bytes .../images/n8n/node-message-create.avif | Bin 38071 -> 34205 bytes .../public/images/n8n/operation-dropdown.avif | Bin 28638 -> 28564 bytes .../public/images/n8n/resource-dropdown.avif | Bin 36009 -> 29746 bytes apps/docs/public/images/n8n/return-all.avif | Bin 24294 -> 27355 bytes .../images/n8n/searchable-dropdown.avif | Bin 31636 -> 27841 bytes .../public/images/n8n/workflow-approval.avif | Bin 28046 -> 23167 bytes .../public/images/n8n/workflow-forward.avif | Bin 28203 -> 18711 bytes .../images/n8n/workflow-monitoring.avif | Bin 25338 -> 21111 bytes .../images/n8n/workflow-output-data.avif | Bin 50597 -> 35894 bytes .../public/images/n8n/workflow-reminder.avif | Bin 24687 -> 21138 bytes .../public/images/n8n/workflow-vacation.avif | Bin 56706 -> 42311 bytes .../public/images/n8n/workflow-welcome.avif | Bin 25186 -> 19522 bytes apps/docs/public/index.md | 1 + apps/docs/public/llms-full.txt | 65 ++++++++++-------- apps/docs/public/llms.txt | 48 ++++++------- apps/docs/public/skill.md | 48 ++++++------- apps/docs/scripts/generate-llms.ts | 11 +-- 29 files changed, 142 insertions(+), 98 deletions(-) diff --git a/apps/docs/components/layout/footer.tsx b/apps/docs/components/layout/footer.tsx index adb7fd8e..3c1d3f99 100644 --- a/apps/docs/components/layout/footer.tsx +++ b/apps/docs/components/layout/footer.tsx @@ -92,7 +92,7 @@ function PrevButton({ item }: { item: NavigationItem }) { Назад - {item.title} + {item.sectionTitle ? `${item.sectionTitle}: ${item.title}` : item.title} ); @@ -112,7 +112,7 @@ function NextButton({ item }: { item: NavigationItem }) { {isLoading ? : } - {item.title} + {item.sectionTitle ? `${item.sectionTitle}: ${item.title}` : item.title} ); diff --git a/apps/docs/content/guides/n8n/setup.mdx b/apps/docs/content/guides/n8n/setup.mdx index 9a2078f4..8377b703 100644 --- a/apps/docs/content/guides/n8n/setup.mdx +++ b/apps/docs/content/guides/n8n/setup.mdx @@ -1,9 +1,9 @@ --- -title: Настройка +title: Начало работы description: Установка n8n, расширения Пачки, настройка Credentials и первый workflow --- -# Настройка +# Начало работы ## Установка @@ -52,6 +52,11 @@ description: Установка n8n, расширения Пачки, настр 2. Выполнить команду `npm i n8n-nodes-pachca` в директории n8n 3. Следовать README-инструкции на [GitHub](https://github.com/pachca/openapi/tree/main/integrations/n8n) + + +## Настройка Credentials + + Credentials — данные для авторизации. Перейдите в **Credentials** и нажмите **Add Credential**. @@ -85,6 +90,11 @@ description: Установка n8n, расширения Пачки, настр Если тест не проходит — проверьте правильность токена и доступность API. Подробнее — в разделе [Устранение ошибок](/guides/n8n/troubleshooting). + + +## Первый workflow + + Workflow — визуальный редактор, в котором выстраиваются цепочки триггеров и действий. Создайте новый workflow и добавьте триггер **Manual Trigger** для ручного запуска. diff --git a/apps/docs/content/home.mdx b/apps/docs/content/home.mdx index 711880df..2c23282c 100644 --- a/apps/docs/content/home.mdx +++ b/apps/docs/content/home.mdx @@ -15,6 +15,7 @@ hideTableOfContents: true + diff --git a/apps/docs/lib/navigation.ts b/apps/docs/lib/navigation.ts index d698c043..0b814842 100644 --- a/apps/docs/lib/navigation.ts +++ b/apps/docs/lib/navigation.ts @@ -156,9 +156,11 @@ function flattenItems(sections: NavigationSection[]): NavigationItem[] { for (const section of sections) { for (const item of section.items) { if (item.children) { - result.push(...item.children); + for (const child of item.children) { + result.push({ ...child, sectionTitle: child.sectionTitle || item.title }); + } } else { - result.push(item); + result.push({ ...item, sectionTitle: item.sectionTitle || section.title }); } } } diff --git a/apps/docs/lib/openapi/types.ts b/apps/docs/lib/openapi/types.ts index 454b3b03..9b0d87fe 100644 --- a/apps/docs/lib/openapi/types.ts +++ b/apps/docs/lib/openapi/types.ts @@ -153,6 +153,8 @@ export interface NavigationItem { children?: NavigationItem[]; /** Original (untranslated) title shown next to the translated one */ originalTitle?: string; + /** Parent section/group title for context (e.g. "SDK" for child page "Обзор") */ + sectionTitle?: string; /** External link (opens in new tab) */ external?: boolean; } diff --git a/apps/docs/lib/ordered-pages.ts b/apps/docs/lib/ordered-pages.ts index be49b6e0..63555098 100644 --- a/apps/docs/lib/ordered-pages.ts +++ b/apps/docs/lib/ordered-pages.ts @@ -12,8 +12,16 @@ import { getGuideData } from './content-loader'; * Get all ordered guide pages (for generators/sitemap). * Returns pages from all guide sections + API guide pages + home. */ -export function getOrderedPages(): { path: string; title: string; description: string }[] { - const pages: { path: string; title: string; description: string }[] = []; +export interface OrderedPage { + path: string; + title: string; + description: string; + /** Parent section/group title (e.g. "SDK" for child page "Обзор") */ + sectionTitle?: string; +} + +export function getOrderedPages(): OrderedPage[] { + const pages: OrderedPage[] = []; // Home page const homeData = getGuideData('home'); @@ -30,7 +38,7 @@ export function getOrderedPages(): { path: string; title: string; description: s for (const item of section.items) { if (item.children) { for (const child of item.children) { - addPage(pages, child, '/guides/'); + addPage(pages, child, '/guides/', item.title); } } else { addPage(pages, item, '/guides/'); @@ -59,6 +67,7 @@ export function getOrderedPages(): { path: string; title: string; description: s path: item.path, title: data.frontmatter.title || item.title, description: data.frontmatter.description || '', + sectionTitle: 'Основы API', }); } else { // Dynamic pages without MDX (e.g. /api/models) @@ -66,6 +75,7 @@ export function getOrderedPages(): { path: string; title: string; description: s path: item.path, title: item.title, description: '', + sectionTitle: 'Основы API', }); } } @@ -74,9 +84,10 @@ export function getOrderedPages(): { path: string; title: string; description: s } function addPage( - pages: { path: string; title: string; description: string }[], + pages: OrderedPage[], item: SidebarPageItem, - prefix: string + prefix: string, + sectionTitle?: string ) { const data = getGuideData(item.path.replace(prefix, '')); if (data) { @@ -84,6 +95,7 @@ function addPage( path: item.path, title: data.frontmatter.title || item.title, description: data.frontmatter.description || '', + sectionTitle, }); } } diff --git a/apps/docs/lib/tabs-config.ts b/apps/docs/lib/tabs-config.ts index 1bc2c7f1..bfebaf65 100644 --- a/apps/docs/lib/tabs-config.ts +++ b/apps/docs/lib/tabs-config.ts @@ -106,7 +106,7 @@ export const GUIDE_SECTIONS: SidebarSection[] = [ path: '/guides/n8n/overview', children: [ { title: 'Обзор', path: '/guides/n8n/overview' }, - { title: 'Настройка', path: '/guides/n8n/setup' }, + { title: 'Начало работы', path: '/guides/n8n/setup' }, { title: 'Ресурсы и операции', path: '/guides/n8n/resources' }, { title: 'Триггер', path: '/guides/n8n/trigger' }, { title: 'Примеры workflow', path: '/guides/n8n/workflows' }, diff --git a/apps/docs/public/guides/n8n/setup.md b/apps/docs/public/guides/n8n/setup.md index 572c7fe8..6a38dd4f 100644 --- a/apps/docs/public/guides/n8n/setup.md +++ b/apps/docs/public/guides/n8n/setup.md @@ -1,5 +1,5 @@ -# Настройка +# Начало работы ## Установка @@ -57,7 +57,10 @@ 3. Следовать README-инструкции на [GitHub](https://github.com/pachca/openapi/tree/main/integrations/n8n) - ### Шаг 3. Создание Credentials +## Настройка Credentials + + + ### Шаг 1. Создание Credentials Credentials — данные для авторизации. Перейдите в **Credentials** и нажмите **Add Credential**. @@ -86,7 +89,7 @@ Credentials — данные для авторизации. Перейдите *Форма Pachca API Credentials* - ### Шаг 4. Где получить токен + ### Шаг 2. Где получить токен В Пачке доступны два типа токенов: @@ -105,7 +108,10 @@ Credentials — данные для авторизации. Перейдите > Если тест не проходит — проверьте правильность токена и доступность API. Подробнее — в разделе [Устранение ошибок](/guides/n8n/troubleshooting). - ### Шаг 5. Создание workflow +## Первый workflow + + + ### Шаг 1. Создание workflow Workflow — визуальный редактор, в котором выстраиваются цепочки триггеров и действий. Создайте новый workflow и добавьте триггер **Manual Trigger** для ручного запуска. @@ -123,7 +129,7 @@ Workflow — визуальный редактор, в котором выстр *Pachca на канвасе* - ### Шаг 6. Настройка и запуск + ### Шаг 2. Настройка и запуск Дважды кликните на узел **Pachca** и настройте: diff --git a/apps/docs/public/images/n8n/credentials-v2.avif b/apps/docs/public/images/n8n/credentials-v2.avif index 702a010a1388787103acbc60a49e554ed0c82f41..2ca886bee4621bbba69f303bd65b289a3f757221 100644 GIT binary patch literal 24243 zcmYhiQ;;q^6D~TojWxDyJZQHhO+qP}nwr%S@-@kY5s?(`7o=&B6k&C3O8wd!9 z(A3$(-oVwu6zD(tpR}^z<873hA z!T+-iTp5`}?5yqnPb^Cddq?~Ka48FWBfI}3nuU|S$^RAt0U`c3q5kJXvbS)z_#Xla z1qJn=fHQDq5(%LF9|DAGWM}PYYh>;I-_Gzr5dQx`m=^Xn2LJQ@NBYK`?7vf$ z+ZY=-qX5Cc@X&w#;%*6w2o*EOb^*)%izjE40RrklEZZ#^L8vPvSnXq>5vYYo35Q%z zO4#ZSV46d1`Isp!7St2sRSj2&5-XbSl65M}Q#S^vh58gWFWfD9gGVBWM=+gVb!Rf? z+*oY1GY8R0N{#!X6d}WNF?8fe=wIj1V}OxFE;;n6M)BP0jKDVklj>>W6e0^;cjmQH7)&~-h z9XS>P+`5q-2>sle^&sb6%uXlNoE^f2q>@md5gTYfv8qWN5eBX>^O zh6{|&ay4nyAF5pndWWnEXA<1Cwy2d#6ar6UIBV}J2)8pM4D{=&i1z()UI91@2?_od zbOT2+a+WV-1k3d_FIz5Ts_mx(si6J7;9YpZs@Tg<4Kq+qh=QQwe85W@?x!siJic2% zU9IH2^0`cg1EEEyZn+&SqtM%nl7aIsEKDeY;kM7jL(u?3D$aGVn%2uhFf_KKp$Owd zr*>UcKz1RbUwXu+Xn57rFvaYhxdS(@k{1=k!5|*BrC#J<=UOgtJ`}JQJOT!Vd0HmQ05#ZJTDQOXPF~)_HWF`Y~$R1ot%06~%>kw3!NZIVJ}ARh|0 zp2U_UZ0X*F6jmI6q8nR}xv+J^pqtEuHFlj%fXlcFd(bJ?bSWHvn~;P{F$YhN(IPox zxd)0~U=M+^jgGuv)NUu#sxPtjudNIu67p?@>P@bLDW;87~|tEuvV zyx2GA`~))kG9F4ZUb9WE&rOY<LU0fFb`K+Jq-^gD;M66zb)k92cxba#~$wHa* zz5px?HhOLHv1nr&tLZ5cccfp(5}(KvsnNYlmB^uJp25uzDzl0Z&cQHF>RyP+2ZcVD(?k1m(o58BNj1} zJ<*J{os_QRl=~gV zX|1%+d=CtXdbeXBE(P}Sv%^2(AZ!NqRZ6q?qJksD>;hkV_Y}5xv4wa_VqbtHVqsx+ z_WR~R&KxRRp+kppl_ok_%QL$=&REyi@LSi-8aYp=gGPv z)v%Y-UDR!lwzwv@A{laJH+QYP+nVG3E{xXavHkr3Imlw=#E^WaV%!wj%0vI?HHW)) zmvVmQ1*j%F7o&vUP{ZyKWBetV=g$^3D++9E>WNRj}c6m5axHE@|DPl zpZ)od(^q|`GD6;;zXPmp)z{6PG^ZEd7#Va8j$aeO@a5*z51-8`PSKfcU(@MfbTWs{ z28O>x)^vgMqzZo3gB zt~q3}ptGt6yN(?+{XjruCc>%93$;%P3ar0RChQ?JB1YyMbS)@JC9d^R(pE4jZy)Q$ zRZ1&KQF5h%=7lNDH1$N4Po7g1@Ld@Tt_Z)u5+jl20)g@-;y+|~9$Re)p!VyZlupzg zc+r0G{$9z#78V`2+*s~MS;3G%D5?3?6U@@XCS$_PYbsnDEY&O-tIx!9t#g;T>c#k2n=AQ<1IlL zZ=yd7kV_$~Fxw8#+hS)#FFUs)Zx;_a+_ouT9=HRf%X&C7L*RJt^DQzo@&Pd`&gqg% zGute9B09(o3CtUvI)?<BiZGr(zFy5j29NZ3#)Uv~SK-go+z6-hm; zgdE*Hz1o%M)Ke%f*mZCZG(VrtWWDcz>Y+2L7^L}F?czH=M5s!8x#(*1p^`lLYmT*L zpj0TjqG~n2tPSz#8R^0|();ktmI^I@dVYAfW)EC%VQk6qjAzigzuwLa+5?lpAywKm zMX;ChlJ_{d2i8GFN6&@1Ax3()Pf+2A2-+_Pv>W#?0a*A0!KaBNz`qQNK{VFu$x|3bhp-IZmUk0h+z)< zW=fw&dnHvt$r=^+@?mR89PFbbV&9uXJe3QDKHE&lcXm(YWYd8;aPCWqhUgjgnvvnS zr22PuQ0)xstP@!wP(*aqb~z2_8{`VCbxcVi+w7zI&Ji>~{iU+&k+5eFt-!ngw&6+k?~j{`TzhIpsTd%&GOlnNf~er{2=AB=La0XEx4PV{z#($IB;X%sdOdS$XTqX)=(dQ7t6a{ zW;Po35zpqNN%4PsD0+DR#hn)GN(}nw*Hzt*_jW58O*x8!{wR?hcb?n61vqN8{c9do zrH-o^eH~k#NQlA?FWGZP5i6lL%G{!#ZQlm`v-$UXv#drDXHO7J_HiqfSaWTei&1DK zrX_0Kz{(*;1rZd(x+=Z#<~B6{mKkcEQ5vZv#j-eNqwQ*6`8IKd8w=4}c(lQLwv0`K zh>KWGrhxRfe^UXp4))i7Q2-bQfTljM1D-LH)wfpdxc5;~U)&vOa09l4H1Gaf7ohwxtj}WONXJGhVFQ(DD^BR|$LS$XNTw~Gt+iz_Nw*jW z+P?ZNCE$l!?ZjTy(p( zg1&nW-UAR2769dmVQgts^$!DXSu>wAzehgje8&BZPM6xKtB!t>f2dQxC=@8MS?!AN z7CAJI_e=&i5?jDGF329&OFqYZ1WVfR*Uw zWP-9#%b$%1#)a1R3~zrmf*}c!lz_-Fauvbjk4m*1svEc?yG5nzwM0nzo4KIB7VZJR zs(nfo{@Z07A~XN{SLkk*li6)ySLgb;hhNk;`E!a2*R|EAwxE&NIQnlE%2TUTnjpw?DSj*79)_!DeS*Fv=`0${u z`&XNiF6;MQOPW+4!4Df3%pbLnYJ4&pLLgU3Kc&t}&Qnh4x+~oXRKi3w$qJSg3Hr9S#%>m3Kv0zCQ=2t}(@eycQ&8>2lwl8C?{Y$qqY< zdQiVtpnoKd2{A`(g7hwmH7AxHk=hFmsxH=oW&jp~SZAhSI!8r2o0CgEGmOG1IDQsO z5t3u{gOk`y0jW6aX6l9aWjN1*&qyehiZAyR{B!UpsqLgDifYP}MvgJpcTI zEKtlM-ABzBlKBxd;hMNaKuJn8kVGsiu{kw2Rcj*AI?ggjGbnDaSfhE1c6@HLGG{-h zGP+!{6pdW-CQh4NC(4OqKJNq=tY-Tc-XwxKbWjL9Mbl-g*XBJi)y{UhSt)VrR@@HDw+SONGWl*>A^ z<`;`lYZi%&R|iu1)bKnCrA2Vo+kX~?_$g%8sRg{USv#N2cZ#gtOcb~k4^$KLLi+@N z|3z*d`sOu0ZEn3_i`btPo)Jn3`S2FsCBw9Z6k^#g%7E)wF~%iN`z2^u%rLrxFc&tR z3#Q=2c2x|BP~iO|H+H!2FrbVUTx>LH-?=YgPO~e%55%HQi7l7PU|NjY&42r0_q&~1 zNV!o+E!tn{72)LO}s>M8bo$nt5M7+*RFfe;KLfXmj+G! z=}=EhNwDLBzXAB55|E(xz6J^ZXN-G_0~|;Q+9NZH2r(=G(!9wl z$hZ~pTkGncp>w453M?5n4^7_b0eMrjW5LenrwL(7i7X0POhgq0M8G07e}!#!?4>Um z=c3~UW-3{nfN84t1V@K`exVHzeuFk$^XUHa(GKBW6QGosBu|N%jndL5?eQp{B~#W{ zTk@wZ*?c8Z*G=`T5pjY6H1=ohGco<{T!lS0uxyL1abIlpco7mZ%T5+wP0Vo1yMYiv zn_|J^fe`No!e2h-Ks5~v+^63Bu6{+r?-y?|iE?2bcs0RsqNUjfxxsntajuB;bbvw-!<=WyJ-+4jL-}3(*Va1zjoPuXa=Np#gnon?acT^K>nQ$FKf2!OVI0%f481@zM;ke zAxN9C6nKh~AcpU;qIMY#%xC++8UrxZWApkEE^cJ2@Bq*Fhz@R~?3&)!@Zl!U=PiaA z?SOX%xtZdPDDKe=AOu2LyxW{ zwR@nnws|Co73w2p*RRk~nzBF`UXStc9rW&+aaCj&e&>G;Tu$(cgEDNHuD$+5<=T$E==Rl#rDy zypCENu+!QM6nuL?)qJ6Q`X0HGl*DS8&SBEf6yQg%PBkzJtL%L>Bs@y$)LTVi1#5gZ z`c%$wlxCnV898XvbOG^^orQ;^X8TdgtLo<3cX>k?+G^)xO3QX-a`cZQ8JEeJk~2Ll1FNji6@cMoOL-xX)QU!OJ=9PSPcM!Qj>D$*Og^Dq$p>SYQ{%k zh!B@Vb>@0x0Hg6YGim40aS^he0r8{=5^Q7M*bnWq{JSc$48fRG{@2;I3xnypRlM9U zkI%viVIomJ4rsSY(9mq4PkVN#$u+8E$d@~?%<3%-DZMEvPF;NQ3?aO83PztG7+D>B=L`^m8a|vM@>fyA(Y~9*{AKfCSfTCK z8~2V&@0%ko3Tp^N`|#Xj+hAJuZEm>}OB~wbXRX$g8nJ{T{)sjEA}$xWFK|Aor)G3T zgX*UEb(7B@#r&;4N?IlgD%ve-9X4?&K4iFKDVM(i#O)Zr0t&x?j~E{z-@}|qxWykX z_@JXIebN9A_P{N4J)>V4W%Gf6DWiQBsHA*2zRRL3I39?)e0)rYhyd4r?fb?N7K(%M zRX;e&hl(Y-m@~r`;J#XkGy?_gr9Jw>6O*3P9^Wvi!c8mqXWSS=!f5K3AE)0-APMaZ z$a_t$e=*J8OazVUxl3LBOvJbpLJG+hM)o~8FY`11aKkU2tjeV8-V~?gcoM^rBMMI@ zvesv`^^wzQqBRieiGlfXfsmLEldr_|ikpNBZH!r3-GN;g zw7`Q-n%#ckCWOTqUq%y9u&Ccd(kQunV*33itCl%UG)MA*xCyw2z&0XGiEr4|2zy@Ps{*&D4q8uvCy^E4C(4zSzm4b3lsns!#Fn)yfYyoORYWZSliuq_i=CEE5c2vDJvta8X3-DDc+I#O*dh z{@8bm=tWXL>nG12gJ6EdefQ&>-zN}ST8=dZktdK1$`&MZ*xGBml4m*FRQ|qH3>;1& z-$5O){9{v~>b9E+-=jCyR1?eX?NkZ|Iv`)$KgTrqHO;u3M*%8NziE89dYDt_Px?qd z9j9W(&yEcs=FY}}s6INKep-JF&jbR)fTgpidEfkK!GzgsXr_oXz3&;@rCs z{JZ^D+^R#nGR!&M{TC_P5M`EOlQ8-F0-M^P-6{yISZG!+x19$c$1`GL%1b??@(lWx z|MIPWcfF2Fb)-$x#M6EkQD=jny6cQW^QItB_W67zzxlzkJS5M?iEnFAuFxymKRUHQ zPR(bzP2dnxJJ^}4biTdGwj=r2>K2b80xrC>T`314#P+C@)HlGhIn0~oSX+|;889|p z2%7KKu1Fo{l@J6nxKfs9@ZcLb%04_`9K))-PdRMPsgXH}{+=jUepN8*K9mfa@6^Fi zpK>PexCw-L?_?8`zJFQ=t%xGZ>AE&+={wt;l2#O%DHfm3y>n>UYM~dK`9|(MxYw0F z<5tTff)Rk@<9sGfLYv$q&j(pm6MSA=pKaxcU$hy*k27(dcb#9^u@MnN`*YudN1dBS z{x11?ZH!}qm?r6pi~bq_(YwySU~dQH=Gr=Eb?u+P7b1V$?SF~`b&)k0a{RaO;@hP& zmBX&o6<*6O)BM~&Xb6&)$aTxwV!?c-dSo8jwyo^c42<678Mr%BG7i22!|W!Cj_JT6 zJ$}UsO(kZ}iU>bE`lX_B@csK!WW_FqhEP_-_o|?R(WwFAh{GcbAi+K*s z2#3=a^TxQyQZ~H%BV}8hrxOpxNBYyogR$j;QO!2S2rB_xNdjW?2-LQeOQIn1$~F(o z;KQL=x42VkTn~MvDrOq9Pj++#GMqlEoJZ@WOxS( zvV!R?IDJUqZ?6c zR00|-BH%%+coZ+3s+ClTg}XPm`MbWA79=IVjwfeX0Jl~0W<>YbfUbaCcuAdVoXE3w zNY;l*yqSG7?4c<$K$^#CGO-2HnO;0lkG8ZtfWKOS0Ig+YQwitBR@L`IJN?*OsttOC z?rnErFVD6XRg?6boGP|ZLAB91Ww>%UxO-Z2EKObZb03uQBrcZMjJVIdepY67tQV4p zaq{|)Iva|UJGG)VR4mHCNxdRE18}aRcp-HmPZwdrJkptjX10mYM1m9EOm6Pmi*K<8 zVKv;}qdq@-TyzBdJy1IfTf)CdMN>lfCB-TAwltC?I(LHQc-(fLezy-T>*jf6u0S$F zG5I)NUG9v9=W<~J?G7~`z+1N%a8Cqk1Q$RDQTU57wJqNJDQo?gi|@dy#mGc^jkzzt zKMa2s+B(9kuLuCMN!yZ;=i$fXK#v1GWzhotM6w`kDBd$AN+8soj980{b zFc=o~pcPqzC5&tE!@(Pv-&GLl7E`Cbd?4(>u4{8Zkh&{&=O5=$$Z1FTM}Q+dw37FS z9%pkQaRXV565#Bg2-Nj0HulImB6#{qnyzdT9oIuN?$U2L2vlDbriwT_a}HI!QG0^A z6r*s<&(EQ-*nG22V|d_9s5gHj@kHD+7RlTvE;jEZKEINN3eSb z{GWsh89W9y7ih`$weRe>AJb&j%iohfSSSWXnBdP*1Aj6-Gd%86J*m zKa$n-`Pv~7gBtXw9r{Z@H}jeTy4>MGvJM*Up!atbUDHm!HvFJo%0e(P?zosR*MpL} zJgGE%mYW3pj`$`376PR$F>Y}XZcoL@^OkH-=W=9v5@5=o;e$@xu{b01yCv>IkOY6! z3@*U&er2jIg4*_qsalL!0gpgrxYTc8dWIh@GgiYd(3KBmtjl4R9?r^ToI8;h!^3Ja zD{%_nH!v5D*z&6iBY*JtClm&~DzFu;F|Yl^_Bd0cIfKk`CIa{W$y$5KQ34dH8baB0 zXHP7S!kWUu;d@@zv!h2`Uv&rw4w3WAYB-aJjddA|20m-2oUb0*(1nRK_~UHtV`3pb zAF&sdysCRC2zuvd&w6FS^##vbe>-oNC-`{mi0GTJ4@m$N5Y{1su+H=(W}fKOO6k*3 zZFS+|3F1z2KjXdlbrKsiEYz--Ktd^Qes*8Xzk>Rdjo3vUiNCyZMhqE`b9gi!b~FYI zg$i5q4y(z^$To1%ZwMH;f;6WI16|4(-vu^MX|uwTXOqKmSftX10-sRb#q5lJYM1!* z3^m@v{1fE9!*Cen+$N6_1nNDa6jPfAoWz>!w3_zrnZ`PT4ugSMgQ&f=7$;qVEx+MQ zz=?!`k*PvJ}Q(TlyB!WvApxmdm4wD2^ z6&9Yvt|VtcmSDWSnZ`70 zeTukzQ^uCK4?e3c!v?wiMd6SwMmlB{_`4E|x|XkoSC)BWvg}FtkYKLIoxehaR+gBm zhJAmx;WPdQ8*LvI&#zzK`;y$m!p_jb1&|e=b3;aHPj+ zchxNZl34eq5gXWr8UldEs^)p1+91~I6M{T<*&VugH^P>A=hO?*Zl^^8G!L?#KG=1^}>aa z{9Qwr=Ry^BB3N$5b|p&jMZFELh6Dq;dP!J4MPKcr=SI_ZJUCnZVHD3nUR9||=7xxH zZ;mn*O*gcLfVBu~GIw;&=xXhne=CqR!|PVoZusOZE-!fQcKi@%~b_H$6#Gw zta$(l&^ZoPM)t3Q+4Ed3R&kd3=Fz$gS4*9`AqrZHTHOt4=#EV6k$Ruz04ir5i0Rz+ zpcegt5b*_NzkX1acFWbV6l=D}q;TOka683(^ZeG(#zCF7!l!i_?;=gAy9M1IZ}Tp< z4F`yD#eRtD;Re(F+#kD)scVl$Uja1j3^qQFkhGFYdy->iAykqS|0^F2ibDk##`#QQ zE@_Q5gzY6*v8Xatcb%i8(k5Nbz8WgSd!G+CGOWI`I08;x*-eqRxMPoV4wCC* zb^e83l%|o-+RO*X_bY1oDzIq1?>wYfkSE(}0QIJHlo*Xgey8jAg_oY;dYBJq#C&HEG;zqR%6}kpdG;*=BZ`?=Sr5FqBKdUFU&Hb0~uDNGf z`K~sw11r<^?}BjklEztR|$AG?j4w5wJJTTN4|db~=Wq2+=v8?dt|VpQjY6 z5a!F+7B<@n2_81$Ry5VOrX+bCIU7Wa0A4!oA=PeVk_}A}XpztR2c+XX)(S+CYQhzR zPw1yjHJ?kZfU8z;s8SzQt*NGbR(jKzVaaQz+J=%!07Im0WcW!&E?s?&Z?#dxA{T=J zL2E+Hgaug)jv&Z4aHhX;VGlf{I1mo_gxqJSUA{~C8!SX$mMhMg==~dwx1NOGu{{cv zuq~YDOcZgpBW;p&zat%Sud_rrdV0oE~^%Iwk{XSzL=cfO609rYVha3c_%+_70{CW_UfZ!u`?JZO*8B1OoTvj@Y zr$Q|Di7%`aTAFpT&jHGihNyaAf=kB*Tf^Oo@@=K4+9Ru8RV2>9V?21oJHLu|j}%+7RXD)`?f{N~rRU^e~Jz@y+c<}+)(ZhH+Ms`Et1&n~hF`cyj z9WkF@ua6yn4~tIpM(9gG_P_VL-8D=OfNRQHEM?`~Q7GP<9)wdV7&wCZXDTCk;rtf9 zkUBztDx38EAH#AcBIPn%#^5Lw?^V2~qk9mTT6gF13KJNoTP!2oXHmmHKl??Z7c@zD@yy-dSo(u&dikLc3 zoU}gZM|xkHi-&(2J+ik#akCoK_rDU+cQ?CQbuYVhD||lMCuJli$g}TfZcwme*V=lZ za(=j^Nd=+d;&g%NzE1Z&7JNKTh{F2MJ9Hlu4 zoikuvWV!5vrZ=2^C44+%?I>dOE0%WjsPCDRr=OA4^r;nku+0+;!i0Z&9VM6Y_(Ojs z)3}y*^Pp8RaZTV{@}^#1(AsQdSJHo52jbf=O6=@GYcjrHtRp?B?fBxrHN~IDkS3A+ z1kAC%aDj$2M)$wa+fB$`9cc7Z`2fL-JxH-;LtwcPJh8!jk_|sjTd! zQmF;cXim<_8(h6?Fz0;u_23%AgvY!jcJgU9Js;BrG^_!dHoC&rb@VpSFYnWYGb#vT z;KCjlHvKb7xi~(hmy7&3HcK?;8{$MY$_0l7rZY^DKX+8YGZ-Sp?YXpk3*?0sdbEN?RyD8GC3O9^W(i zufwDx-SKCTntzP1_JM)skh-ghh|AZGVG2vWeJU@{W5NB!uV3FpqReK8mF?`tsA^K6 zltJIPn_56^z;%e6owI6&F9y>Qs>u9RN5V5^+v^|ae$ZU}3DNxg#@{N}#bf4vhfHd5 zMm(xZ%a3hTl*ajS-;*P)*+h5U^Z<9ds(bJJX2tv3m#8@R!=!CAzB8=XsZ{2#%Cg&( z8}H55RtS+S9{12PC+yNCW&?KO!Ez z4QvgKIaZ)C7x-AB^~6fC?l=)$urJs{%=xWrT%~}nA+H!uPlBBkUZ8R}u?3rZ1!tfE z6AV?{kJQ~-#aN5d>=%~bP>r2Gs_S>XNR$=pJKhf1j>afvcy2`baMwEcb$bx#GQKk+hYvU|=oMPtd5eumJRmfK|FJ4dD}`~37M zcEslBQdll2=Gy~3Q!|+l*PD93i0G$@j{)ECWWXB2W`!C8dsoeW1h^;j1r~7-_k1cD zq-ZF0dX;bBs>-r*gxoNwzArJa`p+;!JwfM>)s}BxuZ@(uu_4e846EU%>6=?q>-uaKfxuE@PVd}F z#yt-oO!ft8^LGiGiHbFq$`A=gctLD)t9jaTVNj27qu##l{!wQ?<#T67!WV0V`G=6k zmFz z1_hFd=68}W5%Vww+?@AiY7b5z3Z82$`o#^yC;Et#>-r9jMWVVmrHFpw|L9mB!jf=B z-Lz|f`V2Mrtoyi@`aYvbf`;fw`>tRede%9Vgr3uCeRIe<6r@Aenjy9q1V`VR9g^TR z)^Gl9^2&Xx5u2&6lPwfmcdIW2`v_ zQ@v80&|5@Tjk9DGC-ZpFvtt}qfa3e`1Cmb8tUxq^YE9(qBB3Jxv||SKSpnMKSI8Rz zG=#?nb`c)eP|8yg4ldF4C}Ca^;KVH$-{xjuxk@ZTR*AxRUXVN77k9m#5$X14 z<#jh9MD42fQlttH9Z?_^Joww()iQ+({ipHRn?_SEVeO-Mp~m!fN49iD_%@8KUc-*E z1bN@)3*dJjTR1c{raCDU!OgBc2@aZTKqc_pu>$@t;sc?28-S`BPE03w`gGFF&-!_M zdeepg)ioPHppa{q&x_uB>sVgSephLqaBY5fof@g{)-9nOCFlA6p7~%o7<+G5bFuKn zq^!sxdx0%%wF!Jk8|;MC;`pZCoOoL9>kM1uBO_S(o4*ga%1hGejk+?%e>`Coovomy zrd6if*-Va9K`wtKqjiI|ZbEun)U-&!rix0j1cMkG?CwtyWnJkrxd)~9hTm==35 zDp+7^mVL`qD=?9oafamOf%|@MblMj|Xc;6eX1Kv%?i(_t6`f@qZ`qAKejON46SHIH zKe(_#fJ9AK2ihK7v}sx2m=0%7*FcJ>%#hdw3vNPFj~?S(@l_A4OOPm?#=?m0X=HCO(fkWH5}$mX}pjd0jQH*zhRoYXQJ z3w%Bm#=OroY@J|00J4p&97Cy^ml@ua*sJh+kZ#5=;LqxN!D-VY=QyPX2cDNJAVuh-HvU3ywEx{Khq}2!EX2Y0RQOUNPU-&Z|Qm+ z)U(vJYbjW0msXY%3-SuNun^S7@rK&R)4V{!p8r1D>Kmd-=<@Gcqb^=^7sZZs;xP>v zo9IrER|S9kmQhw{cNxCFRtP)pTh=YnkF%1hsSZKQ^S?UDHWwD=R-c)ZRx=J6; z6f-l&6WVIUKK1HA5TTfK2xrN_~|rT6 zruxG)r}M-*uf{4gvwn1=jv97^eW^9IK zf@C0Kmi&Ii$lY(2^Q;dpY`cG4lD~9Q_voL+ZGx`Z>JL#4so9W9qdiOQcOLv>aTC<) zS)6Wxdv9Qa;G*jahDeYR`U88ZS7Pq3udd5ZtDuSZr%(FO%}@b`0?z`Ho#p9&7&J=x z14Fyss=1%xnSrLq+bo?7?6R}`^uXM8P$1+>o+#>Ym60t~?23y;{+&gWH$jw(OIPRz zki&L~Gve-570pG!$^5)%xJLKvUm-oR>#WkUy=Kw#wrl&W$-k)hJpsx5>Bon^aiap+ zLnD()YaZB$8lmM=^)JL`^g=|a^v@~;U*4gP6_^;N+Ai5EeIDS4@_#YKZijLi7h}@Z zVKe4D!#2~En7Gx7Kn$!3C2VUDSu@c>o6jGp5U|dQVMQVznUR9i_j*E>>i#s^dC}Y4 zYbEu`TXvfzyh|qnAxyW~f0;?-`71*QSvQn; za@q2A#08lZ)G-ZXYea6|lo7i|>scbSq@@pyIu^oW^bxEVrlo{(DC6NMjcz)7{Tf?ehD5L1$6^4^q{eU_tT^_^BQqBe)dpb7-`-xW z0xG4H=$pJ)GPYM$a&#sWay9eNQD2`#_8NlmyPGm$!ps)yE|4hXsh)CJ1O9lv{m z{o%p?|K%qlC)b=~69+sDm%J-nLGz*3I+c}?p_*}^x$s$K)L|5t-ab@^@| z6y8+aoz|T~t(Xes&#hy7FM!FvF0EHoW;!%36DtQGY??@t%>4s_dzWgPP;BRqrs;{` zN1i%K682Ry^F>g2+uJ~hiRENJgoSNE9A9!dC17*=7UThQ82ntHe%BIGYl5YA>`#C% z)LRw>U~hD9asJ%Tw&G6%3ljGOoSosbpcpNh`?KL4<_$gS_>oQ7Y5kP;LX3{38TjNW zW{zYPJoqLq=k)S)N*_D5PIYfylq@?1h zdWt`n*y9>b_f9E7PLFE+v~A5n70$l%e4~OrqJ~7aM9FyWP$^-@T1N69rgfb?41U9H z0`JT;FXb{`C?+eM**){}+8(?wH_!eVsCRRVH2MJD#?;K0pGJ9veEBIU#^pUcMLqv+ zj}YKv;O?(#>MNGdu_gY68hGX5Cn`ADzcKsH#bE)eZhuy&6?E|zk_$m#xXSKvPQP^(_m+tI`iyzCn^0sd>E3_ zfQUcWiKSWIr@5q&&N_EBxU}QK^MmC5=RsI{ujN<6(S}(<7p-i2AV$9-<`E}=Q`zK6 zD^l1oGO@Wu1x3Mq;DlnrVn75z|9Co9y_b+$jLMo>t&y@}UEFGG*2|hMdppYE#nRd_ zk

54;2TJ_%9=Fzny#!BFV>`p~?6r+g_FgUf@Y=(u7<3Mr7K-eD7;dg^|F*A^4Ad z_im@_Th_;vSsf==@X<0do$+`bf(Pe0t$BdJ1TUN(prA{z9gT{4-tJVC0X+3_;AbW% zFsl3j=oV?0fWif>sDl77?2z}JYH_4q7~X+CUCKL zr%`{jKXktp?f};n+qZdF z&3mYQCR8)j;JPTr8~)bSNXJFrs7~cU@@z}IyzvFG)oK+T=|WIR{$AltO0|8$TISSx z*@6W-k76OJx|9UdM9XS#-uL$g-FKZM+6e(|Yzr2IQup!4QEgF7=1pMO5vD(7|E0s+y0@O^n!RWMW8Igx zeTU>Ebd93(yRz=>-LarYqEs0ksBhMdTb~GgGtA%>`rbismW=JbGd|?p^xq+)kgtf3 z>&bK$)G|r;r=(V6-6H50A+t+qUW{Piom?BWEQYby9Z~~4`>NALY-Z$*XCX(F(-|1s zZ}YqwQVc-h1kk_Sav+3LeWFgmGImiE`dcw?Jb%${wEOG?0JySwfQCGFIRQrkv0;!c zUhe@PSb#&k@Z8WYS_4nTTF}Z(e*AEy>m(_iXTZ)7=Z1O01MUtN1bI2R zu2UFbpW68g%RW30-G|cT;^RyZT_k@o1u!WpyT#MD2*Xotudww1KEybfvhc@|xYE}u z4?EyUe50(?MsFC!0NG}|^%7XO9zyd&L6^q~6*ME(#i5d~yWHrOSXIepOq=|(D7;HJ zGUMcI!O!{b^_?tcT;GJ_q)_V3HppXDi9?@Ea1l5+&u<)_+8cifrvUPUg2-uz#UJuE zV8~?e_s9l2cj7kP&N1nOMD}(4e%rACT*MS_*=Xq5t9Xq!QE)MYQf+voYvdF_6xKw#j{-if0-Ba^zK4&k!7Z#CC}#P zVBRQA3gY$jnBMwV?h%p~hl zxwvVRK`TF}gQKH%`gYy=*cO`qIkNOkh??h`Q&7h9I}i-zl5_u6$}!3hCEr!>oyl8} zN?^(}k(Ot889)t3JU14)oP++&oDzMYF0lty3@;z+E8?-X!=(Hg^-q5NEYIXOVDQao zUwWpk!KaZpIct~n-xAO9x_j?1XfHxKQNp}8{*8INGwDspxtN?qAjDqRTUQegLM8@q zd{f?64*a7i3vuc#$=9m0*moA%0EvF&8F2gABI=1x}|tzYQNAHPB}WUd*tR#y~76$G+jcAQ)^*zdjX zeQ!0hN6!x{8@OSC{xuBC5+`q9*5dEceftoke_@$^1sew5Cj!A&MTQ1i7O$!d_Vj|Z zQ@?JS7r?(nCBu7?AYiQ*hF~i|Unx+De?$3x+4S@OYm6;p000011W&4uzjp;a_5bzC z0#SC{Mf?l}xbyJAP{hl<)lc9CR-@Gk@$^{tF_YF^*y!-jjPTR`Ss@J9jLjoweao?# zPSLCW>HG)8jBcUFK)nEr>;NQig|ja}nPlWUACN%!lgAnd0rH-93MB8o5Eivp>erXXE_=OYs2$K)^Yvo*B8dXapa)VjXe zZR4@PX9T4%3VkcfdPcy{C`d}jR07Ha916?JL9RZ0au3v-Az!b40xv9E6-dBQbHkG= z#a>^Q<7eZ#%T=y(c}2Lrq@FE|Vo_X5A5_C5Olftybbty}m8oEQA*#EUjxHUjF(IeY zWv-bA{|~b*Xn@J@<67Xw4{gW075HWvwG-sSr{hs)-^`RM>MhzX*-wAV2a~YdMpL0Q zo@-cW0a!2m>#QyIgKBbYn;9|nSKrdQdPj~^qpE=AJJi;KS4a?JJ$s29842@=g5LF zL%L-k*tj}(a@Z5$QzKEc%!Q3|uCJ|kyKHJ@VYz!v`PzGtxeSlnxC zN9{+2ca_wMJLBbbb+G8&290(nZ`a3&$Z>{2yRHVxDgSqCHbT8gH-G+Qi7F@43kHMJ z*XC=m*!Dqqhs8KY=WeMZoQ@loCd^HJ&?7TfY?tHKUp1M!Rgrm;2f4&v4@#K_bT+e! zA*S8tKeaw2E{R1)kW;O`xu*tfSKqqr1$_6LxTo%SJp}-c>Had_t_UnCOIth( z-!;nf_-!E^O5%1w7!8V&UoWPeVaMnX4IaN<;R&Mq^(#6Rnt}wO$=~9Ow+M}&zv)ln z6LNnV@YC@d(>pT77&$8v{yB_B7T8d!yMw89_H1M9OS={dadJ*~tkp+(Ea)8`25s`O9bE0vo~mFt zoe^%Q7^h)a?7|=SMi=q0^V*}i0MAx=7f%OUaBYU>!dxzPD!Biu-IN1s*o$!JI$_qY zf1qye_^kjg%fjq1?7gPBoqo~EW@VT_=WnRxxKsXX(?KXlc1K%%azUh#JzrRngr=%; z?qNAA^2Ef_ma2+v>F0#&pyuvdyf@TuCHuyWiQZ&vzLhF%cOO(KIdkh8>Hv2vjH6(o4@%6%sE%Cra1zEo`8 zi{<@SIGgC~!k+kP{VkLSZo}VS{vRcY_>=CF-s$!(>t}Z=;ISvMXA}AwZ*+ z001LzFF?!e<6pjgeyoDyIw5i*$e_DUF%<#ROZoQh3bf7;L3P?@)zDefV{qbVHP2k)+zF-_*Pf+jOn~p4yXb@kM|Z`<}>EN zlal((VS}BLFj~}bH6WHb;n$?+CH$57ZO2h?}Arm&({6@#gng2pmlbELO|E z$JF`uGA7g{m$X6xJ!+^S?4k<(v?IU01h9Ve8%hm7(9 z(FxdoSm<WW#Bk ztRFCLHVN-7Nb7nopZNzwh#(h4Fxy}9<89rGPftF$MEydLz*V(6i4{<#Z&kbfOv52S z!LfQRyu7$PPqe&_ccwer#KcZOS&C2-SISp33|)>2?6rnLhzN1)*8)ypDrl_|lUJry zUz}OR7dlAPuvn^m4O>7?8&~(qa>~Zhf?vj}cF8>r?k`_ud z04**THI_JOq1#eUcQ|8c6?oYg^OG=7K+Wn#Fyh&l~`u}7crbbc7UljF83y+qcd8)}C+&12+V(pa*pVby5aC{IBXp*)fzOEuZ7HqumUP;9v!mz6iX`#C zT6~MJb>ZCmr^f{YEFjUyE2B~}Lc8={RoMP-a~EDneM#L?{|dZ$=*XC46)HyvR6~8- z!yJIy<$9>|#n=?!lERBv`N<;#XnCz81> zv_s~*aPjExt$<6i%H%v!32kR;yNIlK2CvpuFppO$YG15uaD_hZOp$Ojfz8|5s(fBo zK$igr5KSM>b(t&{tjA-#mL#4oO<~Z!ulTeW5FP)$NJh8Wr%`uvd$#bv? z_+iZe9%B?XECug3{Z4f9pFv}cJ}Q!Vxt)c<3@K!*GaYMWdy`DpBAI1(I_+7G(fzqF z(>R=&IN?HE)#wG)#$w0xffusG$C3;mYeKnm8ub7t#Z(N~A&_ulOcuxQG983lPyhRd zWS&@&Z-E3C+=S6$!>-5j>vF2R68ROF2l(CZrkP~4Tdd523DQPhAuf7`ND^+6h@9H_ zg5I+Wmtd6R{E^iGkJ0i}&(F+CB=az^kua zeyZpH`_ec58n2(Q9^${uz>gIWTVq^*>apA`aK_v#-$#DU?1^E&Mv}kQAvVQJMPEE9 zS46(Ljh;_;4%D0?UGwP3l)`(8Ud}ru$Ldr!lc?{C`Bb-?y7G}(mY_I`0UoOVm=LC? z7`zk3bMKeAd4MXPU58_@O726KLT_oYDpCYEoCR#L5Yt+>8ac(htnm`)^ba!R?7s_+pn&h#p*6i=tX774OoVzjO!TZC> z^eej#UrC^IQ)|;5K)M=Tx$=_9_u5GWxy!WSsGLvDAE6ivMK#S&vwJkN=(3Saxokza zJy%{Trh0)-1*9fZc(#=dNvV3Ho5naum0FzUHthj+VS-}J5Wych!LeI=Q95@6PC|YZ zNL3<4c0pV7d)rQM$9C8W_&~yd#!)jHjFQ>q7U^hlh*y4J5+*tjW@H91tc;M>SPxbm z;h6SAF-?am$s+<4JfC>UBTG^w;J-B`k92=5uiD(VfJq!f4;21Z5)Fu|o=NYd>|D#>E z3x6GjA|^1?HXt0lmGsh-fVJfj;ThF<{mQ8*cJ15w>BBP!EmDXMc}{L>F;iBBl-RQ~L4%tFR z+8saHw=>JbeqT|8_-3&MBQj0N!WX`Vo6{a)h&uPrcFG|d;=A*XUMe8(imq(r`MxUA zaIwiA$Z)tq!6yo&s3c4fpXksvgJzz=UiiQcV0d&OsIj#iV^|SKRP^_7SG4%%*f~3k zF779GiPccoT;c`_UMB}#e!K78RuD{|W27tpmYmC_oqz9)cxd|o$cZJ&u*4pbldo*D z&K+Yb3U_Tkr18iKS_bOKqMoEuT;z-aKHpDFEPZBO`8iXt4YA=hTle2S8%~$jffZS* z>VeTKUu1V%C7z_V`9-QY1*1EA_<#?#^I|~7j#YM=5wGcH*y6fqMOsHG{Nq8j{~`O7 znsmWe$6^Bbf!kxB<#smp3Awtwx9_cUsLRfGd!a$*DoyLuBJqG{m62zN`BIHIPMcqv zAy;;qTDovyThb&laaui>g)_fWBAz)s<&SxnQB!J)2HwXKyl=1S-`}f5wyJ02Sa(e> zJZ8f_4NF^Dx4SDicke@*v|`aHg-EaW{Gp-gdz&tJz?BRafm$+s9OsSRUVm_h<`X1$ zmCer3FZb4GJU5cl$KMv5+3la&4#XmMmS&V=uNGQj{aH)on`S)ds+i-_KtPQp0(rJE13V2mZYVgkFYf$}SDSmLP5zr#q zr^QKQik;_}i0NRIA<8|6$j~XRg=>mZgG6?X3Dx0lb=7Ac8$0SQul<=0-HrqrmzY86 zPVQ-TN-o{lJc0Wt+56{qZsCpqv`(CCUEb^=S^@u=cA{Y zO51&l7PEzoH`V!3+szq4a95e3Eh-BLX$O${uwu6^MGluC{nGSahtO#=k4oIQvZaY$ z!W35}LtsZrJAt#N>&l9)9^2_^vNqzYeb#7TRr6gMvIArh$KP9LEy!KAm7J7UZfb%u zF(B&Lql?nQrVFa?;xcI@Z3rB%B02$x*Ip%++W*qfNws>r%en}xI&iUz&kYO60KzKr z@ZWEn|M!2d`>yCgp5dNwHni-;eI!V zU`zN{r1<@qF9e_`Vv>Q*9dv|f2}dv>_~@NIYz-pRb`mggeKi)=ex}~}5X+Q~*rlTY zuz27sL#emZDphincxtTObmAnvm$lOtm*ak91L|%g%{k0kbXk=NZKvfd3x1lDan(`u zlq1&`#@FFUcWCH3L#%+cs0oS=>L@<9sjT8S&uY<6lv9b42GCNcOBnN%gY16k1khY> zbqZxEIt}xGQdF~>I32JXUyGKdu}fS*21GYaL2NHil9fBeq-bR!5L&!T-Hb77x|!WFkTBG{1p2g}G;S?2(o&<1v_BwJkGKiQT0J`baE6P1Y^ z$B~K@U!?z1ju()>>MFF1s*1RBanW~yJ z-RG0!jsf!T)evGNNDpzd|C-mpK)}u)$-1OX;u5In!6eezzZ;^x-rO7rW}Za8ytw3R zJ;dN9|Ir@F!ol)%0Ci1jE^4tX>>e>H#6;%iVZ zPfMwAyiO(C4`xYIn*Z=RO}CS1)RNa$N@Yp=hgQ|5EMFAAvmtUfibs^dmqvy~*3PTS({US_Z4OjgNnn>R$7yh-uzcZYA4%gnbZSw#5+ z7<>#Ebdth~qSDqB&S3Rl5ZIc)$1&=3#PK+rP=1wuk#SvVp^#RJPm#y}4}!yXm5s6} zO?{u7Gizi;tsUd-I#Y~Fk5f?nuy zieMk+a&tb*u&K^7uL9#@(nTAmD2nS9_UwV{m9UMb#ONHP%C+x)TI*n@9*XYN*Z#T% zpnQOO#awSlN^}=n2meR$q+tfxhtWTPSDjZ*lJ>AOeU8+m?RtYPqmaI#|GG|C&0cY7 zl*RBco4KckYhu6W{iPg3mjps+s6-$Ltg?I0fhk|&B)3W*2Zi~@L zMoVCXMb!RaO@A?La~cH1Ro+TuTwB$3Mlw1ZJz^U{cg@y>oZQ1Wr0i=h{EWVe)H&Qm zsS+l@s2sSB3O%#)AazLP0<;}{JpL|`-PjoWc*L#P&@Ji)6cTq^CJHX1YA^=^c7N~U zt@9hV+9#0RNP^B*@_*)%aeTUa_Q-<}GF%=D3B_;npE9;Pd{K}Kis?F^4~>kn^*zuO zii6gEU)(K!qN{PPuk*Owuu8P5BuHgQr^{qNy^kxtD%oy7zUQxhJAhv8EuZ$Na7$Q4 z@#gh_BY+sXqG^+80`zKCgo>K+B{qsxWX8`k9tilNRsc) z6&#d(;wEuPiq7d@)%R6FVBTis`Kw)GeIcsvn11d}WXX{Nd)~N3N>psS9z_1vpR1}_ z&g!F27hu=lU5LRF%aWtw%4y7MbD;{eH1K-VRkR@7)aY`tje?8Cb6P^*GWHW97q3Yl zg{9E!eOe=a6+vPb{cUZ4a{H}SHw1Y8A+5HHlrR0MWYw*zAQC$IiJ;hjinpv;VU;35 ztZgNMk99$nw$3~Ff&JU47;!f}H=^(ednaYSl%0V&Y02K_^ zBCtjw4hQ;FR3YGINz%eIfo-L1azp02WDo4p7DWMHQj(Nebo>Oq}k0pWn5K%fWA-Fl<)J z<6k?&L6bCI*QY z{0S=Hg=06uMl!!H2~BuQ(yNIUJZGc_iY*&el%%Pp5+;@&ZyZv5rs}W+R@H4}puMFG zt5Jjiscw?2UP=2%x}qTcZas`^b)(Yw) zp9}Tvj(%!C`87BXq_Alvo0Zmp#YXI@&{?(D&5k;yF&rCdW;(i&94kj|%;5MK7md)F zep}<>u1IDHG)Q84Eo4CtoBe(IQ||Dn*&3vpTaa>v?~&5}108%)yxx|nS-=o(wu}9Y99_7yF+A z=2X9$oc7n`ur0e{# zVi$5&yBb)ncky<8Ov=v_nV}&BG5^a_aI$TmdzweI(u?F$P`v`*osCQn7<91|OY-sd z9m79pb8=v3L5kyzxXb|JgNrh2X``QxX+g?ae5`Y3M@jV>k>C3(YC-&c1FMlE{dR<3 za$|%byuE2LH=yx~m84G3)jU4;je`W&C&~Fu|3BoZsMgwO6l9SZv}h8kbDVk&<`!R# z`g^*jwc!ox*|crwM*kmtmJS`@U}M9r+OzS?{wnmi!k1UZ!ydB-;rFh|_QGJ|(uu(< z<%6M2@av^Zcw$}oIpbd~@C?;~+F`HOU)a%Aty2b_gKl~OF6lnzCq=Y(qahCpXmUnI zLjKU0ji%$ywwtx2PbNAfuhyO!L{EFE0JJv|3gi!7!pqJg5jyCt<4beQ+jI z44hydT9zGCI2$wOYt~;TXBLVO8j1%5p?C3d>&PecpTZX3`9dun=zgh~6DWwy-& z#lHxFzVWg;KeE|lp1;z3*H0KEW7%~gueM5Xgbv*JlWQo&;sAOm^S~7y6{J!&b_?#I z!AmH5Nm6TT(|4~R=UiJp2sVr^yVwn|r+dM!h6VfSX_dv0f_%4;V0mzux7&ci0o^2R zy9&eQPZ|>Poy>5T9+tR|IJ|lCqMB+`e#O0aU;m*?@r_d4OK(;!l{L&?bclWAC6BNJ zq7OgeD9ZlyQh3+2f9&!@4kI4_XIYYmC1nEN(qZ_xeqd}7L^cV*DEanaQ`g1)J97Jb zDjgoDs2i}=fl?E~=ohh{0)qI);bSeC9Lpip;8iA}*xK{ffvr46D6=dWD(Z8_0C#ki zCU)29@pG+3n{)!Wmwp&@+?6)Cpy}>c)Rf|}-k0=FyO%XIsDS3RQApRFn%jAdcf3k5 z&Sm6*ap)LIK}888*4QOiLa$Z46A8Gaju&K)ennrRCUK=~mR>y36eE8gyJ5`qfd!OB zggV0#-ZxS*Jb6>R%uONxD%`$F%hwTEiUDd@4J6>=_h`P-suB z^9u?K^OFY({sGy!V_?+NNa}Xun9?F{6Y+p<2-q9$-6VBITEpc}8WQrI%swQ84AAS1 zLO|Lcw3V(K!qEwbID3s7bC$_@<`XmHoG6N9ET{Fn&@niH0gWAb*(e-i1|%zbTM-5v z)M}LhnX}kW<|jAIeyB7QsJ}*|QSP z8HSDjcpB)5@#hVp$!kc14oMwX(ns0-O}lzIZz^ySXYpasew%oDaR;Rv;u|xUO;xUP zy@|~GT?h)X$AB>YX6QTC&aaqGqp+X=5UoKJ9*lQ(Nc%j{*RWRwge0kN-b}ceHY` z`@aI{zm?d^*1_a|N>mU4^xycOef<9jFdq3&kyu&T|KCIZuNUnNtp4W#frNzo z574a~?fzf>|0Mwu2n+%M7|+<58o3|?pkZ+6KYwuE2#E^j1DG2}fn-gApS$X9)L$?0 z2>J;(0@PFp%tV92jY=4@0r+$BANV17KJ}NYyIQ}5e5|0o8tZ~a5@_M$ zl<xJylSHB`_1Uk3A|V6EG9NC8x;I( zP_IbC_!q+0N(CLjKGLW9JpOxG)8{v*IO2o+kEm3WLdXw&5uOH{|Ef)`ViQ^(Q(s{M zDEHIweT|p+oqrf1n2T9L{_f=;w=P2F#0#n^+z!1Kl7R^hHx4w%)MA-|EnYC@0oed> z3l^~ZIu8IZt8RIzXi}@>zYB;SCg(M|a+_>a2Xvu|s#}Pv5_wt|9#9M%8#1wcLX{cl z5i&0pOpQCJR-t3wud8PgNBsbtHO`|j!k)^Wv=I#efFJq!0UAP_KU?_ zQHd(`Y;J#C9q(HvZPu5ciI84yz*q1{{A|n6C#ORs4RGYho#DMC*zaeTGEg5}dje@|fOG6d9qP!UE>S`W`k=i&UhLxb$|uVeJQ4GwcIAVg{(KuBg)|t?IeYt7RIg_8^r?Ac(C!qU5kt9=A|noAsfwk=dXc@t8*u{YFsxwl|1! ziK0o>j~pp8syqu9SVhO5DJ(FNfk0l<8&3j6D`9V>>iGK8eETn37jKm zplA?tSu&Gu!EfWmYHXDws!pC6<$Y6ys`3JYEmkQ&t8d%B-p>e8+-?vsVVuVY)ewx? zxTG2#mk6Ki?EH3LqLx)KDhUtI#%o;_))M)hTUX03^0coj2I$+iAV|!fX(7cE6gy*6QHP`6O-A^|ze|X3rY=fwG+J{ew%-N2_sc|NxkQ{s z^rsLU&b~ELvSgf0pg;EaAl=;jWglV4 z??DYYTQw>%gkuG`dgd#pK!443o`azIwIOw+2+)qODf?|4KCw{He=>SON=kqmJdU)y z7Nt|M9G!ks84>1&bJwBf*TO%-3Cma=x1pQElizQeXduIh6ySuCYdq|hikl$Lf6?`T z&bakf1Zo(0FT|(;{A6Apl&pH*Az<)iq^-qJ`7(>bjaEKD?*u8idHdgG&eAcbFIN~v z@i&0~31i0%e5^?0Wrh!MntkEX1a#2Ve4L9*Tox%Y)0;w?!VQBB=<+&;2U=d-+B)69_-it>0XqU37rEUBy|@A$_8TCGM&@C%&x?$-6&N^MiAAyk`f$ z(|*5s|0s55H>!**S?ANnP$ne5IF-j-K}nM(cSwB-koNp)m5R{&iayNj>lqJ5m|-R;f12K5?#LgC1W4usVL zGMVMbZK%5#>z37amWtw+WN1!Vt>)-Djms+SNMj?o7wuX)&Z-`(GTZ61vm&QER-rgt_} zC+rJ>U;mX7p!XDRJ8QLM#*wNERzd)}%4|3+Mu)8f=C4O~uJ@e(>{Yb?3!V`Q2W{ri z9VlQVJe1MiS7~s@mZ0{k@vb1DKU_nYFhbHJ26Il7u||%nlbd$H6d@AJ#EE$sYK`Bh z`RAIN?yvq~$QrVDq%alHWsy<8nNqTDzw2z*)ATEWPw-(i)v*538R?EPPfd?7QoO?Kw-WnL-H=4;=+-co3Eun@Vx5Jpb9#`am^VNBn3l#(txp( z>A081v$^*=zPRM4sE|?EKF;IUS!vxJbR8xf-1{Ii>|?u}-%B|9_N|E0R6Xk+XLxQh z^ARJ9Uhcm9ZdjvNWsxYvl}@eraO#O8*VD2V8Xlu5^68lq$ofu>ksqJ`Y%TfvR~~48qprit>k962-n;nVF0-?9vfzNzJ3P8 zQ!4UHZ*ZxV!a8>0x#y#Z+QlYBK#`T;vFykF4G)BJ{qx3!Z|F@S;8f0(QIdWk6K{LH z8PX%~<0}ydz%A7RM-5O?nc-9!h^uI8oiKZ$S=OD8v-?Fnlj_nUkok6m#LV6fqg*m& zZrUA0bpdPV+UeFOhO3xVIUD064ZTaf=h9JJl03XQieW(5mw(y-e)>H2F;5U%@Bj_N z`TDVQdw;nG2!HQC58bLMsmyknkMfzf^nA2_@9SqFQ z(VD>v`mdZxpXEl97<9#g8C=l`?tS`OOqXDxVrpUtG~T3Thk|H9}y z1qexu#b_ZvJR>P3^}3X)25|(=c!;2#@jz`batuGmx5L)nMskg-Z5$l4(Y7?fblQKZ zaG+!h5rAn#VACF73A^WwGp@w2-UEQAr*HbWm6L5V@#p)y2IZ@waXD|=iYdtl5{gx> z+0#S=2axT3*orgcT(iC zO`Lbm_3m`WS=7TN+q7^)CC`&5h@hVzh-b4lo*u#Fs@X8iqYV-2KEyWSbpGWhY1HG} z-jF0=cqzj_a?mQ(2!uI`W74rd!(lgSVyxfNhs#FPS3#~IHDU4^S+MSXJ&lbUR(D!k z|Ca#j%Ytvf)SPs4Cv5FB^cPFp7DINA`tsbxhwZr=HPu$rxFvV` z3olKWC4W|28BK|bLWM%PAC89n*S7tREew*FFaBF9m#6}S5PWPe1X74MG#~e(s zI*|S{Gf(#Qtu{5y&owTZQ?#I!EC2uoB8#??X&N1LBJ5zbteFR!;kr3}$NNe2qWs96 z!6_fE;_N%-DG=mx9#))?9#UbwfR{P+2<0{}=Yp$vLmks{@=ds|xxyK-mSQ$5b^EW; z1f87c=wA027jkMMYjSR4MA*TDFK-0WgOfrrH)zUT_Zrw1&X(BFwd{C}%GU^4`9hIk zg(C#Jr}9I(O-XaOFO(NYDDavLZm}FQmkPGu))BjI_)8I>SpQL%_T6AEZQv}*963Td zY;14uDO@5FtA^@1?s=HTxh1_q-)mC_Z^s(bT0%USOlp%OjTCI;B@;?x)Zn#5C=)fw zP=IMvs_D$zgZpj&T@4Rn)X~3;$AuC1NK?^Y0@VKPRJyGn(SrvG<~7wU!V)DOth3;e zcVB@e#@YqGw}QZriA>}4a*g#}AvZf?Oo&Ta1x5YveTZqJBMZN)hx5+D9IEJ1zO3*Zp%Y*8BI@mTPa$uOI! z!50=4Fh%=VABR;UXSc{pd8)if>%SS=f`3J>K&TnP`{$q0?}LBTFKC(w>^X$-V17LN za6@w(*b|lht8tvw+>P}m!5g`2V|z{?RNlCq=-iry=N(!gIiBnE5{Qu0pLpY3JRyDW z$Rj1hdLozBF>XaU<~e_#MvwPQr=@gi4Sa#{%)bLr`QglLZ6b3#b1oDu{)Bjpj}9^z zfBeF~6(J_xjXTJ_!W_0`HH<2Cz>r?RXBU3A{INS*y2`!1Xhj7`Zyhx!n677$b&*-P z4^2HYmB;Moyp|;EJxprUGFi#VJnvTWx$YbPGDSVvBofdwfoHV;B83q>ukB}9OSxL& zdg({I!Jhp2oRQBpB@I+I4*&EL6Aty^5nC*1S9~E@9@^zE~3QREM)#h!aQycK?yXw^+F2 zG&g}HqUKn^@lG~0w<#=iyf$Pn6L~~c%txHBG9Uy|;G^pJI{Kjaele&hg^vL3j`=M5 z9=t|MLKg5PJzH3?L{4Zc$2-`1fdc3?Dm`)s$`)DQgw=>)TQ&%hUWAY_M?HfPH$pjv zAOCRBhRUpDFe|MEK>}`57!QvEGXWC zLRCU+;o@@ohKyQ)da`YP4<#6~H16Q#xfe7lpkjG1vjk>!DDa{-U%`b*^t`E6P<*@s z#}U~^&y^2o5t#_KjMlo8TWZbZ3C;hl)Q*>S*y{;295O`2dgNhdE%+l7SFwOGaj16IZLZI(Qzf;Y>*}lN=otB&AnfmVkLz)cmO#zm zU)nSAKq9w)?n*NADST+jeE%&Km>0wbqcF9Bn{&=)9?ocvQ{o!*XOWWh0ZVqpvQyrK zB4m5B0y>9+%AcG*f=Ltflxe&sW>_f+?CFnACdzqxl|iV&jAensN`7x8BonJS&-3J{ zXEDCX#FS0f`9rnLBA{7Cl}GGFg{NtJv&-t2HGo|35(;|4@<)To@MxfK)o!Ch{|?Zr ztUZ;Y88a`3LvQSQ6cR_j3w^H*Lr|90f2q5_&cR zwIf`3;KL)e;buZd#RezW`~i%+m30f?&`|u`qH$m)KyCtOd*5hhLRhTQwcHtq<3p$s zV{vGQp<_9_ffNvo)&KNc`FqEc_nf*}G@7Tc6SKKG<;0y;3@hNwq^6U|6ZYdTAh-is z-STX0t&A+JPf|I$3c11erE;^DL+)J!fUFHpRCRHZdZdRlS!t@G)*|6;b6=Rl{G|$x zNnGt+1@d>AUy?+v-5sDCzfu^{>?auYsiW*6w+FrfssyBS1J0aD|uGO%8^K_;i>n9r% zu3DRkmg1!f47m)--l7sUv=qkJNJ@e}?vBDRfrrBr)B!m%WFm@}V`rnPUZtQCMge>A z$(t{i=jwOn3;%Gkao9vV(!|<7Iy7J9j_)TTn&KSSCw7$3tSx(c#l)iZFIt6B%0||m z0k_pSM4r513x*0UlM8qVXg*RF&>38C-N=R6ew?1mn8twZ`?{g8|Y8bJb#m4?x@4}a2@ zdRtQAYC4J=(&yqXdR))!3&{P&7Wv`jibEPVbHJ?bm8b$QAK@=wmZq;t0Vuv8EQiolk9tekKRbA#B3(}Y{}4n8lFBJu03xo6fqd4Q zvvNOp;F>9>dT+X9hz@{}IWPR7g5K$DqL7l~0yQd_tty+W0f{4;LRsK6nB5p!$SfEj zua75Q%BaO5II#ClqYA-s3c-0^DJ7iE73dTOTyU0yO5|Gv;tz!bG;|C;YFOzwTPMne z4dIJisDy2MCIErkSqScY5eKL%FprX`5Xlof!p|4~origv@`pDLsIga?0IGJ6BFyIyGi$0dwMHE@leTutDXzT6q zn%dq*LdJYZt^hmJ>`Y+(gu5uB$$;Oo;tnBAn=xfD^7b;^pyy)u8VI;! z1WLbLP1g{N^W4;@J-rH-)JeY*x693 zpRP<~Buc{6$4Ha?gueUY^Y{J~m2|T=DRJ@qIcp75zyTW)?yFj^0`-yarH__J>}7p$ zZRvI>(wcHV01G@B_tS7VXrFDA1ofv?WMY=WcI-k_Rg95(TykGLnHP|ewuGN12S8c2Y*-A(7Y$6w1mx5$0j?rbvW#IAs>k{uB|DB zU+ApW--&g(?F3U5AWBa#kooy9P(S4Xq8APbrJ$TAeGrm#`f<38lOTZjPb=z6HPIuz z-YS%YJuUzWixU}_GZD$akvV!)3&k2s-fz)R?0ruxY80-pV>gUSmH;EhJ4MsP)-dD% zNBbL>Pt)g7qBE=xvZ(ghC0Fg`H1hj>bu86#gpGUK%WJHqEsu2~D1+~5;DBm@0tO0d zRbiT=FOU9WYtJ>^+utyfuf&q>!c%m7u;Kw@_`kYLWD7a|CIwI6RM>g=yz zle%!hzJUBMe+o}!G>VA~dALF(>GZ=nYY(LrjP!->sF!FYdqIE^3lh``E{5!@Z+cOa zHcltW$_aP8-GLC1lGri5*|IU)JpOC)ntQH&A$;)4TnCR(+^do7jzo?0+A#8PbM5A%u)p99z={XOa1gR5;om*n>H3#=oxscl%^VWZFi{uY0w+=Lcr zQgrOw`Pkl-^rUrqMUY(ELK3;4f(Y^^dg$P^N&O&1H@a-zt3H<*<}FlbQZ*SlmPg<^ z3&R1J?j4tcK;nD+mSrT03A3a#uXqt0Ofo58!cZlb=`|s zHb;M%5YQ-Cphf7w+oDIkXPb)lyI3p{iox|wRgCWL7V@iL>U(u58#?tXIM5>g755>= zO}wPm6(?HcvQYnAIRYh8?9{t9zj+#4-^Tt1?q%StRiKs0biYtDxqiH)U<6oqDAdVh1^yD!-BBPE)*9dol=z=MKyU;i(V$v7^H|%4Il!--l^$O2&v2X?Nb%KV zy4~2f{9P1T1Ks1$*~`z##`cQYhqggXJIe9YGLA%8fNEN})gVMp;$4dWQv|CqhA}i2 z+c+0O)@8#crmq!q&}Ag|QGZPl<#a~kL)Z}u4y4o(ef6WNrY_o8EzIULdqTaEG zZ$8D9DeYL>cZ&?duE)GwMc7DFyMSz@zxFajN!fugQ@BSg$iq@?!t73Q47*5z8G-3x z`R$48a{(Q)JE&cHHyBKwp>67#ZF8J=jf`>vc%`U1TLiaLrfbv<4-H>P5g7jEz> zUva|3vlFG|@;(&u_AqbWcYlQv)@B`wrM55M+x*_tZ6YxAQo5I88>USx9oK5oG+GNV z%fV$O7)HZ!@Z*ZrY$Jpib!%oKwcfDZdLb`PCu9{_hm=)93G2t4pD1*rgYWIqS-tiq4WgDQ44U@*QUF5LbcUkV*Bd{$G^6&S&&T$OttLs zR-BpGbr=gxpl9snddn1nia4CJ#NF1c#c~<7Lme-sGCF=oimG)_VNo`PQ=yvcV)UCl z^Rsv0?=cPifpI!GW8lk-ND$<+@FWKdMK$uKqNFat)|51F3mP7%?2YsYZF~63OpbJq z?U|@^@f8JwD64PGIz*DY^zvtb6iWZeZ{;dMb_lcVbb1O6;_`0081;bF4m!|_>z?xUN3tE-Be`c#z6dSKWzi~Kz z;eRLR-`osR8BQ6n`I+V2qc?g?ZWK=e2B+>GJvFtwgIL0Rk#H419|{4CuJxP~mw&t` zl@h+e7|~NI2v?VFq1bo>I2`yCMj=W=Hp};bbF~*t~hgal?kYf2~_G@ z(`OEb>$f^_PBInxG};ibT7*kq zg;h8Cq3P;GAbecwe^Q0HJ2qVy{DQ!;4DkzVainRa@koScqQq|Iq9_bKWrUv}>C{f9 z(IZFzUxKh|@Nu1wR`Whzf9g^1+50`$+MwqO2)`RAsPn=BTTj37wxhBI0Tb$G3W|47=yyb#K!w?m49^u~*;D-+N@l!%uf;^wYJDCn3PWeoPK#SQz zJcE2RefiMnNj^W$U1c55G=*Stawt4|PW#wI@?kV)`yGRO>G}|1t+l^~VkjJHz0zuI zo#Zc*KU}=nnt*Ss8l6fJ!C{gf^_PV@_nPI{sBNcmDE?y($iAPd2+REDg~Yn^}#fvH_gIedm0a_!6Zca)V zIH_JirWW;R-yciR5_SL$>>*vAEIFc!x^0KN)!rISl|E3xnOZUI+v7Xb-RGq0(1lvN zd9W0h+_19W=~d_43c_LFiffFKSA_gu{T}x;A#-Z=Z(*{|ucdO{w$wUug|9RrTUug1VY!XvtgPPDQLmcVvCzyCw> z_*uhxb$TsbI)suZ!=WFcN=e#DGNHQ%TbTeeFF?Rc&;Cc5lSdrTb1Z`+(8;n}EC*8@ z{cC-ewMJe>#3auiojh0&Ri`2+yH!P-4}IHAl87v!qC0G39v=^PXA3_*#AI}-(mT~ z)E%XJlHT`oc%O*X4Ayyr8N}hh(6vdmN&EuO_l{mhL8E!aHp>Cp2zu82q+XMo)DTLN zMHcUc<24Z)R%GAU6M6Lyu9Ge<2*Cf)PiS0v6>6loAqzS0!UR2A)A8p*Vb&8^yq)A) z)FrB$_()Ithf_TkY2*VL*t$$JWHq4*gV$k5SCD)Q9xOuE2Pa0#0d^CJt?!TA^s{}Y zA+<_a#lMzoLAf{P5;N4>+cqO*R?2%)T_&P@12AHC?t)hlSKQ5L^elSx-}LQl*&Tk= z&q6)DtK&)|Y(B7|1YElq!oM^a?~i@8^I0?g$!u?z%7JgKSR(H=D5!tlt#0RTB~4FT zgtxHH${1C>-;NFJ+Xo|j>8-cq_!y49ei#1&LAU+_(H9=P0VvEt>5G72^N;D;234T~ z=eu7o^^X^PWrfJ~?2A37T93WR(3DI(5A6IU!tb{-U4{%6Gg))}_)L?y9P$tY_wUYjLc}cf2@*RcE8*@U zf))LqZmTr!iApvX(DtU5Qo-O1afRw7NA1tb0>>@NP2XlZ?wzbnHNAUMf@m&a0u0h! zlr|3vnRcM+N#W%z8Gx=Yz_j6zL&ZEDnzNF(b9`$uRz2y-{{v3e{hIV%M>?YChQ-zV zOP+8fTv+G;(E_(R+}I`8uaNV^}CqA-G-hR5lQkO9si6y zH|qfGQK44%*j~YX;wmWz^uD|gIC$=Cr9uz4AAsIBu$+x)A4e*cfj)fN!|->M)A)A( zQcxnYo5^EI{j7Ns2e&@a!+mnlROX<*k@4X8J1Ub|5fn-?so_}1L(xWaaO^%6e3&K{ z1Y#)n)F(G&U{WnXr;c)tqDk>uhgpke12#Bods6R399_R#e?OaR1%P_pu-bLWxl5ej zKt4jPT!`g#8O*>i4@oVhCBD7q2`)P_@L5ne;)gyxy)EsF>-+ty0Fnt7=Ba7JvEW6l zl}np4^&)#H+cfs1LSaZ@o^J<>KWB<>TdcC~mW@!?q`dhY>x z5-e{i0umpp)2G~nUg`UA)nE8G<@s~H7Qn6a@8?#NnxCgEQFa9?`gYH&Jf#w%TSzQ^ zO|}qu11=*|Dud3*VVrMRBEKvAv|%lFNIt?subrmq8k|I$s?3G?e}Sg zhbS82)OTF6q@GY3%w@-W;pOQU>Rx%LL78*_CY|5#om#qU(dBPGO}T5z9$N%Ll3eD} zcpb~tZk?NDZ&LC_E_otDQlAF>Tv@3|b?XGv>u2udk&ghMC>jmULHcDYW;1Ay-@dHm zkuW;2G0eJ_%-*rWv=v#Qdu){{x5QSbdXOCj(`F%@VLfgv1Rm<+=Rq$9Z;jNMzDyi(3h%j!6WuMszlOXp=NPV+OkP9v(@B5axBp z9pg$L+_qSg=Y7vA7BtuVB3WH%!Ahxk|HLJPKe|_sC%NTzAc&%9HuiF^&)Hg(9G&ACY zPrq{Rn~Z7$%=gpM;TkQ^n#4>4-We6hbpZxsMnbzOsm+`2h2%U*@fHHY`~oNlWC`V* zM?Q)IvKEmy)$J=YY?fMJ5Ggo=r9!IcF;EZ}h`0i^ys8K)0Jr3!Y#>3VKAkCYicGrW zfaFX#KncN`bJeR6L=$rkwIvdIMD-a!-vBY`mro;0$y+K+8A>kga@g-2Rb5lLd~~-4 z20neo*;Cjo<^>@DmHYsXd{n_PT@1~mSdcglUA-$Q&p;LS73XhJJ5@p;QVZsBqfEXS z{=TN406YLfTfy;WQdde#NSUsaqjr@bk(|1a3m3PncFN7r7gxNNeJlspOS zvq*D)?Rb?;vcREp=(s&8U8P0-a0i)uQQGb#p$QyQ%Fl1pJE_#8N3uCc%$;+ibF$QOxvEaM>%}s49s0l+%M5|EA~6cr(~NA}t(bKmE_(T(U^Q#f-a-f1}#5DFEkw5f)b(L@!#&X#b8^1*V6Aj5)vZ~Tr3LUJ>R4ibf&(}_p z0Atsm@J{{RJ9|JYFnZX-_^X0TJyVEW%1tSbleOD44idPol!31}4ig+sa63`-xpri4c60KSXqlOjB-23F)HsHa1w%l0_N1_kfX%@efh98f=OXk%ds5S3ML|+No4z1%Lz)nw~Z{yPr0>cZO^0Dw-~A`>G9{%uFm2 z@n8ll8ntMmBWi^b<8Qd5A?R8usLpv8I(JhDPG87^f7@Aqdgxij3AD474Rq{mjB+<%EgG__eX^>~qk)$YV$1LB9c6De5z0r$pN^Vz;z-gE0iJ zljB$zDm=M+Kvmk_)prdQa)Ri+WVVXrx1G=q*D9R`N{?;fpb$@j00YehmtM}n1ZZ%I zinM60b@G_N5UkS9fy9S-Wp{I>Z8)dhB|gxN`CSBExjW!riO73Z-&wP2-1cxX7@ylY zSS{IS|ML$MP=e!sK`H1W7FB$BcuUzZYQ$G$7Rj}U8z2%R^)9aOYhuGK zjx-ohw3ljmpp>suQq=esx}b@ZABa9D!@%x#0bcCY6*ha%4g>NT1DftR0GLN5G{ICZ$0`&27xyMc`utUVN%aSd zI}+6elpiU)AWS|o|1-c7ft(?y{$qOZpQ@%rdsMPlTA5f9h z;J4SWyw4dSI!I%(7ebC;TRz-Mg=qqP>l=Y)guJkx#Kt!d4;DlJ(D=v94D` zeu6f$a4$8~QIeHmz27WCO;HD4pr|2~L(GR$SD2PdeFh;@tM?@WKePqhTW81^n0|{aywpDSc^C0g*AzDskFr5GN|8QmuVPWAD&1;a1%!9}RB( z-K1@stG0UsYmAUNIP{=h=}p_YqtCFTQnL^Ssh}Q+J628cZdy&LuXX)`s}|4l&vu%_ zM`#O#g(d`x_=H8tJA8COX5vfO|HA-wmKp zF<$$q{&(HGryZo0?4_KNAa;);npVl_oknp~Gx+}x0F-pkP`-^+xG-Hj?w5}4vUM`#n)OoCx#Kv3T?G{ppfpH*AAf`bB; zEmc4oD0)1s&ws&{(4MRfs1?mJlExIE1q)Z@4rwFgkXcEEZQz3cSJ_Ft5@-4(0~V!3 zOk|apuIEx>rUmV-YZsQ_LMflee7E|gF9fmT3$eI&i<}AhI`{1tbowN#_|a`e?cf#t zel3^5w;azP$eZy3@1wr7kduHQ`s|&O*vK{$Y?Zt}zD7Dw@jN{_Y*O2Exi@S6hfOt7ao{X z0$Zu)m$~I)Yry`*9J~*t4l!YvsSyb1zk3IrHIYG|u^C^Wg~w9h=3ZfunQdsK9q90! zcEa>R_>J!7gFW?0`vl)1)3$w!2Z9`zn=sbwGach~zL@hEmOeM}`qPc3Hj}1NrY^)p zY;W3Td$>L#)3Z>C+#7l)KCeY7(*Bz^LDS0Q{`86&*NU88#!#^hQ~*Yd4MTI6qC@5T z8_ldkejT~RGju=nyM_I*)34pQ(kmRl8Ha-1qX;sDg_Z&585x3w_x@pID|M*jKhlR` zW{MrZfaLel915HCeSP?-Qx~s~x*Be=)`3m^!K|Rh=!eLI^v9bRzP?Rry#a`)rauEl zNj1Yl2Ax5MPADI&kaGZEz&%3r-n<-|t&F99$vm6(D!2Goq5a8s_EWfx|0I;i9maHs&yI=&u#*T$l>TUHZ%esz?_ zet-gL3KO0CUBQn8_ei$ARGVu3yn0MO$cO*awl}Z;aAK;O9KRwuva-Lr?7h>rB>i#- zCUY_;6rrz5T*1L)1;kLu3W1=>^7K7D)h%tDV@ti|R@T>qsjRlDSc@>gbD5V6w2!u# z6TYaFtQ^~3NBtiX9f_J|;4G-9U)$b}2QoL{tiHzp<~`AoI$kzg935#a5Awi55qOz8 z8mu*XrXzJTmK23|&+qp8hYBW3K!2EdQ?4@$t(Bf8%01Atd9sO7k0H#DpZioA+vU1% zH9C4l;rKeO6}G6-LI~wENAR-s=XK{qpHzSWzAj~K3z0efn;a}<3|nUV<%BlwxvPhh z++ybK<&0hBN^j;bnA0D6!k^Jv<*b`aL%-bn=b4buXWJp(GY`@kwmNQ^)a440%IIsP zz?ng8jZMr6#b!PhRQC6%mL1FZ(>@MMRD@qUs4uP5vnGdA>!G}XFo}w~^qf1A8k2G{ZVJgHw1m(c(4z9+DJcEA{U_aTX zDO)j){`zR^J_K%Ir- zcn_HniSvlvnH_*|`3%u*I?f)79u3PtJ->49!@oF)@_ekDqA6Kzjhx8^#vhL2_+SYJ zQ3qw^@jVb_c0HXw5EVG~z^)Pa{a4o`mXkmRf?9v86FRQ2S=$IWz;S_s@U!U{Bnk>v zdK_C}ls)Z6nQ=G-r93Ny8lon!W4V%Zb-E1H5M;XO_f0Tyjf)?~b=j_`xXpb#1#ZQ3 z8$n(+QwvN*zIsWZ3c_`I8yM+3MZ&}aUcezC!Q4w_r-L^!4dT-J~=&xW8;y1g$CIFqqp-+YEgd@kgPUS)VV6!P!~+`Ts=emQ{Bze( zOrK-@!l@|qlvH~3?ysi$5gwHV9r`r1?U9Zi_jX>lB7d>ojK8;|l=Ns{(5PzFsut}N z*fm{huRFJczlt`g>sz~ENzHvh@`06TivJP@1vX$xBHF(; zLd165W?9+~3q~SkU=V@^-3+q5TX&b+QBxdV#*N5BB)y8<%XMC4u3m^#SCsO5~jV$!QSwX zrya~+#bLRfN5(b%%suS48=oSs47lgt&^|y)tzUm-A9Gnqpk}{;#@drit^3Xk8u1@W z;eU5!c}m%p<=hAXS`e;tG+%^sgNEQ*QW%@27M#|=rz{(K1da|jZvG=FBIBIOE32%Ylh+@+2%NA7uUirN?Zny z@Mf~(`6f6I7<*d3V9a0XwoiW08rb<2!aNFn;QS)JsqSdGJu(6!^D)_WRW#$j_}h&F z=?(TX0(a`)%Dn_d(Ns7fQcUC&9g^YUSk{*FzzKp*a%Cf=w^14Het*9f6WYQGy=?3p zaQaPyz`>OjQHX^&4k2+ZHxxe$E(Ag#<%+&c=H*{z#2qR}Yw}&*oBCPFS zo4QGXwZO!Y8Y99drNi!!aqP4~6ll;j1t7KMLi3XeY(a{op!o2PqH+l;&x3nSo^4$D zybHO@EDfPTkhwE?>n|(vVVpr=LF!EFUbP-$#RLQRuD3VBi=;qMii zwEk^+9%<_PPEeN2SV-m2_a-M)ZdDx^1=cUGD`w5YHVI4kVaZuw3Wy5J zaoE24^&Nr039TCL6Qc|C&G}A+OV|T?h~e1|nw}kcRmOo9O{9sQ2F&G-r{3)`Wwk>+ zR!|-a(D#XE$Xs3Jw|}lGS;b4q6ggfh^;{H6XMEYha~X;756ezgQ)0{BbAB>E=U4`= z?^6_|OWk$I4Na(zDFvCTaISSf2b0=m}(bXzu}+m?stuQOOCpY z?(1Db+OaJ!FF1r%zA``68!{l1^h7Ifid#;~q%N_qKSxTDpuM<2bbC;~&Bau3sCQn* z|LqJoWPP^P<=YnU1NJ?>!q%mvGS#4?B=#F$A8?dDhK~kAE7T9IcEpnU5w^QO@h0O^ zxXyT;b$sp-B+-Kok!=heP#jf=X2L$>@qp4fU^_amnJXn9FK#6sLHe4e)f_2i0$5Vl zDiZd$2|{5}CQXjy<{9RozA{GZ)4!MWD9L;d*i)mlU(<-6b{Jqsx1MVbO)LuvFWrGOB|`mAfd}a;T2T@uHX|1h2(uF;OXGH`Y9~Kea}rj`mZ<(u z08S&Z+z)6&3tCTj(6hH0Q;&k~%pU>{QO~ zoe(ycQ*NHY3XqM*iUBb~i6$7`fkXYiSP5%aZ2(c#M;>cilgvZ>4}wcPOVO_4+T+l^ zj+lZabW`V;uecbhzjD5v_1Ikf0 zlLm<~rF!n4>Dh`0Eqyk#7D~QY-NTFBv~+;4JjH@2`x(*+eak;io&^==-aRGyhMSMSVyzy$e=l;;qSxw?qQHzR zJ`z&&6Zi8)PUEQ^5{r~L83(E{;kj4wf8fLrw<*n4QW|JgMq1DmxwYE^px8{1O$shX zVY~W=DYMnT!vV}B1nAQPz@QK~J5QCK8b#Q(O0*?oVdvehgK1W*X0>NDRmTDPIF0!N zj~33`d@Fn(z2q2ThkRwkS4NvMPkk(d!iiqVOs?Oc*qt~-n@zt@c^+Upi%*nT-m9?q z-px~c9$!NzZp(?E0v4>kJu;1uS0Sol2Ae>&(5HC0SOmJ|e+4e6cO>LjKy3d6{9sM8+_WxG6lRm1q58-Y zu(4`wG$+^p?_GHr+c)YPEvQehf}?R3D{czYLbrx0F(W(Xg#N@o$Zm&#eIV}isiha_ ztsfb(l9qhclSb*H6K^geCT9apYUA+*pvK47aF|Su)v(~F{eLd6GR$=7JlH_<1!ZIU z<1U9vYv1;)8g!Ra{W*HF_5dt>EMr&tQltzPNV=FMp{_)L5m(+Uy$wiE)199g#$n?W0WNUhbntfM!$ zA#NBc4JZAzVTAyL-`~7D!l;c&KK(KLzv5_u9P6%lovL5g87F^O_?t)>2_&!n8v37F zDVTxD59A`3nPRWdqSlQ9lXJ#vYm*1n>nI>vX;xOIYriFqu*to!(v#F0$>zU{;{h6s zCDprsAv^SAH{7ec)eZZ|l10}K>1vxUhW_(pmT{@VzfQR=p+B|GA?qB87f4wB#I<)P zMUed|B3PlQR|yiIJ0E8K^7g!d_!%l&f1gzenp!#ygR(8x8+UAHXP?FL*^&|n@X!HyXx(iSRV?J+F;u!Vtq>3Ehh$so2 zGI7+&kXli`l=>gXdyZTcgLO!qYtqRJ)?LZZ3ra*=vdr7AY;P4Vp}p4&vqnx#38Ur+ zjahAUV#~8U{xermW7w?sf_kt!0`8}2OKqddeUCrtLH1HAfjOH2#U^MvM9tZyC6%{H3YOC_6HzA#&7kE0*amJK<-grKxgS*r(*B-wWbo{ z_kt&EhPj3HtW;>I!!_!IQ%;2ClL+vdD-cX>Ypr*pnSP8UJuq*Lq6kC1E4aM|sn)XJ z!Q<{v`Jc$(fcy-8Oe-)ytDF-7UxaD~v#Hb#*HAoEVA#m1D`H!z1uU}_bzEYF06qOG zAP52_PfO!GtU=c&3}F7=G1ro=H`7EIH*d`=(j1)TU*p0YbUORVQjsH|b}o&ym|&Un z?fO*ED(*KSQL1+^?QI5=;I-EAN}5$23{e zU$ek7^T~V>5ET0cAwo-55uf{|$rul0KLAalUia4pR00)Wn@}!*{bonZwDQUVI1ldo z{fS+RV=&y9T%+swNn*$AjR`W>tmB4mP-Fh~_NpNdp+?v^p<2`?jTdioyk8n`-D_Uo zb3?RG1#w)O4i}@VRKNh@aPaefN*>^!%BBP2{zKF$qQtH62bS1G1pkz4H@aeE|;)U{}UT4E%8^yM~ztSCf8OD?E370lua1mxTBgXi5!XG#gUNP9;}O* zQqPgQ{zpQTxlXE5`?o}#Q{Ou_L)*IeaE&78R*T?I?3MGFJo||CDdH(kSB80Hc2jIw z@N|%)Soihq-;ajOt@;7S!G4P%C$_SWb4dO+`36vLJQo2WlPAo^vsX6uGh>OVc1pgO&s?%;U`J)m1~rM=oQIC*iz5QeDQ1FDC?p%5Objt=ZH*8&0u!eIQ=` z5azd+4H(#6H+ar$`({eBDG)Vd7b3bfIWV?KM{t{i*HaO6!XO?Nma7CN|{E zhBWW>*&6YULwh2I6m^;4ujhQ{2#d=UlN>_%aumpp*$!iXxVhWkWNuUd<8Q_5Evv}f z#m6^sI;o$?in~RFS!&_#GT3#9K4xNSL)vD=6tUO@Arz%ErU%9q}RDFJk%Cl zKJrADxjJYOgV$QdWwf2Vr(&rouBTf*c(dr z@ESW+4C|W~a!pQ*eQ5DlJmN)pSjMgMsHEuC?kS`vmm2QHGeI!6Xzu5{Hf%q&FFb)C zGcM^fQUpeS`z0vwJ6i(sHKpBX_!H=Fb_y~bnAY_BCWsW}lmFg~UT$Ef6^KZ3Od-E2 z`b96}8VSiu6ST6jg@Sx2neZ5l-f^LIZRRWj0{3M)1Q=EEKA=r3#Xv%*giKReBL{MP}|komRUlVG|ayg>R6g>U`I)Dt~V{faP4VoVHfN|n%vX((zN8=Y1 zqWs1rm1w2K(r+Vd%RMnjmPlXLg0Lm}w@3{xNKyQULkf-+}@4+l4ES=l2h;fIg&@=n5k zR+X|FTnlc8Nb70UV>gr@^p!+BlHS$u)!ZU&D&mWJygziAbfJVsN`(L*rDv_+IcbJg1p2sr6_X{vqUn504EFGhEVI3&l zh)NHE8@f&EIZ!h^ne6O1a7Z%UqoVnPA>Sq{R@62j^*({%63OcWWN{KPzu~!@pSOJn zXhh|BgD<&ap&cQE`@D)F={7&;p9x`?Am*sLI;4xf-DldglL>Hr0vUyBC5vg8_X1HgE2&fI{$T&I z&CQSli!Quj8R9@)3AfI-EEh@dZ>oIJPDI3kr4?zo`=wL7f9fT{kbbAe6ua~~grf_3 z(>R~fUjB9D3RB^;k#qEv+y<<)>FjS&lAL&snexq>5$FFgI+vv$k3u0^+OrJ+f$7Bh z-yQ&cykMQ4kYd1hzRy3KrKfV}j^kvoUUajYRbR$PX)hQ@H9+oe^Kj`U+2GF>z$8Q6 z)v+^Mk?Qo`j4?G~f#=5&w%X zPQ%4%7h!jx{5+CbD?bB&ul?Z^^@kG)iRVA z5Xc@yJ=y+L`C&$oNC@?*NWyv12hXpOU&@Ux(9Z&8zf0fhc_E;4&0>Z?ofyLWBD-Wa z@67O0Q9-y(i)Z2UL>`_Rry-`WN`CuZubF^|LHo2KG; zAl}nx@4^cOd||tz5_4$*K<>cDGXV~Hz@;@*9rN8i`T}+5YOXcaD(mwwiW0MW=KOGb zrMunq=d(TvyA&SrEGH5uz(9_Z8-1G<$O>*Qp?fC*lu0!qlixkHZb8MA{BNcWv98DR zQR;oY8V>70jr1G13BskEAH>Dv%GeSfO|&C&?JI!Oy`8Fwd1@Z-)yLg(w|<>o_ezdB zE|BqX#z5w;zbV)UsVTVcSU>Dz5JCe($(gV8LM7AwFJ7}O@KKTPPDJdN{04)(gbFrd z2Gvt58zFYxyfeG397cV^+$+=~w##|60l^zlY)%NC@GbInLpW+0oG0N?HqtJol?vhe zpBSQh0#bhM)RR3FnEKJu=wi8-m$RtdQG1`efw4v3|KNajN|G*;?BZ@g6qAT}kQJjh zXl}Mp$`Qi-VOml2(bT#E23l@A z4(b19hreb!vcCmI*)}R!r@Yz#Vyox+da+v|V%%_*ey=AVUhA|K$f53|qh>cW5tQVC z_Ta(5fBc)p$uy%ljKSVeq^1dfi%_&^;@Xp-vpW%>*#jW(pBBqK#??|L38(6mi7oJR)jMJ^eQ1K&rq|KKB(mqX6PH>YKw zXYuT6;@T*EY`bjgyQubVQqHN=dv@478%WQO>ttFeJSKLTpHFZQ1;LZ4?K%$BqwoX2 zZ}M_D>ES{tFluu9IZk(_IQZuj8GnV+(3r2hUkJkhmd>#s)W80UDF-_;KX#{6$7|2X zoDXJA_WmtXfrYk4v+GHK#dMxg9`JF6!CzN=!~C_fbp_$)V)-&~ZDy8CTgD0x(M{v&`L{oFky zErR({&KkhYTj(O!Y09{rXX^$Zqb3epbv79xu2p-((|xNoM0*yJT(=MPK?RuR+(R{J zLugVZB6Dp)@;VULsV2M)@IHU-21zROvPphnYsYPfLO^Rp<*S-FN)>{7N-4FJPq~e8 zn%4+(T{BF{cavG>9$y{0W_kdiIP^Q|njJ#zHj|q$y6*_2Wb^ADo~MMgB%mmAt_nHM zZI-A>ekdEDAbswEwmvCru3;>eMke}a0L{x^>}UcfkCiHOYOB{*l}#xS=#`oAn@20+ z<9>lGsMF+BfUG2-pW6$JCS(%mj)vssxZi04=}qU*gH*A<43HVoMm4&ng{;fX{rsKH zF{b3>-A}b1^r6c(mJeD8IJwHJNSMGhYludSxtNs+o z&CjeQ74P*hO3J-=S`Qyrpjf9u8x5YWPS4QKSH1EvEQFL-9$ZMcaV0dmxBO8@d)Jsv z%{47q1y-IiRJr!(;tk9asj7jjB7O0tR69A^%?;k4!fT)xu~$Z^bzqoT8izcEA2@vD zZGVlv7Oi>k(~yd`nd~VGemSJX$}+(6`+YA&(C;R&OPARFD$S~cYUQrMGg6O9t?Ff+ z-8UjH9`Rg{#L$TkS5yR-P*}^)4;wp}4qqu8)sH#tOUP>V)+Xwutq;hCDc~h=i@qth z>`x-nKmdSzkchhmDb19`{-%F@aI56G2ZMCY{S{a}Ul%DOMhs3MF%H7OEuy>S3qown z*BfDYTjM4o=??!iwRrsO(|^u8CK2!W5=x^+mcA;@OTt&Y43ZG+wC-v=AMd+E0OYSA z1%!djWPqWA$U4@=&84pE4y>INcS|nOYfj-w{Y+DSDOz2`QI>gwnQBqGx}1it)r2?a z+22TG+f08o3r^~*m{yo*!xuej2!nz)0|4(N*w04Ow4g8RXVLOIt>h6%y%CKp-v8isZaY^2!$RI+(*VFwX22qQ0uLy%*S~lSPVMN^5ceI>LQ8kD&Cy2=8%@f z2PpOeGA;b`DB;_|y*APZFI-I-T8^*;)K#PEXMe4|Z@h@zTM(JS&v)bBm4#2=L>tGd z>+5di3(45$89;huvm(}^81Bf|4H2Z z!QZ(jY*eq3UBNG_H{wl`V;VWIq#B_uRUMjcCuDBVao~mTfu#z44k&7t)wx_{u4onZ zihk1;76f-?-zLq_XoA9Dne^~gr$#UPR9O>%j0kw|uayb)KcnDJTC!zI@$rGad$Cvn zX6b2J0yI1>Vnq{{QK*cK9l<)0t_XQqyYF2=e~_93 z)#a!1Pc2Wsg8mnps=)Mk%HU8}K7 zEBrH=m7fz>&gXVG6wB@UM0`$5iZde^s}W8f()W%r@sG~goc!Gv5_BFH{pZXxuWns| zn6rCXR{8F=VrNS*(4%)hE#|f5B+NBWFTN-?Of{|j{dz4G{WM#9yi?4+0&hD5Cmr0I z9^7&%z_i8aJCJ{W%bwwuXv7IhDjCyR;qhdEVWI)1wvK8fFJt48{7DPZpAl!@c52z| zq&nEQrPx!=Iocj(KnGhm_bjiX$qYq*{>K(2!`K1ef{QWo$Ye;g{^5&-^DCT-vi5u=)^P-0$0dAi}LaN~+0%v6}ZsU^Lca4%_6bS{HUA}Ny>wec}7LJQ#7>04X$Av z_J9BK%yA{B&qh|+sPB0B$(r?W_l=s|=Oo zGOi%1F8p(z5LbPpVCmByyGpMNSjuNcFsmsIC^9z+P-sjF$>Yvsvbq{rH4=qUO>EZg zvCa@7^Urv!hNy;20?9K$YxxQ~YpNL)0>qQYy-K5hHFcU(Pa0FMd8jgY~XpjQhRG$4gT{r?To;j zr-IarfQ|huzcRyOFRj$ysSd2f*@i1q^qVOx{^iABJTGK($DZLJeCvp*KQ9nE_E4AF zhP8IV25?Kqu@B3B8Q0KA=Nb{$ZI!z3!C(2zn!8huEdz_U55*r@JsG?|#r;@Ek>-=sWWsh(YaEl7u?oLArPZKdK;614rjyQ{g^~x}=kgh2I#66oIhwN?=KAAEEIJ0=xE$q~ zTR23e58-OC!+0QrATwWTE@tRi^-~HUqA_lNTu^0-VyZNHxHnoN{@q>@sMX80qQTiki}mO zoOua=D>~GzYfETg=krXT<5_qDhdq<`-(hs}dAeX$HJsSwhdKuc;KCELt4qq_1{=0l zy50ESKRm{q052wl0c?nui^_S)jZ-!$LBi5b{irI04A#P8CeYz zBy0$FWgbEed9~gW{pxd#-0Y=pg$CneOei5f3B;M^!|231wQ|k7F%SC$FNSbu*vR?mWOp5LATS+bJYK)>Wg~SH< zDxnKfGhR>g8INz8ZzP>EEsnM_PWrvKKJJEw10ihiuLKdtx$Ui8oRl`%h0{M zd0kZ;wF>o}n2XR^+PF+jnTWjal6K)x1!n&Z3_7f9;=ECHzS$xG5F7+dfa%RDHe zW$|!QRe2}~ef+=Rt=DUztR2iU2sK9yQX^L4MLQ|c@&~eC#B`AS3{Hh&80+h?N^bet z@_vK)gX9S7lCXBM5-S+RWK=amfk8$LGPGK-WI-W2eFLIw&^sl6*4f_jL@RcV5nKMD=RY_&J`26YvWI#b zV?~cN9}h1rG3;6DXQiP)P&`he#H98rMVhSykw1g!{&@vJ9BX@*lF00cT8`EX<$?{SfNr*^!!C&mSN)gkn3{^;M`@oN*W{ zw{~DzC@fyHyTh`+d*7+SJ?xO9F?q!Lm6kX48*bdijUOT zjfiuIuAV47QjA>DvT-d$V}q3YFjUGXOV3Y>L)z5@{M9rqym=x3VkN;NVvO`6#)S3EsUK1Kl%UT zaP}6?Hvgvp{x{-TSlb!>PZI_J0Q|50Zv+5D1^}=T`A?>>u(18Vp#NvV`cE+d`k(WE zJ_fD~j6!zScK;X4(!$=+{y$vG!rsX4KaOJIWN-36M*sl$|2o9~YzX!i?iT+;fFU3t z{$nr(u8cwfH2*^Ykd5rD9c_)Q-T#{z768ouKM38z-p1g6w*TnA#6SRnflb^AUr3;ssc91s7mYuCfZ=J5d;Y539v}^J{%vOUT>k^lU8(=fVskh2 z9R+8bm@*|=0Q{C&?5D`ZdFz5M(p7~o9wCT2*7|u@sa)*KVL&V9x->TUEtQ6`Zfvad*=A)h`YjEanKb(h0UAi)It-y2d5H&u2|C zq-y$KQ_agxTmDEm9cC`sKUQ?fHqi-=$x=cGtw7RdCy%M4qO@>|;#U zY0ghPHRZfZ7)%rl_Oow;pj5FGaLPT4ovf`gW>AP6hYSq$h8{HiJF;K!6^U^kb_RpM z$4`pXzAqUgh__DTFpyf2owjla|0i5JC39}Abkk-H%*Yp7n1T?2Vf9V!pfvM3MO#_u zLmhU1U93LUGSwnRErj|^>6y;)rjp8jvx1VnTuE)HoF=9-23$?7*n>+L`bswoGwmCQ zU!>oR0E*fcoO}g@3gH?eECDIKsZP~8V@{N0lxd;i69=?0CudZ-_Fm#GP*QlmfVAB= zlOcN{rcnztXW7HPj_U^u__LkGiMK1$BeTkW#~&WPZB3^mt_a`+5D5nwM6J)PF2SIm z?le!d?5qQ_-3;;>UPznBWzsgU87bT)xP#}djK$YXIl2`Dyo&`!9^5lux;yOT}{VesQxR0V@}E6hh5J}FH6=%4|4?ShL{U%4g8?7i>SzvT2+#P~NhIlhG!X1alL;~@y--s_J@u)|Oy zbSp2@xQas%(CGx$oAnPR(;}z=+q3M>ia_A|0*9^|gnM27Hqmv>$PudAU_L3;Y5%y9qYcJ zK<%=d(!qh5Srn%H+^NpNIbSSCT*~6xb(BQDZ%H(I;a59`kLjO>@0`YWHn*-oMZ|<- z01&%u@f&-4>cYz`5xN6*{xamuoRK3qDpko>;_|>3G)Ni9;`YFA!h*Mb%KVxL=diib zagd^Aw)$EcvRu&?{?`Mm)&}yF3RlwE_TA0fmtz?Jvvh;UwrPSKm2iyyHrvg-)S-~ zm%;vZm=}8UEqLD)!BzpRk(wv*_u8@a31~@6&fH-ZKfvCc>2?jW}QUhpCIx zQ`KmGETj-qboF`QyoLtZdwDYaQTw^vB=~`HVlua}KtLvyvBAI2`^rt2@%GUg2sh*H!rT-&L zskkC5e=np259sZ)oI~B-OC;UjoFN`WC-xdG z?vh8i!F%BNMA$b<;4}yv=otnCblo`uIWsYX1D99NseV0CN0btNM;U`$(=cQ_8_UNa z_`=_s6V+nQPJVln+zSkaHYn~S`r3mi`L8aPj4AhAF33#n>P9%+B&MSvtIR!M6zlpF z<~lgY#%F83nDTEeODVsc?yO{-d*a&7H7E_4QbQ*&eU@bqW|h0fwvmCA$vLskAtj)f znjH;!Y%qvHC|EL3dpAnwb*yD#9B3@_S6s;)gy_6c=foXKzl}1k=@XRJMdh|t9wn|m zei$Aj_MNcV0L3Mfpw?8bgt&(JRhv?DGLL`a$#O2t6m4Ox{Ux)uV5kMoeAtUdV^NL_ z#tQ*96!?jn0Qj_+QakbNytFAg%^g2ThM0&&&U}9~EP2|s!9j~+f?l*?Rqd65vjuu* z@au=v`dU071vB`wPVhhqK@@%s(s)UFX$f?Qr$ei+wrX8GKyF;x7U`iQr5roeNPvaWI0!GHp?L%_j+m^w4 zbtnBJ2S1FPG15fPG)aHXm_6Y4mXP@`*+ObtOu=}NFt)ea;z^sWuv5f@O#%&nECmt@ z4B*OxHbwVHM^V-STapOBRUo^Xkz>)R8@!sgNkx) zT6h9u3hl{R_pDecY2kYdeB%dJr*+vy6m%t-M*8!;GGjBeK2=3BzGfVfCEB6J36ZYO zJ@WujY`l#9ID`#Byi?KMrLh%815VyY`dtF*D{Hi>au-ZGE9%OoUB6>5n`%MiU3rSL zw1!)Onc4)dXdMIMi+?DezMLGAERU~Rm~P{*7gx=zB4XD|z_~{y)jZN>HPEF&vx$X1 zk$030#O)rhO|*ISP#StRZ!>t$6U(6C-^;hy{<6`QbmJkHPhy=DVLlZ z`&d>6rTH+Kp66b`7%{POIS>BMJ@3fwHwA2ikeyg#T@8rF!VtjJ`n*gv;AA*XM-D!3 z7!*p;##ITsEGVYsfXY6lBZtg95dy2Vn#ReF_0GA%Y~d_h;EEZ9#Cf7~g=0REk)AOMI(I12TaEOnQ1v&NAUsMhpGJ`zadu86#z;7ZH_h$+scnh) z=0=UV9Q0GUklK!;aR}}PvLoyqB8P@&x#Sv%-}TLgMG;qzn_XW2vlWzRSmQ;!G|v%(>IFb zy4?a@(w%$b1~zW45Vncd^Uj=r3LZ=G1_J~>0_!>YT<3TQHGI2D>G;fzCW~)FgJDKX zy#He1APtfvWS6*S&?Te)rl3LB{FaW?%NG@X5$}S~OcQk|Q~=A*v_{ z;T~giwjxy5falLvHOWloQAV5^*pe_ai~stoR?c?w6e<|e`;yA^EqylgI#n_)Fmh4> zh@*w==pE>@O7qbnY#7d2^~Vy`^L~POrBVwcF23h%mr5;#9m3k5r#ba=7hYLGITwzf z0vXOtBT{quXs=k(v0jxW=(Tuce~ooQ^nN%cwA1|aqF#g7{WdMx#>G^G)b8}N65o+I3`Ae-u}($@GJ6Byto-|G-L!XNPh6bVV_Qo z)DA)`6eo?jXu$qjgk4{Ub4&g8PzmuaKg0w z!SxavL} z$pVV!xjSTq$nE;G-5miVJNfx4!INqrxWmb9>lLxT$|PDJuGPiBD4K?|0UD01)6MPh zqKpqc_A>S;V?A@Rf3QYysOFp!sn6>sU1nMQ=p3TbL*vu-1Iq>h3MN{lRQz&E{h?rT zu~H32IMUCVzAd--^1nTpK)p?E=|sQ~q6PJ|qrQdUZ*HPd;CbwRKA-E(n#s0)DdY$L zO6T-}TFbFG#&nWV74GsB0nhQ}94A9o)Cpk?(DVLwk3R>Uftdtk$HkWN%XS|;r8^KK zep6ftEf$}OqS2T7&Z^@Zvrr2kS-&=ZoScqWj@?{m3~t@awB01}dBxo)c$!%Skuj>e z5^&%gC5LN`wSuecK+sG#wS z-Lbj)@zR1U^L~m)J2yMDr2zI5WZ(Fy5pJ-z-DQ=8Mc#06J&JFgdv=CRX~siz?`wX| zQiH=Y3B>WZdpvC_vsK@p&_b|&{U2u+no$>d-UWSFkc6HbBjaUuj#z*&!})0s#({`v zou%Eh1REVND`KNU)6mgIBYll@Zngerz$hV-2~7nSXHx~Y^6xODz9xYCA%*ITN|Cm> z>ntj^S=(T1VmQsh5z%>A;*EUPKQOF}-hgU_?iO|J^HBp2wfbE169hz#CeNa?bPO9Yu!Cc<-?_MR;(eI`7cy$(C*P#|vHYrSJ z{6d_Zrt#e^)W5BT^8tDxF3)S|stdbhWl^9TWptu$(J|Uh{DSI!Dy^B1#lvWy8&xo^ zj}0#t9z=X*3G$8Kp7+YLSk|~MjRp?CiC}N=5M})XnQ&&QjQ7VQ%X9IKWb>xM0}K%P z-cpmbbR+u7jZ)g00LGPIdKl~$6wPS^JJGYNU|8>PDsel#fHo2alb!G$&2)0n)KbqeCb^cax$NvmB)G`? z1XQ+#4pn2#Tb5fuT+v}35&XtSiBb^{&kY~7|Hzo`_HpMpvL#AsGrKF%?9!O;R_?y1 z!^bgWI^`QI0EC5IfBQK*eXU>&>(EhJ^C}_Cwx;}>9_W_{fu&B9v#agNCeUB2o4V}P z9;f)RM_7LpUy%gUJ?Yu3k3*_+Qw6H65Hx>cJbx@cL9H&fkU~p=3QatxbWOW(*JoW7 zo_PPP)y3+evsCXgfJL5Y2W_uBuj5N#!f0X<0>Um;-#X)WiIO&<8 z&ezu^UO4y}C3{^VOWY7x=d@de`>zI#+q1X;))WhGuyLp}!dNy3{fibu2u}JnT&z&v z20}pzrRk^7#(=j5>qB9z%X?s1nF(Pxv})3q7LC1_taM#+wJf^XW)ox=mNfWP%uZ1j z-!fB`X1=Bg%k@W#W`R`g5L(jn!9V?8t)xh>V{eCUCeY^BWbI6fa8@bC5R51fJ#IC= zhVx*1wNY(aVEkwAOC{Fn+e`#?BY=i_|zVI!Yj0#AE$f?bADK>D6X!B;0V7$W~E z*OICGNoqRT!O`p0Nnh2ixoAqby+eGM@3(RinVP`HzooZJKm#Qpgr=gQ`j5FegHvJl z{-76f#2q%Gz6B84Or`XtXtx*>{PG9XBj=XZ`ba=ab*e3_-kY z)mU&92b|qG_H(a~-;5d{fHVf^apmnH_&~etw^|OYm809?{&G;w4$@0yPGzjomQzn3 z=+0W?2@On)Q8J%$WS2RfEYrkeGGPidumO5wG?p^}q+)I_SZoek9v&NE=C6aJ&s~v^ zrbkne)TEJiQ-H4#aVk%N>P)9VH8^{ zJOtzW!m1Yy8H~Kn@tyA}er(stpRVrzB@V|F8|Tj%g;;+j1xse|!d*!Ln1DeSy2mDB zZj$6wZ^C(d;jcgA&p!Qaz;ND%D;etr>PMS79K5H1Q*x5&!ZL>yF;510!^rEC-sjS$ z%@nxx4;6RJ9-&i%_=t9p6t2?XmJ~qIpyCFF+KnRD=CX6K^x~`xLcZk^V=iu}o z<_rkyj>Kxm@}Ds+-jNojW2~tPc{#58rnRFLDH{j+@I01Mmr`kpDlp=eE@%PCK#^c4 zR6SGTn)!eyVMr*C7OMWPO0I)!G15$|x#N7@}cKNZjjU_hNXUoRF#u=|yB>3hlI~ z_aIm0QtOKs$GXU@rN=<@qBU+S@I@Ov_}*Z=fyQ-i=3M-ywOZEQWvpwtF3Wex_r2)* zj9ifY-!d67{1`DGG4N%L5x-sm)~&91WGhUb97|;HHgm1eI65oaCM`lH{n*d9nx%c~ zK4)*3qkjc}oKR#lSmoOgBS*@bO6M+DVxnP=8xLFFR@;y8JJ0Srs@P$c8uyhjjb$InH4qCE$9 zT6WL$BI?=YvI zkMiZW+;2xoXj*sY;$9FQ>r3uqvlM~9&_8$&Zc=e3BPa(lA-_1VL}M+v(;wQ&H?7FtCL%t|M=(|ywyq7t;g*8ccD=LG9%=pI>&+8V{w_i z$W)%T#nn9*42mz1Z0j|H$V^{>M+#*3SAhx0&+2f7V2ocqLR^{O*t4*C_uEFI8L|rR z<-fkpt_)$@!hoC5f_Bp%J8v}xgj9kCNhvu=%Q^u5JMnmZ%jT-sEU8hNTN)5=A=y&X z7kvA_0~PVA!bJ{8rc)xEB)4glIk7zC0$sk9iG3dqYh}bKV=o!y@SV}=DA?sUbCi>W z0P%|qMp~iaN=gs@yIv|cygn=0m&z_Zm%|mfu`4X}&i)`MFZin^L&SU<%Plnbp4kk^ zss|K4i!BkD)VQP2qvMaAd&qWDMQ(D8X1+iJe|((QLhYkXxXl`suRqqD!!MbS<0^^b_g>IQ~!S7(*>@7!VGTZHJiOV)_PFG>ey6h4~Pj_oAaLDPpd#s zk(BF%xIn&gC8NfXZZ8SyItDXGn#MZ$IB#8tNS4eM;(G zATUw0=*_oHuNHWXsvxN)rgGBrCc@UL8F#eKtF10j1xjhUas;6rs$Vchgoo-e^9yEB zEbAD%rtaw>-e-uJ6gJD-`ACp~p6oZb}&-La^EtcmeSY7|)UxZu?ieR!A zM&k%dL*G>X{cF~|i;BpE&&0#yAn8A)MKv%y@xY|E0BpV4VlhMLSmKV)!h3zfzQ6-o zKnRFoD|oPhV9zh}?CI|Xsz7RZX@Am=a(wJ00`wn80tmyYNef$IMq=P!R_0AMjh^@>jK4Du!tcP33u_&-NacGn{MkunN$+C&l2=mpW z$vUzQ>c56yb}K&2Bh&w~MzVSb z;~C}kxxUsZ>8pUu4J5YWHC)Fj5BNuP{hfpGE9p6KFMFs9RQD#3B@=XQPHB>Q?gM7x z*GXND7WuQjc34Ea)yJvEL@319;An# zz&3*%5K?(TB}k@_)ijN;%ONY;p5mASB*=m|n*@q0+h;mQ^>qxn%N0;oDinUeq!M4x zxNs7Xh*LAqExLh-a5gOExGwE>`q+W^b-5M0+$|CRw%prR0LZ?yk*E7memUs#q|`Qy z_){Qd$9_#F#s0A)d^Tjk2!LrE9K%Dlb>)zLuPkj6%Sf;zSLPeI_Aw}3!U2J$~U*36iG^rL}qT_T6U=na8JQx+kfCMUpU`Oj%TPz z%>X6;VoaTU4XR)aM8x}ngQXSoRLdM zkRiiv@I*WI-!hdguQ^cBXkcp}9{*__(3{ZRJ{&s0GdF!JB)y%1-PzRF^1;r6Gb96o zF!v+P;?&M*je+_DzJjswYsMZ7Z=K)q);!NV~@RnjLZsiCX(-^TEjUt)X z=)gMQf@H|8vxOm5on_K9UY(T_@L{(OtXtpuO+jf@{Nkhu=NqC~>G`${GW~>#-QL^t zqXKv(qXW%665ykrEO>s&)o*S-@L$-6svn zD_RZ%!i9SwFI z3dL&D-iIwy>$Hca?z8X_EAoN+ZJ@|&o5c%{zHDb1@`KkdCZtnPFy2*#V)rMnfT{j< z9k`PL#RZSw+owj|5FDY!Rhk$;dWGA#oggH)f`G3JgbiG##Xr)riPtdesRIhLBw2Q3 zsS?9qa2oWU-wjUuDBj<}W;Izc(`3ntr7_|`8jNAQYhPK;)xRXZ+>{XNHDS=wGx7bK z4ZbhRmA7Nky&{Ql2aSi2*gEXrQ;7ajr~sRCjhAV8uWQJbtZN`cw(3*Z9$P|#OoxZ` zrkc}6e*D#J{Z`LcX|WSm-hZ&Y5w7wFeQ`@215WAH z$s1j&&I=!Qnj0hg<2YahepLT3`sfz5Zk#!pedOPchgNu-@?)i?OM0E5s;ax;C^s#6 z#>vy15WARqXVvbM>*D+5WGV9z(IU=ex# zUaMT+{3YQmB>4zMXj$ooE=6ePOk!12O1_~((Hma>`yC^vf?0L`$@ft%?eA^moA|b$ zb6619kzK;e(aKLfITt(Z!vZ$0VQ-57#IWn}4a^2J*+}HYXz@RJ%ETlaU7`y@JHnAV zt!@^nqVsaU3Qo5?Hk+@wcdLe`OX$f7IjBxg)R2h;))Buuv8_W=s&OcwfGM7Oi}!e$ zuatKwjp-nYNVGueup&Zpp-g=)5&L%WxrItAHTX#z_C~-@+x;zcdGO);T&k*I zzR*+D!AYPK&nRO}r1Qru)wbEpIDNVIIn6(2BbpZgsOY{ksWK0H%hMA9kCEQ zVj9F7WNAziGU`37$$JxGv^_FEGm_3^<(l@3gN(j*{E_@MzL@266}XYvBpp8GhebCK zo$LG_Ewh_FPi@$7V0bA1 ziCRvh_XI?FZb?zpp*5SeM}g8pg`h}26#rT3H2Z9&U;>ZGE^83lj}q4-~PBdYBfTuX*R|E>5~>J z`_q6l7tx;;dL-z4Hv-mX<^9c5GHh+(qLh=KDn8NBdtE=^#>u@N)bC;)#?}3Uh~)&M zD7#iZGTmbs$X)YuI-bD2UqpP{xAFah#TfG&#!5cDUWyP~P{s^LLnt)F&oasiqXGV9 zk>D}gz(ysWcY?08xBR5$`dYn8!l1oNs{oJStoj&VTeCR5Ey8L-MiYUZhZ+zJNZog^qn% zqVAtAijo(eh4cL*#=LASiQMpmO@E*VBj!p^29A4vhJpAneFVx^qd506p0V)8Vp_>n z_;l<@GOgHbsB89&cHLt*1SUPMs3&Q-fbT#*njndwtDk}P!iR2V&t|2Nl~YLx+;sw> zp-y#Y0OpRs->z`o2?0B1`nD-R#*uXY2jWPpHt(VmjJ$T+fR++m#3EvGwV49GsaSxW ztsvX`$Y>iWZ!|6125oB@J$&0L{)abKe@==LhzNKb!Q3>E#!H=dvW&V;Hb&uN&gMgE zG`?lSQqHb_lFn_rw8qylkV}=H^+nB~UStuZ4w2>IKHk7uFq012RA^FG92VSZnG1v) zh|D&AwI?UCkjy_Iy#GWql7w;#-G9dybo|1eqj&sf9|}#O$rBDR-@NB!1AMwhkNxxn zp;b)vM*syjoY(ze1~0Oi(_O)wy6tc$Vm$fnkzw9IZ6W!LolaD;a#{?Xs`C|Y{8O51 z%9&X@vn7`&-T4Y#?efbfbk>BGCmQyZWlK=o%acr_|LYTs`bLYL2vi|YrQyDOPXJb1 z%kNomv2p-&La0`ACvb)SjO;oaPZewid{=!%+u(wJQzN*g)Xy7mIOEqa|! z_A<6Pb~8`U4o%0`q0}Q7O&XKd9$s{T2tUjpV1@pxpTpRK`4Wyc2>a?n9m#R&!=sx+ zd6y7|Ef0we|1wd$zF=Uhd6)6*EML)`cC1R);k>R*h(|l!d0@zy|j$EBN(a?b4xy%C2f2ZH~(uyUKzwFa0Od}I>DCT;XVl+g=SY8 zJ2fA8Kzia-K^UyqdCwvFK%`PZO<8YOn zRXY+dW5F&A!+47>PgANk#Xml1F1z3bu4bsuxV4Osooho^RNz(W30#on!v3LkA3`S! zNM2+c)W$X`7TbMs7#u~Yv3(CVTDkKMG{IvImeV?sjwtC6vWsMxBbw{ zEVr}(XvwJpk!_3b6;m{HK`XoNen?GjMU^LW*1bs1yF4zKRGBG0Vn4FOG--7YLKXMR zl~uwaoPS#1Bc7C}lwU4s$ARLQ61Q;@ZM5*WojX$g^}81=oRW;`(!qS*^md)s7!d%w zU2RCIAfK^DBVf^DihgmYNw3Fo1yRSDm^T^Ea57lq!d%|TTbrdkmuzS1-UA<)yU`Un z+SC;uZ=R540pzZy2LKSwF{#t4xLoEbv+r2Qt(#FQ(c_0cPJ)iYnJdN_6HC!tL#pe# zo}D`B7napaqPtTQ8HSy>{Z}QeNW{wOAk`_DVP`7J&@h@7v9D=*6_HYqTQ{l)umR#gN4RK7P|o(zv4Z)+cR7pomAj0W<62?rd`6`myu0S!u8-@McImXE*&zXCSYW;-<@?|t%g`A)eemvMP?*U#w>)Btj@^xZ9S5W zy8dPL)x$2#b=`eJ+%hP{&_v~p+uw`s?91DhY%97Wnd;ar*0M0POUO+&I14fT$r!xr zu`zi(9a}@aF*UKc+>)Xoc3%RbC5_I)`!zD+zIGJ>z6(#bwyj(t>kA>mlb%pVe*_O; zZ9|MvaCU!-uwT+*)G?w(s$$V{R^YK=?CG2Fzn-aB@l(_kMDoOah4wvHl_DggOwm|b z{(_V#&*@gNAs*AJe}HOJsMV1VT#y2bCDjCG*EfZy&`N5E7@NB2!M0qih;t!hM+|)O zFPsA~eEK|osk0a$b12r9C>P?Y*&Uj{3nVG;@hCy!h;A^y9Dm2Wg?!GGywJ<*=Pb>K znipuATDwlT-zU77d5xDBktPqY8NQ5QSw*pVIR1n01o-T!7t)aNo z3F}RS*Nefsycadc%OkkU#B8A^bKw8*cX-D`Uu$P$GUV)(IZ}P!9D_{r?bQVN4L+dF z+eFF_vQK0gH41dC&KC!?LK$@POck53$fJRo@FV22t#n@4y0yyT_=SOs5zLN)nX$T( zTqJD#mW*)M?DUH3VY(t?5{(M?hPI_tz{-xS0)u(iGv_-Q-E>?_KP~4YYriG5mq2E| zC1o%j@@E!adg!*_wygZvIlEZe?aB8{jD!2KqU#`1h`+&lf4LngUBSv+M0jb40+eOP-{>x|q@Zv@5X%li2!rPalGw@%uU z3A5r$x0Fp$_6Fvi*j=%<6_j+V;#=k=+9YDeb3Lw+fR6%2}R=v?A+8KDZwFXmxuVlCk4a>p8rJC8Wt=1gMF$`s4; zBe9t`^nBSx&g4ePc}4t$=gmL?ognPxazUx9sk^hFr3TUTB+BIIB+4`&dO77t{27hbaT zQX(#dqW^ZdCh-nYvJapV&BEK;G4reFUy)8m{@rEi7sY$wO7Z#$rBbU_DgYFqN7D#Ymc)zvOta22O0+}o z_;wPPaaXNG)|ofWfbM)r^y>Dza=N%ESCA&gUfu-jkGC5a%1L+;38BhIDvi@A>OEIx zT4|7k400F*eGU{Mms&LnBK@5HQzu|SFq>$)vR+;pa33IB^~foZxIj{YQ8UZnQ}Xrr zj@32lTcE*NB9ncqY7@jZBF!00uB^4Ub^lkVp%*8{O!-k5;Ejf?U4wq`WSIO7M})=i zb=A>?qzxjug$E#EQ6A^a#E;Y6uo8I47O@Z*+O|Q|br(`^O@~Sk-_Xl^H2FuxV|&~3 zf{Otd6KzQ;FAS!@#y6m*Uzvp`R5|%^pr^NfVELp?xC(=%1W1O3+aCEsw5VQxxJo`; zn{dkUM=0!wx)(Qt7tX`uNrs3oz^rgG*nl|jPW@Q87Ykrme;Nv6_TYhCC5P%IVdNc8 zRp3g~X_}IkpuQV3(Shli`ur_T(R#!;;G=S~d{0=`&A#%JHrU;l!LC~`TD5<1b<15D z8&#>yIXn`&#myR#ek*4ELJ(|DwwV3#UR+l7d)(u&2Wx3If`%3*r(}u)JclNIACafp z>Kdkp1wQR64OFjHt1zA<4lwihjPU-1{d816K0gbU>Y(bm=utEYLGG6bcmNw>4+q%V zs-j<#ys(F~IyB^Esso;xz=c-0sy%H+7z@<1A`gXuxe7}`!YmtSeSWEAm01DN}$M<}| zy%^ZoxG%A8YW&Pu*PgD`iVHvb5u5*P#Y3r)c#*9FS@0X>9Y)&n9Z@%k5%~(5o9Qh! z7`3UH_bzF4d>6`)T}e05LUfyKK}6u$zhl$4D29AC>pt;q8;J{Pw3fhydT88)Wnnmh zrY*rQ$Fzg>Iyu}0XxIcA*yX3kFTPiLQnuL+%CF7BQXmgV@;)-J;){)xb|~ZbJ`e>G zGUsxZamO|6h|{4Q#-iHpFBtRR8_vd!*~gZTSYb~eyR$}7rDx`d4nBnwgYM3@Px;Yo z*2UgaWC4hzG|TjOd5}B{4AAqx$is^vt;InDk2|5F6_9p7Xg*xbv?p9_nPa` z?k=Cym=t=S=!Dl{fpQo-1Zp@2cWqefhNn)#^lF= zYRs9L;(y?mx9T`0FQ(+{bQpjO2fpiEuM-(2g(|Uma7CnukIdy;!YMD%Xbtdt48s*z zKDg;FwL|gq0)*lN1w~JlO_67g)|#Phi@A&nwbg6BSk}6}QfMrJxEi;B-d_{HXgCx) z9?B2>fh`pFqMkzMVenrg$WCg?JMwdli3U~*Zy55%{KV?svt7aPz_1w-xi)m3A(K0^ zpN}wx3~2DB=GGGZK9}^u>t35OybU~7tI+KtB*}^cZu?c-ggr}q|D^5U8SvlnWXZU{ zI1lzaXD{tBfzJ@7icgYJXe6W;ZV5bEZB8({DsxSPMX*owojd^crIc}eZNPP;dVStm zxsmVtGKl8K)=WM74{&cpuZQ?2QJ1!THxX?TRE`n`qFNHMO308Nv#2M5m3s2Il_7uf zzo=g#D)hQ~v+&BhkUO{UI4EF8ga6RK-2Npv3|}%Q7C&xFcOMNIe4`dx$ozCPNWitI z(06w)h!ZUt!w}wt*x> z4}4ergWBY-tVG4}Bn{-0^#QDil9lGS*o4MCWatTLv1%q11w=A$qtqGlB0QXan)n^v zJo{CXdQ5XK1Ysa<{ygs@2%8m5A!CZ{OXvHg#98XIxSpB&neiy95@drFBj{%(;oh^3 z_*Db151W_poZQs^3rhNn*AUFdC)H65`G6U>4x3q#vt-v8FWo@lGBoFm+*tL>ohyLQ zJx8+ zUEL0&r;YS+ozg_MaOT)w2LAG4JxwU|peuoT?tEbzNWLyha0tjQ_mP&5%3Pu&gp7OQ zcoHNjFLyB2yxCatoQ$X8lGYHr$o|34Xg0JnKS8lwYr1@=%v;;?wS(OcRkLCV{Y@|> z2huGvEg07GLneCG3Wm->fV5jiKulzHz$mWBq)nf7P4CTI?uGq2df^cDru%9TewQ#B z2O&^A1C{hX`1Hh=U3j^EQRM%Ee=h-buy|T+Z4l^RMw`UvndV$04%RX)aap? z;kg2$p1qpjvuL4j1qPn3u>Z9Emqbn9$WGYfZZ7zfEMA7Phsr0R{*k0KrGEyZ>zw9E z$^_X1Yi2vkx#VIOT^iNS@^L-%S&ueZJD8u`~nihsieXFXON>^3(N8mig zN;xOB9@E{2fUi6WKnXTc=(Vz8|3u%Uq-nKFlCZz4nZ;5VriP zlHZMmSl?^|`!bxxB~|}q-zKsE4`{YcA=#x&|MF>KWA0kR!cj*-#HzK_9iG?nSfe*teBvjs*LsLAAEya+xnJsK=L9H}me4QVpf8hlL{6v*XWLgI+B#95OExhgx$D=n7(4nCq-=^Y=j5I{fr*2^`P!8305^-8rm#3eJ@?pC3Qcb_-DV;f%MI1g`Iyb-v>j@O^wx;{@R`{tE-cI@1XNkp zP&dWau&z3{W+h+cRQj!rBaKZV3Xh?(!7BQWI76mU})mmJi_` zwURvaX^@cyx~FQjg^7L(rZc_7B{{xr%dH!Hhbl+mpkFYV;cRo8#O`wX9&{lFWzIG0 ztR6TYRB(X&RjCdd`qz4hEi4mk*t)7j3sMO_=Q7Jno@g=-VeACX{cl#A>E=0`ep{!v z6hcq69@%R@S8bOLv}wUsgWZahDs)Yzuf!Rm&{R_n*g4PvC9e-Veg+m{zh9et2-OmR z91&ZOB5)mr1+S{AaLJE#Tjc=uq(Om|PKU8KlM}d@-grd)Ui6jo@=(Z(mz3)sbie>% z-Q(3oPH7q?_HM8UY|rpiWVAatU9f`cfpl8oZFRlrRa_aB*-7~p|Aa-GkO=vs=pb|? zV0o(~2Yxe@hhAY`($=C58*bOmkF9&WIz&+n3^g`mgO>B#`J%v5vF4zLZL|m=7Qu*N zBz;=-un)_u0VG*~QhkUqv6OXJY>mRgH4psZ)t*K=G0TMnCTpW`GM!Yn`AT;gkG#dl z=^n={0jOBQL%+O1CQXfFx{pm7p0zBOm(KtDVN`;NcFG)aDp;7m(}e|B=jK6P{bzn} z0n1CZs-DOmSE`VBW@NtG`qj;L3J^)Qfm73|Vg9t3Bt*FaXnuXZ>kRGdi)2(NL;jLDjYx;Wr3^)m;&LRJ<$&c9+iX zNoCn2ZoHnZg(V++maQEk{8j#Op^3vNfd7QEt9{;5#8!%D&;o1~Z;_3+Mt-b;{2C|` zBGEAK;+Y8HXF1%{$VX;|h0J0~R@-mHMO=hJIP z^}9Q=H+-X5>9QYi%K4R|A_v7ME-xR;@b*~MKiuqd1}~p{4u*WW4a`CDUZIH1fS{nd z?A9#MNamN|vyz}{A%OhscOIqaWp3Qw0z&En<`s3Xdu|o;<(T(NkiGmUxX!G(!{Z5A zYDf_@mE0rv>PK7CeF^jDdRlv%fB#N{hxP&Fz-3*{5AGqgc2CXOl}+ZA(G$g3F)GZ~ zx&5~?jIQ#cA~p=%nYQ7xFf^yj{>Z%^8p}GgnW8zjuw^dyI6#Rxej+4b2*9&m;6Jft zTizxmEne7HOJf^MZIG&7-h-NTJZBV$>8najmFWA7;Dm(~knG?i-- zvKahg;AXBCz+CXGkQ3`FNz}Zhu9{Z>d>i*8W6-YdmA(`#SAC+=dqtBDj=QqV{N5gu z@*$rv(x^8Fx6Miies;qn%gXc3I$^`1hmD@aN#WoCuODqXJGLF-!ydEk8Qo1JA~19h&+0F z0gnG6@6!4}#jjQIeuO*<>Hhaql$SQoeRsUS8}{QF-5+N92S?j_0By)qR5$kIop;zb zYguu>+(y>%RQC|6;;eB#Qssx*1<_Ch?4&j>mI0c(t6fEr@>Aw?g@qXH*{|%K!RM$~ zk&A=VX^boi{(rA6XUrN<3-@4z3~A$@`@c;STNX)-I7VHeJ_Bju@R5*!y`R((pB@8y zHq2B@kpG{Lp8s^8kVrTRq&f3;a3IokI+Me`jUu&9TWQKa^@mcog^MOi?BJoD{S-!8 zsw+)IIMvG9I5-F4VoW>(+D3|Qe$RZK_2rDX@qQV}3_n5hWba%jfvP}lpfyB{pme}H zJf-Eljw|}@PRTFEUl*=f6Y&AJaA%5w48ocmR_}U^xQ_2G>7A?JexFU$AHg7#O~;sz z{M{}b75vdrfCL*Ec<_cdfCoWxfud)~F|9CYG-W=2Y#CDi7p-_G( zz0sg&3;QqX$eDANQ_R05+K@tmxhT$iy)pgR7K^@Ut@y;P4ldHqh2HH$Jp_pOQ)|RK zF02&ox49$S=&0g!dT()8XC-IDC^*$WLPN#;7fF`?f1vYu5;)p?Rp;bZi~QPp*&(2_ zBDJghk#)9Qz843#=zCxZZ(P^3_5ubCLLJD%IoH$6m=o~{q8+?}FQ8)F~6;j!BY&?YSgh9(?%9oeZS z`b}Js_%dHg-I}6BIf6YH%KQni6OQZl!wb{W57A%|lz|Cv4+Jat#sYR=Uj?KiHpKsz zUcv*dEUpZ7+Aq&E$9to}s|2ioao#-cpo=n)Ch|Joe{6dbuKHD ziK^9lb6X5)Ogpr`&!B}lXK-9hPP=L1D2BL?g*pyR&vf|m@sv7f*6=lArTJ~e30?S7 zqDltO%tXl;%NFx=UgxA!lhOR!2ig4%UAEM9X6meMOiD{g_!FadFdCd5I7ZN;MC^7_ z3@@d$$@^|W7TP9_ogQ;9`e5_|tyBKz7yJnlH}Q~~Fa<+a(AgmA^mHt;7-m0Dju<5C z{DDXh;0q9UDtOm8{Rw8o&@Glsq=VUQ;gh*Sa{v$2e<6WIk9z-ciTP5Z8UYO#<^psG z)$8c!O<`xUqN<0;WCB}gVtO^#@Eg*I2R3`Ibz7}5WAG*FpG@aKowrhP+tHradat3& zv0A0VigC&SJ|{)JGg;g}(|&T{5kuSqy#f>d&BB{`?rTfNB%bL2F(t*HA&jebbTZx#n9N`qtCYc?EH!V8%S;Y>t-Ykh`^f6-C2%5|LJtg7VAk#Bt(J7%R7bA=wx ze1MYL%!qT8B_m6fdT@JEka5ly!N$gdTEei<{@X*wg#=5o2}Dr*WYG0bw%DS5Z^JNQ zFnP8uwv#dCJEr_)C>gBZusC68?JiH_zl zAr@4SAIh|Dn0K>ptLFJ|fF%%zA;Y%Ge$H3=x0Oa_=k>;7vZJ6t4E&JhhiR&8Qgl`1 zh3~p?$KidLeVrOl{Vu=;hjEvgjWg|?>*v_hc&w^;(>>w$*-x?edU^VMSnx39?kHn| zdtc$SMz@l5ZA|Or{-~+b+wO15^M>B|Jes14h#_$YcTpIpm{(9qL$xsOgL)lML}k6a z89U?+E!ETnZ*Ku` zOvuk@4sE&>Jge?cQBLO*hQ9c>p;!Sr*Gv&T(^4V5f-rL7J6`=kn5)MmmySol?{aN$ zr06t+<-6l&;g&&{iLHi&

{1GgO8iWKBg&mCev->6EhgOaH^xjuJscbhGASr?++H z14-Sr$ttFY`TQ`DAv4=yiJoT!6PjB|9GCkZxBbY*uE!Up|LO1aJ`iEUa9SDuD#S|7(PW{ke`MruY-y{Bx?(+Pn$d2O> zwbU}VTFlf%n_mOpPfH+Z#hD`ZPz>Eb8TbV8Wj+Ine{`2MzdF#;N~T;Ptryf{7O^~thN#b zVxes<8pP5Z8rK11c%S3gdA(N~{!KDb8vqnVVWMbKZc|{s2I2s-IS1stZ>5E0CBj|S zd7uc%t7US#E@obv@SEM0`E0$fssb@;0x*tSZqarpYn;a_?D>K#Sj7V@B*GDLga+Ktsh^-p(K(34sQuVDo0QF0Vv*z#1$_iw44{%V8Ly*sEmw z?+zqiK_nMF1@*?j9|~f-=YMdY^Z7X-6jt2eXa0-?Nq(>ZSljf0UA-mQs6tk|M5L&# zYB+@2CA24)&Y4txQ~5D3MKSRh4@1bJfH(z0i5Wt?7SqkZK;Q?|#POsn=4I&L;3vIA z`;8r4$q?m*_0|4GV@|-89#*~NIFg2V2@`vdK(IG50wGnrc*!dOPVp_3&eAvxxK9@l zv<`i+&|f#3fv527zG#CSB&^O=-$nZ}`jTmZwh^T=S6#>{d^(U>0sN$WHTj$C)?J4Q zmb!)x-6U@!mz7sSt}^gQM;>ykP~r~83GeWaAhZ|ufciXFCPiU`_8^`a1aOb15G)~I z?{`KzrQKkvCl5Hl13&(mJ7pfZ3_$ni^){M^B4cSKmAeb^Yf{;FfGDv=-y{oUaF=4=}8?v3iA>}dsk z^Mra}0T;VkphTv;5km8SBrXnvltoJtT#Uijtqds}92YgwcDQ~(IBqPn5F&NRx^o1% zf#*@YpI4nq`bW8AsdPscMy3s-$FoEdOiK<0dX&efnNfIrdv_ zII4ICj9Sns13^=vZfT`gA5_%UtDb%{3M^?RdC@K0yK1=o?|rW=>5?cLBurh-s8<9z z_*>w{ju&mkYMkOwDRAn_i_iU;Gz5!$qOt|@yRUiGg1G|7g@xEQ?`C_-iUY0tYF_!En z@$i35x2rnZRdzTGu_D^d>|dwdtwjyI4kB6Fh33~(ChB~L5ByCDx-5#0e8BD#{b1A3 z?7N}(+6pdfQdFF%q~rcTcLh|I%aVMB3u(fym?i*LNa+;5s2%C9uK8&RH`(3>rYObI zBMMm_=~S|bc`m@fBO}tH+CI8d3foL7)_=IF$DZ7uL28^{`&p#x-mB;!GJadp6ZG=i zQmi>9SKCI|6`#HbW(%X!3FS8eEak$nbO40|nE~_sut_H5SHB2%2NmM**oMiLarPLd z(>wl&$jIE?q}${JRdS5Fy+4%s)c+);o1-Q@Q0I$~9^Sj~fVa|!_~cs_Xk;ysuc>3f zj9_3+joNpwDYt5hq^V18)DFDt5X7UI2JiO1Cdeh(xI@QlsU6Q|kVl_^I=(i)A_VJ` zDZYh%hwbMbdu@N^btd8_Ur#?C%)&Tl{q3R$3pvl^yctypf+#cv02Dh0bh733#884X zr5N0BCAZ82C5R|df~0#dZ8PEKnvnKx2F?^SK>x##7{EG24Wd)fZa((6#Z7>LIP{Ws zbBGrRv%?&+G2VmL7FV0{mpGwlMHN`=yR_I@@T0C5=|Ub{dIH%_%}Dxf_wH`H9%%AYpM?8n~zv!R}l=tlrGGS zt7>OIK7*G1=+Y;~cX~c!9S;V^5ikE^k2bSXJne~W&=M1%C2rghSol^l*Zid!3x-Yx z7}umohKzq=8+IUrpw6xEjDc87PC|5RJ}Om}gtm6L#hVuXN380SVXLxYs_^0C4fj%N zVn#Ueg!O(#xE9Li8dw?;*A^E42`&@z$k0*w1qp7!TiR{&b#87DDw>6G1Kq}jvgE!2 zw^iU2!j3RH$;$AfkZl&3|A|3c5{&~iA$A4Ms-fGnV42t3xCLr;pX+*KOy;&R;}P`p zi!LJah{RHc#8TyMK@TKHh`ceCSN#1VGXp&1!8cfflxY&K4HkgYBv&FicwV+&ViaBm zm`zGjyHZ-qWOdZ=$NjkxE#_>-E66gmJRax`-RpM8I6HZ^rX7Ld=kz(p!yGbd?|XVr zSAZI$R=ao_cr8*2EhJOQ+~24sUKUoj6cS^4J8jIWBYzed9^tYmNdNt(yk(cwg>{d? zDS+IS0XmA*2I94|Db1Vn-*%Gs2P%1z^c=3*DrJ6o9*c8iP?8p(L54uylHH}H#f`7C zuvls77BPJ6@D3(T1)=KV?0FCZXVMB#K4f%_F5w_n7us^MM{xE!#$SCX2Uh6Mmz-%j zLeH79#RcV%T<1J3b=3gpnQ0Y=obcUxyfiTJo=U6-I5}a0adBxEl>%td_(lbsl&@Gf z^NlcnqwAJO8v~-UAA+aE8yz7oiT>{+erF`1O5X>T9qhOAdRKSC5xHxugvXEDOBL%(pE90U73*OnN3>M%`+j2tHg z&D3u|Ntq=)oviqK2jQi9sFh?zz4?rXo&ddJ*sjUT`KnM(yJ^F_tS7pTo>`+loT$8z zZTQ?bbt!#a|2j1Uc#y_Qc^T#YDa}#-!`_}#1%`qR$cgcL9W>((kJyP#CXP7J+L0jk zH()W-{!j46JPbk1D1V<3#p}$y#NBNm)D`*_rr8Qlt-oHtw*axqgxz->jKPN$)=fLT zFE3Jl@XmBI;H1nk)4mnJS+-Iy#6I{GqX5b=V|J{^8!sM;?X0)|HiVNVy0IHWVhz_j zz8X3zbRk&f86wWR@HXf`zZtG_DwZ|5!`6?BPjb3ygesrW4BnDWE1-nzpB9l^wq9Md zxbfJP+NS=W0x`m1KBH>KuYcIJm~+%+3ah5vWCc?RVj?lTJ4=sZ#RLcWCfypO6iquR zs^pr#?Mo~HrX`4p)S#=?6ITHd8ilgYjNg0M2^oJ0 zWlO%xqAQ2tcOON#&4IT7*1APyl)CKi<`$pRA@#6qy71Q*4&fs6I9F)r?ZRUk-1jl2 z5(|e7ZHriiMUVjPaBVQj#`lS(Hv%?B-*l#}- zE$?k>(85jvQy+yVk;XqJI#D@NNCLPR$%^yTC~=z^Rl~o=$FYd$9$P2NLcE&{bpEM~ zxJOtQ;=v=$Dt_>;%YqyTkZ?!7a|ssUvkzI%cWy%L0W-% zX@~gmG9X#+)Di@FT?qttgFrtQ8;*qf5=;=rC3lncR_??fy!B~ws#?xhkDvv|s4!I? zcUBCjz6|KA#gjP#W_10;gv0#7MmT!|^Tp>ZlWc4&+tScr^5VZXR1?8Ub%EuUoX0Qy z%q3FFVv>b|wX9QgAI1t*&Kea#3z3mK>9V!YZxrQr&s08iNfAiAB;xB2C4NMb9Sk+v zc6OIK@|i|np_)@qDDR=L zVkd)XD!X`jR8>0^@LwF;FtksQ`8os+KV_1h*XSZ9NI+8m656aAAI$cm`AgAx750r+$F9)I2$S!U?Spc=4 zR6TBgZ_M;ws}{tKli&yhWpVvzhH4pQHkC;MG>z9(Zt}cpEHtJT50Qy z@B_Y=d{Fj2R0l3F9Z4UW&XVN-pcKITL191!CcEzjRrk~9-UCzeZ<^*<0tGO-6U!C; zqEnK`1L`_56$UCGDyKCJ(T0LBCxS$9$_g=>kQo|-Y_re5J8o(}c_X|vQ;|+5vVyV5 z&mCOKA#k)6IW108Oj3=tY?DtYcuRw9UYDg?q6DS$&|&XAFkfg-YxX2Me>D=-wQb*t zm&`-Q_6E_q!%<2mbN_?*$9aCjeLk5`L`cigQUyAJH6CsMm^b@?aa#{=Dfun*-T*#o zBM5rboXNicQ*nz}Ic0q!|qCf2#Fl_K21DDF!I6xEdVfk1yuwvigZ`~05 z{vEw@znsJt7poD-9RPVT&=Q7WR5;Wm{{6?QQe0n#5c}-)J8yEp>bMv#+Q`%lN2bIe zjQjIhbRzldo&kM!WFmFWJP;f*;;2tC8)lQPCmJ8x9=^|UX!b|xab32mS3fywFre(s z`>r3@Nj>11tE^t>_mBWU?r7$@;G2(g1FRO64qa6yybMp_5Q74F0B>B5sg_3PEkv*U zuoV8DkKQkqx`2$3dJT;|@>0u?K$U`8wVSeJ6sGJl1$(X4K(K)QGPpqIcKlt6*m_pf z;`!miBu09mKRJx&dn<|ak+tI?Lfgv%)HpMhTzN)_vci1vhxxZZeTDZ|-akpamIJ;! zWR~FZQ7DlaF59NB#o2f%c5CQ=?zCpun$P}!I&IUJ3R3(XWEq$btrRVrXbOFHpIj?A z1geYU+sa*WqNjGucbSx_I7)~7_Hn52N7$Q9?XM7BFkJQ(ZXw>#YJSC-B~VFSyc(PR zgn6j32JhoYLR(bz`&TvYp9xr+qh^=0DcB_fCC+jYl+^LWH#9vf0gvYx!yBrste14h z&=QVWFku$Rd~XVV5MetlEylG!Pa9B zVz&H*KfLwIv=?2Qa7yn6^TdLsFyZLO*ru%7L}7?Ml_M7ypUX!4@$b!6`3A)(>@rSK z(*wdXCy@s4qT~|T%k-iA_YISoS;ZP&c@N##BF^&2z**Fc=7p!03y0xJ+=gV(+sA!L zPcgHk4Q^wP6Iy%Mm;0R?&EtdqkTGq8zm=SsCQ}lYm$X5m0KxhyMbc-N5CeWbB)?P0 zA*d#Y4|EZF%GY|PKMo#+F6!2{58qn>Q)q$6FLazZ5{lV2!ql*pw1A&+j^~G!n$o*O z0z3nk%GfwS8O|g5S-ZsRKnXt!a)a*pixTwGARgAzbOUUQiI@&LuVl`}ae&@5rA~@s zVrDVZ0EaBfQ*u+m}I*=*`?>rlh$vwisc6GC&-RazOd^eP)3vJ>-NYEAy3DsOY7!rlTL@ zJu?ER@Nmb8DPT6MYLM9Q&=H5dz^JfC<0WK=NrfdlE_KR9nS8Ap6E%~B2Q?Xj#sm)B zNaQNQo+OzZlVkOeD1lrZ;(DU-zC{=hlKPGGpc<3d7HsML{Z2 z_I>*>Cy6QYsrz;mOk(#00ft>=bIurSauAiy1ZYI;fP(U@$R_p3EdplipEIji%2A({ zTA2d*_<-=g4C8AQ;}5`|<$wA!v3J*BM{3wlBGdN21@_1i6-A%~(MgWyMz_+hviOe4 zKUp8l!CD&dm%|8x2C!2e5yHPHH)v220KJ1JU#f+)aM7^)&n{`e#D38fACT`tOZw>S z5R1P8)h8K!w;h_Yt;%Gjro%ckC@h|F2giwe!xwML1vqS;Tu$(5F7WK-5ZmyL6h6Lr zG3eMs(AF4O(@3-YZA{7-HyPdvtsx@`^e%r&L~}t#H+S^bz^5^U@+BN<+aq#glocTz zGl8;1pqUHsT$%2F{c~BMPdw)dI{--lm1iG3uo((ChBajUcOpw&##y3zLt4T5PL&OraaqN&SG8EG#P2*wWLQw?iuxu7G z&Yfo$@KULQ%?N=>7<%9z4AxM6`dl6-x3$^>MegRboHF2!rm4@`O+6cegUWxXbL}H= zm&({UKok7LuP*X7IM7PTU{$PP4EA7NHLuu)_4H3kBXin_M(JTk4N+J;gmDzt$ z&WjdG{Gk(LX|X%gai*{&Qc+L*Rq%-n<&+grqGXSoIuVZO9#j2ku46h2!maJKl|C|o z>=zBcaeSYstftM}3NwSe>c~g;Dc*Ar{_=FJ?Fxm@|M9dcr#XoAy@pJucisA`1GFnO zPT~UE-i`2K66-4V)AM<2(Y{USGjz>(x&0x`b z;63%t-iq|Y+oTf;Jrm!eJY3(p8RnFYd;%QZ-fhAcH-8e}^Kq#bV+|4Md=~5*KOpln^`u5iR*nW;Eq{9X5&z9K^V>7_e8IeEL_MnsB zQ|^6Pb3ZF0Yvh~zO>vK6QD>7EaeC$;E_YtQPY7;(mT%Q`sHcHKknd6{<33=haBv*g zbXq4RwX`G5gENNJ2?w8#<(8??qj$o00Bu3fZ+PwTWb;LqJ`@`}i$+lC`HQ@GUdnJ@ zb+h7uyw}ICrVI;ZWGR}`@_xq9j03AZqDd$^Z-i?_NLjmhUq-$gWWjDP$4@Q>cWU$! zwwJ-rgpBg9ZgMMB)f-#5XwOH+;fO4iEA?LL3dkpu%EyBdlwuooCkRW6s6V82D1nl#og@15#C|X6hHtr>3qME>-~SW z`%4m?^v#Uii1X? zfMHRaMGOfKDr2(1QJfW{_bBa)L-*dg&o5;4J1}NCYLYN8u%X+&T-pXC06D@CnmC)| z@9w&FoU)clb~`(1M)4EK@M{h2)MmD6%pOnbWHs`OX^XGsM;cw4VeGlYj_UD9nN))Y z%W;Y|FZt~?AcUHcwGjq2!-$^*OqK!-f6Ne2>J0UD;hs0dVK%P~zRSkYh5DJPaOJ6- zowucRz^#)=2y!DuT}yxME{i17{j+vKTa*D-5a2bf_T}r1^cEDmu0X-~-@Bs4+;;%J z*?aAFa5?>#t~W;vT(S#~UC+B6<}4!Tvy%`*1@r&XD6aO<&L;W;qL8!>X`c$C9cp)$ zc?8o~NM2pKAOCsgz>ml2ON|0da25;QW&P8tJ}S@*e1p{z8J&u396fDD&Kywo;SR9F?V7cVSGvI;EQxsdJ+L!p14T_bd0z z1%^9d!c^8^ZWa?iwfeXU`yHqPTsz-d706t(`a9mLJImZYw6E}n!b~)Q#qdqo zr{0G{vph7}C@;hbhOd;Vj;ZT%5IKtt${1D28_)y89B{eYV9Fj;0Q9h*XD)(n%94Z+ zc}hbM0*Q$N@T^>mXbK10RI0wHT8oTO zYAQiwF_>eB5oypZE zUh8Ok3R9@b5wcV}8+fHKAm#esD6yJ*PTck*Fw(%mJ}}f

$Oci%Le!CgqVB{{8V9 z%~yXCvg$ZGe~PO`j8SQu;^hOCfm_tSKLMLow$z@|lfb=XABtz#(pI?-3ui#|ZJ)I_ zdk{X4oS{e_9Vr+X2ZZ8}#^H+S8NyxYl~hH<@$Kx1EIJL7$SPR6PdTYkn_ql$$lL}(3ZIkF z>+zk2WW}pcLKuliT{d5UNQ6Y3A_uJfyXtFhvq{1c0r>&yJ|#a<5$2nZf14+!Gr-FM z6%3jf_O|{ZJdQ#Xe&(oBAMiGGd0;Quo*3=^xM5OtKYJ|j*WG-UFL8}-O6T^im*L(t zutueeK!spK0xfyc4P2pBfW93R`!oPFu>M>zleCWHix@2R!c+*FkY64`ud@-t#YoT< z?Z&L_NhL0{mGm<|Z^mn623PZEwJnaHT)#kfTYGCmf%y+VV>K7v>lp(FygLP3HRV8^ zO>n6&=&-sbu1d?>U0=O|hV~?{9_W!!UR^vgUJ_{e)PQ?L(dM9LPy<&8lkttuUYfLI z^{x{_&ICL;wOqQdV1ysjD~pq(#av*O&v;FL0_e zEmijb^Tgc~)Khk@(2?Ho z)1=l%u4I~B0o%<6)mKeDztlsTRRd=1UkPxWvvNRk4B*1vafWNvl zObcrRI={IZ>-a$9jJ;e=?C^F!srwEN5jar=BnP6dHzD!4U%O)uk!x)X*9w||V503O zlZIt?7>_J)^w07dzls3t3x1Et-};1zs?WJMiI`UeGE8K*3mI#^^Rq;g?ZR#+Mq_@<>iU;kpJgODgT?5hZyrOKJX zfNEN`Q+v7ujUm%$Y`p83??=#?LU@3w`!owdtni4ob{RtzzN+9EekP2Fwt&ysE z6h@LDNdShINRKs9Zq}br=c<);1awT>U4JcHr z!01eTwm`94XBFg#p(3L^ey|^%nwPyoZRfom!TTlr(Tmy1PDN5zK(LWOPQUcgZJnUF z2e=3~u4_FLlShybKVdPd0;ut~S8O?&L^Xvi$qpa+dinXN5G@)MQBCgB)iSTAevhwQ z&e+T3#Ml(%L@gdh)3xxsZKX^pm7-;8-=k`CLol#OWdN=+=~<2*}3j9GGbuL)?j zn9oQ_v68BpFcWsBO|aYZLxMHhrx&81Yhx*nq1%@1>#^dR2ST}2tEyPwlUvgmes&zPIU)x6ozK=8ez1n^^`zhiBGrKYL7M&m literal 29533 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

oZh=b7dY>`*AAUyCNMQ@STEmj#~X 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

67H_ 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 tiFo>76qfL(g)+<2L{R diff --git a/apps/docs/public/images/n8n/node-message-create.avif b/apps/docs/public/images/n8n/node-message-create.avif index 34a25f6889d79e41befd4c0a6e718be36ef972e0..ae09b5a044340527876b65e825298d4d1614d2c1 100644 GIT binary patch literal 34205 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 aKh-$JZW}=`u;x622gSj6-0P_M!+O|87T|6G literal 38071 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Ǿr~jJv+dd4whg_{eE|jI= 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 H)@H##w81Y* diff --git a/apps/docs/public/images/n8n/operation-dropdown.avif b/apps/docs/public/images/n8n/operation-dropdown.avif index 95aa6bb6bf616ed207305524004d29f3377bcd3f..e7b2786cb6c2d2ce85e578fc8d4d1b0f06ccd6fc 100644 GIT binary patch literal 28564 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 b7=CsfvN<9K`JK`Tz0%hj8|m&Nly7 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 diff --git a/apps/docs/public/images/n8n/resource-dropdown.avif b/apps/docs/public/images/n8n/resource-dropdown.avif index 93479aeaff812b899ef0c9f5fa74e4952d9c3fb0..4d4082f34ebf034a340125d1553ba02dc66e02c5 100644 GIT binary patch literal 29746 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%0AH$_Z^LW#Lnlqvihu&@C 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 ZJcGlB!UT^eQjvVPr*2v+087#>FDx)IvSI)L diff --git a/apps/docs/public/images/n8n/return-all.avif b/apps/docs/public/images/n8n/return-all.avif index 8d397251bd3d45864a76d746b6779a44a11baafb..16668a0689b4aceeae797ebad7716c73b9d7dce6 100644 GIT binary patch literal 27355 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 MhVAvF;07YqfbL%#Pyhe` literal 24294 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 tiFo>76qfL(g)+<2L{R diff --git a/apps/docs/public/images/n8n/searchable-dropdown.avif b/apps/docs/public/images/n8n/searchable-dropdown.avif index 56d9343b0e9ec83185776756934a8c4e5a66b77b..5519fe03ddf2511d5cd77194fcaee8ea4da9eb3f 100644 GIT binary patch literal 27841 zcmaHSQ;;Z3tmfF(8Cz#;+qP}nwr$(CZQHhOW6yuL?&EH{I{1?6e z(|0j90r*G%No#WxdTVoi6KQ^W{(sP=wXu`_f4+Z2U}j|H@PAbR06TL-r~lReSHjtu zJ6Zpa0r-#Onp@c#{$~jR00915|8W37WB>rmntwXExw*~%B>f)`=0C$2=)d59G5Ria z^n$ilw*QmM!racm?jJ5`Zf9uwPokJR+8O^B2mk>8Z$td&L$EVMZrInHnsd8Aftf+Z z4E167-y>$fO*S=|-X!xf6QvJ82*&m^x$0}l3Afr;vFU$qIJ<_)sG!u?wS0Cpbymk%W$a)Cu z3N!T>4)ATDXD2=!s4fs&=Rp4StGx991w(gwq2sPz5#D3wGZB2`WAHl2&tAGQ9&Y&z}u84b2-S2yl4dY02arJ%kjo{7cH+h{XX%% zog2!Ts;m2&8e!OWYiRSYH*OwcKata^bB7xsX_!R0{Bp6SXjaMki$Rvg%RDIEf53zR zm=-!sbGGc|2Ceb%jGh}WFtknO1>quv4$ko1~=-wV#^CIgnUa2)~`6)D+-N=CgnzF^Sy*N-|y zg(@duT*?q%Z}3sYIQ;6PiD|}rUnnRy3E$kTyn^jfUPcaSC%?FSpho8mL)KKY#;OI3 zyUcMOUZSX7)ETuP_^oC@xTC9PiZY7Spj=zpJC$0fP*Qq@{lYv7m~UO(syv>%N?256 zi}ISFInzR7kR2&+0;Ic-u|m6Bg?~p5$LAQ_`pQLSa-N;RxRy;pOC2HOW$~R&N$$^0 zc~e2Nm~rIso9RMY=4`7kkn%MM@F8|v&32f}5P?05GQr6qEZzJ5JLidzZ?0f#jV|R? zQ%I?XBR~0u6w+#Rki_)oX~Q5YMRPNB+OV#<7kh~N)v?t%3ngV&iO+H$64(VXM!g5z3-;d-& zm?>{){85nvi0cK@pOJ;9p<2Bg6xuuH`??K(w5)jOXWWF>~fM)ys2MLmZzLZb8!Q#L@RM6 zENA84LXo6+RT!xgK1Eqd3Am9_FX1S;SFHRVCmhSihwVBR`DZH z!QbDyq^b3fP+wG07A2|PIGrG46}1)}pfP6fcTW*Pn`Dn1G>Z)=*_tRB`EI8mJ*97y z1R{kzC_O(r(pmug{7j(=c)^4(O3y=mQbr^M_j!xyvkgks1aujh7e5y!A>_74YA5F* z9#!ZGgW|5#cv1J%U|?WaNlaEz528g8kN_UP6VST7Nblevs{|Sfpyj>bVO{WPFREd_ z?%+jN1oE`#FQ=Bk*c2}Xo~l|74SY=7C_u{Twl}T7+Uvj(UCq zYwe#_oD1IQwQrz#P;?8O%;MY=mPFiKIPFV1qW)m^oT(cvZ!Yc(ieMXpsjys=%*G$Q z1;MgVMge=C$AH{VAF+(gpZ%-X{g3Pp~&kA+iBn+skZD;2IdSdflut}kJ?nWJWxxp3&}ZAA8N zpiM;1T>JJewQ#&8Awy#zFMVrt6^!-1nl7WnXR{-;$e)}2gN5e#MZ9XPB&*q#nULv) zO_&$gGkz0czcXe@4N9wml1dLv2a{HaT3xMFWgSr=3PW1tOpZX6Ah!=4Z>8OiyY#Ja z)X3!Lkpl<&P6G#qaL3{e5TKoB3x>KZNn7xchu}wSu!?02-1zrXZ=|RR;Wp|UH{E*| z)5_F-W)%o%@`{?scGoPpBdcu=EYH|3J1Bmxz~4rK=Tq^geY@SS*2X zz#5qiCt*$;95JZ=FdK(D^V=|GqbmXv4hMtXiWmcDbuVsJc(g)KG zp3UR06$QOq!-gL~43XDpXlxvB1!z{62gMc>FEz3&P(k}M7vGy`x6>G%IQiG?)<0ze z-L}nVQFO7*c6}2!@$qO};+ia;jb~v$Id+e_Rzg@)gdllkocVLGkbEi)PkA>3gP zH*hq3kT=Fe7BE+eZi#*-FvJDEu;3oI56JBAb(7?UnW97+*)=_j9I-I>?HpZ z1zH|j4Qu7BxiRKqWfDhI3O3UYd^a#v9_J#yT$8XHoYclPA}k-hM#d7+Qi33{w(g3& z#TPtGd3+?jmyT3?KH_QjG>GiKs*!>TfSMYd)5$*pD+(|g^C?RGH2=mjvm2L(;#CbvZQ zY5B*&gzFn{MDW^78k{CLM9@vJa$B_eahR39{m8&9pO^Dy>kc6+=OlaR;g_qbQFq$& zX0-HLSdPQMJ8VQfg%0CM{&!d$Db=Gw);D*~f2b)`9Dr`fZ1`bhK$J5b#^(ptyAdKqw_SqiTTl z>P*iR5#BmugZTy;3oOv&K%^reR5uZ|B_jLh@SCUi;)V9OR65nUFbQ&O2J)zS>1H8y zE3 zEHJn`PnMlOVkbnG{9IREf2yReIK51ck^*dI`C~|9HU6?e0UiDc^hkyx$4Dp@C7OTj zkq$Pb_^d5Kh8}${MRP<`Zuh0%aXGQ=yDR3)W=&z`bJ1yin2sp^%x{mlzp`$B2BGZ#y+Cx zSSjmKFbjfMhk~7RLko;LoSe7Rn>f^G=16754wzJCLL8al)$-(VhX85tyLE^n0(&H8T-j;d#Q_>L#PQ@3)8S%mdUfOEY@BNJ@`&j<^M z>m8b9`l=XD-u0hF%_clJTTGwWQe!t5JpyXUE!+;2ewzS%3Z8WMfFYb6FwwTt~d;Z8(P~%3%_Vpo1aN$U1#y28K#xOcy{4U7wm%vOt zXth@W?Zev^ww`5ak_LewT@X)H0qwhQGf8{zptqp4+J-<#Wp%=p4C~*<95ODfBN=Iw zrh_C}?mK=X#Dt2aT=-kJ+(X-+WUzGtRwDH^RUj&J0{|1Nvr-lRS@_%`P$&g! z7e%bn!06_E3cKX?Y*MoX2+Wo$Do0!9Tc>i<`O_@^OGXf4r}2(uwz&kh4_`M>x8YIa zOBjU(qHfU6C#M|foWTe$Rg%L3m7gU1ut?oJDg`dYnOWs%L!oG%RM)r1)oG(;hnHLIoOFR@m!z@VKk~fer|so6W-HcMIWui7h#Igx8Amo` zPUFuAPxAJ-@=puo6%o(8mh@<*`X_1btcxaieH7Gzpvqe-s-O+=-n?-bK9R&%ZRUR@ z+_=`SVPj_tU>m7DZq4v1;4u}h(LvzDF`uH&w2uZ+!?r3Fk4{~wGI`h4>83Ts`p)O~ zQz40icZj+NoYVWR^XqlYZfHn6eNf>i5JahPg%5$Z$(oi%%80EcaHq2J=A^zHO?9ec ztXNL33kFt3M0e0XBna#!&1~J*LZu)jZIg3#M*O)?1?T!3QK%|T@8s3$BMSo&?$9@8 z%0qPYxqod`5>2Haq{S$KEeJ9)`K~@|WNkK1pn?#+E+|Z1(`GWRQY2CXA|~X4*qT`m z-+(?UH6H9khv1x4zAaEa?#79hD>Tt#Om` zBQ%x{cZ(z(>QtBlUy6qJR++~|?uL>>I?O)K>(qJNZc>x1olS&EY;J)Jq!xDM-cGhY zI}%N{SrWVft#Tn4L!*Hk@%|KeeR^mp3VeYhhE(hvv}tQDg3K+-M~}29faxA9`@6o7|*g|NA zV5c$`_S;s*LZeAp++bpeSNr^HVuc$<+roocG3*GZrRBrMHxgnruB|Tlndrki-tUmjT)a!YjCcPwfcm`47uKr>3j%kem1rsG)B6cyUcAr17P@xJV z6yfVc+nQ5!VNvgauhy!%c+77A(TsZ1Ue}EOJ3HRM|1^3xm&bW)#b8sn82pWQseN)! zsp(J@Z8AZx0(WtOfa~ylhMg`W;)t*c=y7+m%a{F!j*%E-+u7#tr_COCa#sL)+=iGU zS_~cqd4mt-t!4WcMu8?CvR+Nx7#R(bEUTIJDBPN-NtpFz zZ$r2WZfh&$wJ?79rnQc(XyQ<9;gsT_GsS%r$uGymGmnQ!nIr`I}4NHFHHqd zP7t^>vt|%^t`8*4jNeng~#Zd38x z0W33D)vkDe{fh$0c*w&3stCd-z*hXRHdPhM9w;g-2gOpnKn_nv{U=CBo|Ai3?pgLP zM-&kQ-kifHHeM!Qn~_HxPcudVl)MkbeqT1!SC1m<$k$?8oEnpk%V0AqizJ2hI?KSwF2Hr^gj^<+*K=k_gbX(jUSukx}Xmy!@&@3eD;Fg@Y*XYZWlf_jOMu zZbUprakBNF?zf8580Oec^?Ekn@gOhoU?shM=`cpg^tXpYi!-tHB(uhWeRL4Ho)Y8L zG(*~n^%Cl8fBNMhS{STm6pbl;TanYtAXu&*_9$;OR<_z&B>T)wyyxaJabSSdP)O^;lt6QbUTmm;bb2oX|JHwA~p!9Zpu8C_os!wBhHe@ z+Wr*6qwYmM6glAUR8i25Ynh%KfY##r6CLpGO*FDml#)-;#yJ)(IjpRQ#5l-%_!Kq; z_LZYen--fuoKd0f;e1Ai36kOWPxbFL?4%60dpNUfS>h$s8C?}K9(>BwSQ1raw{NAHz)lX?`anafF)0ova0Mz$N#)kHFnymK1}jq z4Ksf$ydVjrdC;<09R*kAr0`c+B4~U^dwiRJfLfk!B88Ly6&QO=>X>xmtj)N{Kl1!q zsfpG>XR6$$0}DS=$(0B@O+PbE>Z6z}L3Kb3l%mneODneOmw~9lTL;O*y2i%1PK~nc zp`4#$-o@gz_CIg1b!MN9B;~>C5$D>n_MA*_?p7E3Wet0#r9%mz^Iq8HrzqfU8kS_% zAS^*}fxW4QpkKVX0hE$_kGWI1oU9H_MsOdmN$HS}ecqDd$M~?rU# z=+)gC6z+liWF;Cx7sWA`KWqgC@tFYb&-5TP8mgNPd@J?c)^SGzi-BD0bI>wEovp2j zKeO@COZ2!v7P}%a&uX;@^<54awPkVwtSS^-V_{RKhcayp_!TY$;~)2_J6oc@_J@EH zNYPH6jskBE)P=xUm36~1GZMhAYgVT%t~YfuSn4?EXqtDi%*4ygFRJq?o1UO7yk?{* zPJd1jlDkE6}4%GeqgVy}>oA{hQXaKBOi9Lk05 z(L%LuhVh%ZD-mC#Z8a9q2?suWb(^F_VcOI!Wf3HE57gWZ({$5BsMAq4sac?_YIQy> zEMR0wc*`&XrIQYOkA2tA^`jk0(*^=c#X>&00G{&V0J{h!hx9p%gs+OPH$eVXsv%YL zmC$gsg`?H2mAb55b=DAfeS>&6+iT$&!}p~ERp@CI5mltEmmaJM@e^=%L zcSt}&w4&Lh1FQ7WM5zWYgE2#ZzBSM*y^*XwAO&Mv{z6me($MHIBVR2XZO*b>6fK&f z`I9Bcl1lY}7E)Z?3QD8Pi~-lYFZWdz2YViaq;Wi@8yi*G57XvK=R~N;+<<@>_^|LU zVLlxHsu!>F>xK1+^oAy|m~>ren`GUi6*uzS;1))x7b+_TWZ_fH^Ue@`w~!gLv9ZA` zK4Y<<79Pd*Ku#=J`E1Iv$}Lh_G|Hfd2RYA0crxoG(>@!GoCNgqw_$)T8qY4ImIKfv zv7gY*UymWVNgb~zBFa`mV^tF>E2muU3$sF_uQK-Ezc;1GF6mp{bfl?>Y5L;8fhEu; zhv7|wHp`WK9NTI}6cqMkIAb7E9+1UVb7T_+KxIvxz6japu6jaaTWM_SYzqh7Pe{>c zDwdhhz;xj9LNfbpT0x8}x*JNR!rx7}B&|);t{+2ZH4td=*}lrnMpjtRP~P{f!exltv^xKLh#$VWP7c^UO7l@h(H{w($}1E3XxWU;D{ zw`CLBU+mk95^aXd^(wI677;SGo(2qKOpe^URhAhD@f{)0$RZnQ38g2b-`d?jG#}d{8WTxd}LMeW%9ga!QO`6NxR~<-RQN zo6=}N`KKCAsCyyH9E5ED*wv#_GbK*A%i+b~^wj;`h*$qLM)S-L1g6*-*~9-DM86u? zD1Z=e?|Er)FmHPkdVuuGqSqnqKqlk6vZ5L{c4Th7snb+j)(-fKA`6C7OdfD~OWkT4 zFCsYk?vgnQq^mW$7Q2(!&0x{s2Fo2?hK-I$o)~o%o!0x%4y^{bTy?7zk3zMa&%$5E zI5u>pVf4M>aoYJh>%8E`pufl^z<=(l-Y$|t3dc0?o)A78w{8^^wYzld|7ipYq=mS@ zO9*HP)F=x8^HDJw!wMV*&avV@P5m47h`vH(jz_S;?MnzFaf*6@{)i;1#$I;gR1T57 z39e1z%#4o}_DQp9d#$i3{`If_hKwBM9w_2v6>IKi?+;MISDM8B?N%2>HJ0>6`8Xn&}C1 zHxU>Znic5JjU2;E6qn$Weqr&XxeTn^p79Y`LKLK&O~ys+FGkIFMs)0$O8VkJP5Fz* zWwFZm&O`o!nYtVSMq)}zp~^zPEz*O=$xOce13$~Q6RIIYdy{mNW83?nT9IdOaM<9P zZdCmY6&${A<$&nJ=KH*l{g4QqWI{hk zBE7xLzXbc|TCC(IMEz)(sLK7<$n&ree$$s39_%=FZXt=!E^f&Anb`cSr_Oq(VQN1! z&?J5u{Qt_iZo=KG6gz2g+r}nTj1#& z5%jN;9@KRtVtHOfeaql-gpd^lFh8APwr2?Y3Nt8AUd7Yr(BLiqxcd?i@eLQ0F>uaE*daMj?F}A z!)&CuyH75MwluV#cJi1TN2(}hQLUA%-tvddS^ z*uDcy>!DTSA{OzQSAq?;jTea~FmSJJ3knBMkLe}TNbGNrEb3t}v~LjJhV25i;C=>+ z^!xPD<^~xiVZoigLi_18Q|)wQLdr)T{`}UAQ6c9fgYoFx6_~&~{^Rr`!P$plQMVul zJ{`o{BY6TzK$XLaIOYQqRuH@zO(k>BR0Fn1_y*a7BAc zi%{0#8Rs>ryj#|_*yX!cSFkxz$u zBZtMPvb9oYNYy|ubzg2UTNOsQyPSU*wAa>5sgr#TgsP{#K4w+p9bjN5Dd<46xirpjm%H9(7rj%kWwemIdM?h1&`J;OUaqoTOn zq=}GyO&Rv+5R+lk-ZBFp$_p~^vA#{5wHkQm5{P18a6HF?=HS*DUV>9zWDn#@k*0BT zb>m&G3=r_~6)Tszobq7Hh;=mWq26H(4c*&xih{M?9iAp+_ADd&w_KJ_Nrdrqw+Q@`t=)*Cf9*hn_ad2 zObiLtWQ|o5_ZbIX2LcpgmHQV8PdjDtNS|cTjRC=4V_{_|?i9aiOh~0(gO^yq+9aB( zSc(4cSmS|jEngXUb|F)|1UnJSc|lSor&u8;kV?b1zJbdAi?ZZtFROND&1 zwm#v|Ose~VwAC)<;JnkVX7yJigMp9&dE({DXFfUq?-2{es8M1?r3&O<;`eO&)A(Zd z5l>3+c``?MMsB{OXEWSI`MV70Pd?4marEIQ;O-$~&$JqUAKrf1#WsB6Lg_ruIJ|nZ z-*8WduQy=A_SYyTlKw6;f_g57AuU7%-2M!%dFs*UHaN$(}GyDc{K`(1%j%51U3XGTJAc8Mum37k6fc5=;vp`N_ZOsYeu^tGzM{7TZxX$p@4d{1U)-OGj7|F8q4dU8C*`h2SN7_IM`@MGD zt}d;#3p&q}*1(C${z%%TmF`zGGqsO7r<|Cj4S#3l>PjWW?Mfdq%;M;(4-eCfu%XK? zjS<)SUo%U8Os)SslOU#O4gq+70flrhYLt6o--|C*_{+|6GYLn8(kpw@N_scsd;H!S za)gUcXvjX=gQyLM9PMgQusB6n{JfPs8CS!Xc*B^TX)ukxXgCLB_ustzSR=Lx)2`1qZNuAOG1|OA zTK^=1g2tsUIuB(|K*7>B*>UYmU`klqMl;nfdUjMkGcJd=&3qB66$Z50CV~=b3n}=| z@aVxMXcx2fZ#&`9I|-Q5A_{hI_w>gv&3RC7naidC98!ZuvV5qX;r;>Fn-MOIKIP`= zzh`W-qlWWg*>N#S0@4I0=Jw~!jxV>HeAqfCmX7H{G)MTdfG>`E8>9r*3vSJ7>c}>u zgYkYI7o=4iu~t2@NW~?zvtdabX|BHgjTKDdqM}+Fq&rmdHK91@}A35^5D@Z4<1x%h2#YY z{GntHdN79i>4-~f2zz=8&KG2z2aGzespiF5AD+BA2{f-;MpVAIOY@^~E1#F?nzA2% zp&9kE2|xqUq#t_`C=M=>&7p??>|n^!r3h5n@@2#!`d6FT}!IC@vEoUQWKg4pC z@B8aK&NnS6_*T?#9D0ZQP=3y&WVb7u1N#DNvrt0qzrD8llTthdvRs4H#b%y`xM*b^ zhhn*mkIKM$GQC{S1$fERcUkufG<8n8IMILN(~xot{+B$3l_c)G>}!&W@o{2#0U(so zVoudxf|3&yA8&T#|w%3uQ`2F7`8)UBe$?~Rp}&$Hs^R+(^g29_%_w2FD-4KKLLx|V0( zdyPB^{$;jYUxg%6OVw?ildZ)#R*ZpGjH(mw$J7*GFAuu3?&o)@EIlVw=w*3!C9SJe zpff-tCH>;CNcZm4Lvu)`U5Nv$;VX@Tu$ej?jR=R9Fe z{vI`%zwS}^DEdVQj-e7n{vm%Pxedn!oBj@i(1!P%E1hZQbF>=5_Q}npMM~cUL4?o| zLHwL(o=it1j|nmkpA$;-?lC&^_R8ZNs4vv_QQ4aODoHYz$PRT23pkAHAc_6B-_~i= zr`_<0sRsq_oIooOIdRdSKypFoRJU_#FuQ99nk)P@e{ZR9*O_f12!2(TzRa5BMDbF^dT1ZF1! zj7mZ@XuU#Io60t2i)F`Ajh}kAyk)@SRiqSFO!KCu@GLV5R=R|0@d@z}wjz;o<+*%+ zRON2#*G!-2fY30Pz40p$!;`Ou2~%lB0nFx68YaH>lIzMBIthR*!Eli{jS>8*sHS^^2;*U!JHAFYnVYf&|bSob9?_v7l~I5H4fuhX0|&`b#~QZ6>q0GU6HSLS7OUkjRYvlO(wjy&XVl4`!Jr&&V+i%&mi@KN zG>hOgOEtYey^dqNlzO^$5|eBBa=)bOlA`uJn=EuVT zw!foDQ1cI$v1ODG<@{m6W!ifE+!-07aGX`td>4iLf+`#XD4bo4UsTp!mggEJXYM){ z?vwkmJz?*QI|FGM2X|Tg@u@3;56A@9b0?#zQ&6~}Gz-RVir$hcVqFWMepvjb?JU$l z;swQJau`+=wH0J0`|FYYd-r2$Tm?1-i^8O;_E}$^N8z3js5LJg$d`WxuN5ZbRNakq z`*7;;^%SHPYc{!SKlxju-At3Xjk6r zc>_gV;MCf!g z4;z=DROUYdzK7q8msdw{3Os`9&#JyWKVg-wcis+^Ue@+tza@gjqltAG=MC)bnIq6X z4nok{3FvXThTZ$4Lw(c2hWRmud{mvM0w!vn5FN;w=r`9P=S(r(N)`#@! z9sdNjSv2NZ#2!&{;rS;A9DMhM30rb$2TsomWR|PisfT@?%QEc+^LEg)s|rasDhzyZZhX&9SvJb%$q&k0{X- zP-IYOgk6f8{=3i^ALBLL3o;3sYY-Wr5*TZ%^YNLu9GP3#FDYQWx70=O6}{nreR|*; zjKjdcsE7~grtC_8Q%GwEu%(3Ce8|;z&nYJf89pez&yoqAF7j;OH+NPKkvYsr;LWXU zZ`nYsTOH*av-_p=%8o66CWIa8KNY@4Dgg3__GVz6I-;s4!RQEj za^=5K$$p>_+NvJoNRVR=x8L3fb;41aR6h!Ny&7l>s-afhaYI)an2zO?eYKEx7Y5o_@Uv z);DzE2fC&%B+KFonZ*0zUcv&^f^Nr4DSvIn2KGll=kBvRK!(VT%q`5P@l8j>FRt1zagi`c<0Zq%@gpH0ZtXwU)Y_kGqlU&hmo3zTDW;R;C* z9~jFvg_574(dyxM>4wTNy>ZfSD@R3iIWuiUH2-v z2)Y+}*`;jZ>G0lgWk|U`IrjHDW-jb7fKL%6i;j~}sKlk_Z}8n)tdG$f`0#ey0XXH4_z=O6g_N7 zbsY}sf1wtbOMkc5i^Dam(IV&3LVm;36B5JkFw~-@RhSVPRbcvfauxp&jy)K7ezTd`NXG0HGsl`Z(*v51kQ6CS{1|P2>Ifi@n%ueldf%(ZJ3{-X+B7dj{IF|ncd8<_YTr!J6(N209|{0=i_6*|2vYr(2M zRmY1pMjEd=g*aPE!o^)bY&HpLA6k zZ||Q~<}D=`nXyPi02%wp_9#GHR%UOaalO9iF%d__DWxuYp7o8F-eh2Fc8p@P+IaEy zH+OZ@#};-kMAechCqnr$LqO8>;C#5tsZjsQiijR-}0?nSiIh$jC$f&i0`5S-x; zK?Y&UM5dM}ofD9QqYE~aH1{PC<;>+cuX!_V3o!6hx!s2idm<%m11mwdo0-6Ol2|Fq zE-J6M+Iynnq~0lrj#H`!2?M~85T>#vN;$vtuB+YZ4HHo3>C){+V6&cg_d*qTlH|kC5MPaA-jV3##?`$ujlLtP`cN> z6*UZn+Gb@Fg^r5MH~(3(rBZfE9fq4XK5tnffFf*y@Jm8gKr46D`%|b@?`lQVTpvO$ zrkQXre5ih^TFoha0c_c21)nPuk)G)~)u@t5t-}Ogc6{09F}r z)?*9U@F*D+QUAC!q^0tcHIvj-GF#*`fr&4#S-bP_0uM%%;D?|{JncLv?=2w3+=yDg zOYVe1o#8R$wv$LgdFwy>dTA%=u4*)H1v%lb9>~}F^Q1Q4dXg(!xTayHIFmT}cPhuz zds>Fi@Ut5azkX!y`S0;1kR3X1AgnAAkRonzI_vn263qzc^!&%XzETnvkoxX)-;K*I zv7De=Y~)I_in=yKh2P6*Y%aQ%^!a{Wl#_;4Fmgk8I}@`&avzA2v1 z@H>zWeoOJ3(kxqVgUSsHU`9AZ;pgd!LZQr2%Im`8{tTqfP) zEH8oN()MJGe>9$3>70c9PfMxqblK0;5z1tMc3&mF47@^lduQ{{XfcCeUvt9oFboN>c z4J#?d?60LsQQ=s~y<>TRM0VnF+3~RY6$fzX%kKbv8IolT_7<5KH`OSF8;lW|L%iB5 zd!+sM684FX%Q}J6+7iwAIK|$mMqOiZK^R&ALTx+Dd0nP1^r zuNiaQtBtM_IUqQ1WU`ccw&(K`LdU&A{9XH$fsFeoZf!=};Ar|vazq!~e9dC7ym29P z@-#7oiQ;f?ESq0+cd#$3;G0kB9HT^T(U$|Q+eO5HA8KLsFw%;RRt2TfInh~(bM2%x zHTC5T`irzS^Tdy`RhNBx0fO1Uov*xjSW~BJ5FV#`gMFeoOpj+cKXvObcX+9jo17pM zTqgdf$byLkHh_WlWz|&s$8OYP!taL{Y1S1B!7=Mhf9`u~;KK_C`6KsdisVXN)L|A1 z^ua?gs2@(C11la$tnYWgbkQ94E zE_9{C%)(_8nJW~!a#4VxEp8hBwBbkFAdSw(b)@~!djhIf{5k#e1&PFZAD2M~DyTBI zj(`5-MAd+9!YdntPJH?0F9yE{jo?b*w#xPmX)-iNog!5fxNg0l*e>7*0Keo*;4d8O z@oOLcu26sp2>a&*$O&Tk^6X4n-?X8iB6Q3MNYl)~gL(B1YatAr#k0m)vzp%Uj^rX& z>Xa|LRl$C9K4;aVHh;2Sqj(^~egc4pOt_m-eT#R|$6+5)a0|E_2oa)+3%$|L z0(qX_Qip0)mCpJ8>L}*k4bLp(00-i{_u|aSo0w#HZf);yc~38Z7nbnRR3=CVfK!Kk zf?gAwTTKDN-{4M!a$caH>-@EknpWv8KK9;{1zT|dIvr|XO32sJJ0#q9UcPCO&Ql@Ieg>_7WF$aiplD zl5tr9V@h2oItPCk3b>vCO(_m@jCnRbZybCs={rNd;fJ^ zw*J+_{liP`j_&A&+%UjXcfU!bHNnYR>hkEPtbB3v#&+T{Wao`5qaY%Tz#iOH9=$Y8 zRZd*6neHag14mBCxVsC3^9YuDc?rZec|b78L{2sRQO()R+s$x}-n?Pa6qj49~2^U!oZg+DdCIwa@_#gmm$DFoL@T39l9dd}=Tso_oX zcW@;JiC@U6@x-9C)%gTie7kv^q9pYFi!P3UaZ^7$#}ouPLsJ|(r}5an`0h+=Fu%uw znjOnkA|;8TN}Z7auo7v`qWBc-8y^5s}Y?-b^I&K{m9O(2$fH5XWb_3ry4RNK7T zZ$1HYipP{ROtZK=YU7*8ymGi*S+HeCadHx!(QFt1s%2rceK0c#XNM7GL zg!@#9gZ17wT+Uo=W3g52tN-_&HaOaW9sOk~4kSaU0y700MZF%d z1As<$@S`r<;$UNv0qqs{Jc#j1V~0)}6P?Vv%|}$^JoTg7dDM(`Eg4KXG@}V-|=_Ts5P-EBwjukznrMf>_L;sy+7C ziz7}Q@T=8mBwwxA!Xl^2e{}UW6m0<9J#?EhDY4xNsk?8SaE^>4T3EYUj z((8d=EL`r^97DZVCB~lXqs@{E44<0rvN%2Qm+f9XYm72p*FE!7)o_v}-X&utR)Z&8 z+S6{CalGBU==$9)S32JFV|GzxkrkbR2&H_*v)6y4{G-=#m?c)5yq^hbSl85xl_pz^ zDc?*Lc{3>NBME$D<#Tfr7-2A5cS|!tlZ0sv1%2~`dSC$;yIP<`ro0hC^M52R4uh0MOA=g+!Pl(} zDH|LYHPLpsen2>GEVB?Ib;!DN1i69dQM{j5ol5#gxnrqxM;1n=4Wh@hL=sF(4h4FY z$ETT5czoqhNgSYzVqPi?-g^BxSL53W6U+G<$8}ke+0&cm|AG&?y5!Q=x8YrB@$R)YYq=elrRzX(oBm zE!?|mxc%>auPy14C>tb9UCyXi1UdLy;Kq&@ZN+Mw;!r7Y>dK4I3#AUf#8Z>Sm8O2N znGHDIb|8DTGB5Zj=AnTlLx#fkwx!k;aLf-nb|f-?D+ZP^Bd^2v!yry5*FnU=R3$Hd z0ku}ITegomox?iT?e@(ZmI@(osI1I5O+Rf}=r`@eZ4ZIE_S=xo> z*Hk9ze1{MGO$oXzijI81?i2lB)6nd@q4?SgE^AU$oT#MZ{y=vHRF=z8`H%X$d#k-Ug;9#nK}RSsv+BvWa;vz`!FT(xTcvx>E|eoL>7`r0d?R=pZtFThSBr^4n6ZIVM-zM%Wdfz6WLtqtglHHv%l>!m)G!g#(!Z z^Zc+$CgfMY2zLh+;_%pp$(C{U7^c%Z{)x!Q+})(x_ zCE2(`$7`t_&t{NEpMg5QHoqbS>ys(Ig?@+a=N)@(f8}*1;wE2DKOW4&IA{Isq6Z5( z&*Z!rRS1G8Gz9<@I|g*J<@Ll+f;6QV+;Ang%mXEeC{co>doOJ>;pUo<_HG8w6f;2o z!;l!jIz$bkQ_yZc_P51NfPpyll6G^57YMV%9I`RqgVq*ToAQ@9p=d=FSnR!DKb^OG z#@mFVwgbVjZhO+qxH!_Qnu#K&-0`;~* zSv9hy_UV$^Nnze_CW1lMNdPtJUU}6|Z>v&}Pvj^MA^NJHWjN(U-PpC8);x(^xE_^* zQzu!&OVZhF#lJh>i1jU0Vj#U#?m_b1YZq2%-^NB!;5m9mZ)YYAGeZ zj=2=fuw20wd1UaAwFJsX6$mpRx!sdQyEjJ-(I0))zT56;^8XS|98~>vbOiV}H`9W9 z_FFYTW-e>04&$4TSY=lc48oKy%#5pQXFooJmi_3`C&qVrK4TpZ2F4LD|6`9fvr;_m ziEPjk6QCt-+z?p!Rx;Q8r5Ou`P6im)q)3L0e_|VUAcLUJt?-P2SW8YqbZb5;Rh5Lc zcDTix7XC-9>XKorvSO<6;o}YWQfgvGIPrw_enz+!%I6wb8WGnP7XJw@6Y|K=QTYW4 zZoymHZS!?*ZV)P(g>VDi#)Y!vz5%yY;1t4+FgnS~@S~7z7McHvL0b}y12iFa1aO0TFYd0)bPjsxe+bqY{o0dGPFD%=ndWL zcE>n7dA6nf-Eq5CUh?3Q#^|bd4_I zAXXRJa@lEr0pq0vIk+-~BuPv}E1`3a@a6 z&&wB~4%z;iYhU>FeP8Npuq5Q1ac|*Ng2KTQY<*m``_%`*PF3nW?OQ)W6i_!4>jP&o z!mmTWaGD$g`#sl|7<}q5O^A#fCk4&aZ$L?zB|M$1_=LH3WE&#!7h^<^CznQU1f;o>K*e zf(^)t@p~OK;|`D5iA^SsIMCXWAoe$4G1LA}@Wwn0LCh$BpAp6D%)P|jZ6MSY`W2?x z3Qw)SUck2ivC4$qcN~nthZWXMJH0P2QhxBxbTic8$)6Z*E_x%Ix2J_SmhZa&b#n7=s>?2u5v1tHMzsqkBd)o zx@v?fpV187l1(e1gzTRdkzBT3U9`CI*p=F*{+|Ld!eBn5YR9jC*tM8*)MW~*rrcx& zQwd@sF}yoVk7C6H2l*!58l)6WJ1MHRn(<)THxjQ{6kGv(Dn)~K;$ihXM!5txkKj3;;ZdTECHq^ zh>6sotJM=%0TCL7vd@g)d)NsXe+gwvzRRL3hv9c0MYzp@w*c0t z8YzWBe@b#21!15!q=K(yRxD=8)dC0{eslAoM4~z}*|pBEnlB87_{>|HmDx}7z04t< z5$kh5MCTwIs-R?xJT0R*T(2FCnGtDGV4~l(wPY~>oYsD-BqeB-VnC_^WgWhIf;TBQ z(1#E6J@lA>u%X>+Pt&R3711;?l`RUUU%45+>g=&Qw(IRa*M{ltXB{J};zdjs>u=PZ+K zY%AN+&|vc7zcy48!Af<3<(8bsFa69VQp#eIg@U!LQ*klP5@ct$YvTQD?VpMJWV7u9WxCr ztlivDZj4Zha31oRMqZ(sQ%@-Gp|D~ngJ~+eczIM+I~4F>4pFrVl{b+b)-IisuIcsL zCMj5FgL&kD#qd1qYdV9d#K#36brJmYGkf4@VEz!Rb`Yi)DQ@9e=gsTu#%B-8%wsxT zP-q~h@1zfuhQKceq14DOZai54wVzZygBh?%CyjgGNs#DcW#d!SrJvqLpy%Pn2hVTJ z^j@nL#Ep~S2n6KI!=7p53@$7oYFYSnS`M#WuN_pHcw7`J&Sj7T&I6L8kHYGVXIj5t zaZFK(-Z@1PuLIG<;I5xDl2}@4>x}RNzL$JZ_C8bxE-)QQADYgR)()92m;Q}S<`=2!v+FuD`V75<`AlE(w;Ix-aoDj+JSH4M>)f-on7L~zOqF`AGW z8iQ=J&%ZlvYCm}+yfssiPA9U0vB=LIT*@JEv=uomPE$-$jkRo(PbhdxgKS=xrCXu| zrSs5X?>#VIXisbQBszaJ64kYB--(yZL&x?8(YnJ?N+xsvgZRgJe!_h|nNUPX%h6H= zI)ODFZU2}z`+#v<4{j;>E%e?1K58WB*Uu63$NM2bcn;+D;K;Cwabfpt(2}Jo_Mz8t zV)jXN%1$8n42ju_mC!4QsEEL2fPnD*HwdfGKITNICLd>sh@jYk#7K5Qg2JLd?HVv_ z@Rza<{HE~J#~RpGQ)gjbH<~tMm1-&%bYZKe z*2vnC*wh@oh5yzl%CkD_bTk6y@8IJ)S2s1z+dyw3aGWb_Qpq!+D{OaQ_Oe-Er%l^% zc(PF1mry0L@v;m6i@>x>zhyz7b+3Q6^S&jvKY7^4D3Io|TCM*;KwVcNRmkHHgANCp zlBh^PaC~hiwQgAQh3sCTnZcY*pz{V8yOTkk>fOG_%p#<&JdC{>!2K5m(n$NJDZdbM zmb%nY22_O8I}C~>yKSBIb#4<3*+NhJ2fFmR( z9)*iP9KS6^{mT@2BtlQ8c`_Gg_GhJnqc@sfgP?`gcbgdj)Wkor*FHOtWQ2Bq3&A`) z(4i!dp41S}RzTp5SQOwI^Vek%6`UYQKr}R@S1}4SJA#OU0IL70Zc^T24TY3A2&FCh zJlEN194d}_L_4^?tL7zrocNXPg0z6J9ex zPMJoDEe~%+V|NSi?)wpZ2yh^~+D94|EZ{-!jz7s4^X3Of)GlSzUg45qo)3da-PXAg zt11_D^HONXq=G=@aXC1BC+WVK_0#VuPv+$;G(vn(UDbI2JPtMCD7KOSyj54$pddCs z`i!oZJJ}K3&@XdlJtx51#RwJGqV%3aUp`-+-h5UI;J}1JxVQYjDEiN;8mybRE$Pc6 zUU;cE6=Jm*p(w{kKLUo5KgPToZus{D|B}Vc!sJ;a>3!wlYi&@9 z8*su=x`&}nEGTu6s7p<;@E2fV2o;EooEW`96g!orGqzD|$DEPR`u6mgQUGd(FK1e{ z47zPcl#2BTCt!`TTSpAd(*36rO6#B~+0)Fog=&kl+mwuB>|l;RXrUid#;u%k0yWf2 z7;=T+(~_f}(j!{4mxRLFID2|WFthuO*95V0!mf0@;sPD`aV=gRF^%)zGmnUATbN9V zi~~xgPPthMz4$~)t2xWaZ!9ZRQzDWI~99kE>%^mIda9Z@skEF^~ zbqk0QUp2>{PakB~pmF0}>mFq*)9N|KmJGb}4?BAOjhJ5E;moGXYjCB)J=%eF^rJCg z2A^w9cIgazrwpI$Y^kqHAQ@!B_|Q6;IKg55Dr00O;Pz)6+Dbtcc7AEPf5@ZLF2xYI zsM-U4P$92@NO}wrrzW5@=Z}YzSjCg0dSlXsoJ6#ry$oWy4$0w1E(~77Qa~mL&X0hw%fIj56i)oq1 z_ub>g=d!V*v*;iOZ5Mjk(79QBTuwS+KChg(wycWKqY2EH30){IpFaDj1%&$29_eEGRn@nTVo{>z-paex62G$rt) z?PRO)3v8aa>V2Ny1(aGOM3NRm4q(5%FQ_mWyNGI_dy8&l+;&uZK~IhS9k(H<4`v4| ziWDQAURrLazcWf&gSg9cNUn{RbKPJXV_8C#L(dm$U zSpu=xu~D_VkQWcaty-;IJpoyLedl2@O@=M)?#)Ud&KOcPRFCLNF;RzD(D$DwOFc=Y zBaPrK#Pr~L-F{O2T7|ytMRh%x0Qcz~YJ7eH_KS@Bq-+DDYy0$mBbUU_9 zQF1S)4KkXSJ{#0(JPx%8>5sV{Y}WuiQ>8v8)NN zS7~c7%TTFg1`;3Rp~J1T^t&fXi(``+@~a>BxXg0!v}Wa2;p8(&hp2fz=*B6#c$T(- zpXi}hNM@2UK7im#Rn2wau64}9Vv;#S4&%tqxZ?u;M=RzOl%@I&6~{_ocTj&NF!Ydy z;A-Np0UD-cQX=)<4M=6GSe1g!JQE6vAjH0$yq`7yG=V=CP4{!q5GVGZnlx5Cq;mXB zB1s2gDrzBUi4(>Bs}Jz+6Kz6-TfesPo$Z5TBwM+27{qzmZ)zV(Hd!Z#K)|58>; zyg_~36eT@2Q)XFXV46`3;Eqo^9rsu)oA?m+c7tX@)8PvH5O}^8MX7y<*)vTO^$zg!yvn~wHnNM)7WWTvkJ$G`#OqM3`c|?-G98S zUw-6#1$=3rDbuq^uI_{(rm*Y?wREmP*?=1O=Q9&c;WXuo*BWrUcAS6R%+6}-w1WvR zs{#?!cwa1;zjW!Ykp|ak z`bux6rf*;9Q{k6s6x+>*^;Vde{cjxLIN3RZTT=i~gWl=SLY^{079g%XSc}Nl_(V#_ zh&Lr+sYxOyjL+&WX|~O)X@Epn&k59IH$TqYIvW}pu^CdRf90S&< z3v`?hwCO^>z$j!7`2Yh5Kn?twph z(cVb|n%h?UB_zb3!%)V&yX|7R%v>L-9fr|nVgUXAKc2?YpaR8SOR^&UIc{h`3iBr! zWC)R90rny`#Bf*}ByRRKEH=Q+bP;eV^AyE-PFKPw-NvnYyP`?p-0NmM##8cD-Btke z&k@JX1K%o@xGm^EhEjy<#R0k0CIJ54q(GXN6exU=C3=OR7G@ss@2Lt6xp2$_Tilvx z?3VSNnEd&|gjnhH*@ON&%b35!;GW*6Q18%4|LPYVd)KWO{c1 zM*EhuS5=An6F9gr9|xf`-%pU)ZJGutX$v~%mbH#^9(z6& ziJS;II*&@i8wZ!R4FwEVDhhjKyV2leW5TW*D6FyBJlGjXI2kx|^-GWuTMbQg!mnE} z(-uDm-A~j{m^jE1FuPwK?=e;pO70@o6qxwFbBk)03tKE_QhH`=Ot8$Q{@s%>z77PS zVQrQLmuiE8%1|3_(b{-jXljzbl9I8`r7CgDmTbzQ$Ii{&`Vdl6??|ufSvBnGBE>f@ zY16jXnbq!yzIoOHC-U|!r9R&7HwcH8S|=)mBk|_D~+Q-><<6vXHeH3Q~FN) zzV!-N^N~uu(LFF-*7j;Ppb3h2DKV!wmR>kv+D+R7s_Tc=d+K|0F*i_Dt6E>o-fw#-B;Z-}(4mS5Wc7XE{M~Y-lBwJT=!F+#lrG?yOnRz$PqIJuh|* z#{J9(&%>?nQE6jmYmxN+38j)=Y#F@Vc+g(qBC!3(WE|yWJY@3^7Y0hEI@yN+B4D!! ztE}pLCBKeiErvyWXM(k+Yf;`wM5ZP5zl` zGPR7!MqiyE#UX;!lM>-bN(npe5IvgoVUyvZYE6a|!xU-uO93Fl7i#~)*qgkhQ%fc4 zxLEpAXe?4tH*skc@3DWY-*fG@ockxzR|yQ2;Sjo#`qq@^qDr@U&$5%1FwGt<~b0#2!+B9Nt@2OmHkQc65xj+a4vrXv=(>|v4zK&Ap z*B0-Y{QzQH@w8pYD2~$`B$=aE4w}+1I|YX}%UbBtFbW>|6=Gyh18XiU*?o@|#HpWyGjO!&`9+mj3hP?qWUOtf+* z%WKR5D>}7aM#s|QAkDSqH_0qq&TdDc zg(%kL$U|RbD=F4{*JU`Mv5b&g&>lq{V^hU$BdvLGk;EOF8{ar$ie($FKy#dtt6%Xm zyp0f!Sp=wfnBbDEk2zbmKRwuRw;QpbJ(%@MXLNX5Ix9qcfjBErU&FfI@mf#cbXOw! z1D>k7=!aIwLE~n~|SRg!ns9kVeZ$bPF;$#Yz*=6hTLot(} z({+rBBO0xl8x(ne6Ly+W$h|;|4=>S;{mIA?U~ExGG)-kuFAh0?OF=QmhvYP;me?+) zyIx)qT%D|R!IpUOTp#4@3ikdWYR9U7ChCBR3EX7KkQaOSPr>;9E$avd;jT-!p^^Vvis}qmlxr?D1^}&`j_{tY@=1 zFtlzmk5XkkLtt-|F{y4FnZ1xMT!b?oaYBF zHSUDCwT})MdpGqR`#`q|?>%eR707Hs5n>3DK-_hf!DSql-uF7@P9IZSYH$TGEGqDZ zXnsR27<)A`Gv+2oe^Am`PJsiM>|By*ln^Uv_F>I?hoGc${DqF=AQTmKD*oT>Gxsdq zfaztwc(zP<0`gl!Zptfpp%#bzB{b_VW3ieFWVJXyU(ovdNt^3bVeAUABzDs6_5GM= z(;E0+lZ1pzS%pXB6t%irp9c^e^y&qzGzTJ$gmZpMcCZOk7diKC3m_SQ+V5EC6H4{~ zU{2&Dlrfq*ketjjbypfA)JW~lKG!JTG>1Fuyt{aRjJLr%3H8_sU=>e{D>YlS6_vCG z^zI|B;Ze>SOMI^udG6|{p8284U+S*w5mp~` z7*)SY<9D5G&g?r|Y|+_3O!SGWKEzxEh$LfiiomdNs5Vc9Y>s}_%wtT56VGNQo{A9D z1Pk&Y0Y8;1?Zh)fY3aBP5yX9HPVC3gEC;DdA`t?W*?&>aixx`!p%Y_iu{+aorm!SZ zQBV9;@QDoNloe2-WRIIV5sv5{Q~hbKV>%1Mt?jjyJ~Dyq7Y)C0e4nVSrp??6GlRV9 z$Vc}n-g6KB@^q~23Wd-A@w6(ZIf(VWhD@h--TJBnv@11E;sV;nirs^LcC0 zzD?*ebj^67-L7Y?g%6#LB=>>aTe%cg|G8;muG~>u(8Ifps1b)_}7PU zBbHCg8(D=ZLbd2s_9%>`++*_~0il<__vvu$Pg$hRV9|QuJ@w7riuA+Vq!S7~6W^jd zT;IAG=9GuK%6!Zg)lNtxX=Npn{T4#(?Td(_C>%_ynq zQY8pXkC@r|_SXE^evT-l!v*Zmme~$tGr-Upkw4Y;pp)NI?tNKvKPw_@Mo{Vbi@bPV%5YwFv*Llg*T=7>3=3ssDVoyq ze#X#@1FJovNhmsRglk1eS-W^&M!p+l!EP_dPc8;`YV;Dem%-13jPkE;aw}BT8(X+& z&qv1Lh%A*W^-q&_| zv7xeVnNxT|vKPm^^)OZB$%1^7=~fSJ@Ra>o+CIvVZp1Eg6D?p=E_iW^+bLe+hO)NL zsns}rAr@h8rKd{Lw5vU%yY$~LfWRQC8nm^a6I&DI@CHsHg>0J~XWcU%zC;RBW3FH4z(^2gwB zyT{IGf||?z(lHvX)79J3DDc@e|1K zYYpwxX0~a}9#86IHS&vTi?8NK8eN)U?775_>hVaKRD%Y~af&rB`Rz3zgqo4H5e7BG zh@S*ZmI4ib%n(rO4E1&4o;So{Hm?o7%f`@!`kAS4<*A&Vx21K!t&>OyawA1uOMmSy zizL(ivvxsSlmS){;5DuGe0((S%6SnZzKfGXP!A0I^8gMF742LW0w- zS|g_@^W2!WQj^mhm8DvDVNAX{rJEJ0bE5yk#wow|EBDL=%hvDf#FmP}RMuc_785_U z`nU@F9jF3aJKtIr$Xv7fJKm~0%iKP+ukeP#Of-ST@J-mK-iJf8JT%!TFT@Fkuav2d zsq1nOIg1U-7*)v|&;!F9aJk!H${thz^st|2E`n~#l7tU=N<$9b#C5VXql3BjE$f{Q{_}_d1t_bU3(5WX0B)2EnHX zj{b6|m~MQlOa=1B(a?D;WP>myXR(1_$WYK#*QY|&VYwGpxhXr(0q6~vMikN&p2-ZK z#PrxYCIAMG{raVGgx~k_CSAkHo zjS5ZV6tLAU)7PR-s*RjTumA$QLwb8?3J2R%s=laNi;PfeDnVp1m}7_$Y1erN3uGUa zfCq#s9vlNWe|!SNd^1s?+ns&b0OUaKKK9$Qk8S-e{m$V>ZKTybzY{=IXHb4VSZggF zN06eOP3tSjTBR3RWn81qg6h|-CXb^dAnaEE?f6^3kQk(1>u7rlQ>e)ivQ#@8c%?8P z<@(Nq-oimOG8QE8jv zWbUwm`O+y+7lpOew+@tuZb#j8+47>P(-HeY~9 zghZSo2dw?O>T7PZNx~5U`2p%aB|lLS=9`ayn#@44N4Bw*DbJjzScE=BQF1 z@HTXLU@zI8814SJVN!KJdo1wR-F%iWagAg5@`9@r}=3nzUr~t`kDe1UxylT)MAdgdfu@ zi<7CE=SQ73gx5d=EP3oZ#J4Z=FtEAn)wUMbm;=-=aH=ycRrdh%#N89rQ+BS?Bj~aD z)f|R!QVHt%kXP=k|1RV+reP@IExB|woLP@htx*r@b_96Sq}E5SWR}UNb~CLu?k1s3 zfDVNmbln2*4u3%D9%X9cy!~B|36Eq4{SNw-qIUtO`E~yQv17E+CVganP!b1g0BIOC zVC}(X!GLSmT_hUuFMC&wv+_*}xZ0D-XVn9>a9Jh#10Wjh_#!j2D-|(De|&iMv?H4y z$iM@g`x8Qz7`ZB}-tA0Pcb&745UB66G#mjWz<9=hzq&L`3u^;9zquOg_(0=~yhGlmck1TNX&+;0-iU8~j zevioC`h`7<(0nprlmYz|6-&0EU-Hk2O(l)}K)4 zs+DyG%JlAv(9L~x$lHMdU2s{^b|VMUuK|3d%$yMH-%`cHT$NyGO$c=|EDR%eC3p?K zc4ga}o?Xf&?~&J_^_rGO>vvG?PZ}9itWNuKC3X-EC{(M!=uCXJK(SkA737GaBBMNh zupgb8m%T!5=e-@l`z8F*i`mIeMN(Hlu#rGczx2^Q$|b3Q>{hXv2S*no~wdz}BS z^}#82QMdun)MW{NBpEkjr%^jjeMRp~ZKYToWY6dob~8w8n%_Rt{sX~U;sANO~? zjeCj9fo_awgOZI4y#>289=Kh#02Lm29&Hmye-w6l?c3L*qM||+U-N1X0TFF3-Fgkk zmt}1El5DSv3y@q{6vZ|AfSzqIFu(hSt(bScCfMbtVh!C{o>32!6MC5jANFpO?2SLo zmE<@9a}le?>a)&CPQ$Fv$ffi=Ub59xILU3T1~V(h!4s^R#lDT}vErHsLb+6{s#xHY dThkbRb{w)fA_n=L&(;}!u!imRq~Hc3)qqpF#-IQI literal 31636 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 MWcW&NRBySzm=*ycO8@`> diff --git a/apps/docs/public/images/n8n/workflow-approval.avif b/apps/docs/public/images/n8n/workflow-approval.avif index 7de66682a64e93c977c6f99f9df6a68b8e7808b6..edb0e4df806a91764117de267ced5da6e46667eb 100644 GIT binary patch literal 23167 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�JC3M|`I{D@s^ih9 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 diff --git a/apps/docs/public/images/n8n/workflow-monitoring.avif b/apps/docs/public/images/n8n/workflow-monitoring.avif index 078aab968fb6cccc56b81d6d12a743d7ad7768c8..306c1e366f8e3867332c9f6254a4c9ef8e503247 100644 GIT binary patch literal 21111 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 literal 50597 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⪙ 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%0A&4?!anAZ|{Gr+$uLP#b9zCNj%o(!M%I<7U%2 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 F2WG>LBntol diff --git a/apps/docs/public/images/n8n/workflow-reminder.avif b/apps/docs/public/images/n8n/workflow-reminder.avif index 111faf6fc9bfc7164fcc85f18449cb9e97af640a..a69fd7753faeb95be45511084eb92711b15d6b1f 100644 GIT binary patch literal 21138 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 NKGBj3G^sE{k4~&G?%MzW literal 24687 zcmYhi1y~$S)3%K}1Se>4SONrhcXxLW9z3{1aDoPRcL?qfAh^3ExVt-l?&tkKhRtzg z_S~B7sjF+~>8|Pp0|O&4b8@pYbg?i4`}eZ3Fk}4hy^V$8e>`hr>SXxe=l@Hod|e@7HM3n!cZ0rN zz`$UA!N8z6{=Gr9vv9Te?-NKkIJkcYYzsS^|L6ZdCm{VGAi==&y=+VjozTG$5V&Ys z9@*Exkzu|wZM1`nOR|6|3d1RYk-fV^Vl8d?na~ND%`(bY7ao1I)ge0BSVn!h4OPV- zl7sI_1adkUbshO7STx);;1Qm)P!5G6fGYGut-G>fhfTOVyz41h# zB8A}Hl^pt#7(ql)oyT`yL0P;M5X`$=P@n_a)4|!%l;&4X)lt|A?dI)OgfMLShLnJx z@PfhdKAbA0@*Lfp{(rIBz9N#zgN-`rTP~Fde>MMz)Dkg3JFB1CGliONB?>)vP!@-S zz7vJI5SR_hHP{x;erO=G>esG^8$(Nn zvKZapebzFV6?Ti*CzTm}g?{YF|4nRYE5uPy;l}w?ZITJC=mmK%u)NqSZg8%%=r;<3 zgloBKJ?m2m6MvHHlcDO@?7onwnSdpQh)$L<-P~y)`CRH1`EM3 z$w#DUoXHlv0+_t__LNY_;mQV=)+6COtAi?)e&{)(8OhkKVje+WXiR5Q#8#Dl__cmJ z;ZSX!asdODf`i=Ce^vr!=iJ~4q1W)hEiJuO0EPN3>FvvA= zxRLjYYEjEQfYpN%=P`&-$7)(otTl9$5&yEBUoYlXuduMBgcwirtY0}{(i1EjZKV;d zL78NO!Q3ZuCeN0@_uh`u%zT1Z_}k_Sm2f!i;Mf6f1Gs!|ay~1=eV^7mLrUgMxn{sI zv}B;Hsk~(o3~Y8?D|s#_JcD@$oYtfGAOM#(|85O~NtW%M;R zms7;+`Prq$L1y#}r> ziEqiKRHD$14>UHMFw}2j{;X-<&(VCIlE!1*Ec%wWu6U~0g1&7@o9=B4SvViXj>(7Z zg@^4$w4L+ws5%AZi0q`E3#<8GG@(lOrM@Ewcryli|2Wh&_9rQbU}#CXVB{qr+ofJ^ zb8WpU%s|VoY9mVbM6^1=zDaMt;g8SbXAb?y8DRU9Y6mpS+4ToGkJqiF?16az$zB?g zR%quCvmGV1;`r}r)wKd~(S5zfeO}s7`4sGBv+qe}?;4J{q$Ad8fJLDwyve&|726a| z)#p%hSpx5d1A8!Z41{x*ALfj@#2}KcW9;ps;$KqUQtc@{t5AP!&JW=R=zoEs-&bhO zvioK^qs1{x^uYO*-X0H9X+xSv{OZmZ=C-mM{G7n)c5wOmKzrhsv7`*gyf)QXS zAu0BofS{EkAxeoDhA7ZK7_f2^D;{s^I&3@QDkbUb-uCDSVR$S&R~L zl}_V&>e8Jf4^7KGEEVB|3If4aCz`BMAkr=sdb!OTnY9wKr)04t{b<|b?j!jZc{%RxFt_cK=c=iFGdfz znUKB{97=TK9E~aeES*+!BHI0D>CzZY^;(uxHo0Wz#feUEx_<9GfLNOJ`lrr_?{z!{ zl6Y9g^-H-LSyv^k#IejToh2ShO0i}=I}v@s)(J+mOK0mtxl{a~sODF9kqrik!8TKP zThON{r6*@=${m(5tYQATX&giIP>)zPKIh(B#?VM}c_s5|T9MSy=!^-$`p$D}yuY8j za0RRFvZ=frv4!21?UL#RQy#&$WVJ!tj!f7k9I3Jyp-@^o(_hYT4lQd;sy9aE2%*gA z>M3Uf_cC?~yZJYo8OQ8AHVhllxruRCTm|>UD6`wg#NcQ4NBkAK2_Z_sQ zCdquM-?GSd^%pVSkQ~uWz|57aOs$DjUF)DC9;t%ENI%V4rPj3>Brv8xgK=54l_|^I zf10MibMDKIx2(#v;Di~v6*iWm+K{5~qrhx7#eQMSP*$kbl8PE~og(|WpUY}2`$64{ zKO&Q@b%!*sJN47Fh2Sc_tkbYY?F{I04a|g-ID)ptF?>_I1R)Ie!F>zmq3V0y!6q(V zsG1RX*Qh(=a;hv?Ex8R4^2ebyvYUOgd)G9>Uwf8~XHQjx8a zx>SI=LqtVdK6_X(-$k+OkK(Gvt;E1D#UVI!J4}||AvAr8XaAhDX`O0}uD{XEo1c;> zO^k3oH_d*yPr&0@gF$VPLH3dpO34)P>RNxS%{#4@;#Nvg9mI)v zpKEM!(+mn@8XXpK^ug%)ttVeawq2*gh9MC z?%(%+Q5Qyn3A9wYJh z&({P02cFpRkL|O`Bbj^hQRtcU6#Sn$2Rr-=CnU=NB$ znNIoq$WlIo>MzJZ3v^9Q``L^-t3|@~qJJ(D9(!Vv`VlW6>dNu|x_}R-7G_Nt7Bb{_ zyP8V^-=Tlvn${>>0m=VT$~;f_q*jLwx{*>ooi2PVa<%}VkZ4XT9P=UnfAUm>7Z+ba z`A34RXqeYz{39#qg@$Hs3euK_`H1aH9nFPe13)Cg2I#0e5}?;;Vr%eTW2k(93+RT5iNgZO07izF_xn%MyU@CcV&w6! zgn!lnnVFVh0HiW>mod?0Mkep~!Q*p*ReIH7%LM6MrLgp`Nj3zre=lX)zUw%beBZR}p~L%kVKn_=j9Untizm$2 zOS>O!rY$pLBV^Py5SV7aN2CSdXfQ_^y=aP(AOw;6ZIO$7LKqDz`(E7b9sgO&MMp8K zyFPCdkI}Ez5)*GVuTfKS)F?iSJKCKhxeko4PzR0z?)T#CZBePUK>8F+4>t{WI&pdP za)kH8#`(fK@p1icVVn9ip%q!H+9^sMWr>Q!#TzMNPUnb>Q-fch=cJhVh-ZjC9t%jX z?b2qoG(#KU6tzm&7-T}_%KgIqH$P#Qry~9XkL)_MiH)FgiCG~JvWocp7xnYV#E`rf z*nVn@6OkvybSR<|>+?5RsY-Dg2-3|PhN>Sgga>g{xxz_Uwj> zd0vukh$Zsm5^k=QYz3j>X9pa5F@T%Px`Kre!s2vn`O~7-@gesqg_!8?P?8Ewb@Ls({GOK8eZ8ODN?syc(-UO@5(*r z{$_Qj5bi1VDcz~jAgEt!_jHS9h?5x;xeUIuUxxZ=-ed# z>3X(8x7!T7m-{}<^(W?4a8^%#C`cZkG($p^H=EivI2j-FQUkO%uDp7XB5)WP=1z-w zxeGcM9a`v0L6f%^%D4>T>*7vY9f2!s%$9c-$}~vL!obbOyuk#Wp(~#-FUZpF40=4q z--d#2>pCm8a@OS2{4=GY`E6c4t4-Jyjta`>`)AfaV)L@-fG)l(A8{03cA`SpHi51@ z{|6nGk0bO_Uiz31a-b&$D3I(cd_rkhSbUwy>9vR10H*e~RO#4E^mI{v*00Vdd@q1ukR89za^JHV_J$fBk zL8BG*z?e(8VFti-)M8N|aN!g^8UPX|2Z6!0n1U3zZaJHCuNocDeoxvPuvJk5+6NT^ zLx21u1Q{SCp*{cr*W+y9K_Y{S1pxPj2;flxC=h^*bah~aSLU(=KmoD^@U^%x7=Xey zPT;|)vULT3@^a?Ls~{Q|_Q+QNUEzoUf&?4hOxobqE&vVL=xnd2#Xk`iyh4JA{G0B1 zaei~1I1{|r2b&7qJ`haRPtJhX6~*G4vVf~9a0bA)lyMz_#%XeG7GK*_3l5`t_r~^q zC=$?=>hA*hr#@BwYM}wK$pTRI#w8V+xHtZ}wAZ~(iHfw_0cT5IBHu*f3LXG8@kbzf zxn|S=lFQA9R@Ja!w$9fYLtl~FOv1>g76i6}K0I(zcrWY;X-pHBx z^hVAG93ZE3;v=9y@$U-&>N|~qf@b~It8&1m4F2ZtsKq}RDd<2Rg@#ed3<_V1@@ffr zSLQp)Be4~qPA^EVJcLudBwH@Imy1xJ?W#>slre+1;ZNpMeaxhA;hpm{d&kT0(o|XI zqXIMW?TK=AID~Xp02B;NDPQ`CJ%7~v%AR8ZI|UB$5K?T8ti#Zj_~xCL(5#c#;p4_$ z@wX_8lfQ4GQ;Zw{c&YByB_M|Gt4e44nWzIJ@6P9Z>uk9tVdBf(#Tn$fpBIFq9Bo|0w6zlh&6L z9Ldf^ZN2Dkk{n%(-OKM|w*4s`h;n@jrx=og3_qcbj4c6sPTdyix57zO8=&W5h1-q3 z+f|%fOXXf*SiEJ>IUdI2#km@WesF^~w4tn-9=lNS?$AIeb0hd)Y6UIKSABmldfF%~ zXfNZGxT+0*Ez&}5dApRXH?_zDrLYY~gKt*~N5Se-R64!SEj+4A!EO%={R&sW!h1Ru z>+=k3Kc}<9&)y|P-zyv5-%dC+o)u%ud_AiYSpkjA)y%R)&I%vdkm!_y# zCkR&sW7`da{W=Ql?RIdAEUKUfRbBd`8a@caW!H7 zIElj|utOC@{X9~f^@d3w42?2p)Lhw%?V$de7}Z9S)o<3Wr|uP5dw2`XLSTYe;gl!n z`9X_pBOH(}IOrQ-!tGx~J_UTN_59I{wSa%wWcV`;k_j9OZ!C&U{n?wlubleAW+U3IPdbuBae}nZYe8d~mZa0@gS~O?3Z7qFJ;2@t_`Yk+lyA zj|+!Ifv%OCnJ@1vDVKVKGRQv@Wsc&gqs3~2q@ebM;%QxP)M{Sfh$fbn5YZ=t{Z1qD ziUls2-EA@=jzGFws}9*fKiO+GG(`_t&Xw^QaWK$k@Sru@$H4m5Bi0oQ<%d|`m+=gB zTPZCmCAgVMii&^^>(2uTHd8@E1%m>jRSJ#zQ4b*FR!(BtV*RjfzvZGW>2ihW=4FD^ zyHi;5!CyBpIcZ_vdfk{NFtPc}_V|xtOpB$zCXtS3u=>)eW64bqAg#|4u@g8P{=)mJ zU%YT*&KQ3GD>5gZ%Br}Zk%*a$O6KdV_@9{H9<|o}-nKJQh8%r|A7hT#rylxC+XYI9 zqorb3beud3)EF8vzQGx@%20$X?B&BAs5CLDm>V0mldZl?`0vgO5%|#5t$J(A59aN0 zwp|T96zz^x8sL*=F*Gx0Sl^8pB%KL8*baqw9C1%m9NDqR37`&^wX<9}JY)Jg3+<=k zO|j@{=a2j25S=Jat!dJ_-|s>xC&3ggC*|b-)m}C2S@V*aM!~{Q)`k0H&0c3J{^wXL z5d4m*$n*!ze*cGpsc+$wk#_1;yjf8dn&|NF#Z~@(@~pL#?Xfpzd)^^tzZe|*^FnAV z2gCe?X-+H}e8kXVekKI<{%%)I+HjtXCe~;cx9=#G9nH_pz?9vd^PqBVb(g2=T*~Hj zT8AmpEM!@*)rm4ZOWs$_JpH%0HN`BE=5QV_PI0Q(S#CBCy+J#qIH!edIrEo{DN87I zkG%_IE!=rbaPv{*7f_=avm;GTm+ZWk`DS2VV+{m9(M4H394ITXFvbi4W6##nMsvNs z&ysd|qjITvAn>T2yD)obBxx+Y;W71{nv9sYj~~&8R-s3D(xdF}=XAlCSL3zU?w|~X zGe0Ie^zN@8W^jbLCjoG{#-aQYcBJ8RYZ=DpH zq64C>dzo`5reB{|R5E{|_zV2a-W_E6&6_MUp~9v;)L zZ1KKFQ}P^CyK*j*O9UGkvqOeOw9Cc}h=4|L*D4l^MsJ-`iZh{B#CN zzjd?I#pJrysO@197NmTe?Bb8Sf0Eh#9NJF8D~7((9Q?_@t@#f3{MrmUs(V1`(m(t+ zJ<|m{SY?ye9tpx}+`B7z&qniFDpP0XuOTY8B%EwY<{tZ8J2tas7R*vA3web6&n&)D zu%BruD*2w~PY!%qTNc2E%^~uLe{&3&Irc>KuADQ^wu8*D;S>o!tLCP$IqF9%E4T1S z3`baW(3!^&E6RDVot_H^&JIn-uFhi1lZWz)nyov zG7ZqzSk-1pVPqNw1?gl*GAZ^oGmGOwlO75bhlnTtFDlHi4(>weLwj&9P1H>J!U5 zQ}+>vW>+7iPOc0i+07b(Fo-d>oi(a^4lJ#$3h<5~RFq%t99aq3%8;N8L2;$%WcZn~ z;fHORF#*Fbn;fWaYgj9gI5gSfamRlHR#S|P}zEKma1aD<4|bh}Dv z-|^lVm$1_X;h3P#&Hl(%G)-$W8nW%@z)d9F0z>SnN{fu}LJAKIHs@ld!ct&D8Da^s zlGu2M|A^9+LC;q=7Gd(PUkZ)I8>J^zqd@W{fF<59ZumPAM5p2xGCzr}znqsf@Lm`? zcehebm={uPh;ySfSL3d=5-0hk!c|;oi@^oXBAgTk-pk z3h+uZO6f%TT#iy-ne&CvLh9(-L5rTs^^JuQ&RMdSFi%cFdzKyz?|Uu_BhTbP zLK*w8`$)!z$|F^U8Ef*+$Wr%+A0aY|dU-vg+-0>{%PTYq5NLJaVh{2 zqg~}}QeJwP548VQqF%(vufQ0RH&8GjU)r5%8pL1lE?p4-Na~3HYhk%s{!V#;-qQNN zjQ8rljJHDbsaER$a`QCG&#KVyc(0%iFHKqSzd8iMzdD4F6*d4Z9q`5ft3&wzt3xPm zjQ}82D+08wQZE63!Zu;bYul=95O2UZ4O4zZ_J3snEYJ(c0Ydf_Xh;g`f$J)j03OBP zg6MJqTYPUG0123-Ez18Zb3p$qbCiaV0T6@y1bC~a`w_5&&Dg)O><$5zNGDUkq9OIB zwaC8G}VPJ6->ZJ0$^De5(Ma zVcP+a?ZlVV-iv;B)QqwC8J| z$YRa$;Ee~-3fqJO7q)*j#28E0zf@33lLvp;}@49%3M16&yPzfXgV0U@+dK*yp9h3vBXx^?i0Px6NfhC{H2 zPs4aAY-OKNcX#f^$g4!ZG>TzHiQ9@tc9b3V!%8a0Nf=MUe5hha`!?y5*hVuf{cc;j z5HH!?+VY|L!@cU?kL%4fUm=TkY+r5!o_&tc6QfNxSfx!tJ$kRF%3n?jQKf#OAW$5JtkPFWe)n3yyvM^;#X+ zCm8=+w_zAXTmpDO*vqJcP3YXtYKpA_YdbJZ((1oD7QyS-PtPq1xx69_q6%8{?^278 z@L(}NMZG)_wT^u4UiRqp+s7Ysh@~vvI+r1w!bu*ki;JPC5m&;gA|_qT(yX(fPn!7& zH?slN=(T5CkP=(QK|UY7QWRvXAwnIgDZ)7HvPKfv>YG>SHc6=5sNH{qONNDRpHA=* zX3~2~TlUXa@hTM!Idf^W+T6xzM_lGhv#o$OS*N#lG8#K zf$M^{weHKUsSfE1N2a3kt>A>cF#;WO8!+L<6V~3E*m1hQex6JXmhuQU;4jwDif`CR zyCPhR=q$x7T|sn_%6Ht0zv!K_eCknsS$1QX!tT6=F=$O#QGfRk`o7iT>!Aa4hr~6$ zvubF2?}TB;&pFI7$33c%o%pZ=$$c(}z>-nOc3~l!x(H3ebW#(e3?mTEqoS}v7-`}R95^nQ1#Nc-<8&7%&# z5xo?M;I`(>0ZGGc&MVq||A-%aFY>l}J_Xs+A^h}-ym!o9dq#<3iP>Iu3G9=#Pr_1B z&AMV9Q44H(7U(c(rDNOg5s6LF<}G#Qn)9Eg)}PVVia;38-$rlZd-O9~AJT8Wr82&8=K)-T5}CX}h8TQUk9%|AbO$tL&b zgC%{prnsm$F!8<*bUBQwaVAo-dB>KaUzL~%owzqHk}teorQ1*mZfTBH{l5kJ#b%Le_7EX^gJc<2h1jayOhH-l@nC!XD05{!tm|72KU8+YZUM_m+`i58|ofh9d*syYlRS?!cE z8^>IJ@Dp=D?K-ws+6*jFBX#U)(syiFl-K&?S+`S;Xqe2DoJl3Rk(ePr;zsbUMofuy zj(P9Y7O_~5#^}s@!32?jkdmz|IbR7uxO;`GkUiPdh=#oS>}XZw&$7*rWqz6VBnkmK zti!Lh+;>z&@zFlqwGd_|I}e!GC2?)EZNAnS?nemkKaSr#PhN~L1~tJXj~p&r%+ZYV zxT%ZV;fhhjenH{iahxyNOVIeD1RseG@|9r5w%YhoSZXSFWk6f|(Fx!s(V9E+xEXtY@Cg3Z*KzxyK2dX!wF2rR*O-MYu@_yMFPIbY zw+^J*(ggK9e$W>7vdJFQ#hL_Xul((!TDOTk`fdA`!q`fO*hMPj!hBQWMxk;~xJgc* zO9hWgS#s+~gRhE5&a)>GBLnay)94i8Y!Jn&X(k#X9CwZkLNV9dPO=n`{FaW zgSadQbypT<=q0-t*z0~fy`;kh&CKG%B7Moi7Ob-B8-Kza52{l0;Y&t?-GDh7A;X&u z3*RZ#GAeglj9e%p;vxA*1rCu8{!Jl1C&4LVyZNVkWflKHka*CeD0TwY=OBXFAU55)ibRRIB7-0b_B#`mU_4VYrS@6%xlDcJU= zVhauCSzO@$g3~+72Lvk=QHlLS*@jGI7U)p%oj2_Rny@H=Tg^zwRaqS}QKdC0AS5z+A z?|~WgT@gs8gA~~*g>##mi1_uzwA7%s`B>$-wK=RdLaiy5k5yd;8HFl9?7YEhm4+)< z+}~ibQH$WylastDrQ-eP_6E=Heh}Myx6HD&zg4r z{dBj1v{5+}z7!7Em3ahU=~HEtm4`)C-Py2`qs71L;K9ADe!uweC#5n^-D1nh`&sGJ;Z9l76Uw7tUs799yKvrpA;Nxx}Sj# z6Bs7DSH8|5-rTZfykyAA87CAb16}Pq>daVbGLH9IKh#X2neR<<&Y12VsJ<;9=nXCf zv7dR8M6u#m9j~J%uJd?cw1tCH1?<%hxq0}In(8e6pv5QQLxHTkc`xZ;VJ2gp0;SWV zdqPIEW0u_bqIzHWIik45CG6bw8$a3)dIy>CrFFZ($dl-V&us~96d#LiJKve#WOwM$ z9FzSrGZbSVufYy?u&pv{G{Z*Tsp@Y+o-X)kGyu;JGp6NXw9tScaV1j|@9^XM2}@Mh z690N3n#J&o;yk%zMZ}OPmcampjuf>&VFPuI#&;nH1P28h==6T{Sbwiy@!0HLf(fQ9 zc3qPz5=woLVT>$dp43A|_Dl{)o2ywXdUJ^WKulN*%Fj%bf!?6g2+xJK$D*C*YU&WO|ad)g835iYex2m3+bY+W4Sc$ zXV)FcHc*AQyr|@37(#-92Ynlu@Mf)EF$#WDPv6%7@SI#a2pKx_uZLnkjIJ zTp(xna|KJccgmxe>RjpH<@S??wQu`sGI$C5yNBnUL1NOxN;sYS(6-g%EttjzspK7B zt0j!T7`gp}sckQF8!z}?G2dp7PTDsRf0QIK&Q^FWo6UDh;gOZ|)|0Xm_UG?5XOWZ9 za&hPrCAPVLFq=OKkhj$dPx(KonxEJGfSE;;9Z+xCKu02F0-@sL!i`1KW`7=ZvG=#a z#LvK@X}&tCJalHH_?)=G%V{#n>NpyWvsUmS>$`ybUB@QYa_rM+EYBBaA)&HMy8ZI5 z5^g*prDD%diOFXVxjrlJlLD)RAf#2BYUh|RS*?!)@FB5Fpg%*T$Tz;{2>#B@Ud6>A8S;NY+RB(W2z@=pRS(_-uh*5Vs0U=a@ZPG?YNY%$nLVklxI!?=2AtJ-in1rWqV?!?{DJ1Td_jX54SwiW{2@8EW=TI_$r{G zO!tMS94g0U6Hq-H-mRDk{2qPp@xvV4*M^hpX@w~1-n5!A#>h2Z0<*e1ocXg}JPRpt zaOIc>bv1FN5JY0f(0Ec6JiLkM({@8>wNxtqVl!Uccw2F^5an zt^z01Pim$g(NR)iR?khs=taXAzl56x2&tqe&r>&tW2EzaGEqX?eP*$)udJ zTqvw4H~fcVpaKyzgRNX$Rv4t7&F%gao8FVp{fOYUbbZ7b$S99AnIYQCYwd03@IE8{ z!UVME`ELvKOqWbzm^&5bl@RFCk<3XG$ZPU0-w%@)R-eg#&B=6Y7-F>(vXcq7%yOw& zvDJ31uB*c)#6)qh{YmG96QO#pQeL+v7JpxfVAhn$oC)XIVs5!yk~wI?kU760xD;JP zT??m__VMp;nzp)Ih#)Y_Zz%iRm|dU$lvn?GpZCZd;{YLjR>5&pc28hVtkMt;bBiFk zbfH_V+qA|E!xPg?*HaxaLfL^`kBI#AT=Pp>s`=yD8^!k{YPYA9 z>hIYyg#GEd?=1+#1tDRA?`Go_W@Vtvvn|ch8BJQ6O_M@~5g^p2KBq2gCj@2v+js7t zDJjaIzox1+Wl}h^CSTK?Ir-$Oy=WbO-wL|cP`=l%M8E?esFEAGAeDlz62U7G^Z7?q zKZb1Ve;dO8%app*WB|#m4BAToGVvdQY*=B5`WtW@15!_*3tJ#v2ioF!lic(HR}avwP6q!i^zh8fLoD^xeGY8?7DoUPgPI9XUzeYLiVx;( zzu?Kn!5VC}>JyzV%fZb`u7!dR3y zDN6dETCe#^Wm{GEH6UZDGza^}wqO(an#-dhE_(xT_HWXp=o>JAgEyUyK$crj@c^-R55P@9 zqeMdosIzq->MVanP*T&#E6^YjW54Q4_|)F_3h~oU6*_<|ex3!0R050)U`b%XM+Vv> zr+9l|dcZ#wlDBE|Gfg0XMcUPXz!LZ%pdS>50{~FLF97;37g_^=q7+S_zeTvP08qks zQ(y@7D+K~pP-^xnH33rx2y%iv)f)x=2>+E`BcNZtrXLanhojkx6lP4k6B$s=Zb12q zwJ|5Ohli8?d*yMs>0q7GgH_=~%0a|>C;#(W{c*|c;e)tFb|$qVO*3^J6TfrcQcw_q zRnQ0fe3B$d#}oJO{CH~LeetFac30;pzs0bmxZ9rUN0T?BCp`8J$l?mo(GrqxTw1L% zMU5KFK~r=O$~j`@gB#B?eAfUek1I9tQA zL_+xxBd&adg*0P5h<6Xc%isT6H|4RO-;phEufsru%>m>hyiKQzj|6k2-J=3C> zKmYWB0ciVX-ud(tV-M{eRy3N*%+SoT-NS~j`->(RN|QGHV;i>fU>#Vq$;J{Tu#+w2 z?9H}H>D$;hJLWR00Z^XweY42a;TUD@3Su&zvHSOOr>j1gFV z%6)tD`yzplM1XTeFtq?=Rqq3}3l+m_02C6OfbD!G!o0wCzM{c_#n$V#G%C&>8Ogl1BuT6tg$K5FQDn2}l z%WD)@aaD}=QjK{cV*RXr^@PJ9Vp=-~Z6<_LJ#O$?+mqUE!PmHhlnne%#bR&K-Bmo; z!^&xeZ3m+DY7Odi>MB#b%&2FGuJA^cJG3t)mZ+Q!@fS{S&gZ40EEmMswed_6HGv{f z`&>Ql*T<|gmPny`>n{jdiSByvKj>b9c7-^Zj;)lE|KbgB;`OX`i}MJ-gf8mC`-9%U9? z@%=Vy(#MQ5RtI=--}{kJ$SxzC5AqG%@|(^0GpNDbArLeoI$`B`*s+4F)x@Yj7{5Xs z@2L`i=Xq4C4oIUwL2el;v03?d^m zh?gC~Q-{DQoW3TbH;DJ�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 AF8}}l diff --git a/apps/docs/public/images/n8n/workflow-vacation.avif b/apps/docs/public/images/n8n/workflow-vacation.avif index 3f37ce08347ffd2848b661418b9a5789596be3cd..4553e63e446c16c486872008462297f1fea5d1d6 100644 GIT binary patch literal 42311 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

w-UkKLoYr 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 K^xyq^68HroP4dbB diff --git a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.pdb b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.pdb index eedaeec05723316bce297ab29959aeffb20961b7..d62b3868ee302c5749d575a78cffab4a94dfcd1b 100644 GIT binary patch literal 71812 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%0DJ+|NCdA8z!&d~u@ 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 oY=DvFnwaCEkxEB(GZkAG@-JIRF3v diff --git a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.sourcelink.json b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.sourcelink.json index 929a9980..f669f374 100644 --- a/sdk/csharp/generated/obj/Debug/net8.0/Pachca.sourcelink.json +++ b/sdk/csharp/generated/obj/Debug/net8.0/Pachca.sourcelink.json @@ -1 +1 @@ -{"documents":{"/home/runner/work/openapi/openapi/*":"https://raw.githubusercontent.com/pachca/openapi/9afa2fc4504fb25202c414ae42418737b6da4e0f/*"}} \ No newline at end of file +{"documents":{"/Users/andrewlukin/Documents/openapi/*":"https://raw.githubusercontent.com/pachca/openapi/a15ad39036f4480e143b58e9993369b3756f5aa1/*"}} \ No newline at end of file diff --git a/sdk/csharp/generated/obj/Debug/net8.0/ref/Pachca.dll b/sdk/csharp/generated/obj/Debug/net8.0/ref/Pachca.dll index ce7bcef20a0d960c920d8ebdc980f9173e561406..fe96e21c897055244c58d75c4ae02a0d936b244a 100644 GIT binary patch literal 98304 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 literal 97792 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⪼;~UnI#N{-zD*(S0KN0K~(D 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 DX|mj) literal 25186 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 diff --git a/apps/docs/public/index.md b/apps/docs/public/index.md index 515f55f0..e398e47a 100644 --- a/apps/docs/public/index.md +++ b/apps/docs/public/index.md @@ -8,6 +8,7 @@ REST API Пачки позволяет автоматизировать рабо - [Модели API](/api/models) - [CLI](/guides/cli) - [SDK](/guides/sdk/overview) +- [n8n](/guides/n8n/overview) **Отправка сообщения** diff --git a/apps/docs/public/llms-full.txt b/apps/docs/public/llms-full.txt index 2b7742dc..552352b0 100644 --- a/apps/docs/public/llms-full.txt +++ b/apps/docs/public/llms-full.txt @@ -11,41 +11,41 @@ - [Быстрый старт](#быстрый-старт) - [AI агенты](#ai-агенты) - [CLI](#cli) -- [Обзор](#обзор) -- [TypeScript](#typescript) -- [Python](#python) -- [Go](#go) -- [Kotlin](#kotlin) -- [Swift](#swift) -- [C#](#c) +- [SDK: Обзор](#sdk:-обзор) +- [SDK: TypeScript](#sdk:-typescript) +- [SDK: Python](#sdk:-python) +- [SDK: Go](#sdk:-go) +- [SDK: Kotlin](#sdk:-kotlin) +- [SDK: Swift](#sdk:-swift) +- [SDK: C#](#sdk:-c) - [Сценарии](#сценарии) - [Боты](#боты) - [Входящие вебхуки](#входящие-вебхуки) - [Исходящие вебхуки](#исходящие-вебхуки) - [Кнопки в сообщениях](#кнопки-в-сообщениях) -- [Обзор](#обзор) -- [Блоки представления](#блоки-представления) -- [Обработка форм](#обработка-форм) +- [Формы: Обзор](#формы:-обзор) +- [Формы: Блоки представления](#формы:-блоки-представления) +- [Формы: Обработка форм](#формы:-обработка-форм) - [Разворачивание ссылок](#разворачивание-ссылок) - [Экспорт сообщений](#экспорт-сообщений) - [DLP-система](#dlp-система) - [Журнал аудита событий](#журнал-аудита-событий) -- [Обзор](#обзор) -- [Настройка](#настройка) -- [Ресурсы и операции](#ресурсы-и-операции) -- [Триггер](#триггер) -- [Примеры workflow](#примеры-workflow) -- [Продвинутые функции](#продвинутые-функции) -- [Устранение ошибок](#устранение-ошибок) -- [Миграция с v1](#миграция-с-v1) +- [n8n: Обзор](#n8n:-обзор) +- [n8n: Начало работы](#n8n:-начало-работы) +- [n8n: Ресурсы и операции](#n8n:-ресурсы-и-операции) +- [n8n: Триггер](#n8n:-триггер) +- [n8n: Примеры workflow](#n8n:-примеры-workflow) +- [n8n: Продвинутые функции](#n8n:-продвинутые-функции) +- [n8n: Устранение ошибок](#n8n:-устранение-ошибок) +- [n8n: Миграция с v1](#n8n:-миграция-с-v1) - [Albato](#albato) - [Последние обновления](#последние-обновления) -- [Авторизация](#авторизация) -- [Запросы и ответы](#запросы-и-ответы) -- [Пагинация](#пагинация) -- [Загрузка файлов](#загрузка-файлов) -- [Ошибки и лимиты](#ошибки-и-лимиты) -- [Модели](#модели) +- [Основы API: Авторизация](#основы-api:-авторизация) +- [Основы API: Запросы и ответы](#основы-api:-запросы-и-ответы) +- [Основы API: Пагинация](#основы-api:-пагинация) +- [Основы API: Загрузка файлов](#основы-api:-загрузка-файлов) +- [Основы API: Ошибки и лимиты](#основы-api:-ошибки-и-лимиты) +- [Основы API: Модели](#основы-api:-модели) ### API Методы - [Common](#api-common) @@ -149,6 +149,7 @@ REST API Пачки позволяет автоматизировать рабо - [Модели API](/api/models) - [CLI](/guides/cli) - [SDK](/guides/sdk/overview) +- [n8n](/guides/n8n/overview) **Отправка сообщения** @@ -5647,7 +5648,7 @@ curl "https://api.pachca.com/api/shared/v1/audit_events?start_time=2025-05-01T00 --- -# Настройка +# Начало работы ## Установка @@ -5705,7 +5706,10 @@ curl "https://api.pachca.com/api/shared/v1/audit_events?start_time=2025-05-01T00 3. Следовать README-инструкции на [GitHub](https://github.com/pachca/openapi/tree/main/integrations/n8n) - ### Шаг 3. Создание Credentials +## Настройка Credentials + + + ### Шаг 1. Создание Credentials Credentials — данные для авторизации. Перейдите в **Credentials** и нажмите **Add Credential**. @@ -5734,7 +5738,7 @@ Credentials — данные для авторизации. Перейдите *Форма Pachca API Credentials* - ### Шаг 4. Где получить токен + ### Шаг 2. Где получить токен В Пачке доступны два типа токенов: @@ -5753,7 +5757,10 @@ Credentials — данные для авторизации. Перейдите > Если тест не проходит — проверьте правильность токена и доступность API. Подробнее — в разделе [Устранение ошибок](/guides/n8n/troubleshooting). - ### Шаг 5. Создание workflow +## Первый workflow + + + ### Шаг 1. Создание workflow Workflow — визуальный редактор, в котором выстраиваются цепочки триггеров и действий. Создайте новый workflow и добавьте триггер **Manual Trigger** для ручного запуска. @@ -5771,7 +5778,7 @@ Workflow — визуальный редактор, в котором выстр *Pachca на канвасе* - ### Шаг 6. Настройка и запуск + ### Шаг 2. Настройка и запуск Дважды кликните на узел **Pachca** и настройте: diff --git a/apps/docs/public/llms.txt b/apps/docs/public/llms.txt index 55ae6fc0..4a39c6a5 100644 --- a/apps/docs/public/llms.txt +++ b/apps/docs/public/llms.txt @@ -22,41 +22,41 @@ pachca guide "отправить сообщение" # CLI guide for humans - [Быстрый старт](https://dev.pachca.com/guides/quickstart.md): Первый запрос к API Пачки за 5 минут - [AI агенты](https://dev.pachca.com/guides/ai-agents.md): Как Пачка работает с AI-агентами и какие ресурсы доступны для интеграции - [CLI](https://dev.pachca.com/guides/cli.md): Управление Пачкой из терминала — все API-методы одной командой -- [Обзор](https://dev.pachca.com/guides/sdk/overview.md): Типизированные клиентские библиотеки и генератор для Pachca API -- [TypeScript](https://dev.pachca.com/guides/sdk/typescript.md): Типизированный клиент для Pachca API на TypeScript с автодополнением и автопагинацией -- [Python](https://dev.pachca.com/guides/sdk/python.md): Асинхронный типизированный клиент для Pachca API на Python с httpx -- [Go](https://dev.pachca.com/guides/sdk/go.md): Типизированный клиент для Pachca API на Go с контекстами и автопагинацией -- [Kotlin](https://dev.pachca.com/guides/sdk/kotlin.md): Типизированный клиент для Pachca API на Kotlin с корутинами и Ktor -- [Swift](https://dev.pachca.com/guides/sdk/swift.md): Типизированный клиент для Pachca API на Swift с async/await и Codable -- [C#](https://dev.pachca.com/guides/sdk/csharp.md): Типизированный клиент для Pachca API на C# с async/await и автопагинацией +- [SDK: Обзор](https://dev.pachca.com/guides/sdk/overview.md): Типизированные клиентские библиотеки и генератор для Pachca API +- [SDK: TypeScript](https://dev.pachca.com/guides/sdk/typescript.md): Типизированный клиент для Pachca API на TypeScript с автодополнением и автопагинацией +- [SDK: Python](https://dev.pachca.com/guides/sdk/python.md): Асинхронный типизированный клиент для Pachca API на Python с httpx +- [SDK: Go](https://dev.pachca.com/guides/sdk/go.md): Типизированный клиент для Pachca API на Go с контекстами и автопагинацией +- [SDK: Kotlin](https://dev.pachca.com/guides/sdk/kotlin.md): Типизированный клиент для Pachca API на Kotlin с корутинами и Ktor +- [SDK: Swift](https://dev.pachca.com/guides/sdk/swift.md): Типизированный клиент для Pachca API на Swift с async/await и Codable +- [SDK: C#](https://dev.pachca.com/guides/sdk/csharp.md): Типизированный клиент для Pachca API на C# с async/await и автопагинацией - [Сценарии](https://dev.pachca.com/guides/workflows.md): Пошаговые сценарии для типичных задач с API - [Боты](https://dev.pachca.com/guides/bots.md): Создание, настройка и возможности ботов в Пачке - [Входящие вебхуки](https://dev.pachca.com/guides/incoming-webhooks.md): Отправка сообщений от имени бота без использования API - [Исходящие вебхуки](https://dev.pachca.com/guides/webhook.md): Получение уведомлений о событиях в реальном времени - [Кнопки в сообщениях](https://dev.pachca.com/guides/buttons.md): Интерактивные кнопки в сообщениях ботов для навигации и обработки действий -- [Обзор](https://dev.pachca.com/guides/forms/overview.md): Модальные формы ботов: поля ввода, жизненный цикл и валидация -- [Блоки представления](https://dev.pachca.com/guides/forms/blocks.md): 10 типов блоков для построения форм в Пачке -- [Обработка форм](https://dev.pachca.com/guides/forms/handling.md): Открытие представлений, получение результатов и валидация +- [Формы: Обзор](https://dev.pachca.com/guides/forms/overview.md): Модальные формы ботов: поля ввода, жизненный цикл и валидация +- [Формы: Блоки представления](https://dev.pachca.com/guides/forms/blocks.md): 10 типов блоков для построения форм в Пачке +- [Формы: Обработка форм](https://dev.pachca.com/guides/forms/handling.md): Открытие представлений, получение результатов и валидация - [Разворачивание ссылок](https://dev.pachca.com/guides/link-previews.md): Создание превью ссылок из внутренних сервисов прямо в чате - [Экспорт сообщений](https://dev.pachca.com/guides/export.md): Экспорт сообщений из чатов: запрос, скачивание и структура архива - [DLP-система](https://dev.pachca.com/guides/dlp.md): Создание правил DLP: условия, контексты и действия - [Журнал аудита событий](https://dev.pachca.com/guides/audit-events.md): Журнал аудита: типы событий, фильтрация и примеры запросов -- [Обзор](https://dev.pachca.com/guides/n8n/overview.md): Автоматизации в Пачке через платформу n8n — 18 ресурсов, триггер, AI-агент -- [Настройка](https://dev.pachca.com/guides/n8n/setup.md): Установка n8n, расширения Пачки, настройка Credentials и первый workflow -- [Ресурсы и операции](https://dev.pachca.com/guides/n8n/resources.md): Все 18 ресурсов и более 60 операций расширения Пачки для n8n -- [Триггер](https://dev.pachca.com/guides/n8n/trigger.md): Pachca Trigger: 16 типов событий, авторегистрация вебхука, проверка подписи -- [Примеры workflow](https://dev.pachca.com/guides/n8n/workflows.md): Готовые сценарии автоматизации Пачки в n8n: приветствие, пересылка, задачи, согласование, мониторинг, заявки на отпуск -- [Продвинутые функции](https://dev.pachca.com/guides/n8n/advanced.md): Экспорт сообщений, загрузка файлов, кнопки, формы, AI-агент, разворачивание ссылок, журнал безопасности -- [Устранение ошибок](https://dev.pachca.com/guides/n8n/troubleshooting.md): Частые ошибки при работе с Пачкой в n8n: неверный токен, 403, 429, вебхук не приходит -- [Миграция с v1](https://dev.pachca.com/guides/n8n/migration.md): Обновление с v1 на v2: таблицы переименований, новые ресурсы, полная обратная совместимость +- [n8n: Обзор](https://dev.pachca.com/guides/n8n/overview.md): Автоматизации в Пачке через платформу n8n — 18 ресурсов, триггер, AI-агент +- [n8n: Начало работы](https://dev.pachca.com/guides/n8n/setup.md): Установка n8n, расширения Пачки, настройка Credentials и первый workflow +- [n8n: Ресурсы и операции](https://dev.pachca.com/guides/n8n/resources.md): Все 18 ресурсов и более 60 операций расширения Пачки для n8n +- [n8n: Триггер](https://dev.pachca.com/guides/n8n/trigger.md): Pachca Trigger: 16 типов событий, авторегистрация вебхука, проверка подписи +- [n8n: Примеры workflow](https://dev.pachca.com/guides/n8n/workflows.md): Готовые сценарии автоматизации Пачки в n8n: приветствие, пересылка, задачи, согласование, мониторинг, заявки на отпуск +- [n8n: Продвинутые функции](https://dev.pachca.com/guides/n8n/advanced.md): Экспорт сообщений, загрузка файлов, кнопки, формы, AI-агент, разворачивание ссылок, журнал безопасности +- [n8n: Устранение ошибок](https://dev.pachca.com/guides/n8n/troubleshooting.md): Частые ошибки при работе с Пачкой в n8n: неверный токен, 403, 429, вебхук не приходит +- [n8n: Миграция с v1](https://dev.pachca.com/guides/n8n/migration.md): Обновление с v1 на v2: таблицы переименований, новые ресурсы, полная обратная совместимость - [Albato](https://dev.pachca.com/guides/albato.md): Интеграция Пачки с Albato — подключение сотен сервисов без кода - [Последние обновления](https://dev.pachca.com/updates.md): История изменений и новые возможности API -- [Авторизация](https://dev.pachca.com/api/authorization.md): Типы токенов, скоупы и настройка доступа к API -- [Запросы и ответы](https://dev.pachca.com/api/requests-responses.md): Формат запросов и ответов, тестирование API -- [Пагинация](https://dev.pachca.com/api/pagination.md): Cursor-based pagination в API Пачки -- [Загрузка файлов](https://dev.pachca.com/api/file-uploads.md): Трёхшаговый процесс загрузки файлов через presigned URL -- [Ошибки и лимиты](https://dev.pachca.com/api/errors.md): Коды ошибок HTTP и rate limits -- [Модели](https://dev.pachca.com/api/models.md): Справочник всех моделей данных Pachca API — объекты, возвращаемые в ответах методов. +- [Основы API: Авторизация](https://dev.pachca.com/api/authorization.md): Типы токенов, скоупы и настройка доступа к API +- [Основы API: Запросы и ответы](https://dev.pachca.com/api/requests-responses.md): Формат запросов и ответов, тестирование API +- [Основы API: Пагинация](https://dev.pachca.com/api/pagination.md): Cursor-based pagination в API Пачки +- [Основы API: Загрузка файлов](https://dev.pachca.com/api/file-uploads.md): Трёхшаговый процесс загрузки файлов через presigned URL +- [Основы API: Ошибки и лимиты](https://dev.pachca.com/api/errors.md): Коды ошибок HTTP и rate limits +- [Основы API: Модели](https://dev.pachca.com/api/models.md): Справочник всех моделей данных Pachca API — объекты, возвращаемые в ответах методов. ## Common - [Экспорт сообщений](https://dev.pachca.com/api/common/request-export.md): POST /chats/exports diff --git a/apps/docs/public/skill.md b/apps/docs/public/skill.md index 0d9d4003..9a08ab1e 100644 --- a/apps/docs/public/skill.md +++ b/apps/docs/public/skill.md @@ -222,41 +222,41 @@ Detailed documentation on specific topics is available at: - [Быстрый старт](https://dev.pachca.com/guides/quickstart) — Первый запрос к API Пачки за 5 минут - [AI агенты](https://dev.pachca.com/guides/ai-agents) — Как Пачка работает с AI-агентами и какие ресурсы доступны для интеграции - [CLI](https://dev.pachca.com/guides/cli) — Управление Пачкой из терминала — все API-методы одной командой -- [Обзор](https://dev.pachca.com/guides/sdk/overview) — Типизированные клиентские библиотеки и генератор для Pachca API -- [TypeScript](https://dev.pachca.com/guides/sdk/typescript) — Типизированный клиент для Pachca API на TypeScript с автодополнением и автопагинацией -- [Python](https://dev.pachca.com/guides/sdk/python) — Асинхронный типизированный клиент для Pachca API на Python с httpx -- [Go](https://dev.pachca.com/guides/sdk/go) — Типизированный клиент для Pachca API на Go с контекстами и автопагинацией -- [Kotlin](https://dev.pachca.com/guides/sdk/kotlin) — Типизированный клиент для Pachca API на Kotlin с корутинами и Ktor -- [Swift](https://dev.pachca.com/guides/sdk/swift) — Типизированный клиент для Pachca API на Swift с async/await и Codable -- [C#](https://dev.pachca.com/guides/sdk/csharp) — Типизированный клиент для Pachca API на C# с async/await и автопагинацией +- [SDK: Обзор](https://dev.pachca.com/guides/sdk/overview) — Типизированные клиентские библиотеки и генератор для Pachca API +- [SDK: TypeScript](https://dev.pachca.com/guides/sdk/typescript) — Типизированный клиент для Pachca API на TypeScript с автодополнением и автопагинацией +- [SDK: Python](https://dev.pachca.com/guides/sdk/python) — Асинхронный типизированный клиент для Pachca API на Python с httpx +- [SDK: Go](https://dev.pachca.com/guides/sdk/go) — Типизированный клиент для Pachca API на Go с контекстами и автопагинацией +- [SDK: Kotlin](https://dev.pachca.com/guides/sdk/kotlin) — Типизированный клиент для Pachca API на Kotlin с корутинами и Ktor +- [SDK: Swift](https://dev.pachca.com/guides/sdk/swift) — Типизированный клиент для Pachca API на Swift с async/await и Codable +- [SDK: C#](https://dev.pachca.com/guides/sdk/csharp) — Типизированный клиент для Pachca API на C# с async/await и автопагинацией - [Сценарии](https://dev.pachca.com/guides/workflows) — Пошаговые сценарии для типичных задач с API - [Боты](https://dev.pachca.com/guides/bots) — Создание, настройка и возможности ботов в Пачке - [Входящие вебхуки](https://dev.pachca.com/guides/incoming-webhooks) — Отправка сообщений от имени бота без использования API - [Исходящие вебхуки](https://dev.pachca.com/guides/webhook) — Получение уведомлений о событиях в реальном времени - [Кнопки в сообщениях](https://dev.pachca.com/guides/buttons) — Интерактивные кнопки в сообщениях ботов для навигации и обработки действий -- [Обзор](https://dev.pachca.com/guides/forms/overview) — Модальные формы ботов: поля ввода, жизненный цикл и валидация -- [Блоки представления](https://dev.pachca.com/guides/forms/blocks) — 10 типов блоков для построения форм в Пачке -- [Обработка форм](https://dev.pachca.com/guides/forms/handling) — Открытие представлений, получение результатов и валидация +- [Формы: Обзор](https://dev.pachca.com/guides/forms/overview) — Модальные формы ботов: поля ввода, жизненный цикл и валидация +- [Формы: Блоки представления](https://dev.pachca.com/guides/forms/blocks) — 10 типов блоков для построения форм в Пачке +- [Формы: Обработка форм](https://dev.pachca.com/guides/forms/handling) — Открытие представлений, получение результатов и валидация - [Разворачивание ссылок](https://dev.pachca.com/guides/link-previews) — Создание превью ссылок из внутренних сервисов прямо в чате - [Экспорт сообщений](https://dev.pachca.com/guides/export) — Экспорт сообщений из чатов: запрос, скачивание и структура архива - [DLP-система](https://dev.pachca.com/guides/dlp) — Создание правил DLP: условия, контексты и действия - [Журнал аудита событий](https://dev.pachca.com/guides/audit-events) — Журнал аудита: типы событий, фильтрация и примеры запросов -- [Обзор](https://dev.pachca.com/guides/n8n/overview) — Автоматизации в Пачке через платформу n8n — 18 ресурсов, триггер, AI-агент -- [Настройка](https://dev.pachca.com/guides/n8n/setup) — Установка n8n, расширения Пачки, настройка Credentials и первый workflow -- [Ресурсы и операции](https://dev.pachca.com/guides/n8n/resources) — Все 18 ресурсов и более 60 операций расширения Пачки для n8n -- [Триггер](https://dev.pachca.com/guides/n8n/trigger) — Pachca Trigger: 16 типов событий, авторегистрация вебхука, проверка подписи -- [Примеры workflow](https://dev.pachca.com/guides/n8n/workflows) — Готовые сценарии автоматизации Пачки в n8n: приветствие, пересылка, задачи, согласование, мониторинг, заявки на отпуск -- [Продвинутые функции](https://dev.pachca.com/guides/n8n/advanced) — Экспорт сообщений, загрузка файлов, кнопки, формы, AI-агент, разворачивание ссылок, журнал безопасности -- [Устранение ошибок](https://dev.pachca.com/guides/n8n/troubleshooting) — Частые ошибки при работе с Пачкой в n8n: неверный токен, 403, 429, вебхук не приходит -- [Миграция с v1](https://dev.pachca.com/guides/n8n/migration) — Обновление с v1 на v2: таблицы переименований, новые ресурсы, полная обратная совместимость +- [n8n: Обзор](https://dev.pachca.com/guides/n8n/overview) — Автоматизации в Пачке через платформу n8n — 18 ресурсов, триггер, AI-агент +- [n8n: Начало работы](https://dev.pachca.com/guides/n8n/setup) — Установка n8n, расширения Пачки, настройка Credentials и первый workflow +- [n8n: Ресурсы и операции](https://dev.pachca.com/guides/n8n/resources) — Все 18 ресурсов и более 60 операций расширения Пачки для n8n +- [n8n: Триггер](https://dev.pachca.com/guides/n8n/trigger) — Pachca Trigger: 16 типов событий, авторегистрация вебхука, проверка подписи +- [n8n: Примеры workflow](https://dev.pachca.com/guides/n8n/workflows) — Готовые сценарии автоматизации Пачки в n8n: приветствие, пересылка, задачи, согласование, мониторинг, заявки на отпуск +- [n8n: Продвинутые функции](https://dev.pachca.com/guides/n8n/advanced) — Экспорт сообщений, загрузка файлов, кнопки, формы, AI-агент, разворачивание ссылок, журнал безопасности +- [n8n: Устранение ошибок](https://dev.pachca.com/guides/n8n/troubleshooting) — Частые ошибки при работе с Пачкой в n8n: неверный токен, 403, 429, вебхук не приходит +- [n8n: Миграция с v1](https://dev.pachca.com/guides/n8n/migration) — Обновление с v1 на v2: таблицы переименований, новые ресурсы, полная обратная совместимость - [Albato](https://dev.pachca.com/guides/albato) — Интеграция Пачки с Albato — подключение сотен сервисов без кода - [Последние обновления](https://dev.pachca.com/updates) — История изменений и новые возможности API -- [Авторизация](https://dev.pachca.com/api/authorization) — Типы токенов, скоупы и настройка доступа к API -- [Запросы и ответы](https://dev.pachca.com/api/requests-responses) — Формат запросов и ответов, тестирование API -- [Пагинация](https://dev.pachca.com/api/pagination) — Cursor-based pagination в API Пачки -- [Загрузка файлов](https://dev.pachca.com/api/file-uploads) — Трёхшаговый процесс загрузки файлов через presigned URL -- [Ошибки и лимиты](https://dev.pachca.com/api/errors) — Коды ошибок HTTP и rate limits -- [Модели](https://dev.pachca.com/api/models) — Справочник всех моделей данных Pachca API — объекты, возвращаемые в ответах методов. +- [Основы API: Авторизация](https://dev.pachca.com/api/authorization) — Типы токенов, скоупы и настройка доступа к API +- [Основы API: Запросы и ответы](https://dev.pachca.com/api/requests-responses) — Формат запросов и ответов, тестирование API +- [Основы API: Пагинация](https://dev.pachca.com/api/pagination) — Cursor-based pagination в API Пачки +- [Основы API: Загрузка файлов](https://dev.pachca.com/api/file-uploads) — Трёхшаговый процесс загрузки файлов через presigned URL +- [Основы API: Ошибки и лимиты](https://dev.pachca.com/api/errors) — Коды ошибок HTTP и rate limits +- [Основы API: Модели](https://dev.pachca.com/api/models) — Справочник всех моделей данных Pachca API — объекты, возвращаемые в ответах методов. ## Modular Skills diff --git a/apps/docs/scripts/generate-llms.ts b/apps/docs/scripts/generate-llms.ts index 4c23e998..4ab9d115 100644 --- a/apps/docs/scripts/generate-llms.ts +++ b/apps/docs/scripts/generate-llms.ts @@ -50,7 +50,8 @@ function generateLlmsTxt(api: Awaited>) { content += '## Руководства\n'; for (const guide of guidePages) { const mdPath = guide.path === '/' ? '/.md' : `${guide.path}.md`; - content += `- [${guide.title}](${SITE_URL}${mdPath}): ${guide.description}\n`; + const displayTitle = guide.sectionTitle ? `${guide.sectionTitle}: ${guide.title}` : guide.title; + content += `- [${displayTitle}](${SITE_URL}${mdPath}): ${guide.description}\n`; } content += '\n'; @@ -131,11 +132,12 @@ async function generateLlmsFullTxt(api: Awaited> content += '## Содержание\n\n'; content += '### Руководства\n'; for (const guide of guidePages) { - const anchor = guide.title + const displayTitle = guide.sectionTitle ? `${guide.sectionTitle}: ${guide.title}` : guide.title; + const anchor = displayTitle .toLowerCase() .replace(/[#?&=]/g, '') .replace(/\s+/g, '-'); - content += `- [${guide.title}](#${anchor})\n`; + content += `- [${displayTitle}](#${anchor})\n`; } content += '\n'; @@ -397,7 +399,8 @@ Error response body: \`{ "errors": [{ "key": "field", "value": "description" }] let guides = '## Guides\n\nDetailed documentation on specific topics is available at:\n\n'; for (const guide of guidePages) { if (guide.path === '/') continue; - guides += `- [${guide.title}](${SITE_URL}${guide.path}) — ${guide.description}\n`; + const displayTitle = guide.sectionTitle ? `${guide.sectionTitle}: ${guide.title}` : guide.title; + guides += `- [${displayTitle}](${SITE_URL}${guide.path}) — ${guide.description}\n`; } return [ From 48f74fbb99b6972f39b2bc42656a4ab044449eda Mon Sep 17 00:00:00 2001 From: lookinway Date: Mon, 6 Apr 2026 23:50:12 +0300 Subject: [PATCH 25/37] fix(ci): skip isolated-vm native build with trustedDependencies isolated-vm (transitive dep of n8n-workflow) fails to compile on CI. It is only needed at n8n runtime, not for build/check/test. Setting trustedDependencies to empty array prevents all lifecycle scripts from running during bun install. --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c4f50482..6d08e805 100644 --- a/package.json +++ b/package.json @@ -12,5 +12,6 @@ "devDependencies": { "turbo": "^2.8.1", "@playwright/test": "^1.50.0" - } + }, + "trustedDependencies": [] } From a9eb7ad50aa1f866f13afc44e73e020e52498748 Mon Sep 17 00:00:00 2001 From: lookinway Date: Mon, 6 Apr 2026 23:50:48 +0300 Subject: [PATCH 26/37] fix(ci): allow lifecycle scripts for esbuild, sharp, unrs-resolver trustedDependencies: [] blocked all postinstall scripts including esbuild (platform binary), sharp (image processing), and unrs-resolver (eslint). Whitelist these while still blocking isolated-vm native compilation. --- package.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 6d08e805..4bd69f87 100644 --- a/package.json +++ b/package.json @@ -13,5 +13,10 @@ "turbo": "^2.8.1", "@playwright/test": "^1.50.0" }, - "trustedDependencies": [] + "trustedDependencies": [ + "esbuild", + "sharp", + "unrs-resolver", + "vue-demi" + ] } From 967179d82113732df6e5307d077e1da23a43a99d Mon Sep 17 00:00:00 2001 From: lookinway Date: Mon, 6 Apr 2026 23:56:29 +0300 Subject: [PATCH 27/37] =?UTF-8?q?fix(n8n):=20use=20formatDisplayName=20for?= =?UTF-8?q?=20enum=20options=20(Id=20=E2=86=92=20ID)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit generateEnumOptions used its own title-case logic which produced 'Id' instead of 'ID'. n8n linter requires uppercase abbreviations. Now reuses formatDisplayName which already handles Id→ID, Url→URL. --- integrations/n8n/scripts/generate-n8n.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/n8n/scripts/generate-n8n.ts b/integrations/n8n/scripts/generate-n8n.ts index c3f158fd..98ced762 100644 --- a/integrations/n8n/scripts/generate-n8n.ts +++ b/integrations/n8n/scripts/generate-n8n.ts @@ -745,7 +745,7 @@ function generateEnumOptions(values: unknown[], enumDescriptions?: Record { const val = String(v); - const name = val.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase()); + const name = formatDisplayName(val); const desc = enumDescriptions?.[val]; if (desc && desc.toLowerCase() !== name.toLowerCase()) { return { name, val, str: `{ name: ${quote(name)}, value: ${quote(val)}, description: ${quote(desc)} }` }; From 5e9d945eb8fbe6c17bae94f5098df4e1d41df7c0 Mon Sep 17 00:00:00 2001 From: lookinway Date: Tue, 7 Apr 2026 00:00:26 +0300 Subject: [PATCH 28/37] fix(ci): use bun run tsc instead of n8n-node build n8n-node build detects npm as package manager and runs npx tsc, which fails because typescript is not hoisted to root node_modules. Direct bun run tsc resolves tsc from the local n8n workspace. --- .github/workflows/n8n.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/n8n.yml b/.github/workflows/n8n.yml index f8fc7791..c58107d9 100644 --- a/.github/workflows/n8n.yml +++ b/.github/workflows/n8n.yml @@ -76,7 +76,7 @@ jobs: - name: Build n8n node working-directory: integrations/n8n - run: bun run build + run: bun run tsc publish: if: github.event_name == 'push' @@ -159,7 +159,7 @@ jobs: - name: Build n8n node if: steps.changes.outputs.changed == 'true' working-directory: integrations/n8n - run: bun run build + run: bun run tsc - name: Scan community package if: steps.changes.outputs.changed == 'true' From 440308ec5b079582da2114addc6c42060d969c2b Mon Sep 17 00:00:00 2001 From: lookinway Date: Tue, 7 Apr 2026 00:01:01 +0300 Subject: [PATCH 29/37] fix(ci): copy static assets (icons) after tsc build n8n-node build also copies *.png and *.svg into dist/. Since we replaced it with direct tsc, need to copy assets manually for scan-community-package and npm publish. --- .github/workflows/n8n.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/n8n.yml b/.github/workflows/n8n.yml index c58107d9..063c68b3 100644 --- a/.github/workflows/n8n.yml +++ b/.github/workflows/n8n.yml @@ -76,7 +76,9 @@ jobs: - name: Build n8n node working-directory: integrations/n8n - run: bun run tsc + run: | + bun run tsc + find . \( -name '*.png' -o -name '*.svg' \) -not -path './dist/*' -not -path './node_modules/*' | while read f; do mkdir -p "dist/$(dirname "$f")" && cp "$f" "dist/$f"; done publish: if: github.event_name == 'push' @@ -159,7 +161,9 @@ jobs: - name: Build n8n node if: steps.changes.outputs.changed == 'true' working-directory: integrations/n8n - run: bun run tsc + run: | + bun run tsc + find . \( -name '*.png' -o -name '*.svg' \) -not -path './dist/*' -not -path './node_modules/*' | while read f; do mkdir -p "dist/$(dirname "$f")" && cp "$f" "dist/$f"; done - name: Scan community package if: steps.changes.outputs.changed == 'true' From ce10487964aa4db82cb9d54cc2ffa65b78a9910b Mon Sep 17 00:00:00 2001 From: lookinway Date: Tue, 7 Apr 2026 00:02:18 +0300 Subject: [PATCH 30/37] fix(ci): scope asset copy to nodes/icons/credentials only Avoid copying e2e/screenshots into dist. Only icons from nodes/, icons/, and credentials/ directories are needed for the npm package. --- .github/workflows/n8n.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/n8n.yml b/.github/workflows/n8n.yml index 063c68b3..97f4dcfc 100644 --- a/.github/workflows/n8n.yml +++ b/.github/workflows/n8n.yml @@ -78,7 +78,7 @@ jobs: working-directory: integrations/n8n run: | bun run tsc - find . \( -name '*.png' -o -name '*.svg' \) -not -path './dist/*' -not -path './node_modules/*' | while read f; do mkdir -p "dist/$(dirname "$f")" && cp "$f" "dist/$f"; done + find nodes icons credentials \( -name '*.png' -o -name '*.svg' \) | while read f; do mkdir -p "dist/$(dirname "$f")" && cp "$f" "dist/$f"; done publish: if: github.event_name == 'push' @@ -163,7 +163,7 @@ jobs: working-directory: integrations/n8n run: | bun run tsc - find . \( -name '*.png' -o -name '*.svg' \) -not -path './dist/*' -not -path './node_modules/*' | while read f; do mkdir -p "dist/$(dirname "$f")" && cp "$f" "dist/$f"; done + find nodes icons credentials \( -name '*.png' -o -name '*.svg' \) | while read f; do mkdir -p "dist/$(dirname "$f")" && cp "$f" "dist/$f"; done - name: Scan community package if: steps.changes.outputs.changed == 'true' From 4166b5d22397c725a7bd1eb18e917a020f08b445 Mon Sep 17 00:00:00 2001 From: lookinway Date: Tue, 7 Apr 2026 00:08:35 +0300 Subject: [PATCH 31/37] fix(cli): correct changelog version to 2026.4.0 Auto-versioning from npm will assign 2026.4.0 (no 2026.4.x published yet). Changelog had 2026.4.1 which would mismatch. --- packages/cli/CHANGELOG.md | 2 +- packages/cli/src/data/changelog.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 8cbc3ea3..76371ece 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 2026.4.1 (6 апреля 2026) +## 2026.4.0 (6 апреля 2026) - **Добавлено** (profile update-avatar): Загрузка аватара профиля - **Добавлено** (profile delete-avatar): Удаление аватара профиля diff --git a/packages/cli/src/data/changelog.json b/packages/cli/src/data/changelog.json index 04224b53..437cc543 100644 --- a/packages/cli/src/data/changelog.json +++ b/packages/cli/src/data/changelog.json @@ -1,6 +1,6 @@ [ { - "version": "2026.4.1", + "version": "2026.4.0", "date": "6 апреля 2026", "changes": [ { From 685e057adc48ab5f1708559cd9fdda5535083334 Mon Sep 17 00:00:00 2001 From: aenadgrleey Date: Mon, 6 Apr 2026 23:28:01 +0200 Subject: [PATCH 32/37] feat(generator): add native datetime support for Python and Kotlin Python maps date-time to `datetime` with fromisoformat/isoformat serialization. Kotlin maps date-time to `OffsetDateTime` with custom KSerializer. Swift/C# simplified to treat date-only as plain strings. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/generator/src/lang/csharp.ts | 5 +-- packages/generator/src/lang/kotlin.ts | 33 ++++++++++++++--- packages/generator/src/lang/python.ts | 35 +++++++++++++++++-- packages/generator/src/lang/swift.ts | 8 +---- .../snapshots/swift/Utils.swift | 2 -- .../allof-sibling/snapshots/kt/Models.kt | 17 +++++++-- .../allof-sibling/snapshots/py/models.py | 5 +-- .../snapshots/swift/Models.swift | 8 ++--- .../allof-sibling/snapshots/swift/Utils.swift | 2 -- .../array-no-brackets/snapshots/py/utils.py | 13 +++++++ .../snapshots/swift/Utils.swift | 2 -- .../circular-ref/snapshots/swift/Utils.swift | 2 -- .../tests/crud/snapshots/kt/Models.kt | 15 +++++++- .../tests/crud/snapshots/kt/examples.json | 6 ++-- .../tests/crud/snapshots/py/examples.json | 6 ++-- .../tests/crud/snapshots/py/models.py | 3 +- .../tests/crud/snapshots/py/utils.py | 13 +++++++ .../tests/crud/snapshots/swift/Models.swift | 6 ++-- .../tests/crud/snapshots/swift/Utils.swift | 2 -- .../tests/date-format/snapshots/cs/Client.cs | 4 +-- .../tests/date-format/snapshots/cs/Models.cs | 8 ++--- .../date-format/snapshots/cs/examples.json | 6 ++-- .../tests/date-format/snapshots/kt/Client.kt | 2 +- .../tests/date-format/snapshots/kt/Models.kt | 17 +++++++-- .../date-format/snapshots/kt/examples.json | 4 +-- .../tests/date-format/snapshots/py/client.py | 2 +- .../date-format/snapshots/py/examples.json | 4 +-- .../tests/date-format/snapshots/py/models.py | 7 ++-- .../tests/date-format/snapshots/py/utils.py | 13 +++++++ .../date-format/snapshots/swift/Client.swift | 2 +- .../date-format/snapshots/swift/Models.swift | 8 ++--- .../date-format/snapshots/swift/Utils.swift | 2 -- .../deep-nesting/snapshots/swift/Utils.swift | 2 -- .../tests/edge-cases/snapshots/py/utils.py | 13 +++++++ .../edge-cases/snapshots/swift/Utils.swift | 2 -- .../tests/enums/snapshots/swift/Utils.swift | 2 -- .../tests/models/snapshots/cs/Models.cs | 2 +- .../tests/models/snapshots/kt/Models.kt | 17 +++++++-- .../tests/models/snapshots/py/models.py | 5 +-- .../tests/models/snapshots/swift/Models.swift | 4 +-- .../tests/models/snapshots/swift/Utils.swift | 2 -- .../multi-path-params/snapshots/py/utils.py | 13 +++++++ .../snapshots/swift/Utils.swift | 2 -- .../nullable-ref/snapshots/swift/Utils.swift | 2 -- .../tests/oneof/snapshots/swift/Utils.swift | 2 -- .../tests/patch/snapshots/py/utils.py | 13 +++++++ .../tests/patch/snapshots/swift/Utils.swift | 2 -- .../tests/record/snapshots/py/utils.py | 13 +++++++ .../tests/record/snapshots/swift/Utils.swift | 2 -- .../tests/redirect/snapshots/py/utils.py | 13 +++++++ .../redirect/snapshots/swift/Utils.swift | 2 -- .../snapshots/swift/Utils.swift | 2 -- .../tests/search/snapshots/kt/Client.kt | 8 ++--- .../tests/search/snapshots/kt/Models.kt | 15 +++++++- .../tests/search/snapshots/kt/examples.json | 2 +- .../tests/search/snapshots/py/client.py | 4 +-- .../tests/search/snapshots/py/examples.json | 2 +- .../tests/search/snapshots/py/models.py | 7 ++-- .../tests/search/snapshots/py/utils.py | 13 +++++++ .../tests/search/snapshots/swift/Client.swift | 4 +-- .../tests/search/snapshots/swift/Models.swift | 4 +-- .../tests/search/snapshots/swift/Utils.swift | 2 -- .../tests/unions/snapshots/swift/Utils.swift | 2 -- .../tests/unwrap/snapshots/kt/Models.kt | 15 +++++++- .../tests/unwrap/snapshots/kt/examples.json | 2 +- .../tests/unwrap/snapshots/py/examples.json | 2 +- .../tests/unwrap/snapshots/py/models.py | 3 +- .../tests/unwrap/snapshots/py/utils.py | 13 +++++++ .../tests/unwrap/snapshots/swift/Models.swift | 4 +-- .../tests/unwrap/snapshots/swift/Utils.swift | 2 -- .../tests/upload/snapshots/py/utils.py | 13 +++++++ .../tests/upload/snapshots/swift/Utils.swift | 2 -- 72 files changed, 363 insertions(+), 133 deletions(-) diff --git a/packages/generator/src/lang/csharp.ts b/packages/generator/src/lang/csharp.ts index 44a82b9e..267511d6 100644 --- a/packages/generator/src/lang/csharp.ts +++ b/packages/generator/src/lang/csharp.ts @@ -59,7 +59,6 @@ function csType(ft: IRFieldType): string { if (ft.primitive === 'any') return 'object'; if (ft.primitive === 'string') { if (ft.format === 'date-time') return 'DateTimeOffset'; - if (ft.format === 'date') return 'DateOnly'; } return 'string'; case 'enum': @@ -82,7 +81,7 @@ function csType(ft: IRFieldType): string { function isValueType(ft: IRFieldType): boolean { if (ft.kind === 'primitive') { if (ft.primitive === 'integer' || ft.primitive === 'number' || ft.primitive === 'boolean') return true; - if (ft.primitive === 'string' && (ft.format === 'date-time' || ft.format === 'date')) return true; + if (ft.primitive === 'string' && ft.format === 'date-time') return true; } if (ft.kind === 'enum') return true; return false; @@ -1021,7 +1020,6 @@ function csLiteral( if (ft.primitive === 'boolean' && typeof ft.example === 'boolean') return String(ft.example); if (ft.primitive === 'string' && typeof ft.example === 'string') { if (ft.format === 'date-time') return `DateTimeOffset.Parse(${JSON.stringify(ft.example)})`; - if (ft.format === 'date') return `DateOnly.Parse(${JSON.stringify(ft.example)})`; return JSON.stringify(ft.example); } } @@ -1039,7 +1037,6 @@ function csLiteral( if (ft.primitive === 'any') return 'new object()'; if (ft.primitive === 'string') { if (ft.format === 'date-time') return 'DateTimeOffset.UtcNow'; - if (ft.format === 'date') return 'DateOnly.Parse("2024-01-01")'; } return '"example"'; } diff --git a/packages/generator/src/lang/kotlin.ts b/packages/generator/src/lang/kotlin.ts index 85217f12..ebec4fc2 100644 --- a/packages/generator/src/lang/kotlin.ts +++ b/packages/generator/src/lang/kotlin.ts @@ -36,6 +36,7 @@ function ktType(ft: IRFieldType): string { if (ft.primitive === 'number') return 'Double'; if (ft.primitive === 'boolean') return 'Boolean'; if (ft.primitive === 'any') return 'Any'; + if (ft.primitive === 'string' && ft.format === 'date-time') return 'OffsetDateTime'; return 'String'; case 'enum': case 'model': @@ -150,12 +151,31 @@ function generateModels(ir: IR): string { lines.push('package com.pachca.sdk'); lines.push(''); + const needDateTime = ir.models.some((m) => m.fields.some((f) => f.type.kind === 'primitive' && f.type.primitive === 'string' && f.type.format === 'date-time')) + || ir.params.some((p) => p.params.some((q) => q.type.kind === 'primitive' && q.type.primitive === 'string' && q.type.format === 'date-time')); + const imports: string[] = []; + if (needDateTime) imports.push('import java.time.OffsetDateTime'); + if (needDateTime) imports.push('import java.time.format.DateTimeFormatter'); + if (needDateTime) imports.push('import kotlinx.serialization.KSerializer'); if (needSerialName) imports.push('import kotlinx.serialization.SerialName'); imports.push('import kotlinx.serialization.Serializable'); if (needTransient) imports.push('import kotlinx.serialization.Transient'); + if (needDateTime) imports.push('import kotlinx.serialization.descriptors.PrimitiveKind'); + if (needDateTime) imports.push('import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor'); + if (needDateTime) imports.push('import kotlinx.serialization.encoding.Decoder'); + if (needDateTime) imports.push('import kotlinx.serialization.encoding.Encoder'); lines.push(imports.join('\n')); + if (needDateTime) { + lines.push(''); + lines.push('object OffsetDateTimeSerializer : KSerializer {'); + lines.push(' override val descriptor = PrimitiveSerialDescriptor("OffsetDateTime", PrimitiveKind.STRING)'); + lines.push(' override fun serialize(encoder: Encoder, value: OffsetDateTime) = encoder.encodeString(value.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME))'); + lines.push(' override fun deserialize(decoder: Decoder): OffsetDateTime = OffsetDateTime.parse(decoder.decodeString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME)'); + lines.push('}'); + } + // Enums for (const e of ir.enums) { lines.push(''); @@ -315,11 +335,13 @@ function emitModel( default_ = ''; } + const isDateTime = f.type.kind === 'primitive' && f.type.primitive === 'string' && f.type.format === 'date-time'; + const dtAnnotation = isDateTime ? '@Serializable(with = OffsetDateTimeSerializer::class) ' : ''; const annotation = isBinary ? '@Transient ' : needsSerialName(f) - ? `@SerialName("${f.name}") ` - : ''; + ? `${dtAnnotation}@SerialName("${f.name}") ` + : dtAnnotation; lines.push(` ${annotation}val ${sdkName}: ${fullType}${default_},`); } @@ -852,7 +874,10 @@ function ktLiteral( return String(ft.example); } if (ft.primitive === 'boolean' && typeof ft.example === 'boolean') return String(ft.example); - if (ft.primitive === 'string' && typeof ft.example === 'string') return JSON.stringify(ft.example); + if (ft.primitive === 'string' && typeof ft.example === 'string') { + if (ft.format === 'date-time') return `OffsetDateTime.parse(${JSON.stringify(ft.example)})`; + return JSON.stringify(ft.example); + } } if (ft.kind === 'enum' && typeof ft.example === 'string') { const e = ir.enums.find((en) => en.name === ft.ref); @@ -868,7 +893,7 @@ function ktLiteral( if (ft.primitive === 'any') return 'mapOf()'; // string with format variants if (ft.primitive === 'string') { - if (ft.format === 'date-time') return '"2024-01-01T00:00:00Z"'; + if (ft.format === 'date-time') return 'OffsetDateTime.parse("2024-01-01T00:00:00Z")'; if (ft.format === 'date') return '"2024-01-01"'; } return '"example"'; diff --git a/packages/generator/src/lang/python.ts b/packages/generator/src/lang/python.ts index f05f8f21..4055d07b 100644 --- a/packages/generator/src/lang/python.ts +++ b/packages/generator/src/lang/python.ts @@ -63,6 +63,13 @@ function hasAnyTypeInField(ft: IRFieldType): boolean { return false; } +function hasDateTimeInField(ft: IRFieldType): boolean { + if (ft.kind === 'primitive' && ft.primitive === 'string' && ft.format === 'date-time') return true; + if (ft.items) return hasDateTimeInField(ft.items); + if (ft.valueType) return hasDateTimeInField(ft.valueType); + return false; +} + function hasAnyType(model: IRModel): boolean { return model.fields.some((f) => hasAnyTypeInField(f.type)) || model.inlineObjects.some((m) => hasAnyType(m)); @@ -75,6 +82,7 @@ function pyType(ft: IRFieldType): string { if (ft.primitive === 'number') return 'float'; if (ft.primitive === 'boolean') return 'bool'; if (ft.primitive === 'any') return 'Any'; + if (ft.primitive === 'string' && ft.format === 'date-time') return 'datetime'; return 'str'; case 'enum': case 'model': @@ -209,9 +217,11 @@ function generateModels(ir: IR): string { const needEnum = ir.enums.length > 0; const needUnion = ir.unions.length > 0; const needAny = ir.models.some((m) => hasAnyType(m)) || ir.params.some((p) => p.params.some((q) => hasAnyTypeInField(q.type))); + const needDatetime = ir.models.some((m) => m.fields.some((f) => hasDateTimeInField(f.type))) || ir.params.some((p) => p.params.some((q) => hasDateTimeInField(q.type))); lines.push('from __future__ import annotations'); lines.push(''); + if (needDatetime) lines.push('from datetime import datetime'); if (needDataclass) { lines.push('from dataclasses import dataclass'); if (needEnum) lines.push('from enum import StrEnum'); @@ -479,12 +489,15 @@ function emitOperation(lines: string[], op: IROperation, ir: IR): void { lines.push(` for v in ${v}:`); lines.push(` query.append((${JSON.stringify(p.name)}, str(v)))`); } else { + const isDateTime = p.type.kind === 'primitive' && p.type.primitive === 'string' && p.type.format === 'date-time'; const rhs = p.type.kind === 'primitive' && p.type.primitive === 'boolean' ? `str(${v}).lower()` : p.type.kind === 'primitive' && (p.type.primitive === 'integer' || p.type.primitive === 'number') ? `str(${v})` - : v; + : isDateTime + ? `${v}.isoformat()` + : v; if (p.required) { if (op.queryParams.some((x) => x.isArray) || op.queryParams.some((x) => x.required)) { lines.push(` query.append((${JSON.stringify(p.name)}, ${rhs}))`); @@ -722,6 +735,7 @@ function generateUtils(): string { 'import dataclasses', 'import keyword', 'from dataclasses import asdict, fields', + 'from datetime import datetime', 'from typing import Type, TypeVar, get_args, get_origin, get_type_hints', '', 'import httpx', @@ -777,6 +791,16 @@ function generateUtils(): string { ' item_tp = _resolve_list_item_type(hints[f.name])', ' if item_tp is not None and _is_dataclass_type(item_tp):', ' v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v]', + ' elif isinstance(v, str):', + ' hint = hints.get(f.name)', + ' raw_hint = hint', + ' if get_origin(hint) is not None:', + ' for a in get_args(hint):', + ' if a is not type(None):', + ' raw_hint = a', + ' break', + ' if raw_hint is datetime:', + ' v = datetime.fromisoformat(v)', ' kwargs[k] = v', ' return cls(**kwargs)', '', @@ -789,6 +813,8 @@ function generateUtils(): string { ' }', ' if isinstance(val, list):', ' return [_strip_nones(v) for v in val]', + ' if isinstance(val, datetime):', + ' return val.isoformat()', ' return val', '', '', @@ -845,7 +871,10 @@ function pyLiteral( if (ft.kind === 'primitive') { if ((ft.primitive === 'integer' || ft.primitive === 'number') && typeof ft.example === 'number') return String(ft.example); if (ft.primitive === 'boolean' && typeof ft.example === 'boolean') return ft.example ? 'True' : 'False'; - if (ft.primitive === 'string' && typeof ft.example === 'string') return JSON.stringify(ft.example); + if (ft.primitive === 'string' && typeof ft.example === 'string') { + if (ft.format === 'date-time') return `datetime.fromisoformat(${JSON.stringify(ft.example)})`; + return JSON.stringify(ft.example); + } } if (ft.kind === 'enum' && typeof ft.example === 'string') { const e = ir.enums.find((en) => en.name === ft.ref); @@ -860,7 +889,7 @@ function pyLiteral( if (ft.primitive === 'boolean') return 'True'; if (ft.primitive === 'any') return '{}'; if (ft.primitive === 'string') { - if (ft.format === 'date-time') return '"2024-01-01T00:00:00Z"'; + if (ft.format === 'date-time') return 'datetime.fromisoformat("2024-01-01T00:00:00Z")'; if (ft.format === 'date') return '"2024-01-01"'; } return '"example"'; diff --git a/packages/generator/src/lang/swift.ts b/packages/generator/src/lang/swift.ts index 1901da80..b15f6794 100644 --- a/packages/generator/src/lang/swift.ts +++ b/packages/generator/src/lang/swift.ts @@ -35,7 +35,6 @@ function swiftType(ft: IRFieldType, opts: { nullable?: boolean } = {}): string { else if (ft.primitive === 'number') base = 'Double'; else if (ft.primitive === 'boolean') base = 'Bool'; else if (ft.primitive === 'any') base = 'AnyCodable'; - else if (ft.format === 'date-time') base = opts.nullable ? 'String' : 'Date'; else base = 'String'; break; case 'enum': @@ -224,7 +223,7 @@ function generateModels(ir: IR): string { for (const rt of ir.responses) { lines.push(`public struct ${rt.name}: Codable {`); lines.push(` public let data: [${rt.dataRef}]`); - if (rt.metaRef) lines.push(` public ${rt.metaIsRequired ? 'let' : 'var'} meta: ${rt.metaRef}${rt.metaIsRequired ? '' : '?'}${rt.metaIsRequired ? '' : ' = nil'}`); + if (rt.metaRef) lines.push(` public let meta: ${rt.metaRef}${rt.metaIsRequired ? '' : '?'}${rt.metaIsRequired ? '' : ' = nil'}`); lines.push('}'); lines.push(''); } @@ -287,12 +286,9 @@ function emitOperation(lines: string[], op: IROperation, ir: IR): void { for (const q of op.queryParams) { const n = snakeToCamel(q.sdkName); const isEnum = q.type.kind === 'enum'; - const isDate = q.type.kind === 'primitive' && q.type.format === 'date-time'; const isModel = q.type.kind === 'model' || q.type.kind === 'record'; function valueExpr(varName: string): string { if (isEnum) return `${varName}.rawValue`; - if (isDate && q.required) return `ISO8601DateFormatter().string(from: ${varName})`; - if (isDate) return varName; // optional dates are typed as String if (isModel) return `String(data: try serialize(${varName}), encoding: .utf8)!`; return `String(${varName})`; } @@ -542,13 +538,11 @@ function generateUtils(ir: IR): string { '', 'let pachcaDecoder: JSONDecoder = {', ' let decoder = JSONDecoder()', - ' decoder.dateDecodingStrategy = .iso8601', ' return decoder', '}()', '', 'let pachcaEncoder: JSONEncoder = {', ' let encoder = JSONEncoder()', - ' encoder.dateEncodingStrategy = .iso8601', ' return encoder', '}()', '', diff --git a/packages/generator/tests/additional-props-bool/snapshots/swift/Utils.swift b/packages/generator/tests/additional-props-bool/snapshots/swift/Utils.swift index b9a8fbd1..a2886884 100644 --- a/packages/generator/tests/additional-props-bool/snapshots/swift/Utils.swift +++ b/packages/generator/tests/additional-props-bool/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/allof-sibling/snapshots/kt/Models.kt b/packages/generator/tests/allof-sibling/snapshots/kt/Models.kt index 3be02bae..014a1331 100644 --- a/packages/generator/tests/allof-sibling/snapshots/kt/Models.kt +++ b/packages/generator/tests/allof-sibling/snapshots/kt/Models.kt @@ -1,18 +1,31 @@ package com.pachca.sdk +import java.time.OffsetDateTime +import java.time.format.DateTimeFormatter +import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +object OffsetDateTimeSerializer : KSerializer { + override val descriptor = PrimitiveSerialDescriptor("OffsetDateTime", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: OffsetDateTime) = encoder.encodeString(value.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)) + override fun deserialize(decoder: Decoder): OffsetDateTime = OffsetDateTime.parse(decoder.decodeString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME) +} @Serializable data class BaseEntity( val id: Int, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, ) @Serializable data class Article( val id: Int, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, val title: String, val body: String, @SerialName("is_published") val isPublished: Boolean? = null, diff --git a/packages/generator/tests/allof-sibling/snapshots/py/models.py b/packages/generator/tests/allof-sibling/snapshots/py/models.py index eb736045..7e693df9 100644 --- a/packages/generator/tests/allof-sibling/snapshots/py/models.py +++ b/packages/generator/tests/allof-sibling/snapshots/py/models.py @@ -1,17 +1,18 @@ from __future__ import annotations +from datetime import datetime from dataclasses import dataclass @dataclass class BaseEntity: id: int - created_at: str + created_at: datetime @dataclass class Article: id: int - created_at: str + created_at: datetime title: str body: str is_published: bool | None = None diff --git a/packages/generator/tests/allof-sibling/snapshots/swift/Models.swift b/packages/generator/tests/allof-sibling/snapshots/swift/Models.swift index 5ecc86b7..2c5ddbf6 100644 --- a/packages/generator/tests/allof-sibling/snapshots/swift/Models.swift +++ b/packages/generator/tests/allof-sibling/snapshots/swift/Models.swift @@ -5,9 +5,9 @@ import FoundationNetworking public struct BaseEntity: Codable { public let id: Int - public let createdAt: Date + public let createdAt: String - public init(id: Int, createdAt: Date) { + public init(id: Int, createdAt: String) { self.id = id self.createdAt = createdAt } @@ -20,12 +20,12 @@ public struct BaseEntity: Codable { public struct Article: Codable { public let id: Int - public let createdAt: Date + public let createdAt: String public let title: String public let body: String public let isPublished: Bool? - public init(id: Int, createdAt: Date, title: String, body: String, isPublished: Bool? = nil) { + public init(id: Int, createdAt: String, title: String, body: String, isPublished: Bool? = nil) { self.id = id self.createdAt = createdAt self.title = title diff --git a/packages/generator/tests/allof-sibling/snapshots/swift/Utils.swift b/packages/generator/tests/allof-sibling/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/allof-sibling/snapshots/swift/Utils.swift +++ b/packages/generator/tests/allof-sibling/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/array-no-brackets/snapshots/py/utils.py b/packages/generator/tests/array-no-brackets/snapshots/py/utils.py index d1494873..9288f902 100644 --- a/packages/generator/tests/array-no-brackets/snapshots/py/utils.py +++ b/packages/generator/tests/array-no-brackets/snapshots/py/utils.py @@ -3,6 +3,7 @@ import dataclasses import keyword from dataclasses import asdict, fields +from datetime import datetime from typing import Type, TypeVar, get_args, get_origin, get_type_hints import httpx @@ -58,6 +59,16 @@ def deserialize(cls: Type[T], data: dict) -> T: item_tp = _resolve_list_item_type(hints[f.name]) if item_tp is not None and _is_dataclass_type(item_tp): v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + elif isinstance(v, str): + hint = hints.get(f.name) + raw_hint = hint + if get_origin(hint) is not None: + for a in get_args(hint): + if a is not type(None): + raw_hint = a + break + if raw_hint is datetime: + v = datetime.fromisoformat(v) kwargs[k] = v return cls(**kwargs) @@ -70,6 +81,8 @@ def _strip_nones(val: object) -> object: } if isinstance(val, list): return [_strip_nones(v) for v in val] + if isinstance(val, datetime): + return val.isoformat() return val diff --git a/packages/generator/tests/array-no-brackets/snapshots/swift/Utils.swift b/packages/generator/tests/array-no-brackets/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/array-no-brackets/snapshots/swift/Utils.swift +++ b/packages/generator/tests/array-no-brackets/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/circular-ref/snapshots/swift/Utils.swift b/packages/generator/tests/circular-ref/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/circular-ref/snapshots/swift/Utils.swift +++ b/packages/generator/tests/circular-ref/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/crud/snapshots/kt/Models.kt b/packages/generator/tests/crud/snapshots/kt/Models.kt index 2baee073..4ae43e08 100644 --- a/packages/generator/tests/crud/snapshots/kt/Models.kt +++ b/packages/generator/tests/crud/snapshots/kt/Models.kt @@ -1,7 +1,20 @@ package com.pachca.sdk +import java.time.OffsetDateTime +import java.time.format.DateTimeFormatter +import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +object OffsetDateTimeSerializer : KSerializer { + override val descriptor = PrimitiveSerialDescriptor("OffsetDateTime", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: OffsetDateTime) = encoder.encodeString(value.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)) + override fun deserialize(decoder: Decoder): OffsetDateTime = OffsetDateTime.parse(decoder.decodeString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME) +} @Serializable enum class SortOrder(val value: String) { @@ -23,7 +36,7 @@ data class Chat( val name: String, @SerialName("is_channel") val isChannel: Boolean, @SerialName("is_public") val isPublic: Boolean, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, @SerialName("member_ids") val memberIds: List? = null, ) diff --git a/packages/generator/tests/crud/snapshots/kt/examples.json b/packages/generator/tests/crud/snapshots/kt/examples.json index 6a3515fd..ca41f1c8 100644 --- a/packages/generator/tests/crud/snapshots/kt/examples.json +++ b/packages/generator/tests/crud/snapshots/kt/examples.json @@ -15,11 +15,11 @@ }, "ChatOperations_getChat": { "usage": "val response = client.chats.getChat(id = 123)", - "output": "Chat(id: Int, name: String, isChannel: Boolean, isPublic: Boolean, createdAt: String, memberIds: List?)" + "output": "Chat(id: Int, name: String, isChannel: Boolean, isPublic: Boolean, createdAt: OffsetDateTime, memberIds: List?)" }, "ChatOperations_createChat": { "usage": "val request = ChatCreateRequest(\n chat = ChatCreateRequestChat(\n name = \"example\",\n channel = true,\n public = true,\n memberIds = listOf(123)\n )\n)\nval response = client.chats.createChat(request = request)", - "output": "Chat(id: Int, name: String, isChannel: Boolean, isPublic: Boolean, createdAt: String, memberIds: List?)", + "output": "Chat(id: Int, name: String, isChannel: Boolean, isPublic: Boolean, createdAt: OffsetDateTime, memberIds: List?)", "imports": [ "ChatCreateRequest", "ChatCreateRequestChat" @@ -27,7 +27,7 @@ }, "ChatOperations_updateChat": { "usage": "val request = ChatUpdateRequest(chat = ChatUpdateRequestChat(name = \"example\", public = true))\nval response = client.chats.updateChat(id = 123, request = request)", - "output": "Chat(id: Int, name: String, isChannel: Boolean, isPublic: Boolean, createdAt: String, memberIds: List?)", + "output": "Chat(id: Int, name: String, isChannel: Boolean, isPublic: Boolean, createdAt: OffsetDateTime, memberIds: List?)", "imports": [ "ChatUpdateRequest", "ChatUpdateRequestChat" diff --git a/packages/generator/tests/crud/snapshots/py/examples.json b/packages/generator/tests/crud/snapshots/py/examples.json index fde50ecd..ebeea4a5 100644 --- a/packages/generator/tests/crud/snapshots/py/examples.json +++ b/packages/generator/tests/crud/snapshots/py/examples.json @@ -16,11 +16,11 @@ }, "ChatOperations_getChat": { "usage": "response = await client.chats.get_chat(id=123)", - "output": "Chat(id: int, name: str, is_channel: bool, is_public: bool, created_at: str, member_ids: list[int] | None)" + "output": "Chat(id: int, name: str, is_channel: bool, is_public: bool, created_at: datetime, member_ids: list[int] | None)" }, "ChatOperations_createChat": { "usage": "request = ChatCreateRequest(\n chat=ChatCreateRequestChat(\n name=\"example\",\n channel=True,\n public=True,\n member_ids=[123]\n )\n)\nresponse = await client.chats.create_chat(request=request)", - "output": "Chat(id: int, name: str, is_channel: bool, is_public: bool, created_at: str, member_ids: list[int] | None)", + "output": "Chat(id: int, name: str, is_channel: bool, is_public: bool, created_at: datetime, member_ids: list[int] | None)", "imports": [ "ChatCreateRequest", "ChatCreateRequestChat" @@ -28,7 +28,7 @@ }, "ChatOperations_updateChat": { "usage": "request = ChatUpdateRequest(chat=ChatUpdateRequestChat(name=\"example\", public=True))\nresponse = await client.chats.update_chat(id=123, request=request)", - "output": "Chat(id: int, name: str, is_channel: bool, is_public: bool, created_at: str, member_ids: list[int] | None)", + "output": "Chat(id: int, name: str, is_channel: bool, is_public: bool, created_at: datetime, member_ids: list[int] | None)", "imports": [ "ChatUpdateRequest", "ChatUpdateRequestChat" diff --git a/packages/generator/tests/crud/snapshots/py/models.py b/packages/generator/tests/crud/snapshots/py/models.py index 09a37563..57668f70 100644 --- a/packages/generator/tests/crud/snapshots/py/models.py +++ b/packages/generator/tests/crud/snapshots/py/models.py @@ -1,5 +1,6 @@ from __future__ import annotations +from datetime import datetime from dataclasses import dataclass from enum import StrEnum @@ -19,7 +20,7 @@ class Chat: name: str is_channel: bool is_public: bool - created_at: str + created_at: datetime member_ids: list[int] | None = None diff --git a/packages/generator/tests/crud/snapshots/py/utils.py b/packages/generator/tests/crud/snapshots/py/utils.py index d1494873..9288f902 100644 --- a/packages/generator/tests/crud/snapshots/py/utils.py +++ b/packages/generator/tests/crud/snapshots/py/utils.py @@ -3,6 +3,7 @@ import dataclasses import keyword from dataclasses import asdict, fields +from datetime import datetime from typing import Type, TypeVar, get_args, get_origin, get_type_hints import httpx @@ -58,6 +59,16 @@ def deserialize(cls: Type[T], data: dict) -> T: item_tp = _resolve_list_item_type(hints[f.name]) if item_tp is not None and _is_dataclass_type(item_tp): v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + elif isinstance(v, str): + hint = hints.get(f.name) + raw_hint = hint + if get_origin(hint) is not None: + for a in get_args(hint): + if a is not type(None): + raw_hint = a + break + if raw_hint is datetime: + v = datetime.fromisoformat(v) kwargs[k] = v return cls(**kwargs) @@ -70,6 +81,8 @@ def _strip_nones(val: object) -> object: } if isinstance(val, list): return [_strip_nones(v) for v in val] + if isinstance(val, datetime): + return val.isoformat() return val diff --git a/packages/generator/tests/crud/snapshots/swift/Models.swift b/packages/generator/tests/crud/snapshots/swift/Models.swift index 8b2c0bd3..f8bf6e82 100644 --- a/packages/generator/tests/crud/snapshots/swift/Models.swift +++ b/packages/generator/tests/crud/snapshots/swift/Models.swift @@ -20,10 +20,10 @@ public struct Chat: Codable { public let name: String public let isChannel: Bool public let isPublic: Bool - public let createdAt: Date + public let createdAt: String public let memberIds: [Int]? - public init(id: Int, name: String, isChannel: Bool, isPublic: Bool, createdAt: Date, memberIds: [Int]? = nil) { + public init(id: Int, name: String, isChannel: Bool, isPublic: Bool, createdAt: String, memberIds: [Int]? = nil) { self.id = id self.name = name self.isChannel = isChannel @@ -142,7 +142,7 @@ public struct PaginationMeta: Codable { public struct ListChatsResponse: Codable { public let data: [Chat] - public var meta: PaginationMeta? = nil + public let meta: PaginationMeta? = nil } struct ChatDataWrapper: Codable { diff --git a/packages/generator/tests/crud/snapshots/swift/Utils.swift b/packages/generator/tests/crud/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/crud/snapshots/swift/Utils.swift +++ b/packages/generator/tests/crud/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/date-format/snapshots/cs/Client.cs b/packages/generator/tests/date-format/snapshots/cs/Client.cs index efebc212..c0da1bdd 100644 --- a/packages/generator/tests/date-format/snapshots/cs/Client.cs +++ b/packages/generator/tests/date-format/snapshots/cs/Client.cs @@ -23,8 +23,8 @@ internal ExportService(string baseUrl, HttpClient client) } public async System.Threading.Tasks.Task ListEventsAsync( - DateOnly dateFrom, - DateOnly? dateTo = null, + string dateFrom, + string? dateTo = null, DateTimeOffset? createdAfter = null, int? limit = null, CancellationToken cancellationToken = default) diff --git a/packages/generator/tests/date-format/snapshots/cs/Models.cs b/packages/generator/tests/date-format/snapshots/cs/Models.cs index 81d24265..8f1bfaf6 100644 --- a/packages/generator/tests/date-format/snapshots/cs/Models.cs +++ b/packages/generator/tests/date-format/snapshots/cs/Models.cs @@ -10,9 +10,9 @@ namespace Pachca.Sdk; public class ExportRequest { [JsonPropertyName("start_at")] - public DateOnly StartAt { get; set; } = default!; + public string StartAt { get; set; } = default!; [JsonPropertyName("end_at")] - public DateOnly EndAt { get; set; } = default!; + public string EndAt { get; set; } = default!; [JsonPropertyName("webhook_url")] public string WebhookUrl { get; set; } = default!; } @@ -22,9 +22,9 @@ public class Export [JsonPropertyName("id")] public int Id { get; set; } = default!; [JsonPropertyName("start_at")] - public DateOnly StartAt { get; set; } = default!; + public string StartAt { get; set; } = default!; [JsonPropertyName("end_at")] - public DateOnly EndAt { get; set; } = default!; + public string EndAt { get; set; } = default!; [JsonPropertyName("status")] public string Status { get; set; } = default!; [JsonPropertyName("created_at")] diff --git a/packages/generator/tests/date-format/snapshots/cs/examples.json b/packages/generator/tests/date-format/snapshots/cs/examples.json index 120c78f4..6ba6def4 100644 --- a/packages/generator/tests/date-format/snapshots/cs/examples.json +++ b/packages/generator/tests/date-format/snapshots/cs/examples.json @@ -6,12 +6,12 @@ ] }, "EventOperations_listEvents": { - "usage": "var response = await client.Export.ListEventsAsync(DateOnly.Parse(\"2024-01-01\"), DateOnly.Parse(\"2024-01-01\"), DateTimeOffset.UtcNow, 123);", + "usage": "var response = await client.Export.ListEventsAsync(\"example\", \"example\", DateTimeOffset.UtcNow, 123);", "output": "ListEventsResponse(Data: List)" }, "ExportOperations_createExport": { - "usage": "var request = new ExportRequest\n{\n StartAt = DateOnly.Parse(\"2025-03-20\"),\n EndAt = DateOnly.Parse(\"2025-03-20\"),\n WebhookUrl = \"example\"\n};\nvar response = await client.Export.CreateExportAsync(request);", - "output": "Export(Id: int, StartAt: DateOnly, EndAt: DateOnly, Status: string, CreatedAt: DateTimeOffset)", + "usage": "var request = new ExportRequest\n{\n StartAt = \"2025-03-20\",\n EndAt = \"2025-03-20\",\n WebhookUrl = \"example\"\n};\nvar response = await client.Export.CreateExportAsync(request);", + "output": "Export(Id: int, StartAt: string, EndAt: string, Status: string, CreatedAt: DateTimeOffset)", "imports": [ "ExportRequest" ] diff --git a/packages/generator/tests/date-format/snapshots/kt/Client.kt b/packages/generator/tests/date-format/snapshots/kt/Client.kt index e058663a..25439adf 100644 --- a/packages/generator/tests/date-format/snapshots/kt/Client.kt +++ b/packages/generator/tests/date-format/snapshots/kt/Client.kt @@ -20,7 +20,7 @@ class ExportService internal constructor( suspend fun listEvents( dateFrom: String, dateTo: String? = null, - createdAfter: String? = null, + createdAfter: OffsetDateTime? = null, limit: Int? = null, ): ListEventsResponse { val response = client.get("$baseUrl/events") { diff --git a/packages/generator/tests/date-format/snapshots/kt/Models.kt b/packages/generator/tests/date-format/snapshots/kt/Models.kt index 9bd1acf9..66296be9 100644 --- a/packages/generator/tests/date-format/snapshots/kt/Models.kt +++ b/packages/generator/tests/date-format/snapshots/kt/Models.kt @@ -1,7 +1,20 @@ package com.pachca.sdk +import java.time.OffsetDateTime +import java.time.format.DateTimeFormatter +import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +object OffsetDateTimeSerializer : KSerializer { + override val descriptor = PrimitiveSerialDescriptor("OffsetDateTime", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: OffsetDateTime) = encoder.encodeString(value.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)) + override fun deserialize(decoder: Decoder): OffsetDateTime = OffsetDateTime.parse(decoder.decodeString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME) +} @Serializable data class ExportRequest( @@ -16,14 +29,14 @@ data class Export( @SerialName("start_at") val startAt: String, @SerialName("end_at") val endAt: String, val status: String, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, ) @Serializable data class Event( val id: Int, val type: String, - @SerialName("occurred_at") val occurredAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("occurred_at") val occurredAt: OffsetDateTime, ) @Serializable diff --git a/packages/generator/tests/date-format/snapshots/kt/examples.json b/packages/generator/tests/date-format/snapshots/kt/examples.json index c147ac32..e83f1c57 100644 --- a/packages/generator/tests/date-format/snapshots/kt/examples.json +++ b/packages/generator/tests/date-format/snapshots/kt/examples.json @@ -6,12 +6,12 @@ ] }, "EventOperations_listEvents": { - "usage": "val response = client.export.listEvents(dateFrom = \"2024-01-01\", dateTo = \"2024-01-01\", createdAfter = \"2024-01-01T00:00:00Z\", limit = 123)", + "usage": "val createdAfter = OffsetDateTime.parse(\"2024-01-01T00:00:00Z\")\nval response = client.export.listEvents(dateFrom = \"2024-01-01\", dateTo = \"2024-01-01\", createdAfter = createdAfter, limit = 123)", "output": "ListEventsResponse(data: List)" }, "ExportOperations_createExport": { "usage": "val request = ExportRequest(\n startAt = \"2025-03-20\",\n endAt = \"2025-03-20\",\n webhookUrl = \"example\"\n)\nval response = client.export.createExport(request = request)", - "output": "Export(id: Int, startAt: String, endAt: String, status: String, createdAt: String)", + "output": "Export(id: Int, startAt: String, endAt: String, status: String, createdAt: OffsetDateTime)", "imports": [ "ExportRequest" ] diff --git a/packages/generator/tests/date-format/snapshots/py/client.py b/packages/generator/tests/date-format/snapshots/py/client.py index 3022d2d4..e4cafc23 100644 --- a/packages/generator/tests/date-format/snapshots/py/client.py +++ b/packages/generator/tests/date-format/snapshots/py/client.py @@ -24,7 +24,7 @@ async def list_events( if params is not None and params.date_to is not None: query.append(("date_to", params.date_to)) if params is not None and params.created_after is not None: - query.append(("created_after", params.created_after)) + query.append(("created_after", params.created_after.isoformat())) if params is not None and params.limit is not None: query.append(("limit", str(params.limit))) response = await self._client.get( diff --git a/packages/generator/tests/date-format/snapshots/py/examples.json b/packages/generator/tests/date-format/snapshots/py/examples.json index c377c83f..d5842f2f 100644 --- a/packages/generator/tests/date-format/snapshots/py/examples.json +++ b/packages/generator/tests/date-format/snapshots/py/examples.json @@ -6,7 +6,7 @@ ] }, "EventOperations_listEvents": { - "usage": "params = ListEventsParams(\n date_from=\"2024-01-01\",\n date_to=\"2024-01-01\",\n created_after=\"2024-01-01T00:00:00Z\",\n limit=123\n)\nresponse = await client.export.list_events(params=params)", + "usage": "params = ListEventsParams(\n date_from=\"2024-01-01\",\n date_to=\"2024-01-01\",\n created_after=datetime.fromisoformat(\"2024-01-01T00:00:00Z\"),\n limit=123\n)\nresponse = await client.export.list_events(params=params)", "output": "ListEventsResponse(data: list[Event])", "imports": [ "ListEventsParams" @@ -14,7 +14,7 @@ }, "ExportOperations_createExport": { "usage": "request = ExportRequest(\n start_at=\"2025-03-20\",\n end_at=\"2025-03-20\",\n webhook_url=\"example\"\n)\nresponse = await client.export.create_export(request=request)", - "output": "Export(id: int, start_at: str, end_at: str, status: str, created_at: str)", + "output": "Export(id: int, start_at: str, end_at: str, status: str, created_at: datetime)", "imports": [ "ExportRequest" ] diff --git a/packages/generator/tests/date-format/snapshots/py/models.py b/packages/generator/tests/date-format/snapshots/py/models.py index 71e2a4ec..55b73f57 100644 --- a/packages/generator/tests/date-format/snapshots/py/models.py +++ b/packages/generator/tests/date-format/snapshots/py/models.py @@ -1,5 +1,6 @@ from __future__ import annotations +from datetime import datetime from dataclasses import dataclass @dataclass @@ -15,14 +16,14 @@ class Export: start_at: str end_at: str status: str - created_at: str + created_at: datetime @dataclass class Event: id: int type: str - occurred_at: str + occurred_at: datetime @dataclass @@ -34,7 +35,7 @@ class OAuthError(Exception): class ListEventsParams: date_from: str date_to: str | None = None - created_after: str | None = None + created_after: datetime | None = None limit: int | None = None diff --git a/packages/generator/tests/date-format/snapshots/py/utils.py b/packages/generator/tests/date-format/snapshots/py/utils.py index d1494873..9288f902 100644 --- a/packages/generator/tests/date-format/snapshots/py/utils.py +++ b/packages/generator/tests/date-format/snapshots/py/utils.py @@ -3,6 +3,7 @@ import dataclasses import keyword from dataclasses import asdict, fields +from datetime import datetime from typing import Type, TypeVar, get_args, get_origin, get_type_hints import httpx @@ -58,6 +59,16 @@ def deserialize(cls: Type[T], data: dict) -> T: item_tp = _resolve_list_item_type(hints[f.name]) if item_tp is not None and _is_dataclass_type(item_tp): v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + elif isinstance(v, str): + hint = hints.get(f.name) + raw_hint = hint + if get_origin(hint) is not None: + for a in get_args(hint): + if a is not type(None): + raw_hint = a + break + if raw_hint is datetime: + v = datetime.fromisoformat(v) kwargs[k] = v return cls(**kwargs) @@ -70,6 +81,8 @@ def _strip_nones(val: object) -> object: } if isinstance(val, list): return [_strip_nones(v) for v in val] + if isinstance(val, datetime): + return val.isoformat() return val diff --git a/packages/generator/tests/date-format/snapshots/swift/Client.swift b/packages/generator/tests/date-format/snapshots/swift/Client.swift index 65a2ecac..4e90d157 100644 --- a/packages/generator/tests/date-format/snapshots/swift/Client.swift +++ b/packages/generator/tests/date-format/snapshots/swift/Client.swift @@ -19,7 +19,7 @@ public struct ExportService { var queryItems: [URLQueryItem] = [] queryItems.append(URLQueryItem(name: "date_from", value: String(dateFrom))) if let dateTo { queryItems.append(URLQueryItem(name: "date_to", value: String(dateTo))) } - if let createdAfter { queryItems.append(URLQueryItem(name: "created_after", value: createdAfter)) } + if let createdAfter { queryItems.append(URLQueryItem(name: "created_after", value: String(createdAfter))) } if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } if !queryItems.isEmpty { components.queryItems = queryItems } var request = URLRequest(url: components.url!) diff --git a/packages/generator/tests/date-format/snapshots/swift/Models.swift b/packages/generator/tests/date-format/snapshots/swift/Models.swift index 5fa67b2c..93051236 100644 --- a/packages/generator/tests/date-format/snapshots/swift/Models.swift +++ b/packages/generator/tests/date-format/snapshots/swift/Models.swift @@ -26,9 +26,9 @@ public struct Export: Codable { public let startAt: String public let endAt: String public let status: String - public let createdAt: Date + public let createdAt: String - public init(id: Int, startAt: String, endAt: String, status: String, createdAt: Date) { + public init(id: Int, startAt: String, endAt: String, status: String, createdAt: String) { self.id = id self.startAt = startAt self.endAt = endAt @@ -48,9 +48,9 @@ public struct Export: Codable { public struct Event: Codable { public let id: Int public let type: String - public let occurredAt: Date + public let occurredAt: String - public init(id: Int, type: String, occurredAt: Date) { + public init(id: Int, type: String, occurredAt: String) { self.id = id self.type = type self.occurredAt = occurredAt diff --git a/packages/generator/tests/date-format/snapshots/swift/Utils.swift b/packages/generator/tests/date-format/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/date-format/snapshots/swift/Utils.swift +++ b/packages/generator/tests/date-format/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/deep-nesting/snapshots/swift/Utils.swift b/packages/generator/tests/deep-nesting/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/deep-nesting/snapshots/swift/Utils.swift +++ b/packages/generator/tests/deep-nesting/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/edge-cases/snapshots/py/utils.py b/packages/generator/tests/edge-cases/snapshots/py/utils.py index d1494873..9288f902 100644 --- a/packages/generator/tests/edge-cases/snapshots/py/utils.py +++ b/packages/generator/tests/edge-cases/snapshots/py/utils.py @@ -3,6 +3,7 @@ import dataclasses import keyword from dataclasses import asdict, fields +from datetime import datetime from typing import Type, TypeVar, get_args, get_origin, get_type_hints import httpx @@ -58,6 +59,16 @@ def deserialize(cls: Type[T], data: dict) -> T: item_tp = _resolve_list_item_type(hints[f.name]) if item_tp is not None and _is_dataclass_type(item_tp): v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + elif isinstance(v, str): + hint = hints.get(f.name) + raw_hint = hint + if get_origin(hint) is not None: + for a in get_args(hint): + if a is not type(None): + raw_hint = a + break + if raw_hint is datetime: + v = datetime.fromisoformat(v) kwargs[k] = v return cls(**kwargs) @@ -70,6 +81,8 @@ def _strip_nones(val: object) -> object: } if isinstance(val, list): return [_strip_nones(v) for v in val] + if isinstance(val, datetime): + return val.isoformat() return val diff --git a/packages/generator/tests/edge-cases/snapshots/swift/Utils.swift b/packages/generator/tests/edge-cases/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/edge-cases/snapshots/swift/Utils.swift +++ b/packages/generator/tests/edge-cases/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/enums/snapshots/swift/Utils.swift b/packages/generator/tests/enums/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/enums/snapshots/swift/Utils.swift +++ b/packages/generator/tests/enums/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/models/snapshots/cs/Models.cs b/packages/generator/tests/models/snapshots/cs/Models.cs index 5938aab2..443d007f 100644 --- a/packages/generator/tests/models/snapshots/cs/Models.cs +++ b/packages/generator/tests/models/snapshots/cs/Models.cs @@ -71,7 +71,7 @@ public class User [JsonPropertyName("created_at")] public DateTimeOffset CreatedAt { get; set; } = default!; [JsonPropertyName("birthday")] - public DateOnly? Birthday { get; set; } + public string? Birthday { get; set; } [JsonPropertyName("tag_ids")] public List TagIds { get; set; } = default!; [JsonPropertyName("custom_properties")] diff --git a/packages/generator/tests/models/snapshots/kt/Models.kt b/packages/generator/tests/models/snapshots/kt/Models.kt index 9c05f48a..0781bd07 100644 --- a/packages/generator/tests/models/snapshots/kt/Models.kt +++ b/packages/generator/tests/models/snapshots/kt/Models.kt @@ -1,7 +1,20 @@ package com.pachca.sdk +import java.time.OffsetDateTime +import java.time.format.DateTimeFormatter +import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +object OffsetDateTimeSerializer : KSerializer { + override val descriptor = PrimitiveSerialDescriptor("OffsetDateTime", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: OffsetDateTime) = encoder.encodeString(value.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)) + override fun deserialize(decoder: Decoder): OffsetDateTime = OffsetDateTime.parse(decoder.decodeString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME) +} /** Роль пользователя */ @Serializable @@ -26,7 +39,7 @@ data class User( val role: UserRole, @SerialName("is_active") val isActive: Boolean, @SerialName("bot_id") val botId: Long? = null, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, val birthday: String? = null, @SerialName("tag_ids") val tagIds: List, @SerialName("custom_properties") val customProperties: List? = null, @@ -37,7 +50,7 @@ data class User( data class UserStatus( val emoji: String? = null, val title: String? = null, - @SerialName("expires_at") val expiresAt: String? = null, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("expires_at") val expiresAt: OffsetDateTime? = null, ) @Serializable diff --git a/packages/generator/tests/models/snapshots/py/models.py b/packages/generator/tests/models/snapshots/py/models.py index f5f44494..c6dfc8b9 100644 --- a/packages/generator/tests/models/snapshots/py/models.py +++ b/packages/generator/tests/models/snapshots/py/models.py @@ -1,5 +1,6 @@ from __future__ import annotations +from datetime import datetime from dataclasses import dataclass from enum import StrEnum @@ -20,7 +21,7 @@ class User: email: str role: UserRole is_active: bool - created_at: str + created_at: datetime tag_ids: list[int] phone_number: str | None = None bot_id: int | None = None @@ -33,7 +34,7 @@ class User: class UserStatus: emoji: str | None = None title: str | None = None - expires_at: str | None = None + expires_at: datetime | None = None @dataclass diff --git a/packages/generator/tests/models/snapshots/swift/Models.swift b/packages/generator/tests/models/snapshots/swift/Models.swift index e3328aa4..bd63641b 100644 --- a/packages/generator/tests/models/snapshots/swift/Models.swift +++ b/packages/generator/tests/models/snapshots/swift/Models.swift @@ -23,13 +23,13 @@ public struct User: Codable { public let role: UserRole public let isActive: Bool public let botId: Int64? - public let createdAt: Date + public let createdAt: String public let birthday: String? public let tagIds: [Int] public let customProperties: [CustomProperty]? public let status: UserStatus? - public init(id: Int, firstName: String, lastName: String, email: String, phoneNumber: String? = nil, role: UserRole, isActive: Bool, botId: Int64? = nil, createdAt: Date, birthday: String? = nil, tagIds: [Int], customProperties: [CustomProperty]? = nil, status: UserStatus? = nil) { + public init(id: Int, firstName: String, lastName: String, email: String, phoneNumber: String? = nil, role: UserRole, isActive: Bool, botId: Int64? = nil, createdAt: String, birthday: String? = nil, tagIds: [Int], customProperties: [CustomProperty]? = nil, status: UserStatus? = nil) { self.id = id self.firstName = firstName self.lastName = lastName diff --git a/packages/generator/tests/models/snapshots/swift/Utils.swift b/packages/generator/tests/models/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/models/snapshots/swift/Utils.swift +++ b/packages/generator/tests/models/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/multi-path-params/snapshots/py/utils.py b/packages/generator/tests/multi-path-params/snapshots/py/utils.py index d1494873..9288f902 100644 --- a/packages/generator/tests/multi-path-params/snapshots/py/utils.py +++ b/packages/generator/tests/multi-path-params/snapshots/py/utils.py @@ -3,6 +3,7 @@ import dataclasses import keyword from dataclasses import asdict, fields +from datetime import datetime from typing import Type, TypeVar, get_args, get_origin, get_type_hints import httpx @@ -58,6 +59,16 @@ def deserialize(cls: Type[T], data: dict) -> T: item_tp = _resolve_list_item_type(hints[f.name]) if item_tp is not None and _is_dataclass_type(item_tp): v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + elif isinstance(v, str): + hint = hints.get(f.name) + raw_hint = hint + if get_origin(hint) is not None: + for a in get_args(hint): + if a is not type(None): + raw_hint = a + break + if raw_hint is datetime: + v = datetime.fromisoformat(v) kwargs[k] = v return cls(**kwargs) @@ -70,6 +81,8 @@ def _strip_nones(val: object) -> object: } if isinstance(val, list): return [_strip_nones(v) for v in val] + if isinstance(val, datetime): + return val.isoformat() return val diff --git a/packages/generator/tests/multi-path-params/snapshots/swift/Utils.swift b/packages/generator/tests/multi-path-params/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/multi-path-params/snapshots/swift/Utils.swift +++ b/packages/generator/tests/multi-path-params/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/nullable-ref/snapshots/swift/Utils.swift b/packages/generator/tests/nullable-ref/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/nullable-ref/snapshots/swift/Utils.swift +++ b/packages/generator/tests/nullable-ref/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/oneof/snapshots/swift/Utils.swift b/packages/generator/tests/oneof/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/oneof/snapshots/swift/Utils.swift +++ b/packages/generator/tests/oneof/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/patch/snapshots/py/utils.py b/packages/generator/tests/patch/snapshots/py/utils.py index d1494873..9288f902 100644 --- a/packages/generator/tests/patch/snapshots/py/utils.py +++ b/packages/generator/tests/patch/snapshots/py/utils.py @@ -3,6 +3,7 @@ import dataclasses import keyword from dataclasses import asdict, fields +from datetime import datetime from typing import Type, TypeVar, get_args, get_origin, get_type_hints import httpx @@ -58,6 +59,16 @@ def deserialize(cls: Type[T], data: dict) -> T: item_tp = _resolve_list_item_type(hints[f.name]) if item_tp is not None and _is_dataclass_type(item_tp): v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + elif isinstance(v, str): + hint = hints.get(f.name) + raw_hint = hint + if get_origin(hint) is not None: + for a in get_args(hint): + if a is not type(None): + raw_hint = a + break + if raw_hint is datetime: + v = datetime.fromisoformat(v) kwargs[k] = v return cls(**kwargs) @@ -70,6 +81,8 @@ def _strip_nones(val: object) -> object: } if isinstance(val, list): return [_strip_nones(v) for v in val] + if isinstance(val, datetime): + return val.isoformat() return val diff --git a/packages/generator/tests/patch/snapshots/swift/Utils.swift b/packages/generator/tests/patch/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/patch/snapshots/swift/Utils.swift +++ b/packages/generator/tests/patch/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/record/snapshots/py/utils.py b/packages/generator/tests/record/snapshots/py/utils.py index d1494873..9288f902 100644 --- a/packages/generator/tests/record/snapshots/py/utils.py +++ b/packages/generator/tests/record/snapshots/py/utils.py @@ -3,6 +3,7 @@ import dataclasses import keyword from dataclasses import asdict, fields +from datetime import datetime from typing import Type, TypeVar, get_args, get_origin, get_type_hints import httpx @@ -58,6 +59,16 @@ def deserialize(cls: Type[T], data: dict) -> T: item_tp = _resolve_list_item_type(hints[f.name]) if item_tp is not None and _is_dataclass_type(item_tp): v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + elif isinstance(v, str): + hint = hints.get(f.name) + raw_hint = hint + if get_origin(hint) is not None: + for a in get_args(hint): + if a is not type(None): + raw_hint = a + break + if raw_hint is datetime: + v = datetime.fromisoformat(v) kwargs[k] = v return cls(**kwargs) @@ -70,6 +81,8 @@ def _strip_nones(val: object) -> object: } if isinstance(val, list): return [_strip_nones(v) for v in val] + if isinstance(val, datetime): + return val.isoformat() return val diff --git a/packages/generator/tests/record/snapshots/swift/Utils.swift b/packages/generator/tests/record/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/record/snapshots/swift/Utils.swift +++ b/packages/generator/tests/record/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/redirect/snapshots/py/utils.py b/packages/generator/tests/redirect/snapshots/py/utils.py index d1494873..9288f902 100644 --- a/packages/generator/tests/redirect/snapshots/py/utils.py +++ b/packages/generator/tests/redirect/snapshots/py/utils.py @@ -3,6 +3,7 @@ import dataclasses import keyword from dataclasses import asdict, fields +from datetime import datetime from typing import Type, TypeVar, get_args, get_origin, get_type_hints import httpx @@ -58,6 +59,16 @@ def deserialize(cls: Type[T], data: dict) -> T: item_tp = _resolve_list_item_type(hints[f.name]) if item_tp is not None and _is_dataclass_type(item_tp): v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + elif isinstance(v, str): + hint = hints.get(f.name) + raw_hint = hint + if get_origin(hint) is not None: + for a in get_args(hint): + if a is not type(None): + raw_hint = a + break + if raw_hint is datetime: + v = datetime.fromisoformat(v) kwargs[k] = v return cls(**kwargs) @@ -70,6 +81,8 @@ def _strip_nones(val: object) -> object: } if isinstance(val, list): return [_strip_nones(v) for v in val] + if isinstance(val, datetime): + return val.isoformat() return val diff --git a/packages/generator/tests/redirect/snapshots/swift/Utils.swift b/packages/generator/tests/redirect/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/redirect/snapshots/swift/Utils.swift +++ b/packages/generator/tests/redirect/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/reserved-keywords/snapshots/swift/Utils.swift b/packages/generator/tests/reserved-keywords/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/reserved-keywords/snapshots/swift/Utils.swift +++ b/packages/generator/tests/reserved-keywords/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/search/snapshots/kt/Client.kt b/packages/generator/tests/search/snapshots/kt/Client.kt index 6ddad5f3..fab66ff2 100644 --- a/packages/generator/tests/search/snapshots/kt/Client.kt +++ b/packages/generator/tests/search/snapshots/kt/Client.kt @@ -21,8 +21,8 @@ class SearchService internal constructor( query: String, chatIds: List? = null, userIds: List? = null, - createdFrom: String? = null, - createdTo: String? = null, + createdFrom: OffsetDateTime? = null, + createdTo: OffsetDateTime? = null, sort: SearchSort? = null, limit: Int? = null, cursor: String? = null, @@ -48,8 +48,8 @@ class SearchService internal constructor( query: String, chatIds: List? = null, userIds: List? = null, - createdFrom: String? = null, - createdTo: String? = null, + createdFrom: OffsetDateTime? = null, + createdTo: OffsetDateTime? = null, sort: SearchSort? = null, limit: Int? = null, ): List { diff --git a/packages/generator/tests/search/snapshots/kt/Models.kt b/packages/generator/tests/search/snapshots/kt/Models.kt index bd3aba95..d9fc6405 100644 --- a/packages/generator/tests/search/snapshots/kt/Models.kt +++ b/packages/generator/tests/search/snapshots/kt/Models.kt @@ -1,7 +1,20 @@ package com.pachca.sdk +import java.time.OffsetDateTime +import java.time.format.DateTimeFormatter +import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +object OffsetDateTimeSerializer : KSerializer { + override val descriptor = PrimitiveSerialDescriptor("OffsetDateTime", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: OffsetDateTime) = encoder.encodeString(value.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)) + override fun deserialize(decoder: Decoder): OffsetDateTime = OffsetDateTime.parse(decoder.decodeString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME) +} @Serializable enum class SearchSort(val value: String) { @@ -17,7 +30,7 @@ data class MessageSearchResult( @SerialName("chat_id") val chatId: Int, @SerialName("user_id") val userId: Int, val content: String, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, ) @Serializable diff --git a/packages/generator/tests/search/snapshots/kt/examples.json b/packages/generator/tests/search/snapshots/kt/examples.json index 8b3de7c0..64deed93 100644 --- a/packages/generator/tests/search/snapshots/kt/examples.json +++ b/packages/generator/tests/search/snapshots/kt/examples.json @@ -6,7 +6,7 @@ ] }, "SearchOperations_searchMessages": { - "usage": "val chatIds = listOf(123)\nval userIds = listOf(123)\nval response = client.search.searchMessages(query = \"example\", chatIds = chatIds, userIds = userIds, createdFrom = \"2024-01-01T00:00:00Z\", createdTo = \"2024-01-01T00:00:00Z\", sort = SearchSort.RELEVANCE, limit = 123, cursor = \"example\")", + "usage": "val chatIds = listOf(123)\nval userIds = listOf(123)\nval createdFrom = OffsetDateTime.parse(\"2024-01-01T00:00:00Z\")\nval createdTo = OffsetDateTime.parse(\"2024-01-01T00:00:00Z\")\nval response = client.search.searchMessages(query = \"example\", chatIds = chatIds, userIds = userIds, createdFrom = createdFrom, createdTo = createdTo, sort = SearchSort.RELEVANCE, limit = 123, cursor = \"example\")", "output": "SearchMessagesResponse(data: List, meta: SearchPaginationMeta)", "imports": [ "SearchSort" diff --git a/packages/generator/tests/search/snapshots/py/client.py b/packages/generator/tests/search/snapshots/py/client.py index 6a4354dd..50f1b5ff 100644 --- a/packages/generator/tests/search/snapshots/py/client.py +++ b/packages/generator/tests/search/snapshots/py/client.py @@ -28,9 +28,9 @@ async def search_messages( for v in params.user_ids: query.append(("user_ids[]", str(v))) if params is not None and params.created_from is not None: - query.append(("created_from", params.created_from)) + query.append(("created_from", params.created_from.isoformat())) if params is not None and params.created_to is not None: - query.append(("created_to", params.created_to)) + query.append(("created_to", params.created_to.isoformat())) if params is not None and params.sort is not None: query.append(("sort", params.sort)) if params is not None and params.limit is not None: diff --git a/packages/generator/tests/search/snapshots/py/examples.json b/packages/generator/tests/search/snapshots/py/examples.json index fc0f909b..94292fea 100644 --- a/packages/generator/tests/search/snapshots/py/examples.json +++ b/packages/generator/tests/search/snapshots/py/examples.json @@ -6,7 +6,7 @@ ] }, "SearchOperations_searchMessages": { - "usage": "params = SearchMessagesParams(\n query=\"example\",\n chat_ids=[123],\n user_ids=[123],\n created_from=\"2024-01-01T00:00:00Z\",\n created_to=\"2024-01-01T00:00:00Z\",\n sort=SearchSort.RELEVANCE,\n limit=123,\n cursor=\"example\"\n)\nresponse = await client.search.search_messages(params=params)", + "usage": "params = SearchMessagesParams(\n query=\"example\",\n chat_ids=[123],\n user_ids=[123],\n created_from=datetime.fromisoformat(\"2024-01-01T00:00:00Z\"),\n created_to=datetime.fromisoformat(\"2024-01-01T00:00:00Z\"),\n sort=SearchSort.RELEVANCE,\n limit=123,\n cursor=\"example\"\n)\nresponse = await client.search.search_messages(params=params)", "output": "SearchMessagesResponse(data: list[MessageSearchResult], meta: SearchPaginationMeta)", "imports": [ "SearchMessagesParams", diff --git a/packages/generator/tests/search/snapshots/py/models.py b/packages/generator/tests/search/snapshots/py/models.py index e12e1756..1397eab1 100644 --- a/packages/generator/tests/search/snapshots/py/models.py +++ b/packages/generator/tests/search/snapshots/py/models.py @@ -1,5 +1,6 @@ from __future__ import annotations +from datetime import datetime from dataclasses import dataclass from enum import StrEnum @@ -14,7 +15,7 @@ class MessageSearchResult: chat_id: int user_id: int content: str - created_at: str + created_at: datetime @dataclass @@ -38,8 +39,8 @@ class SearchMessagesParams: query: str chat_ids: list[int] | None = None user_ids: list[int] | None = None - created_from: str | None = None - created_to: str | None = None + created_from: datetime | None = None + created_to: datetime | None = None sort: SearchSort | None = None limit: int | None = None cursor: str | None = None diff --git a/packages/generator/tests/search/snapshots/py/utils.py b/packages/generator/tests/search/snapshots/py/utils.py index d1494873..9288f902 100644 --- a/packages/generator/tests/search/snapshots/py/utils.py +++ b/packages/generator/tests/search/snapshots/py/utils.py @@ -3,6 +3,7 @@ import dataclasses import keyword from dataclasses import asdict, fields +from datetime import datetime from typing import Type, TypeVar, get_args, get_origin, get_type_hints import httpx @@ -58,6 +59,16 @@ def deserialize(cls: Type[T], data: dict) -> T: item_tp = _resolve_list_item_type(hints[f.name]) if item_tp is not None and _is_dataclass_type(item_tp): v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + elif isinstance(v, str): + hint = hints.get(f.name) + raw_hint = hint + if get_origin(hint) is not None: + for a in get_args(hint): + if a is not type(None): + raw_hint = a + break + if raw_hint is datetime: + v = datetime.fromisoformat(v) kwargs[k] = v return cls(**kwargs) @@ -70,6 +81,8 @@ def _strip_nones(val: object) -> object: } if isinstance(val, list): return [_strip_nones(v) for v in val] + if isinstance(val, datetime): + return val.isoformat() return val diff --git a/packages/generator/tests/search/snapshots/swift/Client.swift b/packages/generator/tests/search/snapshots/swift/Client.swift index abc85d4e..7bfa96fb 100644 --- a/packages/generator/tests/search/snapshots/swift/Client.swift +++ b/packages/generator/tests/search/snapshots/swift/Client.swift @@ -20,8 +20,8 @@ public struct SearchService { queryItems.append(URLQueryItem(name: "query", value: String(query))) if let chatIds { chatIds.forEach { queryItems.append(URLQueryItem(name: "chat_ids[]", value: String($0))) } } if let userIds { userIds.forEach { queryItems.append(URLQueryItem(name: "user_ids[]", value: String($0))) } } - if let createdFrom { queryItems.append(URLQueryItem(name: "created_from", value: createdFrom)) } - if let createdTo { queryItems.append(URLQueryItem(name: "created_to", value: createdTo)) } + if let createdFrom { queryItems.append(URLQueryItem(name: "created_from", value: String(createdFrom))) } + if let createdTo { queryItems.append(URLQueryItem(name: "created_to", value: String(createdTo))) } if let sort { queryItems.append(URLQueryItem(name: "sort", value: sort.rawValue)) } if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } if let cursor { queryItems.append(URLQueryItem(name: "cursor", value: String(cursor))) } diff --git a/packages/generator/tests/search/snapshots/swift/Models.swift b/packages/generator/tests/search/snapshots/swift/Models.swift index 9b78a3d9..4604fc82 100644 --- a/packages/generator/tests/search/snapshots/swift/Models.swift +++ b/packages/generator/tests/search/snapshots/swift/Models.swift @@ -15,9 +15,9 @@ public struct MessageSearchResult: Codable { public let chatId: Int public let userId: Int public let content: String - public let createdAt: Date + public let createdAt: String - public init(id: Int, chatId: Int, userId: Int, content: String, createdAt: Date) { + public init(id: Int, chatId: Int, userId: Int, content: String, createdAt: String) { self.id = id self.chatId = chatId self.userId = userId diff --git a/packages/generator/tests/search/snapshots/swift/Utils.swift b/packages/generator/tests/search/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/search/snapshots/swift/Utils.swift +++ b/packages/generator/tests/search/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/unions/snapshots/swift/Utils.swift b/packages/generator/tests/unions/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/unions/snapshots/swift/Utils.swift +++ b/packages/generator/tests/unions/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/unwrap/snapshots/kt/Models.kt b/packages/generator/tests/unwrap/snapshots/kt/Models.kt index 1c52fb77..617e45d2 100644 --- a/packages/generator/tests/unwrap/snapshots/kt/Models.kt +++ b/packages/generator/tests/unwrap/snapshots/kt/Models.kt @@ -1,7 +1,20 @@ package com.pachca.sdk +import java.time.OffsetDateTime +import java.time.format.DateTimeFormatter +import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +object OffsetDateTimeSerializer : KSerializer { + override val descriptor = PrimitiveSerialDescriptor("OffsetDateTime", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: OffsetDateTime) = encoder.encodeString(value.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)) + override fun deserialize(decoder: Decoder): OffsetDateTime = OffsetDateTime.parse(decoder.decodeString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME) +} @Serializable data class AddMembersRequest( @@ -27,7 +40,7 @@ data class Chat( val name: String, @SerialName("is_channel") val isChannel: Boolean, @SerialName("is_public") val isPublic: Boolean, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, ) @Serializable diff --git a/packages/generator/tests/unwrap/snapshots/kt/examples.json b/packages/generator/tests/unwrap/snapshots/kt/examples.json index 33628842..0e88a673 100644 --- a/packages/generator/tests/unwrap/snapshots/kt/examples.json +++ b/packages/generator/tests/unwrap/snapshots/kt/examples.json @@ -10,7 +10,7 @@ }, "ChatOperations_createChat": { "usage": "val request = ChatCreateRequest(\n chat = ChatCreateRequestChat(\n name = \"example\",\n channel = true,\n public = true,\n memberIds = listOf(123)\n )\n)\nval response = client.chats.createChat(request = request)", - "output": "Chat(id: Int, name: String, isChannel: Boolean, isPublic: Boolean, createdAt: String)", + "output": "Chat(id: Int, name: String, isChannel: Boolean, isPublic: Boolean, createdAt: OffsetDateTime)", "imports": [ "ChatCreateRequest", "ChatCreateRequestChat" diff --git a/packages/generator/tests/unwrap/snapshots/py/examples.json b/packages/generator/tests/unwrap/snapshots/py/examples.json index dafafc08..d9ff7b21 100644 --- a/packages/generator/tests/unwrap/snapshots/py/examples.json +++ b/packages/generator/tests/unwrap/snapshots/py/examples.json @@ -10,7 +10,7 @@ }, "ChatOperations_createChat": { "usage": "request = ChatCreateRequest(\n chat=ChatCreateRequestChat(\n name=\"example\",\n channel=True,\n public=True,\n member_ids=[123]\n )\n)\nresponse = await client.chats.create_chat(request=request)", - "output": "Chat(id: int, name: str, is_channel: bool, is_public: bool, created_at: str)", + "output": "Chat(id: int, name: str, is_channel: bool, is_public: bool, created_at: datetime)", "imports": [ "ChatCreateRequest", "ChatCreateRequestChat" diff --git a/packages/generator/tests/unwrap/snapshots/py/models.py b/packages/generator/tests/unwrap/snapshots/py/models.py index e639028a..49aa7d67 100644 --- a/packages/generator/tests/unwrap/snapshots/py/models.py +++ b/packages/generator/tests/unwrap/snapshots/py/models.py @@ -1,5 +1,6 @@ from __future__ import annotations +from datetime import datetime from dataclasses import dataclass @dataclass @@ -26,7 +27,7 @@ class Chat: name: str is_channel: bool is_public: bool - created_at: str + created_at: datetime @dataclass diff --git a/packages/generator/tests/unwrap/snapshots/py/utils.py b/packages/generator/tests/unwrap/snapshots/py/utils.py index d1494873..9288f902 100644 --- a/packages/generator/tests/unwrap/snapshots/py/utils.py +++ b/packages/generator/tests/unwrap/snapshots/py/utils.py @@ -3,6 +3,7 @@ import dataclasses import keyword from dataclasses import asdict, fields +from datetime import datetime from typing import Type, TypeVar, get_args, get_origin, get_type_hints import httpx @@ -58,6 +59,16 @@ def deserialize(cls: Type[T], data: dict) -> T: item_tp = _resolve_list_item_type(hints[f.name]) if item_tp is not None and _is_dataclass_type(item_tp): v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + elif isinstance(v, str): + hint = hints.get(f.name) + raw_hint = hint + if get_origin(hint) is not None: + for a in get_args(hint): + if a is not type(None): + raw_hint = a + break + if raw_hint is datetime: + v = datetime.fromisoformat(v) kwargs[k] = v return cls(**kwargs) @@ -70,6 +81,8 @@ def _strip_nones(val: object) -> object: } if isinstance(val, list): return [_strip_nones(v) for v in val] + if isinstance(val, datetime): + return val.isoformat() return val diff --git a/packages/generator/tests/unwrap/snapshots/swift/Models.swift b/packages/generator/tests/unwrap/snapshots/swift/Models.swift index b1437c90..a068a7de 100644 --- a/packages/generator/tests/unwrap/snapshots/swift/Models.swift +++ b/packages/generator/tests/unwrap/snapshots/swift/Models.swift @@ -49,9 +49,9 @@ public struct Chat: Codable { public let name: String public let isChannel: Bool public let isPublic: Bool - public let createdAt: Date + public let createdAt: String - public init(id: Int, name: String, isChannel: Bool, isPublic: Bool, createdAt: Date) { + public init(id: Int, name: String, isChannel: Bool, isPublic: Bool, createdAt: String) { self.id = id self.name = name self.isChannel = isChannel diff --git a/packages/generator/tests/unwrap/snapshots/swift/Utils.swift b/packages/generator/tests/unwrap/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/unwrap/snapshots/swift/Utils.swift +++ b/packages/generator/tests/unwrap/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() diff --git a/packages/generator/tests/upload/snapshots/py/utils.py b/packages/generator/tests/upload/snapshots/py/utils.py index d1494873..9288f902 100644 --- a/packages/generator/tests/upload/snapshots/py/utils.py +++ b/packages/generator/tests/upload/snapshots/py/utils.py @@ -3,6 +3,7 @@ import dataclasses import keyword from dataclasses import asdict, fields +from datetime import datetime from typing import Type, TypeVar, get_args, get_origin, get_type_hints import httpx @@ -58,6 +59,16 @@ def deserialize(cls: Type[T], data: dict) -> T: item_tp = _resolve_list_item_type(hints[f.name]) if item_tp is not None and _is_dataclass_type(item_tp): v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + elif isinstance(v, str): + hint = hints.get(f.name) + raw_hint = hint + if get_origin(hint) is not None: + for a in get_args(hint): + if a is not type(None): + raw_hint = a + break + if raw_hint is datetime: + v = datetime.fromisoformat(v) kwargs[k] = v return cls(**kwargs) @@ -70,6 +81,8 @@ def _strip_nones(val: object) -> object: } if isinstance(val, list): return [_strip_nones(v) for v in val] + if isinstance(val, datetime): + return val.isoformat() return val diff --git a/packages/generator/tests/upload/snapshots/swift/Utils.swift b/packages/generator/tests/upload/snapshots/swift/Utils.swift index d65d2a00..8df90b02 100644 --- a/packages/generator/tests/upload/snapshots/swift/Utils.swift +++ b/packages/generator/tests/upload/snapshots/swift/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() From c4a5109322bbdfd556e483efc1804d4922703cab Mon Sep 17 00:00:00 2001 From: aenadgrleey Date: Mon, 6 Apr 2026 23:51:00 +0200 Subject: [PATCH 33/37] fix(generator): Kotlin datetime fixes for unions, client imports, query params Add @Serializable(with = OffsetDateTimeSerializer::class) to union variant datetime fields. Add OffsetDateTime import to Client.kt. Convert datetime query params to string via .toString(). Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/generator/src/lang/kotlin.ts | 15 ++++++++++++--- .../tests/date-format/snapshots/kt/Client.kt | 3 ++- .../generator/tests/search/snapshots/kt/Client.kt | 5 +++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/generator/src/lang/kotlin.ts b/packages/generator/src/lang/kotlin.ts index ebec4fc2..2b90740f 100644 --- a/packages/generator/src/lang/kotlin.ts +++ b/packages/generator/src/lang/kotlin.ts @@ -270,8 +270,10 @@ function emitUnion( const isOpt = !f.required; const fullType = isOpt ? `${typeName}?` : typeName; const default_ = isOpt ? ' = null' : ''; + const isDateTime = f.type.kind === 'primitive' && f.type.primitive === 'string' && f.type.format === 'date-time'; + const dtAnnotation = isDateTime ? '@Serializable(with = OffsetDateTimeSerializer::class) ' : ''; const serialName = - needsSerialName(f) ? `@SerialName("${f.name}") ` : ''; + needsSerialName(f) ? `${dtAnnotation}@SerialName("${f.name}") ` : dtAnnotation; lines.push(` ${serialName}val ${sdkName}: ${fullType}${default_},`); } lines.push(`) : ${u.name}`); @@ -397,6 +399,10 @@ function generateClient(ir: IR): string { lines.push('import io.ktor.serialization.kotlinx.json.*'); lines.push('import kotlinx.serialization.json.Json'); lines.push('import java.io.Closeable'); + const clientNeedDateTime = ir.params.some((p) => p.params.some((q) => q.type.kind === 'primitive' && q.type.primitive === 'string' && q.type.format === 'date-time')); + if (clientNeedDateTime) { + lines.push('import java.time.OffsetDateTime'); + } // Services for (const svc of ir.services) { @@ -628,11 +634,14 @@ function emitMethodBody( ); } } else { - const valueExpr = p.type.kind === 'enum' ? 'it.value' : 'it'; + const isDateTime = p.type.kind === 'primitive' && p.type.primitive === 'string' && p.type.format === 'date-time'; + const valueExpr = p.type.kind === 'enum' ? 'it.value' : isDateTime ? 'it.toString()' : 'it'; if (p.required) { const reqExpr = p.type.kind === 'enum' ? `${p.sdkName}.value` - : p.sdkName; + : isDateTime + ? `${p.sdkName}.toString()` + : p.sdkName; lines.push(`${indent3}parameter("${p.name}", ${reqExpr})`); } else { lines.push( diff --git a/packages/generator/tests/date-format/snapshots/kt/Client.kt b/packages/generator/tests/date-format/snapshots/kt/Client.kt index 25439adf..17bd2815 100644 --- a/packages/generator/tests/date-format/snapshots/kt/Client.kt +++ b/packages/generator/tests/date-format/snapshots/kt/Client.kt @@ -12,6 +12,7 @@ import io.ktor.http.* import io.ktor.serialization.kotlinx.json.* import kotlinx.serialization.json.Json import java.io.Closeable +import java.time.OffsetDateTime class ExportService internal constructor( private val baseUrl: String, @@ -26,7 +27,7 @@ class ExportService internal constructor( val response = client.get("$baseUrl/events") { parameter("date_from", dateFrom) dateTo?.let { parameter("date_to", it) } - createdAfter?.let { parameter("created_after", it) } + createdAfter?.let { parameter("created_after", it.toString()) } limit?.let { parameter("limit", it) } } return when (response.status.value) { diff --git a/packages/generator/tests/search/snapshots/kt/Client.kt b/packages/generator/tests/search/snapshots/kt/Client.kt index fab66ff2..c871bfa4 100644 --- a/packages/generator/tests/search/snapshots/kt/Client.kt +++ b/packages/generator/tests/search/snapshots/kt/Client.kt @@ -12,6 +12,7 @@ import io.ktor.http.* import io.ktor.serialization.kotlinx.json.* import kotlinx.serialization.json.Json import java.io.Closeable +import java.time.OffsetDateTime class SearchService internal constructor( private val baseUrl: String, @@ -31,8 +32,8 @@ class SearchService internal constructor( parameter("query", query) chatIds?.forEach { parameter("chat_ids[]", it) } userIds?.forEach { parameter("user_ids[]", it) } - createdFrom?.let { parameter("created_from", it) } - createdTo?.let { parameter("created_to", it) } + createdFrom?.let { parameter("created_from", it.toString()) } + createdTo?.let { parameter("created_to", it.toString()) } sort?.let { parameter("sort", it.value) } limit?.let { parameter("limit", it) } cursor?.let { parameter("cursor", it) } From 60c2c84b24e5412455e27b93c8b5af2015595089 Mon Sep 17 00:00:00 2001 From: aenadgrleey Date: Mon, 6 Apr 2026 23:51:08 +0200 Subject: [PATCH 34/37] chore(sdk): regenerate all SDKs with datetime support Python: datetime, Kotlin: OffsetDateTime, C#: DateTimeOffset, Go: time.Time, Swift/TypeScript: String. Co-Authored-By: Claude Opus 4.6 (1M context) --- sdk/csharp/generated/Models.cs | 6 +- sdk/csharp/generated/examples.json | 2 +- .../src/main/kotlin/com/pachca/Client.kt | 61 +++++++-------- .../src/main/kotlin/com/pachca/Models.kt | 69 ++++++++++------- .../src/main/kotlin/com/pachca/examples.json | 56 +++++++------- sdk/python/generated/pachca/client.py | 20 ++--- sdk/python/generated/pachca/examples.json | 56 +++++++------- sdk/python/generated/pachca/models.py | 77 ++++++++++--------- sdk/python/generated/pachca/utils.py | 13 ++++ .../Pachca/GeneratedSources/Client.swift | 20 ++--- .../Pachca/GeneratedSources/Models.swift | 64 +++++++-------- .../Pachca/GeneratedSources/Utils.swift | 2 - 12 files changed, 236 insertions(+), 210 deletions(-) diff --git a/sdk/csharp/generated/Models.cs b/sdk/csharp/generated/Models.cs index 1c784ec5..416c0870 100644 --- a/sdk/csharp/generated/Models.cs +++ b/sdk/csharp/generated/Models.cs @@ -1643,7 +1643,7 @@ public class ViewBlockDate : ViewBlockUnion [JsonPropertyName("label")] public string Label { get; set; } = default!; [JsonPropertyName("initial_date")] - public DateOnly? InitialDate { get; set; } + public string? InitialDate { get; set; } [JsonPropertyName("required")] public bool? Required { get; set; } [JsonPropertyName("hint")] @@ -2036,9 +2036,9 @@ public class CustomPropertyDefinition public class ExportRequest { [JsonPropertyName("start_at")] - public DateOnly StartAt { get; set; } = default!; + public string StartAt { get; set; } = default!; [JsonPropertyName("end_at")] - public DateOnly EndAt { get; set; } = default!; + public string EndAt { get; set; } = default!; [JsonPropertyName("webhook_url")] public string WebhookUrl { get; set; } = default!; [JsonPropertyName("chat_ids")] diff --git a/sdk/csharp/generated/examples.json b/sdk/csharp/generated/examples.json index f0e7c425..217373b3 100644 --- a/sdk/csharp/generated/examples.json +++ b/sdk/csharp/generated/examples.json @@ -75,7 +75,7 @@ ] }, "ExportOperations_requestExport": { - "usage": "var request = new ExportRequest\n{\n StartAt = DateOnly.Parse(\"2025-03-20\"),\n EndAt = DateOnly.Parse(\"2025-03-20\"),\n WebhookUrl = \"https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2\",\n ChatIds = new List { 123 },\n SkipChatsFile = false\n};\nawait client.Common.RequestExportAsync(request);", + "usage": "var request = new ExportRequest\n{\n StartAt = \"2025-03-20\",\n EndAt = \"2025-03-20\",\n WebhookUrl = \"https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2\",\n ChatIds = new List { 123 },\n SkipChatsFile = false\n};\nawait client.Common.RequestExportAsync(request);", "imports": [ "ExportRequest" ] diff --git a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Client.kt b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Client.kt index 61660fee..364fb0dd 100644 --- a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Client.kt +++ b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Client.kt @@ -13,14 +13,15 @@ import io.ktor.http.* import io.ktor.serialization.kotlinx.json.* import kotlinx.serialization.json.Json import java.io.Closeable +import java.time.OffsetDateTime class SecurityService internal constructor( private val baseUrl: String, private val client: HttpClient, ) { suspend fun getAuditEvents( - startTime: String? = null, - endTime: String? = null, + startTime: OffsetDateTime? = null, + endTime: OffsetDateTime? = null, eventKey: AuditEventKey? = null, actorId: String? = null, actorType: String? = null, @@ -30,8 +31,8 @@ class SecurityService internal constructor( cursor: String? = null, ): GetAuditEventsResponse { val response = client.get("$baseUrl/audit_events") { - startTime?.let { parameter("start_time", it) } - endTime?.let { parameter("end_time", it) } + startTime?.let { parameter("start_time", it.toString()) } + endTime?.let { parameter("end_time", it.toString()) } eventKey?.let { parameter("event_key", it.value) } actorId?.let { parameter("actor_id", it) } actorType?.let { parameter("actor_type", it) } @@ -48,8 +49,8 @@ class SecurityService internal constructor( } suspend fun getAuditEventsAll( - startTime: String? = null, - endTime: String? = null, + startTime: OffsetDateTime? = null, + endTime: OffsetDateTime? = null, eventKey: AuditEventKey? = null, actorId: String? = null, actorType: String? = null, @@ -137,8 +138,8 @@ class ChatsService internal constructor( sort: ChatSortField? = null, order: SortOrder? = null, availability: ChatAvailability? = null, - lastMessageAtAfter: String? = null, - lastMessageAtBefore: String? = null, + lastMessageAtAfter: OffsetDateTime? = null, + lastMessageAtBefore: OffsetDateTime? = null, personal: Boolean? = null, limit: Int? = null, cursor: String? = null, @@ -147,8 +148,8 @@ class ChatsService internal constructor( sort?.let { parameter("sort", it.value) } order?.let { parameter("order", it.value) } availability?.let { parameter("availability", it.value) } - lastMessageAtAfter?.let { parameter("last_message_at_after", it) } - lastMessageAtBefore?.let { parameter("last_message_at_before", it) } + lastMessageAtAfter?.let { parameter("last_message_at_after", it.toString()) } + lastMessageAtBefore?.let { parameter("last_message_at_before", it.toString()) } personal?.let { parameter("personal", it) } limit?.let { parameter("limit", it) } cursor?.let { parameter("cursor", it) } @@ -164,8 +165,8 @@ class ChatsService internal constructor( sort: ChatSortField? = null, order: SortOrder? = null, availability: ChatAvailability? = null, - lastMessageAtAfter: String? = null, - lastMessageAtBefore: String? = null, + lastMessageAtAfter: OffsetDateTime? = null, + lastMessageAtBefore: OffsetDateTime? = null, personal: Boolean? = null, limit: Int? = null, ): List { @@ -846,8 +847,8 @@ class SearchService internal constructor( limit: Int? = null, cursor: String? = null, order: SortOrder? = null, - createdFrom: String? = null, - createdTo: String? = null, + createdFrom: OffsetDateTime? = null, + createdTo: OffsetDateTime? = null, active: Boolean? = null, chatSubtype: ChatSubtype? = null, personal: Boolean? = null, @@ -857,8 +858,8 @@ class SearchService internal constructor( limit?.let { parameter("limit", it) } cursor?.let { parameter("cursor", it) } order?.let { parameter("order", it.value) } - createdFrom?.let { parameter("created_from", it) } - createdTo?.let { parameter("created_to", it) } + createdFrom?.let { parameter("created_from", it.toString()) } + createdTo?.let { parameter("created_to", it.toString()) } active?.let { parameter("active", it) } chatSubtype?.let { parameter("chat_subtype", it.value) } personal?.let { parameter("personal", it) } @@ -874,8 +875,8 @@ class SearchService internal constructor( query: String? = null, limit: Int? = null, order: SortOrder? = null, - createdFrom: String? = null, - createdTo: String? = null, + createdFrom: OffsetDateTime? = null, + createdTo: OffsetDateTime? = null, active: Boolean? = null, chatSubtype: ChatSubtype? = null, personal: Boolean? = null, @@ -906,8 +907,8 @@ class SearchService internal constructor( limit: Int? = null, cursor: String? = null, order: SortOrder? = null, - createdFrom: String? = null, - createdTo: String? = null, + createdFrom: OffsetDateTime? = null, + createdTo: OffsetDateTime? = null, chatIds: List? = null, userIds: List? = null, active: Boolean? = null, @@ -917,8 +918,8 @@ class SearchService internal constructor( limit?.let { parameter("limit", it) } cursor?.let { parameter("cursor", it) } order?.let { parameter("order", it.value) } - createdFrom?.let { parameter("created_from", it) } - createdTo?.let { parameter("created_to", it) } + createdFrom?.let { parameter("created_from", it.toString()) } + createdTo?.let { parameter("created_to", it.toString()) } chatIds?.forEach { parameter("chat_ids[]", it) } userIds?.forEach { parameter("user_ids[]", it) } active?.let { parameter("active", it) } @@ -934,8 +935,8 @@ class SearchService internal constructor( query: String? = null, limit: Int? = null, order: SortOrder? = null, - createdFrom: String? = null, - createdTo: String? = null, + createdFrom: OffsetDateTime? = null, + createdTo: OffsetDateTime? = null, chatIds: List? = null, userIds: List? = null, active: Boolean? = null, @@ -967,8 +968,8 @@ class SearchService internal constructor( cursor: String? = null, sort: SearchSortOrder? = null, order: SortOrder? = null, - createdFrom: String? = null, - createdTo: String? = null, + createdFrom: OffsetDateTime? = null, + createdTo: OffsetDateTime? = null, companyRoles: List? = null, ): SearchUsersResponse { val response = client.get("$baseUrl/search/users") { @@ -977,8 +978,8 @@ class SearchService internal constructor( cursor?.let { parameter("cursor", it) } sort?.let { parameter("sort", it.value) } order?.let { parameter("order", it.value) } - createdFrom?.let { parameter("created_from", it) } - createdTo?.let { parameter("created_to", it) } + createdFrom?.let { parameter("created_from", it.toString()) } + createdTo?.let { parameter("created_to", it.toString()) } companyRoles?.forEach { parameter("company_roles[]", it.value) } } return when (response.status.value) { @@ -993,8 +994,8 @@ class SearchService internal constructor( limit: Int? = null, sort: SearchSortOrder? = null, order: SortOrder? = null, - createdFrom: String? = null, - createdTo: String? = null, + createdFrom: OffsetDateTime? = null, + createdTo: OffsetDateTime? = null, companyRoles: List? = null, ): List { val items = mutableListOf() diff --git a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt index 8ce665ee..99fd3cac 100644 --- a/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt +++ b/sdk/kotlin/generated/src/main/kotlin/com/pachca/Models.kt @@ -1,8 +1,21 @@ package com.pachca.sdk +import java.time.OffsetDateTime +import java.time.format.DateTimeFormatter +import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +object OffsetDateTimeSerializer : KSerializer { + override val descriptor = PrimitiveSerialDescriptor("OffsetDateTime", PrimitiveKind.STRING) + override fun serialize(encoder: Encoder, value: OffsetDateTime) = encoder.encodeString(value.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)) + override fun deserialize(decoder: Decoder): OffsetDateTime = OffsetDateTime.parse(decoder.decodeString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME) +} /** Тип аудит-события */ @Serializable @@ -730,7 +743,7 @@ data class MessageWebhookPayload( @SerialName("entity_id") val entityId: Int, val content: String, @SerialName("user_id") val userId: Int, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, val url: String, @SerialName("chat_id") val chatId: Int, @SerialName("parent_message_id") val parentMessageId: Int? = null, @@ -747,7 +760,7 @@ data class ReactionWebhookPayload( val code: String, val name: String, @SerialName("user_id") val userId: Int, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, @SerialName("webhook_timestamp") val webhookTimestamp: Int, ) : WebhookPayloadUnion @@ -782,7 +795,7 @@ data class ChatMemberWebhookPayload( @SerialName("chat_id") val chatId: Int, @SerialName("thread_id") val threadId: Int? = null, @SerialName("user_ids") val userIds: List, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, @SerialName("webhook_timestamp") val webhookTimestamp: Int, ) : WebhookPayloadUnion @@ -792,7 +805,7 @@ data class CompanyMemberWebhookPayload( override val type: String = "company_member", val event: UserEventType, @SerialName("user_ids") val userIds: List, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, @SerialName("webhook_timestamp") val webhookTimestamp: Int, ) : WebhookPayloadUnion @@ -804,7 +817,7 @@ data class LinkSharedWebhookPayload( @SerialName("message_id") val messageId: Int, val links: List, @SerialName("user_id") val userId: Int, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, @SerialName("webhook_timestamp") val webhookTimestamp: Int, ) : WebhookPayloadUnion @@ -815,10 +828,10 @@ data class AccessTokenInfo( val name: String? = null, @SerialName("user_id") val userId: Long, val scopes: List, - @SerialName("created_at") val createdAt: String, - @SerialName("revoked_at") val revokedAt: String? = null, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("revoked_at") val revokedAt: OffsetDateTime? = null, @SerialName("expires_in") val expiresIn: Int? = null, - @SerialName("last_used_at") val lastUsedAt: String? = null, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("last_used_at") val lastUsedAt: OffsetDateTime? = null, ) @Serializable @@ -849,7 +862,7 @@ data class ApiErrorItem( @Serializable data class AuditEvent( val id: String, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, @SerialName("event_key") val eventKey: AuditEventKey, @SerialName("entity_id") val entityId: String, @SerialName("entity_type") val entityType: String, @@ -902,14 +915,14 @@ data class Button( data class Chat( val id: Int, val name: String, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, @SerialName("owner_id") val ownerId: Int, @SerialName("member_ids") val memberIds: List, @SerialName("group_tag_ids") val groupTagIds: List, val channel: Boolean, val personal: Boolean, val public: Boolean, - @SerialName("last_message_at") val lastMessageAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("last_message_at") val lastMessageAt: OffsetDateTime, @SerialName("meet_room_url") val meetRoomUrl: String, ) @@ -991,7 +1004,7 @@ data class Forwarding( @SerialName("original_message_id") val originalMessageId: Int, @SerialName("original_chat_id") val originalChatId: Int, @SerialName("author_id") val authorId: Int, - @SerialName("original_created_at") val originalCreatedAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("original_created_at") val originalCreatedAt: OffsetDateTime, @SerialName("original_thread_id") val originalThreadId: Int? = null, @SerialName("original_thread_message_id") val originalThreadMessageId: Int? = null, @SerialName("original_thread_parent_chat_id") val originalThreadParentChatId: Int? = null, @@ -1049,7 +1062,7 @@ data class Message( @SerialName("root_chat_id") val rootChatId: Int, val content: String, @SerialName("user_id") val userId: Int, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, val url: String, val files: List, val buttons: List>? = null, @@ -1058,8 +1071,8 @@ data class Message( @SerialName("parent_message_id") val parentMessageId: Int? = null, @SerialName("display_avatar_url") val displayAvatarUrl: String? = null, @SerialName("display_name") val displayName: String? = null, - @SerialName("changed_at") val changedAt: String? = null, - @SerialName("deleted_at") val deletedAt: String? = null, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("changed_at") val changedAt: OffsetDateTime? = null, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("deleted_at") val deletedAt: OffsetDateTime? = null, ) @Serializable @@ -1151,7 +1164,7 @@ data class PaginationMeta( @Serializable data class Reaction( @SerialName("user_id") val userId: Int, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, val code: String, val name: String? = null, ) @@ -1177,7 +1190,7 @@ data class SearchPaginationMeta( data class StatusUpdateRequestStatus( val emoji: String, val title: String, - @SerialName("expires_at") val expiresAt: String? = null, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("expires_at") val expiresAt: OffsetDateTime? = null, @SerialName("is_away") val isAway: Boolean? = null, @SerialName("away_message") val awayMessage: String? = null, ) @@ -1192,12 +1205,12 @@ data class Task( val id: Int, val kind: TaskKind, val content: String, - @SerialName("due_at") val dueAt: String? = null, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("due_at") val dueAt: OffsetDateTime? = null, val priority: Int, @SerialName("user_id") val userId: Int, @SerialName("chat_id") val chatId: Int? = null, val status: TaskStatus, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, @SerialName("performer_ids") val performerIds: List, @SerialName("all_day") val allDay: Boolean, @SerialName("custom_properties") val customProperties: List, @@ -1213,7 +1226,7 @@ data class TaskCreateRequestCustomProperty( data class TaskCreateRequestTask( val kind: TaskKind, val content: String? = null, - @SerialName("due_at") val dueAt: String? = null, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("due_at") val dueAt: OffsetDateTime? = null, val priority: Int? = 1, @SerialName("performer_ids") val performerIds: List? = null, @SerialName("chat_id") val chatId: Int? = null, @@ -1236,12 +1249,12 @@ data class TaskUpdateRequestCustomProperty( data class TaskUpdateRequestTask( val kind: TaskKind? = null, val content: String? = null, - @SerialName("due_at") val dueAt: String? = null, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("due_at") val dueAt: OffsetDateTime? = null, val priority: Int? = null, @SerialName("performer_ids") val performerIds: List? = null, val status: TaskStatus? = null, @SerialName("all_day") val allDay: Boolean? = null, - @SerialName("done_at") val doneAt: String? = null, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("done_at") val doneAt: OffsetDateTime? = null, @SerialName("custom_properties") val customProperties: List? = null, ) @@ -1256,7 +1269,7 @@ data class Thread( @SerialName("chat_id") val chatId: Long, @SerialName("message_id") val messageId: Long, @SerialName("message_chat_id") val messageChatId: Long, - @SerialName("updated_at") val updatedAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("updated_at") val updatedAt: OffsetDateTime, ) @Serializable @@ -1295,8 +1308,8 @@ data class User( @SerialName("user_status") val userStatus: UserStatus? = null, val bot: Boolean, val sso: Boolean, - @SerialName("created_at") val createdAt: String, - @SerialName("last_activity_at") val lastActivityAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("last_activity_at") val lastActivityAt: OffsetDateTime, @SerialName("time_zone") val timeZone: String, @SerialName("image_url") val imageUrl: String? = null, ) @@ -1337,7 +1350,7 @@ data class UserStatusAwayMessage( data class UserStatus( val emoji: String, val title: String, - @SerialName("expires_at") val expiresAt: String? = null, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("expires_at") val expiresAt: OffsetDateTime? = null, @SerialName("is_away") val isAway: Boolean, @SerialName("away_message") val awayMessage: UserStatusAwayMessage? = null, ) @@ -1374,7 +1387,7 @@ data class ViewBlock( val text: String? = null, val name: String? = null, val label: String? = null, - @SerialName("initial_date") val initialDate: String? = null, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("initial_date") val initialDate: OffsetDateTime? = null, ) @Serializable @@ -1398,7 +1411,7 @@ data class WebhookEvent( val id: String, @SerialName("event_type") val eventType: String, val payload: WebhookPayloadUnion, - @SerialName("created_at") val createdAt: String, + @Serializable(with = OffsetDateTimeSerializer::class) @SerialName("created_at") val createdAt: OffsetDateTime, ) @Serializable diff --git a/sdk/kotlin/generated/src/main/kotlin/com/pachca/examples.json b/sdk/kotlin/generated/src/main/kotlin/com/pachca/examples.json index b6813ccc..6db478c1 100644 --- a/sdk/kotlin/generated/src/main/kotlin/com/pachca/examples.json +++ b/sdk/kotlin/generated/src/main/kotlin/com/pachca/examples.json @@ -6,7 +6,7 @@ ] }, "SecurityOperations_getAuditEvents": { - "usage": "val response = client.security.getAuditEvents(startTime = \"2025-05-01T09:11:00Z\", endTime = \"2025-05-02T09:11:00Z\", eventKey = AuditEventKey.USER_LOGIN, actorId = \"98765\", actorType = \"User\", entityId = \"98765\", entityType = \"User\", limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", + "usage": "val startTime = OffsetDateTime.parse(\"2025-05-01T09:11:00Z\")\nval endTime = OffsetDateTime.parse(\"2025-05-02T09:11:00Z\")\nval response = client.security.getAuditEvents(startTime = startTime, endTime = endTime, eventKey = AuditEventKey.USER_LOGIN, actorId = \"98765\", actorType = \"User\", entityId = \"98765\", entityType = \"User\", limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", "output": "GetAuditEventsResponse(data: List, meta: PaginationMeta)", "imports": [ "AuditEventKey" @@ -29,7 +29,7 @@ "usage": "client.bots.deleteWebhookEvent(id = \"01KAJZ2XDSS2S3DSW9EXJZ0TBV\")" }, "ChatOperations_listChats": { - "usage": "val response = client.chats.listChats(sort = ChatSortField.ID, order = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = \"2025-01-01T00:00:00.000Z\", lastMessageAtBefore = \"2025-02-01T00:00:00.000Z\", personal = false, limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", + "usage": "val lastMessageAtAfter = OffsetDateTime.parse(\"2025-01-01T00:00:00.000Z\")\nval lastMessageAtBefore = OffsetDateTime.parse(\"2025-02-01T00:00:00.000Z\")\nval response = client.chats.listChats(sort = ChatSortField.ID, order = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = lastMessageAtAfter, lastMessageAtBefore = lastMessageAtBefore, personal = false, limit = 1, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\")", "output": "ListChatsResponse(data: List, meta: PaginationMeta)", "imports": [ "ChatAvailability", @@ -39,11 +39,11 @@ }, "ChatOperations_getChat": { "usage": "val response = client.chats.getChat(id = 334)", - "output": "Chat(id: Int, name: String, createdAt: String, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: String, meetRoomUrl: String)" + "output": "Chat(id: Int, name: String, createdAt: OffsetDateTime, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: OffsetDateTime, meetRoomUrl: String)" }, "ChatOperations_createChat": { "usage": "val request = ChatCreateRequest(\n chat = ChatCreateRequestChat(\n name = \"🤿 aqua\",\n memberIds = listOf(123),\n groupTagIds = listOf(123),\n channel = true,\n public = false\n )\n)\nval response = client.chats.createChat(request = request)", - "output": "Chat(id: Int, name: String, createdAt: String, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: String, meetRoomUrl: String)", + "output": "Chat(id: Int, name: String, createdAt: OffsetDateTime, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: OffsetDateTime, meetRoomUrl: String)", "imports": [ "ChatCreateRequest", "ChatCreateRequestChat" @@ -51,7 +51,7 @@ }, "ChatOperations_updateChat": { "usage": "val request = ChatUpdateRequest(chat = ChatUpdateRequestChat(name = \"Бассейн\", public = true))\nval response = client.chats.updateChat(id = 334, request = request)", - "output": "Chat(id: Int, name: String, createdAt: String, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: String, meetRoomUrl: String)", + "output": "Chat(id: Int, name: String, createdAt: OffsetDateTime, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: OffsetDateTime, meetRoomUrl: String)", "imports": [ "ChatUpdateRequest", "ChatUpdateRequestChat" @@ -162,11 +162,11 @@ }, "MessageOperations_getMessage": { "usage": "val response = client.messages.getMessage(id = 194275)", - "output": "Message(id: Int, entityType: MessageEntityType, entityId: Int, chatId: Int, rootChatId: Int, content: String, userId: Int, createdAt: String, url: String, files: List, buttons: List>?, thread: MessageThread(id: Long, chatId: Long)?, forwarding: Forwarding(originalMessageId: Int, originalChatId: Int, authorId: Int, originalCreatedAt: String, originalThreadId: Int?, originalThreadMessageId: Int?, originalThreadParentChatId: Int?)?, parentMessageId: Int?, displayAvatarUrl: String?, displayName: String?, changedAt: String?, deletedAt: String?)" + "output": "Message(id: Int, entityType: MessageEntityType, entityId: Int, chatId: Int, rootChatId: Int, content: String, userId: Int, createdAt: OffsetDateTime, url: String, files: List, buttons: List>?, thread: MessageThread(id: Long, chatId: Long)?, forwarding: Forwarding(originalMessageId: Int, originalChatId: Int, authorId: Int, originalCreatedAt: OffsetDateTime, originalThreadId: Int?, originalThreadMessageId: Int?, originalThreadParentChatId: Int?)?, parentMessageId: Int?, displayAvatarUrl: String?, displayName: String?, changedAt: OffsetDateTime?, deletedAt: OffsetDateTime?)" }, "MessageOperations_createMessage": { "usage": "val request = MessageCreateRequest(\n message = MessageCreateRequestMessage(\n entityType = MessageEntityType.DISCUSSION,\n entityId = 334,\n content = \"Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)\",\n files = listOf(MessageCreateRequestFile(\n key = \"attaches/files/93746/e354fd79-4f3e-4b5a-9c8d-1a2b3c4d5e6f/logo.png\",\n name = \"logo.png\",\n fileType = FileType.IMAGE,\n size = 12345,\n width = 800,\n height = 600\n )),\n buttons = listOf(listOf(Button(\n text = \"Подробнее\",\n url = \"https://example.com/details\",\n data = \"awesome\"\n ))),\n parentMessageId = 194270,\n displayAvatarUrl = \"https://example.com/avatar.png\",\n displayName = \"Бот Поддержки\",\n skipInviteMentions = false\n ),\n linkPreview = false\n)\nval response = client.messages.createMessage(request = request)", - "output": "Message(id: Int, entityType: MessageEntityType, entityId: Int, chatId: Int, rootChatId: Int, content: String, userId: Int, createdAt: String, url: String, files: List, buttons: List>?, thread: MessageThread(id: Long, chatId: Long)?, forwarding: Forwarding(originalMessageId: Int, originalChatId: Int, authorId: Int, originalCreatedAt: String, originalThreadId: Int?, originalThreadMessageId: Int?, originalThreadParentChatId: Int?)?, parentMessageId: Int?, displayAvatarUrl: String?, displayName: String?, changedAt: String?, deletedAt: String?)", + "output": "Message(id: Int, entityType: MessageEntityType, entityId: Int, chatId: Int, rootChatId: Int, content: String, userId: Int, createdAt: OffsetDateTime, url: String, files: List, buttons: List>?, thread: MessageThread(id: Long, chatId: Long)?, forwarding: Forwarding(originalMessageId: Int, originalChatId: Int, authorId: Int, originalCreatedAt: OffsetDateTime, originalThreadId: Int?, originalThreadMessageId: Int?, originalThreadParentChatId: Int?)?, parentMessageId: Int?, displayAvatarUrl: String?, displayName: String?, changedAt: OffsetDateTime?, deletedAt: OffsetDateTime?)", "imports": [ "Button", "FileType", @@ -181,7 +181,7 @@ }, "MessageOperations_updateMessage": { "usage": "val request = MessageUpdateRequest(\n message = MessageUpdateRequestMessage(\n content = \"Вот попробуйте написать правильно это с первого раза: Будущий, Полощи, Прийти, Грейпфрут, Мозаика, Бюллетень, Дуршлаг, Винегрет.\",\n files = listOf(MessageUpdateRequestFile(\n key = \"attaches/files/93746/e354fd79-4f3e-4b5a-9c8d-1a2b3c4d5e6f/logo.png\",\n name = \"logo.png\",\n fileType = \"image\",\n size = 12345,\n width = 800,\n height = 600\n )),\n buttons = listOf(listOf(Button(\n text = \"Подробнее\",\n url = \"https://example.com/details\",\n data = \"awesome\"\n ))),\n displayAvatarUrl = \"https://example.com/avatar.png\",\n displayName = \"Бот Поддержки\"\n )\n)\nval response = client.messages.updateMessage(id = 194275, request = request)", - "output": "Message(id: Int, entityType: MessageEntityType, entityId: Int, chatId: Int, rootChatId: Int, content: String, userId: Int, createdAt: String, url: String, files: List, buttons: List>?, thread: MessageThread(id: Long, chatId: Long)?, forwarding: Forwarding(originalMessageId: Int, originalChatId: Int, authorId: Int, originalCreatedAt: String, originalThreadId: Int?, originalThreadMessageId: Int?, originalThreadParentChatId: Int?)?, parentMessageId: Int?, displayAvatarUrl: String?, displayName: String?, changedAt: String?, deletedAt: String?)", + "output": "Message(id: Int, entityType: MessageEntityType, entityId: Int, chatId: Int, rootChatId: Int, content: String, userId: Int, createdAt: OffsetDateTime, url: String, files: List, buttons: List>?, thread: MessageThread(id: Long, chatId: Long)?, forwarding: Forwarding(originalMessageId: Int, originalChatId: Int, authorId: Int, originalCreatedAt: OffsetDateTime, originalThreadId: Int?, originalThreadMessageId: Int?, originalThreadParentChatId: Int?)?, parentMessageId: Int?, displayAvatarUrl: String?, displayName: String?, changedAt: OffsetDateTime?, deletedAt: OffsetDateTime?)", "imports": [ "Button", "MessageUpdateRequest", @@ -209,7 +209,7 @@ }, "ReactionOperations_addReaction": { "usage": "val request = ReactionRequest(code = \"👍\", name = \":+1:\")\nval response = client.reactions.addReaction(id = 7231942, request = request)", - "output": "Reaction(userId: Int, createdAt: String, code: String, name: String?)", + "output": "Reaction(userId: Int, createdAt: OffsetDateTime, code: String, name: String?)", "imports": [ "ReactionRequest" ] @@ -223,19 +223,19 @@ }, "ThreadOperations_getThread": { "usage": "val response = client.threads.getThread(id = 265142)", - "output": "Thread(id: Long, chatId: Long, messageId: Long, messageChatId: Long, updatedAt: String)" + "output": "Thread(id: Long, chatId: Long, messageId: Long, messageChatId: Long, updatedAt: OffsetDateTime)" }, "ThreadOperations_createThread": { "usage": "val response = client.threads.createThread(id = 154332686)", - "output": "Thread(id: Long, chatId: Long, messageId: Long, messageChatId: Long, updatedAt: String)" + "output": "Thread(id: Long, chatId: Long, messageId: Long, messageChatId: Long, updatedAt: OffsetDateTime)" }, "OAuthOperations_getTokenInfo": { "usage": "val response = client.profile.getTokenInfo()", - "output": "AccessTokenInfo(id: Long, token: String, name: String?, userId: Long, scopes: List, createdAt: String, revokedAt: String?, expiresIn: Int?, lastUsedAt: String?)" + "output": "AccessTokenInfo(id: Long, token: String, name: String?, userId: Long, scopes: List, createdAt: OffsetDateTime, revokedAt: OffsetDateTime?, expiresIn: Int?, lastUsedAt: OffsetDateTime?)" }, "ProfileOperations_getProfile": { "usage": "val response = client.profile.getProfile()", - "output": "User(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Boolean, inviteStatus: InviteStatus, listTags: List, customProperties: List, userStatus: UserStatus(emoji: String, title: String, expiresAt: String?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)?, bot: Boolean, sso: Boolean, createdAt: String, lastActivityAt: String, timeZone: String, imageUrl: String?)" + "output": "User(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Boolean, inviteStatus: InviteStatus, listTags: List, customProperties: List, userStatus: UserStatus(emoji: String, title: String, expiresAt: OffsetDateTime?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)?, bot: Boolean, sso: Boolean, createdAt: OffsetDateTime, lastActivityAt: OffsetDateTime, timeZone: String, imageUrl: String?)" }, "ProfileOperations_getStatus": { "usage": "val response = client.profile.getStatus()", @@ -246,8 +246,8 @@ "output": "AvatarData(imageUrl: String)" }, "ProfileOperations_updateStatus": { - "usage": "val request = StatusUpdateRequest(\n status = StatusUpdateRequestStatus(\n emoji = \"🎮\",\n title = \"Очень занят\",\n expiresAt = \"2024-04-08T10:00:00.000Z\",\n isAway = true,\n awayMessage = \"Вернусь после 15:00\"\n )\n)\nval response = client.profile.updateStatus(request = request)", - "output": "UserStatus(emoji: String, title: String, expiresAt: String?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)", + "usage": "val request = StatusUpdateRequest(\n status = StatusUpdateRequestStatus(\n emoji = \"🎮\",\n title = \"Очень занят\",\n expiresAt = OffsetDateTime.parse(\"2024-04-08T10:00:00.000Z\"),\n isAway = true,\n awayMessage = \"Вернусь после 15:00\"\n )\n)\nval response = client.profile.updateStatus(request = request)", + "output": "UserStatus(emoji: String, title: String, expiresAt: OffsetDateTime?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)", "imports": [ "StatusUpdateRequest", "StatusUpdateRequestStatus" @@ -260,7 +260,7 @@ "usage": "client.profile.deleteStatus()" }, "SearchOperations_searchChats": { - "usage": "val response = client.search.searchChats(query = \"Разработка\", limit = 10, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\", order = SortOrder.DESC, createdFrom = \"2025-01-01T00:00:00.000Z\", createdTo = \"2025-02-01T00:00:00.000Z\", active = true, chatSubtype = ChatSubtype.DISCUSSION, personal = false)", + "usage": "val createdFrom = OffsetDateTime.parse(\"2025-01-01T00:00:00.000Z\")\nval createdTo = OffsetDateTime.parse(\"2025-02-01T00:00:00.000Z\")\nval response = client.search.searchChats(query = \"Разработка\", limit = 10, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\", order = SortOrder.DESC, createdFrom = createdFrom, createdTo = createdTo, active = true, chatSubtype = ChatSubtype.DISCUSSION, personal = false)", "output": "SearchChatsResponse(data: List, meta: SearchPaginationMeta)", "imports": [ "ChatSubtype", @@ -268,14 +268,14 @@ ] }, "SearchOperations_searchMessages": { - "usage": "val chatIds = listOf(123)\nval userIds = listOf(123)\nval response = client.search.searchMessages(query = \"футболки\", limit = 10, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\", order = SortOrder.DESC, createdFrom = \"2025-01-01T00:00:00.000Z\", createdTo = \"2025-02-01T00:00:00.000Z\", chatIds = chatIds, userIds = userIds, active = true)", + "usage": "val createdFrom = OffsetDateTime.parse(\"2025-01-01T00:00:00.000Z\")\nval createdTo = OffsetDateTime.parse(\"2025-02-01T00:00:00.000Z\")\nval chatIds = listOf(123)\nval userIds = listOf(123)\nval response = client.search.searchMessages(query = \"футболки\", limit = 10, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\", order = SortOrder.DESC, createdFrom = createdFrom, createdTo = createdTo, chatIds = chatIds, userIds = userIds, active = true)", "output": "SearchMessagesResponse(data: List, meta: SearchPaginationMeta)", "imports": [ "SortOrder" ] }, "SearchOperations_searchUsers": { - "usage": "val companyRoles = listOf(UserRole.ADMIN)\nval response = client.search.searchUsers(query = \"Олег\", limit = 10, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\", sort = SearchSortOrder.BY_SCORE, order = SortOrder.DESC, createdFrom = \"2025-01-01T00:00:00.000Z\", createdTo = \"2025-02-01T00:00:00.000Z\", companyRoles = companyRoles)", + "usage": "val createdFrom = OffsetDateTime.parse(\"2025-01-01T00:00:00.000Z\")\nval createdTo = OffsetDateTime.parse(\"2025-02-01T00:00:00.000Z\")\nval companyRoles = listOf(UserRole.ADMIN)\nval response = client.search.searchUsers(query = \"Олег\", limit = 10, cursor = \"eyJpZCI6MTAsImRpciI6ImFzYyJ9\", sort = SearchSortOrder.BY_SCORE, order = SortOrder.DESC, createdFrom = createdFrom, createdTo = createdTo, companyRoles = companyRoles)", "output": "SearchUsersResponse(data: List, meta: SearchPaginationMeta)", "imports": [ "SearchSortOrder", @@ -289,11 +289,11 @@ }, "TaskOperations_getTask": { "usage": "val response = client.tasks.getTask(id = 22283)", - "output": "Task(id: Int, kind: TaskKind, content: String, dueAt: String?, priority: Int, userId: Int, chatId: Int?, status: TaskStatus, createdAt: String, performerIds: List, allDay: Boolean, customProperties: List)" + "output": "Task(id: Int, kind: TaskKind, content: String, dueAt: OffsetDateTime?, priority: Int, userId: Int, chatId: Int?, status: TaskStatus, createdAt: OffsetDateTime, performerIds: List, allDay: Boolean, customProperties: List)" }, "TaskOperations_createTask": { - "usage": "val request = TaskCreateRequest(\n task = TaskCreateRequestTask(\n kind = TaskKind.REMINDER,\n content = \"Забрать со склада 21 заказ\",\n dueAt = \"2020-06-05T12:00:00.000+03:00\",\n priority = 2,\n performerIds = listOf(123),\n chatId = 456,\n allDay = false,\n customProperties = listOf(TaskCreateRequestCustomProperty(id = 78, value = \"Синий склад\"))\n )\n)\nval response = client.tasks.createTask(request = request)", - "output": "Task(id: Int, kind: TaskKind, content: String, dueAt: String?, priority: Int, userId: Int, chatId: Int?, status: TaskStatus, createdAt: String, performerIds: List, allDay: Boolean, customProperties: List)", + "usage": "val request = TaskCreateRequest(\n task = TaskCreateRequestTask(\n kind = TaskKind.REMINDER,\n content = \"Забрать со склада 21 заказ\",\n dueAt = OffsetDateTime.parse(\"2020-06-05T12:00:00.000+03:00\"),\n priority = 2,\n performerIds = listOf(123),\n chatId = 456,\n allDay = false,\n customProperties = listOf(TaskCreateRequestCustomProperty(id = 78, value = \"Синий склад\"))\n )\n)\nval response = client.tasks.createTask(request = request)", + "output": "Task(id: Int, kind: TaskKind, content: String, dueAt: OffsetDateTime?, priority: Int, userId: Int, chatId: Int?, status: TaskStatus, createdAt: OffsetDateTime, performerIds: List, allDay: Boolean, customProperties: List)", "imports": [ "TaskCreateRequest", "TaskCreateRequestCustomProperty", @@ -302,8 +302,8 @@ ] }, "TaskOperations_updateTask": { - "usage": "val request = TaskUpdateRequest(\n task = TaskUpdateRequestTask(\n kind = TaskKind.REMINDER,\n content = \"Забрать со склада 21 заказ\",\n dueAt = \"2020-06-05T12:00:00.000+03:00\",\n priority = 2,\n performerIds = listOf(123),\n status = TaskStatus.DONE,\n allDay = false,\n doneAt = \"2020-06-05T12:00:00.000Z\",\n customProperties = listOf(TaskUpdateRequestCustomProperty(id = 78, value = \"Синий склад\"))\n )\n)\nval response = client.tasks.updateTask(id = 22283, request = request)", - "output": "Task(id: Int, kind: TaskKind, content: String, dueAt: String?, priority: Int, userId: Int, chatId: Int?, status: TaskStatus, createdAt: String, performerIds: List, allDay: Boolean, customProperties: List)", + "usage": "val request = TaskUpdateRequest(\n task = TaskUpdateRequestTask(\n kind = TaskKind.REMINDER,\n content = \"Забрать со склада 21 заказ\",\n dueAt = OffsetDateTime.parse(\"2020-06-05T12:00:00.000+03:00\"),\n priority = 2,\n performerIds = listOf(123),\n status = TaskStatus.DONE,\n allDay = false,\n doneAt = OffsetDateTime.parse(\"2020-06-05T12:00:00.000Z\"),\n customProperties = listOf(TaskUpdateRequestCustomProperty(id = 78, value = \"Синий склад\"))\n )\n)\nval response = client.tasks.updateTask(id = 22283, request = request)", + "output": "Task(id: Int, kind: TaskKind, content: String, dueAt: OffsetDateTime?, priority: Int, userId: Int, chatId: Int?, status: TaskStatus, createdAt: OffsetDateTime, performerIds: List, allDay: Boolean, customProperties: List)", "imports": [ "TaskKind", "TaskStatus", @@ -321,7 +321,7 @@ }, "UserOperations_getUser": { "usage": "val response = client.users.getUser(id = 12)", - "output": "User(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Boolean, inviteStatus: InviteStatus, listTags: List, customProperties: List, userStatus: UserStatus(emoji: String, title: String, expiresAt: String?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)?, bot: Boolean, sso: Boolean, createdAt: String, lastActivityAt: String, timeZone: String, imageUrl: String?)" + "output": "User(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Boolean, inviteStatus: InviteStatus, listTags: List, customProperties: List, userStatus: UserStatus(emoji: String, title: String, expiresAt: OffsetDateTime?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)?, bot: Boolean, sso: Boolean, createdAt: OffsetDateTime, lastActivityAt: OffsetDateTime, timeZone: String, imageUrl: String?)" }, "UserStatusOperations_getUserStatus": { "usage": "val response = client.users.getUserStatus(userId = 12)", @@ -329,7 +329,7 @@ }, "UserOperations_createUser": { "usage": "val request = UserCreateRequest(\n user = UserCreateRequestUser(\n firstName = \"Олег\",\n lastName = \"Петров\",\n email = \"olegp@example.com\",\n phoneNumber = \"+79001234567\",\n nickname = \"olegpetrov\",\n department = \"Продукт\",\n title = \"CIO\",\n role = UserRoleInput.USER,\n suspended = false,\n listTags = listOf(\"example\"),\n customProperties = listOf(UserCreateRequestCustomProperty(id = 1678, value = \"Санкт-Петербург\"))\n ),\n skipEmailNotify = true\n)\nval response = client.users.createUser(request = request)", - "output": "User(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Boolean, inviteStatus: InviteStatus, listTags: List, customProperties: List, userStatus: UserStatus(emoji: String, title: String, expiresAt: String?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)?, bot: Boolean, sso: Boolean, createdAt: String, lastActivityAt: String, timeZone: String, imageUrl: String?)", + "output": "User(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Boolean, inviteStatus: InviteStatus, listTags: List, customProperties: List, userStatus: UserStatus(emoji: String, title: String, expiresAt: OffsetDateTime?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)?, bot: Boolean, sso: Boolean, createdAt: OffsetDateTime, lastActivityAt: OffsetDateTime, timeZone: String, imageUrl: String?)", "imports": [ "UserCreateRequest", "UserCreateRequestCustomProperty", @@ -339,7 +339,7 @@ }, "UserOperations_updateUser": { "usage": "val request = UserUpdateRequest(\n user = UserUpdateRequestUser(\n firstName = \"Олег\",\n lastName = \"Петров\",\n email = \"olegpetrov@example.com\",\n phoneNumber = \"+79001234567\",\n nickname = \"olegpetrov\",\n department = \"Отдел разработки\",\n title = \"Старший разработчик\",\n role = UserRoleInput.USER,\n suspended = false,\n listTags = listOf(\"example\"),\n customProperties = listOf(UserUpdateRequestCustomProperty(id = 1678, value = \"Санкт-Петербург\"))\n )\n)\nval response = client.users.updateUser(id = 12, request = request)", - "output": "User(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Boolean, inviteStatus: InviteStatus, listTags: List, customProperties: List, userStatus: UserStatus(emoji: String, title: String, expiresAt: String?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)?, bot: Boolean, sso: Boolean, createdAt: String, lastActivityAt: String, timeZone: String, imageUrl: String?)", + "output": "User(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Boolean, inviteStatus: InviteStatus, listTags: List, customProperties: List, userStatus: UserStatus(emoji: String, title: String, expiresAt: OffsetDateTime?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)?, bot: Boolean, sso: Boolean, createdAt: OffsetDateTime, lastActivityAt: OffsetDateTime, timeZone: String, imageUrl: String?)", "imports": [ "UserRoleInput", "UserUpdateRequest", @@ -352,8 +352,8 @@ "output": "AvatarData(imageUrl: String)" }, "UserStatusOperations_updateUserStatus": { - "usage": "val request = StatusUpdateRequest(\n status = StatusUpdateRequestStatus(\n emoji = \"🎮\",\n title = \"Очень занят\",\n expiresAt = \"2024-04-08T10:00:00.000Z\",\n isAway = true,\n awayMessage = \"Вернусь после 15:00\"\n )\n)\nval response = client.users.updateUserStatus(userId = 12, request = request)", - "output": "UserStatus(emoji: String, title: String, expiresAt: String?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)", + "usage": "val request = StatusUpdateRequest(\n status = StatusUpdateRequestStatus(\n emoji = \"🎮\",\n title = \"Очень занят\",\n expiresAt = OffsetDateTime.parse(\"2024-04-08T10:00:00.000Z\"),\n isAway = true,\n awayMessage = \"Вернусь после 15:00\"\n )\n)\nval response = client.users.updateUserStatus(userId = 12, request = request)", + "output": "UserStatus(emoji: String, title: String, expiresAt: OffsetDateTime?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)", "imports": [ "StatusUpdateRequest", "StatusUpdateRequestStatus" diff --git a/sdk/python/generated/pachca/client.py b/sdk/python/generated/pachca/client.py index a4a6a4b5..14b8e9b6 100644 --- a/sdk/python/generated/pachca/client.py +++ b/sdk/python/generated/pachca/client.py @@ -89,9 +89,9 @@ async def get_audit_events( ) -> GetAuditEventsResponse: query: dict[str, str] = {} if params is not None and params.start_time is not None: - query["start_time"] = params.start_time + query["start_time"] = params.start_time.isoformat() if params is not None and params.end_time is not None: - query["end_time"] = params.end_time + query["end_time"] = params.end_time.isoformat() if params is not None and params.event_key is not None: query["event_key"] = params.event_key if params is not None and params.actor_id is not None: @@ -230,9 +230,9 @@ async def list_chats( if params is not None and params.availability is not None: query["availability"] = params.availability if params is not None and params.last_message_at_after is not None: - query["last_message_at_after"] = params.last_message_at_after + query["last_message_at_after"] = params.last_message_at_after.isoformat() if params is not None and params.last_message_at_before is not None: - query["last_message_at_before"] = params.last_message_at_before + query["last_message_at_before"] = params.last_message_at_before.isoformat() if params is not None and params.personal is not None: query["personal"] = str(params.personal).lower() if params is not None and params.limit is not None: @@ -1197,9 +1197,9 @@ async def search_chats( if params is not None and params.order is not None: query["order"] = params.order if params is not None and params.created_from is not None: - query["created_from"] = params.created_from + query["created_from"] = params.created_from.isoformat() if params is not None and params.created_to is not None: - query["created_to"] = params.created_to + query["created_to"] = params.created_to.isoformat() if params is not None and params.active is not None: query["active"] = str(params.active).lower() if params is not None and params.chat_subtype is not None: @@ -1250,9 +1250,9 @@ async def search_messages( if params is not None and params.order is not None: query.append(("order", params.order)) if params is not None and params.created_from is not None: - query.append(("created_from", params.created_from)) + query.append(("created_from", params.created_from.isoformat())) if params is not None and params.created_to is not None: - query.append(("created_to", params.created_to)) + query.append(("created_to", params.created_to.isoformat())) if params is not None and params.chat_ids is not None: for v in params.chat_ids: query.append(("chat_ids[]", str(v))) @@ -1307,9 +1307,9 @@ async def search_users( if params is not None and params.order is not None: query.append(("order", params.order)) if params is not None and params.created_from is not None: - query.append(("created_from", params.created_from)) + query.append(("created_from", params.created_from.isoformat())) if params is not None and params.created_to is not None: - query.append(("created_to", params.created_to)) + query.append(("created_to", params.created_to.isoformat())) if params is not None and params.company_roles is not None: for v in params.company_roles: query.append(("company_roles[]", str(v))) diff --git a/sdk/python/generated/pachca/examples.json b/sdk/python/generated/pachca/examples.json index 6a180606..09ca3b42 100644 --- a/sdk/python/generated/pachca/examples.json +++ b/sdk/python/generated/pachca/examples.json @@ -6,7 +6,7 @@ ] }, "SecurityOperations_getAuditEvents": { - "usage": "params = GetAuditEventsParams(\n start_time=\"2025-05-01T09:11:00Z\",\n end_time=\"2025-05-02T09:11:00Z\",\n event_key=AuditEventKey.USER_LOGIN,\n actor_id=\"98765\",\n actor_type=\"User\",\n entity_id=\"98765\",\n entity_type=\"User\",\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.security.get_audit_events(params=params)", + "usage": "params = GetAuditEventsParams(\n start_time=datetime.fromisoformat(\"2025-05-01T09:11:00Z\"),\n end_time=datetime.fromisoformat(\"2025-05-02T09:11:00Z\"),\n event_key=AuditEventKey.USER_LOGIN,\n actor_id=\"98765\",\n actor_type=\"User\",\n entity_id=\"98765\",\n entity_type=\"User\",\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.security.get_audit_events(params=params)", "output": "GetAuditEventsResponse(data: list[AuditEvent], meta: PaginationMeta)", "imports": [ "AuditEventKey", @@ -33,7 +33,7 @@ "usage": "await client.bots.delete_webhook_event(id=\"01KAJZ2XDSS2S3DSW9EXJZ0TBV\")" }, "ChatOperations_listChats": { - "usage": "params = ListChatsParams(\n sort=ChatSortField.ID,\n order=SortOrder.DESC,\n availability=ChatAvailability.IS_MEMBER,\n last_message_at_after=\"2025-01-01T00:00:00.000Z\",\n last_message_at_before=\"2025-02-01T00:00:00.000Z\",\n personal=False,\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.chats.list_chats(params=params)", + "usage": "params = ListChatsParams(\n sort=ChatSortField.ID,\n order=SortOrder.DESC,\n availability=ChatAvailability.IS_MEMBER,\n last_message_at_after=datetime.fromisoformat(\"2025-01-01T00:00:00.000Z\"),\n last_message_at_before=datetime.fromisoformat(\"2025-02-01T00:00:00.000Z\"),\n personal=False,\n limit=1,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\"\n)\nresponse = await client.chats.list_chats(params=params)", "output": "ListChatsResponse(data: list[Chat], meta: PaginationMeta)", "imports": [ "ChatAvailability", @@ -44,11 +44,11 @@ }, "ChatOperations_getChat": { "usage": "response = await client.chats.get_chat(id=334)", - "output": "Chat(id: int, name: str, created_at: str, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: str, meet_room_url: str)" + "output": "Chat(id: int, name: str, created_at: datetime, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: datetime, meet_room_url: str)" }, "ChatOperations_createChat": { "usage": "request = ChatCreateRequest(\n chat=ChatCreateRequestChat(\n name=\"🤿 aqua\",\n member_ids=[123],\n group_tag_ids=[123],\n channel=True,\n public=False\n )\n)\nresponse = await client.chats.create_chat(request=request)", - "output": "Chat(id: int, name: str, created_at: str, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: str, meet_room_url: str)", + "output": "Chat(id: int, name: str, created_at: datetime, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: datetime, meet_room_url: str)", "imports": [ "ChatCreateRequest", "ChatCreateRequestChat" @@ -56,7 +56,7 @@ }, "ChatOperations_updateChat": { "usage": "request = ChatUpdateRequest(chat=ChatUpdateRequestChat(name=\"Бассейн\", public=True))\nresponse = await client.chats.update_chat(id=334, request=request)", - "output": "Chat(id: int, name: str, created_at: str, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: str, meet_room_url: str)", + "output": "Chat(id: int, name: str, created_at: datetime, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: datetime, meet_room_url: str)", "imports": [ "ChatUpdateRequest", "ChatUpdateRequestChat" @@ -176,11 +176,11 @@ }, "MessageOperations_getMessage": { "usage": "response = await client.messages.get_message(id=194275)", - "output": "Message(id: int, entity_type: MessageEntityType, entity_id: int, chat_id: int, root_chat_id: int, content: str, user_id: int, created_at: str, url: str, files: list[File(id: int, key: str, name: str, file_type: FileType, url: str, width: int | None, height: int | None)], buttons: list[list[Button(text: str, url: str | None, data: str | None)]] | None, thread: MessageThread(id: int, chat_id: int) | None, forwarding: Forwarding(original_message_id: int, original_chat_id: int, author_id: int, original_created_at: str, original_thread_id: int | None, original_thread_message_id: int | None, original_thread_parent_chat_id: int | None) | None, parent_message_id: int | None, display_avatar_url: str | None, display_name: str | None, changed_at: str | None, deleted_at: str | None)" + "output": "Message(id: int, entity_type: MessageEntityType, entity_id: int, chat_id: int, root_chat_id: int, content: str, user_id: int, created_at: datetime, url: str, files: list[File(id: int, key: str, name: str, file_type: FileType, url: str, width: int | None, height: int | None)], buttons: list[list[Button(text: str, url: str | None, data: str | None)]] | None, thread: MessageThread(id: int, chat_id: int) | None, forwarding: Forwarding(original_message_id: int, original_chat_id: int, author_id: int, original_created_at: datetime, original_thread_id: int | None, original_thread_message_id: int | None, original_thread_parent_chat_id: int | None) | None, parent_message_id: int | None, display_avatar_url: str | None, display_name: str | None, changed_at: datetime | None, deleted_at: datetime | None)" }, "MessageOperations_createMessage": { "usage": "request = MessageCreateRequest(\n message=MessageCreateRequestMessage(\n entity_type=MessageEntityType.DISCUSSION,\n entity_id=334,\n content=\"Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)\",\n files=[MessageCreateRequestFile(\n key=\"attaches/files/93746/e354fd79-4f3e-4b5a-9c8d-1a2b3c4d5e6f/logo.png\",\n name=\"logo.png\",\n file_type=FileType.IMAGE,\n size=12345,\n width=800,\n height=600\n )],\n buttons=[[Button(\n text=\"Подробнее\",\n url=\"https://example.com/details\",\n data=\"awesome\"\n )]],\n parent_message_id=194270,\n display_avatar_url=\"https://example.com/avatar.png\",\n display_name=\"Бот Поддержки\",\n skip_invite_mentions=False\n ),\n link_preview=False\n)\nresponse = await client.messages.create_message(request=request)", - "output": "Message(id: int, entity_type: MessageEntityType, entity_id: int, chat_id: int, root_chat_id: int, content: str, user_id: int, created_at: str, url: str, files: list[File(id: int, key: str, name: str, file_type: FileType, url: str, width: int | None, height: int | None)], buttons: list[list[Button(text: str, url: str | None, data: str | None)]] | None, thread: MessageThread(id: int, chat_id: int) | None, forwarding: Forwarding(original_message_id: int, original_chat_id: int, author_id: int, original_created_at: str, original_thread_id: int | None, original_thread_message_id: int | None, original_thread_parent_chat_id: int | None) | None, parent_message_id: int | None, display_avatar_url: str | None, display_name: str | None, changed_at: str | None, deleted_at: str | None)", + "output": "Message(id: int, entity_type: MessageEntityType, entity_id: int, chat_id: int, root_chat_id: int, content: str, user_id: int, created_at: datetime, url: str, files: list[File(id: int, key: str, name: str, file_type: FileType, url: str, width: int | None, height: int | None)], buttons: list[list[Button(text: str, url: str | None, data: str | None)]] | None, thread: MessageThread(id: int, chat_id: int) | None, forwarding: Forwarding(original_message_id: int, original_chat_id: int, author_id: int, original_created_at: datetime, original_thread_id: int | None, original_thread_message_id: int | None, original_thread_parent_chat_id: int | None) | None, parent_message_id: int | None, display_avatar_url: str | None, display_name: str | None, changed_at: datetime | None, deleted_at: datetime | None)", "imports": [ "Button", "FileType", @@ -195,7 +195,7 @@ }, "MessageOperations_updateMessage": { "usage": "request = MessageUpdateRequest(\n message=MessageUpdateRequestMessage(\n content=\"Вот попробуйте написать правильно это с первого раза: Будущий, Полощи, Прийти, Грейпфрут, Мозаика, Бюллетень, Дуршлаг, Винегрет.\",\n files=[MessageUpdateRequestFile(\n key=\"attaches/files/93746/e354fd79-4f3e-4b5a-9c8d-1a2b3c4d5e6f/logo.png\",\n name=\"logo.png\",\n file_type=\"image\",\n size=12345,\n width=800,\n height=600\n )],\n buttons=[[Button(\n text=\"Подробнее\",\n url=\"https://example.com/details\",\n data=\"awesome\"\n )]],\n display_avatar_url=\"https://example.com/avatar.png\",\n display_name=\"Бот Поддержки\"\n )\n)\nresponse = await client.messages.update_message(id=194275, request=request)", - "output": "Message(id: int, entity_type: MessageEntityType, entity_id: int, chat_id: int, root_chat_id: int, content: str, user_id: int, created_at: str, url: str, files: list[File(id: int, key: str, name: str, file_type: FileType, url: str, width: int | None, height: int | None)], buttons: list[list[Button(text: str, url: str | None, data: str | None)]] | None, thread: MessageThread(id: int, chat_id: int) | None, forwarding: Forwarding(original_message_id: int, original_chat_id: int, author_id: int, original_created_at: str, original_thread_id: int | None, original_thread_message_id: int | None, original_thread_parent_chat_id: int | None) | None, parent_message_id: int | None, display_avatar_url: str | None, display_name: str | None, changed_at: str | None, deleted_at: str | None)", + "output": "Message(id: int, entity_type: MessageEntityType, entity_id: int, chat_id: int, root_chat_id: int, content: str, user_id: int, created_at: datetime, url: str, files: list[File(id: int, key: str, name: str, file_type: FileType, url: str, width: int | None, height: int | None)], buttons: list[list[Button(text: str, url: str | None, data: str | None)]] | None, thread: MessageThread(id: int, chat_id: int) | None, forwarding: Forwarding(original_message_id: int, original_chat_id: int, author_id: int, original_created_at: datetime, original_thread_id: int | None, original_thread_message_id: int | None, original_thread_parent_chat_id: int | None) | None, parent_message_id: int | None, display_avatar_url: str | None, display_name: str | None, changed_at: datetime | None, deleted_at: datetime | None)", "imports": [ "Button", "MessageUpdateRequest", @@ -226,7 +226,7 @@ }, "ReactionOperations_addReaction": { "usage": "request = ReactionRequest(code=\"👍\", name=\":+1:\")\nresponse = await client.reactions.add_reaction(id=7231942, request=request)", - "output": "Reaction(user_id: int, created_at: str, code: str, name: str | None)", + "output": "Reaction(user_id: int, created_at: datetime, code: str, name: str | None)", "imports": [ "ReactionRequest" ] @@ -246,19 +246,19 @@ }, "ThreadOperations_getThread": { "usage": "response = await client.threads.get_thread(id=265142)", - "output": "Thread(id: int, chat_id: int, message_id: int, message_chat_id: int, updated_at: str)" + "output": "Thread(id: int, chat_id: int, message_id: int, message_chat_id: int, updated_at: datetime)" }, "ThreadOperations_createThread": { "usage": "response = await client.threads.create_thread(id=154332686)", - "output": "Thread(id: int, chat_id: int, message_id: int, message_chat_id: int, updated_at: str)" + "output": "Thread(id: int, chat_id: int, message_id: int, message_chat_id: int, updated_at: datetime)" }, "OAuthOperations_getTokenInfo": { "usage": "response = await client.profile.get_token_info()", - "output": "AccessTokenInfo(id: int, token: str, name: str | None, user_id: int, scopes: list[OAuthScope], created_at: str, revoked_at: str | None, expires_in: int | None, last_used_at: str | None)" + "output": "AccessTokenInfo(id: int, token: str, name: str | None, user_id: int, scopes: list[OAuthScope], created_at: datetime, revoked_at: datetime | None, expires_in: int | None, last_used_at: datetime | None)" }, "ProfileOperations_getProfile": { "usage": "response = await client.profile.get_profile()", - "output": "User(id: int, first_name: str, last_name: str, nickname: str, email: str, phone_number: str, department: str, title: str, role: UserRole, suspended: bool, invite_status: InviteStatus, list_tags: list[str], custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)], user_status: UserStatus(emoji: str, title: str, expires_at: str | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None) | None, bot: bool, sso: bool, created_at: str, last_activity_at: str, time_zone: str, image_url: str | None)" + "output": "User(id: int, first_name: str, last_name: str, nickname: str, email: str, phone_number: str, department: str, title: str, role: UserRole, suspended: bool, invite_status: InviteStatus, list_tags: list[str], custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)], user_status: UserStatus(emoji: str, title: str, expires_at: datetime | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None) | None, bot: bool, sso: bool, created_at: datetime, last_activity_at: datetime, time_zone: str, image_url: str | None)" }, "ProfileOperations_getStatus": { "usage": "response = await client.profile.get_status()", @@ -269,8 +269,8 @@ "output": "AvatarData(image_url: str)" }, "ProfileOperations_updateStatus": { - "usage": "request = StatusUpdateRequest(\n status=StatusUpdateRequestStatus(\n emoji=\"🎮\",\n title=\"Очень занят\",\n expires_at=\"2024-04-08T10:00:00.000Z\",\n is_away=True,\n away_message=\"Вернусь после 15:00\"\n )\n)\nresponse = await client.profile.update_status(request=request)", - "output": "UserStatus(emoji: str, title: str, expires_at: str | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None)", + "usage": "request = StatusUpdateRequest(\n status=StatusUpdateRequestStatus(\n emoji=\"🎮\",\n title=\"Очень занят\",\n expires_at=datetime.fromisoformat(\"2024-04-08T10:00:00.000Z\"),\n is_away=True,\n away_message=\"Вернусь после 15:00\"\n )\n)\nresponse = await client.profile.update_status(request=request)", + "output": "UserStatus(emoji: str, title: str, expires_at: datetime | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None)", "imports": [ "StatusUpdateRequest", "StatusUpdateRequestStatus" @@ -283,7 +283,7 @@ "usage": "await client.profile.delete_status()" }, "SearchOperations_searchChats": { - "usage": "params = SearchChatsParams(\n query=\"Разработка\",\n limit=10,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\",\n order=SortOrder.DESC,\n created_from=\"2025-01-01T00:00:00.000Z\",\n created_to=\"2025-02-01T00:00:00.000Z\",\n active=True,\n chat_subtype=ChatSubtype.DISCUSSION,\n personal=False\n)\nresponse = await client.search.search_chats(params=params)", + "usage": "params = SearchChatsParams(\n query=\"Разработка\",\n limit=10,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\",\n order=SortOrder.DESC,\n created_from=datetime.fromisoformat(\"2025-01-01T00:00:00.000Z\"),\n created_to=datetime.fromisoformat(\"2025-02-01T00:00:00.000Z\"),\n active=True,\n chat_subtype=ChatSubtype.DISCUSSION,\n personal=False\n)\nresponse = await client.search.search_chats(params=params)", "output": "SearchChatsResponse(data: list[Chat], meta: SearchPaginationMeta)", "imports": [ "ChatSubtype", @@ -292,7 +292,7 @@ ] }, "SearchOperations_searchMessages": { - "usage": "params = SearchMessagesParams(\n query=\"футболки\",\n limit=10,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\",\n order=SortOrder.DESC,\n created_from=\"2025-01-01T00:00:00.000Z\",\n created_to=\"2025-02-01T00:00:00.000Z\",\n chat_ids=[123],\n user_ids=[123],\n active=True\n)\nresponse = await client.search.search_messages(params=params)", + "usage": "params = SearchMessagesParams(\n query=\"футболки\",\n limit=10,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\",\n order=SortOrder.DESC,\n created_from=datetime.fromisoformat(\"2025-01-01T00:00:00.000Z\"),\n created_to=datetime.fromisoformat(\"2025-02-01T00:00:00.000Z\"),\n chat_ids=[123],\n user_ids=[123],\n active=True\n)\nresponse = await client.search.search_messages(params=params)", "output": "SearchMessagesResponse(data: list[Message], meta: SearchPaginationMeta)", "imports": [ "SearchMessagesParams", @@ -300,7 +300,7 @@ ] }, "SearchOperations_searchUsers": { - "usage": "params = SearchUsersParams(\n query=\"Олег\",\n limit=10,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\",\n sort=SearchSortOrder.BY_SCORE,\n order=SortOrder.DESC,\n created_from=\"2025-01-01T00:00:00.000Z\",\n created_to=\"2025-02-01T00:00:00.000Z\",\n company_roles=[UserRole.ADMIN]\n)\nresponse = await client.search.search_users(params=params)", + "usage": "params = SearchUsersParams(\n query=\"Олег\",\n limit=10,\n cursor=\"eyJpZCI6MTAsImRpciI6ImFzYyJ9\",\n sort=SearchSortOrder.BY_SCORE,\n order=SortOrder.DESC,\n created_from=datetime.fromisoformat(\"2025-01-01T00:00:00.000Z\"),\n created_to=datetime.fromisoformat(\"2025-02-01T00:00:00.000Z\"),\n company_roles=[UserRole.ADMIN]\n)\nresponse = await client.search.search_users(params=params)", "output": "SearchUsersResponse(data: list[User], meta: SearchPaginationMeta)", "imports": [ "SearchSortOrder", @@ -318,11 +318,11 @@ }, "TaskOperations_getTask": { "usage": "response = await client.tasks.get_task(id=22283)", - "output": "Task(id: int, kind: TaskKind, content: str, due_at: str | None, priority: int, user_id: int, chat_id: int | None, status: TaskStatus, created_at: str, performer_ids: list[int], all_day: bool, custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)])" + "output": "Task(id: int, kind: TaskKind, content: str, due_at: datetime | None, priority: int, user_id: int, chat_id: int | None, status: TaskStatus, created_at: datetime, performer_ids: list[int], all_day: bool, custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)])" }, "TaskOperations_createTask": { - "usage": "request = TaskCreateRequest(\n task=TaskCreateRequestTask(\n kind=TaskKind.REMINDER,\n content=\"Забрать со склада 21 заказ\",\n due_at=\"2020-06-05T12:00:00.000+03:00\",\n priority=2,\n performer_ids=[123],\n chat_id=456,\n all_day=False,\n custom_properties=[TaskCreateRequestCustomProperty(id=78, value=\"Синий склад\")]\n )\n)\nresponse = await client.tasks.create_task(request=request)", - "output": "Task(id: int, kind: TaskKind, content: str, due_at: str | None, priority: int, user_id: int, chat_id: int | None, status: TaskStatus, created_at: str, performer_ids: list[int], all_day: bool, custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)])", + "usage": "request = TaskCreateRequest(\n task=TaskCreateRequestTask(\n kind=TaskKind.REMINDER,\n content=\"Забрать со склада 21 заказ\",\n due_at=datetime.fromisoformat(\"2020-06-05T12:00:00.000+03:00\"),\n priority=2,\n performer_ids=[123],\n chat_id=456,\n all_day=False,\n custom_properties=[TaskCreateRequestCustomProperty(id=78, value=\"Синий склад\")]\n )\n)\nresponse = await client.tasks.create_task(request=request)", + "output": "Task(id: int, kind: TaskKind, content: str, due_at: datetime | None, priority: int, user_id: int, chat_id: int | None, status: TaskStatus, created_at: datetime, performer_ids: list[int], all_day: bool, custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)])", "imports": [ "TaskCreateRequest", "TaskCreateRequestCustomProperty", @@ -331,8 +331,8 @@ ] }, "TaskOperations_updateTask": { - "usage": "request = TaskUpdateRequest(\n task=TaskUpdateRequestTask(\n kind=TaskKind.REMINDER,\n content=\"Забрать со склада 21 заказ\",\n due_at=\"2020-06-05T12:00:00.000+03:00\",\n priority=2,\n performer_ids=[123],\n status=TaskStatus.DONE,\n all_day=False,\n done_at=\"2020-06-05T12:00:00.000Z\",\n custom_properties=[TaskUpdateRequestCustomProperty(id=78, value=\"Синий склад\")]\n )\n)\nresponse = await client.tasks.update_task(id=22283, request=request)", - "output": "Task(id: int, kind: TaskKind, content: str, due_at: str | None, priority: int, user_id: int, chat_id: int | None, status: TaskStatus, created_at: str, performer_ids: list[int], all_day: bool, custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)])", + "usage": "request = TaskUpdateRequest(\n task=TaskUpdateRequestTask(\n kind=TaskKind.REMINDER,\n content=\"Забрать со склада 21 заказ\",\n due_at=datetime.fromisoformat(\"2020-06-05T12:00:00.000+03:00\"),\n priority=2,\n performer_ids=[123],\n status=TaskStatus.DONE,\n all_day=False,\n done_at=datetime.fromisoformat(\"2020-06-05T12:00:00.000Z\"),\n custom_properties=[TaskUpdateRequestCustomProperty(id=78, value=\"Синий склад\")]\n )\n)\nresponse = await client.tasks.update_task(id=22283, request=request)", + "output": "Task(id: int, kind: TaskKind, content: str, due_at: datetime | None, priority: int, user_id: int, chat_id: int | None, status: TaskStatus, created_at: datetime, performer_ids: list[int], all_day: bool, custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)])", "imports": [ "TaskKind", "TaskStatus", @@ -353,7 +353,7 @@ }, "UserOperations_getUser": { "usage": "response = await client.users.get_user(id=12)", - "output": "User(id: int, first_name: str, last_name: str, nickname: str, email: str, phone_number: str, department: str, title: str, role: UserRole, suspended: bool, invite_status: InviteStatus, list_tags: list[str], custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)], user_status: UserStatus(emoji: str, title: str, expires_at: str | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None) | None, bot: bool, sso: bool, created_at: str, last_activity_at: str, time_zone: str, image_url: str | None)" + "output": "User(id: int, first_name: str, last_name: str, nickname: str, email: str, phone_number: str, department: str, title: str, role: UserRole, suspended: bool, invite_status: InviteStatus, list_tags: list[str], custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)], user_status: UserStatus(emoji: str, title: str, expires_at: datetime | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None) | None, bot: bool, sso: bool, created_at: datetime, last_activity_at: datetime, time_zone: str, image_url: str | None)" }, "UserStatusOperations_getUserStatus": { "usage": "response = await client.users.get_user_status(user_id=12)", @@ -361,7 +361,7 @@ }, "UserOperations_createUser": { "usage": "request = UserCreateRequest(\n user=UserCreateRequestUser(\n first_name=\"Олег\",\n last_name=\"Петров\",\n email=\"olegp@example.com\",\n phone_number=\"+79001234567\",\n nickname=\"olegpetrov\",\n department=\"Продукт\",\n title=\"CIO\",\n role=UserRoleInput.USER,\n suspended=False,\n list_tags=[\"example\"],\n custom_properties=[UserCreateRequestCustomProperty(id=1678, value=\"Санкт-Петербург\")]\n ),\n skip_email_notify=True\n)\nresponse = await client.users.create_user(request=request)", - "output": "User(id: int, first_name: str, last_name: str, nickname: str, email: str, phone_number: str, department: str, title: str, role: UserRole, suspended: bool, invite_status: InviteStatus, list_tags: list[str], custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)], user_status: UserStatus(emoji: str, title: str, expires_at: str | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None) | None, bot: bool, sso: bool, created_at: str, last_activity_at: str, time_zone: str, image_url: str | None)", + "output": "User(id: int, first_name: str, last_name: str, nickname: str, email: str, phone_number: str, department: str, title: str, role: UserRole, suspended: bool, invite_status: InviteStatus, list_tags: list[str], custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)], user_status: UserStatus(emoji: str, title: str, expires_at: datetime | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None) | None, bot: bool, sso: bool, created_at: datetime, last_activity_at: datetime, time_zone: str, image_url: str | None)", "imports": [ "UserCreateRequest", "UserCreateRequestCustomProperty", @@ -371,7 +371,7 @@ }, "UserOperations_updateUser": { "usage": "request = UserUpdateRequest(\n user=UserUpdateRequestUser(\n first_name=\"Олег\",\n last_name=\"Петров\",\n email=\"olegpetrov@example.com\",\n phone_number=\"+79001234567\",\n nickname=\"olegpetrov\",\n department=\"Отдел разработки\",\n title=\"Старший разработчик\",\n role=UserRoleInput.USER,\n suspended=False,\n list_tags=[\"example\"],\n custom_properties=[UserUpdateRequestCustomProperty(id=1678, value=\"Санкт-Петербург\")]\n )\n)\nresponse = await client.users.update_user(id=12, request=request)", - "output": "User(id: int, first_name: str, last_name: str, nickname: str, email: str, phone_number: str, department: str, title: str, role: UserRole, suspended: bool, invite_status: InviteStatus, list_tags: list[str], custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)], user_status: UserStatus(emoji: str, title: str, expires_at: str | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None) | None, bot: bool, sso: bool, created_at: str, last_activity_at: str, time_zone: str, image_url: str | None)", + "output": "User(id: int, first_name: str, last_name: str, nickname: str, email: str, phone_number: str, department: str, title: str, role: UserRole, suspended: bool, invite_status: InviteStatus, list_tags: list[str], custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)], user_status: UserStatus(emoji: str, title: str, expires_at: datetime | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None) | None, bot: bool, sso: bool, created_at: datetime, last_activity_at: datetime, time_zone: str, image_url: str | None)", "imports": [ "UserRoleInput", "UserUpdateRequest", @@ -384,8 +384,8 @@ "output": "AvatarData(image_url: str)" }, "UserStatusOperations_updateUserStatus": { - "usage": "request = StatusUpdateRequest(\n status=StatusUpdateRequestStatus(\n emoji=\"🎮\",\n title=\"Очень занят\",\n expires_at=\"2024-04-08T10:00:00.000Z\",\n is_away=True,\n away_message=\"Вернусь после 15:00\"\n )\n)\nresponse = await client.users.update_user_status(user_id=12, request=request)", - "output": "UserStatus(emoji: str, title: str, expires_at: str | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None)", + "usage": "request = StatusUpdateRequest(\n status=StatusUpdateRequestStatus(\n emoji=\"🎮\",\n title=\"Очень занят\",\n expires_at=datetime.fromisoformat(\"2024-04-08T10:00:00.000Z\"),\n is_away=True,\n away_message=\"Вернусь после 15:00\"\n )\n)\nresponse = await client.users.update_user_status(user_id=12, request=request)", + "output": "UserStatus(emoji: str, title: str, expires_at: datetime | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None)", "imports": [ "StatusUpdateRequest", "StatusUpdateRequestStatus" diff --git a/sdk/python/generated/pachca/models.py b/sdk/python/generated/pachca/models.py index 0b3551e4..dc77adc3 100644 --- a/sdk/python/generated/pachca/models.py +++ b/sdk/python/generated/pachca/models.py @@ -1,5 +1,6 @@ from __future__ import annotations +from datetime import datetime from dataclasses import dataclass from enum import StrEnum from typing import Union @@ -308,11 +309,11 @@ class AccessTokenInfo: token: str user_id: int scopes: list[OAuthScope] - created_at: str + created_at: datetime name: str | None = None - revoked_at: str | None = None + revoked_at: datetime | None = None expires_in: int | None = None - last_used_at: str | None = None + last_used_at: datetime | None = None @dataclass @@ -429,7 +430,7 @@ class AuditDetailsUserUpdated: @dataclass class AuditEvent: id: str - created_at: str + created_at: datetime event_key: AuditEventKey entity_id: str entity_type: str @@ -494,14 +495,14 @@ class ButtonWebhookPayload: class Chat: id: int name: str - created_at: str + created_at: datetime owner_id: int member_ids: list[int] group_tag_ids: list[int] channel: bool personal: bool public: bool - last_message_at: str + last_message_at: datetime meet_room_url: str @@ -525,7 +526,7 @@ class ChatMemberWebhookPayload: event: MemberEventType chat_id: int user_ids: list[int] - created_at: str + created_at: datetime webhook_timestamp: int thread_id: int | None = None @@ -546,7 +547,7 @@ class CompanyMemberWebhookPayload: type: str # literal "company_member" event: UserEventType user_ids: list[int] - created_at: str + created_at: datetime webhook_timestamp: int @@ -603,7 +604,7 @@ class Forwarding: original_message_id: int original_chat_id: int author_id: int - original_created_at: str + original_created_at: datetime original_thread_id: int | None = None original_thread_message_id: int | None = None original_thread_parent_chat_id: int | None = None @@ -654,7 +655,7 @@ class LinkSharedWebhookPayload: message_id: int links: list[WebhookLink] user_id: int - created_at: str + created_at: datetime webhook_timestamp: int @@ -673,7 +674,7 @@ class Message: root_chat_id: int content: str user_id: int - created_at: str + created_at: datetime url: str files: list[File] buttons: list[list[Button]] | None = None @@ -682,8 +683,8 @@ class Message: parent_message_id: int | None = None display_avatar_url: str | None = None display_name: str | None = None - changed_at: str | None = None - deleted_at: str | None = None + changed_at: datetime | None = None + deleted_at: datetime | None = None @dataclass @@ -748,7 +749,7 @@ class MessageWebhookPayload: entity_id: int content: str user_id: int - created_at: str + created_at: datetime url: str chat_id: int webhook_timestamp: int @@ -792,7 +793,7 @@ class PaginationMeta: @dataclass class Reaction: user_id: int - created_at: str + created_at: datetime code: str name: str | None = None @@ -811,7 +812,7 @@ class ReactionWebhookPayload: code: str name: str user_id: int - created_at: str + created_at: datetime webhook_timestamp: int @@ -830,7 +831,7 @@ class SearchPaginationMeta: class StatusUpdateRequestStatus: emoji: str title: str - expires_at: str | None = None + expires_at: datetime | None = None is_away: bool | None = None away_message: str | None = None @@ -848,11 +849,11 @@ class Task: priority: int user_id: int status: TaskStatus - created_at: str + created_at: datetime performer_ids: list[int] all_day: bool custom_properties: list[CustomProperty] - due_at: str | None = None + due_at: datetime | None = None chat_id: int | None = None @@ -866,7 +867,7 @@ class TaskCreateRequestCustomProperty: class TaskCreateRequestTask: kind: TaskKind content: str | None = None - due_at: str | None = None + due_at: datetime | None = None priority: int | None = 1 performer_ids: list[int] | None = None chat_id: int | None = None @@ -889,12 +890,12 @@ class TaskUpdateRequestCustomProperty: class TaskUpdateRequestTask: kind: TaskKind | None = None content: str | None = None - due_at: str | None = None + due_at: datetime | None = None priority: int | None = None performer_ids: list[int] | None = None status: TaskStatus | None = None all_day: bool | None = None - done_at: str | None = None + done_at: datetime | None = None custom_properties: list[TaskUpdateRequestCustomProperty] | None = None @@ -909,7 +910,7 @@ class Thread: chat_id: int message_id: int message_chat_id: int - updated_at: str + updated_at: datetime @dataclass @@ -947,8 +948,8 @@ class User: custom_properties: list[CustomProperty] bot: bool sso: bool - created_at: str - last_activity_at: str + created_at: datetime + last_activity_at: datetime time_zone: str user_status: UserStatus | None = None image_url: str | None = None @@ -991,7 +992,7 @@ class UserStatus: emoji: str title: str is_away: bool - expires_at: str | None = None + expires_at: datetime | None = None away_message: UserStatusAwayMessage | None = None @@ -1027,7 +1028,7 @@ class ViewBlock: text: str | None = None name: str | None = None label: str | None = None - initial_date: str | None = None + initial_date: datetime | None = None @dataclass @@ -1160,7 +1161,7 @@ class WebhookEvent: id: str event_type: str payload: WebhookPayloadUnion - created_at: str + created_at: datetime @dataclass @@ -1196,8 +1197,8 @@ class UpdateUserAvatarRequest: @dataclass class GetAuditEventsParams: - start_time: str | None = None - end_time: str | None = None + start_time: datetime | None = None + end_time: datetime | None = None event_key: AuditEventKey | None = None actor_id: str | None = None actor_type: str | None = None @@ -1212,8 +1213,8 @@ class ListChatsParams: sort: ChatSortField | None = None order: SortOrder | None = None availability: ChatAvailability | None = None - last_message_at_after: str | None = None - last_message_at_before: str | None = None + last_message_at_after: datetime | None = None + last_message_at_before: datetime | None = None personal: bool | None = None limit: int | None = None cursor: str | None = None @@ -1277,8 +1278,8 @@ class SearchChatsParams: limit: int | None = None cursor: str | None = None order: SortOrder | None = None - created_from: str | None = None - created_to: str | None = None + created_from: datetime | None = None + created_to: datetime | None = None active: bool | None = None chat_subtype: ChatSubtype | None = None personal: bool | None = None @@ -1290,8 +1291,8 @@ class SearchMessagesParams: limit: int | None = None cursor: str | None = None order: SortOrder | None = None - created_from: str | None = None - created_to: str | None = None + created_from: datetime | None = None + created_to: datetime | None = None chat_ids: list[int] | None = None user_ids: list[int] | None = None active: bool | None = None @@ -1304,8 +1305,8 @@ class SearchUsersParams: cursor: str | None = None sort: SearchSortOrder | None = None order: SortOrder | None = None - created_from: str | None = None - created_to: str | None = None + created_from: datetime | None = None + created_to: datetime | None = None company_roles: list[UserRole] | None = None diff --git a/sdk/python/generated/pachca/utils.py b/sdk/python/generated/pachca/utils.py index d1494873..9288f902 100644 --- a/sdk/python/generated/pachca/utils.py +++ b/sdk/python/generated/pachca/utils.py @@ -3,6 +3,7 @@ import dataclasses import keyword from dataclasses import asdict, fields +from datetime import datetime from typing import Type, TypeVar, get_args, get_origin, get_type_hints import httpx @@ -58,6 +59,16 @@ def deserialize(cls: Type[T], data: dict) -> T: item_tp = _resolve_list_item_type(hints[f.name]) if item_tp is not None and _is_dataclass_type(item_tp): v = [deserialize(item_tp, i) if isinstance(i, dict) else i for i in v] + elif isinstance(v, str): + hint = hints.get(f.name) + raw_hint = hint + if get_origin(hint) is not None: + for a in get_args(hint): + if a is not type(None): + raw_hint = a + break + if raw_hint is datetime: + v = datetime.fromisoformat(v) kwargs[k] = v return cls(**kwargs) @@ -70,6 +81,8 @@ def _strip_nones(val: object) -> object: } if isinstance(val, list): return [_strip_nones(v) for v in val] + if isinstance(val, datetime): + return val.isoformat() return val diff --git a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Client.swift b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Client.swift index 70429ed8..72355317 100644 --- a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Client.swift +++ b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Client.swift @@ -17,8 +17,8 @@ public struct SecurityService { public func getAuditEvents(startTime: String? = nil, endTime: String? = nil, eventKey: AuditEventKey? = nil, actorId: String? = nil, actorType: String? = nil, entityId: String? = nil, entityType: String? = nil, limit: Int? = nil, cursor: String? = nil) async throws -> GetAuditEventsResponse { var components = URLComponents(string: "\(baseURL)/audit_events")! var queryItems: [URLQueryItem] = [] - if let startTime { queryItems.append(URLQueryItem(name: "start_time", value: startTime)) } - if let endTime { queryItems.append(URLQueryItem(name: "end_time", value: endTime)) } + if let startTime { queryItems.append(URLQueryItem(name: "start_time", value: String(startTime))) } + if let endTime { queryItems.append(URLQueryItem(name: "end_time", value: String(endTime))) } if let eventKey { queryItems.append(URLQueryItem(name: "event_key", value: eventKey.rawValue)) } if let actorId { queryItems.append(URLQueryItem(name: "actor_id", value: String(actorId))) } if let actorType { queryItems.append(URLQueryItem(name: "actor_type", value: String(actorType))) } @@ -149,8 +149,8 @@ public struct ChatsService { if let sort { queryItems.append(URLQueryItem(name: "sort", value: sort.rawValue)) } if let order { queryItems.append(URLQueryItem(name: "order", value: order.rawValue)) } if let availability { queryItems.append(URLQueryItem(name: "availability", value: availability.rawValue)) } - if let lastMessageAtAfter { queryItems.append(URLQueryItem(name: "last_message_at_after", value: lastMessageAtAfter)) } - if let lastMessageAtBefore { queryItems.append(URLQueryItem(name: "last_message_at_before", value: lastMessageAtBefore)) } + if let lastMessageAtAfter { queryItems.append(URLQueryItem(name: "last_message_at_after", value: String(lastMessageAtAfter))) } + if let lastMessageAtBefore { queryItems.append(URLQueryItem(name: "last_message_at_before", value: String(lastMessageAtBefore))) } if let personal { queryItems.append(URLQueryItem(name: "personal", value: String(personal))) } if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } if let cursor { queryItems.append(URLQueryItem(name: "cursor", value: String(cursor))) } @@ -1166,8 +1166,8 @@ public struct SearchService { if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } if let cursor { queryItems.append(URLQueryItem(name: "cursor", value: String(cursor))) } if let order { queryItems.append(URLQueryItem(name: "order", value: order.rawValue)) } - if let createdFrom { queryItems.append(URLQueryItem(name: "created_from", value: createdFrom)) } - if let createdTo { queryItems.append(URLQueryItem(name: "created_to", value: createdTo)) } + if let createdFrom { queryItems.append(URLQueryItem(name: "created_from", value: String(createdFrom))) } + if let createdTo { queryItems.append(URLQueryItem(name: "created_to", value: String(createdTo))) } if let active { queryItems.append(URLQueryItem(name: "active", value: String(active))) } if let chatSubtype { queryItems.append(URLQueryItem(name: "chat_subtype", value: chatSubtype.rawValue)) } if let personal { queryItems.append(URLQueryItem(name: "personal", value: String(personal))) } @@ -1205,8 +1205,8 @@ public struct SearchService { if let limit { queryItems.append(URLQueryItem(name: "limit", value: String(limit))) } if let cursor { queryItems.append(URLQueryItem(name: "cursor", value: String(cursor))) } if let order { queryItems.append(URLQueryItem(name: "order", value: order.rawValue)) } - if let createdFrom { queryItems.append(URLQueryItem(name: "created_from", value: createdFrom)) } - if let createdTo { queryItems.append(URLQueryItem(name: "created_to", value: createdTo)) } + if let createdFrom { queryItems.append(URLQueryItem(name: "created_from", value: String(createdFrom))) } + if let createdTo { queryItems.append(URLQueryItem(name: "created_to", value: String(createdTo))) } if let chatIds { chatIds.forEach { queryItems.append(URLQueryItem(name: "chat_ids[]", value: String($0))) } } if let userIds { userIds.forEach { queryItems.append(URLQueryItem(name: "user_ids[]", value: String($0))) } } if let active { queryItems.append(URLQueryItem(name: "active", value: String(active))) } @@ -1245,8 +1245,8 @@ public struct SearchService { if let cursor { queryItems.append(URLQueryItem(name: "cursor", value: String(cursor))) } if let sort { queryItems.append(URLQueryItem(name: "sort", value: sort.rawValue)) } if let order { queryItems.append(URLQueryItem(name: "order", value: order.rawValue)) } - if let createdFrom { queryItems.append(URLQueryItem(name: "created_from", value: createdFrom)) } - if let createdTo { queryItems.append(URLQueryItem(name: "created_to", value: createdTo)) } + if let createdFrom { queryItems.append(URLQueryItem(name: "created_from", value: String(createdFrom))) } + if let createdTo { queryItems.append(URLQueryItem(name: "created_to", value: String(createdTo))) } if let companyRoles { companyRoles.forEach { queryItems.append(URLQueryItem(name: "company_roles[]", value: $0.rawValue)) } } if !queryItems.isEmpty { components.queryItems = queryItems } var request = URLRequest(url: components.url!) diff --git a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift index d49ee451..23233a51 100644 --- a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift +++ b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Models.swift @@ -441,12 +441,12 @@ public struct AccessTokenInfo: Codable { public let name: String? public let userId: Int64 public let scopes: [OAuthScope] - public let createdAt: Date + public let createdAt: String public let revokedAt: String? public let expiresIn: Int? public let lastUsedAt: String? - public init(id: Int64, token: String, name: String? = nil, userId: Int64, scopes: [OAuthScope], createdAt: Date, revokedAt: String? = nil, expiresIn: Int? = nil, lastUsedAt: String? = nil) { + public init(id: Int64, token: String, name: String? = nil, userId: Int64, scopes: [OAuthScope], createdAt: String, revokedAt: String? = nil, expiresIn: Int? = nil, lastUsedAt: String? = nil) { self.id = id self.token = token self.name = name @@ -723,7 +723,7 @@ public struct AuditDetailsUserUpdated: Codable { public struct AuditEvent: Codable { public let id: String - public let createdAt: Date + public let createdAt: String public let eventKey: AuditEventKey public let entityId: String public let entityType: String @@ -733,7 +733,7 @@ public struct AuditEvent: Codable { public let ipAddress: String public let userAgent: String - public init(id: String, createdAt: Date, eventKey: AuditEventKey, entityId: String, entityType: String, actorId: String, actorType: String, details: AuditEventDetailsUnion, ipAddress: String, userAgent: String) { + public init(id: String, createdAt: String, eventKey: AuditEventKey, entityId: String, entityType: String, actorId: String, actorType: String, details: AuditEventDetailsUnion, ipAddress: String, userAgent: String) { self.id = id self.createdAt = createdAt self.eventKey = eventKey @@ -870,17 +870,17 @@ public struct ButtonWebhookPayload: Codable { public struct Chat: Codable { public let id: Int public let name: String - public let createdAt: Date + public let createdAt: String public let ownerId: Int public let memberIds: [Int] public let groupTagIds: [Int] public let channel: Bool public let personal: Bool public let `public`: Bool - public let lastMessageAt: Date + public let lastMessageAt: String public let meetRoomUrl: String - public init(id: Int, name: String, createdAt: Date, ownerId: Int, memberIds: [Int], groupTagIds: [Int], channel: Bool, personal: Bool, `public`: Bool, lastMessageAt: Date, meetRoomUrl: String) { + public init(id: Int, name: String, createdAt: String, ownerId: Int, memberIds: [Int], groupTagIds: [Int], channel: Bool, personal: Bool, `public`: Bool, lastMessageAt: String, meetRoomUrl: String) { self.id = id self.name = name self.createdAt = createdAt @@ -947,10 +947,10 @@ public struct ChatMemberWebhookPayload: Codable { public let chatId: Int public let threadId: Int? public let userIds: [Int] - public let createdAt: Date + public let createdAt: String public let webhookTimestamp: Int - public init(type: String, event: MemberEventType, chatId: Int, threadId: Int? = nil, userIds: [Int], createdAt: Date, webhookTimestamp: Int) { + public init(type: String, event: MemberEventType, chatId: Int, threadId: Int? = nil, userIds: [Int], createdAt: String, webhookTimestamp: Int) { self.type = type self.event = event self.chatId = chatId @@ -998,10 +998,10 @@ public struct CompanyMemberWebhookPayload: Codable { public let type: String public let event: UserEventType public let userIds: [Int] - public let createdAt: Date + public let createdAt: String public let webhookTimestamp: Int - public init(type: String, event: UserEventType, userIds: [Int], createdAt: Date, webhookTimestamp: Int) { + public init(type: String, event: UserEventType, userIds: [Int], createdAt: String, webhookTimestamp: Int) { self.type = type self.event = event self.userIds = userIds @@ -1151,12 +1151,12 @@ public struct Forwarding: Codable { public let originalMessageId: Int public let originalChatId: Int public let authorId: Int - public let originalCreatedAt: Date + public let originalCreatedAt: String public let originalThreadId: Int? public let originalThreadMessageId: Int? public let originalThreadParentChatId: Int? - public init(originalMessageId: Int, originalChatId: Int, authorId: Int, originalCreatedAt: Date, originalThreadId: Int? = nil, originalThreadMessageId: Int? = nil, originalThreadParentChatId: Int? = nil) { + public init(originalMessageId: Int, originalChatId: Int, authorId: Int, originalCreatedAt: String, originalThreadId: Int? = nil, originalThreadMessageId: Int? = nil, originalThreadParentChatId: Int? = nil) { self.originalMessageId = originalMessageId self.originalChatId = originalChatId self.authorId = authorId @@ -1267,10 +1267,10 @@ public struct LinkSharedWebhookPayload: Codable { public let messageId: Int public let links: [WebhookLink] public let userId: Int - public let createdAt: Date + public let createdAt: String public let webhookTimestamp: Int - public init(type: String, event: String, chatId: Int, messageId: Int, links: [WebhookLink], userId: Int, createdAt: Date, webhookTimestamp: Int) { + public init(type: String, event: String, chatId: Int, messageId: Int, links: [WebhookLink], userId: Int, createdAt: String, webhookTimestamp: Int) { self.type = type self.event = event self.chatId = chatId @@ -1316,7 +1316,7 @@ public struct Message: Codable { public let rootChatId: Int public let content: String public let userId: Int - public let createdAt: Date + public let createdAt: String public let url: String public let files: [File] public let buttons: [[Button]]? @@ -1328,7 +1328,7 @@ public struct Message: Codable { public let changedAt: String? public let deletedAt: String? - public init(id: Int, entityType: MessageEntityType, entityId: Int, chatId: Int, rootChatId: Int, content: String, userId: Int, createdAt: Date, url: String, files: [File], buttons: [[Button]]? = nil, thread: MessageThread? = nil, forwarding: Forwarding? = nil, parentMessageId: Int? = nil, displayAvatarUrl: String? = nil, displayName: String? = nil, changedAt: String? = nil, deletedAt: String? = nil) { + public init(id: Int, entityType: MessageEntityType, entityId: Int, chatId: Int, rootChatId: Int, content: String, userId: Int, createdAt: String, url: String, files: [File], buttons: [[Button]]? = nil, thread: MessageThread? = nil, forwarding: Forwarding? = nil, parentMessageId: Int? = nil, displayAvatarUrl: String? = nil, displayName: String? = nil, changedAt: String? = nil, deletedAt: String? = nil) { self.id = id self.entityType = entityType self.entityId = entityId @@ -1516,14 +1516,14 @@ public struct MessageWebhookPayload: Codable { public let entityId: Int public let content: String public let userId: Int - public let createdAt: Date + public let createdAt: String public let url: String public let chatId: Int public let parentMessageId: Int? public let thread: WebhookMessageThread? public let webhookTimestamp: Int - public init(type: String, id: Int, event: WebhookEventType, entityType: MessageEntityType, entityId: Int, content: String, userId: Int, createdAt: Date, url: String, chatId: Int, parentMessageId: Int? = nil, thread: WebhookMessageThread? = nil, webhookTimestamp: Int) { + public init(type: String, id: Int, event: WebhookEventType, entityType: MessageEntityType, entityId: Int, content: String, userId: Int, createdAt: String, url: String, chatId: Int, parentMessageId: Int? = nil, thread: WebhookMessageThread? = nil, webhookTimestamp: Int) { self.type = type self.id = id self.event = event @@ -1638,11 +1638,11 @@ public struct PaginationMeta: Codable { public struct Reaction: Codable { public let userId: Int - public let createdAt: Date + public let createdAt: String public let code: String public let name: String? - public init(userId: Int, createdAt: Date, code: String, name: String? = nil) { + public init(userId: Int, createdAt: String, code: String, name: String? = nil) { self.userId = userId self.createdAt = createdAt self.code = code @@ -1674,10 +1674,10 @@ public struct ReactionWebhookPayload: Codable { public let code: String public let name: String public let userId: Int - public let createdAt: Date + public let createdAt: String public let webhookTimestamp: Int - public init(type: String, event: ReactionEventType, messageId: Int, code: String, name: String, userId: Int, createdAt: Date, webhookTimestamp: Int) { + public init(type: String, event: ReactionEventType, messageId: Int, code: String, name: String, userId: Int, createdAt: String, webhookTimestamp: Int) { self.type = type self.event = event self.messageId = messageId @@ -1763,12 +1763,12 @@ public struct Task: Codable { public let userId: Int public let chatId: Int? public let status: TaskStatus - public let createdAt: Date + public let createdAt: String public let performerIds: [Int] public let allDay: Bool public let customProperties: [CustomProperty] - public init(id: Int, kind: TaskKind, content: String, dueAt: String? = nil, priority: Int, userId: Int, chatId: Int? = nil, status: TaskStatus, createdAt: Date, performerIds: [Int], allDay: Bool, customProperties: [CustomProperty]) { + public init(id: Int, kind: TaskKind, content: String, dueAt: String? = nil, priority: Int, userId: Int, chatId: Int? = nil, status: TaskStatus, createdAt: String, performerIds: [Int], allDay: Bool, customProperties: [CustomProperty]) { self.id = id self.kind = kind self.content = content @@ -1909,9 +1909,9 @@ public struct Thread: Codable { public let chatId: Int64 public let messageId: Int64 public let messageChatId: Int64 - public let updatedAt: Date + public let updatedAt: String - public init(id: Int64, chatId: Int64, messageId: Int64, messageChatId: Int64, updatedAt: Date) { + public init(id: Int64, chatId: Int64, messageId: Int64, messageChatId: Int64, updatedAt: String) { self.id = id self.chatId = chatId self.messageId = messageId @@ -1989,12 +1989,12 @@ public struct User: Codable { public let userStatus: UserStatus? public let bot: Bool public let sso: Bool - public let createdAt: Date - public let lastActivityAt: Date + public let createdAt: String + public let lastActivityAt: String public let timeZone: String public let imageUrl: String? - public init(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Bool, inviteStatus: InviteStatus, listTags: [String], customProperties: [CustomProperty], userStatus: UserStatus? = nil, bot: Bool, sso: Bool, createdAt: Date, lastActivityAt: Date, timeZone: String, imageUrl: String? = nil) { + public init(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Bool, inviteStatus: InviteStatus, listTags: [String], customProperties: [CustomProperty], userStatus: UserStatus? = nil, bot: Bool, sso: Bool, createdAt: String, lastActivityAt: String, timeZone: String, imageUrl: String? = nil) { self.id = id self.firstName = firstName self.lastName = lastName @@ -2501,9 +2501,9 @@ public struct WebhookEvent: Codable { public let id: String public let eventType: String public let payload: WebhookPayloadUnion - public let createdAt: Date + public let createdAt: String - public init(id: String, eventType: String, payload: WebhookPayloadUnion, createdAt: Date) { + public init(id: String, eventType: String, payload: WebhookPayloadUnion, createdAt: String) { self.id = id self.eventType = eventType self.payload = payload diff --git a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Utils.swift b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Utils.swift index d65d2a00..8df90b02 100644 --- a/sdk/swift/generated/Sources/Pachca/GeneratedSources/Utils.swift +++ b/sdk/swift/generated/Sources/Pachca/GeneratedSources/Utils.swift @@ -5,13 +5,11 @@ import FoundationNetworking let pachcaDecoder: JSONDecoder = { let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .iso8601 return decoder }() let pachcaEncoder: JSONEncoder = { let encoder = JSONEncoder() - encoder.dateEncodingStrategy = .iso8601 return encoder }() From 69ba2383f08ebb64460db30ad1e6e17e28e77079 Mon Sep 17 00:00:00 2001 From: aenadgrleey Date: Mon, 6 Apr 2026 23:51:21 +0200 Subject: [PATCH 35/37] feat(examples): add get chat step to verify datetime deserialization Step 0 fetches a chat and prints created_at/last_message_at with their runtime types across all 6 SDK examples. Co-Authored-By: Claude Opus 4.6 (1M context) --- sdk/csharp/examples/MainExample.cs | 5 +++++ sdk/go/examples/main.go | 9 +++++++++ sdk/kotlin/examples/main.kt | 5 +++++ sdk/python/examples/main.py | 4 ++++ sdk/swift/examples/Sources/EchoBot/main.swift | 6 ++++++ sdk/typescript/examples/main.ts | 5 +++++ 6 files changed, 34 insertions(+) diff --git a/sdk/csharp/examples/MainExample.cs b/sdk/csharp/examples/MainExample.cs index 3e38f8d8..542d19f9 100644 --- a/sdk/csharp/examples/MainExample.cs +++ b/sdk/csharp/examples/MainExample.cs @@ -23,6 +23,11 @@ public static async Task RunAsync() using var client = new PachcaClient(token); + // -- Step 0: GET -- Fetch chat (verifies datetime deserialization) + Console.WriteLine("0. Fetching chat..."); + var chat = await client.Chats.GetChatAsync(chatId); + Console.WriteLine($" Chat: {chat.Name}, createdAt={chat.CreatedAt} ({chat.CreatedAt.GetType().Name}), lastMessageAt={chat.LastMessageAt} ({chat.LastMessageAt.GetType().Name})"); + // -- Step 1: POST -- Create a message Console.WriteLine("1. Creating message..."); var created = await client.Messages.CreateMessageAsync(new MessageCreateRequest diff --git a/sdk/go/examples/main.go b/sdk/go/examples/main.go index 174a0a87..572b507d 100644 --- a/sdk/go/examples/main.go +++ b/sdk/go/examples/main.go @@ -35,6 +35,15 @@ func main() { client := pachca.NewPachcaClient(token) ctx := context.Background() + // ── Step 0: GET — Fetch chat (verifies datetime deserialization) ─ + fmt.Println("0. Fetching chat...") + chat, err := client.Chats.GetChat(ctx, int32(chatID)) + if err != nil { + log.Fatalf("GetChat failed: %v", err) + } + fmt.Printf(" Chat: %s, createdAt=%v (%T), lastMessageAt=%v (%T)\n", + chat.Name, chat.CreatedAt, chat.CreatedAt, chat.LastMessageAt, chat.LastMessageAt) + // ── Step 1: POST — Create a message ────────────────────────────── fmt.Println("1. Creating message...") created, err := client.Messages.CreateMessage(ctx, pachca.MessageCreateRequest{ diff --git a/sdk/kotlin/examples/main.kt b/sdk/kotlin/examples/main.kt index 325199f8..fc4723e4 100644 --- a/sdk/kotlin/examples/main.kt +++ b/sdk/kotlin/examples/main.kt @@ -28,6 +28,11 @@ fun main() = runBlocking { val client = PachcaClient(token) + // ── Step 0: GET — Fetch chat (verifies datetime deserialization) ─ + println("0. Fetching chat...") + val chat = client.chats.getChat(chatId) + println(" Chat: ${chat.name}, createdAt=${chat.createdAt} (${chat.createdAt::class.simpleName}), lastMessageAt=${chat.lastMessageAt} (${chat.lastMessageAt::class.simpleName})") + // ── Step 1: POST — Create a message ────────────────────────────── println("1. Creating message...") val created = client.messages.createMessage( diff --git a/sdk/python/examples/main.py b/sdk/python/examples/main.py index a1e3d804..bc1949fe 100644 --- a/sdk/python/examples/main.py +++ b/sdk/python/examples/main.py @@ -27,6 +27,10 @@ async def main(): client = PachcaClient(token) + # 0. Get chat (verifies datetime deserialization) + chat = await client.chats.get_chat(chat_id) + print(f"0. Chat: {chat.name}, created_at={chat.created_at} ({type(chat.created_at).__name__}), last_message_at={chat.last_message_at} ({type(chat.last_message_at).__name__})") + # 1. Create message msg = await client.messages.create_message( MessageCreateRequest( diff --git a/sdk/swift/examples/Sources/EchoBot/main.swift b/sdk/swift/examples/Sources/EchoBot/main.swift index ca9b77f5..d4dd52c7 100644 --- a/sdk/swift/examples/Sources/EchoBot/main.swift +++ b/sdk/swift/examples/Sources/EchoBot/main.swift @@ -14,6 +14,12 @@ guard let chatIdStr = ProcessInfo.processInfo.environment["PACHCA_CHAT_ID"], let client = PachcaClient(token: token) print("Echo Bot started for chat \(chatId)") +// ── Step 0: Fetch chat (verifies datetime deserialization) ────── + +print("Step 0: Fetching chat...") +let chat = try await client.chats.getChat(id: chatId) +print(" Chat: \(chat.name), createdAt=\(chat.createdAt) (\(type(of: chat.createdAt))), lastMessageAt=\(chat.lastMessageAt) (\(type(of: chat.lastMessageAt)))") + // ── Step 1: Send a message ───────────────────────────────────── print("Step 1: Sending message...") diff --git a/sdk/typescript/examples/main.ts b/sdk/typescript/examples/main.ts index 455b539d..cb468989 100644 --- a/sdk/typescript/examples/main.ts +++ b/sdk/typescript/examples/main.ts @@ -22,6 +22,11 @@ if (!token || !chatIdStr) { const chatId = Number(chatIdStr); const client = new PachcaClient(token); +// ── Step 0: GET — Fetch chat (verifies datetime deserialization) ─ +console.log("0. Fetching chat..."); +const chat = await client.chats.getChat(chatId); +console.log(` Chat: ${chat.name}, createdAt=${chat.createdAt} (${typeof chat.createdAt}), lastMessageAt=${chat.lastMessageAt} (${typeof chat.lastMessageAt})`); + // ── Step 1: POST — Create a message ────────────────────────────── console.log("1. Creating message..."); const created = await client.messages.createMessage({ From 1bc869b79b1b940d79220307a31a4916e84daa56 Mon Sep 17 00:00:00 2001 From: lookinway Date: Tue, 7 Apr 2026 12:10:44 +0300 Subject: [PATCH 36/37] fix: update dates to 2026-04-07 and CLI version to 2026.4.0 --- apps/docs/content/guides/cli.mdx | 2 +- apps/docs/content/updates.mdx | 2 +- apps/docs/public/guides/cli.md | 2 +- apps/docs/public/guides/sdk/kotlin.md | 16 ++++++------ apps/docs/public/guides/sdk/python.md | 16 ++++++------ apps/docs/public/llms-full.txt | 36 ++++++++++++++------------- apps/docs/public/updates.md | 2 +- packages/cli/CHANGELOG.md | 2 +- packages/cli/src/data/changelog.json | 2 +- 9 files changed, 42 insertions(+), 38 deletions(-) diff --git a/apps/docs/content/guides/cli.mdx b/apps/docs/content/guides/cli.mdx index 95350fe9..4b5631d4 100644 --- a/apps/docs/content/guides/cli.mdx +++ b/apps/docs/content/guides/cli.mdx @@ -6,7 +6,7 @@ description: Управление Пачкой из терминала — вс # CLI - 2026.3.10 · 21 марта 2026 + 2026.4.0 · 7 апреля 2026 Официальный CLI для работы с Pachca API из терминала. Каждый API-метод доступен как команда с типизированными флагами, валидацией и интерактивными подсказками. Требуется Node.js 20 или новее. diff --git a/apps/docs/content/updates.mdx b/apps/docs/content/updates.mdx index c18b6d88..d97bc8e7 100644 --- a/apps/docs/content/updates.mdx +++ b/apps/docs/content/updates.mdx @@ -9,7 +9,7 @@ useUpdatesComponent: true Автоматически отслеживайте обновления: подпишитесь на [RSS-ленту](/feed.xml) или используйте [markdown-версию этой страницы](/updates.md) для интеграции с инструментами и AI-агентами. - + ## Аватары, сортировка и n8n Node v2 diff --git a/apps/docs/public/guides/cli.md b/apps/docs/public/guides/cli.md index f996d69d..dcbae0cc 100644 --- a/apps/docs/public/guides/cli.md +++ b/apps/docs/public/guides/cli.md @@ -1,7 +1,7 @@ # CLI -[@pachca/cli](https://www.npmjs.com/package/@pachca/cli) 2026.3.10 · 21 марта 2026 +[@pachca/cli](https://www.npmjs.com/package/@pachca/cli) 2026.4.0 · 7 апреля 2026 Официальный CLI для работы с Pachca API из терминала. Каждый API-метод доступен как команда с типизированными флагами, валидацией и интерактивными подсказками. Требуется Node.js 20 или новее. diff --git a/apps/docs/public/guides/sdk/kotlin.md b/apps/docs/public/guides/sdk/kotlin.md index 0f24ff51..0331591e 100644 --- a/apps/docs/public/guides/sdk/kotlin.md +++ b/apps/docs/public/guides/sdk/kotlin.md @@ -36,7 +36,7 @@ val client = PachcaClient("YOUR_TOKEN") ```kotlin // Получение профиля val response = client.profile.getProfile() -// → User(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Boolean, inviteStatus: InviteStatus, listTags: List, customProperties: List, userStatus: UserStatus(emoji: String, title: String, expiresAt: String?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)?, bot: Boolean, sso: Boolean, createdAt: String, lastActivityAt: String, timeZone: String, imageUrl: String?) +// → User(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Boolean, inviteStatus: InviteStatus, listTags: List, customProperties: List, userStatus: UserStatus(emoji: String, title: String, expiresAt: OffsetDateTime?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)?, bot: Boolean, sso: Boolean, createdAt: OffsetDateTime, lastActivityAt: OffsetDateTime, timeZone: String, imageUrl: String?) ``` @@ -158,7 +158,9 @@ import com.pachca.sdk.ChatSortField import com.pachca.sdk.SortOrder // Список чатов -val response = client.chats.listChats(sort = ChatSortField.ID, order = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = "2025-01-01T00:00:00.000Z", lastMessageAtBefore = "2025-02-01T00:00:00.000Z", personal = false, limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") +val lastMessageAtAfter = OffsetDateTime.parse("2025-01-01T00:00:00.000Z") +val lastMessageAtBefore = OffsetDateTime.parse("2025-02-01T00:00:00.000Z") +val response = client.chats.listChats(sort = ChatSortField.ID, order = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = lastMessageAtAfter, lastMessageAtBefore = lastMessageAtBefore, personal = false, limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") // → ListChatsResponse(data: List, meta: PaginationMeta) ``` @@ -180,7 +182,7 @@ val request = ChatCreateRequest( ) ) val response = client.chats.createChat(request = request) -// → Chat(id: Int, name: String, createdAt: String, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: String, meetRoomUrl: String) +// → Chat(id: Int, name: String, createdAt: OffsetDateTime, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: OffsetDateTime, meetRoomUrl: String) ``` @@ -189,7 +191,7 @@ val response = client.chats.createChat(request = request) ```kotlin // Получение чата val response = client.chats.getChat(id = 334) -// → Chat(id: Int, name: String, createdAt: String, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: String, meetRoomUrl: String) +// → Chat(id: Int, name: String, createdAt: OffsetDateTime, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: OffsetDateTime, meetRoomUrl: String) ``` @@ -377,7 +379,7 @@ val request = MessageCreateRequest( linkPreview = false ) val response = client.messages.createMessage(request = request) -// → Message(id: Int, entityType: MessageEntityType, entityId: Int, chatId: Int, rootChatId: Int, content: String, userId: Int, createdAt: String, url: String, files: List, buttons: List>?, thread: MessageThread(id: Long, chatId: Long)?, forwarding: Forwarding(originalMessageId: Int, originalChatId: Int, authorId: Int, originalCreatedAt: String, originalThreadId: Int?, originalThreadMessageId: Int?, originalThreadParentChatId: Int?)?, parentMessageId: Int?, displayAvatarUrl: String?, displayName: String?, changedAt: String?, deletedAt: String?) +// → Message(id: Int, entityType: MessageEntityType, entityId: Int, chatId: Int, rootChatId: Int, content: String, userId: Int, createdAt: OffsetDateTime, url: String, files: List, buttons: List>?, thread: MessageThread(id: Long, chatId: Long)?, forwarding: Forwarding(originalMessageId: Int, originalChatId: Int, authorId: Int, originalCreatedAt: OffsetDateTime, originalThreadId: Int?, originalThreadMessageId: Int?, originalThreadParentChatId: Int?)?, parentMessageId: Int?, displayAvatarUrl: String?, displayName: String?, changedAt: OffsetDateTime?, deletedAt: OffsetDateTime?) // Список сотрудников val response = client.users.listUsers(query = "Олег", limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") @@ -388,7 +390,7 @@ val request = TaskCreateRequest( task = TaskCreateRequestTask( kind = TaskKind.REMINDER, content = "Забрать со склада 21 заказ", - dueAt = "2020-06-05T12:00:00.000+03:00", + dueAt = OffsetDateTime.parse("2020-06-05T12:00:00.000+03:00"), priority = 2, performerIds = listOf(123), chatId = 456, @@ -397,7 +399,7 @@ val request = TaskCreateRequest( ) ) val response = client.tasks.createTask(request = request) -// → Task(id: Int, kind: TaskKind, content: String, dueAt: String?, priority: Int, userId: Int, chatId: Int?, status: TaskStatus, createdAt: String, performerIds: List, allDay: Boolean, customProperties: List) +// → Task(id: Int, kind: TaskKind, content: String, dueAt: OffsetDateTime?, priority: Int, userId: Int, chatId: Int?, status: TaskStatus, createdAt: OffsetDateTime, performerIds: List, allDay: Boolean, customProperties: List) ``` diff --git a/apps/docs/public/guides/sdk/python.md b/apps/docs/public/guides/sdk/python.md index 8052a539..c45847d9 100644 --- a/apps/docs/public/guides/sdk/python.md +++ b/apps/docs/public/guides/sdk/python.md @@ -32,7 +32,7 @@ client = PachcaClient("YOUR_TOKEN") ```python # Получение профиля response = await client.profile.get_profile() -# → User(id: int, first_name: str, last_name: str, nickname: str, email: str, phone_number: str, department: str, title: str, role: UserRole, suspended: bool, invite_status: InviteStatus, list_tags: list[str], custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)], user_status: UserStatus(emoji: str, title: str, expires_at: str | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None) | None, bot: bool, sso: bool, created_at: str, last_activity_at: str, time_zone: str, image_url: str | None) +# → User(id: int, first_name: str, last_name: str, nickname: str, email: str, phone_number: str, department: str, title: str, role: UserRole, suspended: bool, invite_status: InviteStatus, list_tags: list[str], custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)], user_status: UserStatus(emoji: str, title: str, expires_at: datetime | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None) | None, bot: bool, sso: bool, created_at: datetime, last_activity_at: datetime, time_zone: str, image_url: str | None) ``` @@ -150,8 +150,8 @@ params = ListChatsParams( sort=ChatSortField.ID, order=SortOrder.DESC, availability=ChatAvailability.IS_MEMBER, - last_message_at_after="2025-01-01T00:00:00.000Z", - last_message_at_before="2025-02-01T00:00:00.000Z", + last_message_at_after=datetime.fromisoformat("2025-01-01T00:00:00.000Z"), + last_message_at_before=datetime.fromisoformat("2025-02-01T00:00:00.000Z"), personal=False, limit=1, cursor="eyJpZCI6MTAsImRpciI6ImFzYyJ9" @@ -177,7 +177,7 @@ request = ChatCreateRequest( ) ) response = await client.chats.create_chat(request=request) -# → Chat(id: int, name: str, created_at: str, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: str, meet_room_url: str) +# → Chat(id: int, name: str, created_at: datetime, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: datetime, meet_room_url: str) ``` @@ -186,7 +186,7 @@ response = await client.chats.create_chat(request=request) ```python # Получение чата response = await client.chats.get_chat(id=334) -# → Chat(id: int, name: str, created_at: str, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: str, meet_room_url: str) +# → Chat(id: int, name: str, created_at: datetime, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: datetime, meet_room_url: str) ``` @@ -358,7 +358,7 @@ request = MessageCreateRequest( link_preview=False ) response = await client.messages.create_message(request=request) -# → Message(id: int, entity_type: MessageEntityType, entity_id: int, chat_id: int, root_chat_id: int, content: str, user_id: int, created_at: str, url: str, files: list[File(id: int, key: str, name: str, file_type: FileType, url: str, width: int | None, height: int | None)], buttons: list[list[Button(text: str, url: str | None, data: str | None)]] | None, thread: MessageThread(id: int, chat_id: int) | None, forwarding: Forwarding(original_message_id: int, original_chat_id: int, author_id: int, original_created_at: str, original_thread_id: int | None, original_thread_message_id: int | None, original_thread_parent_chat_id: int | None) | None, parent_message_id: int | None, display_avatar_url: str | None, display_name: str | None, changed_at: str | None, deleted_at: str | None) +# → Message(id: int, entity_type: MessageEntityType, entity_id: int, chat_id: int, root_chat_id: int, content: str, user_id: int, created_at: datetime, url: str, files: list[File(id: int, key: str, name: str, file_type: FileType, url: str, width: int | None, height: int | None)], buttons: list[list[Button(text: str, url: str | None, data: str | None)]] | None, thread: MessageThread(id: int, chat_id: int) | None, forwarding: Forwarding(original_message_id: int, original_chat_id: int, author_id: int, original_created_at: datetime, original_thread_id: int | None, original_thread_message_id: int | None, original_thread_parent_chat_id: int | None) | None, parent_message_id: int | None, display_avatar_url: str | None, display_name: str | None, changed_at: datetime | None, deleted_at: datetime | None) # Список сотрудников params = ListUsersParams( @@ -374,7 +374,7 @@ request = TaskCreateRequest( task=TaskCreateRequestTask( kind=TaskKind.REMINDER, content="Забрать со склада 21 заказ", - due_at="2020-06-05T12:00:00.000+03:00", + due_at=datetime.fromisoformat("2020-06-05T12:00:00.000+03:00"), priority=2, performer_ids=[123], chat_id=456, @@ -383,7 +383,7 @@ request = TaskCreateRequest( ) ) response = await client.tasks.create_task(request=request) -# → Task(id: int, kind: TaskKind, content: str, due_at: str | None, priority: int, user_id: int, chat_id: int | None, status: TaskStatus, created_at: str, performer_ids: list[int], all_day: bool, custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)]) +# → Task(id: int, kind: TaskKind, content: str, due_at: datetime | None, priority: int, user_id: int, chat_id: int | None, status: TaskStatus, created_at: datetime, performer_ids: list[int], all_day: bool, custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)]) ``` diff --git a/apps/docs/public/llms-full.txt b/apps/docs/public/llms-full.txt index 552352b0..ccd19602 100644 --- a/apps/docs/public/llms-full.txt +++ b/apps/docs/public/llms-full.txt @@ -472,7 +472,7 @@ npx skills add pachca/openapi # CLI -[@pachca/cli](https://www.npmjs.com/package/@pachca/cli) 2026.3.10 · 21 марта 2026 +[@pachca/cli](https://www.npmjs.com/package/@pachca/cli) 2026.4.0 · 7 апреля 2026 Официальный CLI для работы с Pachca API из терминала. Каждый API-метод доступен как команда с типизированными флагами, валидацией и интерактивными подсказками. Требуется Node.js 20 или новее. @@ -1609,7 +1609,7 @@ client = PachcaClient("YOUR_TOKEN") ```python # Получение профиля response = await client.profile.get_profile() -# → User(id: int, first_name: str, last_name: str, nickname: str, email: str, phone_number: str, department: str, title: str, role: UserRole, suspended: bool, invite_status: InviteStatus, list_tags: list[str], custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)], user_status: UserStatus(emoji: str, title: str, expires_at: str | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None) | None, bot: bool, sso: bool, created_at: str, last_activity_at: str, time_zone: str, image_url: str | None) +# → User(id: int, first_name: str, last_name: str, nickname: str, email: str, phone_number: str, department: str, title: str, role: UserRole, suspended: bool, invite_status: InviteStatus, list_tags: list[str], custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)], user_status: UserStatus(emoji: str, title: str, expires_at: datetime | None, is_away: bool, away_message: UserStatusAwayMessage(text: str) | None) | None, bot: bool, sso: bool, created_at: datetime, last_activity_at: datetime, time_zone: str, image_url: str | None) ``` @@ -1727,8 +1727,8 @@ params = ListChatsParams( sort=ChatSortField.ID, order=SortOrder.DESC, availability=ChatAvailability.IS_MEMBER, - last_message_at_after="2025-01-01T00:00:00.000Z", - last_message_at_before="2025-02-01T00:00:00.000Z", + last_message_at_after=datetime.fromisoformat("2025-01-01T00:00:00.000Z"), + last_message_at_before=datetime.fromisoformat("2025-02-01T00:00:00.000Z"), personal=False, limit=1, cursor="eyJpZCI6MTAsImRpciI6ImFzYyJ9" @@ -1754,7 +1754,7 @@ request = ChatCreateRequest( ) ) response = await client.chats.create_chat(request=request) -# → Chat(id: int, name: str, created_at: str, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: str, meet_room_url: str) +# → Chat(id: int, name: str, created_at: datetime, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: datetime, meet_room_url: str) ``` @@ -1763,7 +1763,7 @@ response = await client.chats.create_chat(request=request) ```python # Получение чата response = await client.chats.get_chat(id=334) -# → Chat(id: int, name: str, created_at: str, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: str, meet_room_url: str) +# → Chat(id: int, name: str, created_at: datetime, owner_id: int, member_ids: list[int], group_tag_ids: list[int], channel: bool, personal: bool, public: bool, last_message_at: datetime, meet_room_url: str) ``` @@ -1935,7 +1935,7 @@ request = MessageCreateRequest( link_preview=False ) response = await client.messages.create_message(request=request) -# → Message(id: int, entity_type: MessageEntityType, entity_id: int, chat_id: int, root_chat_id: int, content: str, user_id: int, created_at: str, url: str, files: list[File(id: int, key: str, name: str, file_type: FileType, url: str, width: int | None, height: int | None)], buttons: list[list[Button(text: str, url: str | None, data: str | None)]] | None, thread: MessageThread(id: int, chat_id: int) | None, forwarding: Forwarding(original_message_id: int, original_chat_id: int, author_id: int, original_created_at: str, original_thread_id: int | None, original_thread_message_id: int | None, original_thread_parent_chat_id: int | None) | None, parent_message_id: int | None, display_avatar_url: str | None, display_name: str | None, changed_at: str | None, deleted_at: str | None) +# → Message(id: int, entity_type: MessageEntityType, entity_id: int, chat_id: int, root_chat_id: int, content: str, user_id: int, created_at: datetime, url: str, files: list[File(id: int, key: str, name: str, file_type: FileType, url: str, width: int | None, height: int | None)], buttons: list[list[Button(text: str, url: str | None, data: str | None)]] | None, thread: MessageThread(id: int, chat_id: int) | None, forwarding: Forwarding(original_message_id: int, original_chat_id: int, author_id: int, original_created_at: datetime, original_thread_id: int | None, original_thread_message_id: int | None, original_thread_parent_chat_id: int | None) | None, parent_message_id: int | None, display_avatar_url: str | None, display_name: str | None, changed_at: datetime | None, deleted_at: datetime | None) # Список сотрудников params = ListUsersParams( @@ -1951,7 +1951,7 @@ request = TaskCreateRequest( task=TaskCreateRequestTask( kind=TaskKind.REMINDER, content="Забрать со склада 21 заказ", - due_at="2020-06-05T12:00:00.000+03:00", + due_at=datetime.fromisoformat("2020-06-05T12:00:00.000+03:00"), priority=2, performer_ids=[123], chat_id=456, @@ -1960,7 +1960,7 @@ request = TaskCreateRequest( ) ) response = await client.tasks.create_task(request=request) -# → Task(id: int, kind: TaskKind, content: str, due_at: str | None, priority: int, user_id: int, chat_id: int | None, status: TaskStatus, created_at: str, performer_ids: list[int], all_day: bool, custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)]) +# → Task(id: int, kind: TaskKind, content: str, due_at: datetime | None, priority: int, user_id: int, chat_id: int | None, status: TaskStatus, created_at: datetime, performer_ids: list[int], all_day: bool, custom_properties: list[CustomProperty(id: int, name: str, data_type: CustomPropertyDataType, value: str)]) ``` @@ -2423,7 +2423,7 @@ val client = PachcaClient("YOUR_TOKEN") ```kotlin // Получение профиля val response = client.profile.getProfile() -// → User(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Boolean, inviteStatus: InviteStatus, listTags: List, customProperties: List, userStatus: UserStatus(emoji: String, title: String, expiresAt: String?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)?, bot: Boolean, sso: Boolean, createdAt: String, lastActivityAt: String, timeZone: String, imageUrl: String?) +// → User(id: Int, firstName: String, lastName: String, nickname: String, email: String, phoneNumber: String, department: String, title: String, role: UserRole, suspended: Boolean, inviteStatus: InviteStatus, listTags: List, customProperties: List, userStatus: UserStatus(emoji: String, title: String, expiresAt: OffsetDateTime?, isAway: Boolean, awayMessage: UserStatusAwayMessage(text: String)?)?, bot: Boolean, sso: Boolean, createdAt: OffsetDateTime, lastActivityAt: OffsetDateTime, timeZone: String, imageUrl: String?) ``` @@ -2545,7 +2545,9 @@ import com.pachca.sdk.ChatSortField import com.pachca.sdk.SortOrder // Список чатов -val response = client.chats.listChats(sort = ChatSortField.ID, order = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = "2025-01-01T00:00:00.000Z", lastMessageAtBefore = "2025-02-01T00:00:00.000Z", personal = false, limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") +val lastMessageAtAfter = OffsetDateTime.parse("2025-01-01T00:00:00.000Z") +val lastMessageAtBefore = OffsetDateTime.parse("2025-02-01T00:00:00.000Z") +val response = client.chats.listChats(sort = ChatSortField.ID, order = SortOrder.DESC, availability = ChatAvailability.IS_MEMBER, lastMessageAtAfter = lastMessageAtAfter, lastMessageAtBefore = lastMessageAtBefore, personal = false, limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") // → ListChatsResponse(data: List, meta: PaginationMeta) ``` @@ -2567,7 +2569,7 @@ val request = ChatCreateRequest( ) ) val response = client.chats.createChat(request = request) -// → Chat(id: Int, name: String, createdAt: String, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: String, meetRoomUrl: String) +// → Chat(id: Int, name: String, createdAt: OffsetDateTime, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: OffsetDateTime, meetRoomUrl: String) ``` @@ -2576,7 +2578,7 @@ val response = client.chats.createChat(request = request) ```kotlin // Получение чата val response = client.chats.getChat(id = 334) -// → Chat(id: Int, name: String, createdAt: String, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: String, meetRoomUrl: String) +// → Chat(id: Int, name: String, createdAt: OffsetDateTime, ownerId: Int, memberIds: List, groupTagIds: List, channel: Boolean, personal: Boolean, public: Boolean, lastMessageAt: OffsetDateTime, meetRoomUrl: String) ``` @@ -2764,7 +2766,7 @@ val request = MessageCreateRequest( linkPreview = false ) val response = client.messages.createMessage(request = request) -// → Message(id: Int, entityType: MessageEntityType, entityId: Int, chatId: Int, rootChatId: Int, content: String, userId: Int, createdAt: String, url: String, files: List, buttons: List>?, thread: MessageThread(id: Long, chatId: Long)?, forwarding: Forwarding(originalMessageId: Int, originalChatId: Int, authorId: Int, originalCreatedAt: String, originalThreadId: Int?, originalThreadMessageId: Int?, originalThreadParentChatId: Int?)?, parentMessageId: Int?, displayAvatarUrl: String?, displayName: String?, changedAt: String?, deletedAt: String?) +// → Message(id: Int, entityType: MessageEntityType, entityId: Int, chatId: Int, rootChatId: Int, content: String, userId: Int, createdAt: OffsetDateTime, url: String, files: List, buttons: List>?, thread: MessageThread(id: Long, chatId: Long)?, forwarding: Forwarding(originalMessageId: Int, originalChatId: Int, authorId: Int, originalCreatedAt: OffsetDateTime, originalThreadId: Int?, originalThreadMessageId: Int?, originalThreadParentChatId: Int?)?, parentMessageId: Int?, displayAvatarUrl: String?, displayName: String?, changedAt: OffsetDateTime?, deletedAt: OffsetDateTime?) // Список сотрудников val response = client.users.listUsers(query = "Олег", limit = 1, cursor = "eyJpZCI6MTAsImRpciI6ImFzYyJ9") @@ -2775,7 +2777,7 @@ val request = TaskCreateRequest( task = TaskCreateRequestTask( kind = TaskKind.REMINDER, content = "Забрать со склада 21 заказ", - dueAt = "2020-06-05T12:00:00.000+03:00", + dueAt = OffsetDateTime.parse("2020-06-05T12:00:00.000+03:00"), priority = 2, performerIds = listOf(123), chatId = 456, @@ -2784,7 +2786,7 @@ val request = TaskCreateRequest( ) ) val response = client.tasks.createTask(request = request) -// → Task(id: Int, kind: TaskKind, content: String, dueAt: String?, priority: Int, userId: Int, chatId: Int?, status: TaskStatus, createdAt: String, performerIds: List, allDay: Boolean, customProperties: List) +// → Task(id: Int, kind: TaskKind, content: String, dueAt: OffsetDateTime?, priority: Int, userId: Int, chatId: Int?, status: TaskStatus, createdAt: OffsetDateTime, performerIds: List, allDay: Boolean, customProperties: List) ``` @@ -7186,7 +7188,7 @@ Albato — платформа для интеграции различных с > Автоматически отслеживайте обновления: подпишитесь на [RSS-ленту](/feed.xml) или используйте [markdown-версию этой страницы](/updates.md) для интеграции с инструментами и AI-агентами. - + ## Аватары, сортировка и n8n Node v2 diff --git a/apps/docs/public/updates.md b/apps/docs/public/updates.md index 8f383042..5226d6c2 100644 --- a/apps/docs/public/updates.md +++ b/apps/docs/public/updates.md @@ -4,7 +4,7 @@ > Автоматически отслеживайте обновления: подпишитесь на [RSS-ленту](/feed.xml) или используйте [markdown-версию этой страницы](/updates.md) для интеграции с инструментами и AI-агентами. - + ## Аватары, сортировка и n8n Node v2 diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 76371ece..0ba5e06c 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 2026.4.0 (6 апреля 2026) +## 2026.4.0 (7 апреля 2026) - **Добавлено** (profile update-avatar): Загрузка аватара профиля - **Добавлено** (profile delete-avatar): Удаление аватара профиля diff --git a/packages/cli/src/data/changelog.json b/packages/cli/src/data/changelog.json index 437cc543..e44ef9c6 100644 --- a/packages/cli/src/data/changelog.json +++ b/packages/cli/src/data/changelog.json @@ -1,7 +1,7 @@ [ { "version": "2026.4.0", - "date": "6 апреля 2026", + "date": "7 апреля 2026", "changes": [ { "type": "+", From 383d67e0fd3576141ea9ad6cc33b5b6c8430d437 Mon Sep 17 00:00:00 2001 From: lookinway Date: Tue, 7 Apr 2026 12:19:44 +0300 Subject: [PATCH 37/37] fix(n8n): repack release archive so tar extracts to n8n-nodes-pachca/ --- .github/workflows/n8n.yml | 5 ++++- integrations/n8n/README.md | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/n8n.yml b/.github/workflows/n8n.yml index 97f4dcfc..e498e519 100644 --- a/.github/workflows/n8n.yml +++ b/.github/workflows/n8n.yml @@ -193,7 +193,10 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | npm pack - mv n8n-nodes-pachca-*.tgz n8n-nodes-pachca.tgz + mkdir n8n-nodes-pachca + tar -xzf n8n-nodes-pachca-*.tgz --strip-components=1 -C n8n-nodes-pachca + rm n8n-nodes-pachca-*.tgz + tar -czf n8n-nodes-pachca.tgz n8n-nodes-pachca gh release create "n8n-v${{ steps.version.outputs.version }}" \ n8n-nodes-pachca.tgz \ --title "n8n-nodes-pachca v${{ steps.version.outputs.version }}" \ diff --git a/integrations/n8n/README.md b/integrations/n8n/README.md index 7047df73..f26cae17 100644 --- a/integrations/n8n/README.md +++ b/integrations/n8n/README.md @@ -21,8 +21,14 @@ npm install n8n-nodes-pachca Or install from archive: ```bash +# Via npm (recommended) +wget https://github.com/pachca/openapi/releases/latest/download/n8n-nodes-pachca.tgz +cd ~/.n8n/nodes && npm install ./n8n-nodes-pachca.tgz + +# Or extract directly (Docker, no npm needed) wget https://github.com/pachca/openapi/releases/latest/download/n8n-nodes-pachca.tgz tar -xzf n8n-nodes-pachca.tgz -C ~/.n8n/nodes/ + # Restart n8n ```