mirror of
https://github.com/simstudioai/sim.git
synced 2026-01-15 01:47:59 -05:00
Compare commits
23 Commits
feat/group
...
feat/langs
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b01f464e9 | ||
|
|
4b3f4983b0 | ||
|
|
1e586381ac | ||
|
|
90386e0359 | ||
|
|
7544557841 | ||
|
|
3f1dccd6aa | ||
|
|
468ec2ea81 | ||
|
|
d7e0d9ba43 | ||
|
|
51477c12cc | ||
|
|
a3535639f1 | ||
|
|
d5bd97de32 | ||
|
|
bd7009e316 | ||
|
|
4f04b1efea | ||
|
|
258e96d6b5 | ||
|
|
4b026ad54d | ||
|
|
f6b7c15dc4 | ||
|
|
70ed19fcdb | ||
|
|
d6e4c91e81 | ||
|
|
e3fa40af11 | ||
|
|
6e0055f847 | ||
|
|
ebbe67aae3 | ||
|
|
2b49d15ec8 | ||
|
|
3d037c9b74 |
@@ -577,6 +577,17 @@ export const ServiceBlock: BlockConfig = {
|
|||||||
|
|
||||||
See the `/add-trigger` skill for creating triggers.
|
See the `/add-trigger` skill for creating triggers.
|
||||||
|
|
||||||
|
## Icon Requirement
|
||||||
|
|
||||||
|
If the icon doesn't already exist in `@/components/icons.tsx`, **do NOT search for it yourself**. After completing the block, ask the user to provide the SVG:
|
||||||
|
|
||||||
|
```
|
||||||
|
The block is complete, but I need an icon for {Service}.
|
||||||
|
Please provide the SVG and I'll convert it to a React component.
|
||||||
|
|
||||||
|
You can usually find this in the service's brand/press kit page, or copy it from their website.
|
||||||
|
```
|
||||||
|
|
||||||
## Checklist Before Finishing
|
## Checklist Before Finishing
|
||||||
|
|
||||||
- [ ] All subBlocks have `id`, `title` (except switch), and `type`
|
- [ ] All subBlocks have `id`, `title` (except switch), and `type`
|
||||||
@@ -588,4 +599,5 @@ See the `/add-trigger` skill for creating triggers.
|
|||||||
- [ ] Tools.config.tool returns correct tool ID
|
- [ ] Tools.config.tool returns correct tool ID
|
||||||
- [ ] Outputs match tool outputs
|
- [ ] Outputs match tool outputs
|
||||||
- [ ] Block registered in registry.ts
|
- [ ] Block registered in registry.ts
|
||||||
|
- [ ] If icon missing: asked user to provide SVG
|
||||||
- [ ] If triggers exist: `triggers` config set, trigger subBlocks spread
|
- [ ] If triggers exist: `triggers` config set, trigger subBlocks spread
|
||||||
|
|||||||
@@ -226,17 +226,26 @@ export function {Service}Icon(props: SVGProps<SVGSVGElement>) {
|
|||||||
fill="none"
|
fill="none"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
>
|
>
|
||||||
{/* SVG paths from brand assets */}
|
{/* SVG paths from user-provided SVG */}
|
||||||
</svg>
|
</svg>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Finding Icons
|
### Getting Icons
|
||||||
1. Check the service's brand/press kit page
|
**Do NOT search for icons yourself.** At the end of implementation, ask the user to provide the SVG:
|
||||||
2. Download SVG logo
|
|
||||||
3. Convert to React component
|
```
|
||||||
4. Ensure it accepts and spreads props
|
I've completed the integration. Before I can add the icon, please provide the SVG for {Service}.
|
||||||
|
You can usually find this in the service's brand/press kit page, or copy it from their website.
|
||||||
|
|
||||||
|
Paste the SVG code here and I'll convert it to a React component.
|
||||||
|
```
|
||||||
|
|
||||||
|
Once the user provides the SVG:
|
||||||
|
1. Extract the SVG paths/content
|
||||||
|
2. Create a React component that spreads props
|
||||||
|
3. Ensure viewBox is preserved from the original SVG
|
||||||
|
|
||||||
## Step 5: Create Triggers (Optional)
|
## Step 5: Create Triggers (Optional)
|
||||||
|
|
||||||
@@ -405,6 +414,7 @@ If creating V2 versions (API-aligned outputs):
|
|||||||
- [ ] If triggers: spread trigger subBlocks with `getTrigger()`
|
- [ ] If triggers: spread trigger subBlocks with `getTrigger()`
|
||||||
|
|
||||||
### Icon
|
### Icon
|
||||||
|
- [ ] Asked user to provide SVG
|
||||||
- [ ] Added icon to `components/icons.tsx`
|
- [ ] Added icon to `components/icons.tsx`
|
||||||
- [ ] Icon spreads props correctly
|
- [ ] Icon spreads props correctly
|
||||||
|
|
||||||
@@ -433,11 +443,18 @@ You: I'll add the Stripe integration. Let me:
|
|||||||
1. First, research the Stripe API using Context7
|
1. First, research the Stripe API using Context7
|
||||||
2. Create the tools for key operations (payments, subscriptions, etc.)
|
2. Create the tools for key operations (payments, subscriptions, etc.)
|
||||||
3. Create the block with operation dropdown
|
3. Create the block with operation dropdown
|
||||||
4. Add the Stripe icon
|
4. Register everything
|
||||||
5. Register everything
|
5. Generate docs
|
||||||
6. Generate docs
|
6. Ask you for the Stripe icon SVG
|
||||||
|
|
||||||
[Proceed with implementation...]
|
[Proceed with implementation...]
|
||||||
|
|
||||||
|
[After completing steps 1-5...]
|
||||||
|
|
||||||
|
I've completed the Stripe integration. Before I can add the icon, please provide the SVG for Stripe.
|
||||||
|
You can usually find this in the service's brand/press kit page, or copy it from their website.
|
||||||
|
|
||||||
|
Paste the SVG code here and I'll convert it to a React component.
|
||||||
```
|
```
|
||||||
|
|
||||||
## Common Gotchas
|
## Common Gotchas
|
||||||
|
|||||||
@@ -552,6 +552,53 @@ All fields automatically have:
|
|||||||
- `mode: 'trigger'` - Only shown in trigger mode
|
- `mode: 'trigger'` - Only shown in trigger mode
|
||||||
- `condition: { field: 'selectedTriggerId', value: triggerId }` - Only shown when this trigger is selected
|
- `condition: { field: 'selectedTriggerId', value: triggerId }` - Only shown when this trigger is selected
|
||||||
|
|
||||||
|
## Trigger Outputs & Webhook Input Formatting
|
||||||
|
|
||||||
|
### Important: Two Sources of Truth
|
||||||
|
|
||||||
|
There are two related but separate concerns:
|
||||||
|
|
||||||
|
1. **Trigger `outputs`** - Schema/contract defining what fields SHOULD be available. Used by UI for tag dropdown.
|
||||||
|
2. **`formatWebhookInput`** - Implementation that transforms raw webhook payload into actual data. Located in `apps/sim/lib/webhooks/utils.server.ts`.
|
||||||
|
|
||||||
|
**These MUST be aligned.** The fields returned by `formatWebhookInput` should match what's defined in trigger `outputs`. If they differ:
|
||||||
|
- Tag dropdown shows fields that don't exist (broken variable resolution)
|
||||||
|
- Or actual data has fields not shown in dropdown (users can't discover them)
|
||||||
|
|
||||||
|
### When to Add a formatWebhookInput Handler
|
||||||
|
|
||||||
|
- **Simple providers**: If the raw webhook payload structure already matches your outputs, you don't need a handler. The generic fallback returns `body` directly.
|
||||||
|
- **Complex providers**: If you need to transform, flatten, extract nested data, compute fields, or handle conditional logic, add a handler.
|
||||||
|
|
||||||
|
### Adding a Handler
|
||||||
|
|
||||||
|
In `apps/sim/lib/webhooks/utils.server.ts`, add a handler block:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
if (foundWebhook.provider === '{service}') {
|
||||||
|
// Transform raw webhook body to match trigger outputs
|
||||||
|
return {
|
||||||
|
eventType: body.type,
|
||||||
|
resourceId: body.data?.id || '',
|
||||||
|
timestamp: body.created_at,
|
||||||
|
resource: body.data,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Key rules:**
|
||||||
|
- Return fields that match your trigger `outputs` definition exactly
|
||||||
|
- No wrapper objects like `webhook: { data: ... }` or `{service}: { ... }`
|
||||||
|
- No duplication (don't spread body AND add individual fields)
|
||||||
|
- Use `null` for missing optional data, not empty objects with empty strings
|
||||||
|
|
||||||
|
### Verify Alignment
|
||||||
|
|
||||||
|
Run the alignment checker:
|
||||||
|
```bash
|
||||||
|
bunx scripts/check-trigger-alignment.ts {service}
|
||||||
|
```
|
||||||
|
|
||||||
## Trigger Outputs
|
## Trigger Outputs
|
||||||
|
|
||||||
Trigger outputs use the same schema as block outputs (NOT tool outputs).
|
Trigger outputs use the same schema as block outputs (NOT tool outputs).
|
||||||
@@ -649,6 +696,11 @@ export const {service}WebhookTrigger: TriggerConfig = {
|
|||||||
- [ ] Added `delete{Service}Webhook` function to `provider-subscriptions.ts`
|
- [ ] Added `delete{Service}Webhook` function to `provider-subscriptions.ts`
|
||||||
- [ ] Added provider to `cleanupExternalWebhook` function
|
- [ ] Added provider to `cleanupExternalWebhook` function
|
||||||
|
|
||||||
|
### Webhook Input Formatting
|
||||||
|
- [ ] Added handler in `apps/sim/lib/webhooks/utils.server.ts` (if custom formatting needed)
|
||||||
|
- [ ] Handler returns fields matching trigger `outputs` exactly
|
||||||
|
- [ ] Run `bunx scripts/check-trigger-alignment.ts {service}` to verify alignment
|
||||||
|
|
||||||
### Testing
|
### Testing
|
||||||
- [ ] Run `bun run type-check` to verify no TypeScript errors
|
- [ ] Run `bun run type-check` to verify no TypeScript errors
|
||||||
- [ ] Restart dev server to pick up new triggers
|
- [ ] Restart dev server to pick up new triggers
|
||||||
|
|||||||
27
.github/workflows/i18n.yml
vendored
27
.github/workflows/i18n.yml
vendored
@@ -1,11 +1,10 @@
|
|||||||
name: 'Auto-translate Documentation'
|
name: 'Auto-translate Documentation'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
schedule:
|
||||||
branches: [ staging ]
|
# Run every Sunday at midnight UTC
|
||||||
paths:
|
- cron: '0 0 * * 0'
|
||||||
- 'apps/docs/content/docs/en/**'
|
workflow_dispatch: # Allow manual triggers
|
||||||
- 'apps/docs/i18n.json'
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
@@ -20,6 +19,7 @@ jobs:
|
|||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
|
ref: staging
|
||||||
token: ${{ secrets.GH_PAT }}
|
token: ${{ secrets.GH_PAT }}
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
@@ -68,12 +68,11 @@ jobs:
|
|||||||
title: "feat(i18n): update translations"
|
title: "feat(i18n): update translations"
|
||||||
body: |
|
body: |
|
||||||
## Summary
|
## Summary
|
||||||
Automated translation updates triggered by changes to documentation.
|
Automated weekly translation updates for documentation.
|
||||||
|
|
||||||
This PR was automatically created after content changes were made, updating translations for all supported languages using Lingo.dev AI translation engine.
|
This PR was automatically created by the scheduled weekly i18n workflow, updating translations for all supported languages using Lingo.dev AI translation engine.
|
||||||
|
|
||||||
**Original trigger**: ${{ github.event.head_commit.message }}
|
**Triggered**: Weekly scheduled run
|
||||||
**Commit**: ${{ github.sha }}
|
|
||||||
**Workflow**: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
**Workflow**: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||||
|
|
||||||
## Type of Change
|
## Type of Change
|
||||||
@@ -107,7 +106,7 @@ jobs:
|
|||||||
## Screenshots/Videos
|
## Screenshots/Videos
|
||||||
<!-- Translation changes are text-based - no visual changes expected -->
|
<!-- Translation changes are text-based - no visual changes expected -->
|
||||||
<!-- Reviewers should check the documentation site renders correctly for all languages -->
|
<!-- Reviewers should check the documentation site renders correctly for all languages -->
|
||||||
branch: auto-translate/staging-merge-${{ github.run_id }}
|
branch: auto-translate/weekly-${{ github.run_id }}
|
||||||
base: staging
|
base: staging
|
||||||
labels: |
|
labels: |
|
||||||
i18n
|
i18n
|
||||||
@@ -145,6 +144,8 @@ jobs:
|
|||||||
bun install --frozen-lockfile
|
bun install --frozen-lockfile
|
||||||
|
|
||||||
- name: Build documentation to verify translations
|
- name: Build documentation to verify translations
|
||||||
|
env:
|
||||||
|
DATABASE_URL: postgresql://dummy:dummy@localhost:5432/dummy
|
||||||
run: |
|
run: |
|
||||||
cd apps/docs
|
cd apps/docs
|
||||||
bun run build
|
bun run build
|
||||||
@@ -153,7 +154,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cd apps/docs
|
cd apps/docs
|
||||||
echo "## Translation Status Report" >> $GITHUB_STEP_SUMMARY
|
echo "## Translation Status Report" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "**Triggered by merge to staging branch**" >> $GITHUB_STEP_SUMMARY
|
echo "**Weekly scheduled translation run**" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "" >> $GITHUB_STEP_SUMMARY
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
en_count=$(find content/docs/en -name "*.mdx" | wc -l)
|
en_count=$(find content/docs/en -name "*.mdx" | wc -l)
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -55,6 +55,7 @@ import {
|
|||||||
JiraIcon,
|
JiraIcon,
|
||||||
JiraServiceManagementIcon,
|
JiraServiceManagementIcon,
|
||||||
KalshiIcon,
|
KalshiIcon,
|
||||||
|
LangsmithIcon,
|
||||||
LemlistIcon,
|
LemlistIcon,
|
||||||
LinearIcon,
|
LinearIcon,
|
||||||
LinkedInIcon,
|
LinkedInIcon,
|
||||||
@@ -107,6 +108,7 @@ import {
|
|||||||
SupabaseIcon,
|
SupabaseIcon,
|
||||||
TavilyIcon,
|
TavilyIcon,
|
||||||
TelegramIcon,
|
TelegramIcon,
|
||||||
|
TinybirdIcon,
|
||||||
TranslateIcon,
|
TranslateIcon,
|
||||||
TrelloIcon,
|
TrelloIcon,
|
||||||
TTSIcon,
|
TTSIcon,
|
||||||
@@ -179,6 +181,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
|
|||||||
jira_service_management: JiraServiceManagementIcon,
|
jira_service_management: JiraServiceManagementIcon,
|
||||||
kalshi: KalshiIcon,
|
kalshi: KalshiIcon,
|
||||||
knowledge: PackageSearchIcon,
|
knowledge: PackageSearchIcon,
|
||||||
|
langsmith: LangsmithIcon,
|
||||||
lemlist: LemlistIcon,
|
lemlist: LemlistIcon,
|
||||||
linear: LinearIcon,
|
linear: LinearIcon,
|
||||||
linkedin: LinkedInIcon,
|
linkedin: LinkedInIcon,
|
||||||
@@ -230,6 +233,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
|
|||||||
supabase: SupabaseIcon,
|
supabase: SupabaseIcon,
|
||||||
tavily: TavilyIcon,
|
tavily: TavilyIcon,
|
||||||
telegram: TelegramIcon,
|
telegram: TelegramIcon,
|
||||||
|
tinybird: TinybirdIcon,
|
||||||
translate: TranslateIcon,
|
translate: TranslateIcon,
|
||||||
trello: TrelloIcon,
|
trello: TrelloIcon,
|
||||||
tts: TTSIcon,
|
tts: TTSIcon,
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ Sim automatically calculates costs for all workflow executions, providing transp
|
|||||||
|
|
||||||
Every workflow execution includes two cost components:
|
Every workflow execution includes two cost components:
|
||||||
|
|
||||||
**Base Execution Charge**: $0.001 per execution
|
**Base Execution Charge**: $0.005 per execution
|
||||||
|
|
||||||
**AI Model Usage**: Variable cost based on token consumption
|
**AI Model Usage**: Variable cost based on token consumption
|
||||||
```javascript
|
```javascript
|
||||||
@@ -48,40 +48,40 @@ The model breakdown shows:
|
|||||||
|
|
||||||
<Tabs items={['Hosted Models', 'Bring Your Own API Key']}>
|
<Tabs items={['Hosted Models', 'Bring Your Own API Key']}>
|
||||||
<Tab>
|
<Tab>
|
||||||
**Hosted Models** - Sim provides API keys with a 1.4x pricing multiplier for Agent blocks:
|
**Hosted Models** - Sim provides API keys with a 1.1x pricing multiplier for Agent blocks:
|
||||||
|
|
||||||
**OpenAI**
|
**OpenAI**
|
||||||
| Model | Base Price (Input/Output) | Hosted Price (Input/Output) |
|
| Model | Base Price (Input/Output) | Hosted Price (Input/Output) |
|
||||||
|-------|---------------------------|----------------------------|
|
|-------|---------------------------|----------------------------|
|
||||||
| GPT-5.1 | $1.25 / $10.00 | $1.75 / $14.00 |
|
| GPT-5.1 | $1.25 / $10.00 | $1.38 / $11.00 |
|
||||||
| GPT-5 | $1.25 / $10.00 | $1.75 / $14.00 |
|
| GPT-5 | $1.25 / $10.00 | $1.38 / $11.00 |
|
||||||
| GPT-5 Mini | $0.25 / $2.00 | $0.35 / $2.80 |
|
| GPT-5 Mini | $0.25 / $2.00 | $0.28 / $2.20 |
|
||||||
| GPT-5 Nano | $0.05 / $0.40 | $0.07 / $0.56 |
|
| GPT-5 Nano | $0.05 / $0.40 | $0.06 / $0.44 |
|
||||||
| GPT-4o | $2.50 / $10.00 | $3.50 / $14.00 |
|
| GPT-4o | $2.50 / $10.00 | $2.75 / $11.00 |
|
||||||
| GPT-4.1 | $2.00 / $8.00 | $2.80 / $11.20 |
|
| GPT-4.1 | $2.00 / $8.00 | $2.20 / $8.80 |
|
||||||
| GPT-4.1 Mini | $0.40 / $1.60 | $0.56 / $2.24 |
|
| GPT-4.1 Mini | $0.40 / $1.60 | $0.44 / $1.76 |
|
||||||
| GPT-4.1 Nano | $0.10 / $0.40 | $0.14 / $0.56 |
|
| GPT-4.1 Nano | $0.10 / $0.40 | $0.11 / $0.44 |
|
||||||
| o1 | $15.00 / $60.00 | $21.00 / $84.00 |
|
| o1 | $15.00 / $60.00 | $16.50 / $66.00 |
|
||||||
| o3 | $2.00 / $8.00 | $2.80 / $11.20 |
|
| o3 | $2.00 / $8.00 | $2.20 / $8.80 |
|
||||||
| o4 Mini | $1.10 / $4.40 | $1.54 / $6.16 |
|
| o4 Mini | $1.10 / $4.40 | $1.21 / $4.84 |
|
||||||
|
|
||||||
**Anthropic**
|
**Anthropic**
|
||||||
| Model | Base Price (Input/Output) | Hosted Price (Input/Output) |
|
| Model | Base Price (Input/Output) | Hosted Price (Input/Output) |
|
||||||
|-------|---------------------------|----------------------------|
|
|-------|---------------------------|----------------------------|
|
||||||
| Claude Opus 4.5 | $5.00 / $25.00 | $7.00 / $35.00 |
|
| Claude Opus 4.5 | $5.00 / $25.00 | $5.50 / $27.50 |
|
||||||
| Claude Opus 4.1 | $15.00 / $75.00 | $21.00 / $105.00 |
|
| Claude Opus 4.1 | $15.00 / $75.00 | $16.50 / $82.50 |
|
||||||
| Claude Sonnet 4.5 | $3.00 / $15.00 | $4.20 / $21.00 |
|
| Claude Sonnet 4.5 | $3.00 / $15.00 | $3.30 / $16.50 |
|
||||||
| Claude Sonnet 4.0 | $3.00 / $15.00 | $4.20 / $21.00 |
|
| Claude Sonnet 4.0 | $3.00 / $15.00 | $3.30 / $16.50 |
|
||||||
| Claude Haiku 4.5 | $1.00 / $5.00 | $1.40 / $7.00 |
|
| Claude Haiku 4.5 | $1.00 / $5.00 | $1.10 / $5.50 |
|
||||||
|
|
||||||
**Google**
|
**Google**
|
||||||
| Model | Base Price (Input/Output) | Hosted Price (Input/Output) |
|
| Model | Base Price (Input/Output) | Hosted Price (Input/Output) |
|
||||||
|-------|---------------------------|----------------------------|
|
|-------|---------------------------|----------------------------|
|
||||||
| Gemini 3 Pro Preview | $2.00 / $12.00 | $2.80 / $16.80 |
|
| Gemini 3 Pro Preview | $2.00 / $12.00 | $2.20 / $13.20 |
|
||||||
| Gemini 2.5 Pro | $1.25 / $10.00 | $1.75 / $14.00 |
|
| Gemini 2.5 Pro | $1.25 / $10.00 | $1.38 / $11.00 |
|
||||||
| Gemini 2.5 Flash | $0.30 / $2.50 | $0.42 / $3.50 |
|
| Gemini 2.5 Flash | $0.30 / $2.50 | $0.33 / $2.75 |
|
||||||
|
|
||||||
*The 1.4x multiplier covers infrastructure and API management costs.*
|
*The 1.1x multiplier covers infrastructure and API management costs.*
|
||||||
</Tab>
|
</Tab>
|
||||||
|
|
||||||
<Tab>
|
<Tab>
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ Send a message to an external A2A-compatible agent.
|
|||||||
| `message` | string | Yes | Message to send to the agent |
|
| `message` | string | Yes | Message to send to the agent |
|
||||||
| `taskId` | string | No | Task ID for continuing an existing task |
|
| `taskId` | string | No | Task ID for continuing an existing task |
|
||||||
| `contextId` | string | No | Context ID for conversation continuity |
|
| `contextId` | string | No | Context ID for conversation continuity |
|
||||||
|
| `data` | string | No | Structured data to include with the message \(JSON string\) |
|
||||||
|
| `files` | array | No | Files to include with the message |
|
||||||
| `apiKey` | string | No | API key for authentication |
|
| `apiKey` | string | No | API key for authentication |
|
||||||
|
|
||||||
#### Output
|
#### Output
|
||||||
@@ -208,8 +210,3 @@ Delete the push notification webhook configuration for a task.
|
|||||||
| `success` | boolean | Whether deletion was successful |
|
| `success` | boolean | Whether deletion was successful |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
|
|
||||||
- Category: `tools`
|
|
||||||
- Type: `a2a`
|
|
||||||
|
|||||||
@@ -72,6 +72,13 @@ Get a list of backlinks pointing to a target domain or URL. Returns details abou
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `backlinks` | array | List of backlinks pointing to the target |
|
| `backlinks` | array | List of backlinks pointing to the target |
|
||||||
|
| ↳ `urlFrom` | string | The URL of the page containing the backlink |
|
||||||
|
| ↳ `urlTo` | string | The URL being linked to |
|
||||||
|
| ↳ `anchor` | string | The anchor text of the link |
|
||||||
|
| ↳ `domainRatingSource` | number | Domain Rating of the linking domain |
|
||||||
|
| ↳ `isDofollow` | boolean | Whether the link is dofollow |
|
||||||
|
| ↳ `firstSeen` | string | When the backlink was first discovered |
|
||||||
|
| ↳ `lastVisited` | string | When the backlink was last checked |
|
||||||
|
|
||||||
### `ahrefs_backlinks_stats`
|
### `ahrefs_backlinks_stats`
|
||||||
|
|
||||||
@@ -91,6 +98,12 @@ Get backlink statistics for a target domain or URL. Returns totals for different
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `stats` | object | Backlink statistics summary |
|
| `stats` | object | Backlink statistics summary |
|
||||||
|
| ↳ `total` | number | Total number of live backlinks |
|
||||||
|
| ↳ `dofollow` | number | Number of dofollow backlinks |
|
||||||
|
| ↳ `nofollow` | number | Number of nofollow backlinks |
|
||||||
|
| ↳ `text` | number | Number of text backlinks |
|
||||||
|
| ↳ `image` | number | Number of image backlinks |
|
||||||
|
| ↳ `redirect` | number | Number of redirect backlinks |
|
||||||
|
|
||||||
### `ahrefs_referring_domains`
|
### `ahrefs_referring_domains`
|
||||||
|
|
||||||
@@ -112,6 +125,12 @@ Get a list of domains that link to a target domain or URL. Returns unique referr
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `referringDomains` | array | List of domains linking to the target |
|
| `referringDomains` | array | List of domains linking to the target |
|
||||||
|
| ↳ `domain` | string | The referring domain |
|
||||||
|
| ↳ `domainRating` | number | Domain Rating of the referring domain |
|
||||||
|
| ↳ `backlinks` | number | Total number of backlinks from this domain |
|
||||||
|
| ↳ `dofollowBacklinks` | number | Number of dofollow backlinks from this domain |
|
||||||
|
| ↳ `firstSeen` | string | When the domain was first seen linking |
|
||||||
|
| ↳ `lastVisited` | string | When the domain was last checked |
|
||||||
|
|
||||||
### `ahrefs_organic_keywords`
|
### `ahrefs_organic_keywords`
|
||||||
|
|
||||||
@@ -134,6 +153,12 @@ Get organic keywords that a target domain or URL ranks for in Google search resu
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `keywords` | array | List of organic keywords the target ranks for |
|
| `keywords` | array | List of organic keywords the target ranks for |
|
||||||
|
| ↳ `keyword` | string | The keyword |
|
||||||
|
| ↳ `volume` | number | Monthly search volume |
|
||||||
|
| ↳ `position` | number | Current ranking position |
|
||||||
|
| ↳ `url` | string | The URL that ranks for this keyword |
|
||||||
|
| ↳ `traffic` | number | Estimated monthly organic traffic |
|
||||||
|
| ↳ `keywordDifficulty` | number | Keyword difficulty score \(0-100\) |
|
||||||
|
|
||||||
### `ahrefs_top_pages`
|
### `ahrefs_top_pages`
|
||||||
|
|
||||||
@@ -157,6 +182,11 @@ Get the top pages of a target domain sorted by organic traffic. Returns page URL
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `pages` | array | List of top pages by organic traffic |
|
| `pages` | array | List of top pages by organic traffic |
|
||||||
|
| ↳ `url` | string | The page URL |
|
||||||
|
| ↳ `traffic` | number | Estimated monthly organic traffic |
|
||||||
|
| ↳ `keywords` | number | Number of keywords the page ranks for |
|
||||||
|
| ↳ `topKeyword` | string | The top keyword driving traffic to this page |
|
||||||
|
| ↳ `value` | number | Estimated traffic value in USD |
|
||||||
|
|
||||||
### `ahrefs_keyword_overview`
|
### `ahrefs_keyword_overview`
|
||||||
|
|
||||||
@@ -175,6 +205,14 @@ Get detailed metrics for a keyword including search volume, keyword difficulty,
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `overview` | object | Keyword metrics overview |
|
| `overview` | object | Keyword metrics overview |
|
||||||
|
| ↳ `keyword` | string | The analyzed keyword |
|
||||||
|
| ↳ `searchVolume` | number | Monthly search volume |
|
||||||
|
| ↳ `keywordDifficulty` | number | Keyword difficulty score \(0-100\) |
|
||||||
|
| ↳ `cpc` | number | Cost per click in USD |
|
||||||
|
| ↳ `clicks` | number | Estimated clicks per month |
|
||||||
|
| ↳ `clicksPercentage` | number | Percentage of searches that result in clicks |
|
||||||
|
| ↳ `parentTopic` | string | The parent topic for this keyword |
|
||||||
|
| ↳ `trafficPotential` | number | Estimated traffic potential if ranking #1 |
|
||||||
|
|
||||||
### `ahrefs_broken_backlinks`
|
### `ahrefs_broken_backlinks`
|
||||||
|
|
||||||
@@ -196,5 +234,10 @@ Get a list of broken backlinks pointing to a target domain or URL. Useful for id
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `brokenBacklinks` | array | List of broken backlinks |
|
| `brokenBacklinks` | array | List of broken backlinks |
|
||||||
|
| ↳ `urlFrom` | string | The URL of the page containing the broken link |
|
||||||
|
| ↳ `urlTo` | string | The broken URL being linked to |
|
||||||
|
| ↳ `httpCode` | number | HTTP status code \(e.g., 404, 410\) |
|
||||||
|
| ↳ `anchor` | string | The anchor text of the link |
|
||||||
|
| ↳ `domainRatingSource` | number | Domain Rating of the linking domain |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ Read records from an Airtable table
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `records` | json | Array of retrieved Airtable records |
|
| `records` | json | Array of retrieved Airtable records |
|
||||||
|
| `metadata` | json | Operation metadata including pagination offset and total records count |
|
||||||
|
|
||||||
### `airtable_get_record`
|
### `airtable_get_record`
|
||||||
|
|
||||||
@@ -88,6 +89,7 @@ Write new records to an Airtable table
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `records` | json | Array of created Airtable records |
|
| `records` | json | Array of created Airtable records |
|
||||||
|
| `metadata` | json | Operation metadata |
|
||||||
|
|
||||||
### `airtable_update_record`
|
### `airtable_update_record`
|
||||||
|
|
||||||
@@ -126,5 +128,6 @@ Update multiple existing records in an Airtable table
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `records` | json | Array of updated Airtable records |
|
| `records` | json | Array of updated Airtable records |
|
||||||
|
| `metadata` | json | Operation metadata including record count and updated record IDs |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ Search for academic papers on ArXiv by keywords, authors, titles, or other field
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `papers` | json | Array of papers matching the search query |
|
| `papers` | json | Array of papers matching the search query |
|
||||||
|
| `totalResults` | number | Total number of results found for the search query |
|
||||||
|
|
||||||
### `arxiv_get_paper`
|
### `arxiv_get_paper`
|
||||||
|
|
||||||
@@ -85,5 +86,6 @@ Search for papers by a specific author on ArXiv.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `authorPapers` | json | Array of papers authored by the specified author |
|
| `authorPapers` | json | Array of papers authored by the specified author |
|
||||||
|
| `totalResults` | number | Total number of papers found for the author |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,18 @@ Retrieve a single task by GID or get multiple tasks with filters
|
|||||||
| `notes` | string | Task notes or description |
|
| `notes` | string | Task notes or description |
|
||||||
| `completed` | boolean | Whether the task is completed |
|
| `completed` | boolean | Whether the task is completed |
|
||||||
| `assignee` | object | Assignee details |
|
| `assignee` | object | Assignee details |
|
||||||
|
| ↳ `gid` | string | Assignee GID |
|
||||||
|
| ↳ `name` | string | Assignee name |
|
||||||
|
| `created_by` | object | Creator details |
|
||||||
|
| ↳ `gid` | string | Creator GID |
|
||||||
|
| ↳ `name` | string | Creator name |
|
||||||
|
| `due_on` | string | Due date \(YYYY-MM-DD\) |
|
||||||
|
| `created_at` | string | Task creation timestamp |
|
||||||
|
| `modified_at` | string | Task last modified timestamp |
|
||||||
|
| `tasks` | array | Array of tasks \(when fetching multiple\) |
|
||||||
|
| ↳ `gid` | string | Task GID |
|
||||||
|
| ↳ `name` | string | Task name |
|
||||||
|
| ↳ `completed` | boolean | Completion status |
|
||||||
|
|
||||||
### `asana_create_task`
|
### `asana_create_task`
|
||||||
|
|
||||||
@@ -116,6 +128,9 @@ Retrieve all projects from an Asana workspace
|
|||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `ts` | string | Timestamp of the response |
|
| `ts` | string | Timestamp of the response |
|
||||||
| `projects` | array | Array of projects |
|
| `projects` | array | Array of projects |
|
||||||
|
| ↳ `gid` | string | Project GID |
|
||||||
|
| ↳ `name` | string | Project name |
|
||||||
|
| ↳ `resource_type` | string | Resource type \(project\) |
|
||||||
|
|
||||||
### `asana_search_tasks`
|
### `asana_search_tasks`
|
||||||
|
|
||||||
@@ -138,6 +153,22 @@ Search for tasks in an Asana workspace
|
|||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `ts` | string | Timestamp of the response |
|
| `ts` | string | Timestamp of the response |
|
||||||
| `tasks` | array | Array of matching tasks |
|
| `tasks` | array | Array of matching tasks |
|
||||||
|
| ↳ `gid` | string | Assignee GID |
|
||||||
|
| ↳ `resource_type` | string | Resource type |
|
||||||
|
| ↳ `resource_subtype` | string | Resource subtype |
|
||||||
|
| ↳ `name` | string | Assignee name |
|
||||||
|
| ↳ `notes` | string | Task notes |
|
||||||
|
| ↳ `completed` | boolean | Completion status |
|
||||||
|
| ↳ `assignee` | object | Assignee details |
|
||||||
|
| ↳ `gid` | string | Assignee GID |
|
||||||
|
| ↳ `name` | string | Assignee name |
|
||||||
|
| ↳ `due_on` | string | Due date |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `modified_at` | string | Modified timestamp |
|
||||||
|
| `next_page` | object | Pagination info |
|
||||||
|
| ↳ `offset` | string | Offset token |
|
||||||
|
| ↳ `path` | string | API path |
|
||||||
|
| ↳ `uri` | string | Full URI |
|
||||||
|
|
||||||
### `asana_add_comment`
|
### `asana_add_comment`
|
||||||
|
|
||||||
@@ -160,5 +191,7 @@ Add a comment (story) to an Asana task
|
|||||||
| `text` | string | Comment text content |
|
| `text` | string | Comment text content |
|
||||||
| `created_at` | string | Comment creation timestamp |
|
| `created_at` | string | Comment creation timestamp |
|
||||||
| `created_by` | object | Comment author details |
|
| `created_by` | object | Comment author details |
|
||||||
|
| ↳ `gid` | string | Author GID |
|
||||||
|
| ↳ `name` | string | Author name |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,16 @@ Get information about the currently authenticated Calendly user
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `resource` | object | Current user information |
|
| `resource` | object | Current user information |
|
||||||
|
| ↳ `uri` | string | Canonical reference to the user |
|
||||||
|
| ↳ `name` | string | User full name |
|
||||||
|
| ↳ `slug` | string | Unique identifier for the user in URLs |
|
||||||
|
| ↳ `email` | string | User email address |
|
||||||
|
| ↳ `scheduling_url` | string | URL to the user |
|
||||||
|
| ↳ `timezone` | string | User timezone |
|
||||||
|
| ↳ `avatar_url` | string | URL to user avatar image |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp when user was created |
|
||||||
|
| ↳ `updated_at` | string | ISO timestamp when user was last updated |
|
||||||
|
| ↳ `current_organization` | string | URI of current organization |
|
||||||
|
|
||||||
### `calendly_list_event_types`
|
### `calendly_list_event_types`
|
||||||
|
|
||||||
@@ -69,6 +79,25 @@ Retrieve a list of all event types for a user or organization
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `collection` | array | Array of event type objects |
|
| `collection` | array | Array of event type objects |
|
||||||
|
| ↳ `uri` | string | Canonical reference to the event type |
|
||||||
|
| ↳ `name` | string | Event type name |
|
||||||
|
| ↳ `active` | boolean | Whether the event type is active |
|
||||||
|
| ↳ `booking_method` | string | Booking method \(e.g., |
|
||||||
|
| ↳ `color` | string | Hex color code |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp of creation |
|
||||||
|
| ↳ `description_html` | string | HTML formatted description |
|
||||||
|
| ↳ `description_plain` | string | Plain text description |
|
||||||
|
| ↳ `duration` | number | Duration in minutes |
|
||||||
|
| ↳ `scheduling_url` | string | URL to scheduling page |
|
||||||
|
| ↳ `slug` | string | Unique identifier for URLs |
|
||||||
|
| ↳ `type` | string | Event type classification |
|
||||||
|
| ↳ `updated_at` | string | ISO timestamp of last update |
|
||||||
|
| `pagination` | object | Pagination information |
|
||||||
|
| ↳ `count` | number | Number of results in this page |
|
||||||
|
| ↳ `next_page` | string | URL to next page \(if available\) |
|
||||||
|
| ↳ `previous_page` | string | URL to previous page \(if available\) |
|
||||||
|
| ↳ `next_page_token` | string | Token for next page |
|
||||||
|
| ↳ `previous_page_token` | string | Token for previous page |
|
||||||
|
|
||||||
### `calendly_get_event_type`
|
### `calendly_get_event_type`
|
||||||
|
|
||||||
@@ -86,6 +115,30 @@ Get detailed information about a specific event type
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `resource` | object | Event type details |
|
| `resource` | object | Event type details |
|
||||||
|
| ↳ `uri` | string | Canonical reference to the event type |
|
||||||
|
| ↳ `name` | string | Question text |
|
||||||
|
| ↳ `active` | boolean | Whether the event type is active |
|
||||||
|
| ↳ `booking_method` | string | Booking method |
|
||||||
|
| ↳ `color` | string | Hex color code |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp of creation |
|
||||||
|
| ↳ `custom_questions` | array | Custom questions for invitees |
|
||||||
|
| ↳ `name` | string | Question text |
|
||||||
|
| ↳ `type` | string | Question type \(text, single_select, multi_select, etc.\) |
|
||||||
|
| ↳ `position` | number | Question order |
|
||||||
|
| ↳ `enabled` | boolean | Whether question is enabled |
|
||||||
|
| ↳ `required` | boolean | Whether question is required |
|
||||||
|
| ↳ `answer_choices` | array | Available answer choices |
|
||||||
|
| ↳ `type` | string | Event type classification |
|
||||||
|
| ↳ `position` | number | Question order |
|
||||||
|
| ↳ `enabled` | boolean | Whether question is enabled |
|
||||||
|
| ↳ `required` | boolean | Whether question is required |
|
||||||
|
| ↳ `answer_choices` | array | Available answer choices |
|
||||||
|
| ↳ `description_html` | string | HTML formatted description |
|
||||||
|
| ↳ `description_plain` | string | Plain text description |
|
||||||
|
| ↳ `duration` | number | Duration in minutes |
|
||||||
|
| ↳ `scheduling_url` | string | URL to scheduling page |
|
||||||
|
| ↳ `slug` | string | Unique identifier for URLs |
|
||||||
|
| ↳ `updated_at` | string | ISO timestamp of last update |
|
||||||
|
|
||||||
### `calendly_list_scheduled_events`
|
### `calendly_list_scheduled_events`
|
||||||
|
|
||||||
@@ -111,6 +164,30 @@ Retrieve a list of scheduled events for a user or organization
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `collection` | array | Array of scheduled event objects |
|
| `collection` | array | Array of scheduled event objects |
|
||||||
|
| ↳ `uri` | string | Canonical reference to the event |
|
||||||
|
| ↳ `name` | string | Event name |
|
||||||
|
| ↳ `status` | string | Event status \(active or canceled\) |
|
||||||
|
| ↳ `start_time` | string | ISO timestamp of event start |
|
||||||
|
| ↳ `end_time` | string | ISO timestamp of event end |
|
||||||
|
| ↳ `event_type` | string | URI of the event type |
|
||||||
|
| ↳ `location` | string | Location description |
|
||||||
|
| ↳ `type` | string | Location type \(e.g., |
|
||||||
|
| ↳ `join_url` | string | URL to join online meeting \(if applicable\) |
|
||||||
|
| ↳ `invitees_counter` | object | Invitee count information |
|
||||||
|
| ↳ `total` | number | Total number of invitees |
|
||||||
|
| ↳ `active` | number | Number of active invitees |
|
||||||
|
| ↳ `limit` | number | Maximum number of invitees |
|
||||||
|
| ↳ `total` | number | Total number of invitees |
|
||||||
|
| ↳ `active` | number | Number of active invitees |
|
||||||
|
| ↳ `limit` | number | Maximum number of invitees |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp of event creation |
|
||||||
|
| ↳ `updated_at` | string | ISO timestamp of last update |
|
||||||
|
| `pagination` | object | Pagination information |
|
||||||
|
| ↳ `count` | number | Number of results in this page |
|
||||||
|
| ↳ `next_page` | string | URL to next page \(if available\) |
|
||||||
|
| ↳ `previous_page` | string | URL to previous page \(if available\) |
|
||||||
|
| ↳ `next_page_token` | string | Token for next page |
|
||||||
|
| ↳ `previous_page_token` | string | Token for previous page |
|
||||||
|
|
||||||
### `calendly_get_scheduled_event`
|
### `calendly_get_scheduled_event`
|
||||||
|
|
||||||
@@ -128,6 +205,36 @@ Get detailed information about a specific scheduled event
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `resource` | object | Scheduled event details |
|
| `resource` | object | Scheduled event details |
|
||||||
|
| ↳ `uri` | string | Canonical reference to the event |
|
||||||
|
| ↳ `name` | string | Event name |
|
||||||
|
| ↳ `status` | string | Event status \(active or canceled\) |
|
||||||
|
| ↳ `start_time` | string | ISO timestamp of event start |
|
||||||
|
| ↳ `end_time` | string | ISO timestamp of event end |
|
||||||
|
| ↳ `event_type` | string | URI of the event type |
|
||||||
|
| ↳ `location` | string | Location description |
|
||||||
|
| ↳ `type` | string | Location type |
|
||||||
|
| ↳ `join_url` | string | URL to join online meeting |
|
||||||
|
| ↳ `invitees_counter` | object | Invitee count information |
|
||||||
|
| ↳ `total` | number | Total number of invitees |
|
||||||
|
| ↳ `active` | number | Number of active invitees |
|
||||||
|
| ↳ `limit` | number | Maximum number of invitees |
|
||||||
|
| ↳ `total` | number | Total number of invitees |
|
||||||
|
| ↳ `active` | number | Number of active invitees |
|
||||||
|
| ↳ `limit` | number | Maximum number of invitees |
|
||||||
|
| ↳ `event_memberships` | array | Event hosts/members |
|
||||||
|
| ↳ `user` | string | User URI |
|
||||||
|
| ↳ `user_email` | string | User email |
|
||||||
|
| ↳ `user_name` | string | User name |
|
||||||
|
| ↳ `user` | string | User URI |
|
||||||
|
| ↳ `user_email` | string | User email |
|
||||||
|
| ↳ `user_name` | string | User name |
|
||||||
|
| ↳ `event_guests` | array | Additional guests |
|
||||||
|
| ↳ `email` | string | Guest email |
|
||||||
|
| ↳ `created_at` | string | When guest was added |
|
||||||
|
| ↳ `updated_at` | string | When guest info was updated |
|
||||||
|
| ↳ `email` | string | Guest email |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp of event creation |
|
||||||
|
| ↳ `updated_at` | string | ISO timestamp of last update |
|
||||||
|
|
||||||
### `calendly_list_event_invitees`
|
### `calendly_list_event_invitees`
|
||||||
|
|
||||||
@@ -150,6 +257,32 @@ Retrieve a list of invitees for a scheduled event
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `collection` | array | Array of invitee objects |
|
| `collection` | array | Array of invitee objects |
|
||||||
|
| ↳ `uri` | string | Canonical reference to the invitee |
|
||||||
|
| ↳ `email` | string | Invitee email address |
|
||||||
|
| ↳ `name` | string | Invitee full name |
|
||||||
|
| ↳ `first_name` | string | Invitee first name |
|
||||||
|
| ↳ `last_name` | string | Invitee last name |
|
||||||
|
| ↳ `status` | string | Invitee status \(active or canceled\) |
|
||||||
|
| ↳ `questions_and_answers` | array | Responses to custom questions |
|
||||||
|
| ↳ `question` | string | Question text |
|
||||||
|
| ↳ `answer` | string | Invitee answer |
|
||||||
|
| ↳ `position` | number | Question order |
|
||||||
|
| ↳ `question` | string | Question text |
|
||||||
|
| ↳ `answer` | string | Invitee answer |
|
||||||
|
| ↳ `position` | number | Question order |
|
||||||
|
| ↳ `timezone` | string | Invitee timezone |
|
||||||
|
| ↳ `event` | string | URI of the scheduled event |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp when invitee was created |
|
||||||
|
| ↳ `updated_at` | string | ISO timestamp when invitee was updated |
|
||||||
|
| ↳ `cancel_url` | string | URL to cancel the booking |
|
||||||
|
| ↳ `reschedule_url` | string | URL to reschedule the booking |
|
||||||
|
| ↳ `rescheduled` | boolean | Whether invitee rescheduled |
|
||||||
|
| `pagination` | object | Pagination information |
|
||||||
|
| ↳ `count` | number | Number of results in this page |
|
||||||
|
| ↳ `next_page` | string | URL to next page \(if available\) |
|
||||||
|
| ↳ `previous_page` | string | URL to previous page \(if available\) |
|
||||||
|
| ↳ `next_page_token` | string | Token for next page |
|
||||||
|
| ↳ `previous_page_token` | string | Token for previous page |
|
||||||
|
|
||||||
### `calendly_cancel_event`
|
### `calendly_cancel_event`
|
||||||
|
|
||||||
@@ -168,5 +301,9 @@ Cancel a scheduled event
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `resource` | object | Cancellation details |
|
| `resource` | object | Cancellation details |
|
||||||
|
| ↳ `canceler_type` | string | Type of canceler \(host or invitee\) |
|
||||||
|
| ↳ `canceled_by` | string | Name of person who canceled |
|
||||||
|
| ↳ `reason` | string | Cancellation reason |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp when event was canceled |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -61,5 +61,10 @@ Populate Clay with data from a JSON file. Enables direct communication and notif
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `data` | json | Response data from Clay webhook |
|
| `data` | json | Response data from Clay webhook |
|
||||||
| `metadata` | object | Webhook response metadata |
|
| `metadata` | object | Webhook response metadata |
|
||||||
|
| ↳ `status` | number | HTTP status code |
|
||||||
|
| ↳ `statusText` | string | HTTP status text |
|
||||||
|
| ↳ `headers` | object | Response headers from Clay |
|
||||||
|
| ↳ `timestamp` | string | ISO timestamp when webhook was received |
|
||||||
|
| ↳ `contentType` | string | Content type of the response |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -99,6 +99,15 @@ Post an event to the Datadog event stream. Use for deployment notifications, ale
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `event` | object | The created event details |
|
| `event` | object | The created event details |
|
||||||
|
| ↳ `id` | number | Event ID |
|
||||||
|
| ↳ `title` | string | Event title |
|
||||||
|
| ↳ `text` | string | Event text |
|
||||||
|
| ↳ `date_happened` | number | Unix timestamp when event occurred |
|
||||||
|
| ↳ `priority` | string | Event priority |
|
||||||
|
| ↳ `alert_type` | string | Alert type |
|
||||||
|
| ↳ `host` | string | Associated host |
|
||||||
|
| ↳ `tags` | array | Event tags |
|
||||||
|
| ↳ `url` | string | URL to view the event in Datadog |
|
||||||
|
|
||||||
### `datadog_create_monitor`
|
### `datadog_create_monitor`
|
||||||
|
|
||||||
@@ -124,6 +133,16 @@ Create a new monitor/alert in Datadog. Monitors can track metrics, service check
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `monitor` | object | The created monitor details |
|
| `monitor` | object | The created monitor details |
|
||||||
|
| ↳ `id` | number | Monitor ID |
|
||||||
|
| ↳ `name` | string | Monitor name |
|
||||||
|
| ↳ `type` | string | Monitor type |
|
||||||
|
| ↳ `query` | string | Monitor query |
|
||||||
|
| ↳ `message` | string | Notification message |
|
||||||
|
| ↳ `tags` | array | Monitor tags |
|
||||||
|
| ↳ `priority` | number | Monitor priority |
|
||||||
|
| ↳ `overall_state` | string | Current monitor state |
|
||||||
|
| ↳ `created` | string | Creation timestamp |
|
||||||
|
| ↳ `modified` | string | Last modification timestamp |
|
||||||
|
|
||||||
### `datadog_get_monitor`
|
### `datadog_get_monitor`
|
||||||
|
|
||||||
@@ -145,6 +164,16 @@ Retrieve details of a specific monitor by ID.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `monitor` | object | The monitor details |
|
| `monitor` | object | The monitor details |
|
||||||
|
| ↳ `id` | number | Monitor ID |
|
||||||
|
| ↳ `name` | string | Monitor name |
|
||||||
|
| ↳ `type` | string | Monitor type |
|
||||||
|
| ↳ `query` | string | Monitor query |
|
||||||
|
| ↳ `message` | string | Notification message |
|
||||||
|
| ↳ `tags` | array | Monitor tags |
|
||||||
|
| ↳ `priority` | number | Monitor priority |
|
||||||
|
| ↳ `overall_state` | string | Current monitor state |
|
||||||
|
| ↳ `created` | string | Creation timestamp |
|
||||||
|
| ↳ `modified` | string | Last modification timestamp |
|
||||||
|
|
||||||
### `datadog_list_monitors`
|
### `datadog_list_monitors`
|
||||||
|
|
||||||
@@ -170,6 +199,12 @@ List all monitors in Datadog with optional filtering by name, tags, or state.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `monitors` | array | List of monitors |
|
| `monitors` | array | List of monitors |
|
||||||
|
| ↳ `id` | number | Monitor ID |
|
||||||
|
| ↳ `name` | string | Monitor name |
|
||||||
|
| ↳ `type` | string | Monitor type |
|
||||||
|
| ↳ `query` | string | Monitor query |
|
||||||
|
| ↳ `overall_state` | string | Current state |
|
||||||
|
| ↳ `tags` | array | Tags |
|
||||||
|
|
||||||
### `datadog_mute_monitor`
|
### `datadog_mute_monitor`
|
||||||
|
|
||||||
@@ -215,6 +250,19 @@ Search and retrieve logs from Datadog. Use for troubleshooting, analysis, or mon
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `logs` | array | List of log entries |
|
| `logs` | array | List of log entries |
|
||||||
|
| ↳ `id` | string | Log ID |
|
||||||
|
| ↳ `content` | object | Log content |
|
||||||
|
| ↳ `timestamp` | string | Log timestamp |
|
||||||
|
| ↳ `host` | string | Host name |
|
||||||
|
| ↳ `service` | string | Service name |
|
||||||
|
| ↳ `message` | string | Log message |
|
||||||
|
| ↳ `status` | string | Log status/level |
|
||||||
|
| ↳ `timestamp` | string | Log timestamp |
|
||||||
|
| ↳ `host` | string | Host name |
|
||||||
|
| ↳ `service` | string | Service name |
|
||||||
|
| ↳ `message` | string | Log message |
|
||||||
|
| ↳ `status` | string | Log status/level |
|
||||||
|
| `nextLogId` | string | Cursor for pagination |
|
||||||
|
|
||||||
### `datadog_send_logs`
|
### `datadog_send_logs`
|
||||||
|
|
||||||
@@ -259,6 +307,12 @@ Schedule a downtime to suppress monitor notifications during maintenance windows
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `downtime` | object | The created downtime details |
|
| `downtime` | object | The created downtime details |
|
||||||
|
| ↳ `id` | number | Downtime ID |
|
||||||
|
| ↳ `scope` | array | Downtime scope |
|
||||||
|
| ↳ `message` | string | Downtime message |
|
||||||
|
| ↳ `start` | number | Start time \(Unix timestamp\) |
|
||||||
|
| ↳ `end` | number | End time \(Unix timestamp\) |
|
||||||
|
| ↳ `active` | boolean | Whether downtime is currently active |
|
||||||
|
|
||||||
### `datadog_list_downtimes`
|
### `datadog_list_downtimes`
|
||||||
|
|
||||||
@@ -279,6 +333,12 @@ List all scheduled downtimes in Datadog.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `downtimes` | array | List of downtimes |
|
| `downtimes` | array | List of downtimes |
|
||||||
|
| ↳ `id` | number | Downtime ID |
|
||||||
|
| ↳ `scope` | array | Downtime scope |
|
||||||
|
| ↳ `message` | string | Downtime message |
|
||||||
|
| ↳ `start` | number | Start time \(Unix timestamp\) |
|
||||||
|
| ↳ `end` | number | End time \(Unix timestamp\) |
|
||||||
|
| ↳ `active` | boolean | Whether downtime is currently active |
|
||||||
|
|
||||||
### `datadog_cancel_downtime`
|
### `datadog_cancel_downtime`
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,24 @@ Send a message to a Discord channel
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Discord message data |
|
| `data` | object | Discord message data |
|
||||||
|
| ↳ `id` | string | Author user ID |
|
||||||
|
| ↳ `content` | string | Message content |
|
||||||
|
| ↳ `channel_id` | string | Channel ID where message was sent |
|
||||||
|
| ↳ `author` | object | Message author information |
|
||||||
|
| ↳ `id` | string | Author user ID |
|
||||||
|
| ↳ `username` | string | Author username |
|
||||||
|
| ↳ `avatar` | string | Author avatar hash |
|
||||||
|
| ↳ `bot` | boolean | Whether author is a bot |
|
||||||
|
| ↳ `username` | string | Author username |
|
||||||
|
| ↳ `avatar` | string | Author avatar hash |
|
||||||
|
| ↳ `bot` | boolean | Whether author is a bot |
|
||||||
|
| ↳ `timestamp` | string | Message timestamp |
|
||||||
|
| ↳ `edited_timestamp` | string | Message edited timestamp |
|
||||||
|
| ↳ `embeds` | array | Message embeds |
|
||||||
|
| ↳ `attachments` | array | Message attachments |
|
||||||
|
| ↳ `mentions` | array | User mentions in message |
|
||||||
|
| ↳ `mention_roles` | array | Role mentions in message |
|
||||||
|
| ↳ `mention_everyone` | boolean | Whether message mentions everyone |
|
||||||
|
|
||||||
### `discord_get_messages`
|
### `discord_get_messages`
|
||||||
|
|
||||||
@@ -83,6 +101,43 @@ Retrieve messages from a Discord channel
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Container for messages data |
|
| `data` | object | Container for messages data |
|
||||||
|
| ↳ `messages` | array | Array of Discord messages with full metadata |
|
||||||
|
| ↳ `id` | string | Author user ID |
|
||||||
|
| ↳ `content` | string | Message content |
|
||||||
|
| ↳ `channel_id` | string | Channel ID |
|
||||||
|
| ↳ `author` | object | Message author information |
|
||||||
|
| ↳ `id` | string | Author user ID |
|
||||||
|
| ↳ `username` | string | Author username |
|
||||||
|
| ↳ `avatar` | string | Author avatar hash |
|
||||||
|
| ↳ `bot` | boolean | Whether author is a bot |
|
||||||
|
| ↳ `username` | string | Author username |
|
||||||
|
| ↳ `avatar` | string | Author avatar hash |
|
||||||
|
| ↳ `bot` | boolean | Whether author is a bot |
|
||||||
|
| ↳ `timestamp` | string | Message timestamp |
|
||||||
|
| ↳ `edited_timestamp` | string | Message edited timestamp |
|
||||||
|
| ↳ `embeds` | array | Message embeds |
|
||||||
|
| ↳ `attachments` | array | Message attachments |
|
||||||
|
| ↳ `mentions` | array | User mentions in message |
|
||||||
|
| ↳ `mention_roles` | array | Role mentions in message |
|
||||||
|
| ↳ `mention_everyone` | boolean | Whether message mentions everyone |
|
||||||
|
| ↳ `id` | string | Author user ID |
|
||||||
|
| ↳ `content` | string | Message content |
|
||||||
|
| ↳ `channel_id` | string | Channel ID |
|
||||||
|
| ↳ `author` | object | Message author information |
|
||||||
|
| ↳ `id` | string | Author user ID |
|
||||||
|
| ↳ `username` | string | Author username |
|
||||||
|
| ↳ `avatar` | string | Author avatar hash |
|
||||||
|
| ↳ `bot` | boolean | Whether author is a bot |
|
||||||
|
| ↳ `username` | string | Author username |
|
||||||
|
| ↳ `avatar` | string | Author avatar hash |
|
||||||
|
| ↳ `bot` | boolean | Whether author is a bot |
|
||||||
|
| ↳ `timestamp` | string | Message timestamp |
|
||||||
|
| ↳ `edited_timestamp` | string | Message edited timestamp |
|
||||||
|
| ↳ `embeds` | array | Message embeds |
|
||||||
|
| ↳ `attachments` | array | Message attachments |
|
||||||
|
| ↳ `mentions` | array | User mentions in message |
|
||||||
|
| ↳ `mention_roles` | array | Role mentions in message |
|
||||||
|
| ↳ `mention_everyone` | boolean | Whether message mentions everyone |
|
||||||
|
|
||||||
### `discord_get_server`
|
### `discord_get_server`
|
||||||
|
|
||||||
@@ -101,6 +156,14 @@ Retrieve information about a Discord server (guild)
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Discord server \(guild\) information |
|
| `data` | object | Discord server \(guild\) information |
|
||||||
|
| ↳ `id` | string | Server ID |
|
||||||
|
| ↳ `name` | string | Server name |
|
||||||
|
| ↳ `icon` | string | Server icon hash |
|
||||||
|
| ↳ `description` | string | Server description |
|
||||||
|
| ↳ `owner_id` | string | Server owner user ID |
|
||||||
|
| ↳ `roles` | array | Server roles |
|
||||||
|
| ↳ `channels` | array | Server channels |
|
||||||
|
| ↳ `member_count` | number | Number of members in server |
|
||||||
|
|
||||||
### `discord_get_user`
|
### `discord_get_user`
|
||||||
|
|
||||||
@@ -119,6 +182,14 @@ Retrieve information about a Discord user
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Discord user information |
|
| `data` | object | Discord user information |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `username` | string | Username |
|
||||||
|
| ↳ `discriminator` | string | User discriminator \(4-digit number\) |
|
||||||
|
| ↳ `avatar` | string | User avatar hash |
|
||||||
|
| ↳ `bot` | boolean | Whether user is a bot |
|
||||||
|
| ↳ `system` | boolean | Whether user is a system user |
|
||||||
|
| ↳ `email` | string | User email \(if available\) |
|
||||||
|
| ↳ `verified` | boolean | Whether user email is verified |
|
||||||
|
|
||||||
### `discord_edit_message`
|
### `discord_edit_message`
|
||||||
|
|
||||||
@@ -140,6 +211,10 @@ Edit an existing message in a Discord channel
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Updated Discord message data |
|
| `data` | object | Updated Discord message data |
|
||||||
|
| ↳ `id` | string | Message ID |
|
||||||
|
| ↳ `content` | string | Updated message content |
|
||||||
|
| ↳ `channel_id` | string | Channel ID |
|
||||||
|
| ↳ `edited_timestamp` | string | Message edited timestamp |
|
||||||
|
|
||||||
### `discord_delete_message`
|
### `discord_delete_message`
|
||||||
|
|
||||||
@@ -260,6 +335,11 @@ Create a thread in a Discord channel
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Created thread data |
|
| `data` | object | Created thread data |
|
||||||
|
| ↳ `id` | string | Thread ID |
|
||||||
|
| ↳ `name` | string | Thread name |
|
||||||
|
| ↳ `type` | number | Thread channel type |
|
||||||
|
| ↳ `guild_id` | string | Server ID |
|
||||||
|
| ↳ `parent_id` | string | Parent channel ID |
|
||||||
|
|
||||||
### `discord_join_thread`
|
### `discord_join_thread`
|
||||||
|
|
||||||
@@ -316,6 +396,8 @@ Archive or unarchive a thread in Discord
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Updated thread data |
|
| `data` | object | Updated thread data |
|
||||||
|
| ↳ `id` | string | Thread ID |
|
||||||
|
| ↳ `archived` | boolean | Whether thread is archived |
|
||||||
|
|
||||||
### `discord_create_channel`
|
### `discord_create_channel`
|
||||||
|
|
||||||
@@ -338,6 +420,10 @@ Create a new channel in a Discord server
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Created channel data |
|
| `data` | object | Created channel data |
|
||||||
|
| ↳ `id` | string | Channel ID |
|
||||||
|
| ↳ `name` | string | Channel name |
|
||||||
|
| ↳ `type` | number | Channel type |
|
||||||
|
| ↳ `guild_id` | string | Server ID |
|
||||||
|
|
||||||
### `discord_update_channel`
|
### `discord_update_channel`
|
||||||
|
|
||||||
@@ -359,6 +445,10 @@ Update a Discord channel
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Updated channel data |
|
| `data` | object | Updated channel data |
|
||||||
|
| ↳ `id` | string | Channel ID |
|
||||||
|
| ↳ `name` | string | Channel name |
|
||||||
|
| ↳ `type` | number | Channel type |
|
||||||
|
| ↳ `topic` | string | Channel topic |
|
||||||
|
|
||||||
### `discord_delete_channel`
|
### `discord_delete_channel`
|
||||||
|
|
||||||
@@ -396,6 +486,11 @@ Get information about a Discord channel
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Channel data |
|
| `data` | object | Channel data |
|
||||||
|
| ↳ `id` | string | Channel ID |
|
||||||
|
| ↳ `name` | string | Channel name |
|
||||||
|
| ↳ `type` | number | Channel type |
|
||||||
|
| ↳ `topic` | string | Channel topic |
|
||||||
|
| ↳ `guild_id` | string | Server ID |
|
||||||
|
|
||||||
### `discord_create_role`
|
### `discord_create_role`
|
||||||
|
|
||||||
@@ -418,6 +513,11 @@ Create a new role in a Discord server
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Created role data |
|
| `data` | object | Created role data |
|
||||||
|
| ↳ `id` | string | Role ID |
|
||||||
|
| ↳ `name` | string | Role name |
|
||||||
|
| ↳ `color` | number | Role color |
|
||||||
|
| ↳ `hoist` | boolean | Whether role is hoisted |
|
||||||
|
| ↳ `mentionable` | boolean | Whether role is mentionable |
|
||||||
|
|
||||||
### `discord_update_role`
|
### `discord_update_role`
|
||||||
|
|
||||||
@@ -441,6 +541,9 @@ Update a role in a Discord server
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Updated role data |
|
| `data` | object | Updated role data |
|
||||||
|
| ↳ `id` | string | Role ID |
|
||||||
|
| ↳ `name` | string | Role name |
|
||||||
|
| ↳ `color` | number | Role color |
|
||||||
|
|
||||||
### `discord_delete_role`
|
### `discord_delete_role`
|
||||||
|
|
||||||
@@ -574,6 +677,16 @@ Get information about a member in a Discord server
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Member data |
|
| `data` | object | Member data |
|
||||||
|
| ↳ `user` | object | User information |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `username` | string | Username |
|
||||||
|
| ↳ `avatar` | string | Avatar hash |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `username` | string | Username |
|
||||||
|
| ↳ `avatar` | string | Avatar hash |
|
||||||
|
| ↳ `nick` | string | Server nickname |
|
||||||
|
| ↳ `roles` | array | Array of role IDs |
|
||||||
|
| ↳ `joined_at` | string | When the member joined |
|
||||||
|
|
||||||
### `discord_update_member`
|
### `discord_update_member`
|
||||||
|
|
||||||
@@ -596,6 +709,9 @@ Update a member in a Discord server (e.g., change nickname)
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Updated member data |
|
| `data` | object | Updated member data |
|
||||||
|
| ↳ `nick` | string | Server nickname |
|
||||||
|
| ↳ `mute` | boolean | Voice mute status |
|
||||||
|
| ↳ `deaf` | boolean | Voice deaf status |
|
||||||
|
|
||||||
### `discord_create_invite`
|
### `discord_create_invite`
|
||||||
|
|
||||||
@@ -618,6 +734,11 @@ Create an invite link for a Discord channel
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Created invite data |
|
| `data` | object | Created invite data |
|
||||||
|
| ↳ `code` | string | Invite code |
|
||||||
|
| ↳ `url` | string | Full invite URL |
|
||||||
|
| ↳ `max_age` | number | Max age in seconds |
|
||||||
|
| ↳ `max_uses` | number | Max uses |
|
||||||
|
| ↳ `temporary` | boolean | Whether temporary |
|
||||||
|
|
||||||
### `discord_get_invite`
|
### `discord_get_invite`
|
||||||
|
|
||||||
@@ -637,6 +758,11 @@ Get information about a Discord invite
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Invite data |
|
| `data` | object | Invite data |
|
||||||
|
| ↳ `code` | string | Invite code |
|
||||||
|
| ↳ `guild` | object | Server information |
|
||||||
|
| ↳ `channel` | object | Channel information |
|
||||||
|
| ↳ `approximate_member_count` | number | Approximate member count |
|
||||||
|
| ↳ `approximate_presence_count` | number | Approximate online count |
|
||||||
|
|
||||||
### `discord_delete_invite`
|
### `discord_delete_invite`
|
||||||
|
|
||||||
@@ -675,6 +801,11 @@ Create a webhook in a Discord channel
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Created webhook data |
|
| `data` | object | Created webhook data |
|
||||||
|
| ↳ `id` | string | Webhook ID |
|
||||||
|
| ↳ `name` | string | Webhook name |
|
||||||
|
| ↳ `token` | string | Webhook token |
|
||||||
|
| ↳ `url` | string | Webhook URL |
|
||||||
|
| ↳ `channel_id` | string | Channel ID |
|
||||||
|
|
||||||
### `discord_execute_webhook`
|
### `discord_execute_webhook`
|
||||||
|
|
||||||
@@ -696,6 +827,10 @@ Execute a Discord webhook to send a message
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Message sent via webhook |
|
| `data` | object | Message sent via webhook |
|
||||||
|
| ↳ `id` | string | Message ID |
|
||||||
|
| ↳ `content` | string | Message content |
|
||||||
|
| ↳ `channel_id` | string | Channel ID |
|
||||||
|
| ↳ `timestamp` | string | Message timestamp |
|
||||||
|
|
||||||
### `discord_get_webhook`
|
### `discord_get_webhook`
|
||||||
|
|
||||||
@@ -715,6 +850,11 @@ Get information about a Discord webhook
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Webhook data |
|
| `data` | object | Webhook data |
|
||||||
|
| ↳ `id` | string | Webhook ID |
|
||||||
|
| ↳ `name` | string | Webhook name |
|
||||||
|
| ↳ `channel_id` | string | Channel ID |
|
||||||
|
| ↳ `guild_id` | string | Server ID |
|
||||||
|
| ↳ `token` | string | Webhook token |
|
||||||
|
|
||||||
### `discord_delete_webhook`
|
### `discord_delete_webhook`
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,15 @@ Upload a file to Dropbox
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `file` | object | The uploaded file metadata |
|
| `file` | object | The uploaded file metadata |
|
||||||
|
| ↳ `id` | string | Unique identifier for the file |
|
||||||
|
| ↳ `name` | string | Name of the file |
|
||||||
|
| ↳ `path_display` | string | Display path of the file |
|
||||||
|
| ↳ `path_lower` | string | Lowercase path of the file |
|
||||||
|
| ↳ `size` | number | Size of the file in bytes |
|
||||||
|
| ↳ `client_modified` | string | Client modification time |
|
||||||
|
| ↳ `server_modified` | string | Server modification time |
|
||||||
|
| ↳ `rev` | string | Revision identifier |
|
||||||
|
| ↳ `content_hash` | string | Content hash for the file |
|
||||||
|
|
||||||
### `dropbox_download`
|
### `dropbox_download`
|
||||||
|
|
||||||
@@ -70,6 +79,12 @@ Download a file from Dropbox and get a temporary link
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `file` | object | The file metadata |
|
| `file` | object | The file metadata |
|
||||||
|
| ↳ `id` | string | Unique identifier for the file |
|
||||||
|
| ↳ `name` | string | Name of the file |
|
||||||
|
| ↳ `path_display` | string | Display path of the file |
|
||||||
|
| ↳ `size` | number | Size of the file in bytes |
|
||||||
|
| `temporaryLink` | string | Temporary link to download the file \(valid for ~4 hours\) |
|
||||||
|
| `content` | string | Base64 encoded file content \(if fetched\) |
|
||||||
|
|
||||||
### `dropbox_list_folder`
|
### `dropbox_list_folder`
|
||||||
|
|
||||||
@@ -90,6 +105,12 @@ List the contents of a folder in Dropbox
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `entries` | array | List of files and folders in the directory |
|
| `entries` | array | List of files and folders in the directory |
|
||||||
|
| ↳ `id` | string | Unique identifier |
|
||||||
|
| ↳ `name` | string | Name of the file/folder |
|
||||||
|
| ↳ `path_display` | string | Display path |
|
||||||
|
| ↳ `size` | number | Size in bytes \(files only\) |
|
||||||
|
| `cursor` | string | Cursor for pagination |
|
||||||
|
| `hasMore` | boolean | Whether there are more results |
|
||||||
|
|
||||||
### `dropbox_create_folder`
|
### `dropbox_create_folder`
|
||||||
|
|
||||||
@@ -107,6 +128,10 @@ Create a new folder in Dropbox
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `folder` | object | The created folder metadata |
|
| `folder` | object | The created folder metadata |
|
||||||
|
| ↳ `id` | string | Unique identifier for the folder |
|
||||||
|
| ↳ `name` | string | Name of the folder |
|
||||||
|
| ↳ `path_display` | string | Display path of the folder |
|
||||||
|
| ↳ `path_lower` | string | Lowercase path of the folder |
|
||||||
|
|
||||||
### `dropbox_delete`
|
### `dropbox_delete`
|
||||||
|
|
||||||
@@ -123,6 +148,9 @@ Delete a file or folder in Dropbox (moves to trash)
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `metadata` | object | Metadata of the deleted item |
|
| `metadata` | object | Metadata of the deleted item |
|
||||||
|
| ↳ `name` | string | Name of the deleted item |
|
||||||
|
| ↳ `path_display` | string | Display path |
|
||||||
|
| `deleted` | boolean | Whether the deletion was successful |
|
||||||
|
|
||||||
### `dropbox_copy`
|
### `dropbox_copy`
|
||||||
|
|
||||||
@@ -141,6 +169,10 @@ Copy a file or folder in Dropbox
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `metadata` | object | Metadata of the copied item |
|
| `metadata` | object | Metadata of the copied item |
|
||||||
|
| ↳ `id` | string | Unique identifier |
|
||||||
|
| ↳ `name` | string | Name of the copied item |
|
||||||
|
| ↳ `path_display` | string | Display path |
|
||||||
|
| ↳ `size` | number | Size in bytes \(files only\) |
|
||||||
|
|
||||||
### `dropbox_move`
|
### `dropbox_move`
|
||||||
|
|
||||||
@@ -159,6 +191,10 @@ Move or rename a file or folder in Dropbox
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `metadata` | object | Metadata of the moved item |
|
| `metadata` | object | Metadata of the moved item |
|
||||||
|
| ↳ `id` | string | Unique identifier |
|
||||||
|
| ↳ `name` | string | Name of the moved item |
|
||||||
|
| ↳ `path_display` | string | Display path |
|
||||||
|
| ↳ `size` | number | Size in bytes \(files only\) |
|
||||||
|
|
||||||
### `dropbox_get_metadata`
|
### `dropbox_get_metadata`
|
||||||
|
|
||||||
@@ -177,6 +213,15 @@ Get metadata for a file or folder in Dropbox
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `metadata` | object | Metadata for the file or folder |
|
| `metadata` | object | Metadata for the file or folder |
|
||||||
|
| ↳ `id` | string | Unique identifier |
|
||||||
|
| ↳ `name` | string | Name of the item |
|
||||||
|
| ↳ `path_display` | string | Display path |
|
||||||
|
| ↳ `path_lower` | string | Lowercase path |
|
||||||
|
| ↳ `size` | number | Size in bytes \(files only\) |
|
||||||
|
| ↳ `client_modified` | string | Client modification time |
|
||||||
|
| ↳ `server_modified` | string | Server modification time |
|
||||||
|
| ↳ `rev` | string | Revision identifier |
|
||||||
|
| ↳ `content_hash` | string | Content hash |
|
||||||
|
|
||||||
### `dropbox_create_shared_link`
|
### `dropbox_create_shared_link`
|
||||||
|
|
||||||
@@ -196,6 +241,11 @@ Create a shareable link for a file or folder in Dropbox
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `sharedLink` | object | The created shared link |
|
| `sharedLink` | object | The created shared link |
|
||||||
|
| ↳ `url` | string | The shared link URL |
|
||||||
|
| ↳ `name` | string | Name of the shared item |
|
||||||
|
| ↳ `path_lower` | string | Lowercase path of the shared item |
|
||||||
|
| ↳ `expires` | string | Expiration date if set |
|
||||||
|
| ↳ `link_permissions` | object | Permissions for the shared link |
|
||||||
|
|
||||||
### `dropbox_search`
|
### `dropbox_search`
|
||||||
|
|
||||||
@@ -215,5 +265,9 @@ Search for files and folders in Dropbox
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `matches` | array | Search results |
|
| `matches` | array | Search results |
|
||||||
|
| ↳ `match_type` | object | Type of match: filename, content, or both |
|
||||||
|
| ↳ `metadata` | object | File or folder metadata |
|
||||||
|
| `hasMore` | boolean | Whether there are more results |
|
||||||
|
| `cursor` | string | Cursor for pagination |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -59,5 +59,12 @@ Search the web using DuckDuckGo Instant Answers API. Returns instant answers, ab
|
|||||||
| `answerType` | string | Type of the answer \(e.g., calc, ip, etc.\) |
|
| `answerType` | string | Type of the answer \(e.g., calc, ip, etc.\) |
|
||||||
| `type` | string | Response type: A \(article\), D \(disambiguation\), C \(category\), N \(name\), E \(exclusive\) |
|
| `type` | string | Response type: A \(article\), D \(disambiguation\), C \(category\), N \(name\), E \(exclusive\) |
|
||||||
| `relatedTopics` | array | Array of related topics with URLs and descriptions |
|
| `relatedTopics` | array | Array of related topics with URLs and descriptions |
|
||||||
|
| ↳ `FirstURL` | string | URL to the related topic |
|
||||||
|
| ↳ `Text` | string | Description of the related topic |
|
||||||
|
| ↳ `Result` | string | HTML result snippet |
|
||||||
|
| `results` | array | Array of external link results |
|
||||||
|
| ↳ `FirstURL` | string | URL of the result |
|
||||||
|
| ↳ `Text` | string | Description of the result |
|
||||||
|
| ↳ `Result` | string | HTML result snippet |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -61,6 +61,15 @@ Search the web using Exa AI. Returns relevant search results with titles, URLs,
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | Search results with titles, URLs, and text snippets |
|
| `results` | array | Search results with titles, URLs, and text snippets |
|
||||||
|
| ↳ `title` | string | The title of the search result |
|
||||||
|
| ↳ `url` | string | The URL of the search result |
|
||||||
|
| ↳ `publishedDate` | string | Date when the content was published |
|
||||||
|
| ↳ `author` | string | The author of the content |
|
||||||
|
| ↳ `summary` | string | A brief summary of the content |
|
||||||
|
| ↳ `favicon` | string | URL of the site |
|
||||||
|
| ↳ `image` | string | URL of a representative image from the page |
|
||||||
|
| ↳ `text` | string | Text snippet or full content from the page |
|
||||||
|
| ↳ `score` | number | Relevance score for the search result |
|
||||||
|
|
||||||
### `exa_get_contents`
|
### `exa_get_contents`
|
||||||
|
|
||||||
@@ -84,6 +93,10 @@ Retrieve the contents of webpages using Exa AI. Returns the title, text content,
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | Retrieved content from URLs with title, text, and summaries |
|
| `results` | array | Retrieved content from URLs with title, text, and summaries |
|
||||||
|
| ↳ `url` | string | The URL that content was retrieved from |
|
||||||
|
| ↳ `title` | string | The title of the webpage |
|
||||||
|
| ↳ `text` | string | The full text content of the webpage |
|
||||||
|
| ↳ `summary` | string | AI-generated summary of the webpage content |
|
||||||
|
|
||||||
### `exa_find_similar_links`
|
### `exa_find_similar_links`
|
||||||
|
|
||||||
@@ -109,6 +122,10 @@ Find webpages similar to a given URL using Exa AI. Returns a list of similar lin
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `similarLinks` | array | Similar links found with titles, URLs, and text snippets |
|
| `similarLinks` | array | Similar links found with titles, URLs, and text snippets |
|
||||||
|
| ↳ `title` | string | The title of the similar webpage |
|
||||||
|
| ↳ `url` | string | The URL of the similar webpage |
|
||||||
|
| ↳ `text` | string | Text snippet or full content from the similar webpage |
|
||||||
|
| ↳ `score` | number | Similarity score indicating how similar the page is |
|
||||||
|
|
||||||
### `exa_answer`
|
### `exa_answer`
|
||||||
|
|
||||||
@@ -128,6 +145,9 @@ Get an AI-generated answer to a question with citations from the web using Exa A
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `answer` | string | AI-generated answer to the question |
|
| `answer` | string | AI-generated answer to the question |
|
||||||
| `citations` | array | Sources and citations for the answer |
|
| `citations` | array | Sources and citations for the answer |
|
||||||
|
| ↳ `title` | string | The title of the cited source |
|
||||||
|
| ↳ `url` | string | The URL of the cited source |
|
||||||
|
| ↳ `text` | string | Relevant text from the cited source |
|
||||||
|
|
||||||
### `exa_research`
|
### `exa_research`
|
||||||
|
|
||||||
|
|||||||
@@ -97,6 +97,21 @@ Crawl entire websites and extract structured content from all accessible pages
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `pages` | array | Array of crawled pages with their content and metadata |
|
| `pages` | array | Array of crawled pages with their content and metadata |
|
||||||
|
| ↳ `markdown` | string | Page content in markdown format |
|
||||||
|
| ↳ `html` | string | Page HTML content |
|
||||||
|
| ↳ `metadata` | object | Page metadata |
|
||||||
|
| ↳ `title` | string | Page title |
|
||||||
|
| ↳ `description` | string | Page description |
|
||||||
|
| ↳ `language` | string | Page language |
|
||||||
|
| ↳ `sourceURL` | string | Source URL of the page |
|
||||||
|
| ↳ `statusCode` | number | HTTP status code |
|
||||||
|
| ↳ `title` | string | Page title |
|
||||||
|
| ↳ `description` | string | Page description |
|
||||||
|
| ↳ `language` | string | Page language |
|
||||||
|
| ↳ `sourceURL` | string | Source URL of the page |
|
||||||
|
| ↳ `statusCode` | number | HTTP status code |
|
||||||
|
| `total` | number | Total number of pages found during crawl |
|
||||||
|
| `creditsUsed` | number | Number of credits consumed by the crawl operation |
|
||||||
|
|
||||||
### `firecrawl_map`
|
### `firecrawl_map`
|
||||||
|
|
||||||
|
|||||||
@@ -75,6 +75,18 @@ Get a single transcript with full details including summary, action items, and a
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `transcript` | object | The transcript with full details |
|
| `transcript` | object | The transcript with full details |
|
||||||
|
| ↳ `id` | string | Transcript ID |
|
||||||
|
| ↳ `title` | string | Meeting title |
|
||||||
|
| ↳ `date` | number | Meeting timestamp |
|
||||||
|
| ↳ `duration` | number | Meeting duration in seconds |
|
||||||
|
| ↳ `transcript_url` | string | URL to view transcript |
|
||||||
|
| ↳ `audio_url` | string | URL to audio recording |
|
||||||
|
| ↳ `host_email` | string | Host email address |
|
||||||
|
| ↳ `participants` | array | List of participant emails |
|
||||||
|
| ↳ `speakers` | array | List of speakers |
|
||||||
|
| ↳ `sentences` | array | Transcript sentences |
|
||||||
|
| ↳ `summary` | object | Meeting summary and action items |
|
||||||
|
| ↳ `analytics` | object | Meeting analytics and sentiment |
|
||||||
|
|
||||||
### `fireflies_get_user`
|
### `fireflies_get_user`
|
||||||
|
|
||||||
@@ -92,6 +104,15 @@ Get user information from Fireflies.ai. Returns current user if no ID specified.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `user` | object | User information |
|
| `user` | object | User information |
|
||||||
|
| ↳ `user_id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `integrations` | array | Connected integrations |
|
||||||
|
| ↳ `is_admin` | boolean | Whether user is admin |
|
||||||
|
| ↳ `minutes_consumed` | number | Total minutes transcribed |
|
||||||
|
| ↳ `num_transcripts` | number | Number of transcripts |
|
||||||
|
| ↳ `recent_transcript` | string | Most recent transcript ID |
|
||||||
|
| ↳ `recent_meeting` | string | Most recent meeting date |
|
||||||
|
|
||||||
### `fireflies_list_users`
|
### `fireflies_list_users`
|
||||||
|
|
||||||
@@ -193,6 +214,9 @@ Create a soundbite/highlight from a specific time range in a transcript
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `bite` | object | Created bite details |
|
| `bite` | object | Created bite details |
|
||||||
|
| ↳ `id` | string | Bite ID |
|
||||||
|
| ↳ `name` | string | Bite name |
|
||||||
|
| ↳ `status` | string | Processing status |
|
||||||
|
|
||||||
### `fireflies_list_bites`
|
### `fireflies_list_bites`
|
||||||
|
|
||||||
|
|||||||
@@ -87,6 +87,10 @@ Read content from a Google Docs document
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `content` | string | Extracted document text content |
|
| `content` | string | Extracted document text content |
|
||||||
| `metadata` | json | Document metadata including ID, title, and URL |
|
| `metadata` | json | Document metadata including ID, title, and URL |
|
||||||
|
| ↳ `documentId` | string | Google Docs document ID |
|
||||||
|
| ↳ `title` | string | Document title |
|
||||||
|
| ↳ `mimeType` | string | Document MIME type |
|
||||||
|
| ↳ `url` | string | Document URL |
|
||||||
|
|
||||||
### `google_docs_write`
|
### `google_docs_write`
|
||||||
|
|
||||||
@@ -105,6 +109,10 @@ Write or update content in a Google Docs document
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `updatedContent` | boolean | Indicates if document content was updated successfully |
|
| `updatedContent` | boolean | Indicates if document content was updated successfully |
|
||||||
| `metadata` | json | Updated document metadata including ID, title, and URL |
|
| `metadata` | json | Updated document metadata including ID, title, and URL |
|
||||||
|
| ↳ `documentId` | string | Google Docs document ID |
|
||||||
|
| ↳ `title` | string | Document title |
|
||||||
|
| ↳ `mimeType` | string | Document MIME type |
|
||||||
|
| ↳ `url` | string | Document URL |
|
||||||
|
|
||||||
### `google_docs_create`
|
### `google_docs_create`
|
||||||
|
|
||||||
@@ -124,5 +132,9 @@ Create a new Google Docs document
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `metadata` | json | Created document metadata including ID, title, and URL |
|
| `metadata` | json | Created document metadata including ID, title, and URL |
|
||||||
|
| ↳ `documentId` | string | Google Docs document ID |
|
||||||
|
| ↳ `title` | string | Document title |
|
||||||
|
| ↳ `mimeType` | string | Document MIME type |
|
||||||
|
| ↳ `url` | string | Document URL |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -66,6 +66,58 @@ Upload a file to Google Drive with complete metadata returned
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `file` | object | Complete uploaded file metadata from Google Drive |
|
| `file` | object | Complete uploaded file metadata from Google Drive |
|
||||||
|
| ↳ `id` | string | Google Drive file ID |
|
||||||
|
| ↳ `name` | string | File name |
|
||||||
|
| ↳ `mimeType` | string | MIME type |
|
||||||
|
| ↳ `kind` | string | Resource type identifier |
|
||||||
|
| ↳ `description` | string | File description |
|
||||||
|
| ↳ `originalFilename` | string | Original uploaded filename |
|
||||||
|
| ↳ `fullFileExtension` | string | Full file extension |
|
||||||
|
| ↳ `fileExtension` | string | File extension |
|
||||||
|
| ↳ `owners` | json | List of file owners |
|
||||||
|
| ↳ `permissions` | json | File permissions |
|
||||||
|
| ↳ `permissionIds` | json | Permission IDs |
|
||||||
|
| ↳ `shared` | boolean | Whether file is shared |
|
||||||
|
| ↳ `ownedByMe` | boolean | Whether owned by current user |
|
||||||
|
| ↳ `writersCanShare` | boolean | Whether writers can share |
|
||||||
|
| ↳ `viewersCanCopyContent` | boolean | Whether viewers can copy |
|
||||||
|
| ↳ `copyRequiresWriterPermission` | boolean | Whether copy requires writer permission |
|
||||||
|
| ↳ `sharingUser` | json | User who shared the file |
|
||||||
|
| ↳ `starred` | boolean | Whether file is starred |
|
||||||
|
| ↳ `trashed` | boolean | Whether file is in trash |
|
||||||
|
| ↳ `explicitlyTrashed` | boolean | Whether explicitly trashed |
|
||||||
|
| ↳ `appProperties` | json | App-specific properties |
|
||||||
|
| ↳ `createdTime` | string | File creation time |
|
||||||
|
| ↳ `modifiedTime` | string | Last modification time |
|
||||||
|
| ↳ `modifiedByMeTime` | string | When modified by current user |
|
||||||
|
| ↳ `viewedByMeTime` | string | When last viewed by current user |
|
||||||
|
| ↳ `sharedWithMeTime` | string | When shared with current user |
|
||||||
|
| ↳ `lastModifyingUser` | json | User who last modified the file |
|
||||||
|
| ↳ `viewedByMe` | boolean | Whether viewed by current user |
|
||||||
|
| ↳ `modifiedByMe` | boolean | Whether modified by current user |
|
||||||
|
| ↳ `webViewLink` | string | URL to view in browser |
|
||||||
|
| ↳ `webContentLink` | string | Direct download URL |
|
||||||
|
| ↳ `iconLink` | string | URL to file icon |
|
||||||
|
| ↳ `thumbnailLink` | string | URL to thumbnail |
|
||||||
|
| ↳ `exportLinks` | json | Export format links |
|
||||||
|
| ↳ `size` | string | File size in bytes |
|
||||||
|
| ↳ `quotaBytesUsed` | string | Storage quota used |
|
||||||
|
| ↳ `md5Checksum` | string | MD5 hash |
|
||||||
|
| ↳ `sha1Checksum` | string | SHA-1 hash |
|
||||||
|
| ↳ `sha256Checksum` | string | SHA-256 hash |
|
||||||
|
| ↳ `parents` | json | Parent folder IDs |
|
||||||
|
| ↳ `spaces` | json | Spaces containing file |
|
||||||
|
| ↳ `driveId` | string | Shared drive ID |
|
||||||
|
| ↳ `capabilities` | json | User capabilities on file |
|
||||||
|
| ↳ `version` | string | Version number |
|
||||||
|
| ↳ `headRevisionId` | string | Head revision ID |
|
||||||
|
| ↳ `hasThumbnail` | boolean | Whether has thumbnail |
|
||||||
|
| ↳ `thumbnailVersion` | string | Thumbnail version |
|
||||||
|
| ↳ `imageMediaMetadata` | json | Image-specific metadata |
|
||||||
|
| ↳ `videoMediaMetadata` | json | Video-specific metadata |
|
||||||
|
| ↳ `isAppAuthorized` | boolean | Whether created by requesting app |
|
||||||
|
| ↳ `contentRestrictions` | json | Content restrictions |
|
||||||
|
| ↳ `linkShareMetadata` | json | Link share metadata |
|
||||||
|
|
||||||
### `google_drive_create_folder`
|
### `google_drive_create_folder`
|
||||||
|
|
||||||
@@ -84,6 +136,43 @@ Create a new folder in Google Drive with complete metadata returned
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `file` | object | Complete created folder metadata from Google Drive |
|
| `file` | object | Complete created folder metadata from Google Drive |
|
||||||
|
| ↳ `id` | string | Google Drive folder ID |
|
||||||
|
| ↳ `name` | string | Folder name |
|
||||||
|
| ↳ `mimeType` | string | MIME type \(application/vnd.google-apps.folder\) |
|
||||||
|
| ↳ `kind` | string | Resource type identifier |
|
||||||
|
| ↳ `description` | string | Folder description |
|
||||||
|
| ↳ `owners` | json | List of folder owners |
|
||||||
|
| ↳ `permissions` | json | Folder permissions |
|
||||||
|
| ↳ `permissionIds` | json | Permission IDs |
|
||||||
|
| ↳ `shared` | boolean | Whether folder is shared |
|
||||||
|
| ↳ `ownedByMe` | boolean | Whether owned by current user |
|
||||||
|
| ↳ `writersCanShare` | boolean | Whether writers can share |
|
||||||
|
| ↳ `viewersCanCopyContent` | boolean | Whether viewers can copy |
|
||||||
|
| ↳ `copyRequiresWriterPermission` | boolean | Whether copy requires writer permission |
|
||||||
|
| ↳ `sharingUser` | json | User who shared the folder |
|
||||||
|
| ↳ `starred` | boolean | Whether folder is starred |
|
||||||
|
| ↳ `trashed` | boolean | Whether folder is in trash |
|
||||||
|
| ↳ `explicitlyTrashed` | boolean | Whether explicitly trashed |
|
||||||
|
| ↳ `appProperties` | json | App-specific properties |
|
||||||
|
| ↳ `folderColorRgb` | string | Folder color |
|
||||||
|
| ↳ `createdTime` | string | Folder creation time |
|
||||||
|
| ↳ `modifiedTime` | string | Last modification time |
|
||||||
|
| ↳ `modifiedByMeTime` | string | When modified by current user |
|
||||||
|
| ↳ `viewedByMeTime` | string | When last viewed by current user |
|
||||||
|
| ↳ `sharedWithMeTime` | string | When shared with current user |
|
||||||
|
| ↳ `lastModifyingUser` | json | User who last modified the folder |
|
||||||
|
| ↳ `viewedByMe` | boolean | Whether viewed by current user |
|
||||||
|
| ↳ `modifiedByMe` | boolean | Whether modified by current user |
|
||||||
|
| ↳ `webViewLink` | string | URL to view in browser |
|
||||||
|
| ↳ `iconLink` | string | URL to folder icon |
|
||||||
|
| ↳ `parents` | json | Parent folder IDs |
|
||||||
|
| ↳ `spaces` | json | Spaces containing folder |
|
||||||
|
| ↳ `driveId` | string | Shared drive ID |
|
||||||
|
| ↳ `capabilities` | json | User capabilities on folder |
|
||||||
|
| ↳ `version` | string | Version number |
|
||||||
|
| ↳ `isAppAuthorized` | boolean | Whether created by requesting app |
|
||||||
|
| ↳ `contentRestrictions` | json | Content restrictions |
|
||||||
|
| ↳ `linkShareMetadata` | json | Link share metadata |
|
||||||
|
|
||||||
### `google_drive_download`
|
### `google_drive_download`
|
||||||
|
|
||||||
@@ -103,6 +192,64 @@ Download a file from Google Drive with complete metadata (exports Google Workspa
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `file` | object | Downloaded file data |
|
| `file` | object | Downloaded file data |
|
||||||
|
| ↳ `name` | string | File name |
|
||||||
|
| ↳ `mimeType` | string | MIME type of the file |
|
||||||
|
| ↳ `data` | string | File content as base64-encoded string |
|
||||||
|
| ↳ `size` | number | File size in bytes |
|
||||||
|
| `metadata` | object | Complete file metadata from Google Drive |
|
||||||
|
| ↳ `id` | string | Google Drive file ID |
|
||||||
|
| ↳ `name` | string | File name |
|
||||||
|
| ↳ `mimeType` | string | MIME type |
|
||||||
|
| ↳ `kind` | string | Resource type identifier |
|
||||||
|
| ↳ `description` | string | File description |
|
||||||
|
| ↳ `originalFilename` | string | Original uploaded filename |
|
||||||
|
| ↳ `fullFileExtension` | string | Full file extension |
|
||||||
|
| ↳ `fileExtension` | string | File extension |
|
||||||
|
| ↳ `owners` | json | List of file owners |
|
||||||
|
| ↳ `permissions` | json | File permissions |
|
||||||
|
| ↳ `permissionIds` | json | Permission IDs |
|
||||||
|
| ↳ `shared` | boolean | Whether file is shared |
|
||||||
|
| ↳ `ownedByMe` | boolean | Whether owned by current user |
|
||||||
|
| ↳ `writersCanShare` | boolean | Whether writers can share |
|
||||||
|
| ↳ `viewersCanCopyContent` | boolean | Whether viewers can copy |
|
||||||
|
| ↳ `copyRequiresWriterPermission` | boolean | Whether copy requires writer permission |
|
||||||
|
| ↳ `sharingUser` | json | User who shared the file |
|
||||||
|
| ↳ `starred` | boolean | Whether file is starred |
|
||||||
|
| ↳ `trashed` | boolean | Whether file is in trash |
|
||||||
|
| ↳ `explicitlyTrashed` | boolean | Whether explicitly trashed |
|
||||||
|
| ↳ `appProperties` | json | App-specific properties |
|
||||||
|
| ↳ `createdTime` | string | File creation time |
|
||||||
|
| ↳ `modifiedTime` | string | Last modification time |
|
||||||
|
| ↳ `modifiedByMeTime` | string | When modified by current user |
|
||||||
|
| ↳ `viewedByMeTime` | string | When last viewed by current user |
|
||||||
|
| ↳ `sharedWithMeTime` | string | When shared with current user |
|
||||||
|
| ↳ `lastModifyingUser` | json | User who last modified the file |
|
||||||
|
| ↳ `viewedByMe` | boolean | Whether viewed by current user |
|
||||||
|
| ↳ `modifiedByMe` | boolean | Whether modified by current user |
|
||||||
|
| ↳ `webViewLink` | string | URL to view in browser |
|
||||||
|
| ↳ `webContentLink` | string | Direct download URL |
|
||||||
|
| ↳ `iconLink` | string | URL to file icon |
|
||||||
|
| ↳ `thumbnailLink` | string | URL to thumbnail |
|
||||||
|
| ↳ `exportLinks` | json | Export format links |
|
||||||
|
| ↳ `size` | string | File size in bytes |
|
||||||
|
| ↳ `quotaBytesUsed` | string | Storage quota used |
|
||||||
|
| ↳ `md5Checksum` | string | MD5 hash |
|
||||||
|
| ↳ `sha1Checksum` | string | SHA-1 hash |
|
||||||
|
| ↳ `sha256Checksum` | string | SHA-256 hash |
|
||||||
|
| ↳ `parents` | json | Parent folder IDs |
|
||||||
|
| ↳ `spaces` | json | Spaces containing file |
|
||||||
|
| ↳ `driveId` | string | Shared drive ID |
|
||||||
|
| ↳ `capabilities` | json | User capabilities on file |
|
||||||
|
| ↳ `version` | string | Version number |
|
||||||
|
| ↳ `headRevisionId` | string | Head revision ID |
|
||||||
|
| ↳ `hasThumbnail` | boolean | Whether has thumbnail |
|
||||||
|
| ↳ `thumbnailVersion` | string | Thumbnail version |
|
||||||
|
| ↳ `imageMediaMetadata` | json | Image-specific metadata |
|
||||||
|
| ↳ `videoMediaMetadata` | json | Video-specific metadata |
|
||||||
|
| ↳ `isAppAuthorized` | boolean | Whether created by requesting app |
|
||||||
|
| ↳ `contentRestrictions` | json | Content restrictions |
|
||||||
|
| ↳ `linkShareMetadata` | json | Link share metadata |
|
||||||
|
| ↳ `revisions` | json | File revision history \(first 100 revisions only\) |
|
||||||
|
|
||||||
### `google_drive_list`
|
### `google_drive_list`
|
||||||
|
|
||||||
@@ -123,5 +270,58 @@ List files and folders in Google Drive with complete metadata
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `files` | array | Array of file metadata objects from Google Drive |
|
| `files` | array | Array of file metadata objects from Google Drive |
|
||||||
|
| ↳ `id` | string | Google Drive file ID |
|
||||||
|
| ↳ `name` | string | File name |
|
||||||
|
| ↳ `mimeType` | string | MIME type |
|
||||||
|
| ↳ `kind` | string | Resource type identifier |
|
||||||
|
| ↳ `description` | string | File description |
|
||||||
|
| ↳ `originalFilename` | string | Original uploaded filename |
|
||||||
|
| ↳ `fullFileExtension` | string | Full file extension |
|
||||||
|
| ↳ `fileExtension` | string | File extension |
|
||||||
|
| ↳ `owners` | json | List of file owners |
|
||||||
|
| ↳ `permissions` | json | File permissions |
|
||||||
|
| ↳ `permissionIds` | json | Permission IDs |
|
||||||
|
| ↳ `shared` | boolean | Whether file is shared |
|
||||||
|
| ↳ `ownedByMe` | boolean | Whether owned by current user |
|
||||||
|
| ↳ `writersCanShare` | boolean | Whether writers can share |
|
||||||
|
| ↳ `viewersCanCopyContent` | boolean | Whether viewers can copy |
|
||||||
|
| ↳ `copyRequiresWriterPermission` | boolean | Whether copy requires writer permission |
|
||||||
|
| ↳ `sharingUser` | json | User who shared the file |
|
||||||
|
| ↳ `starred` | boolean | Whether file is starred |
|
||||||
|
| ↳ `trashed` | boolean | Whether file is in trash |
|
||||||
|
| ↳ `explicitlyTrashed` | boolean | Whether explicitly trashed |
|
||||||
|
| ↳ `appProperties` | json | App-specific properties |
|
||||||
|
| ↳ `createdTime` | string | File creation time |
|
||||||
|
| ↳ `modifiedTime` | string | Last modification time |
|
||||||
|
| ↳ `modifiedByMeTime` | string | When modified by current user |
|
||||||
|
| ↳ `viewedByMeTime` | string | When last viewed by current user |
|
||||||
|
| ↳ `sharedWithMeTime` | string | When shared with current user |
|
||||||
|
| ↳ `lastModifyingUser` | json | User who last modified the file |
|
||||||
|
| ↳ `viewedByMe` | boolean | Whether viewed by current user |
|
||||||
|
| ↳ `modifiedByMe` | boolean | Whether modified by current user |
|
||||||
|
| ↳ `webViewLink` | string | URL to view in browser |
|
||||||
|
| ↳ `webContentLink` | string | Direct download URL |
|
||||||
|
| ↳ `iconLink` | string | URL to file icon |
|
||||||
|
| ↳ `thumbnailLink` | string | URL to thumbnail |
|
||||||
|
| ↳ `exportLinks` | json | Export format links |
|
||||||
|
| ↳ `size` | string | File size in bytes |
|
||||||
|
| ↳ `quotaBytesUsed` | string | Storage quota used |
|
||||||
|
| ↳ `md5Checksum` | string | MD5 hash |
|
||||||
|
| ↳ `sha1Checksum` | string | SHA-1 hash |
|
||||||
|
| ↳ `sha256Checksum` | string | SHA-256 hash |
|
||||||
|
| ↳ `parents` | json | Parent folder IDs |
|
||||||
|
| ↳ `spaces` | json | Spaces containing file |
|
||||||
|
| ↳ `driveId` | string | Shared drive ID |
|
||||||
|
| ↳ `capabilities` | json | User capabilities on file |
|
||||||
|
| ↳ `version` | string | Version number |
|
||||||
|
| ↳ `headRevisionId` | string | Head revision ID |
|
||||||
|
| ↳ `hasThumbnail` | boolean | Whether has thumbnail |
|
||||||
|
| ↳ `thumbnailVersion` | string | Thumbnail version |
|
||||||
|
| ↳ `imageMediaMetadata` | json | Image-specific metadata |
|
||||||
|
| ↳ `videoMediaMetadata` | json | Video-specific metadata |
|
||||||
|
| ↳ `isAppAuthorized` | boolean | Whether created by requesting app |
|
||||||
|
| ↳ `contentRestrictions` | json | Content restrictions |
|
||||||
|
| ↳ `linkShareMetadata` | json | Link share metadata |
|
||||||
|
| `nextPageToken` | string | Token for fetching the next page of results |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -63,5 +63,15 @@ Search the web with the Custom Search API
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `items` | array | Array of search results from Google |
|
| `items` | array | Array of search results from Google |
|
||||||
|
| ↳ `title` | string | Title of the search result |
|
||||||
|
| ↳ `link` | string | URL of the search result |
|
||||||
|
| ↳ `snippet` | string | Snippet or description of the search result |
|
||||||
|
| ↳ `displayLink` | string | Display URL |
|
||||||
|
| ↳ `pagemap` | object | Additional page metadata |
|
||||||
|
| `searchInformation` | object | Information about the search query and results |
|
||||||
|
| ↳ `totalResults` | string | Total number of search results available |
|
||||||
|
| ↳ `searchTime` | number | Time taken to perform the search in seconds |
|
||||||
|
| ↳ `formattedSearchTime` | string | Formatted search time for display |
|
||||||
|
| ↳ `formattedTotalResults` | string | Formatted total results count for display |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,8 @@ Read data from a Google Sheets spreadsheet
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `data` | json | Sheet data including range and cell values |
|
| `data` | json | Sheet data including range and cell values |
|
||||||
| `metadata` | json | Spreadsheet metadata including ID and URL |
|
| `metadata` | json | Spreadsheet metadata including ID and URL |
|
||||||
|
| ↳ `spreadsheetId` | string | Google Sheets spreadsheet ID |
|
||||||
|
| ↳ `spreadsheetUrl` | string | Spreadsheet URL |
|
||||||
|
|
||||||
### `google_sheets_write`
|
### `google_sheets_write`
|
||||||
|
|
||||||
@@ -124,6 +126,8 @@ Write data to a Google Sheets spreadsheet
|
|||||||
| `updatedColumns` | number | Number of columns updated |
|
| `updatedColumns` | number | Number of columns updated |
|
||||||
| `updatedCells` | number | Number of cells updated |
|
| `updatedCells` | number | Number of cells updated |
|
||||||
| `metadata` | json | Spreadsheet metadata including ID and URL |
|
| `metadata` | json | Spreadsheet metadata including ID and URL |
|
||||||
|
| ↳ `spreadsheetId` | string | Google Sheets spreadsheet ID |
|
||||||
|
| ↳ `spreadsheetUrl` | string | Spreadsheet URL |
|
||||||
|
|
||||||
### `google_sheets_update`
|
### `google_sheets_update`
|
||||||
|
|
||||||
@@ -148,6 +152,8 @@ Update data in a Google Sheets spreadsheet
|
|||||||
| `updatedColumns` | number | Number of columns updated |
|
| `updatedColumns` | number | Number of columns updated |
|
||||||
| `updatedCells` | number | Number of cells updated |
|
| `updatedCells` | number | Number of cells updated |
|
||||||
| `metadata` | json | Spreadsheet metadata including ID and URL |
|
| `metadata` | json | Spreadsheet metadata including ID and URL |
|
||||||
|
| ↳ `spreadsheetId` | string | Google Sheets spreadsheet ID |
|
||||||
|
| ↳ `spreadsheetUrl` | string | Spreadsheet URL |
|
||||||
|
|
||||||
### `google_sheets_append`
|
### `google_sheets_append`
|
||||||
|
|
||||||
@@ -174,5 +180,7 @@ Append data to the end of a Google Sheets spreadsheet
|
|||||||
| `updatedColumns` | number | Number of columns updated |
|
| `updatedColumns` | number | Number of columns updated |
|
||||||
| `updatedCells` | number | Number of cells updated |
|
| `updatedCells` | number | Number of cells updated |
|
||||||
| `metadata` | json | Spreadsheet metadata including ID and URL |
|
| `metadata` | json | Spreadsheet metadata including ID and URL |
|
||||||
|
| ↳ `spreadsheetId` | string | Google Sheets spreadsheet ID |
|
||||||
|
| ↳ `spreadsheetUrl` | string | Spreadsheet URL |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -80,6 +80,12 @@ Search and list all dashboards
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `dashboards` | array | List of dashboard search results |
|
| `dashboards` | array | List of dashboard search results |
|
||||||
|
| ↳ `id` | number | Dashboard ID |
|
||||||
|
| ↳ `uid` | string | Dashboard UID |
|
||||||
|
| ↳ `title` | string | Dashboard title |
|
||||||
|
| ↳ `url` | string | Dashboard URL path |
|
||||||
|
| ↳ `tags` | array | Dashboard tags |
|
||||||
|
| ↳ `folderTitle` | string | Parent folder title |
|
||||||
|
|
||||||
### `grafana_create_dashboard`
|
### `grafana_create_dashboard`
|
||||||
|
|
||||||
@@ -182,6 +188,13 @@ List all alert rules in the Grafana instance
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `rules` | array | List of alert rules |
|
| `rules` | array | List of alert rules |
|
||||||
|
| ↳ `uid` | string | Alert rule UID |
|
||||||
|
| ↳ `title` | string | Alert rule title |
|
||||||
|
| ↳ `condition` | string | Alert condition |
|
||||||
|
| ↳ `folderUID` | string | Parent folder UID |
|
||||||
|
| ↳ `ruleGroup` | string | Rule group name |
|
||||||
|
| ↳ `noDataState` | string | State when no data is returned |
|
||||||
|
| ↳ `execErrState` | string | State on execution error |
|
||||||
|
|
||||||
### `grafana_get_alert_rule`
|
### `grafana_get_alert_rule`
|
||||||
|
|
||||||
@@ -310,6 +323,10 @@ List all alert notification contact points
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `contactPoints` | array | List of contact points |
|
| `contactPoints` | array | List of contact points |
|
||||||
|
| ↳ `uid` | string | Contact point UID |
|
||||||
|
| ↳ `name` | string | Contact point name |
|
||||||
|
| ↳ `type` | string | Notification type \(email, slack, etc.\) |
|
||||||
|
| ↳ `settings` | object | Type-specific settings |
|
||||||
|
|
||||||
### `grafana_create_annotation`
|
### `grafana_create_annotation`
|
||||||
|
|
||||||
@@ -360,6 +377,19 @@ Query annotations by time range, dashboard, or tags
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `annotations` | array | List of annotations |
|
| `annotations` | array | List of annotations |
|
||||||
|
| ↳ `id` | number | Annotation ID |
|
||||||
|
| ↳ `dashboardId` | number | Dashboard ID |
|
||||||
|
| ↳ `dashboardUID` | string | Dashboard UID |
|
||||||
|
| ↳ `created` | number | Creation timestamp in epoch ms |
|
||||||
|
| ↳ `updated` | number | Last update timestamp in epoch ms |
|
||||||
|
| ↳ `time` | number | Start time in epoch ms |
|
||||||
|
| ↳ `timeEnd` | number | End time in epoch ms |
|
||||||
|
| ↳ `text` | string | Annotation text |
|
||||||
|
| ↳ `tags` | array | Annotation tags |
|
||||||
|
| ↳ `login` | string | Login of the user who created the annotation |
|
||||||
|
| ↳ `email` | string | Email of the user who created the annotation |
|
||||||
|
| ↳ `avatarUrl` | string | Avatar URL of the user |
|
||||||
|
| ↳ `data` | json | Additional annotation data object from Grafana |
|
||||||
|
|
||||||
### `grafana_update_annotation`
|
### `grafana_update_annotation`
|
||||||
|
|
||||||
@@ -421,6 +451,12 @@ List all data sources configured in Grafana
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `dataSources` | array | List of data sources |
|
| `dataSources` | array | List of data sources |
|
||||||
|
| ↳ `id` | number | Data source ID |
|
||||||
|
| ↳ `uid` | string | Data source UID |
|
||||||
|
| ↳ `name` | string | Data source name |
|
||||||
|
| ↳ `type` | string | Data source type \(prometheus, mysql, etc.\) |
|
||||||
|
| ↳ `url` | string | Data source URL |
|
||||||
|
| ↳ `isDefault` | boolean | Whether this is the default data source |
|
||||||
|
|
||||||
### `grafana_get_data_source`
|
### `grafana_get_data_source`
|
||||||
|
|
||||||
@@ -467,6 +503,19 @@ List all folders in Grafana
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `folders` | array | List of folders |
|
| `folders` | array | List of folders |
|
||||||
|
| ↳ `id` | number | Folder ID |
|
||||||
|
| ↳ `uid` | string | Folder UID |
|
||||||
|
| ↳ `title` | string | Folder title |
|
||||||
|
| ↳ `hasAcl` | boolean | Whether the folder has custom ACL permissions |
|
||||||
|
| ↳ `canSave` | boolean | Whether the current user can save the folder |
|
||||||
|
| ↳ `canEdit` | boolean | Whether the current user can edit the folder |
|
||||||
|
| ↳ `canAdmin` | boolean | Whether the current user has admin rights |
|
||||||
|
| ↳ `canDelete` | boolean | Whether the current user can delete the folder |
|
||||||
|
| ↳ `createdBy` | string | Username of who created the folder |
|
||||||
|
| ↳ `created` | string | Timestamp when the folder was created |
|
||||||
|
| ↳ `updatedBy` | string | Username of who last updated the folder |
|
||||||
|
| ↳ `updated` | string | Timestamp when the folder was last updated |
|
||||||
|
| ↳ `version` | number | Version number of the folder |
|
||||||
|
|
||||||
### `grafana_create_folder`
|
### `grafana_create_folder`
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,19 @@ List recordings from Grain with optional filters and pagination
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `recordings` | array | Array of recording objects |
|
| `recordings` | array | Array of recording objects |
|
||||||
|
| ↳ `id` | string | Recording UUID |
|
||||||
|
| ↳ `title` | string | Recording title |
|
||||||
|
| ↳ `start_datetime` | string | ISO8601 start timestamp |
|
||||||
|
| ↳ `end_datetime` | string | ISO8601 end timestamp |
|
||||||
|
| ↳ `duration_ms` | number | Duration in milliseconds |
|
||||||
|
| ↳ `media_type` | string | audio, transcript, or video |
|
||||||
|
| ↳ `source` | string | Recording source |
|
||||||
|
| ↳ `url` | string | URL to view in Grain |
|
||||||
|
| ↳ `thumbnail_url` | string | Thumbnail URL |
|
||||||
|
| ↳ `tags` | array | Array of tags |
|
||||||
|
| ↳ `teams` | array | Teams the recording belongs to |
|
||||||
|
| ↳ `meeting_type` | object | Meeting type info |
|
||||||
|
| `cursor` | string | Cursor for next page \(null if no more\) |
|
||||||
|
|
||||||
### `grain_get_recording`
|
### `grain_get_recording`
|
||||||
|
|
||||||
@@ -119,6 +132,11 @@ Get the full transcript of a recording
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `transcript` | array | Array of transcript sections |
|
| `transcript` | array | Array of transcript sections |
|
||||||
|
| ↳ `participant_id` | string | Participant UUID \(nullable\) |
|
||||||
|
| ↳ `speaker` | string | Speaker name |
|
||||||
|
| ↳ `start` | number | Start timestamp in ms |
|
||||||
|
| ↳ `end` | number | End timestamp in ms |
|
||||||
|
| ↳ `text` | string | Transcript text |
|
||||||
|
|
||||||
### `grain_list_teams`
|
### `grain_list_teams`
|
||||||
|
|
||||||
@@ -135,6 +153,8 @@ List all teams in the workspace
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `teams` | array | Array of team objects |
|
| `teams` | array | Array of team objects |
|
||||||
|
| ↳ `id` | string | Team UUID |
|
||||||
|
| ↳ `name` | string | Team name |
|
||||||
|
|
||||||
### `grain_list_meeting_types`
|
### `grain_list_meeting_types`
|
||||||
|
|
||||||
@@ -151,6 +171,9 @@ List all meeting types in the workspace
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `meeting_types` | array | Array of meeting type objects |
|
| `meeting_types` | array | Array of meeting type objects |
|
||||||
|
| ↳ `id` | string | Meeting type UUID |
|
||||||
|
| ↳ `name` | string | Meeting type name |
|
||||||
|
| ↳ `scope` | string | internal or external |
|
||||||
|
|
||||||
### `grain_create_hook`
|
### `grain_create_hook`
|
||||||
|
|
||||||
@@ -199,6 +222,13 @@ List all webhooks for the account
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `hooks` | array | Array of hook objects |
|
| `hooks` | array | Array of hook objects |
|
||||||
|
| ↳ `id` | string | Hook UUID |
|
||||||
|
| ↳ `enabled` | boolean | Whether hook is active |
|
||||||
|
| ↳ `hook_url` | string | Webhook URL |
|
||||||
|
| ↳ `hook_type` | string | Type: recording_added or upload_status |
|
||||||
|
| ↳ `filter` | object | Applied filters |
|
||||||
|
| ↳ `include` | object | Included fields |
|
||||||
|
| ↳ `inserted_at` | string | Creation timestamp |
|
||||||
|
|
||||||
### `grain_delete_hook`
|
### `grain_delete_hook`
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,14 @@ Query repositories in natural language and get answers with relevant code refere
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | AI-generated answer to the query |
|
| `message` | string | AI-generated answer to the query |
|
||||||
| `sources` | array | Relevant code references that support the answer |
|
| `sources` | array | Relevant code references that support the answer |
|
||||||
|
| ↳ `repository` | string | Repository name \(owner/repo\) |
|
||||||
|
| ↳ `remote` | string | Git remote \(github/gitlab\) |
|
||||||
|
| ↳ `branch` | string | Branch name |
|
||||||
|
| ↳ `filepath` | string | Path to the file |
|
||||||
|
| ↳ `linestart` | number | Starting line number |
|
||||||
|
| ↳ `lineend` | number | Ending line number |
|
||||||
|
| ↳ `summary` | string | Summary of the code section |
|
||||||
|
| ↳ `distance` | number | Similarity score \(lower = more relevant\) |
|
||||||
|
|
||||||
### `greptile_search`
|
### `greptile_search`
|
||||||
|
|
||||||
@@ -80,6 +88,14 @@ Search repositories in natural language and get relevant code references without
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `sources` | array | Relevant code references matching the search query |
|
| `sources` | array | Relevant code references matching the search query |
|
||||||
|
| ↳ `repository` | string | Repository name \(owner/repo\) |
|
||||||
|
| ↳ `remote` | string | Git remote \(github/gitlab\) |
|
||||||
|
| ↳ `branch` | string | Branch name |
|
||||||
|
| ↳ `filepath` | string | Path to the file |
|
||||||
|
| ↳ `linestart` | number | Starting line number |
|
||||||
|
| ↳ `lineend` | number | Ending line number |
|
||||||
|
| ↳ `summary` | string | Summary of the code section |
|
||||||
|
| ↳ `distance` | number | Similarity score \(lower = more relevant\) |
|
||||||
|
|
||||||
### `greptile_index_repo`
|
### `greptile_index_repo`
|
||||||
|
|
||||||
|
|||||||
@@ -54,5 +54,14 @@ Generate completions using Hugging Face Inference API
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Chat completion results |
|
| `output` | object | Chat completion results |
|
||||||
|
| ↳ `content` | string | Generated text content |
|
||||||
|
| ↳ `model` | string | Model used for generation |
|
||||||
|
| ↳ `usage` | object | Token usage information |
|
||||||
|
| ↳ `prompt_tokens` | number | Number of tokens in the prompt |
|
||||||
|
| ↳ `completion_tokens` | number | Number of tokens in the completion |
|
||||||
|
| ↳ `total_tokens` | number | Total number of tokens used |
|
||||||
|
| ↳ `prompt_tokens` | number | Number of tokens in the prompt |
|
||||||
|
| ↳ `completion_tokens` | number | Number of tokens in the completion |
|
||||||
|
| ↳ `total_tokens` | number | Total number of tokens used |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -58,5 +58,10 @@ Generate images using OpenAI
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Generated image data |
|
| `output` | object | Generated image data |
|
||||||
|
| ↳ `content` | string | Image URL or identifier |
|
||||||
|
| ↳ `image` | string | Base64 encoded image data |
|
||||||
|
| ↳ `metadata` | object | Image generation metadata |
|
||||||
|
| ↳ `model` | string | Model used for image generation |
|
||||||
|
| ↳ `model` | string | Model used for image generation |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,35 @@ List incidents from incident.io. Returns a list of incidents with their details
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `incidents` | array | List of incidents |
|
| `incidents` | array | List of incidents |
|
||||||
|
| ↳ `id` | string | Type ID |
|
||||||
|
| ↳ `name` | string | Type name |
|
||||||
|
| ↳ `summary` | string | Brief summary of the incident |
|
||||||
|
| ↳ `description` | string | Detailed description of the incident |
|
||||||
|
| ↳ `mode` | string | Incident mode \(e.g., standard, retrospective\) |
|
||||||
|
| ↳ `call_url` | string | URL for the incident call/bridge |
|
||||||
|
| ↳ `severity` | object | Severity of the incident |
|
||||||
|
| ↳ `id` | string | Severity ID |
|
||||||
|
| ↳ `name` | string | Severity name |
|
||||||
|
| ↳ `rank` | number | Severity rank |
|
||||||
|
| ↳ `rank` | number | Severity rank |
|
||||||
|
| ↳ `status` | object | Current status of the incident |
|
||||||
|
| ↳ `id` | string | Status ID |
|
||||||
|
| ↳ `name` | string | Status name |
|
||||||
|
| ↳ `category` | string | Status category |
|
||||||
|
| ↳ `category` | string | Status category |
|
||||||
|
| ↳ `incident_type` | object | Type of the incident |
|
||||||
|
| ↳ `id` | string | Type ID |
|
||||||
|
| ↳ `name` | string | Type name |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
| ↳ `incident_url` | string | URL to the incident |
|
||||||
|
| ↳ `slack_channel_id` | string | Associated Slack channel ID |
|
||||||
|
| ↳ `slack_channel_name` | string | Associated Slack channel name |
|
||||||
|
| ↳ `visibility` | string | Incident visibility |
|
||||||
|
| `pagination_meta` | object | Pagination metadata |
|
||||||
|
| ↳ `after` | string | Cursor for the next page |
|
||||||
|
| ↳ `page_size` | number | Number of items per page |
|
||||||
|
| ↳ `total_record_count` | number | Total number of records available |
|
||||||
|
|
||||||
### `incidentio_incidents_create`
|
### `incidentio_incidents_create`
|
||||||
|
|
||||||
@@ -80,6 +109,31 @@ Create a new incident in incident.io. Requires idempotency_key, severity_id, and
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `incident` | object | The created incident object |
|
| `incident` | object | The created incident object |
|
||||||
|
| ↳ `id` | string | Type ID |
|
||||||
|
| ↳ `name` | string | Type name |
|
||||||
|
| ↳ `summary` | string | Brief summary of the incident |
|
||||||
|
| ↳ `description` | string | Detailed description of the incident |
|
||||||
|
| ↳ `mode` | string | Incident mode \(e.g., standard, retrospective\) |
|
||||||
|
| ↳ `call_url` | string | URL for the incident call/bridge |
|
||||||
|
| ↳ `severity` | object | Severity of the incident |
|
||||||
|
| ↳ `id` | string | Severity ID |
|
||||||
|
| ↳ `name` | string | Severity name |
|
||||||
|
| ↳ `rank` | number | Severity rank |
|
||||||
|
| ↳ `rank` | number | Severity rank |
|
||||||
|
| ↳ `status` | object | Current status of the incident |
|
||||||
|
| ↳ `id` | string | Status ID |
|
||||||
|
| ↳ `name` | string | Status name |
|
||||||
|
| ↳ `category` | string | Status category |
|
||||||
|
| ↳ `category` | string | Status category |
|
||||||
|
| ↳ `incident_type` | object | Type of the incident |
|
||||||
|
| ↳ `id` | string | Type ID |
|
||||||
|
| ↳ `name` | string | Type name |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
| ↳ `incident_url` | string | URL to the incident |
|
||||||
|
| ↳ `slack_channel_id` | string | Associated Slack channel ID |
|
||||||
|
| ↳ `slack_channel_name` | string | Associated Slack channel name |
|
||||||
|
| ↳ `visibility` | string | Incident visibility |
|
||||||
|
|
||||||
### `incidentio_incidents_show`
|
### `incidentio_incidents_show`
|
||||||
|
|
||||||
@@ -97,6 +151,34 @@ Retrieve detailed information about a specific incident from incident.io by its
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `incident` | object | Detailed incident information |
|
| `incident` | object | Detailed incident information |
|
||||||
|
| ↳ `id` | string | Type ID |
|
||||||
|
| ↳ `name` | string | Type name |
|
||||||
|
| ↳ `summary` | string | Brief summary of the incident |
|
||||||
|
| ↳ `description` | string | Detailed description of the incident |
|
||||||
|
| ↳ `mode` | string | Incident mode \(e.g., standard, retrospective\) |
|
||||||
|
| ↳ `call_url` | string | URL for the incident call/bridge |
|
||||||
|
| ↳ `permalink` | string | Permanent link to the incident |
|
||||||
|
| ↳ `severity` | object | Severity of the incident |
|
||||||
|
| ↳ `id` | string | Severity ID |
|
||||||
|
| ↳ `name` | string | Severity name |
|
||||||
|
| ↳ `rank` | number | Severity rank |
|
||||||
|
| ↳ `rank` | number | Severity rank |
|
||||||
|
| ↳ `status` | object | Current status of the incident |
|
||||||
|
| ↳ `id` | string | Status ID |
|
||||||
|
| ↳ `name` | string | Status name |
|
||||||
|
| ↳ `category` | string | Status category |
|
||||||
|
| ↳ `category` | string | Status category |
|
||||||
|
| ↳ `incident_type` | object | Type of the incident |
|
||||||
|
| ↳ `id` | string | Type ID |
|
||||||
|
| ↳ `name` | string | Type name |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
| ↳ `incident_url` | string | URL to the incident |
|
||||||
|
| ↳ `slack_channel_id` | string | Associated Slack channel ID |
|
||||||
|
| ↳ `slack_channel_name` | string | Associated Slack channel name |
|
||||||
|
| ↳ `visibility` | string | Incident visibility |
|
||||||
|
| ↳ `custom_field_entries` | array | Custom field values for the incident |
|
||||||
|
| ↳ `incident_role_assignments` | array | Role assignments for the incident |
|
||||||
|
|
||||||
### `incidentio_incidents_update`
|
### `incidentio_incidents_update`
|
||||||
|
|
||||||
@@ -120,6 +202,31 @@ Update an existing incident in incident.io. Can update name, summary, severity,
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `incident` | object | The updated incident object |
|
| `incident` | object | The updated incident object |
|
||||||
|
| ↳ `id` | string | Type ID |
|
||||||
|
| ↳ `name` | string | Type name |
|
||||||
|
| ↳ `summary` | string | Brief summary of the incident |
|
||||||
|
| ↳ `description` | string | Detailed description of the incident |
|
||||||
|
| ↳ `mode` | string | Incident mode \(e.g., standard, retrospective\) |
|
||||||
|
| ↳ `call_url` | string | URL for the incident call/bridge |
|
||||||
|
| ↳ `severity` | object | Severity of the incident |
|
||||||
|
| ↳ `id` | string | Severity ID |
|
||||||
|
| ↳ `name` | string | Severity name |
|
||||||
|
| ↳ `rank` | number | Severity rank |
|
||||||
|
| ↳ `rank` | number | Severity rank |
|
||||||
|
| ↳ `status` | object | Current status of the incident |
|
||||||
|
| ↳ `id` | string | Status ID |
|
||||||
|
| ↳ `name` | string | Status name |
|
||||||
|
| ↳ `category` | string | Status category |
|
||||||
|
| ↳ `category` | string | Status category |
|
||||||
|
| ↳ `incident_type` | object | Type of the incident |
|
||||||
|
| ↳ `id` | string | Type ID |
|
||||||
|
| ↳ `name` | string | Type name |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
| ↳ `incident_url` | string | URL to the incident |
|
||||||
|
| ↳ `slack_channel_id` | string | Associated Slack channel ID |
|
||||||
|
| ↳ `slack_channel_name` | string | Associated Slack channel name |
|
||||||
|
| ↳ `visibility` | string | Incident visibility |
|
||||||
|
|
||||||
### `incidentio_actions_list`
|
### `incidentio_actions_list`
|
||||||
|
|
||||||
@@ -138,6 +245,31 @@ List actions from incident.io. Optionally filter by incident ID.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `actions` | array | List of actions |
|
| `actions` | array | List of actions |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `description` | string | Action description |
|
||||||
|
| ↳ `assignee` | object | Assigned user |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `status` | string | Action status |
|
||||||
|
| ↳ `due_at` | string | Due date/time |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
| ↳ `incident_id` | string | Associated incident ID |
|
||||||
|
| ↳ `creator` | object | User who created the action |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `completed_at` | string | Completion timestamp |
|
||||||
|
| ↳ `external_issue_reference` | object | External issue tracking reference |
|
||||||
|
| ↳ `provider` | string | Issue tracking provider \(e.g., Jira, Linear\) |
|
||||||
|
| ↳ `issue_name` | string | Issue identifier |
|
||||||
|
| ↳ `issue_permalink` | string | URL to the external issue |
|
||||||
|
| ↳ `provider` | string | Issue tracking provider \(e.g., Jira, Linear\) |
|
||||||
|
| ↳ `issue_name` | string | Issue identifier |
|
||||||
|
| ↳ `issue_permalink` | string | URL to the external issue |
|
||||||
|
|
||||||
### `incidentio_actions_show`
|
### `incidentio_actions_show`
|
||||||
|
|
||||||
@@ -155,6 +287,31 @@ Get detailed information about a specific action from incident.io.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `action` | object | Action details |
|
| `action` | object | Action details |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `description` | string | Action description |
|
||||||
|
| ↳ `assignee` | object | Assigned user |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `status` | string | Action status |
|
||||||
|
| ↳ `due_at` | string | Due date/time |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
| ↳ `incident_id` | string | Associated incident ID |
|
||||||
|
| ↳ `creator` | object | User who created the action |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `completed_at` | string | Completion timestamp |
|
||||||
|
| ↳ `external_issue_reference` | object | External issue tracking reference |
|
||||||
|
| ↳ `provider` | string | Issue tracking provider \(e.g., Jira, Linear\) |
|
||||||
|
| ↳ `issue_name` | string | Issue identifier |
|
||||||
|
| ↳ `issue_permalink` | string | URL to the external issue |
|
||||||
|
| ↳ `provider` | string | Issue tracking provider \(e.g., Jira, Linear\) |
|
||||||
|
| ↳ `issue_name` | string | Issue identifier |
|
||||||
|
| ↳ `issue_permalink` | string | URL to the external issue |
|
||||||
|
|
||||||
### `incidentio_follow_ups_list`
|
### `incidentio_follow_ups_list`
|
||||||
|
|
||||||
@@ -173,6 +330,38 @@ List follow-ups from incident.io. Optionally filter by incident ID.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `follow_ups` | array | List of follow-ups |
|
| `follow_ups` | array | List of follow-ups |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `title` | string | Follow-up title |
|
||||||
|
| ↳ `description` | string | Priority description |
|
||||||
|
| ↳ `assignee` | object | Assigned user |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `status` | string | Follow-up status |
|
||||||
|
| ↳ `priority` | object | Follow-up priority |
|
||||||
|
| ↳ `id` | string | Priority ID |
|
||||||
|
| ↳ `name` | string | Priority name |
|
||||||
|
| ↳ `description` | string | Priority description |
|
||||||
|
| ↳ `rank` | number | Priority rank |
|
||||||
|
| ↳ `rank` | number | Priority rank |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
| ↳ `incident_id` | string | Associated incident ID |
|
||||||
|
| ↳ `creator` | object | User who created the follow-up |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `completed_at` | string | Completion timestamp |
|
||||||
|
| ↳ `labels` | array | Labels associated with the follow-up |
|
||||||
|
| ↳ `external_issue_reference` | object | External issue tracking reference |
|
||||||
|
| ↳ `provider` | string | External provider name |
|
||||||
|
| ↳ `issue_name` | string | External issue name or ID |
|
||||||
|
| ↳ `issue_permalink` | string | Permalink to external issue |
|
||||||
|
| ↳ `provider` | string | External provider name |
|
||||||
|
| ↳ `issue_name` | string | External issue name or ID |
|
||||||
|
| ↳ `issue_permalink` | string | Permalink to external issue |
|
||||||
|
|
||||||
### `incidentio_follow_ups_show`
|
### `incidentio_follow_ups_show`
|
||||||
|
|
||||||
@@ -190,6 +379,38 @@ Get detailed information about a specific follow-up from incident.io.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `follow_up` | object | Follow-up details |
|
| `follow_up` | object | Follow-up details |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `title` | string | Follow-up title |
|
||||||
|
| ↳ `description` | string | Priority description |
|
||||||
|
| ↳ `assignee` | object | Assigned user |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `status` | string | Follow-up status |
|
||||||
|
| ↳ `priority` | object | Follow-up priority |
|
||||||
|
| ↳ `id` | string | Priority ID |
|
||||||
|
| ↳ `name` | string | Priority name |
|
||||||
|
| ↳ `description` | string | Priority description |
|
||||||
|
| ↳ `rank` | number | Priority rank |
|
||||||
|
| ↳ `rank` | number | Priority rank |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
| ↳ `incident_id` | string | Associated incident ID |
|
||||||
|
| ↳ `creator` | object | User who created the follow-up |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `completed_at` | string | Completion timestamp |
|
||||||
|
| ↳ `labels` | array | Labels associated with the follow-up |
|
||||||
|
| ↳ `external_issue_reference` | object | External issue tracking reference |
|
||||||
|
| ↳ `provider` | string | External provider name |
|
||||||
|
| ↳ `issue_name` | string | External issue name or ID |
|
||||||
|
| ↳ `issue_permalink` | string | Permalink to external issue |
|
||||||
|
| ↳ `provider` | string | External provider name |
|
||||||
|
| ↳ `issue_name` | string | External issue name or ID |
|
||||||
|
| ↳ `issue_permalink` | string | Permalink to external issue |
|
||||||
|
|
||||||
### `incidentio_users_list`
|
### `incidentio_users_list`
|
||||||
|
|
||||||
@@ -207,6 +428,10 @@ List all users in your Incident.io workspace. Returns user details including id,
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `users` | array | List of users in the workspace |
|
| `users` | array | List of users in the workspace |
|
||||||
|
| ↳ `id` | string | Unique identifier for the user |
|
||||||
|
| ↳ `name` | string | Full name of the user |
|
||||||
|
| ↳ `email` | string | Email address of the user |
|
||||||
|
| ↳ `role` | string | Role of the user in the workspace |
|
||||||
|
|
||||||
### `incidentio_users_show`
|
### `incidentio_users_show`
|
||||||
|
|
||||||
@@ -224,6 +449,10 @@ Get detailed information about a specific user in your Incident.io workspace by
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `user` | object | Details of the requested user |
|
| `user` | object | Details of the requested user |
|
||||||
|
| ↳ `id` | string | Unique identifier for the user |
|
||||||
|
| ↳ `name` | string | Full name of the user |
|
||||||
|
| ↳ `email` | string | Email address of the user |
|
||||||
|
| ↳ `role` | string | Role of the user in the workspace |
|
||||||
|
|
||||||
### `incidentio_workflows_list`
|
### `incidentio_workflows_list`
|
||||||
|
|
||||||
@@ -242,6 +471,15 @@ List all workflows in your incident.io workspace.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `workflows` | array | List of workflows |
|
| `workflows` | array | List of workflows |
|
||||||
|
| ↳ `id` | string | Unique identifier for the workflow |
|
||||||
|
| ↳ `name` | string | Name of the workflow |
|
||||||
|
| ↳ `state` | string | State of the workflow \(active, draft, or disabled\) |
|
||||||
|
| ↳ `folder` | string | Folder the workflow belongs to |
|
||||||
|
| ↳ `created_at` | string | When the workflow was created |
|
||||||
|
| ↳ `updated_at` | string | When the workflow was last updated |
|
||||||
|
| `pagination_meta` | object | Pagination metadata |
|
||||||
|
| ↳ `after` | string | Cursor for next page |
|
||||||
|
| ↳ `page_size` | number | Number of results per page |
|
||||||
|
|
||||||
### `incidentio_workflows_show`
|
### `incidentio_workflows_show`
|
||||||
|
|
||||||
@@ -259,6 +497,12 @@ Get details of a specific workflow in incident.io.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `workflow` | object | The workflow details |
|
| `workflow` | object | The workflow details |
|
||||||
|
| ↳ `id` | string | Unique identifier for the workflow |
|
||||||
|
| ↳ `name` | string | Name of the workflow |
|
||||||
|
| ↳ `state` | string | State of the workflow \(active, draft, or disabled\) |
|
||||||
|
| ↳ `folder` | string | Folder the workflow belongs to |
|
||||||
|
| ↳ `created_at` | string | When the workflow was created |
|
||||||
|
| ↳ `updated_at` | string | When the workflow was last updated |
|
||||||
|
|
||||||
### `incidentio_workflows_update`
|
### `incidentio_workflows_update`
|
||||||
|
|
||||||
@@ -279,6 +523,12 @@ Update an existing workflow in incident.io.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `workflow` | object | The updated workflow |
|
| `workflow` | object | The updated workflow |
|
||||||
|
| ↳ `id` | string | Unique identifier for the workflow |
|
||||||
|
| ↳ `name` | string | Name of the workflow |
|
||||||
|
| ↳ `state` | string | State of the workflow \(active, draft, or disabled\) |
|
||||||
|
| ↳ `folder` | string | Folder the workflow belongs to |
|
||||||
|
| ↳ `created_at` | string | When the workflow was created |
|
||||||
|
| ↳ `updated_at` | string | When the workflow was last updated |
|
||||||
|
|
||||||
### `incidentio_workflows_delete`
|
### `incidentio_workflows_delete`
|
||||||
|
|
||||||
@@ -314,6 +564,14 @@ List all schedules in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `schedules` | array | List of schedules |
|
| `schedules` | array | List of schedules |
|
||||||
|
| ↳ `id` | string | The schedule ID |
|
||||||
|
| ↳ `name` | string | The schedule name |
|
||||||
|
| ↳ `timezone` | string | The schedule timezone |
|
||||||
|
| ↳ `created_at` | string | When the schedule was created |
|
||||||
|
| ↳ `updated_at` | string | When the schedule was last updated |
|
||||||
|
| `pagination_meta` | object | Pagination metadata |
|
||||||
|
| ↳ `after` | string | Cursor for next page |
|
||||||
|
| ↳ `page_size` | number | Number of results per page |
|
||||||
|
|
||||||
### `incidentio_schedules_create`
|
### `incidentio_schedules_create`
|
||||||
|
|
||||||
@@ -334,6 +592,11 @@ Create a new schedule in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `schedule` | object | The created schedule |
|
| `schedule` | object | The created schedule |
|
||||||
|
| ↳ `id` | string | The schedule ID |
|
||||||
|
| ↳ `name` | string | The schedule name |
|
||||||
|
| ↳ `timezone` | string | The schedule timezone |
|
||||||
|
| ↳ `created_at` | string | When the schedule was created |
|
||||||
|
| ↳ `updated_at` | string | When the schedule was last updated |
|
||||||
|
|
||||||
### `incidentio_schedules_show`
|
### `incidentio_schedules_show`
|
||||||
|
|
||||||
@@ -351,6 +614,11 @@ Get details of a specific schedule in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `schedule` | object | The schedule details |
|
| `schedule` | object | The schedule details |
|
||||||
|
| ↳ `id` | string | The schedule ID |
|
||||||
|
| ↳ `name` | string | The schedule name |
|
||||||
|
| ↳ `timezone` | string | The schedule timezone |
|
||||||
|
| ↳ `created_at` | string | When the schedule was created |
|
||||||
|
| ↳ `updated_at` | string | When the schedule was last updated |
|
||||||
|
|
||||||
### `incidentio_schedules_update`
|
### `incidentio_schedules_update`
|
||||||
|
|
||||||
@@ -372,6 +640,11 @@ Update an existing schedule in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `schedule` | object | The updated schedule |
|
| `schedule` | object | The updated schedule |
|
||||||
|
| ↳ `id` | string | The schedule ID |
|
||||||
|
| ↳ `name` | string | The schedule name |
|
||||||
|
| ↳ `timezone` | string | The schedule timezone |
|
||||||
|
| ↳ `created_at` | string | When the schedule was created |
|
||||||
|
| ↳ `updated_at` | string | When the schedule was last updated |
|
||||||
|
|
||||||
### `incidentio_schedules_delete`
|
### `incidentio_schedules_delete`
|
||||||
|
|
||||||
@@ -406,6 +679,10 @@ List all escalation policies in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `escalations` | array | List of escalation policies |
|
| `escalations` | array | List of escalation policies |
|
||||||
|
| ↳ `id` | string | The escalation policy ID |
|
||||||
|
| ↳ `name` | string | The escalation policy name |
|
||||||
|
| ↳ `created_at` | string | When the escalation policy was created |
|
||||||
|
| ↳ `updated_at` | string | When the escalation policy was last updated |
|
||||||
|
|
||||||
### `incidentio_escalations_create`
|
### `incidentio_escalations_create`
|
||||||
|
|
||||||
@@ -426,6 +703,10 @@ Create a new escalation policy in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `escalation` | object | The created escalation policy |
|
| `escalation` | object | The created escalation policy |
|
||||||
|
| ↳ `id` | string | The escalation policy ID |
|
||||||
|
| ↳ `name` | string | The escalation policy name |
|
||||||
|
| ↳ `created_at` | string | When the escalation policy was created |
|
||||||
|
| ↳ `updated_at` | string | When the escalation policy was last updated |
|
||||||
|
|
||||||
### `incidentio_escalations_show`
|
### `incidentio_escalations_show`
|
||||||
|
|
||||||
@@ -443,6 +724,10 @@ Get details of a specific escalation policy in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `escalation` | object | The escalation policy details |
|
| `escalation` | object | The escalation policy details |
|
||||||
|
| ↳ `id` | string | The escalation policy ID |
|
||||||
|
| ↳ `name` | string | The escalation policy name |
|
||||||
|
| ↳ `created_at` | string | When the escalation policy was created |
|
||||||
|
| ↳ `updated_at` | string | When the escalation policy was last updated |
|
||||||
|
|
||||||
### `incidentio_custom_fields_list`
|
### `incidentio_custom_fields_list`
|
||||||
|
|
||||||
@@ -459,6 +744,12 @@ List all custom fields from incident.io.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `custom_fields` | array | List of custom fields |
|
| `custom_fields` | array | List of custom fields |
|
||||||
|
| ↳ `id` | string | Custom field ID |
|
||||||
|
| ↳ `name` | string | Custom field name |
|
||||||
|
| ↳ `description` | string | Custom field description |
|
||||||
|
| ↳ `field_type` | string | Custom field type |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
|
||||||
### `incidentio_custom_fields_create`
|
### `incidentio_custom_fields_create`
|
||||||
|
|
||||||
@@ -478,6 +769,12 @@ Create a new custom field in incident.io.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `custom_field` | object | Created custom field |
|
| `custom_field` | object | Created custom field |
|
||||||
|
| ↳ `id` | string | Custom field ID |
|
||||||
|
| ↳ `name` | string | Custom field name |
|
||||||
|
| ↳ `description` | string | Custom field description |
|
||||||
|
| ↳ `field_type` | string | Custom field type |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
|
||||||
### `incidentio_custom_fields_show`
|
### `incidentio_custom_fields_show`
|
||||||
|
|
||||||
@@ -495,6 +792,12 @@ Get detailed information about a specific custom field from incident.io.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `custom_field` | object | Custom field details |
|
| `custom_field` | object | Custom field details |
|
||||||
|
| ↳ `id` | string | Custom field ID |
|
||||||
|
| ↳ `name` | string | Custom field name |
|
||||||
|
| ↳ `description` | string | Custom field description |
|
||||||
|
| ↳ `field_type` | string | Custom field type |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
|
||||||
### `incidentio_custom_fields_update`
|
### `incidentio_custom_fields_update`
|
||||||
|
|
||||||
@@ -514,6 +817,12 @@ Update an existing custom field in incident.io.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `custom_field` | object | Updated custom field |
|
| `custom_field` | object | Updated custom field |
|
||||||
|
| ↳ `id` | string | Custom field ID |
|
||||||
|
| ↳ `name` | string | Custom field name |
|
||||||
|
| ↳ `description` | string | Custom field description |
|
||||||
|
| ↳ `field_type` | string | Custom field type |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
|
||||||
### `incidentio_custom_fields_delete`
|
### `incidentio_custom_fields_delete`
|
||||||
|
|
||||||
@@ -547,6 +856,10 @@ List all severity levels configured in your Incident.io workspace. Returns sever
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `severities` | array | List of severity levels |
|
| `severities` | array | List of severity levels |
|
||||||
|
| ↳ `id` | string | Unique identifier for the severity level |
|
||||||
|
| ↳ `name` | string | Name of the severity level |
|
||||||
|
| ↳ `description` | string | Description of the severity level |
|
||||||
|
| ↳ `rank` | number | Rank/order of the severity level |
|
||||||
|
|
||||||
### `incidentio_incident_statuses_list`
|
### `incidentio_incident_statuses_list`
|
||||||
|
|
||||||
@@ -563,6 +876,10 @@ List all incident statuses configured in your Incident.io workspace. Returns sta
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `incident_statuses` | array | List of incident statuses |
|
| `incident_statuses` | array | List of incident statuses |
|
||||||
|
| ↳ `id` | string | Unique identifier for the incident status |
|
||||||
|
| ↳ `name` | string | Name of the incident status |
|
||||||
|
| ↳ `description` | string | Description of the incident status |
|
||||||
|
| ↳ `category` | string | Category of the incident status |
|
||||||
|
|
||||||
### `incidentio_incident_types_list`
|
### `incidentio_incident_types_list`
|
||||||
|
|
||||||
@@ -579,6 +896,10 @@ List all incident types configured in your Incident.io workspace. Returns type d
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `incident_types` | array | List of incident types |
|
| `incident_types` | array | List of incident types |
|
||||||
|
| ↳ `id` | string | Unique identifier for the incident type |
|
||||||
|
| ↳ `name` | string | Name of the incident type |
|
||||||
|
| ↳ `description` | string | Description of the incident type |
|
||||||
|
| ↳ `is_default` | boolean | Whether this is the default incident type |
|
||||||
|
|
||||||
### `incidentio_incident_roles_list`
|
### `incidentio_incident_roles_list`
|
||||||
|
|
||||||
@@ -595,6 +916,15 @@ List all incident roles in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `incident_roles` | array | List of incident roles |
|
| `incident_roles` | array | List of incident roles |
|
||||||
|
| ↳ `id` | string | The incident role ID |
|
||||||
|
| ↳ `name` | string | The incident role name |
|
||||||
|
| ↳ `description` | string | The incident role description |
|
||||||
|
| ↳ `instructions` | string | Instructions for the role |
|
||||||
|
| ↳ `shortform` | string | Short form abbreviation of the role |
|
||||||
|
| ↳ `role_type` | string | The type of role |
|
||||||
|
| ↳ `required` | boolean | Whether the role is required |
|
||||||
|
| ↳ `created_at` | string | When the role was created |
|
||||||
|
| ↳ `updated_at` | string | When the role was last updated |
|
||||||
|
|
||||||
### `incidentio_incident_roles_create`
|
### `incidentio_incident_roles_create`
|
||||||
|
|
||||||
@@ -615,6 +945,15 @@ Create a new incident role in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `incident_role` | object | The created incident role |
|
| `incident_role` | object | The created incident role |
|
||||||
|
| ↳ `id` | string | The incident role ID |
|
||||||
|
| ↳ `name` | string | The incident role name |
|
||||||
|
| ↳ `description` | string | The incident role description |
|
||||||
|
| ↳ `instructions` | string | Instructions for the role |
|
||||||
|
| ↳ `shortform` | string | Short form abbreviation of the role |
|
||||||
|
| ↳ `role_type` | string | The type of role |
|
||||||
|
| ↳ `required` | boolean | Whether the role is required |
|
||||||
|
| ↳ `created_at` | string | When the role was created |
|
||||||
|
| ↳ `updated_at` | string | When the role was last updated |
|
||||||
|
|
||||||
### `incidentio_incident_roles_show`
|
### `incidentio_incident_roles_show`
|
||||||
|
|
||||||
@@ -632,6 +971,15 @@ Get details of a specific incident role in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `incident_role` | object | The incident role details |
|
| `incident_role` | object | The incident role details |
|
||||||
|
| ↳ `id` | string | The incident role ID |
|
||||||
|
| ↳ `name` | string | The incident role name |
|
||||||
|
| ↳ `description` | string | The incident role description |
|
||||||
|
| ↳ `instructions` | string | Instructions for the role |
|
||||||
|
| ↳ `shortform` | string | Short form abbreviation of the role |
|
||||||
|
| ↳ `role_type` | string | The type of role |
|
||||||
|
| ↳ `required` | boolean | Whether the role is required |
|
||||||
|
| ↳ `created_at` | string | When the role was created |
|
||||||
|
| ↳ `updated_at` | string | When the role was last updated |
|
||||||
|
|
||||||
### `incidentio_incident_roles_update`
|
### `incidentio_incident_roles_update`
|
||||||
|
|
||||||
@@ -653,6 +1001,15 @@ Update an existing incident role in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `incident_role` | object | The updated incident role |
|
| `incident_role` | object | The updated incident role |
|
||||||
|
| ↳ `id` | string | The incident role ID |
|
||||||
|
| ↳ `name` | string | The incident role name |
|
||||||
|
| ↳ `description` | string | The incident role description |
|
||||||
|
| ↳ `instructions` | string | Instructions for the role |
|
||||||
|
| ↳ `shortform` | string | Short form abbreviation of the role |
|
||||||
|
| ↳ `role_type` | string | The type of role |
|
||||||
|
| ↳ `required` | boolean | Whether the role is required |
|
||||||
|
| ↳ `created_at` | string | When the role was created |
|
||||||
|
| ↳ `updated_at` | string | When the role was last updated |
|
||||||
|
|
||||||
### `incidentio_incident_roles_delete`
|
### `incidentio_incident_roles_delete`
|
||||||
|
|
||||||
@@ -686,6 +1043,11 @@ List all incident timestamp definitions in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `incident_timestamps` | array | List of incident timestamp definitions |
|
| `incident_timestamps` | array | List of incident timestamp definitions |
|
||||||
|
| ↳ `id` | string | The timestamp ID |
|
||||||
|
| ↳ `name` | string | The timestamp name |
|
||||||
|
| ↳ `rank` | number | The rank/order of the timestamp |
|
||||||
|
| ↳ `created_at` | string | When the timestamp was created |
|
||||||
|
| ↳ `updated_at` | string | When the timestamp was last updated |
|
||||||
|
|
||||||
### `incidentio_incident_timestamps_show`
|
### `incidentio_incident_timestamps_show`
|
||||||
|
|
||||||
@@ -703,6 +1065,11 @@ Get details of a specific incident timestamp definition in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `incident_timestamp` | object | The incident timestamp details |
|
| `incident_timestamp` | object | The incident timestamp details |
|
||||||
|
| ↳ `id` | string | The timestamp ID |
|
||||||
|
| ↳ `name` | string | The timestamp name |
|
||||||
|
| ↳ `rank` | number | The rank/order of the timestamp |
|
||||||
|
| ↳ `created_at` | string | When the timestamp was created |
|
||||||
|
| ↳ `updated_at` | string | When the timestamp was last updated |
|
||||||
|
|
||||||
### `incidentio_incident_updates_list`
|
### `incidentio_incident_updates_list`
|
||||||
|
|
||||||
@@ -722,6 +1089,30 @@ List all updates for a specific incident in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `incident_updates` | array | List of incident updates |
|
| `incident_updates` | array | List of incident updates |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `incident_id` | string | The incident ID |
|
||||||
|
| ↳ `message` | string | The update message |
|
||||||
|
| ↳ `new_severity` | object | New severity if changed |
|
||||||
|
| ↳ `id` | string | Severity ID |
|
||||||
|
| ↳ `name` | string | Severity name |
|
||||||
|
| ↳ `rank` | number | Severity rank |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `rank` | number | Severity rank |
|
||||||
|
| ↳ `new_status` | object | New status if changed |
|
||||||
|
| ↳ `id` | string | Status ID |
|
||||||
|
| ↳ `name` | string | Status name |
|
||||||
|
| ↳ `category` | string | Status category |
|
||||||
|
| ↳ `category` | string | Status category |
|
||||||
|
| ↳ `updater` | object | User who created the update |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `created_at` | string | When the update was created |
|
||||||
|
| ↳ `updated_at` | string | When the update was last modified |
|
||||||
|
| `pagination_meta` | object | Pagination information |
|
||||||
|
| ↳ `after` | string | Cursor for next page |
|
||||||
|
| ↳ `page_size` | number | Number of results per page |
|
||||||
|
|
||||||
### `incidentio_schedule_entries_list`
|
### `incidentio_schedule_entries_list`
|
||||||
|
|
||||||
@@ -743,6 +1134,23 @@ List all entries for a specific schedule in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `schedule_entries` | array | List of schedule entries |
|
| `schedule_entries` | array | List of schedule entries |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `schedule_id` | string | The schedule ID |
|
||||||
|
| ↳ `user` | object | User assigned to this entry |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `start_at` | string | When the entry starts |
|
||||||
|
| ↳ `end_at` | string | When the entry ends |
|
||||||
|
| ↳ `layer_id` | string | The schedule layer ID |
|
||||||
|
| ↳ `created_at` | string | When the entry was created |
|
||||||
|
| ↳ `updated_at` | string | When the entry was last updated |
|
||||||
|
| `pagination_meta` | object | Pagination information |
|
||||||
|
| ↳ `after` | string | Cursor for next page |
|
||||||
|
| ↳ `after_url` | string | URL for next page |
|
||||||
|
| ↳ `page_size` | number | Number of results per page |
|
||||||
|
|
||||||
### `incidentio_schedule_overrides_create`
|
### `incidentio_schedule_overrides_create`
|
||||||
|
|
||||||
@@ -766,6 +1174,19 @@ Create a new schedule override in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `override` | object | The created schedule override |
|
| `override` | object | The created schedule override |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `rotation_id` | string | The rotation ID |
|
||||||
|
| ↳ `schedule_id` | string | The schedule ID |
|
||||||
|
| ↳ `user` | object | User assigned to this override |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `start_at` | string | When the override starts |
|
||||||
|
| ↳ `end_at` | string | When the override ends |
|
||||||
|
| ↳ `created_at` | string | When the override was created |
|
||||||
|
| ↳ `updated_at` | string | When the override was last updated |
|
||||||
|
|
||||||
### `incidentio_escalation_paths_create`
|
### `incidentio_escalation_paths_create`
|
||||||
|
|
||||||
@@ -785,6 +1206,41 @@ Create a new escalation path in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `escalation_path` | object | The created escalation path |
|
| `escalation_path` | object | The created escalation path |
|
||||||
|
| ↳ `id` | string | Target ID |
|
||||||
|
| ↳ `name` | string | The escalation path name |
|
||||||
|
| ↳ `path` | array | Array of escalation levels |
|
||||||
|
| ↳ `targets` | array | Targets for this level |
|
||||||
|
| ↳ `id` | string | Target ID |
|
||||||
|
| ↳ `type` | string | Target type |
|
||||||
|
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
|
||||||
|
| ↳ `user_id` | string | User ID if type is user |
|
||||||
|
| ↳ `urgency` | string | Urgency level |
|
||||||
|
| ↳ `id` | string | Target ID |
|
||||||
|
| ↳ `type` | string | Target type |
|
||||||
|
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
|
||||||
|
| ↳ `user_id` | string | User ID if type is user |
|
||||||
|
| ↳ `urgency` | string | Urgency level |
|
||||||
|
| ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds |
|
||||||
|
| ↳ `targets` | array | Targets for this level |
|
||||||
|
| ↳ `id` | string | Target ID |
|
||||||
|
| ↳ `type` | string | Target type |
|
||||||
|
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
|
||||||
|
| ↳ `user_id` | string | User ID if type is user |
|
||||||
|
| ↳ `urgency` | string | Urgency level |
|
||||||
|
| ↳ `type` | string | Target type |
|
||||||
|
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
|
||||||
|
| ↳ `user_id` | string | User ID if type is user |
|
||||||
|
| ↳ `urgency` | string | Urgency level |
|
||||||
|
| ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds |
|
||||||
|
| ↳ `working_hours` | array | Working hours configuration |
|
||||||
|
| ↳ `weekday` | string | Day of week |
|
||||||
|
| ↳ `start_time` | string | Start time |
|
||||||
|
| ↳ `end_time` | string | End time |
|
||||||
|
| ↳ `weekday` | string | Day of week |
|
||||||
|
| ↳ `start_time` | string | Start time |
|
||||||
|
| ↳ `end_time` | string | End time |
|
||||||
|
| ↳ `created_at` | string | When the path was created |
|
||||||
|
| ↳ `updated_at` | string | When the path was last updated |
|
||||||
|
|
||||||
### `incidentio_escalation_paths_show`
|
### `incidentio_escalation_paths_show`
|
||||||
|
|
||||||
@@ -802,6 +1258,41 @@ Get details of a specific escalation path in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `escalation_path` | object | The escalation path details |
|
| `escalation_path` | object | The escalation path details |
|
||||||
|
| ↳ `id` | string | Target ID |
|
||||||
|
| ↳ `name` | string | The escalation path name |
|
||||||
|
| ↳ `path` | array | Array of escalation levels |
|
||||||
|
| ↳ `targets` | array | Targets for this level |
|
||||||
|
| ↳ `id` | string | Target ID |
|
||||||
|
| ↳ `type` | string | Target type |
|
||||||
|
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
|
||||||
|
| ↳ `user_id` | string | User ID if type is user |
|
||||||
|
| ↳ `urgency` | string | Urgency level |
|
||||||
|
| ↳ `id` | string | Target ID |
|
||||||
|
| ↳ `type` | string | Target type |
|
||||||
|
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
|
||||||
|
| ↳ `user_id` | string | User ID if type is user |
|
||||||
|
| ↳ `urgency` | string | Urgency level |
|
||||||
|
| ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds |
|
||||||
|
| ↳ `targets` | array | Targets for this level |
|
||||||
|
| ↳ `id` | string | Target ID |
|
||||||
|
| ↳ `type` | string | Target type |
|
||||||
|
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
|
||||||
|
| ↳ `user_id` | string | User ID if type is user |
|
||||||
|
| ↳ `urgency` | string | Urgency level |
|
||||||
|
| ↳ `type` | string | Target type |
|
||||||
|
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
|
||||||
|
| ↳ `user_id` | string | User ID if type is user |
|
||||||
|
| ↳ `urgency` | string | Urgency level |
|
||||||
|
| ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds |
|
||||||
|
| ↳ `working_hours` | array | Working hours configuration |
|
||||||
|
| ↳ `weekday` | string | Day of week |
|
||||||
|
| ↳ `start_time` | string | Start time |
|
||||||
|
| ↳ `end_time` | string | End time |
|
||||||
|
| ↳ `weekday` | string | Day of week |
|
||||||
|
| ↳ `start_time` | string | Start time |
|
||||||
|
| ↳ `end_time` | string | End time |
|
||||||
|
| ↳ `created_at` | string | When the path was created |
|
||||||
|
| ↳ `updated_at` | string | When the path was last updated |
|
||||||
|
|
||||||
### `incidentio_escalation_paths_update`
|
### `incidentio_escalation_paths_update`
|
||||||
|
|
||||||
@@ -822,6 +1313,41 @@ Update an existing escalation path in incident.io
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `escalation_path` | object | The updated escalation path |
|
| `escalation_path` | object | The updated escalation path |
|
||||||
|
| ↳ `id` | string | Target ID |
|
||||||
|
| ↳ `name` | string | The escalation path name |
|
||||||
|
| ↳ `path` | array | Array of escalation levels |
|
||||||
|
| ↳ `targets` | array | Targets for this level |
|
||||||
|
| ↳ `id` | string | Target ID |
|
||||||
|
| ↳ `type` | string | Target type |
|
||||||
|
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
|
||||||
|
| ↳ `user_id` | string | User ID if type is user |
|
||||||
|
| ↳ `urgency` | string | Urgency level |
|
||||||
|
| ↳ `id` | string | Target ID |
|
||||||
|
| ↳ `type` | string | Target type |
|
||||||
|
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
|
||||||
|
| ↳ `user_id` | string | User ID if type is user |
|
||||||
|
| ↳ `urgency` | string | Urgency level |
|
||||||
|
| ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds |
|
||||||
|
| ↳ `targets` | array | Targets for this level |
|
||||||
|
| ↳ `id` | string | Target ID |
|
||||||
|
| ↳ `type` | string | Target type |
|
||||||
|
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
|
||||||
|
| ↳ `user_id` | string | User ID if type is user |
|
||||||
|
| ↳ `urgency` | string | Urgency level |
|
||||||
|
| ↳ `type` | string | Target type |
|
||||||
|
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
|
||||||
|
| ↳ `user_id` | string | User ID if type is user |
|
||||||
|
| ↳ `urgency` | string | Urgency level |
|
||||||
|
| ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds |
|
||||||
|
| ↳ `working_hours` | array | Working hours configuration |
|
||||||
|
| ↳ `weekday` | string | Day of week |
|
||||||
|
| ↳ `start_time` | string | Start time |
|
||||||
|
| ↳ `end_time` | string | End time |
|
||||||
|
| ↳ `weekday` | string | Day of week |
|
||||||
|
| ↳ `start_time` | string | Start time |
|
||||||
|
| ↳ `end_time` | string | End time |
|
||||||
|
| ↳ `created_at` | string | When the path was created |
|
||||||
|
| ↳ `updated_at` | string | When the path was last updated |
|
||||||
|
|
||||||
### `incidentio_escalation_paths_delete`
|
### `incidentio_escalation_paths_delete`
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,60 @@ Create a new contact in Intercom with email, external_id, or role. Returns API-a
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `contact` | object | Created contact object |
|
| `contact` | object | Created contact object |
|
||||||
|
| ↳ `id` | string | Unique identifier for the contact |
|
||||||
|
| ↳ `type` | string | List type |
|
||||||
|
| ↳ `role` | string | Role of the contact \(user or lead\) |
|
||||||
|
| ↳ `email` | string | Email address of the contact |
|
||||||
|
| ↳ `phone` | string | Phone number of the contact |
|
||||||
|
| ↳ `name` | string | Name of the contact |
|
||||||
|
| ↳ `avatar` | string | Avatar URL of the contact |
|
||||||
|
| ↳ `owner_id` | string | ID of the admin assigned to this contact |
|
||||||
|
| ↳ `external_id` | string | External identifier for the contact |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when contact was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when contact was last updated |
|
||||||
|
| ↳ `signed_up_at` | number | Unix timestamp when user signed up |
|
||||||
|
| ↳ `last_seen_at` | number | Unix timestamp when user was last seen |
|
||||||
|
| ↳ `workspace_id` | string | Workspace ID the contact belongs to |
|
||||||
|
| ↳ `custom_attributes` | object | Custom attributes set on the contact |
|
||||||
|
| ↳ `tags` | object | Tags associated with the contact |
|
||||||
|
| ↳ `type` | string | List type |
|
||||||
|
| ↳ `url` | string | URL to fetch tags |
|
||||||
|
| ↳ `data` | array | Array of tag objects |
|
||||||
|
| ↳ `has_more` | boolean | Whether there are more tags |
|
||||||
|
| ↳ `total_count` | number | Total number of tags |
|
||||||
|
| ↳ `url` | string | URL to fetch companies |
|
||||||
|
| ↳ `data` | array | Array of social profile objects |
|
||||||
|
| ↳ `has_more` | boolean | Whether there are more companies |
|
||||||
|
| ↳ `total_count` | number | Total number of companies |
|
||||||
|
| ↳ `notes` | object | Notes associated with the contact |
|
||||||
|
| ↳ `type` | string | List type |
|
||||||
|
| ↳ `url` | string | URL to fetch notes |
|
||||||
|
| ↳ `data` | array | Array of note objects |
|
||||||
|
| ↳ `has_more` | boolean | Whether there are more notes |
|
||||||
|
| ↳ `total_count` | number | Total number of notes |
|
||||||
|
| ↳ `companies` | object | Companies associated with the contact |
|
||||||
|
| ↳ `type` | string | List type |
|
||||||
|
| ↳ `url` | string | URL to fetch companies |
|
||||||
|
| ↳ `data` | array | Array of company objects |
|
||||||
|
| ↳ `has_more` | boolean | Whether there are more companies |
|
||||||
|
| ↳ `total_count` | number | Total number of companies |
|
||||||
|
| ↳ `location` | object | Location information for the contact |
|
||||||
|
| ↳ `type` | string | Location type |
|
||||||
|
| ↳ `city` | string | City |
|
||||||
|
| ↳ `region` | string | Region/State |
|
||||||
|
| ↳ `country` | string | Country |
|
||||||
|
| ↳ `country_code` | string | Country code |
|
||||||
|
| ↳ `continent_code` | string | Continent code |
|
||||||
|
| ↳ `city` | string | City |
|
||||||
|
| ↳ `region` | string | Region/State |
|
||||||
|
| ↳ `country` | string | Country |
|
||||||
|
| ↳ `country_code` | string | Country code |
|
||||||
|
| ↳ `continent_code` | string | Continent code |
|
||||||
|
| ↳ `social_profiles` | object | Social profiles of the contact |
|
||||||
|
| ↳ `type` | string | List type |
|
||||||
|
| ↳ `data` | array | Array of social profile objects |
|
||||||
|
| ↳ `unsubscribed_from_emails` | boolean | Whether contact is unsubscribed from emails |
|
||||||
|
| `contactId` | string | ID of the created contact |
|
||||||
|
|
||||||
### `intercom_get_contact`
|
### `intercom_get_contact`
|
||||||
|
|
||||||
@@ -56,6 +110,25 @@ Get a single contact by ID from Intercom. Returns API-aligned fields only.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `contact` | object | Contact object |
|
| `contact` | object | Contact object |
|
||||||
|
| ↳ `id` | string | Unique identifier for the contact |
|
||||||
|
| ↳ `type` | string | Object type \(contact\) |
|
||||||
|
| ↳ `role` | string | Role of the contact \(user or lead\) |
|
||||||
|
| ↳ `email` | string | Email address of the contact |
|
||||||
|
| ↳ `phone` | string | Phone number of the contact |
|
||||||
|
| ↳ `name` | string | Name of the contact |
|
||||||
|
| ↳ `avatar` | string | Avatar URL of the contact |
|
||||||
|
| ↳ `owner_id` | string | ID of the admin assigned to this contact |
|
||||||
|
| ↳ `external_id` | string | External identifier for the contact |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when contact was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when contact was last updated |
|
||||||
|
| ↳ `workspace_id` | string | Workspace ID the contact belongs to |
|
||||||
|
| ↳ `custom_attributes` | object | Custom attributes set on the contact |
|
||||||
|
| ↳ `tags` | object | Tags associated with the contact |
|
||||||
|
| ↳ `notes` | object | Notes associated with the contact |
|
||||||
|
| ↳ `companies` | object | Companies associated with the contact |
|
||||||
|
| ↳ `location` | object | Location information for the contact |
|
||||||
|
| ↳ `social_profiles` | object | Social profiles of the contact |
|
||||||
|
| ↳ `unsubscribed_from_emails` | boolean | Whether contact is unsubscribed from emails |
|
||||||
|
|
||||||
### `intercom_update_contact`
|
### `intercom_update_contact`
|
||||||
|
|
||||||
@@ -84,6 +157,26 @@ Update an existing contact in Intercom. Returns API-aligned fields only.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `contact` | object | Updated contact object |
|
| `contact` | object | Updated contact object |
|
||||||
|
| ↳ `id` | string | Unique identifier for the contact |
|
||||||
|
| ↳ `type` | string | Object type \(contact\) |
|
||||||
|
| ↳ `role` | string | Role of the contact \(user or lead\) |
|
||||||
|
| ↳ `email` | string | Email address of the contact |
|
||||||
|
| ↳ `phone` | string | Phone number of the contact |
|
||||||
|
| ↳ `name` | string | Name of the contact |
|
||||||
|
| ↳ `avatar` | string | Avatar URL of the contact |
|
||||||
|
| ↳ `owner_id` | string | ID of the admin assigned to this contact |
|
||||||
|
| ↳ `external_id` | string | External identifier for the contact |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when contact was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when contact was last updated |
|
||||||
|
| ↳ `workspace_id` | string | Workspace ID the contact belongs to |
|
||||||
|
| ↳ `custom_attributes` | object | Custom attributes set on the contact |
|
||||||
|
| ↳ `tags` | object | Tags associated with the contact |
|
||||||
|
| ↳ `notes` | object | Notes associated with the contact |
|
||||||
|
| ↳ `companies` | object | Companies associated with the contact |
|
||||||
|
| ↳ `location` | object | Location information for the contact |
|
||||||
|
| ↳ `social_profiles` | object | Social profiles of the contact |
|
||||||
|
| ↳ `unsubscribed_from_emails` | boolean | Whether contact is unsubscribed from emails |
|
||||||
|
| `contactId` | string | ID of the updated contact |
|
||||||
|
|
||||||
### `intercom_list_contacts`
|
### `intercom_list_contacts`
|
||||||
|
|
||||||
@@ -101,6 +194,25 @@ List all contacts from Intercom with pagination support
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `contacts` | array | Array of contact objects |
|
| `contacts` | array | Array of contact objects |
|
||||||
|
| ↳ `id` | string | Unique identifier for the contact |
|
||||||
|
| ↳ `type` | string | Object type \(contact\) |
|
||||||
|
| ↳ `role` | string | Role of the contact \(user or lead\) |
|
||||||
|
| ↳ `email` | string | Email address of the contact |
|
||||||
|
| ↳ `phone` | string | Phone number of the contact |
|
||||||
|
| ↳ `name` | string | Name of the contact |
|
||||||
|
| ↳ `external_id` | string | External identifier for the contact |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when contact was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when contact was last updated |
|
||||||
|
| ↳ `workspace_id` | string | Workspace ID the contact belongs to |
|
||||||
|
| ↳ `custom_attributes` | object | Custom attributes set on the contact |
|
||||||
|
| ↳ `tags` | object | Tags associated with the contact |
|
||||||
|
| ↳ `companies` | object | Companies associated with the contact |
|
||||||
|
| `pages` | object | Pagination information |
|
||||||
|
| ↳ `type` | string | Pages type identifier |
|
||||||
|
| ↳ `page` | number | Current page number |
|
||||||
|
| ↳ `per_page` | number | Number of results per page |
|
||||||
|
| ↳ `total_pages` | number | Total number of pages |
|
||||||
|
| `total_count` | number | Total number of contacts |
|
||||||
|
|
||||||
### `intercom_search_contacts`
|
### `intercom_search_contacts`
|
||||||
|
|
||||||
@@ -121,6 +233,33 @@ Search for contacts in Intercom using a query
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `contacts` | array | Array of matching contact objects |
|
| `contacts` | array | Array of matching contact objects |
|
||||||
|
| ↳ `id` | string | Unique identifier for the contact |
|
||||||
|
| ↳ `type` | string | Object type \(contact\) |
|
||||||
|
| ↳ `role` | string | Role of the contact \(user or lead\) |
|
||||||
|
| ↳ `email` | string | Email address of the contact |
|
||||||
|
| ↳ `phone` | string | Phone number of the contact |
|
||||||
|
| ↳ `name` | string | Name of the contact |
|
||||||
|
| ↳ `avatar` | string | Avatar URL of the contact |
|
||||||
|
| ↳ `owner_id` | string | ID of the admin assigned to this contact |
|
||||||
|
| ↳ `external_id` | string | External identifier for the contact |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when contact was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when contact was last updated |
|
||||||
|
| ↳ `signed_up_at` | number | Unix timestamp when user signed up |
|
||||||
|
| ↳ `last_seen_at` | number | Unix timestamp when user was last seen |
|
||||||
|
| ↳ `workspace_id` | string | Workspace ID the contact belongs to |
|
||||||
|
| ↳ `custom_attributes` | object | Custom attributes set on the contact |
|
||||||
|
| ↳ `tags` | object | Tags associated with the contact |
|
||||||
|
| ↳ `notes` | object | Notes associated with the contact |
|
||||||
|
| ↳ `companies` | object | Companies associated with the contact |
|
||||||
|
| ↳ `location` | object | Location information for the contact |
|
||||||
|
| ↳ `social_profiles` | object | Social profiles of the contact |
|
||||||
|
| ↳ `unsubscribed_from_emails` | boolean | Whether contact is unsubscribed from emails |
|
||||||
|
| `pages` | object | Pagination information |
|
||||||
|
| ↳ `type` | string | Pages type identifier |
|
||||||
|
| ↳ `page` | number | Current page number |
|
||||||
|
| ↳ `per_page` | number | Number of results per page |
|
||||||
|
| ↳ `total_pages` | number | Total number of pages |
|
||||||
|
| `total_count` | number | Total number of matching contacts |
|
||||||
|
|
||||||
### `intercom_delete_contact`
|
### `intercom_delete_contact`
|
||||||
|
|
||||||
@@ -162,6 +301,25 @@ Create or update a company in Intercom
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `company` | object | Created or updated company object |
|
| `company` | object | Created or updated company object |
|
||||||
|
| ↳ `id` | string | Unique identifier for the company |
|
||||||
|
| ↳ `type` | string | Segment list type |
|
||||||
|
| ↳ `app_id` | string | Intercom app ID |
|
||||||
|
| ↳ `company_id` | string | Your unique identifier for the company |
|
||||||
|
| ↳ `name` | string | Name of the company |
|
||||||
|
| ↳ `website` | string | Company website URL |
|
||||||
|
| ↳ `plan` | object | Company plan information |
|
||||||
|
| ↳ `size` | number | Number of employees |
|
||||||
|
| ↳ `industry` | string | Industry the company operates in |
|
||||||
|
| ↳ `monthly_spend` | number | Monthly revenue from this company |
|
||||||
|
| ↳ `session_count` | number | Number of sessions |
|
||||||
|
| ↳ `user_count` | number | Number of users in the company |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when company was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when company was last updated |
|
||||||
|
| ↳ `remote_created_at` | number | Unix timestamp when company was created by you |
|
||||||
|
| ↳ `custom_attributes` | object | Custom attributes set on the company |
|
||||||
|
| ↳ `tags` | array | Array of tag objects |
|
||||||
|
| ↳ `segments` | array | Array of segment objects |
|
||||||
|
| `companyId` | string | ID of the created/updated company |
|
||||||
|
|
||||||
### `intercom_get_company`
|
### `intercom_get_company`
|
||||||
|
|
||||||
@@ -178,6 +336,23 @@ Retrieve a single company by ID from Intercom
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `company` | object | Company object |
|
| `company` | object | Company object |
|
||||||
|
| ↳ `id` | string | Unique identifier for the company |
|
||||||
|
| ↳ `type` | string | Object type \(company\) |
|
||||||
|
| ↳ `app_id` | string | Intercom app ID |
|
||||||
|
| ↳ `company_id` | string | Your unique identifier for the company |
|
||||||
|
| ↳ `name` | string | Name of the company |
|
||||||
|
| ↳ `website` | string | Company website URL |
|
||||||
|
| ↳ `plan` | object | Company plan information |
|
||||||
|
| ↳ `size` | number | Number of employees |
|
||||||
|
| ↳ `industry` | string | Industry the company operates in |
|
||||||
|
| ↳ `monthly_spend` | number | Monthly revenue from this company |
|
||||||
|
| ↳ `session_count` | number | Number of sessions |
|
||||||
|
| ↳ `user_count` | number | Number of users in the company |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when company was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when company was last updated |
|
||||||
|
| ↳ `custom_attributes` | object | Custom attributes set on the company |
|
||||||
|
| ↳ `tags` | object | Tags associated with the company |
|
||||||
|
| ↳ `segments` | object | Segments the company belongs to |
|
||||||
|
|
||||||
### `intercom_list_companies`
|
### `intercom_list_companies`
|
||||||
|
|
||||||
@@ -196,6 +371,28 @@ List all companies from Intercom with pagination support. Note: This endpoint ha
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `companies` | array | Array of company objects |
|
| `companies` | array | Array of company objects |
|
||||||
|
| ↳ `id` | string | Unique identifier for the company |
|
||||||
|
| ↳ `type` | string | Object type \(company\) |
|
||||||
|
| ↳ `app_id` | string | Intercom app ID |
|
||||||
|
| ↳ `company_id` | string | Your unique identifier for the company |
|
||||||
|
| ↳ `name` | string | Name of the company |
|
||||||
|
| ↳ `website` | string | Company website URL |
|
||||||
|
| ↳ `plan` | object | Company plan information |
|
||||||
|
| ↳ `monthly_spend` | number | Monthly revenue from this company |
|
||||||
|
| ↳ `session_count` | number | Number of sessions |
|
||||||
|
| ↳ `user_count` | number | Number of users in the company |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when company was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when company was last updated |
|
||||||
|
| ↳ `custom_attributes` | object | Custom attributes set on the company |
|
||||||
|
| ↳ `tags` | object | Tags associated with the company |
|
||||||
|
| ↳ `segments` | object | Segments the company belongs to |
|
||||||
|
| `pages` | object | Pagination information |
|
||||||
|
| ↳ `type` | string | Pages type identifier |
|
||||||
|
| ↳ `page` | number | Current page number |
|
||||||
|
| ↳ `per_page` | number | Number of results per page |
|
||||||
|
| ↳ `total_pages` | number | Total number of pages |
|
||||||
|
| `total_count` | number | Total number of companies |
|
||||||
|
| `success` | boolean | Operation success status |
|
||||||
|
|
||||||
### `intercom_get_conversation`
|
### `intercom_get_conversation`
|
||||||
|
|
||||||
@@ -214,6 +411,26 @@ Retrieve a single conversation by ID from Intercom
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `conversation` | object | Conversation object |
|
| `conversation` | object | Conversation object |
|
||||||
|
| ↳ `id` | string | Unique identifier for the conversation |
|
||||||
|
| ↳ `type` | string | Object type \(conversation\) |
|
||||||
|
| ↳ `title` | string | Title of the conversation |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when conversation was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when conversation was last updated |
|
||||||
|
| ↳ `waiting_since` | number | Unix timestamp when waiting for reply |
|
||||||
|
| ↳ `snoozed_until` | number | Unix timestamp when snooze ends |
|
||||||
|
| ↳ `open` | boolean | Whether the conversation is open |
|
||||||
|
| ↳ `state` | string | State of the conversation |
|
||||||
|
| ↳ `read` | boolean | Whether the conversation has been read |
|
||||||
|
| ↳ `priority` | string | Priority of the conversation |
|
||||||
|
| ↳ `admin_assignee_id` | number | ID of assigned admin |
|
||||||
|
| ↳ `team_assignee_id` | string | ID of assigned team |
|
||||||
|
| ↳ `tags` | object | Tags on the conversation |
|
||||||
|
| ↳ `source` | object | Source of the conversation |
|
||||||
|
| ↳ `contacts` | object | Contacts in the conversation |
|
||||||
|
| ↳ `teammates` | object | Teammates in the conversation |
|
||||||
|
| ↳ `conversation_parts` | object | Parts of the conversation |
|
||||||
|
| ↳ `statistics` | object | Conversation statistics |
|
||||||
|
| `success` | boolean | Operation success status |
|
||||||
|
|
||||||
### `intercom_list_conversations`
|
### `intercom_list_conversations`
|
||||||
|
|
||||||
@@ -233,6 +450,28 @@ List all conversations from Intercom with pagination support
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `conversations` | array | Array of conversation objects |
|
| `conversations` | array | Array of conversation objects |
|
||||||
|
| ↳ `id` | string | Unique identifier for the conversation |
|
||||||
|
| ↳ `type` | string | Object type \(conversation\) |
|
||||||
|
| ↳ `title` | string | Title of the conversation |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when conversation was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when conversation was last updated |
|
||||||
|
| ↳ `waiting_since` | number | Unix timestamp when waiting for reply |
|
||||||
|
| ↳ `open` | boolean | Whether the conversation is open |
|
||||||
|
| ↳ `state` | string | State of the conversation |
|
||||||
|
| ↳ `read` | boolean | Whether the conversation has been read |
|
||||||
|
| ↳ `priority` | string | Priority of the conversation |
|
||||||
|
| ↳ `admin_assignee_id` | number | ID of assigned admin |
|
||||||
|
| ↳ `team_assignee_id` | string | ID of assigned team |
|
||||||
|
| ↳ `tags` | object | Tags on the conversation |
|
||||||
|
| ↳ `source` | object | Source of the conversation |
|
||||||
|
| ↳ `contacts` | object | Contacts in the conversation |
|
||||||
|
| `pages` | object | Pagination information |
|
||||||
|
| ↳ `type` | string | Pages type identifier |
|
||||||
|
| ↳ `page` | number | Current page number |
|
||||||
|
| ↳ `per_page` | number | Number of results per page |
|
||||||
|
| ↳ `total_pages` | number | Total number of pages |
|
||||||
|
| `total_count` | number | Total number of conversations |
|
||||||
|
| `success` | boolean | Operation success status |
|
||||||
|
|
||||||
### `intercom_reply_conversation`
|
### `intercom_reply_conversation`
|
||||||
|
|
||||||
@@ -254,6 +493,24 @@ Reply to a conversation as an admin in Intercom
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `conversation` | object | Updated conversation object |
|
| `conversation` | object | Updated conversation object |
|
||||||
|
| ↳ `id` | string | Unique identifier for the conversation |
|
||||||
|
| ↳ `type` | string | Object type \(conversation\) |
|
||||||
|
| ↳ `title` | string | Title of the conversation |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when conversation was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when conversation was last updated |
|
||||||
|
| ↳ `waiting_since` | number | Unix timestamp when waiting for reply |
|
||||||
|
| ↳ `open` | boolean | Whether the conversation is open |
|
||||||
|
| ↳ `state` | string | State of the conversation |
|
||||||
|
| ↳ `read` | boolean | Whether the conversation has been read |
|
||||||
|
| ↳ `priority` | string | Priority of the conversation |
|
||||||
|
| ↳ `admin_assignee_id` | number | ID of assigned admin |
|
||||||
|
| ↳ `team_assignee_id` | string | ID of assigned team |
|
||||||
|
| ↳ `tags` | object | Tags on the conversation |
|
||||||
|
| ↳ `source` | object | Source of the conversation |
|
||||||
|
| ↳ `contacts` | object | Contacts in the conversation |
|
||||||
|
| ↳ `conversation_parts` | object | Parts of the conversation |
|
||||||
|
| `conversationId` | string | ID of the conversation |
|
||||||
|
| `success` | boolean | Operation success status |
|
||||||
|
|
||||||
### `intercom_search_conversations`
|
### `intercom_search_conversations`
|
||||||
|
|
||||||
@@ -274,6 +531,28 @@ Search for conversations in Intercom using a query. Returns API-aligned fields o
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `conversations` | array | Array of matching conversation objects |
|
| `conversations` | array | Array of matching conversation objects |
|
||||||
|
| ↳ `id` | string | Unique identifier for the conversation |
|
||||||
|
| ↳ `type` | string | Object type \(conversation\) |
|
||||||
|
| ↳ `title` | string | Title of the conversation |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when conversation was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when conversation was last updated |
|
||||||
|
| ↳ `waiting_since` | number | Unix timestamp when waiting for reply |
|
||||||
|
| ↳ `open` | boolean | Whether the conversation is open |
|
||||||
|
| ↳ `state` | string | State of the conversation |
|
||||||
|
| ↳ `read` | boolean | Whether the conversation has been read |
|
||||||
|
| ↳ `priority` | string | Priority of the conversation |
|
||||||
|
| ↳ `admin_assignee_id` | number | ID of assigned admin |
|
||||||
|
| ↳ `team_assignee_id` | string | ID of assigned team |
|
||||||
|
| ↳ `tags` | object | Tags on the conversation |
|
||||||
|
| ↳ `source` | object | Source of the conversation |
|
||||||
|
| ↳ `contacts` | object | Contacts in the conversation |
|
||||||
|
| `pages` | object | Pagination information |
|
||||||
|
| ↳ `type` | string | Pages type identifier |
|
||||||
|
| ↳ `page` | number | Current page number |
|
||||||
|
| ↳ `per_page` | number | Number of results per page |
|
||||||
|
| ↳ `total_pages` | number | Total number of pages |
|
||||||
|
| `total_count` | number | Total number of matching conversations |
|
||||||
|
| `success` | boolean | Operation success status |
|
||||||
|
|
||||||
### `intercom_create_ticket`
|
### `intercom_create_ticket`
|
||||||
|
|
||||||
@@ -296,6 +575,23 @@ Create a new ticket in Intercom. Returns API-aligned fields only.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `ticket` | object | Created ticket object |
|
| `ticket` | object | Created ticket object |
|
||||||
|
| ↳ `id` | string | Unique identifier for the ticket |
|
||||||
|
| ↳ `type` | string | Object type \(ticket\) |
|
||||||
|
| ↳ `ticket_id` | string | Ticket ID |
|
||||||
|
| ↳ `ticket_type` | object | Type of the ticket |
|
||||||
|
| ↳ `ticket_attributes` | object | Attributes of the ticket |
|
||||||
|
| ↳ `ticket_state` | string | State of the ticket |
|
||||||
|
| ↳ `ticket_state_internal_label` | string | Internal label for ticket state |
|
||||||
|
| ↳ `ticket_state_external_label` | string | External label for ticket state |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when ticket was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when ticket was last updated |
|
||||||
|
| ↳ `contacts` | object | Contacts associated with the ticket |
|
||||||
|
| ↳ `admin_assignee_id` | string | ID of assigned admin |
|
||||||
|
| ↳ `team_assignee_id` | string | ID of assigned team |
|
||||||
|
| ↳ `is_shared` | boolean | Whether the ticket is shared |
|
||||||
|
| ↳ `open` | boolean | Whether the ticket is open |
|
||||||
|
| `ticketId` | string | ID of the created ticket |
|
||||||
|
| `success` | boolean | Operation success status |
|
||||||
|
|
||||||
### `intercom_get_ticket`
|
### `intercom_get_ticket`
|
||||||
|
|
||||||
@@ -312,6 +608,23 @@ Retrieve a single ticket by ID from Intercom. Returns API-aligned fields only.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `ticket` | object | Ticket object |
|
| `ticket` | object | Ticket object |
|
||||||
|
| ↳ `id` | string | Unique identifier for the ticket |
|
||||||
|
| ↳ `type` | string | Object type \(ticket\) |
|
||||||
|
| ↳ `ticket_id` | string | Ticket ID |
|
||||||
|
| ↳ `ticket_type` | object | Type of the ticket |
|
||||||
|
| ↳ `ticket_attributes` | object | Attributes of the ticket |
|
||||||
|
| ↳ `ticket_state` | string | State of the ticket |
|
||||||
|
| ↳ `ticket_state_internal_label` | string | Internal label for ticket state |
|
||||||
|
| ↳ `ticket_state_external_label` | string | External label for ticket state |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when ticket was created |
|
||||||
|
| ↳ `updated_at` | number | Unix timestamp when ticket was last updated |
|
||||||
|
| ↳ `contacts` | object | Contacts associated with the ticket |
|
||||||
|
| ↳ `admin_assignee_id` | string | ID of assigned admin |
|
||||||
|
| ↳ `team_assignee_id` | string | ID of assigned team |
|
||||||
|
| ↳ `is_shared` | boolean | Whether the ticket is shared |
|
||||||
|
| ↳ `open` | boolean | Whether the ticket is open |
|
||||||
|
| `ticketId` | string | ID of the retrieved ticket |
|
||||||
|
| `success` | boolean | Operation success status |
|
||||||
|
|
||||||
### `intercom_create_message`
|
### `intercom_create_message`
|
||||||
|
|
||||||
@@ -336,5 +649,14 @@ Create and send a new admin-initiated message in Intercom. Returns API-aligned f
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | object | Created message object |
|
| `message` | object | Created message object |
|
||||||
|
| ↳ `id` | string | Unique identifier for the message |
|
||||||
|
| ↳ `type` | string | Object type \(message\) |
|
||||||
|
| ↳ `created_at` | number | Unix timestamp when message was created |
|
||||||
|
| ↳ `body` | string | Body of the message |
|
||||||
|
| ↳ `message_type` | string | Type of the message \(in_app or email\) |
|
||||||
|
| ↳ `conversation_id` | string | ID of the conversation created |
|
||||||
|
| ↳ `owner` | object | Owner of the message |
|
||||||
|
| `messageId` | string | ID of the created message |
|
||||||
|
| `success` | boolean | Operation success status |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ Get a single service request from Jira Service Management
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `ts` | string | Timestamp of the operation |
|
| `ts` | string | Timestamp of the operation |
|
||||||
|
| `request` | json | The service request object |
|
||||||
|
|
||||||
### `jsm_get_requests`
|
### `jsm_get_requests`
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,15 @@ Search for similar content in a knowledge base using vector similarity
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | Array of search results from the knowledge base |
|
| `results` | array | Array of search results from the knowledge base |
|
||||||
|
| ↳ `documentId` | string | Document ID |
|
||||||
|
| ↳ `documentName` | string | Document name |
|
||||||
|
| ↳ `content` | string | Content of the result |
|
||||||
|
| ↳ `chunkIndex` | number | Index of the chunk within the document |
|
||||||
|
| ↳ `similarity` | number | Similarity score of the result |
|
||||||
|
| ↳ `metadata` | object | Metadata of the result, including tags |
|
||||||
|
| `query` | string | The search query that was executed |
|
||||||
|
| `totalResults` | number | Total number of results found |
|
||||||
|
| `cost` | object | Cost information for the search operation |
|
||||||
|
|
||||||
### `knowledge_upload_chunk`
|
### `knowledge_upload_chunk`
|
||||||
|
|
||||||
@@ -75,6 +84,18 @@ Upload a new chunk to a document in a knowledge base
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `data` | object | Information about the uploaded chunk |
|
| `data` | object | Information about the uploaded chunk |
|
||||||
|
| ↳ `chunkId` | string | Chunk ID |
|
||||||
|
| ↳ `chunkIndex` | number | Index of the chunk within the document |
|
||||||
|
| ↳ `content` | string | Content of the chunk |
|
||||||
|
| ↳ `contentLength` | number | Length of the content in characters |
|
||||||
|
| ↳ `tokenCount` | number | Number of tokens in the chunk |
|
||||||
|
| ↳ `enabled` | boolean | Whether the chunk is enabled |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `updatedAt` | string | Last update timestamp |
|
||||||
|
| `message` | string | Success or error message describing the operation result |
|
||||||
|
| `documentId` | string | ID of the document the chunk was added to |
|
||||||
|
| `documentName` | string | Name of the document the chunk was added to |
|
||||||
|
| `cost` | object | Cost information for the upload operation |
|
||||||
|
|
||||||
### `knowledge_create_document`
|
### `knowledge_create_document`
|
||||||
|
|
||||||
@@ -106,5 +127,13 @@ Create a new document in a knowledge base
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `data` | object | Information about the created document |
|
| `data` | object | Information about the created document |
|
||||||
|
| ↳ `documentId` | string | Document ID |
|
||||||
|
| ↳ `documentName` | string | Document name |
|
||||||
|
| ↳ `type` | string | Document type |
|
||||||
|
| ↳ `enabled` | boolean | Whether the document is enabled |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `updatedAt` | string | Last update timestamp |
|
||||||
|
| `message` | string | Success or error message describing the operation result |
|
||||||
|
| `documentId` | string | ID of the created document |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
77
apps/docs/content/docs/en/tools/langsmith.mdx
Normal file
77
apps/docs/content/docs/en/tools/langsmith.mdx
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
---
|
||||||
|
title: LangSmith
|
||||||
|
description: Forward workflow runs to LangSmith for observability
|
||||||
|
---
|
||||||
|
|
||||||
|
import { BlockInfoCard } from "@/components/ui/block-info-card"
|
||||||
|
|
||||||
|
<BlockInfoCard
|
||||||
|
type="langsmith"
|
||||||
|
color="#181C1E"
|
||||||
|
/>
|
||||||
|
|
||||||
|
## Usage Instructions
|
||||||
|
|
||||||
|
Send run data to LangSmith to trace executions, attach metadata, and monitor workflow performance.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Tools
|
||||||
|
|
||||||
|
### `langsmith_create_run`
|
||||||
|
|
||||||
|
Forward a single run to LangSmith for ingestion.
|
||||||
|
|
||||||
|
#### Input
|
||||||
|
|
||||||
|
| Parameter | Type | Required | Description |
|
||||||
|
| --------- | ---- | -------- | ----------- |
|
||||||
|
| `apiKey` | string | Yes | LangSmith API key |
|
||||||
|
| `id` | string | No | Unique run identifier |
|
||||||
|
| `name` | string | Yes | Run name |
|
||||||
|
| `run_type` | string | Yes | Run type \(tool, chain, llm, retriever, embedding, prompt, parser\) |
|
||||||
|
| `start_time` | string | No | Run start time in ISO-8601 format |
|
||||||
|
| `end_time` | string | No | Run end time in ISO-8601 format |
|
||||||
|
| `inputs` | json | No | Inputs payload |
|
||||||
|
| `run_outputs` | json | No | Outputs payload |
|
||||||
|
| `extra` | json | No | Additional metadata \(extra\) |
|
||||||
|
| `tags` | json | No | Array of tag strings |
|
||||||
|
| `parent_run_id` | string | No | Parent run ID |
|
||||||
|
| `trace_id` | string | No | Trace ID |
|
||||||
|
| `session_id` | string | No | Session ID |
|
||||||
|
| `session_name` | string | No | Session name |
|
||||||
|
| `status` | string | No | Run status |
|
||||||
|
| `error` | string | No | Error details |
|
||||||
|
| `dotted_order` | string | No | Dotted order string |
|
||||||
|
| `events` | json | No | Structured events array |
|
||||||
|
|
||||||
|
#### Output
|
||||||
|
|
||||||
|
| Parameter | Type | Description |
|
||||||
|
| --------- | ---- | ----------- |
|
||||||
|
| `accepted` | boolean | Whether the run was accepted for ingestion |
|
||||||
|
| `runId` | string | Run identifier provided in the request |
|
||||||
|
| `message` | string | Response message from LangSmith |
|
||||||
|
|
||||||
|
### `langsmith_create_runs_batch`
|
||||||
|
|
||||||
|
Forward multiple runs to LangSmith in a single batch.
|
||||||
|
|
||||||
|
#### Input
|
||||||
|
|
||||||
|
| Parameter | Type | Required | Description |
|
||||||
|
| --------- | ---- | -------- | ----------- |
|
||||||
|
| `apiKey` | string | Yes | LangSmith API key |
|
||||||
|
| `post` | json | No | Array of new runs to ingest |
|
||||||
|
| `patch` | json | No | Array of runs to update/patch |
|
||||||
|
|
||||||
|
#### Output
|
||||||
|
|
||||||
|
| Parameter | Type | Description |
|
||||||
|
| --------- | ---- | ----------- |
|
||||||
|
| `accepted` | boolean | Whether the batch was accepted for ingestion |
|
||||||
|
| `runIds` | array | Run identifiers provided in the request |
|
||||||
|
| `message` | string | Response message from LangSmith |
|
||||||
|
| `messages` | array | Per-run response messages, when provided |
|
||||||
|
|
||||||
|
|
||||||
@@ -39,6 +39,14 @@ Retrieves campaign activities and steps performed, including email opens, clicks
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `activities` | array | List of activities |
|
| `activities` | array | List of activities |
|
||||||
|
| ↳ `_id` | string | Activity ID |
|
||||||
|
| ↳ `type` | string | Activity type |
|
||||||
|
| ↳ `leadId` | string | Associated lead ID |
|
||||||
|
| ↳ `campaignId` | string | Campaign ID |
|
||||||
|
| ↳ `sequenceId` | string | Sequence ID |
|
||||||
|
| ↳ `stepId` | string | Step ID |
|
||||||
|
| ↳ `createdAt` | string | When the activity occurred |
|
||||||
|
| `count` | number | Number of activities returned |
|
||||||
|
|
||||||
### `lemlist_get_lead`
|
### `lemlist_get_lead`
|
||||||
|
|
||||||
@@ -49,8 +57,7 @@ Retrieves lead information by email address or lead ID.
|
|||||||
| Parameter | Type | Required | Description |
|
| Parameter | Type | Required | Description |
|
||||||
| --------- | ---- | -------- | ----------- |
|
| --------- | ---- | -------- | ----------- |
|
||||||
| `apiKey` | string | Yes | Lemlist API key |
|
| `apiKey` | string | Yes | Lemlist API key |
|
||||||
| `email` | string | No | Lead email address \(use either email or id\) |
|
| `leadIdentifier` | string | Yes | Lead email address or lead ID |
|
||||||
| `id` | string | No | Lead ID \(use either email or id\) |
|
|
||||||
|
|
||||||
#### Output
|
#### Output
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,27 @@ Fetch and filter issues from Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `issues` | array | Array of filtered issues from Linear |
|
| `issues` | array | Array of filtered issues from Linear |
|
||||||
|
| ↳ `id` | string | Issue ID |
|
||||||
|
| ↳ `title` | string | Issue title |
|
||||||
|
| ↳ `description` | string | Issue description |
|
||||||
|
| ↳ `priority` | number | Issue priority |
|
||||||
|
| ↳ `estimate` | number | Issue estimate |
|
||||||
|
| ↳ `url` | string | Issue URL |
|
||||||
|
| ↳ `dueDate` | string | Due date \(YYYY-MM-DD\) |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `updatedAt` | string | Last update timestamp |
|
||||||
|
| ↳ `state` | object | Issue state |
|
||||||
|
| ↳ `assignee` | object | Assigned user |
|
||||||
|
| ↳ `teamId` | string | Team ID |
|
||||||
|
| ↳ `teamName` | string | Team name |
|
||||||
|
| ↳ `projectId` | string | Project ID |
|
||||||
|
| ↳ `projectName` | string | Project name |
|
||||||
|
| ↳ `cycleId` | string | Cycle ID |
|
||||||
|
| ↳ `cycleNumber` | number | Cycle number |
|
||||||
|
| ↳ `cycleName` | string | Cycle name |
|
||||||
|
| ↳ `labels` | array | Issue labels |
|
||||||
|
| `hasNextPage` | boolean | Whether there are more results available |
|
||||||
|
| `endCursor` | string | Cursor for fetching the next page \(use as |
|
||||||
|
|
||||||
### `linear_get_issue`
|
### `linear_get_issue`
|
||||||
|
|
||||||
@@ -76,6 +97,17 @@ Get a single issue by ID from Linear with full details
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `issue` | object | The issue with full details |
|
| `issue` | object | The issue with full details |
|
||||||
|
| ↳ `id` | string | Issue ID |
|
||||||
|
| ↳ `title` | string | Issue title |
|
||||||
|
| ↳ `description` | string | Issue description |
|
||||||
|
| ↳ `priority` | number | Issue priority \(0-4\) |
|
||||||
|
| ↳ `estimate` | number | Issue estimate in points |
|
||||||
|
| ↳ `url` | string | Issue URL |
|
||||||
|
| ↳ `state` | object | Issue state/status |
|
||||||
|
| ↳ `assignee` | object | Assigned user |
|
||||||
|
| ↳ `labels` | array | Issue labels |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `updatedAt` | string | Last update timestamp |
|
||||||
|
|
||||||
### `linear_create_issue`
|
### `linear_create_issue`
|
||||||
|
|
||||||
@@ -105,6 +137,25 @@ Create a new issue in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `issue` | object | The created issue with all its properties |
|
| `issue` | object | The created issue with all its properties |
|
||||||
|
| ↳ `id` | string | Issue ID |
|
||||||
|
| ↳ `title` | string | Issue title |
|
||||||
|
| ↳ `description` | string | Issue description |
|
||||||
|
| ↳ `priority` | number | Issue priority |
|
||||||
|
| ↳ `estimate` | number | Issue estimate |
|
||||||
|
| ↳ `url` | string | Issue URL |
|
||||||
|
| ↳ `dueDate` | string | Due date \(YYYY-MM-DD\) |
|
||||||
|
| ↳ `state` | object | Issue state |
|
||||||
|
| ↳ `assignee` | object | Assigned user |
|
||||||
|
| ↳ `teamId` | string | Team ID |
|
||||||
|
| ↳ `projectId` | string | Project ID |
|
||||||
|
| ↳ `cycleId` | string | Cycle ID |
|
||||||
|
| ↳ `cycleNumber` | number | Cycle number |
|
||||||
|
| ↳ `cycleName` | string | Cycle name |
|
||||||
|
| ↳ `parentId` | string | Parent issue ID |
|
||||||
|
| ↳ `parentTitle` | string | Parent issue title |
|
||||||
|
| ↳ `projectMilestoneId` | string | Project milestone ID |
|
||||||
|
| ↳ `projectMilestoneName` | string | Project milestone name |
|
||||||
|
| ↳ `labels` | array | Issue labels |
|
||||||
|
|
||||||
### `linear_update_issue`
|
### `linear_update_issue`
|
||||||
|
|
||||||
@@ -134,6 +185,22 @@ Update an existing issue in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `issue` | object | The updated issue |
|
| `issue` | object | The updated issue |
|
||||||
|
| ↳ `id` | string | Issue ID |
|
||||||
|
| ↳ `title` | string | Issue title |
|
||||||
|
| ↳ `description` | string | Issue description |
|
||||||
|
| ↳ `priority` | number | Issue priority |
|
||||||
|
| ↳ `estimate` | number | Issue estimate |
|
||||||
|
| ↳ `state` | object | Issue state |
|
||||||
|
| ↳ `assignee` | object | Assigned user |
|
||||||
|
| ↳ `labels` | array | Issue labels |
|
||||||
|
| ↳ `updatedAt` | string | Last update timestamp |
|
||||||
|
| ↳ `dueDate` | string | Due date \(YYYY-MM-DD\) |
|
||||||
|
| ↳ `projectId` | string | Project ID |
|
||||||
|
| ↳ `cycleId` | string | Cycle ID |
|
||||||
|
| ↳ `cycleNumber` | number | Cycle number |
|
||||||
|
| ↳ `cycleName` | string | Cycle name |
|
||||||
|
| ↳ `parentId` | string | Parent issue ID |
|
||||||
|
| ↳ `parentTitle` | string | Parent issue title |
|
||||||
|
|
||||||
### `linear_archive_issue`
|
### `linear_archive_issue`
|
||||||
|
|
||||||
@@ -203,6 +270,16 @@ Search for issues in Linear using full-text search
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `issues` | array | Array of matching issues |
|
| `issues` | array | Array of matching issues |
|
||||||
|
| ↳ `id` | string | Issue ID |
|
||||||
|
| ↳ `title` | string | Issue title |
|
||||||
|
| ↳ `description` | string | Issue description |
|
||||||
|
| ↳ `priority` | number | Issue priority |
|
||||||
|
| ↳ `state` | object | Issue state |
|
||||||
|
| ↳ `assignee` | object | Assigned user |
|
||||||
|
| ↳ `labels` | array | Issue labels |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
| ↳ `hasNextPage` | boolean | Whether there are more results |
|
||||||
|
| ↳ `endCursor` | string | Cursor for next page |
|
||||||
|
|
||||||
### `linear_add_label_to_issue`
|
### `linear_add_label_to_issue`
|
||||||
|
|
||||||
@@ -256,6 +333,11 @@ Add a comment to an issue in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `comment` | object | The created comment |
|
| `comment` | object | The created comment |
|
||||||
|
| ↳ `id` | string | Comment ID |
|
||||||
|
| ↳ `body` | string | Comment text |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `user` | object | User who created the comment |
|
||||||
|
| ↳ `issue` | object | Associated issue |
|
||||||
|
|
||||||
### `linear_update_comment`
|
### `linear_update_comment`
|
||||||
|
|
||||||
@@ -273,6 +355,10 @@ Edit a comment in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `comment` | object | The updated comment |
|
| `comment` | object | The updated comment |
|
||||||
|
| ↳ `id` | string | Comment ID |
|
||||||
|
| ↳ `body` | string | Comment text |
|
||||||
|
| ↳ `updatedAt` | string | Last update timestamp |
|
||||||
|
| ↳ `user` | object | User who created the comment |
|
||||||
|
|
||||||
### `linear_delete_comment`
|
### `linear_delete_comment`
|
||||||
|
|
||||||
@@ -307,6 +393,14 @@ List all comments on an issue in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `comments` | array | Array of comments on the issue |
|
| `comments` | array | Array of comments on the issue |
|
||||||
|
| ↳ `id` | string | Comment ID |
|
||||||
|
| ↳ `body` | string | Comment text |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `updatedAt` | string | Last update timestamp |
|
||||||
|
| ↳ `user` | object | User who created the comment |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
| ↳ `hasNextPage` | boolean | Whether there are more results |
|
||||||
|
| ↳ `endCursor` | string | Cursor for next page |
|
||||||
|
|
||||||
### `linear_list_projects`
|
### `linear_list_projects`
|
||||||
|
|
||||||
@@ -326,6 +420,14 @@ List projects in Linear with optional filtering
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `projects` | array | Array of projects |
|
| `projects` | array | Array of projects |
|
||||||
|
| ↳ `id` | string | Project ID |
|
||||||
|
| ↳ `name` | string | Project name |
|
||||||
|
| ↳ `description` | string | Project description |
|
||||||
|
| ↳ `state` | string | Project state |
|
||||||
|
| ↳ `priority` | number | Project priority |
|
||||||
|
| ↳ `lead` | object | Project lead |
|
||||||
|
| ↳ `teams` | array | Teams associated with project |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
|
||||||
### `linear_get_project`
|
### `linear_get_project`
|
||||||
|
|
||||||
@@ -342,6 +444,15 @@ Get a single project by ID from Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `project` | object | The project with full details |
|
| `project` | object | The project with full details |
|
||||||
|
| ↳ `id` | string | Project ID |
|
||||||
|
| ↳ `name` | string | Project name |
|
||||||
|
| ↳ `description` | string | Project description |
|
||||||
|
| ↳ `state` | string | Project state |
|
||||||
|
| ↳ `priority` | number | Project priority |
|
||||||
|
| ↳ `startDate` | string | Start date |
|
||||||
|
| ↳ `targetDate` | string | Target completion date |
|
||||||
|
| ↳ `lead` | object | Project lead |
|
||||||
|
| ↳ `teams` | array | Associated teams |
|
||||||
|
|
||||||
### `linear_create_project`
|
### `linear_create_project`
|
||||||
|
|
||||||
@@ -364,6 +475,13 @@ Create a new project in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `project` | object | The created project |
|
| `project` | object | The created project |
|
||||||
|
| ↳ `id` | string | Project ID |
|
||||||
|
| ↳ `name` | string | Project name |
|
||||||
|
| ↳ `description` | string | Project description |
|
||||||
|
| ↳ `state` | string | Project state |
|
||||||
|
| ↳ `priority` | number | Project priority |
|
||||||
|
| ↳ `lead` | object | Project lead |
|
||||||
|
| ↳ `teams` | array | Associated teams |
|
||||||
|
|
||||||
### `linear_update_project`
|
### `linear_update_project`
|
||||||
|
|
||||||
@@ -387,6 +505,15 @@ Update an existing project in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `project` | object | The updated project |
|
| `project` | object | The updated project |
|
||||||
|
| ↳ `id` | string | Project ID |
|
||||||
|
| ↳ `name` | string | Project name |
|
||||||
|
| ↳ `description` | string | Project description |
|
||||||
|
| ↳ `state` | string | Project state |
|
||||||
|
| ↳ `priority` | number | Project priority |
|
||||||
|
| ↳ `startDate` | string | Project start date |
|
||||||
|
| ↳ `targetDate` | string | Project target date |
|
||||||
|
| ↳ `lead` | object | Project lead |
|
||||||
|
| ↳ `teams` | array | Associated teams |
|
||||||
|
|
||||||
### `linear_archive_project`
|
### `linear_archive_project`
|
||||||
|
|
||||||
@@ -422,6 +549,14 @@ List all users in the Linear workspace
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `users` | array | Array of workspace users |
|
| `users` | array | Array of workspace users |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `displayName` | string | Display name |
|
||||||
|
| ↳ `active` | boolean | Whether user is active |
|
||||||
|
| ↳ `admin` | boolean | Whether user is admin |
|
||||||
|
| ↳ `avatarUrl` | string | Avatar URL |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
|
||||||
### `linear_list_teams`
|
### `linear_list_teams`
|
||||||
|
|
||||||
@@ -439,6 +574,11 @@ List all teams in the Linear workspace
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `teams` | array | Array of teams |
|
| `teams` | array | Array of teams |
|
||||||
|
| ↳ `id` | string | Team ID |
|
||||||
|
| ↳ `name` | string | Team name |
|
||||||
|
| ↳ `key` | string | Team key \(used in issue identifiers\) |
|
||||||
|
| ↳ `description` | string | Team description |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
|
||||||
### `linear_get_viewer`
|
### `linear_get_viewer`
|
||||||
|
|
||||||
@@ -454,6 +594,13 @@ Get the currently authenticated user (viewer) information
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `user` | object | The currently authenticated user |
|
| `user` | object | The currently authenticated user |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `displayName` | string | Display name |
|
||||||
|
| ↳ `active` | boolean | Whether user is active |
|
||||||
|
| ↳ `admin` | boolean | Whether user is admin |
|
||||||
|
| ↳ `avatarUrl` | string | Avatar URL |
|
||||||
|
|
||||||
### `linear_list_labels`
|
### `linear_list_labels`
|
||||||
|
|
||||||
@@ -472,6 +619,12 @@ List all labels in Linear workspace or team
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `labels` | array | Array of labels |
|
| `labels` | array | Array of labels |
|
||||||
|
| ↳ `id` | string | Label ID |
|
||||||
|
| ↳ `name` | string | Label name |
|
||||||
|
| ↳ `color` | string | Label color \(hex\) |
|
||||||
|
| ↳ `description` | string | Label description |
|
||||||
|
| ↳ `team` | object | Team this label belongs to |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
|
||||||
### `linear_create_label`
|
### `linear_create_label`
|
||||||
|
|
||||||
@@ -491,6 +644,11 @@ Create a new label in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `label` | object | The created label |
|
| `label` | object | The created label |
|
||||||
|
| ↳ `id` | string | Label ID |
|
||||||
|
| ↳ `name` | string | Label name |
|
||||||
|
| ↳ `color` | string | Label color |
|
||||||
|
| ↳ `description` | string | Label description |
|
||||||
|
| ↳ `team` | object | Team this label belongs to |
|
||||||
|
|
||||||
### `linear_update_label`
|
### `linear_update_label`
|
||||||
|
|
||||||
@@ -510,6 +668,10 @@ Update an existing label in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `label` | object | The updated label |
|
| `label` | object | The updated label |
|
||||||
|
| ↳ `id` | string | Label ID |
|
||||||
|
| ↳ `name` | string | Label name |
|
||||||
|
| ↳ `color` | string | Label color |
|
||||||
|
| ↳ `description` | string | Label description |
|
||||||
|
|
||||||
### `linear_archive_label`
|
### `linear_archive_label`
|
||||||
|
|
||||||
@@ -545,6 +707,13 @@ List all workflow states (statuses) in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `states` | array | Array of workflow states |
|
| `states` | array | Array of workflow states |
|
||||||
|
| ↳ `id` | string | State ID |
|
||||||
|
| ↳ `name` | string | State name \(e.g., |
|
||||||
|
| ↳ `type` | string | State type \(e.g., |
|
||||||
|
| ↳ `color` | string | State color |
|
||||||
|
| ↳ `position` | number | State position in workflow |
|
||||||
|
| ↳ `team` | object | Team this state belongs to |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
|
||||||
### `linear_create_workflow_state`
|
### `linear_create_workflow_state`
|
||||||
|
|
||||||
@@ -566,6 +735,12 @@ Create a new workflow state (status) in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `state` | object | The created workflow state |
|
| `state` | object | The created workflow state |
|
||||||
|
| ↳ `id` | string | State ID |
|
||||||
|
| ↳ `name` | string | State name |
|
||||||
|
| ↳ `type` | string | State type |
|
||||||
|
| ↳ `color` | string | State color |
|
||||||
|
| ↳ `position` | number | State position |
|
||||||
|
| ↳ `team` | object | Team this state belongs to |
|
||||||
|
|
||||||
### `linear_update_workflow_state`
|
### `linear_update_workflow_state`
|
||||||
|
|
||||||
@@ -586,6 +761,11 @@ Update an existing workflow state in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `state` | object | The updated workflow state |
|
| `state` | object | The updated workflow state |
|
||||||
|
| ↳ `id` | string | State ID |
|
||||||
|
| ↳ `name` | string | State name |
|
||||||
|
| ↳ `type` | string | State type |
|
||||||
|
| ↳ `color` | string | State color |
|
||||||
|
| ↳ `position` | number | State position |
|
||||||
|
|
||||||
### `linear_list_cycles`
|
### `linear_list_cycles`
|
||||||
|
|
||||||
@@ -604,6 +784,15 @@ List cycles (sprints/iterations) in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `cycles` | array | Array of cycles |
|
| `cycles` | array | Array of cycles |
|
||||||
|
| ↳ `id` | string | Cycle ID |
|
||||||
|
| ↳ `number` | number | Cycle number |
|
||||||
|
| ↳ `name` | string | Cycle name |
|
||||||
|
| ↳ `startsAt` | string | Start date |
|
||||||
|
| ↳ `endsAt` | string | End date |
|
||||||
|
| ↳ `completedAt` | string | Completion date |
|
||||||
|
| ↳ `progress` | number | Progress percentage \(0-1\) |
|
||||||
|
| ↳ `team` | object | Team this cycle belongs to |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
|
||||||
### `linear_get_cycle`
|
### `linear_get_cycle`
|
||||||
|
|
||||||
@@ -620,6 +809,13 @@ Get a single cycle by ID from Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `cycle` | object | The cycle with full details |
|
| `cycle` | object | The cycle with full details |
|
||||||
|
| ↳ `id` | string | Cycle ID |
|
||||||
|
| ↳ `number` | number | Cycle number |
|
||||||
|
| ↳ `name` | string | Cycle name |
|
||||||
|
| ↳ `startsAt` | string | Start date |
|
||||||
|
| ↳ `endsAt` | string | End date |
|
||||||
|
| ↳ `progress` | number | Progress percentage |
|
||||||
|
| ↳ `team` | object | Team this cycle belongs to |
|
||||||
|
|
||||||
### `linear_create_cycle`
|
### `linear_create_cycle`
|
||||||
|
|
||||||
@@ -639,6 +835,12 @@ Create a new cycle (sprint/iteration) in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `cycle` | object | The created cycle |
|
| `cycle` | object | The created cycle |
|
||||||
|
| ↳ `id` | string | Cycle ID |
|
||||||
|
| ↳ `number` | number | Cycle number |
|
||||||
|
| ↳ `name` | string | Cycle name |
|
||||||
|
| ↳ `startsAt` | string | Start date |
|
||||||
|
| ↳ `endsAt` | string | End date |
|
||||||
|
| ↳ `team` | object | Team this cycle belongs to |
|
||||||
|
|
||||||
### `linear_get_active_cycle`
|
### `linear_get_active_cycle`
|
||||||
|
|
||||||
@@ -655,6 +857,13 @@ Get the currently active cycle for a team
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `cycle` | object | The active cycle \(null if no active cycle\) |
|
| `cycle` | object | The active cycle \(null if no active cycle\) |
|
||||||
|
| ↳ `id` | string | Cycle ID |
|
||||||
|
| ↳ `number` | number | Cycle number |
|
||||||
|
| ↳ `name` | string | Cycle name |
|
||||||
|
| ↳ `startsAt` | string | Start date |
|
||||||
|
| ↳ `endsAt` | string | End date |
|
||||||
|
| ↳ `progress` | number | Progress percentage |
|
||||||
|
| ↳ `team` | object | Team this cycle belongs to |
|
||||||
|
|
||||||
### `linear_create_attachment`
|
### `linear_create_attachment`
|
||||||
|
|
||||||
@@ -674,6 +883,11 @@ Add an attachment to an issue in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `attachment` | object | The created attachment |
|
| `attachment` | object | The created attachment |
|
||||||
|
| ↳ `id` | string | Attachment ID |
|
||||||
|
| ↳ `title` | string | Attachment title |
|
||||||
|
| ↳ `subtitle` | string | Attachment subtitle |
|
||||||
|
| ↳ `url` | string | Attachment URL |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
|
||||||
### `linear_list_attachments`
|
### `linear_list_attachments`
|
||||||
|
|
||||||
@@ -692,6 +906,12 @@ List all attachments on an issue in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `attachments` | array | Array of attachments |
|
| `attachments` | array | Array of attachments |
|
||||||
|
| ↳ `id` | string | Attachment ID |
|
||||||
|
| ↳ `title` | string | Attachment title |
|
||||||
|
| ↳ `subtitle` | string | Attachment subtitle |
|
||||||
|
| ↳ `url` | string | Attachment URL |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
|
||||||
### `linear_update_attachment`
|
### `linear_update_attachment`
|
||||||
|
|
||||||
@@ -710,6 +930,11 @@ Update an attachment metadata in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `attachment` | object | The updated attachment |
|
| `attachment` | object | The updated attachment |
|
||||||
|
| ↳ `id` | string | Attachment ID |
|
||||||
|
| ↳ `title` | string | Attachment title |
|
||||||
|
| ↳ `subtitle` | string | Attachment subtitle |
|
||||||
|
| ↳ `url` | string | Attachment URL |
|
||||||
|
| ↳ `updatedAt` | string | Last update timestamp |
|
||||||
|
|
||||||
### `linear_delete_attachment`
|
### `linear_delete_attachment`
|
||||||
|
|
||||||
@@ -744,6 +969,10 @@ Link two issues together in Linear (blocks, relates to, duplicates)
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `relation` | object | The created issue relation |
|
| `relation` | object | The created issue relation |
|
||||||
|
| ↳ `id` | string | Relation ID |
|
||||||
|
| ↳ `type` | string | Relation type |
|
||||||
|
| ↳ `issue` | object | Source issue |
|
||||||
|
| ↳ `relatedIssue` | object | Target issue |
|
||||||
|
|
||||||
### `linear_list_issue_relations`
|
### `linear_list_issue_relations`
|
||||||
|
|
||||||
@@ -762,6 +991,11 @@ List all relations (dependencies) for an issue in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `relations` | array | Array of issue relations |
|
| `relations` | array | Array of issue relations |
|
||||||
|
| ↳ `id` | string | Relation ID |
|
||||||
|
| ↳ `type` | string | Relation type |
|
||||||
|
| ↳ `issue` | object | Source issue |
|
||||||
|
| ↳ `relatedIssue` | object | Target issue |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
|
||||||
### `linear_delete_issue_relation`
|
### `linear_delete_issue_relation`
|
||||||
|
|
||||||
@@ -797,6 +1031,11 @@ Bookmark an issue, project, cycle, or label in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `favorite` | object | The created favorite |
|
| `favorite` | object | The created favorite |
|
||||||
|
| ↳ `id` | string | Favorite ID |
|
||||||
|
| ↳ `type` | string | Favorite type |
|
||||||
|
| ↳ `issue` | object | Favorited issue \(if applicable\) |
|
||||||
|
| ↳ `project` | object | Favorited project \(if applicable\) |
|
||||||
|
| ↳ `cycle` | object | Favorited cycle \(if applicable\) |
|
||||||
|
|
||||||
### `linear_list_favorites`
|
### `linear_list_favorites`
|
||||||
|
|
||||||
@@ -814,6 +1053,12 @@ List all bookmarked items for the current user in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `favorites` | array | Array of favorited items |
|
| `favorites` | array | Array of favorited items |
|
||||||
|
| ↳ `id` | string | Favorite ID |
|
||||||
|
| ↳ `type` | string | Favorite type |
|
||||||
|
| ↳ `issue` | object | Favorited issue |
|
||||||
|
| ↳ `project` | object | Favorited project |
|
||||||
|
| ↳ `cycle` | object | Favorited cycle |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
|
||||||
### `linear_create_project_update`
|
### `linear_create_project_update`
|
||||||
|
|
||||||
@@ -832,6 +1077,11 @@ Post a status update for a project in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `update` | object | The created project update |
|
| `update` | object | The created project update |
|
||||||
|
| ↳ `id` | string | Update ID |
|
||||||
|
| ↳ `body` | string | Update message |
|
||||||
|
| ↳ `health` | string | Project health status |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `user` | object | User who created the update |
|
||||||
|
|
||||||
### `linear_list_project_updates`
|
### `linear_list_project_updates`
|
||||||
|
|
||||||
@@ -850,6 +1100,12 @@ List all status updates for a project in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `updates` | array | Array of project updates |
|
| `updates` | array | Array of project updates |
|
||||||
|
| ↳ `id` | string | Update ID |
|
||||||
|
| ↳ `body` | string | Update message |
|
||||||
|
| ↳ `health` | string | Project health |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `user` | object | User who created the update |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
|
||||||
### `linear_list_notifications`
|
### `linear_list_notifications`
|
||||||
|
|
||||||
@@ -867,6 +1123,12 @@ List notifications for the current user in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `notifications` | array | Array of notifications |
|
| `notifications` | array | Array of notifications |
|
||||||
|
| ↳ `id` | string | Notification ID |
|
||||||
|
| ↳ `type` | string | Notification type |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `readAt` | string | Read timestamp \(null if unread\) |
|
||||||
|
| ↳ `issue` | object | Related issue |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
|
||||||
### `linear_update_notification`
|
### `linear_update_notification`
|
||||||
|
|
||||||
@@ -884,6 +1146,11 @@ Mark a notification as read or unread in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `notification` | object | The updated notification |
|
| `notification` | object | The updated notification |
|
||||||
|
| ↳ `id` | string | Notification ID |
|
||||||
|
| ↳ `type` | string | Notification type |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `readAt` | string | Read timestamp |
|
||||||
|
| ↳ `issue` | object | Related issue |
|
||||||
|
|
||||||
### `linear_create_customer`
|
### `linear_create_customer`
|
||||||
|
|
||||||
@@ -908,6 +1175,14 @@ Create a new customer in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `customer` | object | The created customer |
|
| `customer` | object | The created customer |
|
||||||
|
| ↳ `id` | string | Customer ID |
|
||||||
|
| ↳ `name` | string | Customer name |
|
||||||
|
| ↳ `domains` | array | Associated domains |
|
||||||
|
| ↳ `externalIds` | array | External IDs |
|
||||||
|
| ↳ `logoUrl` | string | Logo URL |
|
||||||
|
| ↳ `approximateNeedCount` | number | Number of customer needs |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `archivedAt` | string | Archive timestamp \(null if not archived\) |
|
||||||
|
|
||||||
### `linear_list_customers`
|
### `linear_list_customers`
|
||||||
|
|
||||||
@@ -926,6 +1201,15 @@ List all customers in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `customers` | array | Array of customers |
|
| `customers` | array | Array of customers |
|
||||||
|
| ↳ `id` | string | Customer ID |
|
||||||
|
| ↳ `name` | string | Customer name |
|
||||||
|
| ↳ `domains` | array | Associated domains |
|
||||||
|
| ↳ `externalIds` | array | External IDs |
|
||||||
|
| ↳ `logoUrl` | string | Logo URL |
|
||||||
|
| ↳ `approximateNeedCount` | number | Number of customer needs |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `archivedAt` | string | Archive timestamp \(null if not archived\) |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
|
||||||
### `linear_create_customer_request`
|
### `linear_create_customer_request`
|
||||||
|
|
||||||
@@ -946,6 +1230,17 @@ Create a customer request (need) in Linear. Assign to customer, set urgency (pri
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `customerNeed` | object | The created customer request |
|
| `customerNeed` | object | The created customer request |
|
||||||
|
| ↳ `id` | string | Customer request ID |
|
||||||
|
| ↳ `body` | string | Request description |
|
||||||
|
| ↳ `priority` | number | Urgency level \(0 = Not important, 1 = Important\) |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `updatedAt` | string | Last update timestamp |
|
||||||
|
| ↳ `archivedAt` | string | Archive timestamp \(null if not archived\) |
|
||||||
|
| ↳ `customer` | object | Assigned customer |
|
||||||
|
| ↳ `issue` | object | Linked issue \(null if not linked\) |
|
||||||
|
| ↳ `project` | object | Linked project \(null if not linked\) |
|
||||||
|
| ↳ `creator` | object | User who created the request |
|
||||||
|
| ↳ `url` | string | URL to the customer request |
|
||||||
|
|
||||||
### `linear_update_customer_request`
|
### `linear_update_customer_request`
|
||||||
|
|
||||||
@@ -967,6 +1262,17 @@ Update a customer request (need) in Linear. Can change urgency, description, cus
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `customerNeed` | object | The updated customer request |
|
| `customerNeed` | object | The updated customer request |
|
||||||
|
| ↳ `id` | string | Customer request ID |
|
||||||
|
| ↳ `body` | string | Request description |
|
||||||
|
| ↳ `priority` | number | Urgency level \(0 = Not important, 1 = Important\) |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `updatedAt` | string | Last update timestamp |
|
||||||
|
| ↳ `archivedAt` | string | Archive timestamp \(null if not archived\) |
|
||||||
|
| ↳ `customer` | object | Assigned customer |
|
||||||
|
| ↳ `issue` | object | Linked issue \(null if not linked\) |
|
||||||
|
| ↳ `project` | object | Linked project \(null if not linked\) |
|
||||||
|
| ↳ `creator` | object | User who created the request |
|
||||||
|
| ↳ `url` | string | URL to the customer request |
|
||||||
|
|
||||||
### `linear_list_customer_requests`
|
### `linear_list_customer_requests`
|
||||||
|
|
||||||
@@ -985,6 +1291,18 @@ List all customer requests (needs) in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `customerNeeds` | array | Array of customer requests |
|
| `customerNeeds` | array | Array of customer requests |
|
||||||
|
| ↳ `id` | string | Customer request ID |
|
||||||
|
| ↳ `body` | string | Request description |
|
||||||
|
| ↳ `priority` | number | Urgency level \(0 = Not important, 1 = Important\) |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `updatedAt` | string | Last update timestamp |
|
||||||
|
| ↳ `archivedAt` | string | Archive timestamp \(null if not archived\) |
|
||||||
|
| ↳ `customer` | object | Assigned customer |
|
||||||
|
| ↳ `issue` | object | Linked issue \(null if not linked\) |
|
||||||
|
| ↳ `project` | object | Linked project \(null if not linked\) |
|
||||||
|
| ↳ `creator` | object | User who created the request |
|
||||||
|
| ↳ `url` | string | URL to the customer request |
|
||||||
|
| `pageInfo` | object | Pagination information |
|
||||||
|
|
||||||
### `linear_get_customer`
|
### `linear_get_customer`
|
||||||
|
|
||||||
@@ -1001,6 +1319,14 @@ Get a single customer by ID in Linear
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `customer` | object | The customer data |
|
| `customer` | object | The customer data |
|
||||||
|
| ↳ `id` | string | Customer ID |
|
||||||
|
| ↳ `name` | string | Customer name |
|
||||||
|
| ↳ `domains` | array | Associated domains |
|
||||||
|
| ↳ `externalIds` | array | External IDs |
|
||||||
|
| ↳ `logoUrl` | string | Logo URL |
|
||||||
|
| ↳ `approximateNeedCount` | number | Number of customer needs |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `archivedAt` | string | Archive timestamp \(null if not archived\) |
|
||||||
|
|
||||||
### `linear_update_customer`
|
### `linear_update_customer`
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,9 @@ Retrieve a list of audiences (lists) from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the audiences were successfully retrieved |
|
| `success` | boolean | Whether the audiences were successfully retrieved |
|
||||||
| `output` | object | Audiences data |
|
| `output` | object | Audiences data |
|
||||||
|
| ↳ `lists` | json | Array of audience/list objects |
|
||||||
|
| ↳ `total_items` | number | Total number of lists |
|
||||||
|
| ↳ `total_returned` | number | Number of lists returned in this response |
|
||||||
|
|
||||||
### `mailchimp_get_audience`
|
### `mailchimp_get_audience`
|
||||||
|
|
||||||
@@ -90,6 +93,8 @@ Retrieve details of a specific audience (list) from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the audience was successfully retrieved |
|
| `success` | boolean | Whether the audience was successfully retrieved |
|
||||||
| `output` | object | Audience data |
|
| `output` | object | Audience data |
|
||||||
|
| ↳ `list` | json | Audience/list object |
|
||||||
|
| ↳ `list_id` | string | The unique ID of the audience |
|
||||||
|
|
||||||
### `mailchimp_create_audience`
|
### `mailchimp_create_audience`
|
||||||
|
|
||||||
@@ -112,6 +117,9 @@ Create a new audience (list) in Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created audience data |
|
| `output` | object | Created audience data |
|
||||||
|
| ↳ `list` | json | Created audience/list object |
|
||||||
|
| ↳ `list_id` | string | Created audience/list ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_update_audience`
|
### `mailchimp_update_audience`
|
||||||
|
|
||||||
@@ -134,6 +142,9 @@ Update an existing audience (list) in Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated audience data |
|
| `output` | object | Updated audience data |
|
||||||
|
| ↳ `list` | object | Updated audience/list object |
|
||||||
|
| ↳ `list_id` | string | List ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_delete_audience`
|
### `mailchimp_delete_audience`
|
||||||
|
|
||||||
@@ -172,6 +183,9 @@ Retrieve a list of members from a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the members were successfully retrieved |
|
| `success` | boolean | Whether the members were successfully retrieved |
|
||||||
| `output` | object | Members data |
|
| `output` | object | Members data |
|
||||||
|
| ↳ `members` | json | Array of member objects |
|
||||||
|
| ↳ `total_items` | number | Total number of members |
|
||||||
|
| ↳ `total_returned` | number | Number of members returned in this response |
|
||||||
|
|
||||||
### `mailchimp_get_member`
|
### `mailchimp_get_member`
|
||||||
|
|
||||||
@@ -191,6 +205,8 @@ Retrieve details of a specific member from a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the member was successfully retrieved |
|
| `success` | boolean | Whether the member was successfully retrieved |
|
||||||
| `output` | object | Member data |
|
| `output` | object | Member data |
|
||||||
|
| ↳ `member` | json | Member object |
|
||||||
|
| ↳ `subscriber_hash` | string | The MD5 hash of the member email address |
|
||||||
|
|
||||||
### `mailchimp_add_member`
|
### `mailchimp_add_member`
|
||||||
|
|
||||||
@@ -213,6 +229,9 @@ Add a new member to a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Added member data |
|
| `output` | object | Added member data |
|
||||||
|
| ↳ `member` | json | Added member object |
|
||||||
|
| ↳ `subscriber_hash` | string | Subscriber hash ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_add_or_update_member`
|
### `mailchimp_add_or_update_member`
|
||||||
|
|
||||||
@@ -236,6 +255,9 @@ Add a new member or update an existing member in a Mailchimp audience (upsert)
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Member data |
|
| `output` | object | Member data |
|
||||||
|
| ↳ `member` | json | Member object |
|
||||||
|
| ↳ `subscriber_hash` | string | Subscriber hash ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_update_member`
|
### `mailchimp_update_member`
|
||||||
|
|
||||||
@@ -259,6 +281,9 @@ Update an existing member in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated member data |
|
| `output` | object | Updated member data |
|
||||||
|
| ↳ `member` | object | Updated member object |
|
||||||
|
| ↳ `subscriber_hash` | string | Subscriber hash |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_delete_member`
|
### `mailchimp_delete_member`
|
||||||
|
|
||||||
@@ -296,6 +321,7 @@ Permanently archive (delete) a member from a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Archive confirmation |
|
| `output` | object | Archive confirmation |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_unarchive_member`
|
### `mailchimp_unarchive_member`
|
||||||
|
|
||||||
@@ -317,6 +343,9 @@ Restore an archived member to a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Unarchived member data |
|
| `output` | object | Unarchived member data |
|
||||||
|
| ↳ `member` | object | Unarchived member object |
|
||||||
|
| ↳ `subscriber_hash` | string | Subscriber hash |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_get_campaigns`
|
### `mailchimp_get_campaigns`
|
||||||
|
|
||||||
@@ -338,6 +367,9 @@ Retrieve a list of campaigns from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the campaigns were successfully retrieved |
|
| `success` | boolean | Whether the campaigns were successfully retrieved |
|
||||||
| `output` | object | Campaigns data |
|
| `output` | object | Campaigns data |
|
||||||
|
| ↳ `campaigns` | json | Array of campaign objects |
|
||||||
|
| ↳ `total_items` | number | Total number of campaigns |
|
||||||
|
| ↳ `total_returned` | number | Number of campaigns returned in this response |
|
||||||
|
|
||||||
### `mailchimp_get_campaign`
|
### `mailchimp_get_campaign`
|
||||||
|
|
||||||
@@ -356,6 +388,8 @@ Retrieve details of a specific campaign from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the campaign was successfully retrieved |
|
| `success` | boolean | Whether the campaign was successfully retrieved |
|
||||||
| `output` | object | Campaign data |
|
| `output` | object | Campaign data |
|
||||||
|
| ↳ `campaign` | json | Campaign object |
|
||||||
|
| ↳ `campaign_id` | string | The unique ID of the campaign |
|
||||||
|
|
||||||
### `mailchimp_create_campaign`
|
### `mailchimp_create_campaign`
|
||||||
|
|
||||||
@@ -376,6 +410,9 @@ Create a new campaign in Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created campaign data |
|
| `output` | object | Created campaign data |
|
||||||
|
| ↳ `campaign` | json | Created campaign object |
|
||||||
|
| ↳ `campaign_id` | string | Created campaign ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_update_campaign`
|
### `mailchimp_update_campaign`
|
||||||
|
|
||||||
@@ -396,6 +433,9 @@ Update an existing campaign in Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated campaign data |
|
| `output` | object | Updated campaign data |
|
||||||
|
| ↳ `campaign` | object | Updated campaign object |
|
||||||
|
| ↳ `campaign_id` | string | Campaign ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_delete_campaign`
|
### `mailchimp_delete_campaign`
|
||||||
|
|
||||||
@@ -431,6 +471,7 @@ Send a Mailchimp campaign
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Send confirmation |
|
| `output` | object | Send confirmation |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_schedule_campaign`
|
### `mailchimp_schedule_campaign`
|
||||||
|
|
||||||
@@ -467,6 +508,7 @@ Unschedule a previously scheduled Mailchimp campaign
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Unschedule confirmation |
|
| `output` | object | Unschedule confirmation |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_replicate_campaign`
|
### `mailchimp_replicate_campaign`
|
||||||
|
|
||||||
@@ -485,6 +527,9 @@ Create a copy of an existing Mailchimp campaign
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Replicated campaign data |
|
| `output` | object | Replicated campaign data |
|
||||||
|
| ↳ `campaign` | object | Replicated campaign object |
|
||||||
|
| ↳ `campaign_id` | string | Campaign ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_get_campaign_content`
|
### `mailchimp_get_campaign_content`
|
||||||
|
|
||||||
@@ -503,6 +548,7 @@ Retrieve the HTML and plain-text content for a Mailchimp campaign
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the campaign content was successfully retrieved |
|
| `success` | boolean | Whether the campaign content was successfully retrieved |
|
||||||
| `output` | object | Campaign content data |
|
| `output` | object | Campaign content data |
|
||||||
|
| ↳ `content` | json | Campaign content object |
|
||||||
|
|
||||||
### `mailchimp_set_campaign_content`
|
### `mailchimp_set_campaign_content`
|
||||||
|
|
||||||
@@ -524,6 +570,8 @@ Set the content for a Mailchimp campaign
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Campaign content data |
|
| `output` | object | Campaign content data |
|
||||||
|
| ↳ `content` | object | Campaign content object |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_get_automations`
|
### `mailchimp_get_automations`
|
||||||
|
|
||||||
@@ -543,6 +591,9 @@ Retrieve a list of automations from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the automations were successfully retrieved |
|
| `success` | boolean | Whether the automations were successfully retrieved |
|
||||||
| `output` | object | Automations data |
|
| `output` | object | Automations data |
|
||||||
|
| ↳ `automations` | json | Array of automation objects |
|
||||||
|
| ↳ `total_items` | number | Total number of automations |
|
||||||
|
| ↳ `total_returned` | number | Number of automations returned in this response |
|
||||||
|
|
||||||
### `mailchimp_get_automation`
|
### `mailchimp_get_automation`
|
||||||
|
|
||||||
@@ -561,6 +612,8 @@ Retrieve details of a specific automation from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the automation was successfully retrieved |
|
| `success` | boolean | Whether the automation was successfully retrieved |
|
||||||
| `output` | object | Automation data |
|
| `output` | object | Automation data |
|
||||||
|
| ↳ `automation` | json | Automation object |
|
||||||
|
| ↳ `workflow_id` | string | The unique ID of the automation workflow |
|
||||||
|
|
||||||
### `mailchimp_start_automation`
|
### `mailchimp_start_automation`
|
||||||
|
|
||||||
@@ -579,6 +632,7 @@ Start all emails in a Mailchimp automation workflow
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Start confirmation |
|
| `output` | object | Start confirmation |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_pause_automation`
|
### `mailchimp_pause_automation`
|
||||||
|
|
||||||
@@ -597,6 +651,7 @@ Pause all emails in a Mailchimp automation workflow
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Pause confirmation |
|
| `output` | object | Pause confirmation |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_add_subscriber_to_automation`
|
### `mailchimp_add_subscriber_to_automation`
|
||||||
|
|
||||||
@@ -617,6 +672,8 @@ Manually add a subscriber to a workflow email queue
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Subscriber queue data |
|
| `output` | object | Subscriber queue data |
|
||||||
|
| ↳ `subscriber` | json | Subscriber object |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_get_templates`
|
### `mailchimp_get_templates`
|
||||||
|
|
||||||
@@ -636,6 +693,9 @@ Retrieve a list of templates from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the templates were successfully retrieved |
|
| `success` | boolean | Whether the templates were successfully retrieved |
|
||||||
| `output` | object | Templates data |
|
| `output` | object | Templates data |
|
||||||
|
| ↳ `templates` | json | Array of template objects |
|
||||||
|
| ↳ `total_items` | number | Total number of templates |
|
||||||
|
| ↳ `total_returned` | number | Number of templates returned in this response |
|
||||||
|
|
||||||
### `mailchimp_get_template`
|
### `mailchimp_get_template`
|
||||||
|
|
||||||
@@ -654,6 +714,8 @@ Retrieve details of a specific template from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the template was successfully retrieved |
|
| `success` | boolean | Whether the template was successfully retrieved |
|
||||||
| `output` | object | Template data |
|
| `output` | object | Template data |
|
||||||
|
| ↳ `template` | json | Template object |
|
||||||
|
| ↳ `template_id` | string | The unique ID of the template |
|
||||||
|
|
||||||
### `mailchimp_create_template`
|
### `mailchimp_create_template`
|
||||||
|
|
||||||
@@ -673,6 +735,9 @@ Create a new template in Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created template data |
|
| `output` | object | Created template data |
|
||||||
|
| ↳ `template` | json | Created template object |
|
||||||
|
| ↳ `template_id` | string | Created template ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_update_template`
|
### `mailchimp_update_template`
|
||||||
|
|
||||||
@@ -693,6 +758,9 @@ Update an existing template in Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated template data |
|
| `output` | object | Updated template data |
|
||||||
|
| ↳ `template` | object | Updated template object |
|
||||||
|
| ↳ `template_id` | string | Template ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_delete_template`
|
### `mailchimp_delete_template`
|
||||||
|
|
||||||
@@ -729,6 +797,9 @@ Retrieve a list of campaign reports from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the campaign reports were successfully retrieved |
|
| `success` | boolean | Whether the campaign reports were successfully retrieved |
|
||||||
| `output` | object | Campaign reports data |
|
| `output` | object | Campaign reports data |
|
||||||
|
| ↳ `reports` | json | Array of campaign report objects |
|
||||||
|
| ↳ `total_items` | number | Total number of reports |
|
||||||
|
| ↳ `total_returned` | number | Number of reports returned in this response |
|
||||||
|
|
||||||
### `mailchimp_get_campaign_report`
|
### `mailchimp_get_campaign_report`
|
||||||
|
|
||||||
@@ -747,6 +818,8 @@ Retrieve the report for a specific campaign from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the campaign report was successfully retrieved |
|
| `success` | boolean | Whether the campaign report was successfully retrieved |
|
||||||
| `output` | object | Campaign report data |
|
| `output` | object | Campaign report data |
|
||||||
|
| ↳ `report` | json | Campaign report object |
|
||||||
|
| ↳ `campaign_id` | string | The unique ID of the campaign |
|
||||||
|
|
||||||
### `mailchimp_get_segments`
|
### `mailchimp_get_segments`
|
||||||
|
|
||||||
@@ -767,6 +840,9 @@ Retrieve a list of segments from a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the segments were successfully retrieved |
|
| `success` | boolean | Whether the segments were successfully retrieved |
|
||||||
| `output` | object | Segments data |
|
| `output` | object | Segments data |
|
||||||
|
| ↳ `segments` | json | Array of segment objects |
|
||||||
|
| ↳ `total_items` | number | Total number of segments |
|
||||||
|
| ↳ `total_returned` | number | Number of segments returned in this response |
|
||||||
|
|
||||||
### `mailchimp_get_segment`
|
### `mailchimp_get_segment`
|
||||||
|
|
||||||
@@ -786,6 +862,8 @@ Retrieve details of a specific segment from a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the segment was successfully retrieved |
|
| `success` | boolean | Whether the segment was successfully retrieved |
|
||||||
| `output` | object | Segment data |
|
| `output` | object | Segment data |
|
||||||
|
| ↳ `segment` | json | Segment object |
|
||||||
|
| ↳ `segment_id` | string | The unique ID of the segment |
|
||||||
|
|
||||||
### `mailchimp_create_segment`
|
### `mailchimp_create_segment`
|
||||||
|
|
||||||
@@ -806,6 +884,9 @@ Create a new segment in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created segment data |
|
| `output` | object | Created segment data |
|
||||||
|
| ↳ `segment` | json | Created segment object |
|
||||||
|
| ↳ `segment_id` | string | Created segment ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_update_segment`
|
### `mailchimp_update_segment`
|
||||||
|
|
||||||
@@ -827,6 +908,9 @@ Update an existing segment in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated segment data |
|
| `output` | object | Updated segment data |
|
||||||
|
| ↳ `segment` | object | Updated segment object |
|
||||||
|
| ↳ `segment_id` | string | Segment ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_delete_segment`
|
### `mailchimp_delete_segment`
|
||||||
|
|
||||||
@@ -866,6 +950,9 @@ Retrieve members of a specific segment from a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the segment members were successfully retrieved |
|
| `success` | boolean | Whether the segment members were successfully retrieved |
|
||||||
| `output` | object | Segment members data |
|
| `output` | object | Segment members data |
|
||||||
|
| ↳ `members` | json | Array of member objects |
|
||||||
|
| ↳ `total_items` | number | Total number of members |
|
||||||
|
| ↳ `total_returned` | number | Number of members returned in this response |
|
||||||
|
|
||||||
### `mailchimp_add_segment_member`
|
### `mailchimp_add_segment_member`
|
||||||
|
|
||||||
@@ -886,6 +973,8 @@ Add a member to a specific segment in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Added member data |
|
| `output` | object | Added member data |
|
||||||
|
| ↳ `member` | json | Added member object |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_remove_segment_member`
|
### `mailchimp_remove_segment_member`
|
||||||
|
|
||||||
@@ -906,6 +995,7 @@ Remove a member from a specific segment in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Removal confirmation |
|
| `output` | object | Removal confirmation |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_get_member_tags`
|
### `mailchimp_get_member_tags`
|
||||||
|
|
||||||
@@ -925,6 +1015,9 @@ Retrieve tags associated with a member in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the member tags were successfully retrieved |
|
| `success` | boolean | Whether the member tags were successfully retrieved |
|
||||||
| `output` | object | Member tags data |
|
| `output` | object | Member tags data |
|
||||||
|
| ↳ `tags` | json | Array of tag objects |
|
||||||
|
| ↳ `total_items` | number | Total number of tags |
|
||||||
|
| ↳ `total_returned` | number | Number of tags returned in this response |
|
||||||
|
|
||||||
### `mailchimp_add_member_tags`
|
### `mailchimp_add_member_tags`
|
||||||
|
|
||||||
@@ -945,6 +1038,7 @@ Add tags to a member in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Tag addition confirmation |
|
| `output` | object | Tag addition confirmation |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_remove_member_tags`
|
### `mailchimp_remove_member_tags`
|
||||||
|
|
||||||
@@ -965,6 +1059,7 @@ Remove tags from a member in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Tag removal confirmation |
|
| `output` | object | Tag removal confirmation |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_get_merge_fields`
|
### `mailchimp_get_merge_fields`
|
||||||
|
|
||||||
@@ -985,6 +1080,9 @@ Retrieve a list of merge fields from a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the merge fields were successfully retrieved |
|
| `success` | boolean | Whether the merge fields were successfully retrieved |
|
||||||
| `output` | object | Merge fields data |
|
| `output` | object | Merge fields data |
|
||||||
|
| ↳ `mergeFields` | json | Array of merge field objects |
|
||||||
|
| ↳ `total_items` | number | Total number of merge fields |
|
||||||
|
| ↳ `total_returned` | number | Number of merge fields returned in this response |
|
||||||
|
|
||||||
### `mailchimp_get_merge_field`
|
### `mailchimp_get_merge_field`
|
||||||
|
|
||||||
@@ -1004,6 +1102,8 @@ Retrieve details of a specific merge field from a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the merge field was successfully retrieved |
|
| `success` | boolean | Whether the merge field was successfully retrieved |
|
||||||
| `output` | object | Merge field data |
|
| `output` | object | Merge field data |
|
||||||
|
| ↳ `mergeField` | json | Merge field object |
|
||||||
|
| ↳ `merge_id` | string | The unique ID of the merge field |
|
||||||
|
|
||||||
### `mailchimp_create_merge_field`
|
### `mailchimp_create_merge_field`
|
||||||
|
|
||||||
@@ -1024,6 +1124,9 @@ Create a new merge field in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created merge field data |
|
| `output` | object | Created merge field data |
|
||||||
|
| ↳ `mergeField` | json | Created merge field object |
|
||||||
|
| ↳ `merge_id` | string | Created merge field ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_update_merge_field`
|
### `mailchimp_update_merge_field`
|
||||||
|
|
||||||
@@ -1044,6 +1147,9 @@ Update an existing merge field in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated merge field data |
|
| `output` | object | Updated merge field data |
|
||||||
|
| ↳ `mergeField` | object | Updated merge field object |
|
||||||
|
| ↳ `merge_id` | string | Merge field ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_delete_merge_field`
|
### `mailchimp_delete_merge_field`
|
||||||
|
|
||||||
@@ -1082,6 +1188,9 @@ Retrieve a list of interest categories from a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the interest categories were successfully retrieved |
|
| `success` | boolean | Whether the interest categories were successfully retrieved |
|
||||||
| `output` | object | Interest categories data |
|
| `output` | object | Interest categories data |
|
||||||
|
| ↳ `categories` | json | Array of interest category objects |
|
||||||
|
| ↳ `total_items` | number | Total number of categories |
|
||||||
|
| ↳ `total_returned` | number | Number of categories returned in this response |
|
||||||
|
|
||||||
### `mailchimp_get_interest_category`
|
### `mailchimp_get_interest_category`
|
||||||
|
|
||||||
@@ -1101,6 +1210,8 @@ Retrieve details of a specific interest category from a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the interest category was successfully retrieved |
|
| `success` | boolean | Whether the interest category was successfully retrieved |
|
||||||
| `output` | object | Interest category data |
|
| `output` | object | Interest category data |
|
||||||
|
| ↳ `category` | json | Interest category object |
|
||||||
|
| ↳ `interest_category_id` | string | The unique ID of the interest category |
|
||||||
|
|
||||||
### `mailchimp_create_interest_category`
|
### `mailchimp_create_interest_category`
|
||||||
|
|
||||||
@@ -1121,6 +1232,9 @@ Create a new interest category in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created interest category data |
|
| `output` | object | Created interest category data |
|
||||||
|
| ↳ `category` | json | Created interest category object |
|
||||||
|
| ↳ `interest_category_id` | string | Created interest category ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_update_interest_category`
|
### `mailchimp_update_interest_category`
|
||||||
|
|
||||||
@@ -1141,6 +1255,9 @@ Update an existing interest category in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated interest category data |
|
| `output` | object | Updated interest category data |
|
||||||
|
| ↳ `category` | object | Updated interest category object |
|
||||||
|
| ↳ `interest_category_id` | string | Interest category ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_delete_interest_category`
|
### `mailchimp_delete_interest_category`
|
||||||
|
|
||||||
@@ -1180,6 +1297,9 @@ Retrieve a list of interests from an interest category in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the interests were successfully retrieved |
|
| `success` | boolean | Whether the interests were successfully retrieved |
|
||||||
| `output` | object | Interests data |
|
| `output` | object | Interests data |
|
||||||
|
| ↳ `interests` | json | Array of interest objects |
|
||||||
|
| ↳ `total_items` | number | Total number of interests |
|
||||||
|
| ↳ `total_returned` | number | Number of interests returned in this response |
|
||||||
|
|
||||||
### `mailchimp_get_interest`
|
### `mailchimp_get_interest`
|
||||||
|
|
||||||
@@ -1200,6 +1320,8 @@ Retrieve details of a specific interest from an interest category in a Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the interest was successfully retrieved |
|
| `success` | boolean | Whether the interest was successfully retrieved |
|
||||||
| `output` | object | Interest data |
|
| `output` | object | Interest data |
|
||||||
|
| ↳ `interest` | json | Interest object |
|
||||||
|
| ↳ `interest_id` | string | The unique ID of the interest |
|
||||||
|
|
||||||
### `mailchimp_create_interest`
|
### `mailchimp_create_interest`
|
||||||
|
|
||||||
@@ -1220,6 +1342,9 @@ Create a new interest in an interest category in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created interest data |
|
| `output` | object | Created interest data |
|
||||||
|
| ↳ `interest` | json | Created interest object |
|
||||||
|
| ↳ `interest_id` | string | Created interest ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_update_interest`
|
### `mailchimp_update_interest`
|
||||||
|
|
||||||
@@ -1241,6 +1366,9 @@ Update an existing interest in an interest category in a Mailchimp audience
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated interest data |
|
| `output` | object | Updated interest data |
|
||||||
|
| ↳ `interest` | object | Updated interest object |
|
||||||
|
| ↳ `interest_id` | string | Interest ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_delete_interest`
|
### `mailchimp_delete_interest`
|
||||||
|
|
||||||
@@ -1279,6 +1407,9 @@ Retrieve a list of landing pages from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the landing pages were successfully retrieved |
|
| `success` | boolean | Whether the landing pages were successfully retrieved |
|
||||||
| `output` | object | Landing pages data |
|
| `output` | object | Landing pages data |
|
||||||
|
| ↳ `landingPages` | json | Array of landing page objects |
|
||||||
|
| ↳ `total_items` | number | Total number of landing pages |
|
||||||
|
| ↳ `total_returned` | number | Number of landing pages returned in this response |
|
||||||
|
|
||||||
### `mailchimp_get_landing_page`
|
### `mailchimp_get_landing_page`
|
||||||
|
|
||||||
@@ -1297,6 +1428,8 @@ Retrieve details of a specific landing page from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the landing page was successfully retrieved |
|
| `success` | boolean | Whether the landing page was successfully retrieved |
|
||||||
| `output` | object | Landing page data |
|
| `output` | object | Landing page data |
|
||||||
|
| ↳ `landingPage` | json | Landing page object |
|
||||||
|
| ↳ `page_id` | string | The unique ID of the landing page |
|
||||||
|
|
||||||
### `mailchimp_create_landing_page`
|
### `mailchimp_create_landing_page`
|
||||||
|
|
||||||
@@ -1316,6 +1449,9 @@ Create a new landing page in Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created landing page data |
|
| `output` | object | Created landing page data |
|
||||||
|
| ↳ `landingPage` | json | Created landing page object |
|
||||||
|
| ↳ `page_id` | string | Created landing page ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_update_landing_page`
|
### `mailchimp_update_landing_page`
|
||||||
|
|
||||||
@@ -1335,6 +1471,9 @@ Update an existing landing page in Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated landing page data |
|
| `output` | object | Updated landing page data |
|
||||||
|
| ↳ `landingPage` | object | Updated landing page object |
|
||||||
|
| ↳ `page_id` | string | Landing page ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_delete_landing_page`
|
### `mailchimp_delete_landing_page`
|
||||||
|
|
||||||
@@ -1370,6 +1509,7 @@ Publish a landing page in Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Publish confirmation |
|
| `output` | object | Publish confirmation |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_unpublish_landing_page`
|
### `mailchimp_unpublish_landing_page`
|
||||||
|
|
||||||
@@ -1388,6 +1528,7 @@ Unpublish a landing page in Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Unpublish confirmation |
|
| `output` | object | Unpublish confirmation |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_get_batch_operations`
|
### `mailchimp_get_batch_operations`
|
||||||
|
|
||||||
@@ -1407,6 +1548,9 @@ Retrieve a list of batch operations from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the batch operations were successfully retrieved |
|
| `success` | boolean | Whether the batch operations were successfully retrieved |
|
||||||
| `output` | object | Batch operations data |
|
| `output` | object | Batch operations data |
|
||||||
|
| ↳ `batches` | json | Array of batch operation objects |
|
||||||
|
| ↳ `total_items` | number | Total number of batch operations |
|
||||||
|
| ↳ `total_returned` | number | Number of batch operations returned in this response |
|
||||||
|
|
||||||
### `mailchimp_get_batch_operation`
|
### `mailchimp_get_batch_operation`
|
||||||
|
|
||||||
@@ -1425,6 +1569,8 @@ Retrieve details of a specific batch operation from Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Whether the batch operation was successfully retrieved |
|
| `success` | boolean | Whether the batch operation was successfully retrieved |
|
||||||
| `output` | object | Batch operation data |
|
| `output` | object | Batch operation data |
|
||||||
|
| ↳ `batch` | json | Batch operation object |
|
||||||
|
| ↳ `batch_id` | string | The unique ID of the batch operation |
|
||||||
|
|
||||||
### `mailchimp_create_batch_operation`
|
### `mailchimp_create_batch_operation`
|
||||||
|
|
||||||
@@ -1443,6 +1589,9 @@ Create a new batch operation in Mailchimp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created batch operation data |
|
| `output` | object | Created batch operation data |
|
||||||
|
| ↳ `batch` | json | Created batch operation object |
|
||||||
|
| ↳ `batch_id` | string | Created batch operation ID |
|
||||||
|
| ↳ `success` | boolean | Operation success |
|
||||||
|
|
||||||
### `mailchimp_delete_batch_operation`
|
### `mailchimp_delete_batch_operation`
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,7 @@
|
|||||||
"jira_service_management",
|
"jira_service_management",
|
||||||
"kalshi",
|
"kalshi",
|
||||||
"knowledge",
|
"knowledge",
|
||||||
|
"langsmith",
|
||||||
"lemlist",
|
"lemlist",
|
||||||
"linear",
|
"linear",
|
||||||
"linkedin",
|
"linkedin",
|
||||||
@@ -103,6 +104,7 @@
|
|||||||
"supabase",
|
"supabase",
|
||||||
"tavily",
|
"tavily",
|
||||||
"telegram",
|
"telegram",
|
||||||
|
"tinybird",
|
||||||
"translate",
|
"translate",
|
||||||
"trello",
|
"trello",
|
||||||
"tts",
|
"tts",
|
||||||
|
|||||||
@@ -49,6 +49,11 @@ Read data from a Microsoft Excel spreadsheet
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `data` | object | Range data from the spreadsheet |
|
| `data` | object | Range data from the spreadsheet |
|
||||||
|
| ↳ `range` | string | The range that was read |
|
||||||
|
| ↳ `values` | array | Array of rows containing cell values |
|
||||||
|
| `metadata` | object | Spreadsheet metadata |
|
||||||
|
| ↳ `spreadsheetId` | string | The ID of the spreadsheet |
|
||||||
|
| ↳ `spreadsheetUrl` | string | URL to access the spreadsheet |
|
||||||
|
|
||||||
### `microsoft_excel_write`
|
### `microsoft_excel_write`
|
||||||
|
|
||||||
@@ -73,6 +78,8 @@ Write data to a Microsoft Excel spreadsheet
|
|||||||
| `updatedColumns` | number | Number of columns that were updated |
|
| `updatedColumns` | number | Number of columns that were updated |
|
||||||
| `updatedCells` | number | Number of cells that were updated |
|
| `updatedCells` | number | Number of cells that were updated |
|
||||||
| `metadata` | object | Spreadsheet metadata |
|
| `metadata` | object | Spreadsheet metadata |
|
||||||
|
| ↳ `spreadsheetId` | string | The ID of the spreadsheet |
|
||||||
|
| ↳ `spreadsheetUrl` | string | URL to access the spreadsheet |
|
||||||
|
|
||||||
### `microsoft_excel_table_add`
|
### `microsoft_excel_table_add`
|
||||||
|
|
||||||
@@ -93,6 +100,8 @@ Add new rows to a Microsoft Excel table
|
|||||||
| `index` | number | Index of the first row that was added |
|
| `index` | number | Index of the first row that was added |
|
||||||
| `values` | array | Array of rows that were added to the table |
|
| `values` | array | Array of rows that were added to the table |
|
||||||
| `metadata` | object | Spreadsheet metadata |
|
| `metadata` | object | Spreadsheet metadata |
|
||||||
|
| ↳ `spreadsheetId` | string | The ID of the spreadsheet |
|
||||||
|
| ↳ `spreadsheetUrl` | string | URL to access the spreadsheet |
|
||||||
|
|
||||||
### `microsoft_excel_worksheet_add`
|
### `microsoft_excel_worksheet_add`
|
||||||
|
|
||||||
@@ -110,5 +119,12 @@ Create a new worksheet (sheet) in a Microsoft Excel workbook
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `worksheet` | object | Details of the newly created worksheet |
|
| `worksheet` | object | Details of the newly created worksheet |
|
||||||
|
| ↳ `id` | string | The unique ID of the worksheet |
|
||||||
|
| ↳ `name` | string | The name of the worksheet |
|
||||||
|
| ↳ `position` | number | The zero-based position of the worksheet |
|
||||||
|
| ↳ `visibility` | string | The visibility state of the worksheet \(Visible/Hidden/VeryHidden\) |
|
||||||
|
| `metadata` | object | Spreadsheet metadata |
|
||||||
|
| ↳ `spreadsheetId` | string | The ID of the spreadsheet |
|
||||||
|
| ↳ `spreadsheetUrl` | string | URL to access the spreadsheet |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,9 @@ Read tasks from Microsoft Planner - get all user tasks or all tasks from a speci
|
|||||||
| `success` | boolean | Whether tasks were retrieved successfully |
|
| `success` | boolean | Whether tasks were retrieved successfully |
|
||||||
| `tasks` | array | Array of task objects with filtered properties |
|
| `tasks` | array | Array of task objects with filtered properties |
|
||||||
| `metadata` | object | Metadata including planId, userId, and planUrl |
|
| `metadata` | object | Metadata including planId, userId, and planUrl |
|
||||||
|
| ↳ `planId` | string | Plan ID |
|
||||||
|
| ↳ `userId` | string | User ID |
|
||||||
|
| ↳ `planUrl` | string | Microsoft Graph API URL for the plan |
|
||||||
|
|
||||||
### `microsoft_planner_create_task`
|
### `microsoft_planner_create_task`
|
||||||
|
|
||||||
@@ -73,6 +76,9 @@ Create a new task in Microsoft Planner
|
|||||||
| `success` | boolean | Whether the task was created successfully |
|
| `success` | boolean | Whether the task was created successfully |
|
||||||
| `task` | object | The created task object with all properties |
|
| `task` | object | The created task object with all properties |
|
||||||
| `metadata` | object | Metadata including planId, taskId, and taskUrl |
|
| `metadata` | object | Metadata including planId, taskId, and taskUrl |
|
||||||
|
| ↳ `planId` | string | Parent plan ID |
|
||||||
|
| ↳ `taskId` | string | Created task ID |
|
||||||
|
| ↳ `taskUrl` | string | Microsoft Graph API URL for the task |
|
||||||
|
|
||||||
### `microsoft_planner_update_task`
|
### `microsoft_planner_update_task`
|
||||||
|
|
||||||
@@ -102,6 +108,9 @@ Update a task in Microsoft Planner
|
|||||||
| `taskId` | string | ID of the updated task |
|
| `taskId` | string | ID of the updated task |
|
||||||
| `etag` | string | New ETag after update - use this for subsequent operations |
|
| `etag` | string | New ETag after update - use this for subsequent operations |
|
||||||
| `metadata` | object | Metadata including taskId, planId, and taskUrl |
|
| `metadata` | object | Metadata including taskId, planId, and taskUrl |
|
||||||
|
| ↳ `taskId` | string | Updated task ID |
|
||||||
|
| ↳ `planId` | string | Parent plan ID |
|
||||||
|
| ↳ `taskUrl` | string | Microsoft Graph API URL for the task |
|
||||||
|
|
||||||
### `microsoft_planner_delete_task`
|
### `microsoft_planner_delete_task`
|
||||||
|
|
||||||
@@ -138,6 +147,8 @@ List all plans shared with the current user
|
|||||||
| `success` | boolean | Whether plans were retrieved successfully |
|
| `success` | boolean | Whether plans were retrieved successfully |
|
||||||
| `plans` | array | Array of plan objects shared with the current user |
|
| `plans` | array | Array of plan objects shared with the current user |
|
||||||
| `metadata` | object | Metadata including userId and count |
|
| `metadata` | object | Metadata including userId and count |
|
||||||
|
| ↳ `count` | number | Number of plans returned |
|
||||||
|
| ↳ `userId` | string | User ID |
|
||||||
|
|
||||||
### `microsoft_planner_read_plan`
|
### `microsoft_planner_read_plan`
|
||||||
|
|
||||||
@@ -156,6 +167,8 @@ Get details of a specific Microsoft Planner plan
|
|||||||
| `success` | boolean | Whether the plan was retrieved successfully |
|
| `success` | boolean | Whether the plan was retrieved successfully |
|
||||||
| `plan` | object | The plan object with all properties |
|
| `plan` | object | The plan object with all properties |
|
||||||
| `metadata` | object | Metadata including planId and planUrl |
|
| `metadata` | object | Metadata including planId and planUrl |
|
||||||
|
| ↳ `planId` | string | Plan ID |
|
||||||
|
| ↳ `planUrl` | string | Microsoft Graph API URL for the plan |
|
||||||
|
|
||||||
### `microsoft_planner_list_buckets`
|
### `microsoft_planner_list_buckets`
|
||||||
|
|
||||||
@@ -174,6 +187,8 @@ List all buckets in a Microsoft Planner plan
|
|||||||
| `success` | boolean | Whether buckets were retrieved successfully |
|
| `success` | boolean | Whether buckets were retrieved successfully |
|
||||||
| `buckets` | array | Array of bucket objects |
|
| `buckets` | array | Array of bucket objects |
|
||||||
| `metadata` | object | Metadata including planId and count |
|
| `metadata` | object | Metadata including planId and count |
|
||||||
|
| ↳ `planId` | string | Plan ID |
|
||||||
|
| ↳ `count` | number | Number of buckets returned |
|
||||||
|
|
||||||
### `microsoft_planner_read_bucket`
|
### `microsoft_planner_read_bucket`
|
||||||
|
|
||||||
@@ -192,6 +207,8 @@ Get details of a specific bucket
|
|||||||
| `success` | boolean | Whether the bucket was retrieved successfully |
|
| `success` | boolean | Whether the bucket was retrieved successfully |
|
||||||
| `bucket` | object | The bucket object with all properties |
|
| `bucket` | object | The bucket object with all properties |
|
||||||
| `metadata` | object | Metadata including bucketId and planId |
|
| `metadata` | object | Metadata including bucketId and planId |
|
||||||
|
| ↳ `bucketId` | string | Bucket ID |
|
||||||
|
| ↳ `planId` | string | Parent plan ID |
|
||||||
|
|
||||||
### `microsoft_planner_create_bucket`
|
### `microsoft_planner_create_bucket`
|
||||||
|
|
||||||
@@ -211,6 +228,8 @@ Create a new bucket in a Microsoft Planner plan
|
|||||||
| `success` | boolean | Whether the bucket was created successfully |
|
| `success` | boolean | Whether the bucket was created successfully |
|
||||||
| `bucket` | object | The created bucket object with all properties |
|
| `bucket` | object | The created bucket object with all properties |
|
||||||
| `metadata` | object | Metadata including bucketId and planId |
|
| `metadata` | object | Metadata including bucketId and planId |
|
||||||
|
| ↳ `bucketId` | string | Created bucket ID |
|
||||||
|
| ↳ `planId` | string | Parent plan ID |
|
||||||
|
|
||||||
### `microsoft_planner_update_bucket`
|
### `microsoft_planner_update_bucket`
|
||||||
|
|
||||||
@@ -231,6 +250,8 @@ Update a bucket in Microsoft Planner
|
|||||||
| `success` | boolean | Whether the bucket was updated successfully |
|
| `success` | boolean | Whether the bucket was updated successfully |
|
||||||
| `bucket` | object | The updated bucket object with all properties |
|
| `bucket` | object | The updated bucket object with all properties |
|
||||||
| `metadata` | object | Metadata including bucketId and planId |
|
| `metadata` | object | Metadata including bucketId and planId |
|
||||||
|
| ↳ `bucketId` | string | Updated bucket ID |
|
||||||
|
| ↳ `planId` | string | Parent plan ID |
|
||||||
|
|
||||||
### `microsoft_planner_delete_bucket`
|
### `microsoft_planner_delete_bucket`
|
||||||
|
|
||||||
@@ -269,6 +290,7 @@ Get detailed information about a task including checklist and references
|
|||||||
| `taskDetails` | object | The task details including description, checklist, and references |
|
| `taskDetails` | object | The task details including description, checklist, and references |
|
||||||
| `etag` | string | The ETag value for this task details - use this for update operations |
|
| `etag` | string | The ETag value for this task details - use this for update operations |
|
||||||
| `metadata` | object | Metadata including taskId |
|
| `metadata` | object | Metadata including taskId |
|
||||||
|
| ↳ `taskId` | string | Task ID |
|
||||||
|
|
||||||
### `microsoft_planner_update_task_details`
|
### `microsoft_planner_update_task_details`
|
||||||
|
|
||||||
@@ -292,5 +314,6 @@ Update task details including description, checklist items, and references in Mi
|
|||||||
| `success` | boolean | Whether the task details were updated successfully |
|
| `success` | boolean | Whether the task details were updated successfully |
|
||||||
| `taskDetails` | object | The updated task details object with all properties |
|
| `taskDetails` | object | The updated task details object with all properties |
|
||||||
| `metadata` | object | Metadata including taskId |
|
| `metadata` | object | Metadata including taskId |
|
||||||
|
| ↳ `taskId` | string | Task ID |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -254,6 +254,15 @@ Get a specific message from a Microsoft Teams chat or channel
|
|||||||
| `success` | boolean | Whether the retrieval was successful |
|
| `success` | boolean | Whether the retrieval was successful |
|
||||||
| `content` | string | The message content |
|
| `content` | string | The message content |
|
||||||
| `metadata` | object | Message metadata including sender, timestamp, etc. |
|
| `metadata` | object | Message metadata including sender, timestamp, etc. |
|
||||||
|
| ↳ `messageId` | string | Message ID |
|
||||||
|
| ↳ `content` | string | Message content |
|
||||||
|
| ↳ `createdTime` | string | Message creation timestamp |
|
||||||
|
| ↳ `url` | string | Web URL to the message |
|
||||||
|
| ↳ `teamId` | string | Team ID |
|
||||||
|
| ↳ `channelId` | string | Channel ID |
|
||||||
|
| ↳ `chatId` | string | Chat ID |
|
||||||
|
| ↳ `messages` | array | Array of message details |
|
||||||
|
| ↳ `messageCount` | number | Number of messages |
|
||||||
|
|
||||||
### `microsoft_teams_set_reaction`
|
### `microsoft_teams_set_reaction`
|
||||||
|
|
||||||
|
|||||||
@@ -57,5 +57,15 @@ Parse PDF documents using Mistral OCR API
|
|||||||
| `success` | boolean | Whether the PDF was parsed successfully |
|
| `success` | boolean | Whether the PDF was parsed successfully |
|
||||||
| `content` | string | Extracted content in the requested format \(markdown, text, or JSON\) |
|
| `content` | string | Extracted content in the requested format \(markdown, text, or JSON\) |
|
||||||
| `metadata` | object | Processing metadata including jobId, fileType, pageCount, and usage info |
|
| `metadata` | object | Processing metadata including jobId, fileType, pageCount, and usage info |
|
||||||
|
| ↳ `jobId` | string | Unique job identifier |
|
||||||
|
| ↳ `fileType` | string | File type \(e.g., pdf\) |
|
||||||
|
| ↳ `fileName` | string | Original file name |
|
||||||
|
| ↳ `source` | string | Source type \(url\) |
|
||||||
|
| ↳ `pageCount` | number | Number of pages processed |
|
||||||
|
| ↳ `model` | string | Mistral model used |
|
||||||
|
| ↳ `resultType` | string | Output format \(markdown, text, json\) |
|
||||||
|
| ↳ `processedAt` | string | Processing timestamp |
|
||||||
|
| ↳ `sourceUrl` | string | Source URL if applicable |
|
||||||
|
| ↳ `usageInfo` | object | Usage statistics from OCR processing |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -116,6 +116,13 @@ Query and filter Notion database entries with advanced filtering
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | Array of Notion page objects from the database |
|
| `results` | array | Array of Notion page objects from the database |
|
||||||
|
| ↳ `id` | string | Page ID |
|
||||||
|
| ↳ `created_time` | string | Creation timestamp |
|
||||||
|
| ↳ `last_edited_time` | string | Last edit timestamp |
|
||||||
|
| ↳ `url` | string | Page URL |
|
||||||
|
| `has_more` | boolean | Whether more results are available |
|
||||||
|
| `next_cursor` | string | Cursor for pagination |
|
||||||
|
| `total_results` | number | Number of results returned |
|
||||||
|
|
||||||
### `notion_search`
|
### `notion_search`
|
||||||
|
|
||||||
@@ -134,6 +141,14 @@ Search across all pages and databases in Notion workspace
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | Array of search results \(pages and databases\) |
|
| `results` | array | Array of search results \(pages and databases\) |
|
||||||
|
| ↳ `id` | string | Object ID |
|
||||||
|
| ↳ `object` | string | Object type \(page or database\) |
|
||||||
|
| ↳ `url` | string | Object URL |
|
||||||
|
| ↳ `created_time` | string | Creation timestamp |
|
||||||
|
| ↳ `last_edited_time` | string | Last edit timestamp |
|
||||||
|
| `has_more` | boolean | Whether more results are available |
|
||||||
|
| `next_cursor` | string | Cursor for pagination |
|
||||||
|
| `total_results` | number | Number of results returned |
|
||||||
|
|
||||||
### `notion_create_database`
|
### `notion_create_database`
|
||||||
|
|
||||||
|
|||||||
@@ -54,5 +54,12 @@ Generate embeddings from text using OpenAI
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Embeddings generation results |
|
| `output` | object | Embeddings generation results |
|
||||||
|
| ↳ `embeddings` | array | Array of embedding vectors |
|
||||||
|
| ↳ `model` | string | Model used for generating embeddings |
|
||||||
|
| ↳ `usage` | object | Token usage information |
|
||||||
|
| ↳ `prompt_tokens` | number | Number of tokens in the prompt |
|
||||||
|
| ↳ `total_tokens` | number | Total number of tokens used |
|
||||||
|
| ↳ `prompt_tokens` | number | Number of tokens in the prompt |
|
||||||
|
| ↳ `total_tokens` | number | Total number of tokens used |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -135,6 +135,12 @@ Forward an existing Outlook message to specified recipients
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `results` | object | Delivery result details |
|
| `results` | object | Delivery result details |
|
||||||
|
| ↳ `status` | string | Delivery status of the email |
|
||||||
|
| ↳ `timestamp` | string | Timestamp when email was forwarded |
|
||||||
|
| ↳ `httpStatus` | number | HTTP status code returned by the API |
|
||||||
|
| ↳ `requestId` | string | Microsoft Graph request-id header for tracing |
|
||||||
|
| ↳ `messageId` | string | Forwarded message ID if provided by API |
|
||||||
|
| ↳ `internetMessageId` | string | RFC 822 Message-ID if provided |
|
||||||
|
|
||||||
### `outlook_move`
|
### `outlook_move`
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,9 @@ Search the web using Parallel AI. Provides comprehensive search results with int
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | Search results with excerpts from relevant pages |
|
| `results` | array | Search results with excerpts from relevant pages |
|
||||||
|
| ↳ `url` | string | The URL of the search result |
|
||||||
|
| ↳ `title` | string | The title of the search result |
|
||||||
|
| ↳ `excerpts` | array | Text excerpts from the page |
|
||||||
|
|
||||||
### `parallel_extract`
|
### `parallel_extract`
|
||||||
|
|
||||||
@@ -75,6 +78,10 @@ Extract targeted information from specific URLs using Parallel AI. Processes pro
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | Extracted information from the provided URLs |
|
| `results` | array | Extracted information from the provided URLs |
|
||||||
|
| ↳ `url` | string | The source URL |
|
||||||
|
| ↳ `title` | string | The title of the page |
|
||||||
|
| ↳ `content` | string | Extracted content |
|
||||||
|
| ↳ `excerpts` | array | Relevant text excerpts |
|
||||||
|
|
||||||
### `parallel_deep_research`
|
### `parallel_deep_research`
|
||||||
|
|
||||||
@@ -99,5 +106,15 @@ Conduct comprehensive deep research across the web using Parallel AI. Synthesize
|
|||||||
| `message` | string | Status message |
|
| `message` | string | Status message |
|
||||||
| `content` | object | Research results \(structured based on output_schema\) |
|
| `content` | object | Research results \(structured based on output_schema\) |
|
||||||
| `basis` | array | Citations and sources with reasoning and confidence levels |
|
| `basis` | array | Citations and sources with reasoning and confidence levels |
|
||||||
|
| ↳ `field` | string | Output field name |
|
||||||
|
| ↳ `reasoning` | string | Explanation for the result |
|
||||||
|
| ↳ `citations` | array | Array of sources |
|
||||||
|
| ↳ `url` | string | Source URL |
|
||||||
|
| ↳ `title` | string | Source title |
|
||||||
|
| ↳ `excerpts` | array | Relevant excerpts from the source |
|
||||||
|
| ↳ `url` | string | Source URL |
|
||||||
|
| ↳ `title` | string | Source title |
|
||||||
|
| ↳ `excerpts` | array | Relevant excerpts from the source |
|
||||||
|
| ↳ `confidence` | string | Confidence level indicator |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,9 @@ Generate completions using Perplexity AI chat models
|
|||||||
| `content` | string | Generated text content |
|
| `content` | string | Generated text content |
|
||||||
| `model` | string | Model used for generation |
|
| `model` | string | Model used for generation |
|
||||||
| `usage` | object | Token usage information |
|
| `usage` | object | Token usage information |
|
||||||
|
| ↳ `prompt_tokens` | number | Number of tokens in the prompt |
|
||||||
|
| ↳ `completion_tokens` | number | Number of tokens in the completion |
|
||||||
|
| ↳ `total_tokens` | number | Total number of tokens used |
|
||||||
|
|
||||||
### `perplexity_search`
|
### `perplexity_search`
|
||||||
|
|
||||||
@@ -81,5 +84,10 @@ Get ranked search results from Perplexity
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | Array of search results |
|
| `results` | array | Array of search results |
|
||||||
|
| ↳ `title` | string | Title of the search result |
|
||||||
|
| ↳ `url` | string | URL of the search result |
|
||||||
|
| ↳ `snippet` | string | Brief excerpt or summary of the content |
|
||||||
|
| ↳ `date` | string | Date the page was crawled and added to Perplexity |
|
||||||
|
| ↳ `last_updated` | string | Date the page was last updated in Perplexity |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -97,6 +97,13 @@ Search for similar text in a Pinecone index
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `matches` | array | Search results with ID, score, and metadata |
|
| `matches` | array | Search results with ID, score, and metadata |
|
||||||
|
| ↳ `id` | string | Vector ID |
|
||||||
|
| ↳ `score` | number | Similarity score |
|
||||||
|
| ↳ `metadata` | object | Associated metadata |
|
||||||
|
| `usage` | object | Usage statistics including tokens, read units, and rerank units |
|
||||||
|
| ↳ `total_tokens` | number | Total tokens used for embedding |
|
||||||
|
| ↳ `read_units` | number | Read units consumed |
|
||||||
|
| ↳ `rerank_units` | number | Rerank units used |
|
||||||
|
|
||||||
### `pinecone_search_vector`
|
### `pinecone_search_vector`
|
||||||
|
|
||||||
@@ -140,5 +147,14 @@ Fetch vectors by ID from a Pinecone index
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `matches` | array | Fetched vectors with ID, values, metadata, and score |
|
| `matches` | array | Fetched vectors with ID, values, metadata, and score |
|
||||||
|
| ↳ `id` | string | Vector ID |
|
||||||
|
| ↳ `values` | array | Vector values |
|
||||||
|
| ↳ `metadata` | object | Associated metadata |
|
||||||
|
| ↳ `score` | number | Match score \(1.0 for exact matches\) |
|
||||||
|
| `data` | array | Vector data with values and vector type |
|
||||||
|
| ↳ `values` | array | Vector values |
|
||||||
|
| ↳ `vector_type` | string | Vector type \(dense/sparse\) |
|
||||||
|
| `usage` | object | Usage statistics including total read units |
|
||||||
|
| ↳ `total_tokens` | number | Read units consumed |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,12 @@ List persons (users) in PostHog. Returns user profiles with their properties and
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `persons` | array | List of persons with their properties and identifiers |
|
| `persons` | array | List of persons with their properties and identifiers |
|
||||||
|
| ↳ `id` | string | Person ID |
|
||||||
|
| ↳ `name` | string | Person name |
|
||||||
|
| ↳ `distinct_ids` | array | All distinct IDs associated with this person |
|
||||||
|
| ↳ `created_at` | string | When the person was first seen |
|
||||||
|
| ↳ `uuid` | string | Person UUID |
|
||||||
|
| `next` | string | URL for the next page of results \(if available\) |
|
||||||
|
|
||||||
### `posthog_get_person`
|
### `posthog_get_person`
|
||||||
|
|
||||||
@@ -119,6 +125,11 @@ Get detailed information about a specific person in PostHog by their ID or UUID.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `person` | object | Person details including properties and identifiers |
|
| `person` | object | Person details including properties and identifiers |
|
||||||
|
| ↳ `id` | string | Person ID |
|
||||||
|
| ↳ `name` | string | Person name |
|
||||||
|
| ↳ `distinct_ids` | array | All distinct IDs associated with this person |
|
||||||
|
| ↳ `created_at` | string | When the person was first seen |
|
||||||
|
| ↳ `uuid` | string | Person UUID |
|
||||||
|
|
||||||
### `posthog_delete_person`
|
### `posthog_delete_person`
|
||||||
|
|
||||||
@@ -160,6 +171,10 @@ Execute a HogQL query in PostHog. HogQL is PostHog
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | Query results as an array of rows |
|
| `results` | array | Query results as an array of rows |
|
||||||
|
| `columns` | array | Column names in the result set |
|
||||||
|
| `types` | array | Data types of columns in the result set |
|
||||||
|
| `hogql` | string | The actual HogQL query that was executed |
|
||||||
|
| `has_more` | boolean | Whether there are more results available |
|
||||||
|
|
||||||
### `posthog_list_insights`
|
### `posthog_list_insights`
|
||||||
|
|
||||||
@@ -183,6 +198,17 @@ List all insights in a PostHog project. Returns insight configurations, filters,
|
|||||||
| `next` | string | URL for the next page of results |
|
| `next` | string | URL for the next page of results |
|
||||||
| `previous` | string | URL for the previous page of results |
|
| `previous` | string | URL for the previous page of results |
|
||||||
| `results` | array | List of insights with their configurations and metadata |
|
| `results` | array | List of insights with their configurations and metadata |
|
||||||
|
| ↳ `id` | number | Unique identifier for the insight |
|
||||||
|
| ↳ `name` | string | Name of the insight |
|
||||||
|
| ↳ `description` | string | Description of the insight |
|
||||||
|
| ↳ `filters` | object | Filter configuration for the insight |
|
||||||
|
| ↳ `query` | object | Query configuration for the insight |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp when insight was created |
|
||||||
|
| ↳ `created_by` | object | User who created the insight |
|
||||||
|
| ↳ `last_modified_at` | string | ISO timestamp when insight was last modified |
|
||||||
|
| ↳ `last_modified_by` | object | User who last modified the insight |
|
||||||
|
| ↳ `saved` | boolean | Whether the insight is saved |
|
||||||
|
| ↳ `dashboards` | array | IDs of dashboards this insight appears on |
|
||||||
|
|
||||||
### `posthog_get_insight`
|
### `posthog_get_insight`
|
||||||
|
|
||||||
@@ -271,6 +297,17 @@ List all dashboards in a PostHog project. Returns dashboard configurations, tile
|
|||||||
| `next` | string | URL for the next page of results |
|
| `next` | string | URL for the next page of results |
|
||||||
| `previous` | string | URL for the previous page of results |
|
| `previous` | string | URL for the previous page of results |
|
||||||
| `results` | array | List of dashboards with their configurations and metadata |
|
| `results` | array | List of dashboards with their configurations and metadata |
|
||||||
|
| ↳ `id` | number | Unique identifier for the dashboard |
|
||||||
|
| ↳ `name` | string | Name of the dashboard |
|
||||||
|
| ↳ `description` | string | Description of the dashboard |
|
||||||
|
| ↳ `pinned` | boolean | Whether the dashboard is pinned |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp when dashboard was created |
|
||||||
|
| ↳ `created_by` | object | User who created the dashboard |
|
||||||
|
| ↳ `last_modified_at` | string | ISO timestamp when dashboard was last modified |
|
||||||
|
| ↳ `last_modified_by` | object | User who last modified the dashboard |
|
||||||
|
| ↳ `tiles` | array | Tiles/widgets on the dashboard |
|
||||||
|
| ↳ `filters` | object | Global filters for the dashboard |
|
||||||
|
| ↳ `tags` | array | Tags associated with the dashboard |
|
||||||
|
|
||||||
### `posthog_get_dashboard`
|
### `posthog_get_dashboard`
|
||||||
|
|
||||||
@@ -324,6 +361,18 @@ List all actions in a PostHog project. Returns action definitions, steps, and me
|
|||||||
| `next` | string | URL for the next page of results |
|
| `next` | string | URL for the next page of results |
|
||||||
| `previous` | string | URL for the previous page of results |
|
| `previous` | string | URL for the previous page of results |
|
||||||
| `results` | array | List of actions with their definitions and metadata |
|
| `results` | array | List of actions with their definitions and metadata |
|
||||||
|
| ↳ `id` | number | Unique identifier for the action |
|
||||||
|
| ↳ `name` | string | Name of the action |
|
||||||
|
| ↳ `description` | string | Description of the action |
|
||||||
|
| ↳ `tags` | array | Tags associated with the action |
|
||||||
|
| ↳ `post_to_slack` | boolean | Whether to post this action to Slack |
|
||||||
|
| ↳ `slack_message_format` | string | Format string for Slack messages |
|
||||||
|
| ↳ `steps` | array | Steps that define the action |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp when action was created |
|
||||||
|
| ↳ `created_by` | object | User who created the action |
|
||||||
|
| ↳ `deleted` | boolean | Whether the action is deleted |
|
||||||
|
| ↳ `is_calculating` | boolean | Whether the action is being calculated |
|
||||||
|
| ↳ `last_calculated_at` | string | ISO timestamp of last calculation |
|
||||||
|
|
||||||
### `posthog_list_cohorts`
|
### `posthog_list_cohorts`
|
||||||
|
|
||||||
@@ -347,6 +396,20 @@ List all cohorts in a PostHog project. Returns cohort definitions, filters, and
|
|||||||
| `next` | string | URL for the next page of results |
|
| `next` | string | URL for the next page of results |
|
||||||
| `previous` | string | URL for the previous page of results |
|
| `previous` | string | URL for the previous page of results |
|
||||||
| `results` | array | List of cohorts with their definitions and metadata |
|
| `results` | array | List of cohorts with their definitions and metadata |
|
||||||
|
| ↳ `id` | number | Unique identifier for the cohort |
|
||||||
|
| ↳ `name` | string | Name of the cohort |
|
||||||
|
| ↳ `description` | string | Description of the cohort |
|
||||||
|
| ↳ `groups` | array | Groups that define the cohort |
|
||||||
|
| ↳ `deleted` | boolean | Whether the cohort is deleted |
|
||||||
|
| ↳ `filters` | object | Filter configuration for the cohort |
|
||||||
|
| ↳ `query` | object | Query configuration for the cohort |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp when cohort was created |
|
||||||
|
| ↳ `created_by` | object | User who created the cohort |
|
||||||
|
| ↳ `is_calculating` | boolean | Whether the cohort is being calculated |
|
||||||
|
| ↳ `last_calculation` | string | ISO timestamp of last calculation |
|
||||||
|
| ↳ `errors_calculating` | number | Number of errors during calculation |
|
||||||
|
| ↳ `count` | number | Number of users in the cohort |
|
||||||
|
| ↳ `is_static` | boolean | Whether the cohort is static |
|
||||||
|
|
||||||
### `posthog_get_cohort`
|
### `posthog_get_cohort`
|
||||||
|
|
||||||
@@ -439,6 +502,17 @@ List all annotations in a PostHog project. Returns annotation content, timestamp
|
|||||||
| `next` | string | URL for the next page of results |
|
| `next` | string | URL for the next page of results |
|
||||||
| `previous` | string | URL for the previous page of results |
|
| `previous` | string | URL for the previous page of results |
|
||||||
| `results` | array | List of annotations with their content and metadata |
|
| `results` | array | List of annotations with their content and metadata |
|
||||||
|
| ↳ `id` | number | Unique identifier for the annotation |
|
||||||
|
| ↳ `content` | string | Content/text of the annotation |
|
||||||
|
| ↳ `date_marker` | string | ISO timestamp marking when the annotation applies |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp when annotation was created |
|
||||||
|
| ↳ `updated_at` | string | ISO timestamp when annotation was last updated |
|
||||||
|
| ↳ `created_by` | object | User who created the annotation |
|
||||||
|
| ↳ `dashboard_item` | number | ID of dashboard item this annotation is attached to |
|
||||||
|
| ↳ `insight_short_id` | string | Short ID of the insight this annotation is attached to |
|
||||||
|
| ↳ `insight_name` | string | Name of the insight this annotation is attached to |
|
||||||
|
| ↳ `scope` | string | Scope of the annotation \(project or dashboard\) |
|
||||||
|
| ↳ `deleted` | boolean | Whether the annotation is deleted |
|
||||||
|
|
||||||
### `posthog_create_annotation`
|
### `posthog_create_annotation`
|
||||||
|
|
||||||
@@ -492,6 +566,20 @@ List all feature flags in a PostHog project
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | List of feature flags |
|
| `results` | array | List of feature flags |
|
||||||
|
| ↳ `id` | number | Feature flag ID |
|
||||||
|
| ↳ `name` | string | Feature flag name |
|
||||||
|
| ↳ `key` | string | Feature flag key |
|
||||||
|
| ↳ `filters` | object | Feature flag filters |
|
||||||
|
| ↳ `deleted` | boolean | Whether the flag is deleted |
|
||||||
|
| ↳ `active` | boolean | Whether the flag is active |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `created_by` | object | Creator information |
|
||||||
|
| ↳ `is_simple_flag` | boolean | Whether this is a simple flag |
|
||||||
|
| ↳ `rollout_percentage` | number | Rollout percentage \(if applicable\) |
|
||||||
|
| ↳ `ensure_experience_continuity` | boolean | Whether to ensure experience continuity |
|
||||||
|
| `count` | number | Total number of feature flags |
|
||||||
|
| `next` | string | URL to next page of results |
|
||||||
|
| `previous` | string | URL to previous page of results |
|
||||||
|
|
||||||
### `posthog_get_feature_flag`
|
### `posthog_get_feature_flag`
|
||||||
|
|
||||||
@@ -511,6 +599,19 @@ Get details of a specific feature flag
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `flag` | object | Feature flag details |
|
| `flag` | object | Feature flag details |
|
||||||
|
| ↳ `id` | number | Feature flag ID |
|
||||||
|
| ↳ `name` | string | Feature flag name |
|
||||||
|
| ↳ `key` | string | Feature flag key |
|
||||||
|
| ↳ `filters` | object | Feature flag filters |
|
||||||
|
| ↳ `deleted` | boolean | Whether the flag is deleted |
|
||||||
|
| ↳ `active` | boolean | Whether the flag is active |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `created_by` | object | Creator information |
|
||||||
|
| ↳ `is_simple_flag` | boolean | Whether this is a simple flag |
|
||||||
|
| ↳ `rollout_percentage` | number | Rollout percentage \(if applicable\) |
|
||||||
|
| ↳ `ensure_experience_continuity` | boolean | Whether to ensure experience continuity |
|
||||||
|
| ↳ `usage_dashboard` | number | Usage dashboard ID |
|
||||||
|
| ↳ `has_enriched_analytics` | boolean | Whether enriched analytics are enabled |
|
||||||
|
|
||||||
### `posthog_create_feature_flag`
|
### `posthog_create_feature_flag`
|
||||||
|
|
||||||
@@ -535,6 +636,17 @@ Create a new feature flag in PostHog
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `flag` | object | Created feature flag |
|
| `flag` | object | Created feature flag |
|
||||||
|
| ↳ `id` | number | Feature flag ID |
|
||||||
|
| ↳ `name` | string | Feature flag name |
|
||||||
|
| ↳ `key` | string | Feature flag key |
|
||||||
|
| ↳ `filters` | object | Feature flag filters |
|
||||||
|
| ↳ `deleted` | boolean | Whether the flag is deleted |
|
||||||
|
| ↳ `active` | boolean | Whether the flag is active |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `created_by` | object | Creator information |
|
||||||
|
| ↳ `is_simple_flag` | boolean | Whether this is a simple flag |
|
||||||
|
| ↳ `rollout_percentage` | number | Rollout percentage \(if applicable\) |
|
||||||
|
| ↳ `ensure_experience_continuity` | boolean | Whether to ensure experience continuity |
|
||||||
|
|
||||||
### `posthog_update_feature_flag`
|
### `posthog_update_feature_flag`
|
||||||
|
|
||||||
@@ -560,6 +672,17 @@ Update an existing feature flag in PostHog
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `flag` | object | Updated feature flag |
|
| `flag` | object | Updated feature flag |
|
||||||
|
| ↳ `id` | number | Feature flag ID |
|
||||||
|
| ↳ `name` | string | Feature flag name |
|
||||||
|
| ↳ `key` | string | Feature flag key |
|
||||||
|
| ↳ `filters` | object | Feature flag filters |
|
||||||
|
| ↳ `deleted` | boolean | Whether the flag is deleted |
|
||||||
|
| ↳ `active` | boolean | Whether the flag is active |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `created_by` | object | Creator information |
|
||||||
|
| ↳ `is_simple_flag` | boolean | Whether this is a simple flag |
|
||||||
|
| ↳ `rollout_percentage` | number | Rollout percentage \(if applicable\) |
|
||||||
|
| ↳ `ensure_experience_continuity` | boolean | Whether to ensure experience continuity |
|
||||||
|
|
||||||
### `posthog_delete_feature_flag`
|
### `posthog_delete_feature_flag`
|
||||||
|
|
||||||
@@ -623,6 +746,22 @@ List all experiments in a PostHog project
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | List of experiments |
|
| `results` | array | List of experiments |
|
||||||
|
| ↳ `id` | number | Experiment ID |
|
||||||
|
| ↳ `name` | string | Experiment name |
|
||||||
|
| ↳ `description` | string | Experiment description |
|
||||||
|
| ↳ `feature_flag_key` | string | Associated feature flag key |
|
||||||
|
| ↳ `feature_flag` | object | Feature flag details |
|
||||||
|
| ↳ `parameters` | object | Experiment parameters |
|
||||||
|
| ↳ `filters` | object | Experiment filters |
|
||||||
|
| ↳ `variants` | object | Experiment variants |
|
||||||
|
| ↳ `start_date` | string | Start date |
|
||||||
|
| ↳ `end_date` | string | End date |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `created_by` | object | Creator information |
|
||||||
|
| ↳ `archived` | boolean | Whether the experiment is archived |
|
||||||
|
| `count` | number | Total number of experiments |
|
||||||
|
| `next` | string | URL to next page of results |
|
||||||
|
| `previous` | string | URL to previous page of results |
|
||||||
|
|
||||||
### `posthog_get_experiment`
|
### `posthog_get_experiment`
|
||||||
|
|
||||||
@@ -642,6 +781,21 @@ Get details of a specific experiment
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `experiment` | object | Experiment details |
|
| `experiment` | object | Experiment details |
|
||||||
|
| ↳ `id` | number | Experiment ID |
|
||||||
|
| ↳ `name` | string | Experiment name |
|
||||||
|
| ↳ `description` | string | Experiment description |
|
||||||
|
| ↳ `feature_flag_key` | string | Associated feature flag key |
|
||||||
|
| ↳ `feature_flag` | object | Feature flag details |
|
||||||
|
| ↳ `parameters` | object | Experiment parameters |
|
||||||
|
| ↳ `filters` | object | Experiment filters |
|
||||||
|
| ↳ `variants` | object | Experiment variants |
|
||||||
|
| ↳ `start_date` | string | Start date |
|
||||||
|
| ↳ `end_date` | string | End date |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `created_by` | object | Creator information |
|
||||||
|
| ↳ `archived` | boolean | Whether the experiment is archived |
|
||||||
|
| ↳ `metrics` | array | Primary metrics |
|
||||||
|
| ↳ `metrics_secondary` | array | Secondary metrics |
|
||||||
|
|
||||||
### `posthog_create_experiment`
|
### `posthog_create_experiment`
|
||||||
|
|
||||||
@@ -668,6 +822,19 @@ Create a new experiment in PostHog
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `experiment` | object | Created experiment |
|
| `experiment` | object | Created experiment |
|
||||||
|
| ↳ `id` | number | Experiment ID |
|
||||||
|
| ↳ `name` | string | Experiment name |
|
||||||
|
| ↳ `description` | string | Experiment description |
|
||||||
|
| ↳ `feature_flag_key` | string | Associated feature flag key |
|
||||||
|
| ↳ `feature_flag` | object | Feature flag details |
|
||||||
|
| ↳ `parameters` | object | Experiment parameters |
|
||||||
|
| ↳ `filters` | object | Experiment filters |
|
||||||
|
| ↳ `variants` | object | Experiment variants |
|
||||||
|
| ↳ `start_date` | string | Start date |
|
||||||
|
| ↳ `end_date` | string | End date |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `created_by` | object | Creator information |
|
||||||
|
| ↳ `archived` | boolean | Whether the experiment is archived |
|
||||||
|
|
||||||
### `posthog_list_surveys`
|
### `posthog_list_surveys`
|
||||||
|
|
||||||
@@ -688,6 +855,18 @@ List all surveys in a PostHog project. Surveys allow you to collect feedback fro
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `surveys` | array | List of surveys in the project |
|
| `surveys` | array | List of surveys in the project |
|
||||||
|
| ↳ `id` | string | Survey ID |
|
||||||
|
| ↳ `name` | string | Survey name |
|
||||||
|
| ↳ `description` | string | Survey description |
|
||||||
|
| ↳ `type` | string | Survey type \(popover or api\) |
|
||||||
|
| ↳ `questions` | array | Survey questions |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `start_date` | string | Survey start date |
|
||||||
|
| ↳ `end_date` | string | Survey end date |
|
||||||
|
| ↳ `archived` | boolean | Whether survey is archived |
|
||||||
|
| `count` | number | Total number of surveys |
|
||||||
|
| `next` | string | URL for next page of results |
|
||||||
|
| `previous` | string | URL for previous page of results |
|
||||||
|
|
||||||
### `posthog_get_survey`
|
### `posthog_get_survey`
|
||||||
|
|
||||||
@@ -707,6 +886,19 @@ Get details of a specific survey in PostHog by ID.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `survey` | object | Survey details |
|
| `survey` | object | Survey details |
|
||||||
|
| ↳ `id` | string | Survey ID |
|
||||||
|
| ↳ `name` | string | Survey name |
|
||||||
|
| ↳ `description` | string | Survey description |
|
||||||
|
| ↳ `type` | string | Survey type \(popover or api\) |
|
||||||
|
| ↳ `questions` | array | Survey questions |
|
||||||
|
| ↳ `appearance` | object | Survey appearance configuration |
|
||||||
|
| ↳ `conditions` | object | Survey display conditions |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `created_by` | object | Creator information |
|
||||||
|
| ↳ `start_date` | string | Survey start date |
|
||||||
|
| ↳ `end_date` | string | Survey end date |
|
||||||
|
| ↳ `archived` | boolean | Whether survey is archived |
|
||||||
|
| ↳ `responses_limit` | number | Maximum number of responses |
|
||||||
|
|
||||||
### `posthog_create_survey`
|
### `posthog_create_survey`
|
||||||
|
|
||||||
@@ -736,6 +928,14 @@ Create a new survey in PostHog. Supports question types: Basic (open), Link, Rat
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `survey` | object | Created survey details |
|
| `survey` | object | Created survey details |
|
||||||
|
| ↳ `id` | string | Survey ID |
|
||||||
|
| ↳ `name` | string | Survey name |
|
||||||
|
| ↳ `description` | string | Survey description |
|
||||||
|
| ↳ `type` | string | Survey type \(popover or api\) |
|
||||||
|
| ↳ `questions` | array | Survey questions |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `start_date` | string | Survey start date |
|
||||||
|
| ↳ `end_date` | string | Survey end date |
|
||||||
|
|
||||||
### `posthog_update_survey`
|
### `posthog_update_survey`
|
||||||
|
|
||||||
@@ -767,6 +967,15 @@ Update an existing survey in PostHog. Can modify questions, appearance, conditio
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `survey` | object | Updated survey details |
|
| `survey` | object | Updated survey details |
|
||||||
|
| ↳ `id` | string | Survey ID |
|
||||||
|
| ↳ `name` | string | Survey name |
|
||||||
|
| ↳ `description` | string | Survey description |
|
||||||
|
| ↳ `type` | string | Survey type \(popover or api\) |
|
||||||
|
| ↳ `questions` | array | Survey questions |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `start_date` | string | Survey start date |
|
||||||
|
| ↳ `end_date` | string | Survey end date |
|
||||||
|
| ↳ `archived` | boolean | Whether survey is archived |
|
||||||
|
|
||||||
### `posthog_list_session_recordings`
|
### `posthog_list_session_recordings`
|
||||||
|
|
||||||
@@ -787,6 +996,23 @@ List session recordings in a PostHog project. Session recordings capture user in
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `recordings` | array | List of session recordings |
|
| `recordings` | array | List of session recordings |
|
||||||
|
| ↳ `id` | string | Recording ID |
|
||||||
|
| ↳ `distinct_id` | string | User distinct ID |
|
||||||
|
| ↳ `viewed` | boolean | Whether recording has been viewed |
|
||||||
|
| ↳ `recording_duration` | number | Recording duration in seconds |
|
||||||
|
| ↳ `active_seconds` | number | Active time in seconds |
|
||||||
|
| ↳ `inactive_seconds` | number | Inactive time in seconds |
|
||||||
|
| ↳ `start_time` | string | Recording start timestamp |
|
||||||
|
| ↳ `end_time` | string | Recording end timestamp |
|
||||||
|
| ↳ `click_count` | number | Number of clicks |
|
||||||
|
| ↳ `keypress_count` | number | Number of keypresses |
|
||||||
|
| ↳ `console_log_count` | number | Number of console logs |
|
||||||
|
| ↳ `console_warn_count` | number | Number of console warnings |
|
||||||
|
| ↳ `console_error_count` | number | Number of console errors |
|
||||||
|
| ↳ `person` | object | Person information |
|
||||||
|
| `count` | number | Total number of recordings |
|
||||||
|
| `next` | string | URL for next page of results |
|
||||||
|
| `previous` | string | URL for previous page of results |
|
||||||
|
|
||||||
### `posthog_get_session_recording`
|
### `posthog_get_session_recording`
|
||||||
|
|
||||||
@@ -806,6 +1032,22 @@ Get details of a specific session recording in PostHog by ID.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `recording` | object | Session recording details |
|
| `recording` | object | Session recording details |
|
||||||
|
| ↳ `id` | string | Recording ID |
|
||||||
|
| ↳ `distinct_id` | string | User distinct ID |
|
||||||
|
| ↳ `viewed` | boolean | Whether recording has been viewed |
|
||||||
|
| ↳ `recording_duration` | number | Recording duration in seconds |
|
||||||
|
| ↳ `active_seconds` | number | Active time in seconds |
|
||||||
|
| ↳ `inactive_seconds` | number | Inactive time in seconds |
|
||||||
|
| ↳ `start_time` | string | Recording start timestamp |
|
||||||
|
| ↳ `end_time` | string | Recording end timestamp |
|
||||||
|
| ↳ `click_count` | number | Number of clicks |
|
||||||
|
| ↳ `keypress_count` | number | Number of keypresses |
|
||||||
|
| ↳ `console_log_count` | number | Number of console logs |
|
||||||
|
| ↳ `console_warn_count` | number | Number of console warnings |
|
||||||
|
| ↳ `console_error_count` | number | Number of console errors |
|
||||||
|
| ↳ `start_url` | string | Starting URL of the recording |
|
||||||
|
| ↳ `person` | object | Person information |
|
||||||
|
| ↳ `matching_events` | array | Events that occurred during recording |
|
||||||
|
|
||||||
### `posthog_list_recording_playlists`
|
### `posthog_list_recording_playlists`
|
||||||
|
|
||||||
@@ -826,6 +1068,20 @@ List session recording playlists in a PostHog project. Playlists allow you to or
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `playlists` | array | List of session recording playlists |
|
| `playlists` | array | List of session recording playlists |
|
||||||
|
| ↳ `id` | string | Playlist ID |
|
||||||
|
| ↳ `short_id` | string | Playlist short ID |
|
||||||
|
| ↳ `name` | string | Playlist name |
|
||||||
|
| ↳ `description` | string | Playlist description |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `created_by` | object | Creator information |
|
||||||
|
| ↳ `deleted` | boolean | Whether playlist is deleted |
|
||||||
|
| ↳ `filters` | object | Playlist filters |
|
||||||
|
| ↳ `last_modified_at` | string | Last modification timestamp |
|
||||||
|
| ↳ `last_modified_by` | object | Last modifier information |
|
||||||
|
| ↳ `derived_name` | string | Auto-generated name from filters |
|
||||||
|
| `count` | number | Total number of playlists |
|
||||||
|
| `next` | string | URL for next page of results |
|
||||||
|
| `previous` | string | URL for previous page of results |
|
||||||
|
|
||||||
### `posthog_list_event_definitions`
|
### `posthog_list_event_definitions`
|
||||||
|
|
||||||
@@ -850,6 +1106,16 @@ List all event definitions in a PostHog project. Event definitions represent tra
|
|||||||
| `next` | string | URL for the next page of results |
|
| `next` | string | URL for the next page of results |
|
||||||
| `previous` | string | URL for the previous page of results |
|
| `previous` | string | URL for the previous page of results |
|
||||||
| `results` | array | List of event definitions |
|
| `results` | array | List of event definitions |
|
||||||
|
| ↳ `id` | string | Unique identifier for the event definition |
|
||||||
|
| ↳ `name` | string | Event name |
|
||||||
|
| ↳ `description` | string | Event description |
|
||||||
|
| ↳ `tags` | array | Tags associated with the event |
|
||||||
|
| ↳ `volume_30_day` | number | Number of events received in the last 30 days |
|
||||||
|
| ↳ `query_usage_30_day` | number | Number of times this event was queried in the last 30 days |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp when the event was created |
|
||||||
|
| ↳ `last_seen_at` | string | ISO timestamp when the event was last seen |
|
||||||
|
| ↳ `updated_at` | string | ISO timestamp when the event was updated |
|
||||||
|
| ↳ `updated_by` | object | User who last updated the event |
|
||||||
|
|
||||||
### `posthog_get_event_definition`
|
### `posthog_get_event_definition`
|
||||||
|
|
||||||
@@ -940,6 +1206,19 @@ List all property definitions in a PostHog project. Property definitions represe
|
|||||||
| `next` | string | URL for the next page of results |
|
| `next` | string | URL for the next page of results |
|
||||||
| `previous` | string | URL for the previous page of results |
|
| `previous` | string | URL for the previous page of results |
|
||||||
| `results` | array | List of property definitions |
|
| `results` | array | List of property definitions |
|
||||||
|
| ↳ `id` | string | Unique identifier for the property definition |
|
||||||
|
| ↳ `name` | string | Property name |
|
||||||
|
| ↳ `description` | string | Property description |
|
||||||
|
| ↳ `tags` | array | Tags associated with the property |
|
||||||
|
| ↳ `is_numerical` | boolean | Whether the property is numerical |
|
||||||
|
| ↳ `is_seen_on_filtered_events` | boolean | Whether the property is seen on filtered events |
|
||||||
|
| ↳ `property_type` | string | The data type of the property |
|
||||||
|
| ↳ `type` | string | Property type: event, person, or group |
|
||||||
|
| ↳ `volume_30_day` | number | Number of times property was seen in the last 30 days |
|
||||||
|
| ↳ `query_usage_30_day` | number | Number of times this property was queried in the last 30 days |
|
||||||
|
| ↳ `created_at` | string | ISO timestamp when the property was created |
|
||||||
|
| ↳ `updated_at` | string | ISO timestamp when the property was updated |
|
||||||
|
| ↳ `updated_by` | object | User who last updated the property |
|
||||||
|
|
||||||
### `posthog_get_property_definition`
|
### `posthog_get_property_definition`
|
||||||
|
|
||||||
@@ -1031,6 +1310,22 @@ List all projects in the organization. Returns project details including IDs, na
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `projects` | array | List of projects with their configuration and settings |
|
| `projects` | array | List of projects with their configuration and settings |
|
||||||
|
| ↳ `id` | number | Project ID |
|
||||||
|
| ↳ `uuid` | string | Project UUID |
|
||||||
|
| ↳ `organization` | string | Organization UUID |
|
||||||
|
| ↳ `api_token` | string | Project API token for ingestion |
|
||||||
|
| ↳ `app_urls` | array | Allowed app URLs |
|
||||||
|
| ↳ `name` | string | Project name |
|
||||||
|
| ↳ `slack_incoming_webhook` | string | Slack webhook URL for notifications |
|
||||||
|
| ↳ `created_at` | string | Project creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
| ↳ `anonymize_ips` | boolean | Whether IP anonymization is enabled |
|
||||||
|
| ↳ `completed_snippet_onboarding` | boolean | Whether snippet onboarding is completed |
|
||||||
|
| ↳ `ingested_event` | boolean | Whether any event has been ingested |
|
||||||
|
| ↳ `test_account_filters` | array | Filters for test accounts |
|
||||||
|
| ↳ `is_demo` | boolean | Whether this is a demo project |
|
||||||
|
| ↳ `timezone` | string | Project timezone |
|
||||||
|
| ↳ `data_attributes` | array | Custom data attributes |
|
||||||
|
|
||||||
### `posthog_get_project`
|
### `posthog_get_project`
|
||||||
|
|
||||||
@@ -1049,6 +1344,29 @@ Get detailed information about a specific project by ID. Returns comprehensive p
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `project` | object | Detailed project information with all configuration settings |
|
| `project` | object | Detailed project information with all configuration settings |
|
||||||
|
| ↳ `id` | number | Project ID |
|
||||||
|
| ↳ `uuid` | string | Project UUID |
|
||||||
|
| ↳ `organization` | string | Organization UUID |
|
||||||
|
| ↳ `api_token` | string | Project API token for ingestion |
|
||||||
|
| ↳ `app_urls` | array | Allowed app URLs |
|
||||||
|
| ↳ `name` | string | Project name |
|
||||||
|
| ↳ `slack_incoming_webhook` | string | Slack webhook URL for notifications |
|
||||||
|
| ↳ `created_at` | string | Project creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
| ↳ `anonymize_ips` | boolean | Whether IP anonymization is enabled |
|
||||||
|
| ↳ `completed_snippet_onboarding` | boolean | Whether snippet onboarding is completed |
|
||||||
|
| ↳ `ingested_event` | boolean | Whether any event has been ingested |
|
||||||
|
| ↳ `test_account_filters` | array | Filters for test accounts |
|
||||||
|
| ↳ `is_demo` | boolean | Whether this is a demo project |
|
||||||
|
| ↳ `timezone` | string | Project timezone |
|
||||||
|
| ↳ `data_attributes` | array | Custom data attributes |
|
||||||
|
| ↳ `person_display_name_properties` | array | Properties used for person display names |
|
||||||
|
| ↳ `correlation_config` | object | Configuration for correlation analysis |
|
||||||
|
| ↳ `autocapture_opt_out` | boolean | Whether autocapture is disabled |
|
||||||
|
| ↳ `autocapture_exceptions_opt_in` | boolean | Whether exception autocapture is enabled |
|
||||||
|
| ↳ `session_recording_opt_in` | boolean | Whether session recording is enabled |
|
||||||
|
| ↳ `capture_console_log_opt_in` | boolean | Whether console log capture is enabled |
|
||||||
|
| ↳ `capture_performance_opt_in` | boolean | Whether performance capture is enabled |
|
||||||
|
|
||||||
### `posthog_list_organizations`
|
### `posthog_list_organizations`
|
||||||
|
|
||||||
@@ -1066,6 +1384,15 @@ List all organizations the user has access to. Returns organization details incl
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `organizations` | array | List of organizations with their settings and features |
|
| `organizations` | array | List of organizations with their settings and features |
|
||||||
|
| ↳ `id` | string | Organization ID \(UUID\) |
|
||||||
|
| ↳ `name` | string | Organization name |
|
||||||
|
| ↳ `slug` | string | Organization slug |
|
||||||
|
| ↳ `created_at` | string | Organization creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
| ↳ `membership_level` | number | User membership level in organization |
|
||||||
|
| ↳ `plugins_access_level` | number | Access level for plugins/apps |
|
||||||
|
| ↳ `teams` | array | List of team IDs in this organization |
|
||||||
|
| ↳ `available_product_features` | array | Available product features and their limits |
|
||||||
|
|
||||||
### `posthog_get_organization`
|
### `posthog_get_organization`
|
||||||
|
|
||||||
@@ -1084,5 +1411,20 @@ Get detailed information about a specific organization by ID. Returns comprehens
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `organization` | object | Detailed organization information with settings and features |
|
| `organization` | object | Detailed organization information with settings and features |
|
||||||
|
| ↳ `id` | string | Organization ID \(UUID\) |
|
||||||
|
| ↳ `name` | string | Organization name |
|
||||||
|
| ↳ `slug` | string | Organization slug |
|
||||||
|
| ↳ `created_at` | string | Organization creation timestamp |
|
||||||
|
| ↳ `updated_at` | string | Last update timestamp |
|
||||||
|
| ↳ `membership_level` | number | User membership level in organization |
|
||||||
|
| ↳ `plugins_access_level` | number | Access level for plugins/apps |
|
||||||
|
| ↳ `teams` | array | List of team IDs in this organization |
|
||||||
|
| ↳ `available_product_features` | array | Available product features with their limits and descriptions |
|
||||||
|
| ↳ `domain_whitelist` | array | Whitelisted domains for organization |
|
||||||
|
| ↳ `is_member_join_email_enabled` | boolean | Whether member join emails are enabled |
|
||||||
|
| ↳ `metadata` | object | Organization metadata |
|
||||||
|
| ↳ `customer_id` | string | Customer ID for billing |
|
||||||
|
| ↳ `available_features` | array | List of available feature flags for organization |
|
||||||
|
| ↳ `usage` | object | Organization usage statistics |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,18 @@ Fetch posts from a subreddit with different sorting options
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `subreddit` | string | Name of the subreddit where posts were fetched from |
|
| `subreddit` | string | Name of the subreddit where posts were fetched from |
|
||||||
| `posts` | array | Array of posts with title, author, URL, score, comments count, and metadata |
|
| `posts` | array | Array of posts with title, author, URL, score, comments count, and metadata |
|
||||||
|
| ↳ `id` | string | Post ID |
|
||||||
|
| ↳ `title` | string | Post title |
|
||||||
|
| ↳ `author` | string | Author username |
|
||||||
|
| ↳ `url` | string | Post URL |
|
||||||
|
| ↳ `permalink` | string | Reddit permalink |
|
||||||
|
| ↳ `score` | number | Post score \(upvotes - downvotes\) |
|
||||||
|
| ↳ `num_comments` | number | Number of comments |
|
||||||
|
| ↳ `created_utc` | number | Creation timestamp \(UTC\) |
|
||||||
|
| ↳ `is_self` | boolean | Whether this is a text post |
|
||||||
|
| ↳ `selftext` | string | Text content for self posts |
|
||||||
|
| ↳ `thumbnail` | string | Thumbnail URL |
|
||||||
|
| ↳ `subreddit` | string | Subreddit name |
|
||||||
|
|
||||||
### `reddit_get_comments`
|
### `reddit_get_comments`
|
||||||
|
|
||||||
@@ -83,6 +95,21 @@ Fetch comments from a specific Reddit post
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `post` | object | Post information including ID, title, author, content, and metadata |
|
| `post` | object | Post information including ID, title, author, content, and metadata |
|
||||||
|
| ↳ `id` | string | Post ID |
|
||||||
|
| ↳ `title` | string | Post title |
|
||||||
|
| ↳ `author` | string | Post author |
|
||||||
|
| ↳ `selftext` | string | Post text content |
|
||||||
|
| ↳ `score` | number | Post score |
|
||||||
|
| ↳ `created_utc` | number | Creation timestamp |
|
||||||
|
| ↳ `permalink` | string | Reddit permalink |
|
||||||
|
| `comments` | array | Nested comments with author, body, score, timestamps, and replies |
|
||||||
|
| ↳ `id` | string | Comment ID |
|
||||||
|
| ↳ `author` | string | Comment author |
|
||||||
|
| ↳ `body` | string | Comment text |
|
||||||
|
| ↳ `score` | number | Comment score |
|
||||||
|
| ↳ `created_utc` | number | Creation timestamp |
|
||||||
|
| ↳ `permalink` | string | Comment permalink |
|
||||||
|
| ↳ `replies` | array | Nested reply comments |
|
||||||
|
|
||||||
### `reddit_get_controversial`
|
### `reddit_get_controversial`
|
||||||
|
|
||||||
@@ -107,6 +134,18 @@ Fetch controversial posts from a subreddit
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `subreddit` | string | Name of the subreddit where posts were fetched from |
|
| `subreddit` | string | Name of the subreddit where posts were fetched from |
|
||||||
| `posts` | array | Array of controversial posts with title, author, URL, score, comments count, and metadata |
|
| `posts` | array | Array of controversial posts with title, author, URL, score, comments count, and metadata |
|
||||||
|
| ↳ `id` | string | Post ID |
|
||||||
|
| ↳ `title` | string | Post title |
|
||||||
|
| ↳ `author` | string | Author username |
|
||||||
|
| ↳ `url` | string | Post URL |
|
||||||
|
| ↳ `permalink` | string | Reddit permalink |
|
||||||
|
| ↳ `score` | number | Post score \(upvotes - downvotes\) |
|
||||||
|
| ↳ `num_comments` | number | Number of comments |
|
||||||
|
| ↳ `created_utc` | number | Creation timestamp \(UTC\) |
|
||||||
|
| ↳ `is_self` | boolean | Whether this is a text post |
|
||||||
|
| ↳ `selftext` | string | Text content for self posts |
|
||||||
|
| ↳ `thumbnail` | string | Thumbnail URL |
|
||||||
|
| ↳ `subreddit` | string | Subreddit name |
|
||||||
|
|
||||||
### `reddit_search`
|
### `reddit_search`
|
||||||
|
|
||||||
@@ -133,6 +172,18 @@ Search for posts within a subreddit
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `subreddit` | string | Name of the subreddit where search was performed |
|
| `subreddit` | string | Name of the subreddit where search was performed |
|
||||||
| `posts` | array | Array of search result posts with title, author, URL, score, comments count, and metadata |
|
| `posts` | array | Array of search result posts with title, author, URL, score, comments count, and metadata |
|
||||||
|
| ↳ `id` | string | Post ID |
|
||||||
|
| ↳ `title` | string | Post title |
|
||||||
|
| ↳ `author` | string | Author username |
|
||||||
|
| ↳ `url` | string | Post URL |
|
||||||
|
| ↳ `permalink` | string | Reddit permalink |
|
||||||
|
| ↳ `score` | number | Post score \(upvotes - downvotes\) |
|
||||||
|
| ↳ `num_comments` | number | Number of comments |
|
||||||
|
| ↳ `created_utc` | number | Creation timestamp \(UTC\) |
|
||||||
|
| ↳ `is_self` | boolean | Whether this is a text post |
|
||||||
|
| ↳ `selftext` | string | Text content for self posts |
|
||||||
|
| ↳ `thumbnail` | string | Thumbnail URL |
|
||||||
|
| ↳ `subreddit` | string | Subreddit name |
|
||||||
|
|
||||||
### `reddit_submit_post`
|
### `reddit_submit_post`
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,11 @@ List objects in an AWS S3 bucket
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `objects` | array | List of S3 objects |
|
| `objects` | array | List of S3 objects |
|
||||||
|
| ↳ `key` | string | Object key |
|
||||||
|
| ↳ `size` | number | Object size in bytes |
|
||||||
|
| ↳ `lastModified` | string | Last modified timestamp |
|
||||||
|
| ↳ `etag` | string | Entity tag |
|
||||||
|
| `metadata` | object | Listing metadata including pagination info |
|
||||||
|
|
||||||
### `s3_delete_object`
|
### `s3_delete_object`
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,20 @@ Retrieve accounts from Salesforce CRM
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Accounts data |
|
| `output` | object | Accounts data |
|
||||||
|
| ↳ `accounts` | array | Array of account objects |
|
||||||
|
| ↳ `paging` | object | Pagination information |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL for next page of results |
|
||||||
|
| ↳ `totalSize` | number | Total number of records |
|
||||||
|
| ↳ `done` | boolean | Whether all records returned |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL for next page of results |
|
||||||
|
| ↳ `totalSize` | number | Total number of records |
|
||||||
|
| ↳ `done` | boolean | Whether all records returned |
|
||||||
|
| ↳ `metadata` | object | Response metadata |
|
||||||
|
| ↳ `totalReturned` | number | Number of accounts returned |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `totalReturned` | number | Number of accounts returned |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
|
||||||
### `salesforce_create_account`
|
### `salesforce_create_account`
|
||||||
|
|
||||||
@@ -84,6 +98,9 @@ Create a new account in Salesforce CRM
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created account data |
|
| `output` | object | Created account data |
|
||||||
|
| ↳ `id` | string | Created account ID |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
| ↳ `created` | boolean | Whether account was created |
|
||||||
|
|
||||||
### `salesforce_update_account`
|
### `salesforce_update_account`
|
||||||
|
|
||||||
@@ -116,6 +133,8 @@ Update an existing account in Salesforce CRM
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated account data |
|
| `output` | object | Updated account data |
|
||||||
|
| ↳ `id` | string | Updated account ID |
|
||||||
|
| ↳ `updated` | boolean | Whether account was updated |
|
||||||
|
|
||||||
### `salesforce_delete_account`
|
### `salesforce_delete_account`
|
||||||
|
|
||||||
@@ -135,6 +154,8 @@ Delete an account from Salesforce CRM
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Deleted account data |
|
| `output` | object | Deleted account data |
|
||||||
|
| ↳ `id` | string | Deleted account ID |
|
||||||
|
| ↳ `deleted` | boolean | Whether account was deleted |
|
||||||
|
|
||||||
### `salesforce_get_contacts`
|
### `salesforce_get_contacts`
|
||||||
|
|
||||||
@@ -157,6 +178,22 @@ Get contact(s) from Salesforce - single contact if ID provided, or list if not
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Contact\(s\) data |
|
| `output` | object | Contact\(s\) data |
|
||||||
|
| ↳ `contacts` | array | Array of contacts \(list query\) |
|
||||||
|
| ↳ `contact` | object | Single contact \(by ID\) |
|
||||||
|
| ↳ `paging` | object | Pagination information |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL for next page of results |
|
||||||
|
| ↳ `totalSize` | number | Total number of records |
|
||||||
|
| ↳ `done` | boolean | Whether all records returned |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL for next page of results |
|
||||||
|
| ↳ `totalSize` | number | Total number of records |
|
||||||
|
| ↳ `done` | boolean | Whether all records returned |
|
||||||
|
| ↳ `metadata` | object | Response metadata |
|
||||||
|
| ↳ `totalReturned` | number | Number of contacts returned |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `totalReturned` | number | Number of contacts returned |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `singleContact` | boolean | Whether single contact was returned |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
|
||||||
### `salesforce_create_contact`
|
### `salesforce_create_contact`
|
||||||
|
|
||||||
@@ -188,6 +225,9 @@ Create a new contact in Salesforce CRM
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created contact data |
|
| `output` | object | Created contact data |
|
||||||
|
| ↳ `id` | string | Created contact ID |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
| ↳ `created` | boolean | Whether contact was created |
|
||||||
|
|
||||||
### `salesforce_update_contact`
|
### `salesforce_update_contact`
|
||||||
|
|
||||||
@@ -220,6 +260,8 @@ Update an existing contact in Salesforce CRM
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated contact data |
|
| `output` | object | Updated contact data |
|
||||||
|
| ↳ `id` | string | Updated contact ID |
|
||||||
|
| ↳ `updated` | boolean | Whether contact was updated |
|
||||||
|
|
||||||
### `salesforce_delete_contact`
|
### `salesforce_delete_contact`
|
||||||
|
|
||||||
@@ -239,6 +281,8 @@ Delete a contact from Salesforce CRM
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Deleted contact data |
|
| `output` | object | Deleted contact data |
|
||||||
|
| ↳ `id` | string | Deleted contact ID |
|
||||||
|
| ↳ `deleted` | boolean | Whether contact was deleted |
|
||||||
|
|
||||||
### `salesforce_get_leads`
|
### `salesforce_get_leads`
|
||||||
|
|
||||||
@@ -261,6 +305,22 @@ Get lead(s) from Salesforce
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Lead data |
|
| `output` | object | Lead data |
|
||||||
|
| ↳ `lead` | object | Single lead object \(when leadId provided\) |
|
||||||
|
| ↳ `leads` | array | Array of lead objects \(when listing\) |
|
||||||
|
| ↳ `paging` | object | Pagination information |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL for next page of results |
|
||||||
|
| ↳ `totalSize` | number | Total number of records |
|
||||||
|
| ↳ `done` | boolean | Whether all records returned |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL for next page of results |
|
||||||
|
| ↳ `totalSize` | number | Total number of records |
|
||||||
|
| ↳ `done` | boolean | Whether all records returned |
|
||||||
|
| ↳ `metadata` | object | Response metadata |
|
||||||
|
| ↳ `totalReturned` | number | Number of leads returned |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `totalReturned` | number | Number of leads returned |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `singleLead` | boolean | Whether single lead was returned |
|
||||||
|
| ↳ `success` | boolean | Operation success status |
|
||||||
|
|
||||||
### `salesforce_create_lead`
|
### `salesforce_create_lead`
|
||||||
|
|
||||||
@@ -288,6 +348,9 @@ Create a new lead
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created lead data |
|
| `output` | object | Created lead data |
|
||||||
|
| ↳ `id` | string | Created lead ID |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
| ↳ `created` | boolean | Whether lead was created |
|
||||||
|
|
||||||
### `salesforce_update_lead`
|
### `salesforce_update_lead`
|
||||||
|
|
||||||
@@ -316,6 +379,8 @@ Update an existing lead
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated lead data |
|
| `output` | object | Updated lead data |
|
||||||
|
| ↳ `id` | string | Updated lead ID |
|
||||||
|
| ↳ `updated` | boolean | Whether lead was updated |
|
||||||
|
|
||||||
### `salesforce_delete_lead`
|
### `salesforce_delete_lead`
|
||||||
|
|
||||||
@@ -335,6 +400,8 @@ Delete a lead
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Deleted lead data |
|
| `output` | object | Deleted lead data |
|
||||||
|
| ↳ `id` | string | Deleted lead ID |
|
||||||
|
| ↳ `deleted` | boolean | Whether lead was deleted |
|
||||||
|
|
||||||
### `salesforce_get_opportunities`
|
### `salesforce_get_opportunities`
|
||||||
|
|
||||||
@@ -357,6 +424,21 @@ Get opportunity(ies) from Salesforce
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Opportunity data |
|
| `output` | object | Opportunity data |
|
||||||
|
| ↳ `opportunity` | object | Single opportunity object \(when opportunityId provided\) |
|
||||||
|
| ↳ `opportunities` | array | Array of opportunity objects \(when listing\) |
|
||||||
|
| ↳ `paging` | object | Pagination information |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL for next page of results |
|
||||||
|
| ↳ `totalSize` | number | Total number of records |
|
||||||
|
| ↳ `done` | boolean | Whether all records returned |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL for next page of results |
|
||||||
|
| ↳ `totalSize` | number | Total number of records |
|
||||||
|
| ↳ `done` | boolean | Whether all records returned |
|
||||||
|
| ↳ `metadata` | object | Response metadata |
|
||||||
|
| ↳ `totalReturned` | number | Number of opportunities returned |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `totalReturned` | number | Number of opportunities returned |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `success` | boolean | Operation success status |
|
||||||
|
|
||||||
### `salesforce_create_opportunity`
|
### `salesforce_create_opportunity`
|
||||||
|
|
||||||
@@ -382,6 +464,9 @@ Create a new opportunity
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created opportunity data |
|
| `output` | object | Created opportunity data |
|
||||||
|
| ↳ `id` | string | Created opportunity ID |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
| ↳ `created` | boolean | Whether opportunity was created |
|
||||||
|
|
||||||
### `salesforce_update_opportunity`
|
### `salesforce_update_opportunity`
|
||||||
|
|
||||||
@@ -408,6 +493,8 @@ Update an existing opportunity
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated opportunity data |
|
| `output` | object | Updated opportunity data |
|
||||||
|
| ↳ `id` | string | Updated opportunity ID |
|
||||||
|
| ↳ `updated` | boolean | Whether opportunity was updated |
|
||||||
|
|
||||||
### `salesforce_delete_opportunity`
|
### `salesforce_delete_opportunity`
|
||||||
|
|
||||||
@@ -427,6 +514,8 @@ Delete an opportunity
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Deleted opportunity data |
|
| `output` | object | Deleted opportunity data |
|
||||||
|
| ↳ `id` | string | Deleted opportunity ID |
|
||||||
|
| ↳ `deleted` | boolean | Whether opportunity was deleted |
|
||||||
|
|
||||||
### `salesforce_get_cases`
|
### `salesforce_get_cases`
|
||||||
|
|
||||||
@@ -449,6 +538,21 @@ Get case(s) from Salesforce
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Case data |
|
| `output` | object | Case data |
|
||||||
|
| ↳ `case` | object | Single case object \(when caseId provided\) |
|
||||||
|
| ↳ `cases` | array | Array of case objects \(when listing\) |
|
||||||
|
| ↳ `paging` | object | Pagination information |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL for next page of results |
|
||||||
|
| ↳ `totalSize` | number | Total number of records |
|
||||||
|
| ↳ `done` | boolean | Whether all records returned |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL for next page of results |
|
||||||
|
| ↳ `totalSize` | number | Total number of records |
|
||||||
|
| ↳ `done` | boolean | Whether all records returned |
|
||||||
|
| ↳ `metadata` | object | Response metadata |
|
||||||
|
| ↳ `totalReturned` | number | Number of cases returned |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `totalReturned` | number | Number of cases returned |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `success` | boolean | Operation success status |
|
||||||
|
|
||||||
### `salesforce_create_case`
|
### `salesforce_create_case`
|
||||||
|
|
||||||
@@ -474,6 +578,9 @@ Create a new case
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created case data |
|
| `output` | object | Created case data |
|
||||||
|
| ↳ `id` | string | Created case ID |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
| ↳ `created` | boolean | Whether case was created |
|
||||||
|
|
||||||
### `salesforce_update_case`
|
### `salesforce_update_case`
|
||||||
|
|
||||||
@@ -497,6 +604,8 @@ Update an existing case
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated case data |
|
| `output` | object | Updated case data |
|
||||||
|
| ↳ `id` | string | Updated case ID |
|
||||||
|
| ↳ `updated` | boolean | Whether case was updated |
|
||||||
|
|
||||||
### `salesforce_delete_case`
|
### `salesforce_delete_case`
|
||||||
|
|
||||||
@@ -516,6 +625,8 @@ Delete a case
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Deleted case data |
|
| `output` | object | Deleted case data |
|
||||||
|
| ↳ `id` | string | Deleted case ID |
|
||||||
|
| ↳ `deleted` | boolean | Whether case was deleted |
|
||||||
|
|
||||||
### `salesforce_get_tasks`
|
### `salesforce_get_tasks`
|
||||||
|
|
||||||
@@ -538,6 +649,21 @@ Get task(s) from Salesforce
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Task data |
|
| `output` | object | Task data |
|
||||||
|
| ↳ `task` | object | Single task object \(when taskId provided\) |
|
||||||
|
| ↳ `tasks` | array | Array of task objects \(when listing\) |
|
||||||
|
| ↳ `paging` | object | Pagination information |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL for next page of results |
|
||||||
|
| ↳ `totalSize` | number | Total number of records |
|
||||||
|
| ↳ `done` | boolean | Whether all records returned |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL for next page of results |
|
||||||
|
| ↳ `totalSize` | number | Total number of records |
|
||||||
|
| ↳ `done` | boolean | Whether all records returned |
|
||||||
|
| ↳ `metadata` | object | Response metadata |
|
||||||
|
| ↳ `totalReturned` | number | Number of tasks returned |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `totalReturned` | number | Number of tasks returned |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `success` | boolean | Operation success status |
|
||||||
|
|
||||||
### `salesforce_create_task`
|
### `salesforce_create_task`
|
||||||
|
|
||||||
@@ -563,6 +689,9 @@ Create a new task
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created task data |
|
| `output` | object | Created task data |
|
||||||
|
| ↳ `id` | string | Created task ID |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
| ↳ `created` | boolean | Whether task was created |
|
||||||
|
|
||||||
### `salesforce_update_task`
|
### `salesforce_update_task`
|
||||||
|
|
||||||
@@ -587,6 +716,8 @@ Update an existing task
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Updated task data |
|
| `output` | object | Updated task data |
|
||||||
|
| ↳ `id` | string | Updated task ID |
|
||||||
|
| ↳ `updated` | boolean | Whether task was updated |
|
||||||
|
|
||||||
### `salesforce_delete_task`
|
### `salesforce_delete_task`
|
||||||
|
|
||||||
@@ -606,6 +737,8 @@ Delete a task
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Deleted task data |
|
| `output` | object | Deleted task data |
|
||||||
|
| ↳ `id` | string | Deleted task ID |
|
||||||
|
| ↳ `deleted` | boolean | Whether task was deleted |
|
||||||
|
|
||||||
### `salesforce_list_reports`
|
### `salesforce_list_reports`
|
||||||
|
|
||||||
@@ -626,6 +759,9 @@ Get a list of reports accessible by the current user
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Reports data |
|
| `output` | object | Reports data |
|
||||||
|
| ↳ `reports` | array | Array of report objects |
|
||||||
|
| ↳ `totalReturned` | number | Number of reports returned |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
|
||||||
### `salesforce_get_report`
|
### `salesforce_get_report`
|
||||||
|
|
||||||
@@ -645,6 +781,9 @@ Get metadata and describe information for a specific report
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Report metadata |
|
| `output` | object | Report metadata |
|
||||||
|
| ↳ `report` | object | Report metadata object |
|
||||||
|
| ↳ `reportId` | string | Report ID |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
|
||||||
### `salesforce_run_report`
|
### `salesforce_run_report`
|
||||||
|
|
||||||
@@ -666,6 +805,17 @@ Execute a report and retrieve the results
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Report results |
|
| `output` | object | Report results |
|
||||||
|
| ↳ `reportId` | string | Report ID |
|
||||||
|
| ↳ `reportMetadata` | object | Report metadata |
|
||||||
|
| ↳ `reportExtendedMetadata` | object | Extended metadata |
|
||||||
|
| ↳ `factMap` | object | Report data organized by groupings |
|
||||||
|
| ↳ `groupingsDown` | object | Row groupings |
|
||||||
|
| ↳ `groupingsAcross` | object | Column groupings |
|
||||||
|
| ↳ `hasDetailRows` | boolean | Whether report has detail rows |
|
||||||
|
| ↳ `allData` | boolean | Whether all data is returned |
|
||||||
|
| ↳ `reportName` | string | Report name |
|
||||||
|
| ↳ `reportFormat` | string | Report format type |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
|
||||||
### `salesforce_list_report_types`
|
### `salesforce_list_report_types`
|
||||||
|
|
||||||
@@ -684,6 +834,9 @@ Get a list of available report types
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Report types data |
|
| `output` | object | Report types data |
|
||||||
|
| ↳ `reportTypes` | array | Array of report type objects |
|
||||||
|
| ↳ `totalReturned` | number | Number of report types returned |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
|
||||||
### `salesforce_list_dashboards`
|
### `salesforce_list_dashboards`
|
||||||
|
|
||||||
@@ -703,6 +856,9 @@ Get a list of dashboards accessible by the current user
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Dashboards data |
|
| `output` | object | Dashboards data |
|
||||||
|
| ↳ `dashboards` | array | Array of dashboard objects |
|
||||||
|
| ↳ `totalReturned` | number | Number of dashboards returned |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
|
||||||
### `salesforce_get_dashboard`
|
### `salesforce_get_dashboard`
|
||||||
|
|
||||||
@@ -722,6 +878,13 @@ Get details and results for a specific dashboard
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Dashboard data |
|
| `output` | object | Dashboard data |
|
||||||
|
| ↳ `dashboard` | object | Dashboard details |
|
||||||
|
| ↳ `dashboardId` | string | Dashboard ID |
|
||||||
|
| ↳ `components` | array | Dashboard component data |
|
||||||
|
| ↳ `dashboardName` | string | Dashboard name |
|
||||||
|
| ↳ `folderId` | string | Folder ID containing the dashboard |
|
||||||
|
| ↳ `runningUser` | object | Running user information |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
|
||||||
### `salesforce_refresh_dashboard`
|
### `salesforce_refresh_dashboard`
|
||||||
|
|
||||||
@@ -741,6 +904,13 @@ Refresh a dashboard to get the latest data
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Refreshed dashboard data |
|
| `output` | object | Refreshed dashboard data |
|
||||||
|
| ↳ `dashboard` | object | Dashboard details |
|
||||||
|
| ↳ `dashboardId` | string | Dashboard ID |
|
||||||
|
| ↳ `components` | array | Dashboard component data |
|
||||||
|
| ↳ `status` | object | Dashboard status |
|
||||||
|
| ↳ `dashboardName` | string | Dashboard name |
|
||||||
|
| ↳ `refreshDate` | string | Date when dashboard was refreshed |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
|
||||||
### `salesforce_query`
|
### `salesforce_query`
|
||||||
|
|
||||||
@@ -760,6 +930,17 @@ Execute a custom SOQL query to retrieve data from Salesforce
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Query results |
|
| `output` | object | Query results |
|
||||||
|
| ↳ `records` | array | Array of record objects |
|
||||||
|
| ↳ `totalSize` | number | Total number of records matching query |
|
||||||
|
| ↳ `done` | boolean | Whether all records have been returned |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL to fetch next batch of records |
|
||||||
|
| ↳ `query` | string | The executed SOQL query |
|
||||||
|
| ↳ `metadata` | object | Response metadata |
|
||||||
|
| ↳ `totalReturned` | number | Number of records returned in this response |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `totalReturned` | number | Number of records returned in this response |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
|
||||||
### `salesforce_query_more`
|
### `salesforce_query_more`
|
||||||
|
|
||||||
@@ -779,6 +960,16 @@ Retrieve additional query results using the nextRecordsUrl from a previous query
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Query results |
|
| `output` | object | Query results |
|
||||||
|
| ↳ `records` | array | Array of record objects |
|
||||||
|
| ↳ `totalSize` | number | Total number of records matching query |
|
||||||
|
| ↳ `done` | boolean | Whether all records have been returned |
|
||||||
|
| ↳ `nextRecordsUrl` | string | URL to fetch next batch of records |
|
||||||
|
| ↳ `metadata` | object | Response metadata |
|
||||||
|
| ↳ `totalReturned` | number | Number of records returned in this response |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `totalReturned` | number | Number of records returned in this response |
|
||||||
|
| ↳ `hasMore` | boolean | Whether more records exist |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
|
||||||
### `salesforce_describe_object`
|
### `salesforce_describe_object`
|
||||||
|
|
||||||
@@ -798,6 +989,19 @@ Get metadata and field information for a Salesforce object
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Object metadata |
|
| `output` | object | Object metadata |
|
||||||
|
| ↳ `objectName` | string | API name of the object |
|
||||||
|
| ↳ `label` | string | Display label |
|
||||||
|
| ↳ `labelPlural` | string | Plural display label |
|
||||||
|
| ↳ `fields` | array | Array of field definitions |
|
||||||
|
| ↳ `keyPrefix` | string | ID prefix for this object type |
|
||||||
|
| ↳ `queryable` | boolean | Whether object can be queried |
|
||||||
|
| ↳ `createable` | boolean | Whether records can be created |
|
||||||
|
| ↳ `updateable` | boolean | Whether records can be updated |
|
||||||
|
| ↳ `deletable` | boolean | Whether records can be deleted |
|
||||||
|
| ↳ `childRelationships` | array | Child relationship definitions |
|
||||||
|
| ↳ `recordTypeInfos` | array | Record type information |
|
||||||
|
| ↳ `fieldCount` | number | Number of fields in the object |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
|
||||||
### `salesforce_list_objects`
|
### `salesforce_list_objects`
|
||||||
|
|
||||||
@@ -816,5 +1020,10 @@ Get a list of all available Salesforce objects
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Objects list |
|
| `output` | object | Objects list |
|
||||||
|
| ↳ `objects` | array | Array of available Salesforce objects |
|
||||||
|
| ↳ `encoding` | string | Encoding used |
|
||||||
|
| ↳ `maxBatchSize` | number | Maximum batch size |
|
||||||
|
| ↳ `totalReturned` | number | Number of objects returned |
|
||||||
|
| ↳ `success` | boolean | Salesforce operation success |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -68,6 +68,50 @@ List issues from Sentry for a specific organization and optionally a specific pr
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `issues` | array | List of Sentry issues |
|
| `issues` | array | List of Sentry issues |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `shortId` | string | Short issue identifier |
|
||||||
|
| ↳ `title` | string | Issue title |
|
||||||
|
| ↳ `culprit` | string | Function or location that caused the issue |
|
||||||
|
| ↳ `permalink` | string | Direct link to the issue in Sentry |
|
||||||
|
| ↳ `logger` | string | Logger name that reported the issue |
|
||||||
|
| ↳ `level` | string | Severity level \(error, warning, info, etc.\) |
|
||||||
|
| ↳ `status` | string | Current issue status |
|
||||||
|
| ↳ `statusDetails` | object | Additional details about the status |
|
||||||
|
| ↳ `isPublic` | boolean | Whether the issue is publicly visible |
|
||||||
|
| ↳ `platform` | string | Project platform |
|
||||||
|
| ↳ `project` | object | Project information |
|
||||||
|
| ↳ `id` | string | Project ID |
|
||||||
|
| ↳ `name` | string | Project name |
|
||||||
|
| ↳ `slug` | string | Project slug |
|
||||||
|
| ↳ `platform` | string | Project platform |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `slug` | string | Project slug |
|
||||||
|
| ↳ `type` | string | Type of error \(e.g., TypeError\) |
|
||||||
|
| ↳ `metadata` | object | Error metadata |
|
||||||
|
| ↳ `type` | string | Type of error \(e.g., TypeError\) |
|
||||||
|
| ↳ `value` | string | Error message or value |
|
||||||
|
| ↳ `function` | string | Function where the error occurred |
|
||||||
|
| ↳ `value` | string | Error message or value |
|
||||||
|
| ↳ `function` | string | Function where the error occurred |
|
||||||
|
| ↳ `numComments` | number | Number of comments on the issue |
|
||||||
|
| ↳ `assignedTo` | object | User assigned to the issue |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `isBookmarked` | boolean | Whether the issue is bookmarked |
|
||||||
|
| ↳ `isSubscribed` | boolean | Whether subscribed to updates |
|
||||||
|
| ↳ `hasSeen` | boolean | Whether the user has seen this issue |
|
||||||
|
| ↳ `annotations` | array | Issue annotations |
|
||||||
|
| ↳ `isUnhandled` | boolean | Whether the issue is unhandled |
|
||||||
|
| ↳ `count` | string | Total number of occurrences |
|
||||||
|
| ↳ `userCount` | number | Number of unique users affected |
|
||||||
|
| ↳ `firstSeen` | string | When the issue was first seen \(ISO timestamp\) |
|
||||||
|
| ↳ `lastSeen` | string | When the issue was last seen \(ISO timestamp\) |
|
||||||
|
| ↳ `stats` | object | Statistical information about the issue |
|
||||||
|
| `metadata` | object | Pagination metadata |
|
||||||
|
| ↳ `nextCursor` | string | Cursor for the next page of results \(if available\) |
|
||||||
|
| ↳ `hasMore` | boolean | Whether there are more results available |
|
||||||
|
|
||||||
### `sentry_issues_get`
|
### `sentry_issues_get`
|
||||||
|
|
||||||
@@ -86,6 +130,47 @@ Retrieve detailed information about a specific Sentry issue by its ID. Returns c
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `issue` | object | Detailed information about the Sentry issue |
|
| `issue` | object | Detailed information about the Sentry issue |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `shortId` | string | Short issue identifier |
|
||||||
|
| ↳ `title` | string | Issue title |
|
||||||
|
| ↳ `culprit` | string | Function or location that caused the issue |
|
||||||
|
| ↳ `permalink` | string | Direct link to the issue in Sentry |
|
||||||
|
| ↳ `logger` | string | Logger name that reported the issue |
|
||||||
|
| ↳ `level` | string | Severity level \(error, warning, info, etc.\) |
|
||||||
|
| ↳ `status` | string | Current issue status |
|
||||||
|
| ↳ `statusDetails` | object | Additional details about the status |
|
||||||
|
| ↳ `isPublic` | boolean | Whether the issue is publicly visible |
|
||||||
|
| ↳ `platform` | string | Project platform |
|
||||||
|
| ↳ `project` | object | Project information |
|
||||||
|
| ↳ `id` | string | Project ID |
|
||||||
|
| ↳ `name` | string | Project name |
|
||||||
|
| ↳ `slug` | string | Project slug |
|
||||||
|
| ↳ `platform` | string | Project platform |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `slug` | string | Project slug |
|
||||||
|
| ↳ `type` | string | Type of error \(e.g., TypeError, ValueError\) |
|
||||||
|
| ↳ `metadata` | object | Error metadata |
|
||||||
|
| ↳ `type` | string | Type of error \(e.g., TypeError, ValueError\) |
|
||||||
|
| ↳ `value` | string | Error message or value |
|
||||||
|
| ↳ `function` | string | Function where the error occurred |
|
||||||
|
| ↳ `value` | string | Error message or value |
|
||||||
|
| ↳ `function` | string | Function where the error occurred |
|
||||||
|
| ↳ `numComments` | number | Number of comments on the issue |
|
||||||
|
| ↳ `assignedTo` | object | User assigned to the issue \(if any\) |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `isBookmarked` | boolean | Whether the issue is bookmarked |
|
||||||
|
| ↳ `isSubscribed` | boolean | Whether the user is subscribed to updates |
|
||||||
|
| ↳ `hasSeen` | boolean | Whether the user has seen this issue |
|
||||||
|
| ↳ `annotations` | array | Issue annotations |
|
||||||
|
| ↳ `isUnhandled` | boolean | Whether the issue is unhandled |
|
||||||
|
| ↳ `count` | string | Total number of occurrences |
|
||||||
|
| ↳ `userCount` | number | Number of unique users affected |
|
||||||
|
| ↳ `firstSeen` | string | When the issue was first seen \(ISO timestamp\) |
|
||||||
|
| ↳ `lastSeen` | string | When the issue was last seen \(ISO timestamp\) |
|
||||||
|
| ↳ `stats` | object | Statistical information about the issue |
|
||||||
|
|
||||||
### `sentry_issues_update`
|
### `sentry_issues_update`
|
||||||
|
|
||||||
@@ -109,6 +194,20 @@ Update a Sentry issue by changing its status, assignment, bookmark state, or oth
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `issue` | object | The updated Sentry issue |
|
| `issue` | object | The updated Sentry issue |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `shortId` | string | Short issue identifier |
|
||||||
|
| ↳ `title` | string | Issue title |
|
||||||
|
| ↳ `status` | string | Updated issue status |
|
||||||
|
| ↳ `assignedTo` | object | User assigned to the issue \(if any\) |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `isBookmarked` | boolean | Whether the issue is bookmarked |
|
||||||
|
| ↳ `isSubscribed` | boolean | Whether the user is subscribed to updates |
|
||||||
|
| ↳ `isPublic` | boolean | Whether the issue is publicly visible |
|
||||||
|
| ↳ `permalink` | string | Direct link to the issue in Sentry |
|
||||||
|
|
||||||
### `sentry_projects_list`
|
### `sentry_projects_list`
|
||||||
|
|
||||||
@@ -128,6 +227,27 @@ List all projects in a Sentry organization. Returns project details including na
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `projects` | array | List of Sentry projects |
|
| `projects` | array | List of Sentry projects |
|
||||||
|
| ↳ `id` | string | Team ID |
|
||||||
|
| ↳ `slug` | string | Team slug |
|
||||||
|
| ↳ `name` | string | Team name |
|
||||||
|
| ↳ `platform` | string | Platform/language \(e.g., javascript, python\) |
|
||||||
|
| ↳ `dateCreated` | string | When the project was created \(ISO timestamp\) |
|
||||||
|
| ↳ `isBookmarked` | boolean | Whether the project is bookmarked |
|
||||||
|
| ↳ `isMember` | boolean | Whether the user is a member of the project |
|
||||||
|
| ↳ `features` | array | Enabled features for the project |
|
||||||
|
| ↳ `organization` | object | Organization information |
|
||||||
|
| ↳ `id` | string | Organization ID |
|
||||||
|
| ↳ `slug` | string | Organization slug |
|
||||||
|
| ↳ `name` | string | Organization name |
|
||||||
|
| ↳ `teams` | array | Teams associated with the project |
|
||||||
|
| ↳ `id` | string | Team ID |
|
||||||
|
| ↳ `name` | string | Team name |
|
||||||
|
| ↳ `slug` | string | Team slug |
|
||||||
|
| ↳ `status` | string | Project status |
|
||||||
|
| ↳ `isPublic` | boolean | Whether the project is publicly visible |
|
||||||
|
| `metadata` | object | Pagination metadata |
|
||||||
|
| ↳ `nextCursor` | string | Cursor for the next page of results \(if available\) |
|
||||||
|
| ↳ `hasMore` | boolean | Whether there are more results available |
|
||||||
|
|
||||||
### `sentry_projects_get`
|
### `sentry_projects_get`
|
||||||
|
|
||||||
@@ -146,6 +266,39 @@ Retrieve detailed information about a specific Sentry project by its slug. Retur
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `project` | object | Detailed information about the Sentry project |
|
| `project` | object | Detailed information about the Sentry project |
|
||||||
|
| ↳ `id` | string | Team ID |
|
||||||
|
| ↳ `slug` | string | Team slug |
|
||||||
|
| ↳ `name` | string | Team name |
|
||||||
|
| ↳ `platform` | string | Platform/language \(e.g., javascript, python\) |
|
||||||
|
| ↳ `dateCreated` | string | When the project was created \(ISO timestamp\) |
|
||||||
|
| ↳ `isBookmarked` | boolean | Whether the project is bookmarked |
|
||||||
|
| ↳ `isMember` | boolean | Whether the user is a member of the project |
|
||||||
|
| ↳ `features` | array | Enabled features for the project |
|
||||||
|
| ↳ `firstEvent` | string | When the first event was received \(ISO timestamp\) |
|
||||||
|
| ↳ `firstTransactionEvent` | string | When the first transaction event was received |
|
||||||
|
| ↳ `access` | array | Access permissions |
|
||||||
|
| ↳ `organization` | object | Organization information |
|
||||||
|
| ↳ `id` | string | Organization ID |
|
||||||
|
| ↳ `slug` | string | Organization slug |
|
||||||
|
| ↳ `name` | string | Organization name |
|
||||||
|
| ↳ `team` | object | Primary team for the project |
|
||||||
|
| ↳ `id` | string | Team ID |
|
||||||
|
| ↳ `name` | string | Team name |
|
||||||
|
| ↳ `slug` | string | Team slug |
|
||||||
|
| ↳ `teams` | array | Teams associated with the project |
|
||||||
|
| ↳ `id` | string | Team ID |
|
||||||
|
| ↳ `name` | string | Team name |
|
||||||
|
| ↳ `slug` | string | Team slug |
|
||||||
|
| ↳ `status` | string | Project status |
|
||||||
|
| ↳ `color` | string | Project color code |
|
||||||
|
| ↳ `isPublic` | boolean | Whether the project is publicly visible |
|
||||||
|
| ↳ `isInternal` | boolean | Whether the project is internal |
|
||||||
|
| ↳ `hasAccess` | boolean | Whether the user has access to this project |
|
||||||
|
| ↳ `hasMinifiedStackTrace` | boolean | Whether minified stack traces are available |
|
||||||
|
| ↳ `hasMonitors` | boolean | Whether the project has monitors configured |
|
||||||
|
| ↳ `hasProfiles` | boolean | Whether the project has profiling enabled |
|
||||||
|
| ↳ `hasReplays` | boolean | Whether the project has session replays enabled |
|
||||||
|
| ↳ `hasSessions` | boolean | Whether the project has sessions enabled |
|
||||||
|
|
||||||
### `sentry_projects_create`
|
### `sentry_projects_create`
|
||||||
|
|
||||||
@@ -168,6 +321,31 @@ Create a new Sentry project in an organization. Requires a team to associate the
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `project` | object | The newly created Sentry project |
|
| `project` | object | The newly created Sentry project |
|
||||||
|
| ↳ `id` | string | Team ID |
|
||||||
|
| ↳ `slug` | string | Team slug |
|
||||||
|
| ↳ `name` | string | Team name |
|
||||||
|
| ↳ `platform` | string | Platform/language |
|
||||||
|
| ↳ `dateCreated` | string | When the project was created \(ISO timestamp\) |
|
||||||
|
| ↳ `isBookmarked` | boolean | Whether the project is bookmarked |
|
||||||
|
| ↳ `isMember` | boolean | Whether the user is a member |
|
||||||
|
| ↳ `hasAccess` | boolean | Whether the user has access |
|
||||||
|
| ↳ `features` | array | Enabled features |
|
||||||
|
| ↳ `firstEvent` | string | First event timestamp |
|
||||||
|
| ↳ `organization` | object | Organization information |
|
||||||
|
| ↳ `id` | string | Organization ID |
|
||||||
|
| ↳ `slug` | string | Organization slug |
|
||||||
|
| ↳ `name` | string | Organization name |
|
||||||
|
| ↳ `team` | object | Primary team for the project |
|
||||||
|
| ↳ `id` | string | Team ID |
|
||||||
|
| ↳ `name` | string | Team name |
|
||||||
|
| ↳ `slug` | string | Team slug |
|
||||||
|
| ↳ `teams` | array | Teams associated with the project |
|
||||||
|
| ↳ `id` | string | Team ID |
|
||||||
|
| ↳ `name` | string | Team name |
|
||||||
|
| ↳ `slug` | string | Team slug |
|
||||||
|
| ↳ `status` | string | Project status |
|
||||||
|
| ↳ `color` | string | Project color code |
|
||||||
|
| ↳ `isPublic` | boolean | Whether the project is public |
|
||||||
|
|
||||||
### `sentry_projects_update`
|
### `sentry_projects_update`
|
||||||
|
|
||||||
@@ -192,6 +370,19 @@ Update a Sentry project by changing its name, slug, platform, or other settings.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `project` | object | The updated Sentry project |
|
| `project` | object | The updated Sentry project |
|
||||||
|
| ↳ `id` | string | Team ID |
|
||||||
|
| ↳ `slug` | string | Team slug |
|
||||||
|
| ↳ `name` | string | Team name |
|
||||||
|
| ↳ `platform` | string | Platform/language |
|
||||||
|
| ↳ `isBookmarked` | boolean | Whether the project is bookmarked |
|
||||||
|
| ↳ `organization` | object | Organization information |
|
||||||
|
| ↳ `id` | string | Organization ID |
|
||||||
|
| ↳ `slug` | string | Organization slug |
|
||||||
|
| ↳ `name` | string | Organization name |
|
||||||
|
| ↳ `teams` | array | Teams associated with the project |
|
||||||
|
| ↳ `id` | string | Team ID |
|
||||||
|
| ↳ `name` | string | Team name |
|
||||||
|
| ↳ `slug` | string | Team slug |
|
||||||
|
|
||||||
### `sentry_events_list`
|
### `sentry_events_list`
|
||||||
|
|
||||||
@@ -215,6 +406,50 @@ List events from a Sentry project. Can be filtered by issue ID, query, or time p
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `events` | array | List of Sentry events |
|
| `events` | array | List of Sentry events |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `eventID` | string | Event identifier |
|
||||||
|
| ↳ `projectID` | string | Project ID |
|
||||||
|
| ↳ `groupID` | string | Issue group ID |
|
||||||
|
| ↳ `message` | string | Event message |
|
||||||
|
| ↳ `title` | string | Event title |
|
||||||
|
| ↳ `location` | string | Location information |
|
||||||
|
| ↳ `culprit` | string | Function or location that caused the event |
|
||||||
|
| ↳ `dateCreated` | string | When the event was created \(ISO timestamp\) |
|
||||||
|
| ↳ `dateReceived` | string | When Sentry received the event \(ISO timestamp\) |
|
||||||
|
| ↳ `user` | object | User information associated with the event |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `username` | string | Username |
|
||||||
|
| ↳ `ipAddress` | string | IP address |
|
||||||
|
| ↳ `name` | string | User display name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `username` | string | Username |
|
||||||
|
| ↳ `ipAddress` | string | IP address |
|
||||||
|
| ↳ `name` | string | SDK name |
|
||||||
|
| ↳ `tags` | array | Tags associated with the event |
|
||||||
|
| ↳ `key` | string | Tag key |
|
||||||
|
| ↳ `value` | string | Tag value |
|
||||||
|
| ↳ `key` | string | Tag key |
|
||||||
|
| ↳ `value` | string | Error message or value |
|
||||||
|
| ↳ `contexts` | object | Additional context data \(device, OS, etc.\) |
|
||||||
|
| ↳ `platform` | string | Platform where the event occurred |
|
||||||
|
| ↳ `type` | string | Type of error \(e.g., TypeError\) |
|
||||||
|
| ↳ `metadata` | object | Error metadata |
|
||||||
|
| ↳ `type` | string | Type of error \(e.g., TypeError\) |
|
||||||
|
| ↳ `value` | string | Error message or value |
|
||||||
|
| ↳ `function` | string | Function where the error occurred |
|
||||||
|
| ↳ `function` | string | Function where the error occurred |
|
||||||
|
| ↳ `entries` | array | Event entries \(exception, breadcrumbs, etc.\) |
|
||||||
|
| ↳ `errors` | array | Processing errors |
|
||||||
|
| ↳ `dist` | string | Distribution identifier |
|
||||||
|
| ↳ `fingerprints` | array | Fingerprints for grouping |
|
||||||
|
| ↳ `sdk` | object | SDK information |
|
||||||
|
| ↳ `name` | string | SDK name |
|
||||||
|
| ↳ `version` | string | SDK version |
|
||||||
|
| ↳ `version` | string | SDK version |
|
||||||
|
| `metadata` | object | Pagination metadata |
|
||||||
|
| ↳ `nextCursor` | string | Cursor for the next page of results \(if available\) |
|
||||||
|
| ↳ `hasMore` | boolean | Whether there are more results available |
|
||||||
|
|
||||||
### `sentry_events_get`
|
### `sentry_events_get`
|
||||||
|
|
||||||
@@ -234,6 +469,47 @@ Retrieve detailed information about a specific Sentry event by its ID. Returns c
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `event` | object | Detailed information about the Sentry event |
|
| `event` | object | Detailed information about the Sentry event |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `eventID` | string | Event identifier |
|
||||||
|
| ↳ `projectID` | string | Project ID |
|
||||||
|
| ↳ `groupID` | string | Issue group ID this event belongs to |
|
||||||
|
| ↳ `message` | string | Event message |
|
||||||
|
| ↳ `title` | string | Event title |
|
||||||
|
| ↳ `location` | string | Location information |
|
||||||
|
| ↳ `culprit` | string | Function or location that caused the event |
|
||||||
|
| ↳ `dateCreated` | string | When the event was created \(ISO timestamp\) |
|
||||||
|
| ↳ `dateReceived` | string | When Sentry received the event \(ISO timestamp\) |
|
||||||
|
| ↳ `user` | object | User information associated with the event |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `username` | string | Username |
|
||||||
|
| ↳ `ipAddress` | string | IP address |
|
||||||
|
| ↳ `name` | string | User display name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `username` | string | Username |
|
||||||
|
| ↳ `ipAddress` | string | IP address |
|
||||||
|
| ↳ `name` | string | SDK name |
|
||||||
|
| ↳ `tags` | array | Tags associated with the event |
|
||||||
|
| ↳ `key` | string | Tag key |
|
||||||
|
| ↳ `value` | string | Tag value |
|
||||||
|
| ↳ `key` | string | Tag key |
|
||||||
|
| ↳ `value` | string | Error message or value |
|
||||||
|
| ↳ `contexts` | object | Additional context data \(device, OS, browser, etc.\) |
|
||||||
|
| ↳ `platform` | string | Platform where the event occurred |
|
||||||
|
| ↳ `type` | string | Type of error \(e.g., TypeError, ValueError\) |
|
||||||
|
| ↳ `metadata` | object | Error metadata |
|
||||||
|
| ↳ `type` | string | Type of error \(e.g., TypeError, ValueError\) |
|
||||||
|
| ↳ `value` | string | Error message or value |
|
||||||
|
| ↳ `function` | string | Function where the error occurred |
|
||||||
|
| ↳ `function` | string | Function where the error occurred |
|
||||||
|
| ↳ `entries` | array | Event entries including exception, breadcrumbs, and request data |
|
||||||
|
| ↳ `errors` | array | Processing errors that occurred |
|
||||||
|
| ↳ `dist` | string | Distribution identifier |
|
||||||
|
| ↳ `fingerprints` | array | Fingerprints used for grouping events |
|
||||||
|
| ↳ `sdk` | object | SDK information |
|
||||||
|
| ↳ `name` | string | SDK name |
|
||||||
|
| ↳ `version` | string | SDK version |
|
||||||
|
| ↳ `version` | string | SDK version |
|
||||||
|
|
||||||
### `sentry_releases_list`
|
### `sentry_releases_list`
|
||||||
|
|
||||||
@@ -255,6 +531,61 @@ List releases for a Sentry organization or project. Returns release details incl
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `releases` | array | List of Sentry releases |
|
| `releases` | array | List of Sentry releases |
|
||||||
|
| ↳ `id` | string | Project ID |
|
||||||
|
| ↳ `version` | object | Version details |
|
||||||
|
| ↳ `raw` | string | Raw version string |
|
||||||
|
| ↳ `shortVersion` | string | Shortened version identifier |
|
||||||
|
| ↳ `ref` | string | Git reference \(commit SHA, tag, or branch\) |
|
||||||
|
| ↳ `url` | string | URL to the release \(e.g., GitHub release page\) |
|
||||||
|
| ↳ `dateReleased` | string | When the release was deployed \(ISO timestamp\) |
|
||||||
|
| ↳ `dateCreated` | string | Commit timestamp |
|
||||||
|
| ↳ `dateStarted` | string | Deploy start timestamp |
|
||||||
|
| ↳ `newGroups` | number | Number of new issues introduced in this release |
|
||||||
|
| ↳ `owner` | object | Owner of the release |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | User name |
|
||||||
|
| ↳ `email` | string | User email |
|
||||||
|
| ↳ `name` | string | Project name |
|
||||||
|
| ↳ `email` | string | Author email |
|
||||||
|
| ↳ `commitCount` | number | Number of commits in this release |
|
||||||
|
| ↳ `deployCount` | number | Number of deploys for this release |
|
||||||
|
| ↳ `lastCommit` | object | Last commit in the release |
|
||||||
|
| ↳ `id` | string | Commit SHA |
|
||||||
|
| ↳ `message` | string | Commit message |
|
||||||
|
| ↳ `dateCreated` | string | Commit timestamp |
|
||||||
|
| ↳ `message` | string | Commit message |
|
||||||
|
| ↳ `lastDeploy` | object | Last deploy of the release |
|
||||||
|
| ↳ `id` | string | Deploy ID |
|
||||||
|
| ↳ `environment` | string | Deploy environment |
|
||||||
|
| ↳ `dateStarted` | string | Deploy start timestamp |
|
||||||
|
| ↳ `dateFinished` | string | Deploy finish timestamp |
|
||||||
|
| ↳ `environment` | string | Deploy environment |
|
||||||
|
| ↳ `dateFinished` | string | Deploy finish timestamp |
|
||||||
|
| ↳ `authors` | array | Authors of commits in the release |
|
||||||
|
| ↳ `id` | string | Author ID |
|
||||||
|
| ↳ `name` | string | Author name |
|
||||||
|
| ↳ `email` | string | Author email |
|
||||||
|
| ↳ `projects` | array | Projects associated with this release |
|
||||||
|
| ↳ `id` | string | Project ID |
|
||||||
|
| ↳ `name` | string | Project name |
|
||||||
|
| ↳ `slug` | string | Project slug |
|
||||||
|
| ↳ `platform` | string | Project platform |
|
||||||
|
| ↳ `slug` | string | Project slug |
|
||||||
|
| ↳ `platform` | string | Project platform |
|
||||||
|
| ↳ `firstEvent` | string | First event timestamp |
|
||||||
|
| ↳ `lastEvent` | string | Last event timestamp |
|
||||||
|
| ↳ `versionInfo` | object | Version metadata |
|
||||||
|
| ↳ `buildHash` | string | Build hash |
|
||||||
|
| ↳ `version` | object | Version details |
|
||||||
|
| ↳ `raw` | string | Raw version string |
|
||||||
|
| ↳ `raw` | string | Raw version string |
|
||||||
|
| ↳ `package` | string | Package name |
|
||||||
|
| ↳ `buildHash` | string | Build hash |
|
||||||
|
| ↳ `raw` | string | Raw version string |
|
||||||
|
| ↳ `package` | string | Package name |
|
||||||
|
| `metadata` | object | Pagination metadata |
|
||||||
|
| ↳ `nextCursor` | string | Cursor for the next page of results \(if available\) |
|
||||||
|
| ↳ `hasMore` | boolean | Whether there are more results available |
|
||||||
|
|
||||||
### `sentry_releases_create`
|
### `sentry_releases_create`
|
||||||
|
|
||||||
@@ -278,6 +609,58 @@ Create a new release in Sentry. A release is a version of your code deployed to
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `release` | object | The newly created Sentry release |
|
| `release` | object | The newly created Sentry release |
|
||||||
|
| ↳ `id` | string | Project ID |
|
||||||
|
| ↳ `version` | object | Version details |
|
||||||
|
| ↳ `raw` | string | Raw version string |
|
||||||
|
| ↳ `shortVersion` | string | Shortened version identifier |
|
||||||
|
| ↳ `ref` | string | Git reference \(commit SHA, tag, or branch\) |
|
||||||
|
| ↳ `url` | string | URL to the release |
|
||||||
|
| ↳ `dateReleased` | string | When the release was deployed \(ISO timestamp\) |
|
||||||
|
| ↳ `dateCreated` | string | Commit timestamp |
|
||||||
|
| ↳ `dateStarted` | string | Deploy start timestamp |
|
||||||
|
| ↳ `newGroups` | number | Number of new issues introduced |
|
||||||
|
| ↳ `commitCount` | number | Number of commits in this release |
|
||||||
|
| ↳ `deployCount` | number | Number of deploys for this release |
|
||||||
|
| ↳ `owner` | object | Release owner |
|
||||||
|
| ↳ `id` | string | Owner ID |
|
||||||
|
| ↳ `name` | string | Owner name |
|
||||||
|
| ↳ `email` | string | Owner email |
|
||||||
|
| ↳ `name` | string | Project name |
|
||||||
|
| ↳ `email` | string | Author email |
|
||||||
|
| ↳ `lastCommit` | object | Last commit in the release |
|
||||||
|
| ↳ `id` | string | Commit SHA |
|
||||||
|
| ↳ `message` | string | Commit message |
|
||||||
|
| ↳ `dateCreated` | string | Commit timestamp |
|
||||||
|
| ↳ `message` | string | Commit message |
|
||||||
|
| ↳ `lastDeploy` | object | Last deploy of the release |
|
||||||
|
| ↳ `id` | string | Deploy ID |
|
||||||
|
| ↳ `environment` | string | Deploy environment |
|
||||||
|
| ↳ `dateStarted` | string | Deploy start timestamp |
|
||||||
|
| ↳ `dateFinished` | string | Deploy finish timestamp |
|
||||||
|
| ↳ `environment` | string | Deploy environment |
|
||||||
|
| ↳ `dateFinished` | string | Deploy finish timestamp |
|
||||||
|
| ↳ `authors` | array | Authors of commits in the release |
|
||||||
|
| ↳ `id` | string | Author ID |
|
||||||
|
| ↳ `name` | string | Author name |
|
||||||
|
| ↳ `email` | string | Author email |
|
||||||
|
| ↳ `projects` | array | Projects associated with this release |
|
||||||
|
| ↳ `id` | string | Project ID |
|
||||||
|
| ↳ `name` | string | Project name |
|
||||||
|
| ↳ `slug` | string | Project slug |
|
||||||
|
| ↳ `platform` | string | Project platform |
|
||||||
|
| ↳ `slug` | string | Project slug |
|
||||||
|
| ↳ `platform` | string | Project platform |
|
||||||
|
| ↳ `firstEvent` | string | First event timestamp |
|
||||||
|
| ↳ `lastEvent` | string | Last event timestamp |
|
||||||
|
| ↳ `versionInfo` | object | Version metadata |
|
||||||
|
| ↳ `buildHash` | string | Build hash |
|
||||||
|
| ↳ `version` | object | Version details |
|
||||||
|
| ↳ `raw` | string | Raw version string |
|
||||||
|
| ↳ `raw` | string | Raw version string |
|
||||||
|
| ↳ `package` | string | Package name |
|
||||||
|
| ↳ `buildHash` | string | Build hash |
|
||||||
|
| ↳ `raw` | string | Raw version string |
|
||||||
|
| ↳ `package` | string | Package name |
|
||||||
|
|
||||||
### `sentry_releases_deploy`
|
### `sentry_releases_deploy`
|
||||||
|
|
||||||
@@ -301,5 +684,11 @@ Create a deploy record for a Sentry release in a specific environment. Deploys t
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `deploy` | object | The newly created deploy record |
|
| `deploy` | object | The newly created deploy record |
|
||||||
|
| ↳ `id` | string | Unique deploy ID |
|
||||||
|
| ↳ `environment` | string | Environment name where the release was deployed |
|
||||||
|
| ↳ `name` | string | Name of the deploy |
|
||||||
|
| ↳ `url` | string | URL pointing to the deploy |
|
||||||
|
| ↳ `dateStarted` | string | When the deploy started \(ISO timestamp\) |
|
||||||
|
| ↳ `dateFinished` | string | When the deploy finished \(ISO timestamp\) |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,13 @@ Create a new page in a SharePoint site
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `page` | object | Created SharePoint page information |
|
| `page` | object | Created SharePoint page information |
|
||||||
|
| ↳ `id` | string | The unique ID of the created page |
|
||||||
|
| ↳ `name` | string | The name of the created page |
|
||||||
|
| ↳ `title` | string | The title of the created page |
|
||||||
|
| ↳ `webUrl` | string | The URL to access the page |
|
||||||
|
| ↳ `pageLayout` | string | The layout type of the page |
|
||||||
|
| ↳ `createdDateTime` | string | When the page was created |
|
||||||
|
| ↳ `lastModifiedDateTime` | string | When the page was last modified |
|
||||||
|
|
||||||
### `sharepoint_read_page`
|
### `sharepoint_read_page`
|
||||||
|
|
||||||
@@ -72,6 +79,35 @@ Read a specific page from a SharePoint site
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `page` | object | Information about the SharePoint page |
|
| `page` | object | Information about the SharePoint page |
|
||||||
|
| ↳ `id` | string | The unique ID of the page |
|
||||||
|
| ↳ `name` | string | The name of the page |
|
||||||
|
| ↳ `title` | string | The title of the page |
|
||||||
|
| ↳ `webUrl` | string | The URL to access the page |
|
||||||
|
| ↳ `pageLayout` | string | The layout type of the page |
|
||||||
|
| ↳ `createdDateTime` | string | When the page was created |
|
||||||
|
| ↳ `lastModifiedDateTime` | string | When the page was last modified |
|
||||||
|
| `pages` | array | List of SharePoint pages |
|
||||||
|
| ↳ `page` | object | The unique ID of the page |
|
||||||
|
| ↳ `id` | string | The unique ID of the page |
|
||||||
|
| ↳ `name` | string | The name of the page |
|
||||||
|
| ↳ `title` | string | The title of the page |
|
||||||
|
| ↳ `webUrl` | string | The URL to access the page |
|
||||||
|
| ↳ `pageLayout` | string | The layout type of the page |
|
||||||
|
| ↳ `createdDateTime` | string | When the page was created |
|
||||||
|
| ↳ `lastModifiedDateTime` | string | When the page was last modified |
|
||||||
|
| ↳ `id` | string | The unique ID of the page |
|
||||||
|
| ↳ `name` | string | The name of the page |
|
||||||
|
| ↳ `title` | string | The title of the page |
|
||||||
|
| ↳ `webUrl` | string | The URL to access the page |
|
||||||
|
| ↳ `pageLayout` | string | The layout type of the page |
|
||||||
|
| ↳ `createdDateTime` | string | When the page was created |
|
||||||
|
| ↳ `lastModifiedDateTime` | string | When the page was last modified |
|
||||||
|
| ↳ `content` | string | Extracted text content from the page |
|
||||||
|
| ↳ `canvasLayout` | object | Raw SharePoint canvas layout structure |
|
||||||
|
| `content` | object | Content of the SharePoint page |
|
||||||
|
| ↳ `content` | string | Extracted text content from the page |
|
||||||
|
| ↳ `canvasLayout` | object | Raw SharePoint canvas layout structure |
|
||||||
|
| `totalPages` | number | Total number of pages found |
|
||||||
|
|
||||||
### `sharepoint_list_sites`
|
### `sharepoint_list_sites`
|
||||||
|
|
||||||
@@ -89,6 +125,28 @@ List details of all SharePoint sites
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `site` | object | Information about the current SharePoint site |
|
| `site` | object | Information about the current SharePoint site |
|
||||||
|
| ↳ `id` | string | The unique ID of the site |
|
||||||
|
| ↳ `name` | string | The name of the site |
|
||||||
|
| ↳ `displayName` | string | The display name of the site |
|
||||||
|
| ↳ `webUrl` | string | The URL to access the site |
|
||||||
|
| ↳ `description` | string | The description of the site |
|
||||||
|
| ↳ `createdDateTime` | string | When the site was created |
|
||||||
|
| ↳ `lastModifiedDateTime` | string | When the site was last modified |
|
||||||
|
| ↳ `isPersonalSite` | boolean | Whether this is a personal site |
|
||||||
|
| ↳ `root` | object | Server relative URL |
|
||||||
|
| ↳ `serverRelativeUrl` | string | Server relative URL |
|
||||||
|
| ↳ `serverRelativeUrl` | string | Server relative URL |
|
||||||
|
| ↳ `siteCollection` | object | Site collection hostname |
|
||||||
|
| ↳ `hostname` | string | Site collection hostname |
|
||||||
|
| ↳ `hostname` | string | Site collection hostname |
|
||||||
|
| `sites` | array | List of all accessible SharePoint sites |
|
||||||
|
| ↳ `id` | string | The unique ID of the site |
|
||||||
|
| ↳ `name` | string | The name of the site |
|
||||||
|
| ↳ `displayName` | string | The display name of the site |
|
||||||
|
| ↳ `webUrl` | string | The URL to access the site |
|
||||||
|
| ↳ `description` | string | The description of the site |
|
||||||
|
| ↳ `createdDateTime` | string | When the site was created |
|
||||||
|
| ↳ `lastModifiedDateTime` | string | When the site was last modified |
|
||||||
|
|
||||||
### `sharepoint_create_list`
|
### `sharepoint_create_list`
|
||||||
|
|
||||||
@@ -110,6 +168,13 @@ Create a new list in a SharePoint site
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `list` | object | Created SharePoint list information |
|
| `list` | object | Created SharePoint list information |
|
||||||
|
| ↳ `id` | string | The unique ID of the list |
|
||||||
|
| ↳ `displayName` | string | The display name of the list |
|
||||||
|
| ↳ `name` | string | The internal name of the list |
|
||||||
|
| ↳ `webUrl` | string | The web URL of the list |
|
||||||
|
| ↳ `createdDateTime` | string | When the list was created |
|
||||||
|
| ↳ `lastModifiedDateTime` | string | When the list was last modified |
|
||||||
|
| ↳ `list` | object | List properties \(e.g., template\) |
|
||||||
|
|
||||||
### `sharepoint_get_list`
|
### `sharepoint_get_list`
|
||||||
|
|
||||||
@@ -128,6 +193,16 @@ Get metadata (and optionally columns/items) for a SharePoint list
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `list` | object | Information about the SharePoint list |
|
| `list` | object | Information about the SharePoint list |
|
||||||
|
| ↳ `id` | string | Item ID |
|
||||||
|
| ↳ `displayName` | string | The display name of the list |
|
||||||
|
| ↳ `name` | string | The internal name of the list |
|
||||||
|
| ↳ `webUrl` | string | The web URL of the list |
|
||||||
|
| ↳ `createdDateTime` | string | When the list was created |
|
||||||
|
| ↳ `lastModifiedDateTime` | string | When the list was last modified |
|
||||||
|
| ↳ `list` | object | List properties \(e.g., template\) |
|
||||||
|
| ↳ `columns` | array | List column definitions |
|
||||||
|
| ↳ `fields` | object | Field values for the item |
|
||||||
|
| `lists` | array | All lists in the site when no listId/title provided |
|
||||||
|
|
||||||
### `sharepoint_update_list`
|
### `sharepoint_update_list`
|
||||||
|
|
||||||
@@ -148,6 +223,8 @@ Update the properties (fields) on a SharePoint list item
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `item` | object | Updated SharePoint list item |
|
| `item` | object | Updated SharePoint list item |
|
||||||
|
| ↳ `id` | string | Item ID |
|
||||||
|
| ↳ `fields` | object | Updated field values |
|
||||||
|
|
||||||
### `sharepoint_add_list_items`
|
### `sharepoint_add_list_items`
|
||||||
|
|
||||||
@@ -167,6 +244,8 @@ Add a new item to a SharePoint list
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `item` | object | Created SharePoint list item |
|
| `item` | object | Created SharePoint list item |
|
||||||
|
| ↳ `id` | string | Item ID |
|
||||||
|
| ↳ `fields` | object | Field values for the new item |
|
||||||
|
|
||||||
### `sharepoint_upload_file`
|
### `sharepoint_upload_file`
|
||||||
|
|
||||||
@@ -187,5 +266,12 @@ Upload files to a SharePoint document library
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `uploadedFiles` | array | Array of uploaded file objects |
|
| `uploadedFiles` | array | Array of uploaded file objects |
|
||||||
|
| ↳ `id` | string | The unique ID of the uploaded file |
|
||||||
|
| ↳ `name` | string | The name of the uploaded file |
|
||||||
|
| ↳ `webUrl` | string | The URL to access the file |
|
||||||
|
| ↳ `size` | number | The size of the file in bytes |
|
||||||
|
| ↳ `createdDateTime` | string | When the file was created |
|
||||||
|
| ↳ `lastModifiedDateTime` | string | When the file was last modified |
|
||||||
|
| `fileCount` | number | Number of files uploaded |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -123,6 +123,163 @@ Read the latest messages from Slack channels. Retrieve conversation history with
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `messages` | array | Array of message objects from the channel |
|
| `messages` | array | Array of message objects from the channel |
|
||||||
|
| ↳ `type` | string | Message type |
|
||||||
|
| ↳ `ts` | string | Edit timestamp |
|
||||||
|
| ↳ `text` | string | Message text content |
|
||||||
|
| ↳ `user` | string | User ID who edited |
|
||||||
|
| ↳ `bot_id` | string | Bot ID if sent by a bot |
|
||||||
|
| ↳ `username` | string | Display username |
|
||||||
|
| ↳ `channel` | string | Channel ID |
|
||||||
|
| ↳ `team` | string | Team ID |
|
||||||
|
| ↳ `thread_ts` | string | Thread parent message timestamp |
|
||||||
|
| ↳ `parent_user_id` | string | User ID of thread parent |
|
||||||
|
| ↳ `reply_count` | number | Number of thread replies |
|
||||||
|
| ↳ `reply_users_count` | number | Number of users who replied |
|
||||||
|
| ↳ `latest_reply` | string | Timestamp of latest reply |
|
||||||
|
| ↳ `subscribed` | boolean | Whether user is subscribed to thread |
|
||||||
|
| ↳ `last_read` | string | Last read timestamp |
|
||||||
|
| ↳ `unread_count` | number | Number of unread messages |
|
||||||
|
| ↳ `subtype` | string | Message subtype |
|
||||||
|
| ↳ `reactions` | array | Array of reactions on this message |
|
||||||
|
| ↳ `name` | string | Emoji name |
|
||||||
|
| ↳ `count` | number | Number of reactions |
|
||||||
|
| ↳ `users` | array | Array of user IDs who reacted |
|
||||||
|
| ↳ `name` | string | File name |
|
||||||
|
| ↳ `count` | number | Number of reactions |
|
||||||
|
| ↳ `users` | array | Array of user IDs who reacted |
|
||||||
|
| ↳ `is_starred` | boolean | Whether message is starred |
|
||||||
|
| ↳ `pinned_to` | array | Array of channel IDs where message is pinned |
|
||||||
|
| ↳ `files` | array | Array of files attached to message |
|
||||||
|
| ↳ `id` | string | File ID |
|
||||||
|
| ↳ `name` | string | File name |
|
||||||
|
| ↳ `mimetype` | string | MIME type |
|
||||||
|
| ↳ `size` | number | File size in bytes |
|
||||||
|
| ↳ `url_private` | string | Private download URL |
|
||||||
|
| ↳ `permalink` | string | Permanent link to file |
|
||||||
|
| ↳ `mode` | string | File mode |
|
||||||
|
| ↳ `id` | string | File ID |
|
||||||
|
| ↳ `mimetype` | string | MIME type |
|
||||||
|
| ↳ `size` | number | File size in bytes |
|
||||||
|
| ↳ `url_private` | string | Private download URL |
|
||||||
|
| ↳ `permalink` | string | Permanent link to message |
|
||||||
|
| ↳ `mode` | string | File mode |
|
||||||
|
| ↳ `attachments` | array | Array of legacy attachments |
|
||||||
|
| ↳ `blocks` | array | Array of Block Kit blocks |
|
||||||
|
| ↳ `edited` | object | Edit information if message was edited |
|
||||||
|
| ↳ `user` | string | User ID who edited |
|
||||||
|
| ↳ `ts` | string | Edit timestamp |
|
||||||
|
|
||||||
|
### `slack_get_message`
|
||||||
|
|
||||||
|
Retrieve a specific message by its timestamp. Useful for getting a thread parent message.
|
||||||
|
|
||||||
|
#### Input
|
||||||
|
|
||||||
|
| Parameter | Type | Required | Description |
|
||||||
|
| --------- | ---- | -------- | ----------- |
|
||||||
|
| `authMethod` | string | No | Authentication method: oauth or bot_token |
|
||||||
|
| `botToken` | string | No | Bot token for Custom Bot |
|
||||||
|
| `channel` | string | Yes | Slack channel ID \(e.g., C1234567890\) |
|
||||||
|
| `timestamp` | string | Yes | Message timestamp to retrieve \(e.g., 1405894322.002768\) |
|
||||||
|
|
||||||
|
#### Output
|
||||||
|
|
||||||
|
| Parameter | Type | Description |
|
||||||
|
| --------- | ---- | ----------- |
|
||||||
|
| `message` | object | The retrieved message object |
|
||||||
|
| ↳ `type` | string | Message type |
|
||||||
|
| ↳ `ts` | string | Edit timestamp |
|
||||||
|
| ↳ `text` | string | Message text content |
|
||||||
|
| ↳ `user` | string | User ID who edited |
|
||||||
|
| ↳ `bot_id` | string | Bot ID if sent by a bot |
|
||||||
|
| ↳ `username` | string | Display username |
|
||||||
|
| ↳ `channel` | string | Channel ID |
|
||||||
|
| ↳ `team` | string | Team ID |
|
||||||
|
| ↳ `thread_ts` | string | Thread parent timestamp |
|
||||||
|
| ↳ `parent_user_id` | string | User ID of thread parent |
|
||||||
|
| ↳ `reply_count` | number | Number of thread replies |
|
||||||
|
| ↳ `reply_users_count` | number | Number of users who replied |
|
||||||
|
| ↳ `latest_reply` | string | Timestamp of latest reply |
|
||||||
|
| ↳ `subtype` | string | Message subtype |
|
||||||
|
| ↳ `reactions` | array | Array of reactions on this message |
|
||||||
|
| ↳ `name` | string | Emoji name |
|
||||||
|
| ↳ `count` | number | Number of reactions |
|
||||||
|
| ↳ `users` | array | User IDs who reacted |
|
||||||
|
| ↳ `name` | string | File name |
|
||||||
|
| ↳ `count` | number | Number of reactions |
|
||||||
|
| ↳ `users` | array | User IDs who reacted |
|
||||||
|
| ↳ `is_starred` | boolean | Whether message is starred |
|
||||||
|
| ↳ `pinned_to` | array | Channel IDs where message is pinned |
|
||||||
|
| ↳ `files` | array | Files attached to message |
|
||||||
|
| ↳ `id` | string | File ID |
|
||||||
|
| ↳ `name` | string | File name |
|
||||||
|
| ↳ `mimetype` | string | MIME type |
|
||||||
|
| ↳ `size` | number | File size in bytes |
|
||||||
|
| ↳ `url_private` | string | Private download URL |
|
||||||
|
| ↳ `permalink` | string | Permanent link to file |
|
||||||
|
| ↳ `id` | string | File ID |
|
||||||
|
| ↳ `mimetype` | string | MIME type |
|
||||||
|
| ↳ `size` | number | File size in bytes |
|
||||||
|
| ↳ `url_private` | string | Private download URL |
|
||||||
|
| ↳ `permalink` | string | Permanent link to message |
|
||||||
|
| ↳ `attachments` | array | Legacy attachments |
|
||||||
|
| ↳ `blocks` | array | Block Kit blocks |
|
||||||
|
| ↳ `edited` | object | Edit information if message was edited |
|
||||||
|
| ↳ `user` | string | User ID who edited |
|
||||||
|
| ↳ `ts` | string | Edit timestamp |
|
||||||
|
|
||||||
|
### `slack_get_thread`
|
||||||
|
|
||||||
|
Retrieve an entire thread including the parent message and all replies. Useful for getting full conversation context.
|
||||||
|
|
||||||
|
#### Input
|
||||||
|
|
||||||
|
| Parameter | Type | Required | Description |
|
||||||
|
| --------- | ---- | -------- | ----------- |
|
||||||
|
| `authMethod` | string | No | Authentication method: oauth or bot_token |
|
||||||
|
| `botToken` | string | No | Bot token for Custom Bot |
|
||||||
|
| `channel` | string | Yes | Slack channel ID \(e.g., C1234567890\) |
|
||||||
|
| `threadTs` | string | Yes | Thread timestamp \(thread_ts\) to retrieve \(e.g., 1405894322.002768\) |
|
||||||
|
| `limit` | number | No | Maximum number of messages to return \(default: 100, max: 200\) |
|
||||||
|
|
||||||
|
#### Output
|
||||||
|
|
||||||
|
| Parameter | Type | Description |
|
||||||
|
| --------- | ---- | ----------- |
|
||||||
|
| `parentMessage` | object | The thread parent message |
|
||||||
|
| ↳ `type` | string | Message type |
|
||||||
|
| ↳ `ts` | string | Message timestamp |
|
||||||
|
| ↳ `text` | string | Message text content |
|
||||||
|
| ↳ `user` | string | User ID who sent the message |
|
||||||
|
| ↳ `bot_id` | string | Bot ID if sent by a bot |
|
||||||
|
| ↳ `username` | string | Display username |
|
||||||
|
| ↳ `reply_count` | number | Total number of thread replies |
|
||||||
|
| ↳ `reply_users_count` | number | Number of users who replied |
|
||||||
|
| ↳ `latest_reply` | string | Timestamp of latest reply |
|
||||||
|
| ↳ `reactions` | array | Array of reactions on the parent message |
|
||||||
|
| ↳ `name` | string | Emoji name |
|
||||||
|
| ↳ `count` | number | Number of reactions |
|
||||||
|
| ↳ `users` | array | User IDs who reacted |
|
||||||
|
| ↳ `name` | string | File name |
|
||||||
|
| ↳ `count` | number | Number of reactions |
|
||||||
|
| ↳ `users` | array | User IDs who reacted |
|
||||||
|
| ↳ `files` | array | Files attached to the parent message |
|
||||||
|
| ↳ `id` | string | File ID |
|
||||||
|
| ↳ `name` | string | File name |
|
||||||
|
| ↳ `mimetype` | string | MIME type |
|
||||||
|
| ↳ `size` | number | File size in bytes |
|
||||||
|
| ↳ `id` | string | File ID |
|
||||||
|
| ↳ `mimetype` | string | MIME type |
|
||||||
|
| ↳ `size` | number | File size in bytes |
|
||||||
|
| `replies` | array | Array of reply messages in the thread \(excluding the parent\) |
|
||||||
|
| ↳ `ts` | string | Message timestamp |
|
||||||
|
| ↳ `text` | string | Message text content |
|
||||||
|
| ↳ `user` | string | User ID who sent the reply |
|
||||||
|
| ↳ `reactions` | array | Reactions on the reply |
|
||||||
|
| ↳ `files` | array | Files attached to the reply |
|
||||||
|
| `messages` | array | All messages in the thread \(parent + replies\) in chronological order |
|
||||||
|
| `replyCount` | number | Number of replies returned in this response |
|
||||||
|
| `hasMore` | boolean | Whether there are more messages in the thread \(pagination needed\) |
|
||||||
|
|
||||||
### `slack_list_channels`
|
### `slack_list_channels`
|
||||||
|
|
||||||
@@ -143,6 +300,19 @@ List all channels in a Slack workspace. Returns public and private channels the
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `channels` | array | Array of channel objects from the workspace |
|
| `channels` | array | Array of channel objects from the workspace |
|
||||||
|
| ↳ `id` | string | Channel ID \(e.g., C1234567890\) |
|
||||||
|
| ↳ `name` | string | Channel name without # prefix |
|
||||||
|
| ↳ `is_private` | boolean | Whether the channel is private |
|
||||||
|
| ↳ `is_archived` | boolean | Whether the channel is archived |
|
||||||
|
| ↳ `is_member` | boolean | Whether the bot is a member of the channel |
|
||||||
|
| ↳ `num_members` | number | Number of members in the channel |
|
||||||
|
| ↳ `topic` | string | Channel topic |
|
||||||
|
| ↳ `purpose` | string | Channel purpose/description |
|
||||||
|
| ↳ `created` | number | Unix timestamp when channel was created |
|
||||||
|
| ↳ `creator` | string | User ID of channel creator |
|
||||||
|
| `ids` | array | Array of channel IDs for easy access |
|
||||||
|
| `names` | array | Array of channel names for easy access |
|
||||||
|
| `count` | number | Total number of channels returned |
|
||||||
|
|
||||||
### `slack_list_members`
|
### `slack_list_members`
|
||||||
|
|
||||||
@@ -162,6 +332,7 @@ List all members (user IDs) in a Slack channel. Use with Get User Info to resolv
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `members` | array | Array of user IDs who are members of the channel \(e.g., U1234567890\) |
|
| `members` | array | Array of user IDs who are members of the channel \(e.g., U1234567890\) |
|
||||||
|
| `count` | number | Total number of members returned |
|
||||||
|
|
||||||
### `slack_list_users`
|
### `slack_list_users`
|
||||||
|
|
||||||
@@ -181,6 +352,21 @@ List all users in a Slack workspace. Returns user profiles with names and avatar
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `users` | array | Array of user objects from the workspace |
|
| `users` | array | Array of user objects from the workspace |
|
||||||
|
| ↳ `id` | string | User ID \(e.g., U1234567890\) |
|
||||||
|
| ↳ `name` | string | Username \(handle\) |
|
||||||
|
| ↳ `real_name` | string | Full real name |
|
||||||
|
| ↳ `display_name` | string | Display name shown in Slack |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the user is a bot |
|
||||||
|
| ↳ `is_admin` | boolean | Whether the user is a workspace admin |
|
||||||
|
| ↳ `is_owner` | boolean | Whether the user is the workspace owner |
|
||||||
|
| ↳ `deleted` | boolean | Whether the user is deactivated |
|
||||||
|
| ↳ `timezone` | string | User timezone identifier |
|
||||||
|
| ↳ `avatar` | string | URL to user avatar image |
|
||||||
|
| ↳ `status_text` | string | Custom status text |
|
||||||
|
| ↳ `status_emoji` | string | Custom status emoji |
|
||||||
|
| `ids` | array | Array of user IDs for easy access |
|
||||||
|
| `names` | array | Array of usernames for easy access |
|
||||||
|
| `count` | number | Total number of users returned |
|
||||||
|
|
||||||
### `slack_get_user`
|
### `slack_get_user`
|
||||||
|
|
||||||
@@ -199,6 +385,34 @@ Get detailed information about a specific Slack user by their user ID.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `user` | object | Detailed user information |
|
| `user` | object | Detailed user information |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `name` | string | Username \(handle\) |
|
||||||
|
| ↳ `real_name` | string | Full real name |
|
||||||
|
| ↳ `display_name` | string | Display name shown in Slack |
|
||||||
|
| ↳ `first_name` | string | First name |
|
||||||
|
| ↳ `last_name` | string | Last name |
|
||||||
|
| ↳ `title` | string | Job title |
|
||||||
|
| ↳ `phone` | string | Phone number |
|
||||||
|
| ↳ `skype` | string | Skype handle |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the user is a bot |
|
||||||
|
| ↳ `is_admin` | boolean | Whether the user is a workspace admin |
|
||||||
|
| ↳ `is_owner` | boolean | Whether the user is the workspace owner |
|
||||||
|
| ↳ `is_primary_owner` | boolean | Whether the user is the primary owner |
|
||||||
|
| ↳ `is_restricted` | boolean | Whether the user is a guest \(restricted\) |
|
||||||
|
| ↳ `is_ultra_restricted` | boolean | Whether the user is a single-channel guest |
|
||||||
|
| ↳ `deleted` | boolean | Whether the user is deactivated |
|
||||||
|
| ↳ `timezone` | string | Timezone identifier \(e.g., America/Los_Angeles\) |
|
||||||
|
| ↳ `timezone_label` | string | Human-readable timezone label |
|
||||||
|
| ↳ `timezone_offset` | number | Timezone offset in seconds from UTC |
|
||||||
|
| ↳ `avatar_24` | string | URL to 24px avatar |
|
||||||
|
| ↳ `avatar_48` | string | URL to 48px avatar |
|
||||||
|
| ↳ `avatar_72` | string | URL to 72px avatar |
|
||||||
|
| ↳ `avatar_192` | string | URL to 192px avatar |
|
||||||
|
| ↳ `avatar_512` | string | URL to 512px avatar |
|
||||||
|
| ↳ `status_text` | string | Custom status text |
|
||||||
|
| ↳ `status_emoji` | string | Custom status emoji |
|
||||||
|
| ↳ `status_expiration` | number | Unix timestamp when status expires |
|
||||||
|
| ↳ `updated` | number | Unix timestamp of last profile update |
|
||||||
|
|
||||||
### `slack_download`
|
### `slack_download`
|
||||||
|
|
||||||
@@ -240,6 +454,9 @@ Update a message previously sent by the bot in Slack
|
|||||||
| `message` | object | Complete updated message object with all properties returned by Slack |
|
| `message` | object | Complete updated message object with all properties returned by Slack |
|
||||||
| `content` | string | Success message |
|
| `content` | string | Success message |
|
||||||
| `metadata` | object | Updated message metadata |
|
| `metadata` | object | Updated message metadata |
|
||||||
|
| ↳ `channel` | string | Channel ID |
|
||||||
|
| ↳ `timestamp` | string | Message timestamp |
|
||||||
|
| ↳ `text` | string | Updated message text |
|
||||||
|
|
||||||
### `slack_delete_message`
|
### `slack_delete_message`
|
||||||
|
|
||||||
@@ -260,6 +477,8 @@ Delete a message previously sent by the bot in Slack
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `content` | string | Success message |
|
| `content` | string | Success message |
|
||||||
| `metadata` | object | Deleted message metadata |
|
| `metadata` | object | Deleted message metadata |
|
||||||
|
| ↳ `channel` | string | Channel ID |
|
||||||
|
| ↳ `timestamp` | string | Message timestamp |
|
||||||
|
|
||||||
### `slack_add_reaction`
|
### `slack_add_reaction`
|
||||||
|
|
||||||
@@ -281,5 +500,8 @@ Add an emoji reaction to a Slack message
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `content` | string | Success message |
|
| `content` | string | Success message |
|
||||||
| `metadata` | object | Reaction metadata |
|
| `metadata` | object | Reaction metadata |
|
||||||
|
| ↳ `channel` | string | Channel ID |
|
||||||
|
| ↳ `timestamp` | string | Message timestamp |
|
||||||
|
| ↳ `reaction` | string | Emoji reaction name |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,17 @@ Search for tracks, albums, artists, or playlists on Spotify. Returns matching re
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `tracks` | array | List of matching tracks |
|
| `tracks` | array | List of matching tracks |
|
||||||
|
| ↳ `id` | string | Spotify track ID |
|
||||||
|
| ↳ `name` | string | Track name |
|
||||||
|
| ↳ `artists` | array | List of artist names |
|
||||||
|
| ↳ `album` | string | Album name |
|
||||||
|
| ↳ `duration_ms` | number | Track duration in milliseconds |
|
||||||
|
| ↳ `popularity` | number | Popularity score \(0-100\) |
|
||||||
|
| ↳ `preview_url` | string | URL to 30-second preview |
|
||||||
|
| ↳ `external_url` | string | Spotify URL |
|
||||||
|
| `artists` | array | List of matching artists |
|
||||||
|
| `albums` | array | List of matching albums |
|
||||||
|
| `playlists` | array | List of matching playlists |
|
||||||
|
|
||||||
### `spotify_get_track`
|
### `spotify_get_track`
|
||||||
|
|
||||||
@@ -80,6 +91,15 @@ Get detailed information about multiple tracks on Spotify by their IDs (up to 50
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `tracks` | array | List of tracks |
|
| `tracks` | array | List of tracks |
|
||||||
|
| ↳ `id` | string | Spotify track ID |
|
||||||
|
| ↳ `name` | string | Track name |
|
||||||
|
| ↳ `artists` | array | List of artists |
|
||||||
|
| ↳ `album` | object | Album information |
|
||||||
|
| ↳ `duration_ms` | number | Track duration in milliseconds |
|
||||||
|
| ↳ `explicit` | boolean | Whether the track has explicit content |
|
||||||
|
| ↳ `popularity` | number | Popularity score \(0-100\) |
|
||||||
|
| ↳ `preview_url` | string | URL to 30-second preview |
|
||||||
|
| ↳ `external_url` | string | Spotify URL |
|
||||||
|
|
||||||
### `spotify_get_album`
|
### `spotify_get_album`
|
||||||
|
|
||||||
@@ -271,6 +291,15 @@ Get albums by an artist on Spotify. Can filter by album type.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `albums` | array | Artist |
|
| `albums` | array | Artist |
|
||||||
|
| ↳ `id` | string | Spotify album ID |
|
||||||
|
| ↳ `name` | string | Album name |
|
||||||
|
| ↳ `album_type` | string | Type \(album, single, compilation\) |
|
||||||
|
| ↳ `total_tracks` | number | Number of tracks |
|
||||||
|
| ↳ `release_date` | string | Release date |
|
||||||
|
| ↳ `image_url` | string | Album cover URL |
|
||||||
|
| ↳ `external_url` | string | Spotify URL |
|
||||||
|
| `total` | number | Total number of albums available |
|
||||||
|
| `next` | string | URL for next page of results |
|
||||||
|
|
||||||
### `spotify_get_artist_top_tracks`
|
### `spotify_get_artist_top_tracks`
|
||||||
|
|
||||||
@@ -288,6 +317,13 @@ Get the top 10 most popular tracks by an artist on Spotify.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `tracks` | array | Artist |
|
| `tracks` | array | Artist |
|
||||||
|
| ↳ `id` | string | Spotify track ID |
|
||||||
|
| ↳ `name` | string | Track name |
|
||||||
|
| ↳ `album` | object | Album information |
|
||||||
|
| ↳ `duration_ms` | number | Track duration in milliseconds |
|
||||||
|
| ↳ `popularity` | number | Popularity score \(0-100\) |
|
||||||
|
| ↳ `preview_url` | string | URL to 30-second preview |
|
||||||
|
| ↳ `external_url` | string | Spotify URL |
|
||||||
|
|
||||||
### `spotify_follow_artists`
|
### `spotify_follow_artists`
|
||||||
|
|
||||||
@@ -772,6 +808,11 @@ Get the tracks in a Spotify playlist.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `tracks` | array | List of tracks in the playlist |
|
| `tracks` | array | List of tracks in the playlist |
|
||||||
|
| ↳ `added_at` | string | When the track was added |
|
||||||
|
| ↳ `added_by` | string | User ID who added the track |
|
||||||
|
| ↳ `track` | object | Track information |
|
||||||
|
| `total` | number | Total number of tracks in playlist |
|
||||||
|
| `next` | string | URL for next page of results |
|
||||||
|
|
||||||
### `spotify_get_playlist_cover`
|
### `spotify_get_playlist_cover`
|
||||||
|
|
||||||
@@ -805,6 +846,17 @@ Get the current user
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `playlists` | array | User |
|
| `playlists` | array | User |
|
||||||
|
| ↳ `id` | string | Spotify playlist ID |
|
||||||
|
| ↳ `name` | string | Playlist name |
|
||||||
|
| ↳ `description` | string | Playlist description |
|
||||||
|
| ↳ `public` | boolean | Whether public |
|
||||||
|
| ↳ `collaborative` | boolean | Whether collaborative |
|
||||||
|
| ↳ `owner` | string | Owner display name |
|
||||||
|
| ↳ `total_tracks` | number | Number of tracks |
|
||||||
|
| ↳ `image_url` | string | Cover image URL |
|
||||||
|
| ↳ `external_url` | string | Spotify URL |
|
||||||
|
| `total` | number | Total number of playlists |
|
||||||
|
| `next` | string | URL for next page |
|
||||||
|
|
||||||
### `spotify_create_playlist`
|
### `spotify_create_playlist`
|
||||||
|
|
||||||
@@ -1048,6 +1100,15 @@ Get the current user
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `tracks` | array | User |
|
| `tracks` | array | User |
|
||||||
|
| ↳ `id` | string | Spotify track ID |
|
||||||
|
| ↳ `name` | string | Track name |
|
||||||
|
| ↳ `artists` | array | List of artists |
|
||||||
|
| ↳ `album` | object | Album information |
|
||||||
|
| ↳ `duration_ms` | number | Duration in milliseconds |
|
||||||
|
| ↳ `popularity` | number | Popularity score |
|
||||||
|
| ↳ `external_url` | string | Spotify URL |
|
||||||
|
| `total` | number | Total number of top tracks |
|
||||||
|
| `next` | string | URL for next page |
|
||||||
|
|
||||||
### `spotify_get_top_artists`
|
### `spotify_get_top_artists`
|
||||||
|
|
||||||
@@ -1066,6 +1127,15 @@ Get the current user
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `artists` | array | User |
|
| `artists` | array | User |
|
||||||
|
| ↳ `id` | string | Spotify artist ID |
|
||||||
|
| ↳ `name` | string | Artist name |
|
||||||
|
| ↳ `genres` | array | List of genres |
|
||||||
|
| ↳ `popularity` | number | Popularity score |
|
||||||
|
| ↳ `followers` | number | Number of followers |
|
||||||
|
| ↳ `image_url` | string | Artist image URL |
|
||||||
|
| ↳ `external_url` | string | Spotify URL |
|
||||||
|
| `total` | number | Total number of top artists |
|
||||||
|
| `next` | string | URL for next page |
|
||||||
|
|
||||||
### `spotify_get_saved_tracks`
|
### `spotify_get_saved_tracks`
|
||||||
|
|
||||||
@@ -1084,6 +1154,10 @@ Get the current user
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `tracks` | array | User |
|
| `tracks` | array | User |
|
||||||
|
| ↳ `added_at` | string | When the track was saved |
|
||||||
|
| ↳ `track` | object | Track information |
|
||||||
|
| `total` | number | Total number of saved tracks |
|
||||||
|
| `next` | string | URL for next page |
|
||||||
|
|
||||||
### `spotify_save_tracks`
|
### `spotify_save_tracks`
|
||||||
|
|
||||||
@@ -1152,6 +1226,9 @@ Get the user
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `items` | array | Recently played tracks |
|
| `items` | array | Recently played tracks |
|
||||||
|
| ↳ `played_at` | string | When the track was played |
|
||||||
|
| ↳ `track` | object | Track information |
|
||||||
|
| `next` | string | URL for next page |
|
||||||
|
|
||||||
### `spotify_get_new_releases`
|
### `spotify_get_new_releases`
|
||||||
|
|
||||||
@@ -1261,6 +1338,13 @@ Get the user
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `devices` | array | Available playback devices |
|
| `devices` | array | Available playback devices |
|
||||||
|
| ↳ `id` | string | Device ID |
|
||||||
|
| ↳ `is_active` | boolean | Whether device is active |
|
||||||
|
| ↳ `is_private_session` | boolean | Whether in private session |
|
||||||
|
| ↳ `is_restricted` | boolean | Whether device is restricted |
|
||||||
|
| ↳ `name` | string | Device name |
|
||||||
|
| ↳ `type` | string | Device type \(Computer, Smartphone, etc.\) |
|
||||||
|
| ↳ `volume_percent` | number | Current volume \(0-100\) |
|
||||||
|
|
||||||
### `spotify_get_queue`
|
### `spotify_get_queue`
|
||||||
|
|
||||||
|
|||||||
@@ -199,6 +199,14 @@ List files and directories in a remote directory
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `entries` | array | Array of file and directory entries |
|
| `entries` | array | Array of file and directory entries |
|
||||||
|
| ↳ `name` | string | File or directory name |
|
||||||
|
| ↳ `type` | string | Entry type \(file, directory, symlink\) |
|
||||||
|
| ↳ `size` | number | File size in bytes |
|
||||||
|
| ↳ `permissions` | string | File permissions |
|
||||||
|
| ↳ `modified` | string | Last modified timestamp |
|
||||||
|
| `totalFiles` | number | Total number of files |
|
||||||
|
| `totalDirectories` | number | Total number of directories |
|
||||||
|
| `message` | string | Operation status message |
|
||||||
|
|
||||||
### `ssh_check_file_exists`
|
### `ssh_check_file_exists`
|
||||||
|
|
||||||
|
|||||||
@@ -79,5 +79,16 @@ Run an autonomous web agent to complete tasks and extract structured data
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `agentResult` | object | Result from the Stagehand agent execution |
|
| `agentResult` | object | Result from the Stagehand agent execution |
|
||||||
|
| ↳ `success` | boolean | Whether the agent task completed successfully |
|
||||||
|
| ↳ `completed` | boolean | Whether the task was fully completed |
|
||||||
|
| ↳ `message` | string | Status message or final result |
|
||||||
|
| ↳ `actions` | array | Type of action performed |
|
||||||
|
| ↳ `type` | string | Type of action performed |
|
||||||
|
| ↳ `params` | object | Parameters used for the action |
|
||||||
|
| ↳ `result` | object | Result of the action |
|
||||||
|
| ↳ `type` | string | Type of action performed |
|
||||||
|
| ↳ `params` | object | Parameters used for the action |
|
||||||
|
| ↳ `result` | object | Result of the action |
|
||||||
|
| `structuredOutput` | object | Extracted data matching the provided output schema |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -61,6 +61,10 @@ Create a new Payment Intent to process a payment
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `payment_intent` | json | The created Payment Intent object |
|
| `payment_intent` | json | The created Payment Intent object |
|
||||||
| `metadata` | json | Payment Intent metadata including ID, status, amount, and currency |
|
| `metadata` | json | Payment Intent metadata including ID, status, amount, and currency |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount` | number | Amount in smallest currency unit \(e.g., cents\) |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_retrieve_payment_intent`
|
### `stripe_retrieve_payment_intent`
|
||||||
|
|
||||||
@@ -79,6 +83,10 @@ Retrieve an existing Payment Intent by ID
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `payment_intent` | json | The retrieved Payment Intent object |
|
| `payment_intent` | json | The retrieved Payment Intent object |
|
||||||
| `metadata` | json | Payment Intent metadata including ID, status, amount, and currency |
|
| `metadata` | json | Payment Intent metadata including ID, status, amount, and currency |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount` | number | Amount in smallest currency unit \(e.g., cents\) |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_update_payment_intent`
|
### `stripe_update_payment_intent`
|
||||||
|
|
||||||
@@ -102,6 +110,10 @@ Update an existing Payment Intent
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `payment_intent` | json | The updated Payment Intent object |
|
| `payment_intent` | json | The updated Payment Intent object |
|
||||||
| `metadata` | json | Payment Intent metadata including ID, status, amount, and currency |
|
| `metadata` | json | Payment Intent metadata including ID, status, amount, and currency |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount` | number | Amount in smallest currency unit \(e.g., cents\) |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_confirm_payment_intent`
|
### `stripe_confirm_payment_intent`
|
||||||
|
|
||||||
@@ -121,6 +133,10 @@ Confirm a Payment Intent to complete the payment
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `payment_intent` | json | The confirmed Payment Intent object |
|
| `payment_intent` | json | The confirmed Payment Intent object |
|
||||||
| `metadata` | json | Payment Intent metadata including ID, status, amount, and currency |
|
| `metadata` | json | Payment Intent metadata including ID, status, amount, and currency |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount` | number | Amount in smallest currency unit \(e.g., cents\) |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_capture_payment_intent`
|
### `stripe_capture_payment_intent`
|
||||||
|
|
||||||
@@ -140,6 +156,10 @@ Capture an authorized Payment Intent
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `payment_intent` | json | The captured Payment Intent object |
|
| `payment_intent` | json | The captured Payment Intent object |
|
||||||
| `metadata` | json | Payment Intent metadata including ID, status, amount, and currency |
|
| `metadata` | json | Payment Intent metadata including ID, status, amount, and currency |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount` | number | Amount in smallest currency unit \(e.g., cents\) |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_cancel_payment_intent`
|
### `stripe_cancel_payment_intent`
|
||||||
|
|
||||||
@@ -159,6 +179,10 @@ Cancel a Payment Intent
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `payment_intent` | json | The canceled Payment Intent object |
|
| `payment_intent` | json | The canceled Payment Intent object |
|
||||||
| `metadata` | json | Payment Intent metadata including ID, status, amount, and currency |
|
| `metadata` | json | Payment Intent metadata including ID, status, amount, and currency |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount` | number | Amount in smallest currency unit \(e.g., cents\) |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_list_payment_intents`
|
### `stripe_list_payment_intents`
|
||||||
|
|
||||||
@@ -179,6 +203,8 @@ List all Payment Intents
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `payment_intents` | json | Array of Payment Intent objects |
|
| `payment_intents` | json | Array of Payment Intent objects |
|
||||||
| `metadata` | json | List metadata including count and has_more |
|
| `metadata` | json | List metadata including count and has_more |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_search_payment_intents`
|
### `stripe_search_payment_intents`
|
||||||
|
|
||||||
@@ -198,6 +224,8 @@ Search for Payment Intents using query syntax
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `payment_intents` | json | Array of matching Payment Intent objects |
|
| `payment_intents` | json | Array of matching Payment Intent objects |
|
||||||
| `metadata` | json | Search metadata including count and has_more |
|
| `metadata` | json | Search metadata including count and has_more |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_create_customer`
|
### `stripe_create_customer`
|
||||||
|
|
||||||
@@ -222,6 +250,9 @@ Create a new customer object
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `customer` | json | The created customer object |
|
| `customer` | json | The created customer object |
|
||||||
| `metadata` | json | Customer metadata |
|
| `metadata` | json | Customer metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `email` | string | Customer email address |
|
||||||
|
| ↳ `name` | string | Display name |
|
||||||
|
|
||||||
### `stripe_retrieve_customer`
|
### `stripe_retrieve_customer`
|
||||||
|
|
||||||
@@ -240,6 +271,9 @@ Retrieve an existing customer by ID
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `customer` | json | The retrieved customer object |
|
| `customer` | json | The retrieved customer object |
|
||||||
| `metadata` | json | Customer metadata |
|
| `metadata` | json | Customer metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `email` | string | Customer email address |
|
||||||
|
| ↳ `name` | string | Display name |
|
||||||
|
|
||||||
### `stripe_update_customer`
|
### `stripe_update_customer`
|
||||||
|
|
||||||
@@ -264,6 +298,9 @@ Update an existing customer
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `customer` | json | The updated customer object |
|
| `customer` | json | The updated customer object |
|
||||||
| `metadata` | json | Customer metadata |
|
| `metadata` | json | Customer metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `email` | string | Customer email address |
|
||||||
|
| ↳ `name` | string | Display name |
|
||||||
|
|
||||||
### `stripe_delete_customer`
|
### `stripe_delete_customer`
|
||||||
|
|
||||||
@@ -302,6 +339,8 @@ List all customers
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `customers` | json | Array of customer objects |
|
| `customers` | json | Array of customer objects |
|
||||||
| `metadata` | json | List metadata |
|
| `metadata` | json | List metadata |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_search_customers`
|
### `stripe_search_customers`
|
||||||
|
|
||||||
@@ -321,6 +360,8 @@ Search for customers using query syntax
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `customers` | json | Array of matching customer objects |
|
| `customers` | json | Array of matching customer objects |
|
||||||
| `metadata` | json | Search metadata |
|
| `metadata` | json | Search metadata |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_create_subscription`
|
### `stripe_create_subscription`
|
||||||
|
|
||||||
@@ -344,6 +385,9 @@ Create a new subscription for a customer
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `subscription` | json | The created subscription object |
|
| `subscription` | json | The created subscription object |
|
||||||
| `metadata` | json | Subscription metadata including ID, status, and customer |
|
| `metadata` | json | Subscription metadata including ID, status, and customer |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `customer` | string | Associated customer ID |
|
||||||
|
|
||||||
### `stripe_retrieve_subscription`
|
### `stripe_retrieve_subscription`
|
||||||
|
|
||||||
@@ -362,6 +406,9 @@ Retrieve an existing subscription by ID
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `subscription` | json | The retrieved subscription object |
|
| `subscription` | json | The retrieved subscription object |
|
||||||
| `metadata` | json | Subscription metadata including ID, status, and customer |
|
| `metadata` | json | Subscription metadata including ID, status, and customer |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `customer` | string | Associated customer ID |
|
||||||
|
|
||||||
### `stripe_update_subscription`
|
### `stripe_update_subscription`
|
||||||
|
|
||||||
@@ -383,6 +430,9 @@ Update an existing subscription
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `subscription` | json | The updated subscription object |
|
| `subscription` | json | The updated subscription object |
|
||||||
| `metadata` | json | Subscription metadata including ID, status, and customer |
|
| `metadata` | json | Subscription metadata including ID, status, and customer |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `customer` | string | Associated customer ID |
|
||||||
|
|
||||||
### `stripe_cancel_subscription`
|
### `stripe_cancel_subscription`
|
||||||
|
|
||||||
@@ -403,6 +453,9 @@ Cancel a subscription
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `subscription` | json | The canceled subscription object |
|
| `subscription` | json | The canceled subscription object |
|
||||||
| `metadata` | json | Subscription metadata including ID, status, and customer |
|
| `metadata` | json | Subscription metadata including ID, status, and customer |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `customer` | string | Associated customer ID |
|
||||||
|
|
||||||
### `stripe_resume_subscription`
|
### `stripe_resume_subscription`
|
||||||
|
|
||||||
@@ -421,6 +474,9 @@ Resume a subscription that was scheduled for cancellation
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `subscription` | json | The resumed subscription object |
|
| `subscription` | json | The resumed subscription object |
|
||||||
| `metadata` | json | Subscription metadata including ID, status, and customer |
|
| `metadata` | json | Subscription metadata including ID, status, and customer |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `customer` | string | Associated customer ID |
|
||||||
|
|
||||||
### `stripe_list_subscriptions`
|
### `stripe_list_subscriptions`
|
||||||
|
|
||||||
@@ -442,6 +498,8 @@ List all subscriptions
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `subscriptions` | json | Array of subscription objects |
|
| `subscriptions` | json | Array of subscription objects |
|
||||||
| `metadata` | json | List metadata |
|
| `metadata` | json | List metadata |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_search_subscriptions`
|
### `stripe_search_subscriptions`
|
||||||
|
|
||||||
@@ -461,6 +519,8 @@ Search for subscriptions using query syntax
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `subscriptions` | json | Array of matching subscription objects |
|
| `subscriptions` | json | Array of matching subscription objects |
|
||||||
| `metadata` | json | Search metadata |
|
| `metadata` | json | Search metadata |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_create_invoice`
|
### `stripe_create_invoice`
|
||||||
|
|
||||||
@@ -483,6 +543,10 @@ Create a new invoice
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `invoice` | json | The created invoice object |
|
| `invoice` | json | The created invoice object |
|
||||||
| `metadata` | json | Invoice metadata |
|
| `metadata` | json | Invoice metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount_due` | number | Amount remaining to be paid in smallest currency unit |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_retrieve_invoice`
|
### `stripe_retrieve_invoice`
|
||||||
|
|
||||||
@@ -501,6 +565,10 @@ Retrieve an existing invoice by ID
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `invoice` | json | The retrieved invoice object |
|
| `invoice` | json | The retrieved invoice object |
|
||||||
| `metadata` | json | Invoice metadata |
|
| `metadata` | json | Invoice metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount_due` | number | Amount remaining to be paid in smallest currency unit |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_update_invoice`
|
### `stripe_update_invoice`
|
||||||
|
|
||||||
@@ -522,6 +590,10 @@ Update an existing invoice
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `invoice` | json | The updated invoice object |
|
| `invoice` | json | The updated invoice object |
|
||||||
| `metadata` | json | Invoice metadata |
|
| `metadata` | json | Invoice metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount_due` | number | Amount remaining to be paid in smallest currency unit |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_delete_invoice`
|
### `stripe_delete_invoice`
|
||||||
|
|
||||||
@@ -559,6 +631,10 @@ Finalize a draft invoice
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `invoice` | json | The finalized invoice object |
|
| `invoice` | json | The finalized invoice object |
|
||||||
| `metadata` | json | Invoice metadata |
|
| `metadata` | json | Invoice metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount_due` | number | Amount remaining to be paid in smallest currency unit |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_pay_invoice`
|
### `stripe_pay_invoice`
|
||||||
|
|
||||||
@@ -578,6 +654,10 @@ Pay an invoice
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `invoice` | json | The paid invoice object |
|
| `invoice` | json | The paid invoice object |
|
||||||
| `metadata` | json | Invoice metadata |
|
| `metadata` | json | Invoice metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount_due` | number | Amount remaining to be paid in smallest currency unit |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_void_invoice`
|
### `stripe_void_invoice`
|
||||||
|
|
||||||
@@ -596,6 +676,10 @@ Void an invoice
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `invoice` | json | The voided invoice object |
|
| `invoice` | json | The voided invoice object |
|
||||||
| `metadata` | json | Invoice metadata |
|
| `metadata` | json | Invoice metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount_due` | number | Amount remaining to be paid in smallest currency unit |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_send_invoice`
|
### `stripe_send_invoice`
|
||||||
|
|
||||||
@@ -614,6 +698,10 @@ Send an invoice to the customer
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `invoice` | json | The sent invoice object |
|
| `invoice` | json | The sent invoice object |
|
||||||
| `metadata` | json | Invoice metadata |
|
| `metadata` | json | Invoice metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount_due` | number | Amount remaining to be paid in smallest currency unit |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_list_invoices`
|
### `stripe_list_invoices`
|
||||||
|
|
||||||
@@ -634,6 +722,8 @@ List all invoices
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `invoices` | json | Array of invoice objects |
|
| `invoices` | json | Array of invoice objects |
|
||||||
| `metadata` | json | List metadata |
|
| `metadata` | json | List metadata |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_search_invoices`
|
### `stripe_search_invoices`
|
||||||
|
|
||||||
@@ -653,6 +743,8 @@ Search for invoices using query syntax
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `invoices` | json | Array of matching invoice objects |
|
| `invoices` | json | Array of matching invoice objects |
|
||||||
| `metadata` | json | Search metadata |
|
| `metadata` | json | Search metadata |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_create_charge`
|
### `stripe_create_charge`
|
||||||
|
|
||||||
@@ -677,6 +769,11 @@ Create a new charge to process a payment
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `charge` | json | The created Charge object |
|
| `charge` | json | The created Charge object |
|
||||||
| `metadata` | json | Charge metadata including ID, status, amount, currency, and paid status |
|
| `metadata` | json | Charge metadata including ID, status, amount, currency, and paid status |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount` | number | Amount in smallest currency unit \(e.g., cents\) |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
| ↳ `paid` | boolean | Whether payment has been received |
|
||||||
|
|
||||||
### `stripe_retrieve_charge`
|
### `stripe_retrieve_charge`
|
||||||
|
|
||||||
@@ -695,6 +792,11 @@ Retrieve an existing charge by ID
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `charge` | json | The retrieved Charge object |
|
| `charge` | json | The retrieved Charge object |
|
||||||
| `metadata` | json | Charge metadata including ID, status, amount, currency, and paid status |
|
| `metadata` | json | Charge metadata including ID, status, amount, currency, and paid status |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount` | number | Amount in smallest currency unit \(e.g., cents\) |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
| ↳ `paid` | boolean | Whether payment has been received |
|
||||||
|
|
||||||
### `stripe_update_charge`
|
### `stripe_update_charge`
|
||||||
|
|
||||||
@@ -715,6 +817,11 @@ Update an existing charge
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `charge` | json | The updated Charge object |
|
| `charge` | json | The updated Charge object |
|
||||||
| `metadata` | json | Charge metadata including ID, status, amount, currency, and paid status |
|
| `metadata` | json | Charge metadata including ID, status, amount, currency, and paid status |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount` | number | Amount in smallest currency unit \(e.g., cents\) |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
| ↳ `paid` | boolean | Whether payment has been received |
|
||||||
|
|
||||||
### `stripe_capture_charge`
|
### `stripe_capture_charge`
|
||||||
|
|
||||||
@@ -734,6 +841,11 @@ Capture an uncaptured charge
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `charge` | json | The captured Charge object |
|
| `charge` | json | The captured Charge object |
|
||||||
| `metadata` | json | Charge metadata including ID, status, amount, currency, and paid status |
|
| `metadata` | json | Charge metadata including ID, status, amount, currency, and paid status |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `status` | string | Current state of the resource |
|
||||||
|
| ↳ `amount` | number | Amount in smallest currency unit \(e.g., cents\) |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
| ↳ `paid` | boolean | Whether payment has been received |
|
||||||
|
|
||||||
### `stripe_list_charges`
|
### `stripe_list_charges`
|
||||||
|
|
||||||
@@ -754,6 +866,8 @@ List all charges
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `charges` | json | Array of Charge objects |
|
| `charges` | json | Array of Charge objects |
|
||||||
| `metadata` | json | List metadata including count and has_more |
|
| `metadata` | json | List metadata including count and has_more |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_search_charges`
|
### `stripe_search_charges`
|
||||||
|
|
||||||
@@ -773,6 +887,8 @@ Search for charges using query syntax
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `charges` | json | Array of matching Charge objects |
|
| `charges` | json | Array of matching Charge objects |
|
||||||
| `metadata` | json | Search metadata including count and has_more |
|
| `metadata` | json | Search metadata including count and has_more |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_create_product`
|
### `stripe_create_product`
|
||||||
|
|
||||||
@@ -795,6 +911,9 @@ Create a new product object
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `product` | json | The created product object |
|
| `product` | json | The created product object |
|
||||||
| `metadata` | json | Product metadata |
|
| `metadata` | json | Product metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `name` | string | Display name |
|
||||||
|
| ↳ `active` | boolean | Whether the resource is currently active |
|
||||||
|
|
||||||
### `stripe_retrieve_product`
|
### `stripe_retrieve_product`
|
||||||
|
|
||||||
@@ -813,6 +932,9 @@ Retrieve an existing product by ID
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `product` | json | The retrieved product object |
|
| `product` | json | The retrieved product object |
|
||||||
| `metadata` | json | Product metadata |
|
| `metadata` | json | Product metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `name` | string | Display name |
|
||||||
|
| ↳ `active` | boolean | Whether the resource is currently active |
|
||||||
|
|
||||||
### `stripe_update_product`
|
### `stripe_update_product`
|
||||||
|
|
||||||
@@ -836,6 +958,9 @@ Update an existing product
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `product` | json | The updated product object |
|
| `product` | json | The updated product object |
|
||||||
| `metadata` | json | Product metadata |
|
| `metadata` | json | Product metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `name` | string | Display name |
|
||||||
|
| ↳ `active` | boolean | Whether the resource is currently active |
|
||||||
|
|
||||||
### `stripe_delete_product`
|
### `stripe_delete_product`
|
||||||
|
|
||||||
@@ -873,6 +998,8 @@ List all products
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `products` | json | Array of product objects |
|
| `products` | json | Array of product objects |
|
||||||
| `metadata` | json | List metadata |
|
| `metadata` | json | List metadata |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_search_products`
|
### `stripe_search_products`
|
||||||
|
|
||||||
@@ -892,6 +1019,8 @@ Search for products using query syntax
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `products` | json | Array of matching product objects |
|
| `products` | json | Array of matching product objects |
|
||||||
| `metadata` | json | Search metadata |
|
| `metadata` | json | Search metadata |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_create_price`
|
### `stripe_create_price`
|
||||||
|
|
||||||
@@ -915,6 +1044,10 @@ Create a new price for a product
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `price` | json | The created price object |
|
| `price` | json | The created price object |
|
||||||
| `metadata` | json | Price metadata |
|
| `metadata` | json | Price metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `product` | string | Associated product ID |
|
||||||
|
| ↳ `unit_amount` | number | Amount in smallest currency unit \(e.g., cents\) |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_retrieve_price`
|
### `stripe_retrieve_price`
|
||||||
|
|
||||||
@@ -933,6 +1066,10 @@ Retrieve an existing price by ID
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `price` | json | The retrieved price object |
|
| `price` | json | The retrieved price object |
|
||||||
| `metadata` | json | Price metadata |
|
| `metadata` | json | Price metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `product` | string | Associated product ID |
|
||||||
|
| ↳ `unit_amount` | number | Amount in smallest currency unit \(e.g., cents\) |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_update_price`
|
### `stripe_update_price`
|
||||||
|
|
||||||
@@ -953,6 +1090,10 @@ Update an existing price
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `price` | json | The updated price object |
|
| `price` | json | The updated price object |
|
||||||
| `metadata` | json | Price metadata |
|
| `metadata` | json | Price metadata |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `product` | string | Associated product ID |
|
||||||
|
| ↳ `unit_amount` | number | Amount in smallest currency unit \(e.g., cents\) |
|
||||||
|
| ↳ `currency` | string | Three-letter ISO currency code \(lowercase\) |
|
||||||
|
|
||||||
### `stripe_list_prices`
|
### `stripe_list_prices`
|
||||||
|
|
||||||
@@ -973,6 +1114,8 @@ List all prices
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `prices` | json | Array of price objects |
|
| `prices` | json | Array of price objects |
|
||||||
| `metadata` | json | List metadata |
|
| `metadata` | json | List metadata |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_search_prices`
|
### `stripe_search_prices`
|
||||||
|
|
||||||
@@ -992,6 +1135,8 @@ Search for prices using query syntax
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `prices` | json | Array of matching price objects |
|
| `prices` | json | Array of matching price objects |
|
||||||
| `metadata` | json | Search metadata |
|
| `metadata` | json | Search metadata |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
### `stripe_retrieve_event`
|
### `stripe_retrieve_event`
|
||||||
|
|
||||||
@@ -1010,6 +1155,9 @@ Retrieve an existing Event by ID
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `event` | json | The retrieved Event object |
|
| `event` | json | The retrieved Event object |
|
||||||
| `metadata` | json | Event metadata including ID, type, and created timestamp |
|
| `metadata` | json | Event metadata including ID, type, and created timestamp |
|
||||||
|
| ↳ `id` | string | Stripe unique identifier |
|
||||||
|
| ↳ `type` | string | Event type identifier |
|
||||||
|
| ↳ `created` | number | Unix timestamp of creation |
|
||||||
|
|
||||||
### `stripe_list_events`
|
### `stripe_list_events`
|
||||||
|
|
||||||
@@ -1030,5 +1178,7 @@ List all Events
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `events` | json | Array of Event objects |
|
| `events` | json | Array of Event objects |
|
||||||
| `metadata` | json | List metadata including count and has_more |
|
| `metadata` | json | List metadata including count and has_more |
|
||||||
|
| ↳ `count` | number | Number of items returned |
|
||||||
|
| ↳ `has_more` | boolean | Whether more items exist beyond this page |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -279,6 +279,13 @@ Introspect Supabase database schema to get table structures, columns, and relati
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Operation status message |
|
| `message` | string | Operation status message |
|
||||||
| `tables` | array | Array of table schemas with columns, keys, and indexes |
|
| `tables` | array | Array of table schemas with columns, keys, and indexes |
|
||||||
|
| ↳ `name` | string | Table name |
|
||||||
|
| ↳ `schema` | string | Database schema name |
|
||||||
|
| ↳ `columns` | array | Array of column definitions |
|
||||||
|
| ↳ `primaryKey` | array | Array of primary key column names |
|
||||||
|
| ↳ `foreignKeys` | array | Array of foreign key relationships |
|
||||||
|
| ↳ `indexes` | array | Array of index definitions |
|
||||||
|
| `schemas` | array | List of schemas found in the database |
|
||||||
|
|
||||||
### `supabase_storage_upload`
|
### `supabase_storage_upload`
|
||||||
|
|
||||||
|
|||||||
@@ -65,7 +65,11 @@ Perform AI-powered web searches using Tavily
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `query` | string | The search query that was executed |
|
| `query` | string | The search query that was executed |
|
||||||
| `results` | array | results output from the tool |
|
| `results` | array | Search results with titles, URLs, content snippets, and optional metadata |
|
||||||
|
| `answer` | string | LLM-generated answer to the query \(if requested\) |
|
||||||
|
| `images` | array | Query-related images \(if requested\) |
|
||||||
|
| `auto_parameters` | object | Automatically selected parameters based on query intent \(if enabled\) |
|
||||||
|
| `response_time` | number | Time taken for the search request in seconds |
|
||||||
|
|
||||||
### `tavily_extract`
|
### `tavily_extract`
|
||||||
|
|
||||||
@@ -87,6 +91,13 @@ Extract raw content from multiple web pages simultaneously using Tavily
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | The URL that was extracted |
|
| `results` | array | The URL that was extracted |
|
||||||
|
| ↳ `url` | string | The URL that was extracted |
|
||||||
|
| ↳ `raw_content` | string | The raw text content from the webpage |
|
||||||
|
| ↳ `favicon` | string | Favicon URL \(if requested\) |
|
||||||
|
| `failed_results` | array | The URL that failed extraction |
|
||||||
|
| ↳ `url` | string | The URL that failed extraction |
|
||||||
|
| ↳ `error` | string | Error message for the failed extraction |
|
||||||
|
| `response_time` | number | Time taken for the extraction request in seconds |
|
||||||
|
|
||||||
### `tavily_crawl`
|
### `tavily_crawl`
|
||||||
|
|
||||||
@@ -118,6 +129,11 @@ Systematically crawl and extract content from websites using Tavily
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `base_url` | string | The base URL that was crawled |
|
| `base_url` | string | The base URL that was crawled |
|
||||||
| `results` | array | The crawled page URL |
|
| `results` | array | The crawled page URL |
|
||||||
|
| ↳ `url` | string | The crawled page URL |
|
||||||
|
| ↳ `raw_content` | string | Extracted content from the page |
|
||||||
|
| ↳ `favicon` | string | Favicon URL \(if requested\) |
|
||||||
|
| `response_time` | number | Time taken for the crawl request in seconds |
|
||||||
|
| `request_id` | string | Unique identifier for support reference |
|
||||||
|
|
||||||
### `tavily_map`
|
### `tavily_map`
|
||||||
|
|
||||||
@@ -145,5 +161,8 @@ Discover and visualize website structure using Tavily
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `base_url` | string | The base URL that was mapped |
|
| `base_url` | string | The base URL that was mapped |
|
||||||
| `results` | array | Discovered URL |
|
| `results` | array | Discovered URL |
|
||||||
|
| ↳ `url` | string | Discovered URL |
|
||||||
|
| `response_time` | number | Time taken for the map request in seconds |
|
||||||
|
| `request_id` | string | Unique identifier for support reference |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,24 @@ Send messages to Telegram channels or users through the Telegram Bot API. Enable
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Telegram message data |
|
| `data` | object | Telegram message data |
|
||||||
|
| ↳ `message_id` | number | Unique Telegram message identifier |
|
||||||
|
| ↳ `from` | object | Chat information |
|
||||||
|
| ↳ `id` | number | Chat ID |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
|
||||||
|
| ↳ `first_name` | string | Chat username \(if available\) |
|
||||||
|
| ↳ `username` | string | Chat title \(for groups and channels\) |
|
||||||
|
| ↳ `id` | number | Bot user ID |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
|
||||||
|
| ↳ `first_name` | string | Bot first name |
|
||||||
|
| ↳ `username` | string | Bot username |
|
||||||
|
| ↳ `chat` | object | Information about the bot that sent the message |
|
||||||
|
| ↳ `id` | number | Bot user ID |
|
||||||
|
| ↳ `first_name` | string | Bot first name |
|
||||||
|
| ↳ `username` | string | Bot username |
|
||||||
|
| ↳ `type` | string | chat type private or channel |
|
||||||
|
| ↳ `type` | string | chat type private or channel |
|
||||||
|
| ↳ `date` | number | Unix timestamp when message was sent |
|
||||||
|
| ↳ `text` | string | Text content of the sent message |
|
||||||
|
|
||||||
### `telegram_delete_message`
|
### `telegram_delete_message`
|
||||||
|
|
||||||
@@ -95,6 +113,8 @@ Delete messages in Telegram channels or chats through the Telegram Bot API. Requ
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Delete operation result |
|
| `data` | object | Delete operation result |
|
||||||
|
| ↳ `ok` | boolean | API response success status |
|
||||||
|
| ↳ `deleted` | boolean | Whether the message was successfully deleted |
|
||||||
|
|
||||||
### `telegram_send_photo`
|
### `telegram_send_photo`
|
||||||
|
|
||||||
@@ -115,6 +135,35 @@ Send photos to Telegram channels or users through the Telegram Bot API.
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Telegram message data including optional photo\(s\) |
|
| `data` | object | Telegram message data including optional photo\(s\) |
|
||||||
|
| ↳ `message_id` | number | Unique Telegram message identifier |
|
||||||
|
| ↳ `from` | object | Chat information |
|
||||||
|
| ↳ `id` | number | Chat ID |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
|
||||||
|
| ↳ `first_name` | string | Chat username \(if available\) |
|
||||||
|
| ↳ `username` | string | Chat title \(for groups and channels\) |
|
||||||
|
| ↳ `id` | number | Bot user ID |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
|
||||||
|
| ↳ `first_name` | string | Bot first name |
|
||||||
|
| ↳ `username` | string | Bot username |
|
||||||
|
| ↳ `chat` | object | Information about the bot that sent the message |
|
||||||
|
| ↳ `id` | number | Bot user ID |
|
||||||
|
| ↳ `first_name` | string | Bot first name |
|
||||||
|
| ↳ `username` | string | Bot username |
|
||||||
|
| ↳ `type` | string | Chat type \(private, group, supergroup, channel\) |
|
||||||
|
| ↳ `type` | string | Chat type \(private, group, supergroup, channel\) |
|
||||||
|
| ↳ `date` | number | Unix timestamp when message was sent |
|
||||||
|
| ↳ `text` | string | Text content of the sent message \(if applicable\) |
|
||||||
|
| ↳ `photo` | array | List of photos included in the message |
|
||||||
|
| ↳ `file_id` | string | Unique file ID of the photo |
|
||||||
|
| ↳ `file_unique_id` | string | Unique identifier for this file across different bots |
|
||||||
|
| ↳ `file_size` | number | Size of the photo file in bytes |
|
||||||
|
| ↳ `width` | number | Photo width in pixels |
|
||||||
|
| ↳ `height` | number | Photo height in pixels |
|
||||||
|
| ↳ `file_id` | string | Unique file ID of the photo |
|
||||||
|
| ↳ `file_unique_id` | string | Unique identifier for this file across different bots |
|
||||||
|
| ↳ `file_size` | number | Size of the photo file in bytes |
|
||||||
|
| ↳ `width` | number | Photo width in pixels |
|
||||||
|
| ↳ `height` | number | Photo height in pixels |
|
||||||
|
|
||||||
### `telegram_send_video`
|
### `telegram_send_video`
|
||||||
|
|
||||||
@@ -135,6 +184,85 @@ Send videos to Telegram channels or users through the Telegram Bot API.
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Telegram message data including optional media |
|
| `data` | object | Telegram message data including optional media |
|
||||||
|
| ↳ `message_id` | number | Unique Telegram message identifier |
|
||||||
|
| ↳ `from` | object | Information about the sender |
|
||||||
|
| ↳ `id` | number | Sender ID |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
|
||||||
|
| ↳ `first_name` | string | Sender |
|
||||||
|
| ↳ `username` | string | Sender |
|
||||||
|
| ↳ `id` | number | Chat ID |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
|
||||||
|
| ↳ `first_name` | string | Chat first name \(if private chat\) |
|
||||||
|
| ↳ `username` | string | Chat username \(for private or channels\) |
|
||||||
|
| ↳ `chat` | object | Information about the chat where message was sent |
|
||||||
|
| ↳ `id` | number | Chat ID |
|
||||||
|
| ↳ `first_name` | string | Chat first name \(if private chat\) |
|
||||||
|
| ↳ `username` | string | Chat username \(for private or channels\) |
|
||||||
|
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
|
||||||
|
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
|
||||||
|
| ↳ `date` | number | Unix timestamp when the message was sent |
|
||||||
|
| ↳ `text` | string | Text content of the sent message \(if applicable\) |
|
||||||
|
| ↳ `format` | object | Media format information \(for videos, GIFs, etc.\) |
|
||||||
|
| ↳ `file_name` | string | Media file name |
|
||||||
|
| ↳ `mime_type` | string | Media MIME type |
|
||||||
|
| ↳ `duration` | number | Duration of media in seconds |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `thumbnail` | object | Thumbnail image details |
|
||||||
|
| ↳ `file_id` | string | Thumbnail file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
|
||||||
|
| ↳ `file_size` | number | Thumbnail file size in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `file_id` | string | Media file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique media file identifier |
|
||||||
|
| ↳ `file_size` | number | Size of media file in bytes |
|
||||||
|
| ↳ `thumb` | object | Secondary thumbnail details \(duplicate of thumbnail\) |
|
||||||
|
| ↳ `file_id` | string | Thumbnail file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
|
||||||
|
| ↳ `file_size` | number | Thumbnail file size in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `file_name` | string | Document file name |
|
||||||
|
| ↳ `mime_type` | string | Document MIME type |
|
||||||
|
| ↳ `duration` | number | Duration of media in seconds |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `thumbnail` | object | Document thumbnail information |
|
||||||
|
| ↳ `file_id` | string | Thumbnail file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
|
||||||
|
| ↳ `file_size` | number | Thumbnail file size in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `file_id` | string | Document file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique document file identifier |
|
||||||
|
| ↳ `file_size` | number | Size of document file in bytes |
|
||||||
|
| ↳ `thumb` | object | Duplicate thumbnail info \(used for compatibility\) |
|
||||||
|
| ↳ `file_id` | string | Thumbnail file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
|
||||||
|
| ↳ `file_size` | number | Thumbnail file size in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `document` | object | Document file details if the message contains a document |
|
||||||
|
| ↳ `file_name` | string | Document file name |
|
||||||
|
| ↳ `mime_type` | string | Document MIME type |
|
||||||
|
| ↳ `thumbnail` | object | Document thumbnail information |
|
||||||
|
| ↳ `file_id` | string | Thumbnail file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
|
||||||
|
| ↳ `file_size` | number | Thumbnail file size in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `file_id` | string | Document file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique document file identifier |
|
||||||
|
| ↳ `file_size` | number | Size of document file in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `thumb` | object | Duplicate thumbnail info \(used for compatibility\) |
|
||||||
|
| ↳ `file_id` | string | Thumbnail file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
|
||||||
|
| ↳ `file_size` | number | Thumbnail file size in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
|
||||||
### `telegram_send_audio`
|
### `telegram_send_audio`
|
||||||
|
|
||||||
@@ -155,6 +283,41 @@ Send audio files to Telegram channels or users through the Telegram Bot API.
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Telegram message data including voice/audio information |
|
| `data` | object | Telegram message data including voice/audio information |
|
||||||
|
| ↳ `message_id` | number | Unique Telegram message identifier |
|
||||||
|
| ↳ `from` | object | Information about the sender |
|
||||||
|
| ↳ `id` | number | Sender ID |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
|
||||||
|
| ↳ `first_name` | string | Sender |
|
||||||
|
| ↳ `username` | string | Sender |
|
||||||
|
| ↳ `id` | number | Chat ID |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
|
||||||
|
| ↳ `first_name` | string | Chat first name \(if private chat\) |
|
||||||
|
| ↳ `username` | string | Chat username \(for private or channels\) |
|
||||||
|
| ↳ `chat` | object | Information about the chat where the message was sent |
|
||||||
|
| ↳ `id` | number | Chat ID |
|
||||||
|
| ↳ `first_name` | string | Chat first name \(if private chat\) |
|
||||||
|
| ↳ `username` | string | Chat username \(for private or channels\) |
|
||||||
|
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
|
||||||
|
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
|
||||||
|
| ↳ `date` | number | Unix timestamp when the message was sent |
|
||||||
|
| ↳ `text` | string | Text content of the sent message \(if applicable\) |
|
||||||
|
| ↳ `audio` | object | Audio file details |
|
||||||
|
| ↳ `duration` | number | Duration of the audio in seconds |
|
||||||
|
| ↳ `performer` | string | Performer of the audio |
|
||||||
|
| ↳ `title` | string | Title of the audio |
|
||||||
|
| ↳ `file_name` | string | Original filename of the audio |
|
||||||
|
| ↳ `mime_type` | string | MIME type of the audio file |
|
||||||
|
| ↳ `file_id` | string | Unique file identifier for this audio |
|
||||||
|
| ↳ `file_unique_id` | string | Unique identifier across different bots for this file |
|
||||||
|
| ↳ `file_size` | number | Size of the audio file in bytes |
|
||||||
|
| ↳ `duration` | number | Duration of the audio in seconds |
|
||||||
|
| ↳ `performer` | string | Performer of the audio |
|
||||||
|
| ↳ `title` | string | Title of the audio |
|
||||||
|
| ↳ `file_name` | string | Original filename of the audio |
|
||||||
|
| ↳ `mime_type` | string | MIME type of the audio file |
|
||||||
|
| ↳ `file_id` | string | Unique file identifier for this audio |
|
||||||
|
| ↳ `file_unique_id` | string | Unique identifier across different bots for this file |
|
||||||
|
| ↳ `file_size` | number | Size of the audio file in bytes |
|
||||||
|
|
||||||
### `telegram_send_animation`
|
### `telegram_send_animation`
|
||||||
|
|
||||||
@@ -175,6 +338,85 @@ Send animations (GIFs) to Telegram channels or users through the Telegram Bot AP
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Telegram message data including optional media |
|
| `data` | object | Telegram message data including optional media |
|
||||||
|
| ↳ `message_id` | number | Unique Telegram message identifier |
|
||||||
|
| ↳ `from` | object | Information about the sender |
|
||||||
|
| ↳ `id` | number | Sender ID |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
|
||||||
|
| ↳ `first_name` | string | Sender |
|
||||||
|
| ↳ `username` | string | Sender |
|
||||||
|
| ↳ `id` | number | Chat ID |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
|
||||||
|
| ↳ `first_name` | string | Chat first name \(if private chat\) |
|
||||||
|
| ↳ `username` | string | Chat username \(for private or channels\) |
|
||||||
|
| ↳ `chat` | object | Information about the chat where message was sent |
|
||||||
|
| ↳ `id` | number | Chat ID |
|
||||||
|
| ↳ `first_name` | string | Chat first name \(if private chat\) |
|
||||||
|
| ↳ `username` | string | Chat username \(for private or channels\) |
|
||||||
|
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
|
||||||
|
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
|
||||||
|
| ↳ `date` | number | Unix timestamp when the message was sent |
|
||||||
|
| ↳ `text` | string | Text content of the sent message \(if applicable\) |
|
||||||
|
| ↳ `format` | object | Media format information \(for videos, GIFs, etc.\) |
|
||||||
|
| ↳ `file_name` | string | Media file name |
|
||||||
|
| ↳ `mime_type` | string | Media MIME type |
|
||||||
|
| ↳ `duration` | number | Duration of media in seconds |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `thumbnail` | object | Thumbnail image details |
|
||||||
|
| ↳ `file_id` | string | Thumbnail file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
|
||||||
|
| ↳ `file_size` | number | Thumbnail file size in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `file_id` | string | Media file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique media file identifier |
|
||||||
|
| ↳ `file_size` | number | Size of media file in bytes |
|
||||||
|
| ↳ `thumb` | object | Secondary thumbnail details \(duplicate of thumbnail\) |
|
||||||
|
| ↳ `file_id` | string | Thumbnail file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
|
||||||
|
| ↳ `file_size` | number | Thumbnail file size in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `file_name` | string | Document file name |
|
||||||
|
| ↳ `mime_type` | string | Document MIME type |
|
||||||
|
| ↳ `duration` | number | Duration of media in seconds |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `thumbnail` | object | Document thumbnail information |
|
||||||
|
| ↳ `file_id` | string | Thumbnail file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
|
||||||
|
| ↳ `file_size` | number | Thumbnail file size in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `file_id` | string | Document file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique document file identifier |
|
||||||
|
| ↳ `file_size` | number | Size of document file in bytes |
|
||||||
|
| ↳ `thumb` | object | Duplicate thumbnail info \(used for compatibility\) |
|
||||||
|
| ↳ `file_id` | string | Thumbnail file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
|
||||||
|
| ↳ `file_size` | number | Thumbnail file size in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `document` | object | Document file details if the message contains a document |
|
||||||
|
| ↳ `file_name` | string | Document file name |
|
||||||
|
| ↳ `mime_type` | string | Document MIME type |
|
||||||
|
| ↳ `thumbnail` | object | Document thumbnail information |
|
||||||
|
| ↳ `file_id` | string | Thumbnail file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
|
||||||
|
| ↳ `file_size` | number | Thumbnail file size in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `file_id` | string | Document file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique document file identifier |
|
||||||
|
| ↳ `file_size` | number | Size of document file in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
| ↳ `thumb` | object | Duplicate thumbnail info \(used for compatibility\) |
|
||||||
|
| ↳ `file_id` | string | Thumbnail file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
|
||||||
|
| ↳ `file_size` | number | Thumbnail file size in bytes |
|
||||||
|
| ↳ `width` | number | Thumbnail width in pixels |
|
||||||
|
| ↳ `height` | number | Thumbnail height in pixels |
|
||||||
|
|
||||||
### `telegram_send_document`
|
### `telegram_send_document`
|
||||||
|
|
||||||
@@ -195,5 +437,33 @@ Send documents (PDF, ZIP, DOC, etc.) to Telegram channels or users through the T
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `message` | string | Success or error message |
|
| `message` | string | Success or error message |
|
||||||
| `data` | object | Telegram message data including document |
|
| `data` | object | Telegram message data including document |
|
||||||
|
| ↳ `message_id` | number | Unique Telegram message identifier |
|
||||||
|
| ↳ `from` | object | Information about the sender |
|
||||||
|
| ↳ `id` | number | Sender ID |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
|
||||||
|
| ↳ `first_name` | string | Sender |
|
||||||
|
| ↳ `username` | string | Sender |
|
||||||
|
| ↳ `id` | number | Chat ID |
|
||||||
|
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
|
||||||
|
| ↳ `first_name` | string | Chat first name \(if private chat\) |
|
||||||
|
| ↳ `username` | string | Chat username \(for private or channels\) |
|
||||||
|
| ↳ `chat` | object | Information about the chat where message was sent |
|
||||||
|
| ↳ `id` | number | Chat ID |
|
||||||
|
| ↳ `first_name` | string | Chat first name \(if private chat\) |
|
||||||
|
| ↳ `username` | string | Chat username \(for private or channels\) |
|
||||||
|
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
|
||||||
|
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
|
||||||
|
| ↳ `date` | number | Unix timestamp when the message was sent |
|
||||||
|
| ↳ `document` | object | Document file details |
|
||||||
|
| ↳ `file_name` | string | Document file name |
|
||||||
|
| ↳ `mime_type` | string | Document MIME type |
|
||||||
|
| ↳ `file_id` | string | Document file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique document file identifier |
|
||||||
|
| ↳ `file_size` | number | Size of document file in bytes |
|
||||||
|
| ↳ `file_name` | string | Document file name |
|
||||||
|
| ↳ `mime_type` | string | Document MIME type |
|
||||||
|
| ↳ `file_id` | string | Document file ID |
|
||||||
|
| ↳ `file_unique_id` | string | Unique document file identifier |
|
||||||
|
| ↳ `file_size` | number | Size of document file in bytes |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
65
apps/docs/content/docs/en/tools/tinybird.mdx
Normal file
65
apps/docs/content/docs/en/tools/tinybird.mdx
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
title: Tinybird
|
||||||
|
description: Send events and query data with Tinybird
|
||||||
|
---
|
||||||
|
|
||||||
|
import { BlockInfoCard } from "@/components/ui/block-info-card"
|
||||||
|
|
||||||
|
<BlockInfoCard
|
||||||
|
type="tinybird"
|
||||||
|
color="#2EF598"
|
||||||
|
/>
|
||||||
|
|
||||||
|
## Usage Instructions
|
||||||
|
|
||||||
|
Interact with Tinybird using the Events API to stream JSON or NDJSON events, or use the Query API to execute SQL queries against Pipes and Data Sources.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Tools
|
||||||
|
|
||||||
|
### `tinybird_events`
|
||||||
|
|
||||||
|
Send events to a Tinybird Data Source using the Events API. Supports JSON and NDJSON formats with optional gzip compression.
|
||||||
|
|
||||||
|
#### Input
|
||||||
|
|
||||||
|
| Parameter | Type | Required | Description |
|
||||||
|
| --------- | ---- | -------- | ----------- |
|
||||||
|
| `base_url` | string | Yes | Tinybird API base URL \(e.g., https://api.tinybird.co or https://api.us-east.tinybird.co\) |
|
||||||
|
| `datasource` | string | Yes | Name of the Tinybird Data Source to send events to |
|
||||||
|
| `data` | string | Yes | Data to send as NDJSON \(newline-delimited JSON\) or JSON string. Each event should be a valid JSON object. |
|
||||||
|
| `wait` | boolean | No | Wait for database acknowledgment before responding. Enables safer retries but introduces latency. Defaults to false. |
|
||||||
|
| `format` | string | No | Format of the events data: "ndjson" \(default\) or "json" |
|
||||||
|
| `compression` | string | No | Compression format: "none" \(default\) or "gzip" |
|
||||||
|
| `token` | string | Yes | Tinybird API Token with DATASOURCE:APPEND or DATASOURCE:CREATE scope |
|
||||||
|
|
||||||
|
#### Output
|
||||||
|
|
||||||
|
| Parameter | Type | Description |
|
||||||
|
| --------- | ---- | ----------- |
|
||||||
|
| `successful_rows` | number | Number of rows successfully ingested |
|
||||||
|
| `quarantined_rows` | number | Number of rows quarantined \(failed validation\) |
|
||||||
|
|
||||||
|
### `tinybird_query`
|
||||||
|
|
||||||
|
Execute SQL queries against Tinybird Pipes and Data Sources using the Query API.
|
||||||
|
|
||||||
|
#### Input
|
||||||
|
|
||||||
|
| Parameter | Type | Required | Description |
|
||||||
|
| --------- | ---- | -------- | ----------- |
|
||||||
|
| `base_url` | string | Yes | Tinybird API base URL \(e.g., https://api.tinybird.co\) |
|
||||||
|
| `query` | string | Yes | SQL query to execute. Specify your desired output format \(e.g., FORMAT JSON, FORMAT CSV, FORMAT TSV\). JSON format provides structured data, while other formats return raw text. |
|
||||||
|
| `pipeline` | string | No | Optional pipe name. When provided, enables SELECT * FROM _ syntax |
|
||||||
|
| `token` | string | Yes | Tinybird API Token with PIPE:READ scope |
|
||||||
|
|
||||||
|
#### Output
|
||||||
|
|
||||||
|
| Parameter | Type | Description |
|
||||||
|
| --------- | ---- | ----------- |
|
||||||
|
| `data` | json | Query result data. For FORMAT JSON: array of objects. For other formats \(CSV, TSV, etc.\): raw text string. |
|
||||||
|
| `rows` | number | Number of rows returned \(only available with FORMAT JSON\) |
|
||||||
|
| `statistics` | json | Query execution statistics - elapsed time, rows read, bytes read \(only available with FORMAT JSON\) |
|
||||||
|
|
||||||
|
|
||||||
@@ -94,6 +94,33 @@ Retrieve insights and analytics for Typeform forms
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `fields` | array | Number of users who dropped off at this field |
|
| `fields` | array | Number of users who dropped off at this field |
|
||||||
|
| ↳ `dropoffs` | number | Number of users who dropped off at this field |
|
||||||
|
| ↳ `id` | string | Unique field ID |
|
||||||
|
| ↳ `label` | string | Field label |
|
||||||
|
| ↳ `ref` | string | Field reference name |
|
||||||
|
| ↳ `title` | string | Field title/question |
|
||||||
|
| ↳ `type` | string | Field type \(e.g., short_text, multiple_choice\) |
|
||||||
|
| ↳ `views` | number | Number of times this field was viewed |
|
||||||
|
| `form` | object | Average completion time for this platform |
|
||||||
|
| ↳ `platforms` | array | Average completion time for this platform |
|
||||||
|
| ↳ `average_time` | number | Average completion time for this platform |
|
||||||
|
| ↳ `completion_rate` | number | Completion rate for this platform |
|
||||||
|
| ↳ `platform` | string | Platform name \(e.g., desktop, mobile\) |
|
||||||
|
| ↳ `responses_count` | number | Number of responses from this platform |
|
||||||
|
| ↳ `total_visits` | number | Total visits from this platform |
|
||||||
|
| ↳ `unique_visits` | number | Unique visits from this platform |
|
||||||
|
| ↳ `average_time` | number | Overall average completion time |
|
||||||
|
| ↳ `completion_rate` | number | Overall completion rate |
|
||||||
|
| ↳ `platform` | string | Platform name \(e.g., desktop, mobile\) |
|
||||||
|
| ↳ `responses_count` | number | Total number of responses |
|
||||||
|
| ↳ `total_visits` | number | Total number of visits |
|
||||||
|
| ↳ `unique_visits` | number | Total number of unique visits |
|
||||||
|
| ↳ `summary` | object | Overall average completion time |
|
||||||
|
| ↳ `average_time` | number | Overall average completion time |
|
||||||
|
| ↳ `completion_rate` | number | Overall completion rate |
|
||||||
|
| ↳ `responses_count` | number | Total number of responses |
|
||||||
|
| ↳ `total_visits` | number | Total number of visits |
|
||||||
|
| ↳ `unique_visits` | number | Total number of unique visits |
|
||||||
|
|
||||||
### `typeform_list_forms`
|
### `typeform_list_forms`
|
||||||
|
|
||||||
|
|||||||
@@ -55,5 +55,8 @@ Process and analyze images using advanced vision models. Capable of understandin
|
|||||||
| `model` | string | The vision model that was used for analysis |
|
| `model` | string | The vision model that was used for analysis |
|
||||||
| `tokens` | number | Total tokens used for the analysis |
|
| `tokens` | number | Total tokens used for the analysis |
|
||||||
| `usage` | object | Detailed token usage breakdown |
|
| `usage` | object | Detailed token usage breakdown |
|
||||||
|
| ↳ `input_tokens` | number | Tokens used for input processing |
|
||||||
|
| ↳ `output_tokens` | number | Tokens used for response generation |
|
||||||
|
| ↳ `total_tokens` | number | Total tokens consumed |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,15 @@ Read content from a Wealthbox note
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Note data and metadata |
|
| `output` | object | Note data and metadata |
|
||||||
|
| ↳ `content` | string | Formatted note information |
|
||||||
|
| ↳ `note` | object | Raw note data from Wealthbox |
|
||||||
|
| ↳ `metadata` | object | Operation metadata |
|
||||||
|
| ↳ `itemId` | string | ID of the note |
|
||||||
|
| ↳ `noteId` | string | ID of the note |
|
||||||
|
| ↳ `itemType` | string | Type of item \(note\) |
|
||||||
|
| ↳ `itemId` | string | ID of the note |
|
||||||
|
| ↳ `noteId` | string | ID of the note |
|
||||||
|
| ↳ `itemType` | string | Type of item \(note\) |
|
||||||
|
|
||||||
### `wealthbox_write_note`
|
### `wealthbox_write_note`
|
||||||
|
|
||||||
@@ -68,6 +77,15 @@ Create or update a Wealthbox note
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created or updated note data and metadata |
|
| `output` | object | Created or updated note data and metadata |
|
||||||
|
| ↳ `note` | object | Raw note data from Wealthbox |
|
||||||
|
| ↳ `success` | boolean | Operation success indicator |
|
||||||
|
| ↳ `metadata` | object | Operation metadata |
|
||||||
|
| ↳ `itemId` | string | ID of the created/updated note |
|
||||||
|
| ↳ `noteId` | string | ID of the created/updated note |
|
||||||
|
| ↳ `itemType` | string | Type of item \(note\) |
|
||||||
|
| ↳ `itemId` | string | ID of the created/updated note |
|
||||||
|
| ↳ `noteId` | string | ID of the created/updated note |
|
||||||
|
| ↳ `itemType` | string | Type of item \(note\) |
|
||||||
|
|
||||||
### `wealthbox_read_contact`
|
### `wealthbox_read_contact`
|
||||||
|
|
||||||
@@ -85,6 +103,15 @@ Read content from a Wealthbox contact
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Contact data and metadata |
|
| `output` | object | Contact data and metadata |
|
||||||
|
| ↳ `content` | string | Formatted contact information |
|
||||||
|
| ↳ `contact` | object | Raw contact data from Wealthbox |
|
||||||
|
| ↳ `metadata` | object | Operation metadata |
|
||||||
|
| ↳ `itemId` | string | ID of the contact |
|
||||||
|
| ↳ `contactId` | string | ID of the contact |
|
||||||
|
| ↳ `itemType` | string | Type of item \(contact\) |
|
||||||
|
| ↳ `itemId` | string | ID of the contact |
|
||||||
|
| ↳ `contactId` | string | ID of the contact |
|
||||||
|
| ↳ `itemType` | string | Type of item \(contact\) |
|
||||||
|
|
||||||
### `wealthbox_write_contact`
|
### `wealthbox_write_contact`
|
||||||
|
|
||||||
@@ -105,6 +132,15 @@ Create a new Wealthbox contact
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created or updated contact data and metadata |
|
| `output` | object | Created or updated contact data and metadata |
|
||||||
|
| ↳ `contact` | object | Raw contact data from Wealthbox |
|
||||||
|
| ↳ `success` | boolean | Operation success indicator |
|
||||||
|
| ↳ `metadata` | object | Operation metadata |
|
||||||
|
| ↳ `itemId` | string | ID of the created/updated contact |
|
||||||
|
| ↳ `contactId` | string | ID of the created/updated contact |
|
||||||
|
| ↳ `itemType` | string | Type of item \(contact\) |
|
||||||
|
| ↳ `itemId` | string | ID of the created/updated contact |
|
||||||
|
| ↳ `contactId` | string | ID of the created/updated contact |
|
||||||
|
| ↳ `itemType` | string | Type of item \(contact\) |
|
||||||
|
|
||||||
### `wealthbox_read_task`
|
### `wealthbox_read_task`
|
||||||
|
|
||||||
@@ -122,6 +158,15 @@ Read content from a Wealthbox task
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Task data and metadata |
|
| `output` | object | Task data and metadata |
|
||||||
|
| ↳ `content` | string | Formatted task information |
|
||||||
|
| ↳ `task` | object | Raw task data from Wealthbox |
|
||||||
|
| ↳ `metadata` | object | Operation metadata |
|
||||||
|
| ↳ `itemId` | string | ID of the task |
|
||||||
|
| ↳ `taskId` | string | ID of the task |
|
||||||
|
| ↳ `itemType` | string | Type of item \(task\) |
|
||||||
|
| ↳ `itemId` | string | ID of the task |
|
||||||
|
| ↳ `taskId` | string | ID of the task |
|
||||||
|
| ↳ `itemType` | string | Type of item \(task\) |
|
||||||
|
|
||||||
### `wealthbox_write_task`
|
### `wealthbox_write_task`
|
||||||
|
|
||||||
@@ -142,5 +187,14 @@ Create or update a Wealthbox task
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `success` | boolean | Operation success status |
|
| `success` | boolean | Operation success status |
|
||||||
| `output` | object | Created or updated task data and metadata |
|
| `output` | object | Created or updated task data and metadata |
|
||||||
|
| ↳ `task` | object | Raw task data from Wealthbox |
|
||||||
|
| ↳ `success` | boolean | Operation success indicator |
|
||||||
|
| ↳ `metadata` | object | Operation metadata |
|
||||||
|
| ↳ `itemId` | string | ID of the created/updated task |
|
||||||
|
| ↳ `taskId` | string | ID of the created/updated task |
|
||||||
|
| ↳ `itemType` | string | Type of item \(task\) |
|
||||||
|
| ↳ `itemId` | string | ID of the created/updated task |
|
||||||
|
| ↳ `taskId` | string | ID of the created/updated task |
|
||||||
|
| ↳ `itemType` | string | Type of item \(task\) |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,12 @@ Get a summary and metadata for a specific Wikipedia page.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `summary` | object | Wikipedia page summary and metadata |
|
| `summary` | object | Wikipedia page summary and metadata |
|
||||||
|
| ↳ `title` | string | Page title |
|
||||||
|
| ↳ `extract` | string | Page extract/summary text |
|
||||||
|
| ↳ `description` | string | Short page description |
|
||||||
|
| ↳ `thumbnail` | object | Thumbnail image data |
|
||||||
|
| ↳ `content_urls` | object | URLs to access the page |
|
||||||
|
| ↳ `pageid` | number | Wikipedia page ID |
|
||||||
|
|
||||||
### `wikipedia_search`
|
### `wikipedia_search`
|
||||||
|
|
||||||
@@ -64,6 +70,8 @@ Search for Wikipedia pages by title or content.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `searchResults` | array | Array of matching Wikipedia pages |
|
| `searchResults` | array | Array of matching Wikipedia pages |
|
||||||
|
| `totalHits` | number | Total number of search results found |
|
||||||
|
| `query` | string | The search query that was executed |
|
||||||
|
|
||||||
### `wikipedia_content`
|
### `wikipedia_content`
|
||||||
|
|
||||||
@@ -80,6 +88,11 @@ Get the full HTML content of a Wikipedia page.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `content` | object | Full HTML content and metadata of the Wikipedia page |
|
| `content` | object | Full HTML content and metadata of the Wikipedia page |
|
||||||
|
| ↳ `title` | string | Page title |
|
||||||
|
| ↳ `pageid` | number | Wikipedia page ID |
|
||||||
|
| ↳ `html` | string | Full HTML content of the page |
|
||||||
|
| ↳ `revision` | number | Page revision number |
|
||||||
|
| ↳ `timestamp` | string | Last modified timestamp |
|
||||||
|
|
||||||
### `wikipedia_random`
|
### `wikipedia_random`
|
||||||
|
|
||||||
@@ -95,5 +108,10 @@ Get a random Wikipedia page.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `randomPage` | object | Random Wikipedia page data |
|
| `randomPage` | object | Random Wikipedia page data |
|
||||||
|
| ↳ `title` | string | Page title |
|
||||||
|
| ↳ `extract` | string | Page extract/summary |
|
||||||
|
| ↳ `description` | string | Page description |
|
||||||
|
| ↳ `thumbnail` | object | Thumbnail image data |
|
||||||
|
| ↳ `content_urls` | object | URLs to access the page |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,20 @@ Create a new blog post in WordPress.com
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `post` | object | The created post |
|
| `post` | object | The created post |
|
||||||
|
| ↳ `id` | number | Post ID |
|
||||||
|
| ↳ `date` | string | Post creation date |
|
||||||
|
| ↳ `modified` | string | Post modification date |
|
||||||
|
| ↳ `slug` | string | Post slug |
|
||||||
|
| ↳ `status` | string | Post status |
|
||||||
|
| ↳ `type` | string | Post type |
|
||||||
|
| ↳ `link` | string | Post URL |
|
||||||
|
| ↳ `title` | object | Post title object |
|
||||||
|
| ↳ `content` | object | Post content object |
|
||||||
|
| ↳ `excerpt` | object | Post excerpt object |
|
||||||
|
| ↳ `author` | number | Author ID |
|
||||||
|
| ↳ `featured_media` | number | Featured media ID |
|
||||||
|
| ↳ `categories` | array | Category IDs |
|
||||||
|
| ↳ `tags` | array | Tag IDs |
|
||||||
|
|
||||||
### `wordpress_update_post`
|
### `wordpress_update_post`
|
||||||
|
|
||||||
@@ -75,6 +89,20 @@ Update an existing blog post in WordPress.com
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `post` | object | The updated post |
|
| `post` | object | The updated post |
|
||||||
|
| ↳ `id` | number | Post ID |
|
||||||
|
| ↳ `date` | string | Post creation date |
|
||||||
|
| ↳ `modified` | string | Post modification date |
|
||||||
|
| ↳ `slug` | string | Post slug |
|
||||||
|
| ↳ `status` | string | Post status |
|
||||||
|
| ↳ `type` | string | Post type |
|
||||||
|
| ↳ `link` | string | Post URL |
|
||||||
|
| ↳ `title` | object | Post title object |
|
||||||
|
| ↳ `content` | object | Post content object |
|
||||||
|
| ↳ `excerpt` | object | Post excerpt object |
|
||||||
|
| ↳ `author` | number | Author ID |
|
||||||
|
| ↳ `featured_media` | number | Featured media ID |
|
||||||
|
| ↳ `categories` | array | Category IDs |
|
||||||
|
| ↳ `tags` | array | Tag IDs |
|
||||||
|
|
||||||
### `wordpress_delete_post`
|
### `wordpress_delete_post`
|
||||||
|
|
||||||
@@ -94,6 +122,20 @@ Delete a blog post from WordPress.com
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `deleted` | boolean | Whether the post was deleted |
|
| `deleted` | boolean | Whether the post was deleted |
|
||||||
| `post` | object | The deleted post |
|
| `post` | object | The deleted post |
|
||||||
|
| ↳ `id` | number | Post ID |
|
||||||
|
| ↳ `date` | string | Post creation date |
|
||||||
|
| ↳ `modified` | string | Post modification date |
|
||||||
|
| ↳ `slug` | string | Post slug |
|
||||||
|
| ↳ `status` | string | Post status |
|
||||||
|
| ↳ `type` | string | Post type |
|
||||||
|
| ↳ `link` | string | Post URL |
|
||||||
|
| ↳ `title` | object | Post title object |
|
||||||
|
| ↳ `content` | object | Post content object |
|
||||||
|
| ↳ `excerpt` | object | Post excerpt object |
|
||||||
|
| ↳ `author` | number | Author ID |
|
||||||
|
| ↳ `featured_media` | number | Featured media ID |
|
||||||
|
| ↳ `categories` | array | Category IDs |
|
||||||
|
| ↳ `tags` | array | Tag IDs |
|
||||||
|
|
||||||
### `wordpress_get_post`
|
### `wordpress_get_post`
|
||||||
|
|
||||||
@@ -111,6 +153,20 @@ Get a single blog post from WordPress.com by ID
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `post` | object | The retrieved post |
|
| `post` | object | The retrieved post |
|
||||||
|
| ↳ `id` | number | Post ID |
|
||||||
|
| ↳ `date` | string | Post creation date |
|
||||||
|
| ↳ `modified` | string | Post modification date |
|
||||||
|
| ↳ `slug` | string | Post slug |
|
||||||
|
| ↳ `status` | string | Post status |
|
||||||
|
| ↳ `type` | string | Post type |
|
||||||
|
| ↳ `link` | string | Post URL |
|
||||||
|
| ↳ `title` | object | Post title object |
|
||||||
|
| ↳ `content` | object | Post content object |
|
||||||
|
| ↳ `excerpt` | object | Post excerpt object |
|
||||||
|
| ↳ `author` | number | Author ID |
|
||||||
|
| ↳ `featured_media` | number | Featured media ID |
|
||||||
|
| ↳ `categories` | array | Category IDs |
|
||||||
|
| ↳ `tags` | array | Tag IDs |
|
||||||
|
|
||||||
### `wordpress_list_posts`
|
### `wordpress_list_posts`
|
||||||
|
|
||||||
@@ -136,6 +192,22 @@ List blog posts from WordPress.com with optional filters
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `posts` | array | List of posts |
|
| `posts` | array | List of posts |
|
||||||
|
| ↳ `id` | number | Post ID |
|
||||||
|
| ↳ `date` | string | Post creation date |
|
||||||
|
| ↳ `modified` | string | Post modification date |
|
||||||
|
| ↳ `slug` | string | Post slug |
|
||||||
|
| ↳ `status` | string | Post status |
|
||||||
|
| ↳ `type` | string | Post type |
|
||||||
|
| ↳ `link` | string | Post URL |
|
||||||
|
| ↳ `title` | object | Post title object |
|
||||||
|
| ↳ `content` | object | Post content object |
|
||||||
|
| ↳ `excerpt` | object | Post excerpt object |
|
||||||
|
| ↳ `author` | number | Author ID |
|
||||||
|
| ↳ `featured_media` | number | Featured media ID |
|
||||||
|
| ↳ `categories` | array | Category IDs |
|
||||||
|
| ↳ `tags` | array | Tag IDs |
|
||||||
|
| `total` | number | Total number of posts |
|
||||||
|
| `totalPages` | number | Total number of pages |
|
||||||
|
|
||||||
### `wordpress_create_page`
|
### `wordpress_create_page`
|
||||||
|
|
||||||
@@ -160,6 +232,20 @@ Create a new page in WordPress.com
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `page` | object | The created page |
|
| `page` | object | The created page |
|
||||||
|
| ↳ `id` | number | Page ID |
|
||||||
|
| ↳ `date` | string | Page creation date |
|
||||||
|
| ↳ `modified` | string | Page modification date |
|
||||||
|
| ↳ `slug` | string | Page slug |
|
||||||
|
| ↳ `status` | string | Page status |
|
||||||
|
| ↳ `type` | string | Content type |
|
||||||
|
| ↳ `link` | string | Page URL |
|
||||||
|
| ↳ `title` | object | Page title object |
|
||||||
|
| ↳ `content` | object | Page content object |
|
||||||
|
| ↳ `excerpt` | object | Page excerpt object |
|
||||||
|
| ↳ `author` | number | Author ID |
|
||||||
|
| ↳ `featured_media` | number | Featured media ID |
|
||||||
|
| ↳ `parent` | number | Parent page ID |
|
||||||
|
| ↳ `menu_order` | number | Menu order |
|
||||||
|
|
||||||
### `wordpress_update_page`
|
### `wordpress_update_page`
|
||||||
|
|
||||||
@@ -185,6 +271,20 @@ Update an existing page in WordPress.com
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `page` | object | The updated page |
|
| `page` | object | The updated page |
|
||||||
|
| ↳ `id` | number | Page ID |
|
||||||
|
| ↳ `date` | string | Page creation date |
|
||||||
|
| ↳ `modified` | string | Page modification date |
|
||||||
|
| ↳ `slug` | string | Page slug |
|
||||||
|
| ↳ `status` | string | Page status |
|
||||||
|
| ↳ `type` | string | Content type |
|
||||||
|
| ↳ `link` | string | Page URL |
|
||||||
|
| ↳ `title` | object | Page title object |
|
||||||
|
| ↳ `content` | object | Page content object |
|
||||||
|
| ↳ `excerpt` | object | Page excerpt object |
|
||||||
|
| ↳ `author` | number | Author ID |
|
||||||
|
| ↳ `featured_media` | number | Featured media ID |
|
||||||
|
| ↳ `parent` | number | Parent page ID |
|
||||||
|
| ↳ `menu_order` | number | Menu order |
|
||||||
|
|
||||||
### `wordpress_delete_page`
|
### `wordpress_delete_page`
|
||||||
|
|
||||||
@@ -204,6 +304,20 @@ Delete a page from WordPress.com
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `deleted` | boolean | Whether the page was deleted |
|
| `deleted` | boolean | Whether the page was deleted |
|
||||||
| `page` | object | The deleted page |
|
| `page` | object | The deleted page |
|
||||||
|
| ↳ `id` | number | Page ID |
|
||||||
|
| ↳ `date` | string | Page creation date |
|
||||||
|
| ↳ `modified` | string | Page modification date |
|
||||||
|
| ↳ `slug` | string | Page slug |
|
||||||
|
| ↳ `status` | string | Page status |
|
||||||
|
| ↳ `type` | string | Content type |
|
||||||
|
| ↳ `link` | string | Page URL |
|
||||||
|
| ↳ `title` | object | Page title object |
|
||||||
|
| ↳ `content` | object | Page content object |
|
||||||
|
| ↳ `excerpt` | object | Page excerpt object |
|
||||||
|
| ↳ `author` | number | Author ID |
|
||||||
|
| ↳ `featured_media` | number | Featured media ID |
|
||||||
|
| ↳ `parent` | number | Parent page ID |
|
||||||
|
| ↳ `menu_order` | number | Menu order |
|
||||||
|
|
||||||
### `wordpress_get_page`
|
### `wordpress_get_page`
|
||||||
|
|
||||||
@@ -221,6 +335,20 @@ Get a single page from WordPress.com by ID
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `page` | object | The retrieved page |
|
| `page` | object | The retrieved page |
|
||||||
|
| ↳ `id` | number | Page ID |
|
||||||
|
| ↳ `date` | string | Page creation date |
|
||||||
|
| ↳ `modified` | string | Page modification date |
|
||||||
|
| ↳ `slug` | string | Page slug |
|
||||||
|
| ↳ `status` | string | Page status |
|
||||||
|
| ↳ `type` | string | Content type |
|
||||||
|
| ↳ `link` | string | Page URL |
|
||||||
|
| ↳ `title` | object | Page title object |
|
||||||
|
| ↳ `content` | object | Page content object |
|
||||||
|
| ↳ `excerpt` | object | Page excerpt object |
|
||||||
|
| ↳ `author` | number | Author ID |
|
||||||
|
| ↳ `featured_media` | number | Featured media ID |
|
||||||
|
| ↳ `parent` | number | Parent page ID |
|
||||||
|
| ↳ `menu_order` | number | Menu order |
|
||||||
|
|
||||||
### `wordpress_list_pages`
|
### `wordpress_list_pages`
|
||||||
|
|
||||||
@@ -244,6 +372,22 @@ List pages from WordPress.com with optional filters
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `pages` | array | List of pages |
|
| `pages` | array | List of pages |
|
||||||
|
| ↳ `id` | number | Page ID |
|
||||||
|
| ↳ `date` | string | Page creation date |
|
||||||
|
| ↳ `modified` | string | Page modification date |
|
||||||
|
| ↳ `slug` | string | Page slug |
|
||||||
|
| ↳ `status` | string | Page status |
|
||||||
|
| ↳ `type` | string | Content type |
|
||||||
|
| ↳ `link` | string | Page URL |
|
||||||
|
| ↳ `title` | object | Page title object |
|
||||||
|
| ↳ `content` | object | Page content object |
|
||||||
|
| ↳ `excerpt` | object | Page excerpt object |
|
||||||
|
| ↳ `author` | number | Author ID |
|
||||||
|
| ↳ `featured_media` | number | Featured media ID |
|
||||||
|
| ↳ `parent` | number | Parent page ID |
|
||||||
|
| ↳ `menu_order` | number | Menu order |
|
||||||
|
| `total` | number | Total number of pages |
|
||||||
|
| `totalPages` | number | Total number of result pages |
|
||||||
|
|
||||||
### `wordpress_upload_media`
|
### `wordpress_upload_media`
|
||||||
|
|
||||||
@@ -266,6 +410,18 @@ Upload a media file (image, video, document) to WordPress.com
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `media` | object | The uploaded media item |
|
| `media` | object | The uploaded media item |
|
||||||
|
| ↳ `id` | number | Media ID |
|
||||||
|
| ↳ `date` | string | Upload date |
|
||||||
|
| ↳ `slug` | string | Media slug |
|
||||||
|
| ↳ `type` | string | Content type |
|
||||||
|
| ↳ `link` | string | Media page URL |
|
||||||
|
| ↳ `title` | object | Media title object |
|
||||||
|
| ↳ `caption` | object | Media caption object |
|
||||||
|
| ↳ `alt_text` | string | Alt text |
|
||||||
|
| ↳ `media_type` | string | Media type \(image, video, etc.\) |
|
||||||
|
| ↳ `mime_type` | string | MIME type |
|
||||||
|
| ↳ `source_url` | string | Direct URL to the media file |
|
||||||
|
| ↳ `media_details` | object | Media details \(dimensions, etc.\) |
|
||||||
|
|
||||||
### `wordpress_get_media`
|
### `wordpress_get_media`
|
||||||
|
|
||||||
@@ -283,6 +439,18 @@ Get a single media item from WordPress.com by ID
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `media` | object | The retrieved media item |
|
| `media` | object | The retrieved media item |
|
||||||
|
| ↳ `id` | number | Media ID |
|
||||||
|
| ↳ `date` | string | Upload date |
|
||||||
|
| ↳ `slug` | string | Media slug |
|
||||||
|
| ↳ `type` | string | Content type |
|
||||||
|
| ↳ `link` | string | Media page URL |
|
||||||
|
| ↳ `title` | object | Media title object |
|
||||||
|
| ↳ `caption` | object | Media caption object |
|
||||||
|
| ↳ `alt_text` | string | Alt text |
|
||||||
|
| ↳ `media_type` | string | Media type \(image, video, etc.\) |
|
||||||
|
| ↳ `mime_type` | string | MIME type |
|
||||||
|
| ↳ `source_url` | string | Direct URL to the media file |
|
||||||
|
| ↳ `media_details` | object | Media details \(dimensions, etc.\) |
|
||||||
|
|
||||||
### `wordpress_list_media`
|
### `wordpress_list_media`
|
||||||
|
|
||||||
@@ -306,6 +474,20 @@ List media items from the WordPress.com media library
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `media` | array | List of media items |
|
| `media` | array | List of media items |
|
||||||
|
| ↳ `id` | number | Media ID |
|
||||||
|
| ↳ `date` | string | Upload date |
|
||||||
|
| ↳ `slug` | string | Media slug |
|
||||||
|
| ↳ `type` | string | Content type |
|
||||||
|
| ↳ `link` | string | Media page URL |
|
||||||
|
| ↳ `title` | object | Media title object |
|
||||||
|
| ↳ `caption` | object | Media caption object |
|
||||||
|
| ↳ `alt_text` | string | Alt text |
|
||||||
|
| ↳ `media_type` | string | Media type \(image, video, etc.\) |
|
||||||
|
| ↳ `mime_type` | string | MIME type |
|
||||||
|
| ↳ `source_url` | string | Direct URL to the media file |
|
||||||
|
| ↳ `media_details` | object | Media details \(dimensions, etc.\) |
|
||||||
|
| `total` | number | Total number of media items |
|
||||||
|
| `totalPages` | number | Total number of result pages |
|
||||||
|
|
||||||
### `wordpress_delete_media`
|
### `wordpress_delete_media`
|
||||||
|
|
||||||
@@ -325,6 +507,18 @@ Delete a media item from WordPress.com
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `deleted` | boolean | Whether the media was deleted |
|
| `deleted` | boolean | Whether the media was deleted |
|
||||||
| `media` | object | The deleted media item |
|
| `media` | object | The deleted media item |
|
||||||
|
| ↳ `id` | number | Media ID |
|
||||||
|
| ↳ `date` | string | Upload date |
|
||||||
|
| ↳ `slug` | string | Media slug |
|
||||||
|
| ↳ `type` | string | Content type |
|
||||||
|
| ↳ `link` | string | Media page URL |
|
||||||
|
| ↳ `title` | object | Media title object |
|
||||||
|
| ↳ `caption` | object | Media caption object |
|
||||||
|
| ↳ `alt_text` | string | Alt text |
|
||||||
|
| ↳ `media_type` | string | Media type \(image, video, etc.\) |
|
||||||
|
| ↳ `mime_type` | string | MIME type |
|
||||||
|
| ↳ `source_url` | string | Direct URL to the media file |
|
||||||
|
| ↳ `media_details` | object | Media details \(dimensions, etc.\) |
|
||||||
|
|
||||||
### `wordpress_create_comment`
|
### `wordpress_create_comment`
|
||||||
|
|
||||||
@@ -347,6 +541,17 @@ Create a new comment on a WordPress.com post
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `comment` | object | The created comment |
|
| `comment` | object | The created comment |
|
||||||
|
| ↳ `id` | number | Comment ID |
|
||||||
|
| ↳ `post` | number | Post ID |
|
||||||
|
| ↳ `parent` | number | Parent comment ID |
|
||||||
|
| ↳ `author` | number | Author user ID |
|
||||||
|
| ↳ `author_name` | string | Author display name |
|
||||||
|
| ↳ `author_email` | string | Author email |
|
||||||
|
| ↳ `author_url` | string | Author URL |
|
||||||
|
| ↳ `date` | string | Comment date |
|
||||||
|
| ↳ `content` | object | Comment content object |
|
||||||
|
| ↳ `link` | string | Comment permalink |
|
||||||
|
| ↳ `status` | string | Comment status |
|
||||||
|
|
||||||
### `wordpress_list_comments`
|
### `wordpress_list_comments`
|
||||||
|
|
||||||
@@ -370,6 +575,19 @@ List comments from WordPress.com with optional filters
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `comments` | array | List of comments |
|
| `comments` | array | List of comments |
|
||||||
|
| ↳ `id` | number | Comment ID |
|
||||||
|
| ↳ `post` | number | Post ID |
|
||||||
|
| ↳ `parent` | number | Parent comment ID |
|
||||||
|
| ↳ `author` | number | Author user ID |
|
||||||
|
| ↳ `author_name` | string | Author display name |
|
||||||
|
| ↳ `author_email` | string | Author email |
|
||||||
|
| ↳ `author_url` | string | Author URL |
|
||||||
|
| ↳ `date` | string | Comment date |
|
||||||
|
| ↳ `content` | object | Comment content object |
|
||||||
|
| ↳ `link` | string | Comment permalink |
|
||||||
|
| ↳ `status` | string | Comment status |
|
||||||
|
| `total` | number | Total number of comments |
|
||||||
|
| `totalPages` | number | Total number of result pages |
|
||||||
|
|
||||||
### `wordpress_update_comment`
|
### `wordpress_update_comment`
|
||||||
|
|
||||||
@@ -389,6 +607,17 @@ Update a comment in WordPress.com (content or status)
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `comment` | object | The updated comment |
|
| `comment` | object | The updated comment |
|
||||||
|
| ↳ `id` | number | Comment ID |
|
||||||
|
| ↳ `post` | number | Post ID |
|
||||||
|
| ↳ `parent` | number | Parent comment ID |
|
||||||
|
| ↳ `author` | number | Author user ID |
|
||||||
|
| ↳ `author_name` | string | Author display name |
|
||||||
|
| ↳ `author_email` | string | Author email |
|
||||||
|
| ↳ `author_url` | string | Author URL |
|
||||||
|
| ↳ `date` | string | Comment date |
|
||||||
|
| ↳ `content` | object | Comment content object |
|
||||||
|
| ↳ `link` | string | Comment permalink |
|
||||||
|
| ↳ `status` | string | Comment status |
|
||||||
|
|
||||||
### `wordpress_delete_comment`
|
### `wordpress_delete_comment`
|
||||||
|
|
||||||
@@ -408,6 +637,17 @@ Delete a comment from WordPress.com
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `deleted` | boolean | Whether the comment was deleted |
|
| `deleted` | boolean | Whether the comment was deleted |
|
||||||
| `comment` | object | The deleted comment |
|
| `comment` | object | The deleted comment |
|
||||||
|
| ↳ `id` | number | Comment ID |
|
||||||
|
| ↳ `post` | number | Post ID |
|
||||||
|
| ↳ `parent` | number | Parent comment ID |
|
||||||
|
| ↳ `author` | number | Author user ID |
|
||||||
|
| ↳ `author_name` | string | Author display name |
|
||||||
|
| ↳ `author_email` | string | Author email |
|
||||||
|
| ↳ `author_url` | string | Author URL |
|
||||||
|
| ↳ `date` | string | Comment date |
|
||||||
|
| ↳ `content` | object | Comment content object |
|
||||||
|
| ↳ `link` | string | Comment permalink |
|
||||||
|
| ↳ `status` | string | Comment status |
|
||||||
|
|
||||||
### `wordpress_create_category`
|
### `wordpress_create_category`
|
||||||
|
|
||||||
@@ -428,6 +668,14 @@ Create a new category in WordPress.com
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `category` | object | The created category |
|
| `category` | object | The created category |
|
||||||
|
| ↳ `id` | number | Category ID |
|
||||||
|
| ↳ `count` | number | Number of posts in this category |
|
||||||
|
| ↳ `description` | string | Category description |
|
||||||
|
| ↳ `link` | string | Category archive URL |
|
||||||
|
| ↳ `name` | string | Category name |
|
||||||
|
| ↳ `slug` | string | Category slug |
|
||||||
|
| ↳ `taxonomy` | string | Taxonomy name |
|
||||||
|
| ↳ `parent` | number | Parent category ID |
|
||||||
|
|
||||||
### `wordpress_list_categories`
|
### `wordpress_list_categories`
|
||||||
|
|
||||||
@@ -448,6 +696,16 @@ List categories from WordPress.com
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `categories` | array | List of categories |
|
| `categories` | array | List of categories |
|
||||||
|
| ↳ `id` | number | Category ID |
|
||||||
|
| ↳ `count` | number | Number of posts in this category |
|
||||||
|
| ↳ `description` | string | Category description |
|
||||||
|
| ↳ `link` | string | Category archive URL |
|
||||||
|
| ↳ `name` | string | Category name |
|
||||||
|
| ↳ `slug` | string | Category slug |
|
||||||
|
| ↳ `taxonomy` | string | Taxonomy name |
|
||||||
|
| ↳ `parent` | number | Parent category ID |
|
||||||
|
| `total` | number | Total number of categories |
|
||||||
|
| `totalPages` | number | Total number of result pages |
|
||||||
|
|
||||||
### `wordpress_create_tag`
|
### `wordpress_create_tag`
|
||||||
|
|
||||||
@@ -467,6 +725,13 @@ Create a new tag in WordPress.com
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `tag` | object | The created tag |
|
| `tag` | object | The created tag |
|
||||||
|
| ↳ `id` | number | Tag ID |
|
||||||
|
| ↳ `count` | number | Number of posts with this tag |
|
||||||
|
| ↳ `description` | string | Tag description |
|
||||||
|
| ↳ `link` | string | Tag archive URL |
|
||||||
|
| ↳ `name` | string | Tag name |
|
||||||
|
| ↳ `slug` | string | Tag slug |
|
||||||
|
| ↳ `taxonomy` | string | Taxonomy name |
|
||||||
|
|
||||||
### `wordpress_list_tags`
|
### `wordpress_list_tags`
|
||||||
|
|
||||||
@@ -487,6 +752,15 @@ List tags from WordPress.com
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `tags` | array | List of tags |
|
| `tags` | array | List of tags |
|
||||||
|
| ↳ `id` | number | Tag ID |
|
||||||
|
| ↳ `count` | number | Number of posts with this tag |
|
||||||
|
| ↳ `description` | string | Tag description |
|
||||||
|
| ↳ `link` | string | Tag archive URL |
|
||||||
|
| ↳ `name` | string | Tag name |
|
||||||
|
| ↳ `slug` | string | Tag slug |
|
||||||
|
| ↳ `taxonomy` | string | Taxonomy name |
|
||||||
|
| `total` | number | Total number of tags |
|
||||||
|
| `totalPages` | number | Total number of result pages |
|
||||||
|
|
||||||
### `wordpress_get_current_user`
|
### `wordpress_get_current_user`
|
||||||
|
|
||||||
@@ -503,6 +777,18 @@ Get information about the currently authenticated WordPress.com user
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `user` | object | The current user |
|
| `user` | object | The current user |
|
||||||
|
| ↳ `id` | number | User ID |
|
||||||
|
| ↳ `username` | string | Username |
|
||||||
|
| ↳ `name` | string | Display name |
|
||||||
|
| ↳ `first_name` | string | First name |
|
||||||
|
| ↳ `last_name` | string | Last name |
|
||||||
|
| ↳ `email` | string | Email address |
|
||||||
|
| ↳ `url` | string | User website URL |
|
||||||
|
| ↳ `description` | string | User bio |
|
||||||
|
| ↳ `link` | string | Author archive URL |
|
||||||
|
| ↳ `slug` | string | User slug |
|
||||||
|
| ↳ `roles` | array | User roles |
|
||||||
|
| ↳ `avatar_urls` | object | Avatar URLs at different sizes |
|
||||||
|
|
||||||
### `wordpress_list_users`
|
### `wordpress_list_users`
|
||||||
|
|
||||||
@@ -524,6 +810,20 @@ List users from WordPress.com (requires admin privileges)
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `users` | array | List of users |
|
| `users` | array | List of users |
|
||||||
|
| ↳ `id` | number | User ID |
|
||||||
|
| ↳ `username` | string | Username |
|
||||||
|
| ↳ `name` | string | Display name |
|
||||||
|
| ↳ `first_name` | string | First name |
|
||||||
|
| ↳ `last_name` | string | Last name |
|
||||||
|
| ↳ `email` | string | Email address |
|
||||||
|
| ↳ `url` | string | User website URL |
|
||||||
|
| ↳ `description` | string | User bio |
|
||||||
|
| ↳ `link` | string | Author archive URL |
|
||||||
|
| ↳ `slug` | string | User slug |
|
||||||
|
| ↳ `roles` | array | User roles |
|
||||||
|
| ↳ `avatar_urls` | object | Avatar URLs at different sizes |
|
||||||
|
| `total` | number | Total number of users |
|
||||||
|
| `totalPages` | number | Total number of result pages |
|
||||||
|
|
||||||
### `wordpress_get_user`
|
### `wordpress_get_user`
|
||||||
|
|
||||||
@@ -541,6 +841,18 @@ Get a specific user from WordPress.com by ID
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `user` | object | The retrieved user |
|
| `user` | object | The retrieved user |
|
||||||
|
| ↳ `id` | number | User ID |
|
||||||
|
| ↳ `username` | string | Username |
|
||||||
|
| ↳ `name` | string | Display name |
|
||||||
|
| ↳ `first_name` | string | First name |
|
||||||
|
| ↳ `last_name` | string | Last name |
|
||||||
|
| ↳ `email` | string | Email address |
|
||||||
|
| ↳ `url` | string | User website URL |
|
||||||
|
| ↳ `description` | string | User bio |
|
||||||
|
| ↳ `link` | string | Author archive URL |
|
||||||
|
| ↳ `slug` | string | User slug |
|
||||||
|
| ↳ `roles` | array | User roles |
|
||||||
|
| ↳ `avatar_urls` | object | Avatar URLs at different sizes |
|
||||||
|
|
||||||
### `wordpress_search_content`
|
### `wordpress_search_content`
|
||||||
|
|
||||||
@@ -562,5 +874,12 @@ Search across all content types in WordPress.com (posts, pages, media)
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | Search results |
|
| `results` | array | Search results |
|
||||||
|
| ↳ `id` | number | Content ID |
|
||||||
|
| ↳ `title` | string | Content title |
|
||||||
|
| ↳ `url` | string | Content URL |
|
||||||
|
| ↳ `type` | string | Content type \(post, page, attachment\) |
|
||||||
|
| ↳ `subtype` | string | Post type slug |
|
||||||
|
| `total` | number | Total number of results |
|
||||||
|
| `totalPages` | number | Total number of result pages |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,16 @@ Post new tweets, reply to tweets, or create polls on X (Twitter)
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `tweet` | object | The newly created tweet data |
|
| `tweet` | object | The newly created tweet data |
|
||||||
|
| ↳ `id` | string | Tweet ID |
|
||||||
|
| ↳ `text` | string | Tweet content text |
|
||||||
|
| ↳ `createdAt` | string | Tweet creation timestamp |
|
||||||
|
| ↳ `authorId` | string | ID of the tweet author |
|
||||||
|
| ↳ `conversationId` | string | Conversation thread ID |
|
||||||
|
| ↳ `attachments` | object | Media or poll attachments |
|
||||||
|
| ↳ `mediaKeys` | array | Media attachment keys |
|
||||||
|
| ↳ `pollId` | string | Poll ID if poll attached |
|
||||||
|
| ↳ `mediaKeys` | array | Media attachment keys |
|
||||||
|
| ↳ `pollId` | string | Poll ID if poll attached |
|
||||||
|
|
||||||
### `x_read`
|
### `x_read`
|
||||||
|
|
||||||
@@ -70,6 +80,11 @@ Read tweet details, including replies and conversation context
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `tweet` | object | The main tweet data |
|
| `tweet` | object | The main tweet data |
|
||||||
|
| ↳ `id` | string | Tweet ID |
|
||||||
|
| ↳ `text` | string | Tweet content text |
|
||||||
|
| ↳ `createdAt` | string | Tweet creation timestamp |
|
||||||
|
| ↳ `authorId` | string | ID of the tweet author |
|
||||||
|
| `context` | object | Conversation context including parent and root tweets |
|
||||||
|
|
||||||
### `x_search`
|
### `x_search`
|
||||||
|
|
||||||
@@ -90,6 +105,15 @@ Search for tweets using keywords, hashtags, or advanced queries
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `tweets` | array | Array of tweets matching the search query |
|
| `tweets` | array | Array of tweets matching the search query |
|
||||||
|
| ↳ `id` | string | Tweet ID |
|
||||||
|
| ↳ `text` | string | Tweet content |
|
||||||
|
| ↳ `createdAt` | string | Creation timestamp |
|
||||||
|
| ↳ `authorId` | string | Author user ID |
|
||||||
|
| `includes` | object | Additional data including user profiles and media |
|
||||||
|
| `meta` | object | Search metadata including result count and pagination tokens |
|
||||||
|
| ↳ `resultCount` | number | Number of results returned |
|
||||||
|
| ↳ `newestId` | string | ID of the newest tweet |
|
||||||
|
| ↳ `oldestId` | string | ID of the oldest tweet |
|
||||||
|
|
||||||
### `x_user`
|
### `x_user`
|
||||||
|
|
||||||
@@ -106,5 +130,17 @@ Get user profile information
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `user` | object | X user profile information |
|
| `user` | object | X user profile information |
|
||||||
|
| ↳ `id` | string | User ID |
|
||||||
|
| ↳ `username` | string | Username without @ symbol |
|
||||||
|
| ↳ `name` | string | Display name |
|
||||||
|
| ↳ `description` | string | User bio/description |
|
||||||
|
| ↳ `verified` | boolean | Whether the user is verified |
|
||||||
|
| ↳ `metrics` | object | User statistics |
|
||||||
|
| ↳ `followersCount` | number | Number of followers |
|
||||||
|
| ↳ `followingCount` | number | Number of users following |
|
||||||
|
| ↳ `tweetCount` | number | Total number of tweets |
|
||||||
|
| ↳ `followersCount` | number | Number of followers |
|
||||||
|
| ↳ `followingCount` | number | Number of users following |
|
||||||
|
| ↳ `tweetCount` | number | Total number of tweets |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,12 @@ Search for videos on YouTube using the YouTube Data API. Supports advanced filte
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `items` | array | Array of YouTube videos matching the search query |
|
| `items` | array | Array of YouTube videos matching the search query |
|
||||||
|
| ↳ `videoId` | string | YouTube video ID |
|
||||||
|
| ↳ `title` | string | Video title |
|
||||||
|
| ↳ `description` | string | Video description |
|
||||||
|
| ↳ `thumbnail` | string | Video thumbnail URL |
|
||||||
|
| `totalResults` | number | Total number of search results available |
|
||||||
|
| `nextPageToken` | string | Token for accessing the next page of results |
|
||||||
|
|
||||||
### `youtube_video_details`
|
### `youtube_video_details`
|
||||||
|
|
||||||
@@ -134,6 +140,13 @@ Get all videos from a specific YouTube channel, with sorting options.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `items` | array | Array of videos from the channel |
|
| `items` | array | Array of videos from the channel |
|
||||||
|
| ↳ `videoId` | string | YouTube video ID |
|
||||||
|
| ↳ `title` | string | Video title |
|
||||||
|
| ↳ `description` | string | Video description |
|
||||||
|
| ↳ `thumbnail` | string | Video thumbnail URL |
|
||||||
|
| ↳ `publishedAt` | string | Video publish date |
|
||||||
|
| `totalResults` | number | Total number of videos in the channel |
|
||||||
|
| `nextPageToken` | string | Token for accessing the next page of results |
|
||||||
|
|
||||||
### `youtube_channel_playlists`
|
### `youtube_channel_playlists`
|
||||||
|
|
||||||
@@ -153,6 +166,14 @@ Get all playlists from a specific YouTube channel.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `items` | array | Array of playlists from the channel |
|
| `items` | array | Array of playlists from the channel |
|
||||||
|
| ↳ `playlistId` | string | YouTube playlist ID |
|
||||||
|
| ↳ `title` | string | Playlist title |
|
||||||
|
| ↳ `description` | string | Playlist description |
|
||||||
|
| ↳ `thumbnail` | string | Playlist thumbnail URL |
|
||||||
|
| ↳ `itemCount` | number | Number of videos in playlist |
|
||||||
|
| ↳ `publishedAt` | string | Playlist creation date |
|
||||||
|
| `totalResults` | number | Total number of playlists in the channel |
|
||||||
|
| `nextPageToken` | string | Token for accessing the next page of results |
|
||||||
|
|
||||||
### `youtube_playlist_items`
|
### `youtube_playlist_items`
|
||||||
|
|
||||||
@@ -172,6 +193,15 @@ Get videos from a YouTube playlist.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `items` | array | Array of videos in the playlist |
|
| `items` | array | Array of videos in the playlist |
|
||||||
|
| ↳ `videoId` | string | YouTube video ID |
|
||||||
|
| ↳ `title` | string | Video title |
|
||||||
|
| ↳ `description` | string | Video description |
|
||||||
|
| ↳ `thumbnail` | string | Video thumbnail URL |
|
||||||
|
| ↳ `publishedAt` | string | Date added to playlist |
|
||||||
|
| ↳ `channelTitle` | string | Channel name |
|
||||||
|
| ↳ `position` | number | Position in playlist |
|
||||||
|
| `totalResults` | number | Total number of items in playlist |
|
||||||
|
| `nextPageToken` | string | Token for accessing the next page of results |
|
||||||
|
|
||||||
### `youtube_comments`
|
### `youtube_comments`
|
||||||
|
|
||||||
@@ -192,5 +222,16 @@ Get comments from a YouTube video.
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `items` | array | Array of comments from the video |
|
| `items` | array | Array of comments from the video |
|
||||||
|
| ↳ `commentId` | string | Comment ID |
|
||||||
|
| ↳ `authorDisplayName` | string | Comment author name |
|
||||||
|
| ↳ `authorChannelUrl` | string | Comment author channel URL |
|
||||||
|
| ↳ `textDisplay` | string | Comment text \(HTML formatted\) |
|
||||||
|
| ↳ `textOriginal` | string | Comment text \(plain text\) |
|
||||||
|
| ↳ `likeCount` | number | Number of likes |
|
||||||
|
| ↳ `publishedAt` | string | Comment publish date |
|
||||||
|
| ↳ `updatedAt` | string | Comment last updated date |
|
||||||
|
| ↳ `replyCount` | number | Number of replies |
|
||||||
|
| `totalResults` | number | Total number of comments |
|
||||||
|
| `nextPageToken` | string | Token for accessing the next page of results |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -78,6 +78,12 @@ Retrieve a list of tickets from Zendesk with optional filtering
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `tickets` | array | Array of ticket objects |
|
| `tickets` | array | Array of ticket objects |
|
||||||
| `paging` | object | Pagination information |
|
| `paging` | object | Pagination information |
|
||||||
|
| ↳ `next_page` | string | URL for next page of results |
|
||||||
|
| ↳ `previous_page` | string | URL for previous page of results |
|
||||||
|
| ↳ `count` | number | Total count of tickets |
|
||||||
|
| `metadata` | object | Response metadata |
|
||||||
|
| ↳ `total_returned` | number | Number of tickets returned in this response |
|
||||||
|
| ↳ `has_more` | boolean | Whether more tickets are available |
|
||||||
|
|
||||||
### `zendesk_get_ticket`
|
### `zendesk_get_ticket`
|
||||||
|
|
||||||
@@ -267,6 +273,12 @@ Retrieve a list of users from Zendesk with optional filtering
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `users` | array | Array of user objects |
|
| `users` | array | Array of user objects |
|
||||||
| `paging` | object | Pagination information |
|
| `paging` | object | Pagination information |
|
||||||
|
| ↳ `next_page` | string | URL for next page of results |
|
||||||
|
| ↳ `previous_page` | string | URL for previous page of results |
|
||||||
|
| ↳ `count` | number | Total count of users |
|
||||||
|
| `metadata` | object | Response metadata |
|
||||||
|
| ↳ `total_returned` | number | Number of users returned in this response |
|
||||||
|
| ↳ `has_more` | boolean | Whether more users are available |
|
||||||
|
|
||||||
### `zendesk_get_user`
|
### `zendesk_get_user`
|
||||||
|
|
||||||
@@ -329,6 +341,12 @@ Search for users in Zendesk using a query string
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `users` | array | Array of user objects |
|
| `users` | array | Array of user objects |
|
||||||
| `paging` | object | Pagination information |
|
| `paging` | object | Pagination information |
|
||||||
|
| ↳ `next_page` | string | URL for next page of results |
|
||||||
|
| ↳ `previous_page` | string | URL for previous page of results |
|
||||||
|
| ↳ `count` | number | Total count of users |
|
||||||
|
| `metadata` | object | Response metadata |
|
||||||
|
| ↳ `total_returned` | number | Number of users returned in this response |
|
||||||
|
| ↳ `has_more` | boolean | Whether more users are available |
|
||||||
|
|
||||||
### `zendesk_create_user`
|
### `zendesk_create_user`
|
||||||
|
|
||||||
@@ -465,6 +483,12 @@ Retrieve a list of organizations from Zendesk
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `organizations` | array | Array of organization objects |
|
| `organizations` | array | Array of organization objects |
|
||||||
| `paging` | object | Pagination information |
|
| `paging` | object | Pagination information |
|
||||||
|
| ↳ `next_page` | string | URL for next page of results |
|
||||||
|
| ↳ `previous_page` | string | URL for previous page of results |
|
||||||
|
| ↳ `count` | number | Total count of organizations |
|
||||||
|
| `metadata` | object | Response metadata |
|
||||||
|
| ↳ `total_returned` | number | Number of organizations returned in this response |
|
||||||
|
| ↳ `has_more` | boolean | Whether more organizations are available |
|
||||||
|
|
||||||
### `zendesk_get_organization`
|
### `zendesk_get_organization`
|
||||||
|
|
||||||
@@ -507,6 +531,12 @@ Autocomplete organizations in Zendesk by name prefix (for name matching/autocomp
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `organizations` | array | Array of organization objects |
|
| `organizations` | array | Array of organization objects |
|
||||||
| `paging` | object | Pagination information |
|
| `paging` | object | Pagination information |
|
||||||
|
| ↳ `next_page` | string | URL for next page of results |
|
||||||
|
| ↳ `previous_page` | string | URL for previous page of results |
|
||||||
|
| ↳ `count` | number | Total count of organizations |
|
||||||
|
| `metadata` | object | Response metadata |
|
||||||
|
| ↳ `total_returned` | number | Number of organizations returned in this response |
|
||||||
|
| ↳ `has_more` | boolean | Whether more organizations are available |
|
||||||
|
|
||||||
### `zendesk_create_organization`
|
### `zendesk_create_organization`
|
||||||
|
|
||||||
@@ -622,6 +652,12 @@ Unified search across tickets, users, and organizations in Zendesk
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `results` | array | Array of result objects |
|
| `results` | array | Array of result objects |
|
||||||
| `paging` | object | Pagination information |
|
| `paging` | object | Pagination information |
|
||||||
|
| ↳ `next_page` | string | URL for next page of results |
|
||||||
|
| ↳ `previous_page` | string | URL for previous page of results |
|
||||||
|
| ↳ `count` | number | Total count of results |
|
||||||
|
| `metadata` | object | Response metadata |
|
||||||
|
| ↳ `total_returned` | number | Number of results returned in this response |
|
||||||
|
| ↳ `has_more` | boolean | Whether more results are available |
|
||||||
|
|
||||||
### `zendesk_search_count`
|
### `zendesk_search_count`
|
||||||
|
|
||||||
|
|||||||
@@ -69,6 +69,22 @@ Create a new Zoom meeting
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `meeting` | object | The created meeting with all its properties |
|
| `meeting` | object | The created meeting with all its properties |
|
||||||
|
| ↳ `id` | number | Meeting ID |
|
||||||
|
| ↳ `uuid` | string | Meeting UUID |
|
||||||
|
| ↳ `host_id` | string | Host user ID |
|
||||||
|
| ↳ `host_email` | string | Host email |
|
||||||
|
| ↳ `topic` | string | Meeting topic |
|
||||||
|
| ↳ `type` | number | Meeting type |
|
||||||
|
| ↳ `status` | string | Meeting status |
|
||||||
|
| ↳ `start_time` | string | Start time |
|
||||||
|
| ↳ `duration` | number | Duration in minutes |
|
||||||
|
| ↳ `timezone` | string | Timezone |
|
||||||
|
| ↳ `agenda` | string | Meeting agenda |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `start_url` | string | Host start URL |
|
||||||
|
| ↳ `join_url` | string | Participant join URL |
|
||||||
|
| ↳ `password` | string | Meeting password |
|
||||||
|
| ↳ `settings` | object | Meeting settings |
|
||||||
|
|
||||||
### `zoom_list_meetings`
|
### `zoom_list_meetings`
|
||||||
|
|
||||||
@@ -89,6 +105,11 @@ List all meetings for a Zoom user
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `meetings` | array | List of meetings |
|
| `meetings` | array | List of meetings |
|
||||||
| `pageInfo` | object | Pagination information |
|
| `pageInfo` | object | Pagination information |
|
||||||
|
| ↳ `pageCount` | number | Total number of pages |
|
||||||
|
| ↳ `pageNumber` | number | Current page number |
|
||||||
|
| ↳ `pageSize` | number | Number of records per page |
|
||||||
|
| ↳ `totalRecords` | number | Total number of records |
|
||||||
|
| ↳ `nextPageToken` | string | Token for next page |
|
||||||
|
|
||||||
### `zoom_get_meeting`
|
### `zoom_get_meeting`
|
||||||
|
|
||||||
@@ -107,6 +128,24 @@ Get details of a specific Zoom meeting
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `meeting` | object | The meeting details |
|
| `meeting` | object | The meeting details |
|
||||||
|
| ↳ `id` | number | Meeting ID |
|
||||||
|
| ↳ `uuid` | string | Meeting UUID |
|
||||||
|
| ↳ `host_id` | string | Host user ID |
|
||||||
|
| ↳ `host_email` | string | Host email |
|
||||||
|
| ↳ `topic` | string | Meeting topic |
|
||||||
|
| ↳ `type` | number | Meeting type |
|
||||||
|
| ↳ `status` | string | Meeting status |
|
||||||
|
| ↳ `start_time` | string | Start time |
|
||||||
|
| ↳ `duration` | number | Duration in minutes |
|
||||||
|
| ↳ `timezone` | string | Timezone |
|
||||||
|
| ↳ `agenda` | string | Meeting agenda |
|
||||||
|
| ↳ `created_at` | string | Creation timestamp |
|
||||||
|
| ↳ `start_url` | string | Host start URL |
|
||||||
|
| ↳ `join_url` | string | Participant join URL |
|
||||||
|
| ↳ `password` | string | Meeting password |
|
||||||
|
| ↳ `settings` | object | Meeting settings |
|
||||||
|
| ↳ `recurrence` | object | Recurrence settings |
|
||||||
|
| ↳ `occurrences` | array | Meeting occurrences |
|
||||||
|
|
||||||
### `zoom_update_meeting`
|
### `zoom_update_meeting`
|
||||||
|
|
||||||
@@ -193,6 +232,11 @@ List all cloud recordings for a Zoom user
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `recordings` | array | List of recordings |
|
| `recordings` | array | List of recordings |
|
||||||
| `pageInfo` | object | Pagination information |
|
| `pageInfo` | object | Pagination information |
|
||||||
|
| ↳ `from` | string | Start date of query range |
|
||||||
|
| ↳ `to` | string | End date of query range |
|
||||||
|
| ↳ `pageSize` | number | Number of records per page |
|
||||||
|
| ↳ `totalRecords` | number | Total number of records |
|
||||||
|
| ↳ `nextPageToken` | string | Token for next page |
|
||||||
|
|
||||||
### `zoom_get_meeting_recordings`
|
### `zoom_get_meeting_recordings`
|
||||||
|
|
||||||
@@ -211,6 +255,14 @@ Get all recordings for a specific Zoom meeting
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `recording` | object | The meeting recording with all files |
|
| `recording` | object | The meeting recording with all files |
|
||||||
|
| ↳ `uuid` | string | Meeting UUID |
|
||||||
|
| ↳ `id` | number | Meeting ID |
|
||||||
|
| ↳ `topic` | string | Meeting topic |
|
||||||
|
| ↳ `start_time` | string | Meeting start time |
|
||||||
|
| ↳ `duration` | number | Meeting duration in minutes |
|
||||||
|
| ↳ `total_size` | number | Total size of recordings in bytes |
|
||||||
|
| ↳ `share_url` | string | URL to share recordings |
|
||||||
|
| ↳ `recording_files` | array | List of recording files |
|
||||||
|
|
||||||
### `zoom_delete_recording`
|
### `zoom_delete_recording`
|
||||||
|
|
||||||
@@ -248,5 +300,8 @@ List participants from a past Zoom meeting
|
|||||||
| --------- | ---- | ----------- |
|
| --------- | ---- | ----------- |
|
||||||
| `participants` | array | List of meeting participants |
|
| `participants` | array | List of meeting participants |
|
||||||
| `pageInfo` | object | Pagination information |
|
| `pageInfo` | object | Pagination information |
|
||||||
|
| ↳ `pageSize` | number | Number of records per page |
|
||||||
|
| ↳ `totalRecords` | number | Total number of records |
|
||||||
|
| ↳ `nextPageToken` | string | Token for next page |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,150 +0,0 @@
|
|||||||
import type {
|
|
||||||
Artifact,
|
|
||||||
Message,
|
|
||||||
Task,
|
|
||||||
TaskArtifactUpdateEvent,
|
|
||||||
TaskState,
|
|
||||||
TaskStatusUpdateEvent,
|
|
||||||
} from '@a2a-js/sdk'
|
|
||||||
import { createLogger } from '@sim/logger'
|
|
||||||
import { type NextRequest, NextResponse } from 'next/server'
|
|
||||||
import { z } from 'zod'
|
|
||||||
import { createA2AClient, extractTextContent, isTerminalState } from '@/lib/a2a/utils'
|
|
||||||
import { checkHybridAuth } from '@/lib/auth/hybrid'
|
|
||||||
import { generateRequestId } from '@/lib/core/utils/request'
|
|
||||||
|
|
||||||
export const dynamic = 'force-dynamic'
|
|
||||||
|
|
||||||
const logger = createLogger('A2ASendMessageStreamAPI')
|
|
||||||
|
|
||||||
const A2ASendMessageStreamSchema = z.object({
|
|
||||||
agentUrl: z.string().min(1, 'Agent URL is required'),
|
|
||||||
message: z.string().min(1, 'Message is required'),
|
|
||||||
taskId: z.string().optional(),
|
|
||||||
contextId: z.string().optional(),
|
|
||||||
apiKey: z.string().optional(),
|
|
||||||
})
|
|
||||||
|
|
||||||
export async function POST(request: NextRequest) {
|
|
||||||
const requestId = generateRequestId()
|
|
||||||
|
|
||||||
try {
|
|
||||||
const authResult = await checkHybridAuth(request, { requireWorkflowId: false })
|
|
||||||
|
|
||||||
if (!authResult.success) {
|
|
||||||
logger.warn(
|
|
||||||
`[${requestId}] Unauthorized A2A send message stream attempt: ${authResult.error}`
|
|
||||||
)
|
|
||||||
return NextResponse.json(
|
|
||||||
{
|
|
||||||
success: false,
|
|
||||||
error: authResult.error || 'Authentication required',
|
|
||||||
},
|
|
||||||
{ status: 401 }
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info(
|
|
||||||
`[${requestId}] Authenticated A2A send message stream request via ${authResult.authType}`,
|
|
||||||
{
|
|
||||||
userId: authResult.userId,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
const body = await request.json()
|
|
||||||
const validatedData = A2ASendMessageStreamSchema.parse(body)
|
|
||||||
|
|
||||||
logger.info(`[${requestId}] Sending A2A streaming message`, {
|
|
||||||
agentUrl: validatedData.agentUrl,
|
|
||||||
hasTaskId: !!validatedData.taskId,
|
|
||||||
hasContextId: !!validatedData.contextId,
|
|
||||||
})
|
|
||||||
|
|
||||||
const client = await createA2AClient(validatedData.agentUrl, validatedData.apiKey)
|
|
||||||
|
|
||||||
const message: Message = {
|
|
||||||
kind: 'message',
|
|
||||||
messageId: crypto.randomUUID(),
|
|
||||||
role: 'user',
|
|
||||||
parts: [{ kind: 'text', text: validatedData.message }],
|
|
||||||
...(validatedData.taskId && { taskId: validatedData.taskId }),
|
|
||||||
...(validatedData.contextId && { contextId: validatedData.contextId }),
|
|
||||||
}
|
|
||||||
|
|
||||||
const stream = client.sendMessageStream({ message })
|
|
||||||
|
|
||||||
let taskId = ''
|
|
||||||
let contextId: string | undefined
|
|
||||||
let state: TaskState = 'working'
|
|
||||||
let content = ''
|
|
||||||
let artifacts: Artifact[] = []
|
|
||||||
let history: Message[] = []
|
|
||||||
|
|
||||||
for await (const event of stream) {
|
|
||||||
if (event.kind === 'message') {
|
|
||||||
const msg = event as Message
|
|
||||||
content = extractTextContent(msg)
|
|
||||||
taskId = msg.taskId || taskId
|
|
||||||
contextId = msg.contextId || contextId
|
|
||||||
state = 'completed'
|
|
||||||
} else if (event.kind === 'task') {
|
|
||||||
const task = event as Task
|
|
||||||
taskId = task.id
|
|
||||||
contextId = task.contextId
|
|
||||||
state = task.status.state
|
|
||||||
artifacts = task.artifacts || []
|
|
||||||
history = task.history || []
|
|
||||||
const lastAgentMessage = history.filter((m) => m.role === 'agent').pop()
|
|
||||||
if (lastAgentMessage) {
|
|
||||||
content = extractTextContent(lastAgentMessage)
|
|
||||||
}
|
|
||||||
} else if ('status' in event) {
|
|
||||||
const statusEvent = event as TaskStatusUpdateEvent
|
|
||||||
state = statusEvent.status.state
|
|
||||||
} else if ('artifact' in event) {
|
|
||||||
const artifactEvent = event as TaskArtifactUpdateEvent
|
|
||||||
artifacts.push(artifactEvent.artifact)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info(`[${requestId}] A2A streaming message completed`, {
|
|
||||||
taskId,
|
|
||||||
state,
|
|
||||||
artifactCount: artifacts.length,
|
|
||||||
})
|
|
||||||
|
|
||||||
return NextResponse.json({
|
|
||||||
success: isTerminalState(state) && state !== 'failed',
|
|
||||||
output: {
|
|
||||||
content,
|
|
||||||
taskId,
|
|
||||||
contextId,
|
|
||||||
state,
|
|
||||||
artifacts,
|
|
||||||
history,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
} catch (error) {
|
|
||||||
if (error instanceof z.ZodError) {
|
|
||||||
logger.warn(`[${requestId}] Invalid request data`, { errors: error.errors })
|
|
||||||
return NextResponse.json(
|
|
||||||
{
|
|
||||||
success: false,
|
|
||||||
error: 'Invalid request data',
|
|
||||||
details: error.errors,
|
|
||||||
},
|
|
||||||
{ status: 400 }
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.error(`[${requestId}] Error in A2A streaming:`, error)
|
|
||||||
|
|
||||||
return NextResponse.json(
|
|
||||||
{
|
|
||||||
success: false,
|
|
||||||
error: error instanceof Error ? error.message : 'Streaming failed',
|
|
||||||
},
|
|
||||||
{ status: 500 }
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { Message, Task } from '@a2a-js/sdk'
|
import type { DataPart, FilePart, Message, Part, Task, TextPart } from '@a2a-js/sdk'
|
||||||
import { createLogger } from '@sim/logger'
|
import { createLogger } from '@sim/logger'
|
||||||
import { type NextRequest, NextResponse } from 'next/server'
|
import { type NextRequest, NextResponse } from 'next/server'
|
||||||
import { z } from 'zod'
|
import { z } from 'zod'
|
||||||
@@ -10,11 +10,20 @@ export const dynamic = 'force-dynamic'
|
|||||||
|
|
||||||
const logger = createLogger('A2ASendMessageAPI')
|
const logger = createLogger('A2ASendMessageAPI')
|
||||||
|
|
||||||
|
const FileInputSchema = z.object({
|
||||||
|
type: z.enum(['file', 'url']),
|
||||||
|
data: z.string(),
|
||||||
|
name: z.string(),
|
||||||
|
mime: z.string().optional(),
|
||||||
|
})
|
||||||
|
|
||||||
const A2ASendMessageSchema = z.object({
|
const A2ASendMessageSchema = z.object({
|
||||||
agentUrl: z.string().min(1, 'Agent URL is required'),
|
agentUrl: z.string().min(1, 'Agent URL is required'),
|
||||||
message: z.string().min(1, 'Message is required'),
|
message: z.string().min(1, 'Message is required'),
|
||||||
taskId: z.string().optional(),
|
taskId: z.string().optional(),
|
||||||
contextId: z.string().optional(),
|
contextId: z.string().optional(),
|
||||||
|
data: z.string().optional(),
|
||||||
|
files: z.array(FileInputSchema).optional(),
|
||||||
apiKey: z.string().optional(),
|
apiKey: z.string().optional(),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -51,18 +60,100 @@ export async function POST(request: NextRequest) {
|
|||||||
hasContextId: !!validatedData.contextId,
|
hasContextId: !!validatedData.contextId,
|
||||||
})
|
})
|
||||||
|
|
||||||
const client = await createA2AClient(validatedData.agentUrl, validatedData.apiKey)
|
let client
|
||||||
|
try {
|
||||||
|
client = await createA2AClient(validatedData.agentUrl, validatedData.apiKey)
|
||||||
|
logger.info(`[${requestId}] A2A client created successfully`)
|
||||||
|
} catch (clientError) {
|
||||||
|
logger.error(`[${requestId}] Failed to create A2A client:`, clientError)
|
||||||
|
return NextResponse.json(
|
||||||
|
{
|
||||||
|
success: false,
|
||||||
|
error: `Failed to connect to agent: ${clientError instanceof Error ? clientError.message : 'Unknown error'}`,
|
||||||
|
},
|
||||||
|
{ status: 502 }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const parts: Part[] = []
|
||||||
|
|
||||||
|
const textPart: TextPart = { kind: 'text', text: validatedData.message }
|
||||||
|
parts.push(textPart)
|
||||||
|
|
||||||
|
if (validatedData.data) {
|
||||||
|
try {
|
||||||
|
const parsedData = JSON.parse(validatedData.data)
|
||||||
|
const dataPart: DataPart = { kind: 'data', data: parsedData }
|
||||||
|
parts.push(dataPart)
|
||||||
|
} catch (parseError) {
|
||||||
|
logger.warn(`[${requestId}] Failed to parse data as JSON, skipping DataPart`, {
|
||||||
|
error: parseError instanceof Error ? parseError.message : String(parseError),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (validatedData.files && validatedData.files.length > 0) {
|
||||||
|
for (const file of validatedData.files) {
|
||||||
|
if (file.type === 'url') {
|
||||||
|
const filePart: FilePart = {
|
||||||
|
kind: 'file',
|
||||||
|
file: {
|
||||||
|
name: file.name,
|
||||||
|
mimeType: file.mime,
|
||||||
|
uri: file.data,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
parts.push(filePart)
|
||||||
|
} else if (file.type === 'file') {
|
||||||
|
let bytes = file.data
|
||||||
|
let mimeType = file.mime
|
||||||
|
|
||||||
|
if (file.data.startsWith('data:')) {
|
||||||
|
const match = file.data.match(/^data:([^;]+);base64,(.+)$/)
|
||||||
|
if (match) {
|
||||||
|
mimeType = mimeType || match[1]
|
||||||
|
bytes = match[2]
|
||||||
|
} else {
|
||||||
|
bytes = file.data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const filePart: FilePart = {
|
||||||
|
kind: 'file',
|
||||||
|
file: {
|
||||||
|
name: file.name,
|
||||||
|
mimeType: mimeType || 'application/octet-stream',
|
||||||
|
bytes,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
parts.push(filePart)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const message: Message = {
|
const message: Message = {
|
||||||
kind: 'message',
|
kind: 'message',
|
||||||
messageId: crypto.randomUUID(),
|
messageId: crypto.randomUUID(),
|
||||||
role: 'user',
|
role: 'user',
|
||||||
parts: [{ kind: 'text', text: validatedData.message }],
|
parts,
|
||||||
...(validatedData.taskId && { taskId: validatedData.taskId }),
|
...(validatedData.taskId && { taskId: validatedData.taskId }),
|
||||||
...(validatedData.contextId && { contextId: validatedData.contextId }),
|
...(validatedData.contextId && { contextId: validatedData.contextId }),
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await client.sendMessage({ message })
|
let result
|
||||||
|
try {
|
||||||
|
result = await client.sendMessage({ message })
|
||||||
|
logger.info(`[${requestId}] A2A sendMessage completed`, { resultKind: result?.kind })
|
||||||
|
} catch (sendError) {
|
||||||
|
logger.error(`[${requestId}] Failed to send A2A message:`, sendError)
|
||||||
|
return NextResponse.json(
|
||||||
|
{
|
||||||
|
success: false,
|
||||||
|
error: `Failed to send message: ${sendError instanceof Error ? sendError.message : 'Unknown error'}`,
|
||||||
|
},
|
||||||
|
{ status: 502 }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if (result.kind === 'message') {
|
if (result.kind === 'message') {
|
||||||
const responseMessage = result as Message
|
const responseMessage = result as Message
|
||||||
|
|||||||
@@ -2,13 +2,6 @@ import { createSession, createWorkspaceRecord, loggerMock } from '@sim/testing'
|
|||||||
import { NextRequest } from 'next/server'
|
import { NextRequest } from 'next/server'
|
||||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests for workspace invitation by ID API route
|
|
||||||
* Tests GET (details + token acceptance), DELETE (cancellation)
|
|
||||||
*
|
|
||||||
* @vitest-environment node
|
|
||||||
*/
|
|
||||||
|
|
||||||
const mockGetSession = vi.fn()
|
const mockGetSession = vi.fn()
|
||||||
const mockHasWorkspaceAdminAccess = vi.fn()
|
const mockHasWorkspaceAdminAccess = vi.fn()
|
||||||
|
|
||||||
@@ -227,7 +220,7 @@ describe('Workspace Invitation [invitationId] API Route', () => {
|
|||||||
expect(response.headers.get('location')).toBe('https://test.sim.ai/workspace/workspace-456/w')
|
expect(response.headers.get('location')).toBe('https://test.sim.ai/workspace/workspace-456/w')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should redirect to error page when invitation expired', async () => {
|
it('should redirect to error page with token preserved when invitation expired', async () => {
|
||||||
const session = createSession({
|
const session = createSession({
|
||||||
userId: mockUser.id,
|
userId: mockUser.id,
|
||||||
email: 'invited@example.com',
|
email: 'invited@example.com',
|
||||||
@@ -250,12 +243,13 @@ describe('Workspace Invitation [invitationId] API Route', () => {
|
|||||||
const response = await GET(request, { params })
|
const response = await GET(request, { params })
|
||||||
|
|
||||||
expect(response.status).toBe(307)
|
expect(response.status).toBe(307)
|
||||||
expect(response.headers.get('location')).toBe(
|
const location = response.headers.get('location')
|
||||||
'https://test.sim.ai/invite/invitation-789?error=expired'
|
expect(location).toBe(
|
||||||
|
'https://test.sim.ai/invite/invitation-789?error=expired&token=token-abc123'
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should redirect to error page when email mismatch', async () => {
|
it('should redirect to error page with token preserved when email mismatch', async () => {
|
||||||
const session = createSession({
|
const session = createSession({
|
||||||
userId: mockUser.id,
|
userId: mockUser.id,
|
||||||
email: 'wrong@example.com',
|
email: 'wrong@example.com',
|
||||||
@@ -277,12 +271,13 @@ describe('Workspace Invitation [invitationId] API Route', () => {
|
|||||||
const response = await GET(request, { params })
|
const response = await GET(request, { params })
|
||||||
|
|
||||||
expect(response.status).toBe(307)
|
expect(response.status).toBe(307)
|
||||||
expect(response.headers.get('location')).toBe(
|
const location = response.headers.get('location')
|
||||||
'https://test.sim.ai/invite/invitation-789?error=email-mismatch'
|
expect(location).toBe(
|
||||||
|
'https://test.sim.ai/invite/invitation-789?error=email-mismatch&token=token-abc123'
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should return 404 when invitation not found', async () => {
|
it('should return 404 when invitation not found (without token)', async () => {
|
||||||
const session = createSession({ userId: mockUser.id, email: mockUser.email })
|
const session = createSession({ userId: mockUser.id, email: mockUser.email })
|
||||||
mockGetSession.mockResolvedValue(session)
|
mockGetSession.mockResolvedValue(session)
|
||||||
dbSelectResults = [[]]
|
dbSelectResults = [[]]
|
||||||
@@ -296,6 +291,189 @@ describe('Workspace Invitation [invitationId] API Route', () => {
|
|||||||
expect(response.status).toBe(404)
|
expect(response.status).toBe(404)
|
||||||
expect(data).toEqual({ error: 'Invitation not found or has expired' })
|
expect(data).toEqual({ error: 'Invitation not found or has expired' })
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should redirect to error page with token preserved when invitation not found (with token)', async () => {
|
||||||
|
const session = createSession({ userId: mockUser.id, email: mockUser.email })
|
||||||
|
mockGetSession.mockResolvedValue(session)
|
||||||
|
dbSelectResults = [[]]
|
||||||
|
|
||||||
|
const request = new NextRequest(
|
||||||
|
'http://localhost/api/workspaces/invitations/non-existent?token=some-invalid-token'
|
||||||
|
)
|
||||||
|
const params = Promise.resolve({ invitationId: 'non-existent' })
|
||||||
|
|
||||||
|
const response = await GET(request, { params })
|
||||||
|
|
||||||
|
expect(response.status).toBe(307)
|
||||||
|
const location = response.headers.get('location')
|
||||||
|
expect(location).toBe(
|
||||||
|
'https://test.sim.ai/invite/non-existent?error=invalid-token&token=some-invalid-token'
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should redirect to error page with token preserved when invitation already processed', async () => {
|
||||||
|
const session = createSession({
|
||||||
|
userId: mockUser.id,
|
||||||
|
email: 'invited@example.com',
|
||||||
|
name: mockUser.name,
|
||||||
|
})
|
||||||
|
mockGetSession.mockResolvedValue(session)
|
||||||
|
|
||||||
|
const acceptedInvitation = {
|
||||||
|
...mockInvitation,
|
||||||
|
status: 'accepted',
|
||||||
|
}
|
||||||
|
|
||||||
|
dbSelectResults = [[acceptedInvitation], [mockWorkspace]]
|
||||||
|
|
||||||
|
const request = new NextRequest(
|
||||||
|
'http://localhost/api/workspaces/invitations/token-abc123?token=token-abc123'
|
||||||
|
)
|
||||||
|
const params = Promise.resolve({ invitationId: 'token-abc123' })
|
||||||
|
|
||||||
|
const response = await GET(request, { params })
|
||||||
|
|
||||||
|
expect(response.status).toBe(307)
|
||||||
|
const location = response.headers.get('location')
|
||||||
|
expect(location).toBe(
|
||||||
|
'https://test.sim.ai/invite/invitation-789?error=already-processed&token=token-abc123'
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should redirect to error page with token preserved when workspace not found', async () => {
|
||||||
|
const session = createSession({
|
||||||
|
userId: mockUser.id,
|
||||||
|
email: 'invited@example.com',
|
||||||
|
name: mockUser.name,
|
||||||
|
})
|
||||||
|
mockGetSession.mockResolvedValue(session)
|
||||||
|
|
||||||
|
dbSelectResults = [[mockInvitation], []]
|
||||||
|
|
||||||
|
const request = new NextRequest(
|
||||||
|
'http://localhost/api/workspaces/invitations/token-abc123?token=token-abc123'
|
||||||
|
)
|
||||||
|
const params = Promise.resolve({ invitationId: 'token-abc123' })
|
||||||
|
|
||||||
|
const response = await GET(request, { params })
|
||||||
|
|
||||||
|
expect(response.status).toBe(307)
|
||||||
|
const location = response.headers.get('location')
|
||||||
|
expect(location).toBe(
|
||||||
|
'https://test.sim.ai/invite/invitation-789?error=workspace-not-found&token=token-abc123'
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should redirect to error page with token preserved when user not found', async () => {
|
||||||
|
const session = createSession({
|
||||||
|
userId: mockUser.id,
|
||||||
|
email: 'invited@example.com',
|
||||||
|
name: mockUser.name,
|
||||||
|
})
|
||||||
|
mockGetSession.mockResolvedValue(session)
|
||||||
|
|
||||||
|
dbSelectResults = [[mockInvitation], [mockWorkspace], []]
|
||||||
|
|
||||||
|
const request = new NextRequest(
|
||||||
|
'http://localhost/api/workspaces/invitations/token-abc123?token=token-abc123'
|
||||||
|
)
|
||||||
|
const params = Promise.resolve({ invitationId: 'token-abc123' })
|
||||||
|
|
||||||
|
const response = await GET(request, { params })
|
||||||
|
|
||||||
|
expect(response.status).toBe(307)
|
||||||
|
const location = response.headers.get('location')
|
||||||
|
expect(location).toBe(
|
||||||
|
'https://test.sim.ai/invite/invitation-789?error=user-not-found&token=token-abc123'
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should URL encode special characters in token when preserving in error redirects', async () => {
|
||||||
|
const session = createSession({
|
||||||
|
userId: mockUser.id,
|
||||||
|
email: 'wrong@example.com',
|
||||||
|
name: mockUser.name,
|
||||||
|
})
|
||||||
|
mockGetSession.mockResolvedValue(session)
|
||||||
|
|
||||||
|
dbSelectResults = [
|
||||||
|
[mockInvitation],
|
||||||
|
[mockWorkspace],
|
||||||
|
[{ ...mockUser, email: 'wrong@example.com' }],
|
||||||
|
]
|
||||||
|
|
||||||
|
const specialToken = 'token+with/special=chars&more'
|
||||||
|
const request = new NextRequest(
|
||||||
|
`http://localhost/api/workspaces/invitations/token-abc123?token=${encodeURIComponent(specialToken)}`
|
||||||
|
)
|
||||||
|
const params = Promise.resolve({ invitationId: 'token-abc123' })
|
||||||
|
|
||||||
|
const response = await GET(request, { params })
|
||||||
|
|
||||||
|
expect(response.status).toBe(307)
|
||||||
|
const location = response.headers.get('location')
|
||||||
|
expect(location).toContain('error=email-mismatch')
|
||||||
|
expect(location).toContain(`token=${encodeURIComponent(specialToken)}`)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('Token Preservation - Full Flow Scenario', () => {
|
||||||
|
it('should preserve token through email mismatch so user can retry with correct account', async () => {
|
||||||
|
const wrongSession = createSession({
|
||||||
|
userId: 'wrong-user',
|
||||||
|
email: 'wrong@example.com',
|
||||||
|
name: 'Wrong User',
|
||||||
|
})
|
||||||
|
mockGetSession.mockResolvedValue(wrongSession)
|
||||||
|
|
||||||
|
dbSelectResults = [
|
||||||
|
[mockInvitation],
|
||||||
|
[mockWorkspace],
|
||||||
|
[{ id: 'wrong-user', email: 'wrong@example.com' }],
|
||||||
|
]
|
||||||
|
|
||||||
|
const request1 = new NextRequest(
|
||||||
|
'http://localhost/api/workspaces/invitations/token-abc123?token=token-abc123'
|
||||||
|
)
|
||||||
|
const params1 = Promise.resolve({ invitationId: 'token-abc123' })
|
||||||
|
|
||||||
|
const response1 = await GET(request1, { params: params1 })
|
||||||
|
|
||||||
|
expect(response1.status).toBe(307)
|
||||||
|
const location1 = response1.headers.get('location')
|
||||||
|
expect(location1).toBe(
|
||||||
|
'https://test.sim.ai/invite/invitation-789?error=email-mismatch&token=token-abc123'
|
||||||
|
)
|
||||||
|
|
||||||
|
vi.clearAllMocks()
|
||||||
|
dbSelectCallIndex = 0
|
||||||
|
|
||||||
|
const correctSession = createSession({
|
||||||
|
userId: mockUser.id,
|
||||||
|
email: 'invited@example.com',
|
||||||
|
name: mockUser.name,
|
||||||
|
})
|
||||||
|
mockGetSession.mockResolvedValue(correctSession)
|
||||||
|
|
||||||
|
dbSelectResults = [
|
||||||
|
[mockInvitation],
|
||||||
|
[mockWorkspace],
|
||||||
|
[{ ...mockUser, email: 'invited@example.com' }],
|
||||||
|
[],
|
||||||
|
]
|
||||||
|
|
||||||
|
const request2 = new NextRequest(
|
||||||
|
'http://localhost/api/workspaces/invitations/token-abc123?token=token-abc123'
|
||||||
|
)
|
||||||
|
const params2 = Promise.resolve({ invitationId: 'token-abc123' })
|
||||||
|
|
||||||
|
const response2 = await GET(request2, { params: params2 })
|
||||||
|
|
||||||
|
expect(response2.status).toBe(307)
|
||||||
|
expect(response2.headers.get('location')).toBe(
|
||||||
|
'https://test.sim.ai/workspace/workspace-456/w'
|
||||||
|
)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('DELETE /api/workspaces/invitations/[invitationId]', () => {
|
describe('DELETE /api/workspaces/invitations/[invitationId]', () => {
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ export async function GET(
|
|||||||
const isAcceptFlow = !!token // If token is provided, this is an acceptance flow
|
const isAcceptFlow = !!token // If token is provided, this is an acceptance flow
|
||||||
|
|
||||||
if (!session?.user?.id) {
|
if (!session?.user?.id) {
|
||||||
// For token-based acceptance flows, redirect to login
|
|
||||||
if (isAcceptFlow) {
|
if (isAcceptFlow) {
|
||||||
return NextResponse.redirect(new URL(`/invite/${invitationId}?token=${token}`, getBaseUrl()))
|
return NextResponse.redirect(new URL(`/invite/${invitationId}?token=${token}`, getBaseUrl()))
|
||||||
}
|
}
|
||||||
@@ -51,8 +50,9 @@ export async function GET(
|
|||||||
|
|
||||||
if (!invitation) {
|
if (!invitation) {
|
||||||
if (isAcceptFlow) {
|
if (isAcceptFlow) {
|
||||||
|
const tokenParam = token ? `&token=${encodeURIComponent(token)}` : ''
|
||||||
return NextResponse.redirect(
|
return NextResponse.redirect(
|
||||||
new URL(`/invite/${invitationId}?error=invalid-token`, getBaseUrl())
|
new URL(`/invite/${invitationId}?error=invalid-token${tokenParam}`, getBaseUrl())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
return NextResponse.json({ error: 'Invitation not found or has expired' }, { status: 404 })
|
return NextResponse.json({ error: 'Invitation not found or has expired' }, { status: 404 })
|
||||||
@@ -60,8 +60,9 @@ export async function GET(
|
|||||||
|
|
||||||
if (new Date() > new Date(invitation.expiresAt)) {
|
if (new Date() > new Date(invitation.expiresAt)) {
|
||||||
if (isAcceptFlow) {
|
if (isAcceptFlow) {
|
||||||
|
const tokenParam = token ? `&token=${encodeURIComponent(token)}` : ''
|
||||||
return NextResponse.redirect(
|
return NextResponse.redirect(
|
||||||
new URL(`/invite/${invitation.id}?error=expired`, getBaseUrl())
|
new URL(`/invite/${invitation.id}?error=expired${tokenParam}`, getBaseUrl())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
return NextResponse.json({ error: 'Invitation has expired' }, { status: 400 })
|
return NextResponse.json({ error: 'Invitation has expired' }, { status: 400 })
|
||||||
@@ -75,17 +76,20 @@ export async function GET(
|
|||||||
|
|
||||||
if (!workspaceDetails) {
|
if (!workspaceDetails) {
|
||||||
if (isAcceptFlow) {
|
if (isAcceptFlow) {
|
||||||
|
const tokenParam = token ? `&token=${encodeURIComponent(token)}` : ''
|
||||||
return NextResponse.redirect(
|
return NextResponse.redirect(
|
||||||
new URL(`/invite/${invitation.id}?error=workspace-not-found`, getBaseUrl())
|
new URL(`/invite/${invitation.id}?error=workspace-not-found${tokenParam}`, getBaseUrl())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
return NextResponse.json({ error: 'Workspace not found' }, { status: 404 })
|
return NextResponse.json({ error: 'Workspace not found' }, { status: 404 })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isAcceptFlow) {
|
if (isAcceptFlow) {
|
||||||
|
const tokenParam = token ? `&token=${encodeURIComponent(token)}` : ''
|
||||||
|
|
||||||
if (invitation.status !== ('pending' as WorkspaceInvitationStatus)) {
|
if (invitation.status !== ('pending' as WorkspaceInvitationStatus)) {
|
||||||
return NextResponse.redirect(
|
return NextResponse.redirect(
|
||||||
new URL(`/invite/${invitation.id}?error=already-processed`, getBaseUrl())
|
new URL(`/invite/${invitation.id}?error=already-processed${tokenParam}`, getBaseUrl())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +104,7 @@ export async function GET(
|
|||||||
|
|
||||||
if (!userData) {
|
if (!userData) {
|
||||||
return NextResponse.redirect(
|
return NextResponse.redirect(
|
||||||
new URL(`/invite/${invitation.id}?error=user-not-found`, getBaseUrl())
|
new URL(`/invite/${invitation.id}?error=user-not-found${tokenParam}`, getBaseUrl())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,7 +112,7 @@ export async function GET(
|
|||||||
|
|
||||||
if (!isValidMatch) {
|
if (!isValidMatch) {
|
||||||
return NextResponse.redirect(
|
return NextResponse.redirect(
|
||||||
new URL(`/invite/${invitation.id}?error=email-mismatch`, getBaseUrl())
|
new URL(`/invite/${invitation.id}?error=email-mismatch${tokenParam}`, getBaseUrl())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -178,23 +178,25 @@ export default function Invite() {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const errorReason = searchParams.get('error')
|
const errorReason = searchParams.get('error')
|
||||||
|
const isNew = searchParams.get('new') === 'true'
|
||||||
|
setIsNewUser(isNew)
|
||||||
|
|
||||||
|
const tokenFromQuery = searchParams.get('token')
|
||||||
|
if (tokenFromQuery) {
|
||||||
|
setToken(tokenFromQuery)
|
||||||
|
sessionStorage.setItem('inviteToken', tokenFromQuery)
|
||||||
|
} else {
|
||||||
|
const storedToken = sessionStorage.getItem('inviteToken')
|
||||||
|
if (storedToken && storedToken !== inviteId) {
|
||||||
|
setToken(storedToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (errorReason) {
|
if (errorReason) {
|
||||||
setError(getInviteError(errorReason))
|
setError(getInviteError(errorReason))
|
||||||
setIsLoading(false)
|
setIsLoading(false)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const isNew = searchParams.get('new') === 'true'
|
|
||||||
setIsNewUser(isNew)
|
|
||||||
|
|
||||||
const tokenFromQuery = searchParams.get('token')
|
|
||||||
const effectiveToken = tokenFromQuery || inviteId
|
|
||||||
|
|
||||||
if (effectiveToken) {
|
|
||||||
setToken(effectiveToken)
|
|
||||||
sessionStorage.setItem('inviteToken', effectiveToken)
|
|
||||||
}
|
|
||||||
}, [searchParams, inviteId])
|
}, [searchParams, inviteId])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -203,7 +205,6 @@ export default function Invite() {
|
|||||||
async function fetchInvitationDetails() {
|
async function fetchInvitationDetails() {
|
||||||
setIsLoading(true)
|
setIsLoading(true)
|
||||||
try {
|
try {
|
||||||
// Fetch invitation details using the invitation ID from the URL path
|
|
||||||
const workspaceInviteResponse = await fetch(`/api/workspaces/invitations/${inviteId}`, {
|
const workspaceInviteResponse = await fetch(`/api/workspaces/invitations/${inviteId}`, {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
})
|
})
|
||||||
@@ -220,7 +221,6 @@ export default function Invite() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle workspace invitation errors with specific status codes
|
|
||||||
if (!workspaceInviteResponse.ok && workspaceInviteResponse.status !== 404) {
|
if (!workspaceInviteResponse.ok && workspaceInviteResponse.status !== 404) {
|
||||||
const errorCode = parseApiError(null, workspaceInviteResponse.status)
|
const errorCode = parseApiError(null, workspaceInviteResponse.status)
|
||||||
const errorData = await workspaceInviteResponse.json().catch(() => ({}))
|
const errorData = await workspaceInviteResponse.json().catch(() => ({}))
|
||||||
@@ -229,7 +229,6 @@ export default function Invite() {
|
|||||||
error: errorData,
|
error: errorData,
|
||||||
})
|
})
|
||||||
|
|
||||||
// Refine error code based on response body if available
|
|
||||||
if (errorData.error) {
|
if (errorData.error) {
|
||||||
const refinedCode = parseApiError(errorData.error, workspaceInviteResponse.status)
|
const refinedCode = parseApiError(errorData.error, workspaceInviteResponse.status)
|
||||||
setError(getInviteError(refinedCode))
|
setError(getInviteError(refinedCode))
|
||||||
@@ -254,13 +253,11 @@ export default function Invite() {
|
|||||||
if (data) {
|
if (data) {
|
||||||
setInvitationType('organization')
|
setInvitationType('organization')
|
||||||
|
|
||||||
// Check if user is already in an organization BEFORE showing the invitation
|
|
||||||
const activeOrgResponse = await client.organization
|
const activeOrgResponse = await client.organization
|
||||||
.getFullOrganization()
|
.getFullOrganization()
|
||||||
.catch(() => ({ data: null }))
|
.catch(() => ({ data: null }))
|
||||||
|
|
||||||
if (activeOrgResponse?.data) {
|
if (activeOrgResponse?.data) {
|
||||||
// User is already in an organization
|
|
||||||
setCurrentOrgName(activeOrgResponse.data.name)
|
setCurrentOrgName(activeOrgResponse.data.name)
|
||||||
setError(getInviteError('already-in-organization'))
|
setError(getInviteError('already-in-organization'))
|
||||||
setIsLoading(false)
|
setIsLoading(false)
|
||||||
@@ -289,7 +286,6 @@ export default function Invite() {
|
|||||||
throw { code: 'invalid-invitation' }
|
throw { code: 'invalid-invitation' }
|
||||||
}
|
}
|
||||||
} catch (orgErr: any) {
|
} catch (orgErr: any) {
|
||||||
// If this is our structured error, use it directly
|
|
||||||
if (orgErr.code) {
|
if (orgErr.code) {
|
||||||
throw orgErr
|
throw orgErr
|
||||||
}
|
}
|
||||||
@@ -316,7 +312,6 @@ export default function Invite() {
|
|||||||
window.location.href = `/api/workspaces/invitations/${encodeURIComponent(inviteId)}?token=${encodeURIComponent(token || '')}`
|
window.location.href = `/api/workspaces/invitations/${encodeURIComponent(inviteId)}?token=${encodeURIComponent(token || '')}`
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
// Get the organizationId from invitation details
|
|
||||||
const orgId = invitationDetails?.data?.organizationId
|
const orgId = invitationDetails?.data?.organizationId
|
||||||
|
|
||||||
if (!orgId) {
|
if (!orgId) {
|
||||||
@@ -325,7 +320,6 @@ export default function Invite() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use our custom API endpoint that handles Pro usage snapshot
|
|
||||||
const response = await fetch(`/api/organizations/${orgId}/invitations/${inviteId}`, {
|
const response = await fetch(`/api/organizations/${orgId}/invitations/${inviteId}`, {
|
||||||
method: 'PUT',
|
method: 'PUT',
|
||||||
headers: {
|
headers: {
|
||||||
@@ -347,7 +341,6 @@ export default function Invite() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the organization as active
|
|
||||||
await client.organization.setActive({
|
await client.organization.setActive({
|
||||||
organizationId: orgId,
|
organizationId: orgId,
|
||||||
})
|
})
|
||||||
@@ -360,7 +353,6 @@ export default function Invite() {
|
|||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
logger.error('Error accepting invitation:', err)
|
logger.error('Error accepting invitation:', err)
|
||||||
|
|
||||||
// Reset accepted state on error
|
|
||||||
setAccepted(false)
|
setAccepted(false)
|
||||||
|
|
||||||
const errorCode = parseApiError(err)
|
const errorCode = parseApiError(err)
|
||||||
@@ -371,7 +363,9 @@ export default function Invite() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const getCallbackUrl = () => {
|
const getCallbackUrl = () => {
|
||||||
return `/invite/${inviteId}${token && token !== inviteId ? `?token=${token}` : ''}`
|
const effectiveToken =
|
||||||
|
token || sessionStorage.getItem('inviteToken') || searchParams.get('token')
|
||||||
|
return `/invite/${inviteId}${effectiveToken && effectiveToken !== inviteId ? `?token=${effectiveToken}` : ''}`
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!session?.user && !isPending) {
|
if (!session?.user && !isPending) {
|
||||||
@@ -435,7 +429,6 @@ export default function Invite() {
|
|||||||
if (error) {
|
if (error) {
|
||||||
const callbackUrl = encodeURIComponent(getCallbackUrl())
|
const callbackUrl = encodeURIComponent(getCallbackUrl())
|
||||||
|
|
||||||
// Special handling for already in organization
|
|
||||||
if (error.code === 'already-in-organization') {
|
if (error.code === 'already-in-organization') {
|
||||||
return (
|
return (
|
||||||
<InviteLayout>
|
<InviteLayout>
|
||||||
@@ -463,7 +456,6 @@ export default function Invite() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle email mismatch - user needs to sign in with a different account
|
|
||||||
if (error.code === 'email-mismatch') {
|
if (error.code === 'email-mismatch') {
|
||||||
return (
|
return (
|
||||||
<InviteLayout>
|
<InviteLayout>
|
||||||
@@ -490,7 +482,6 @@ export default function Invite() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle auth-related errors - prompt user to sign in
|
|
||||||
if (error.requiresAuth) {
|
if (error.requiresAuth) {
|
||||||
return (
|
return (
|
||||||
<InviteLayout>
|
<InviteLayout>
|
||||||
@@ -518,7 +509,6 @@ export default function Invite() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle retryable errors
|
|
||||||
const actions: Array<{
|
const actions: Array<{
|
||||||
label: string
|
label: string
|
||||||
onClick: () => void
|
onClick: () => void
|
||||||
@@ -550,7 +540,6 @@ export default function Invite() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show success only if accepted AND no error
|
|
||||||
if (accepted && !error) {
|
if (accepted && !error) {
|
||||||
return (
|
return (
|
||||||
<InviteLayout>
|
<InviteLayout>
|
||||||
|
|||||||
@@ -221,7 +221,9 @@ export function Chat() {
|
|||||||
exportChatCSV,
|
exportChatCSV,
|
||||||
} = useChatStore()
|
} = useChatStore()
|
||||||
|
|
||||||
const { entries } = useTerminalConsoleStore()
|
const hasConsoleHydrated = useTerminalConsoleStore((state) => state._hasHydrated)
|
||||||
|
const entriesFromStore = useTerminalConsoleStore((state) => state.entries)
|
||||||
|
const entries = hasConsoleHydrated ? entriesFromStore : []
|
||||||
const { isExecuting } = useExecutionStore()
|
const { isExecuting } = useExecutionStore()
|
||||||
const { handleRunWorkflow, handleCancelExecution } = useWorkflowExecution()
|
const { handleRunWorkflow, handleCancelExecution } = useWorkflowExecution()
|
||||||
const { data: session } = useSession()
|
const { data: session } = useSession()
|
||||||
@@ -531,35 +533,6 @@ export function Chat() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
|
||||||
selectedOutputs.length > 0 &&
|
|
||||||
'logs' in result &&
|
|
||||||
Array.isArray(result.logs) &&
|
|
||||||
activeWorkflowId
|
|
||||||
) {
|
|
||||||
const additionalOutputs: string[] = []
|
|
||||||
|
|
||||||
for (const outputId of selectedOutputs) {
|
|
||||||
const blockId = extractBlockIdFromOutputId(outputId)
|
|
||||||
const path = extractPathFromOutputId(outputId, blockId)
|
|
||||||
|
|
||||||
if (path === 'content') continue
|
|
||||||
|
|
||||||
const outputValue = extractOutputFromLogs(result.logs as BlockLog[], outputId)
|
|
||||||
if (outputValue !== undefined) {
|
|
||||||
const formattedValue =
|
|
||||||
typeof outputValue === 'string' ? outputValue : JSON.stringify(outputValue)
|
|
||||||
if (formattedValue) {
|
|
||||||
additionalOutputs.push(`**${path}:** ${formattedValue}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (additionalOutputs.length > 0) {
|
|
||||||
appendMessageContent(responseMessageId, `\n\n${additionalOutputs.join('\n\n')}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
finalizeMessageStream(responseMessageId)
|
finalizeMessageStream(responseMessageId)
|
||||||
} else if (contentChunk) {
|
} else if (contentChunk) {
|
||||||
accumulatedContent += contentChunk
|
accumulatedContent += contentChunk
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import {
|
|||||||
extractFieldsFromSchema,
|
extractFieldsFromSchema,
|
||||||
parseResponseFormatSafely,
|
parseResponseFormatSafely,
|
||||||
} from '@/lib/core/utils/response-format'
|
} from '@/lib/core/utils/response-format'
|
||||||
|
import { getToolOutputs } from '@/lib/workflows/blocks/block-outputs'
|
||||||
import { getBlock } from '@/blocks'
|
import { getBlock } from '@/blocks'
|
||||||
import { useWorkflowDiffStore } from '@/stores/workflow-diff/store'
|
import { useWorkflowDiffStore } from '@/stores/workflow-diff/store'
|
||||||
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
|
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
|
||||||
@@ -128,6 +129,10 @@ export function OutputSelect({
|
|||||||
? baselineWorkflow.blocks?.[block.id]?.subBlocks?.responseFormat?.value
|
? baselineWorkflow.blocks?.[block.id]?.subBlocks?.responseFormat?.value
|
||||||
: subBlockValues?.[block.id]?.responseFormat
|
: subBlockValues?.[block.id]?.responseFormat
|
||||||
const responseFormat = parseResponseFormatSafely(responseFormatValue, block.id)
|
const responseFormat = parseResponseFormatSafely(responseFormatValue, block.id)
|
||||||
|
const operationValue =
|
||||||
|
shouldUseBaseline && baselineWorkflow
|
||||||
|
? baselineWorkflow.blocks?.[block.id]?.subBlocks?.operation?.value
|
||||||
|
: subBlockValues?.[block.id]?.operation
|
||||||
|
|
||||||
let outputsToProcess: Record<string, unknown> = {}
|
let outputsToProcess: Record<string, unknown> = {}
|
||||||
|
|
||||||
@@ -141,7 +146,12 @@ export function OutputSelect({
|
|||||||
outputsToProcess = blockConfig?.outputs || {}
|
outputsToProcess = blockConfig?.outputs || {}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
outputsToProcess = blockConfig?.outputs || {}
|
const toolOutputs =
|
||||||
|
blockConfig && typeof operationValue === 'string'
|
||||||
|
? getToolOutputs(blockConfig, operationValue)
|
||||||
|
: {}
|
||||||
|
outputsToProcess =
|
||||||
|
Object.keys(toolOutputs).length > 0 ? toolOutputs : blockConfig?.outputs || {}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Object.keys(outputsToProcess).length === 0) return
|
if (Object.keys(outputsToProcess).length === 0) return
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import { Button, Code, getCodeEditorProps, highlight, languages } from '@/compon
|
|||||||
import { ClientToolCallState } from '@/lib/copilot/tools/client/base-tool'
|
import { ClientToolCallState } from '@/lib/copilot/tools/client/base-tool'
|
||||||
import { getClientTool } from '@/lib/copilot/tools/client/manager'
|
import { getClientTool } from '@/lib/copilot/tools/client/manager'
|
||||||
import { getRegisteredTools } from '@/lib/copilot/tools/client/registry'
|
import { getRegisteredTools } from '@/lib/copilot/tools/client/registry'
|
||||||
// Initialize all tool UI configs
|
|
||||||
import '@/lib/copilot/tools/client/init-tool-configs'
|
import '@/lib/copilot/tools/client/init-tool-configs'
|
||||||
import {
|
import {
|
||||||
getSubagentLabels as getSubagentLabelsFromConfig,
|
getSubagentLabels as getSubagentLabelsFromConfig,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
export { AttachedFilesDisplay } from './attached-files-display/attached-files-display'
|
export { AttachedFilesDisplay } from './attached-files-display/attached-files-display'
|
||||||
export { ContextPills } from './context-pills/context-pills'
|
export { ContextPills } from './context-pills/context-pills'
|
||||||
export { MentionMenu } from './mention-menu/mention-menu'
|
export { type MentionFolderNav, MentionMenu } from './mention-menu/mention-menu'
|
||||||
export { ModeSelector } from './mode-selector/mode-selector'
|
export { ModeSelector } from './mode-selector/mode-selector'
|
||||||
export { ModelSelector } from './model-selector/model-selector'
|
export { ModelSelector } from './model-selector/model-selector'
|
||||||
export { SlashMenu } from './slash-menu/slash-menu'
|
export { type SlashFolderNav, SlashMenu } from './slash-menu/slash-menu'
|
||||||
|
|||||||
@@ -0,0 +1,151 @@
|
|||||||
|
'use client'
|
||||||
|
|
||||||
|
import type { ComponentType, ReactNode, SVGProps } from 'react'
|
||||||
|
import { PopoverItem } from '@/components/emcn'
|
||||||
|
import { formatCompactTimestamp } from '@/lib/core/utils/formatting'
|
||||||
|
import {
|
||||||
|
FOLDER_CONFIGS,
|
||||||
|
MENU_STATE_TEXT_CLASSES,
|
||||||
|
type MentionFolderId,
|
||||||
|
} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/constants'
|
||||||
|
|
||||||
|
const ICON_CONTAINER =
|
||||||
|
'relative flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center overflow-hidden rounded-[4px]'
|
||||||
|
|
||||||
|
export function BlockIcon({
|
||||||
|
bgColor,
|
||||||
|
Icon,
|
||||||
|
}: {
|
||||||
|
bgColor?: string
|
||||||
|
Icon?: ComponentType<SVGProps<SVGSVGElement>>
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<div className={ICON_CONTAINER} style={{ background: bgColor || '#6B7280' }}>
|
||||||
|
{Icon && <Icon className='!h-[10px] !w-[10px] !text-white' />}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function WorkflowColorDot({ color }: { color?: string }) {
|
||||||
|
return <div className={ICON_CONTAINER} style={{ backgroundColor: color || '#3972F6' }} />
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FolderContentProps {
|
||||||
|
/** Folder ID to render content for */
|
||||||
|
folderId: MentionFolderId
|
||||||
|
/** Items to render (already filtered) */
|
||||||
|
items: any[]
|
||||||
|
/** Whether data is loading */
|
||||||
|
isLoading: boolean
|
||||||
|
/** Current search query (for determining empty vs no-match message) */
|
||||||
|
currentQuery: string
|
||||||
|
/** Currently active item index (for keyboard navigation) */
|
||||||
|
activeIndex: number
|
||||||
|
/** Callback when an item is clicked */
|
||||||
|
onItemClick: (item: any) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
export function renderItemIcon(folderId: MentionFolderId, item: any): ReactNode {
|
||||||
|
switch (folderId) {
|
||||||
|
case 'workflows':
|
||||||
|
return <WorkflowColorDot color={item.color} />
|
||||||
|
case 'blocks':
|
||||||
|
case 'workflow-blocks':
|
||||||
|
return <BlockIcon bgColor={item.bgColor} Icon={item.iconComponent} />
|
||||||
|
default:
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderItemSuffix(folderId: MentionFolderId, item: any): ReactNode {
|
||||||
|
switch (folderId) {
|
||||||
|
case 'templates':
|
||||||
|
return <span className='text-[10px] text-[var(--text-muted)]'>{item.stars}</span>
|
||||||
|
case 'logs':
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<span className='text-[10px] text-[var(--text-tertiary)]'>·</span>
|
||||||
|
<span className='whitespace-nowrap text-[10px]'>
|
||||||
|
{formatCompactTimestamp(item.createdAt)}
|
||||||
|
</span>
|
||||||
|
<span className='text-[10px] text-[var(--text-tertiary)]'>·</span>
|
||||||
|
<span className='text-[10px] capitalize'>{(item.trigger || 'manual').toLowerCase()}</span>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
default:
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function FolderContent({
|
||||||
|
folderId,
|
||||||
|
items,
|
||||||
|
isLoading,
|
||||||
|
currentQuery,
|
||||||
|
activeIndex,
|
||||||
|
onItemClick,
|
||||||
|
}: FolderContentProps) {
|
||||||
|
const config = FOLDER_CONFIGS[folderId]
|
||||||
|
|
||||||
|
if (isLoading) {
|
||||||
|
return <div className={MENU_STATE_TEXT_CLASSES}>Loading...</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
if (items.length === 0) {
|
||||||
|
return (
|
||||||
|
<div className={MENU_STATE_TEXT_CLASSES}>
|
||||||
|
{currentQuery ? config.noMatchMessage : config.emptyMessage}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{items.map((item, index) => (
|
||||||
|
<PopoverItem
|
||||||
|
key={config.getId(item)}
|
||||||
|
onClick={() => onItemClick(item)}
|
||||||
|
data-idx={index}
|
||||||
|
active={index === activeIndex}
|
||||||
|
>
|
||||||
|
{renderItemIcon(folderId, item)}
|
||||||
|
<span className={folderId === 'logs' ? 'min-w-0 flex-1 truncate' : 'truncate'}>
|
||||||
|
{config.getLabel(item)}
|
||||||
|
</span>
|
||||||
|
{renderItemSuffix(folderId, item)}
|
||||||
|
</PopoverItem>
|
||||||
|
))}
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function FolderPreviewContent({
|
||||||
|
folderId,
|
||||||
|
items,
|
||||||
|
isLoading,
|
||||||
|
onItemClick,
|
||||||
|
}: Omit<FolderContentProps, 'currentQuery' | 'activeIndex'>) {
|
||||||
|
const config = FOLDER_CONFIGS[folderId]
|
||||||
|
|
||||||
|
if (isLoading) {
|
||||||
|
return <div className={MENU_STATE_TEXT_CLASSES}>Loading...</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
if (items.length === 0) {
|
||||||
|
return <div className={MENU_STATE_TEXT_CLASSES}>{config.emptyMessage}</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{items.map((item) => (
|
||||||
|
<PopoverItem key={config.getId(item)} onClick={() => onItemClick(item)}>
|
||||||
|
{renderItemIcon(folderId, item)}
|
||||||
|
<span className={folderId === 'logs' ? 'min-w-0 flex-1 truncate' : 'truncate'}>
|
||||||
|
{config.getLabel(item)}
|
||||||
|
</span>
|
||||||
|
{renderItemSuffix(folderId, item)}
|
||||||
|
</PopoverItem>
|
||||||
|
))}
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import { useMemo } from 'react'
|
import { useEffect, useMemo } from 'react'
|
||||||
import {
|
import {
|
||||||
Popover,
|
Popover,
|
||||||
PopoverAnchor,
|
PopoverAnchor,
|
||||||
@@ -9,147 +9,167 @@ import {
|
|||||||
PopoverFolder,
|
PopoverFolder,
|
||||||
PopoverItem,
|
PopoverItem,
|
||||||
PopoverScrollArea,
|
PopoverScrollArea,
|
||||||
|
usePopoverContext,
|
||||||
} from '@/components/emcn'
|
} from '@/components/emcn'
|
||||||
|
import {
|
||||||
|
ALL_SLASH_COMMANDS,
|
||||||
|
MENU_STATE_TEXT_CLASSES,
|
||||||
|
TOP_LEVEL_COMMANDS,
|
||||||
|
WEB_COMMANDS,
|
||||||
|
} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/constants'
|
||||||
|
import { useCaretViewport } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks'
|
||||||
import type { useMentionMenu } from '../../hooks/use-mention-menu'
|
import type { useMentionMenu } from '../../hooks/use-mention-menu'
|
||||||
|
|
||||||
/**
|
export interface SlashFolderNav {
|
||||||
* Top-level slash command options
|
isInFolder: boolean
|
||||||
*/
|
openWebFolder: () => void
|
||||||
const TOP_LEVEL_COMMANDS = [
|
closeFolder: () => void
|
||||||
{ id: 'fast', label: 'fast' },
|
}
|
||||||
{ id: 'plan', label: 'plan' },
|
|
||||||
{ id: 'debug', label: 'debug' },
|
|
||||||
{ id: 'research', label: 'research' },
|
|
||||||
{ id: 'deploy', label: 'deploy' },
|
|
||||||
{ id: 'superagent', label: 'superagent' },
|
|
||||||
] as const
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Web submenu commands
|
|
||||||
*/
|
|
||||||
const WEB_COMMANDS = [
|
|
||||||
{ id: 'search', label: 'search' },
|
|
||||||
{ id: 'read', label: 'read' },
|
|
||||||
{ id: 'scrape', label: 'scrape' },
|
|
||||||
{ id: 'crawl', label: 'crawl' },
|
|
||||||
] as const
|
|
||||||
|
|
||||||
/**
|
|
||||||
* All command labels for filtering
|
|
||||||
*/
|
|
||||||
const ALL_COMMANDS = [...TOP_LEVEL_COMMANDS, ...WEB_COMMANDS]
|
|
||||||
|
|
||||||
interface SlashMenuProps {
|
interface SlashMenuProps {
|
||||||
mentionMenu: ReturnType<typeof useMentionMenu>
|
mentionMenu: ReturnType<typeof useMentionMenu>
|
||||||
message: string
|
message: string
|
||||||
onSelectCommand: (command: string) => void
|
onSelectCommand: (command: string) => void
|
||||||
|
onFolderNavChange?: (nav: SlashFolderNav) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
function SlashMenuContent({
|
||||||
* SlashMenu component for slash command dropdown.
|
mentionMenu,
|
||||||
* Shows command options when user types '/'.
|
message,
|
||||||
*
|
onSelectCommand,
|
||||||
* @param props - Component props
|
onFolderNavChange,
|
||||||
* @returns Rendered slash menu
|
}: SlashMenuProps) {
|
||||||
*/
|
const { currentFolder, openFolder, closeFolder } = usePopoverContext()
|
||||||
export function SlashMenu({ mentionMenu, message, onSelectCommand }: SlashMenuProps) {
|
|
||||||
const {
|
const {
|
||||||
mentionMenuRef,
|
|
||||||
menuListRef,
|
menuListRef,
|
||||||
getActiveSlashQueryAtPosition,
|
getActiveSlashQueryAtPosition,
|
||||||
getCaretPos,
|
getCaretPos,
|
||||||
submenuActiveIndex,
|
submenuActiveIndex,
|
||||||
mentionActiveIndex,
|
mentionActiveIndex,
|
||||||
openSubmenuFor,
|
setSubmenuActiveIndex,
|
||||||
setOpenSubmenuFor,
|
|
||||||
} = mentionMenu
|
} = mentionMenu
|
||||||
|
|
||||||
/**
|
const caretPos = getCaretPos()
|
||||||
* Get the current query string after /
|
|
||||||
*/
|
|
||||||
const currentQuery = useMemo(() => {
|
const currentQuery = useMemo(() => {
|
||||||
const caretPos = getCaretPos()
|
|
||||||
const active = getActiveSlashQueryAtPosition(caretPos, message)
|
const active = getActiveSlashQueryAtPosition(caretPos, message)
|
||||||
return active?.query.trim().toLowerCase() || ''
|
return active?.query.trim().toLowerCase() || ''
|
||||||
}, [message, getCaretPos, getActiveSlashQueryAtPosition])
|
}, [message, caretPos, getActiveSlashQueryAtPosition])
|
||||||
|
|
||||||
/**
|
|
||||||
* Filter commands based on query (search across all commands when there's a query)
|
|
||||||
*/
|
|
||||||
const filteredCommands = useMemo(() => {
|
const filteredCommands = useMemo(() => {
|
||||||
if (!currentQuery) return null // Show folder view when no query
|
if (!currentQuery) return null
|
||||||
return ALL_COMMANDS.filter((cmd) => cmd.label.toLowerCase().includes(currentQuery))
|
return ALL_SLASH_COMMANDS.filter(
|
||||||
|
(cmd) =>
|
||||||
|
cmd.id.toLowerCase().includes(currentQuery) ||
|
||||||
|
cmd.label.toLowerCase().includes(currentQuery)
|
||||||
|
)
|
||||||
}, [currentQuery])
|
}, [currentQuery])
|
||||||
|
|
||||||
// Show aggregated view when there's a query
|
|
||||||
const showAggregatedView = currentQuery.length > 0
|
const showAggregatedView = currentQuery.length > 0
|
||||||
|
const isInFolder = currentFolder !== null
|
||||||
|
const isInFolderNavigationMode = !isInFolder && !showAggregatedView
|
||||||
|
|
||||||
// Compute caret viewport position via mirror technique for precise anchoring
|
useEffect(() => {
|
||||||
const textareaEl = mentionMenu.textareaRef.current
|
if (onFolderNavChange) {
|
||||||
if (!textareaEl) return null
|
onFolderNavChange({
|
||||||
|
isInFolder,
|
||||||
const getCaretViewport = (textarea: HTMLTextAreaElement, caretPosition: number, text: string) => {
|
openWebFolder: () => {
|
||||||
const textareaRect = textarea.getBoundingClientRect()
|
openFolder('web', 'Web')
|
||||||
const style = window.getComputedStyle(textarea)
|
setSubmenuActiveIndex(0)
|
||||||
|
},
|
||||||
const mirrorDiv = document.createElement('div')
|
closeFolder: () => {
|
||||||
mirrorDiv.style.position = 'absolute'
|
closeFolder()
|
||||||
mirrorDiv.style.visibility = 'hidden'
|
setSubmenuActiveIndex(0)
|
||||||
mirrorDiv.style.whiteSpace = 'pre-wrap'
|
},
|
||||||
mirrorDiv.style.wordWrap = 'break-word'
|
})
|
||||||
mirrorDiv.style.font = style.font
|
|
||||||
mirrorDiv.style.padding = style.padding
|
|
||||||
mirrorDiv.style.border = style.border
|
|
||||||
mirrorDiv.style.width = style.width
|
|
||||||
mirrorDiv.style.lineHeight = style.lineHeight
|
|
||||||
mirrorDiv.style.boxSizing = style.boxSizing
|
|
||||||
mirrorDiv.style.letterSpacing = style.letterSpacing
|
|
||||||
mirrorDiv.style.textTransform = style.textTransform
|
|
||||||
mirrorDiv.style.textIndent = style.textIndent
|
|
||||||
mirrorDiv.style.textAlign = style.textAlign
|
|
||||||
|
|
||||||
mirrorDiv.textContent = text.substring(0, caretPosition)
|
|
||||||
|
|
||||||
const caretMarker = document.createElement('span')
|
|
||||||
caretMarker.style.display = 'inline-block'
|
|
||||||
caretMarker.style.width = '0px'
|
|
||||||
caretMarker.style.padding = '0'
|
|
||||||
caretMarker.style.border = '0'
|
|
||||||
mirrorDiv.appendChild(caretMarker)
|
|
||||||
|
|
||||||
document.body.appendChild(mirrorDiv)
|
|
||||||
const markerRect = caretMarker.getBoundingClientRect()
|
|
||||||
const mirrorRect = mirrorDiv.getBoundingClientRect()
|
|
||||||
document.body.removeChild(mirrorDiv)
|
|
||||||
|
|
||||||
const leftOffset = markerRect.left - mirrorRect.left - textarea.scrollLeft
|
|
||||||
const topOffset = markerRect.top - mirrorRect.top - textarea.scrollTop
|
|
||||||
|
|
||||||
return {
|
|
||||||
left: textareaRect.left + leftOffset,
|
|
||||||
top: textareaRect.top + topOffset,
|
|
||||||
}
|
}
|
||||||
}
|
}, [onFolderNavChange, isInFolder, openFolder, closeFolder, setSubmenuActiveIndex])
|
||||||
|
|
||||||
const caretPos = getCaretPos()
|
|
||||||
const caretViewport = getCaretViewport(textareaEl, caretPos, message)
|
|
||||||
|
|
||||||
// Decide preferred side based on available space
|
|
||||||
const margin = 8
|
|
||||||
const spaceAbove = caretViewport.top - margin
|
|
||||||
const spaceBelow = window.innerHeight - caretViewport.top - margin
|
|
||||||
const side: 'top' | 'bottom' = spaceBelow >= spaceAbove ? 'bottom' : 'top'
|
|
||||||
|
|
||||||
// Check if we're in folder navigation mode (no query, not in submenu)
|
|
||||||
const isInFolderNavigationMode = !openSubmenuFor && !showAggregatedView
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Popover
|
<PopoverScrollArea ref={menuListRef} className='space-y-[2px]'>
|
||||||
open={true}
|
{isInFolder ? (
|
||||||
onOpenChange={() => {
|
<>
|
||||||
/* controlled externally */
|
{WEB_COMMANDS.map((cmd, index) => (
|
||||||
}}
|
<PopoverItem
|
||||||
>
|
key={cmd.id}
|
||||||
|
onClick={() => onSelectCommand(cmd.id)}
|
||||||
|
data-idx={index}
|
||||||
|
active={index === submenuActiveIndex}
|
||||||
|
>
|
||||||
|
<span className='truncate'>{cmd.label}</span>
|
||||||
|
</PopoverItem>
|
||||||
|
))}
|
||||||
|
</>
|
||||||
|
) : showAggregatedView ? (
|
||||||
|
<>
|
||||||
|
{filteredCommands && filteredCommands.length === 0 ? (
|
||||||
|
<div className={MENU_STATE_TEXT_CLASSES}>No commands found</div>
|
||||||
|
) : (
|
||||||
|
filteredCommands?.map((cmd, index) => (
|
||||||
|
<PopoverItem
|
||||||
|
key={cmd.id}
|
||||||
|
onClick={() => onSelectCommand(cmd.id)}
|
||||||
|
data-idx={index}
|
||||||
|
active={index === submenuActiveIndex}
|
||||||
|
>
|
||||||
|
<span className='truncate'>{cmd.label}</span>
|
||||||
|
</PopoverItem>
|
||||||
|
))
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
{TOP_LEVEL_COMMANDS.map((cmd, index) => (
|
||||||
|
<PopoverItem
|
||||||
|
key={cmd.id}
|
||||||
|
onClick={() => onSelectCommand(cmd.id)}
|
||||||
|
data-idx={index}
|
||||||
|
active={isInFolderNavigationMode && index === mentionActiveIndex}
|
||||||
|
>
|
||||||
|
<span className='truncate'>{cmd.label}</span>
|
||||||
|
</PopoverItem>
|
||||||
|
))}
|
||||||
|
|
||||||
|
<PopoverFolder
|
||||||
|
id='web'
|
||||||
|
title='Web'
|
||||||
|
onOpen={() => setSubmenuActiveIndex(0)}
|
||||||
|
active={isInFolderNavigationMode && mentionActiveIndex === TOP_LEVEL_COMMANDS.length}
|
||||||
|
data-idx={TOP_LEVEL_COMMANDS.length}
|
||||||
|
>
|
||||||
|
{WEB_COMMANDS.map((cmd) => (
|
||||||
|
<PopoverItem key={cmd.id} onClick={() => onSelectCommand(cmd.id)}>
|
||||||
|
<span className='truncate'>{cmd.label}</span>
|
||||||
|
</PopoverItem>
|
||||||
|
))}
|
||||||
|
</PopoverFolder>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</PopoverScrollArea>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function SlashMenu({
|
||||||
|
mentionMenu,
|
||||||
|
message,
|
||||||
|
onSelectCommand,
|
||||||
|
onFolderNavChange,
|
||||||
|
}: SlashMenuProps) {
|
||||||
|
const { mentionMenuRef, textareaRef, getCaretPos } = mentionMenu
|
||||||
|
|
||||||
|
const caretPos = getCaretPos()
|
||||||
|
|
||||||
|
const { caretViewport, side } = useCaretViewport({
|
||||||
|
textareaRef,
|
||||||
|
message,
|
||||||
|
caretPos,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!caretViewport) return null
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Popover open={true} onOpenChange={() => {}}>
|
||||||
<PopoverAnchor asChild>
|
<PopoverAnchor asChild>
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
@@ -169,80 +189,18 @@ export function SlashMenu({ mentionMenu, message, onSelectCommand }: SlashMenuPr
|
|||||||
collisionPadding={6}
|
collisionPadding={6}
|
||||||
maxHeight={360}
|
maxHeight={360}
|
||||||
className='pointer-events-auto'
|
className='pointer-events-auto'
|
||||||
style={{
|
style={{ width: '180px' }}
|
||||||
width: `180px`,
|
|
||||||
}}
|
|
||||||
onOpenAutoFocus={(e) => e.preventDefault()}
|
onOpenAutoFocus={(e) => e.preventDefault()}
|
||||||
onCloseAutoFocus={(e) => e.preventDefault()}
|
onCloseAutoFocus={(e) => e.preventDefault()}
|
||||||
|
onMouseDown={(e) => e.preventDefault()}
|
||||||
>
|
>
|
||||||
<PopoverBackButton />
|
<PopoverBackButton />
|
||||||
<PopoverScrollArea ref={menuListRef} className='space-y-[2px]'>
|
<SlashMenuContent
|
||||||
{openSubmenuFor === 'Web' ? (
|
mentionMenu={mentionMenu}
|
||||||
// Web submenu view
|
message={message}
|
||||||
<>
|
onSelectCommand={onSelectCommand}
|
||||||
{WEB_COMMANDS.map((cmd, index) => (
|
onFolderNavChange={onFolderNavChange}
|
||||||
<PopoverItem
|
/>
|
||||||
key={cmd.id}
|
|
||||||
onClick={() => onSelectCommand(cmd.label)}
|
|
||||||
data-idx={index}
|
|
||||||
active={index === submenuActiveIndex}
|
|
||||||
>
|
|
||||||
<span className='truncate capitalize'>{cmd.label}</span>
|
|
||||||
</PopoverItem>
|
|
||||||
))}
|
|
||||||
</>
|
|
||||||
) : showAggregatedView ? (
|
|
||||||
// Aggregated filtered view
|
|
||||||
<>
|
|
||||||
{filteredCommands && filteredCommands.length === 0 ? (
|
|
||||||
<div className='px-[8px] py-[8px] text-[12px] text-[var(--text-muted)]'>
|
|
||||||
No commands found
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
filteredCommands?.map((cmd, index) => (
|
|
||||||
<PopoverItem
|
|
||||||
key={cmd.id}
|
|
||||||
onClick={() => onSelectCommand(cmd.label)}
|
|
||||||
data-idx={index}
|
|
||||||
active={index === submenuActiveIndex}
|
|
||||||
>
|
|
||||||
<span className='truncate capitalize'>{cmd.label}</span>
|
|
||||||
</PopoverItem>
|
|
||||||
))
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
// Folder navigation view
|
|
||||||
<>
|
|
||||||
{TOP_LEVEL_COMMANDS.map((cmd, index) => (
|
|
||||||
<PopoverItem
|
|
||||||
key={cmd.id}
|
|
||||||
onClick={() => onSelectCommand(cmd.label)}
|
|
||||||
data-idx={index}
|
|
||||||
active={isInFolderNavigationMode && index === mentionActiveIndex}
|
|
||||||
>
|
|
||||||
<span className='truncate capitalize'>{cmd.label}</span>
|
|
||||||
</PopoverItem>
|
|
||||||
))}
|
|
||||||
|
|
||||||
<PopoverFolder
|
|
||||||
id='web'
|
|
||||||
title='Web'
|
|
||||||
onOpen={() => setOpenSubmenuFor('Web')}
|
|
||||||
active={
|
|
||||||
isInFolderNavigationMode && mentionActiveIndex === TOP_LEVEL_COMMANDS.length
|
|
||||||
}
|
|
||||||
data-idx={TOP_LEVEL_COMMANDS.length}
|
|
||||||
>
|
|
||||||
{WEB_COMMANDS.map((cmd) => (
|
|
||||||
<PopoverItem key={cmd.id} onClick={() => onSelectCommand(cmd.label)}>
|
|
||||||
<span className='truncate capitalize'>{cmd.label}</span>
|
|
||||||
</PopoverItem>
|
|
||||||
))}
|
|
||||||
</PopoverFolder>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</PopoverScrollArea>
|
|
||||||
</PopoverContent>
|
</PopoverContent>
|
||||||
</Popover>
|
</Popover>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,42 +1,245 @@
|
|||||||
/**
|
import type { ChatContext } from '@/stores/panel'
|
||||||
* Constants for user input component
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mention menu options in order (matches visual render order)
|
* Mention folder types
|
||||||
*/
|
*/
|
||||||
export const MENTION_OPTIONS = [
|
export type MentionFolderId =
|
||||||
'Chats',
|
| 'chats'
|
||||||
'Workflows',
|
| 'workflows'
|
||||||
'Knowledge',
|
| 'knowledge'
|
||||||
'Blocks',
|
| 'blocks'
|
||||||
'Workflow Blocks',
|
| 'workflow-blocks'
|
||||||
'Templates',
|
| 'templates'
|
||||||
'Logs',
|
| 'logs'
|
||||||
'Docs',
|
|
||||||
|
/**
|
||||||
|
* Menu item category types for mention menu (includes folders + docs item)
|
||||||
|
*/
|
||||||
|
export type MentionCategory = MentionFolderId | 'docs'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration interface for folder types
|
||||||
|
*/
|
||||||
|
export interface FolderConfig<TItem = any> {
|
||||||
|
/** Display title in menu */
|
||||||
|
title: string
|
||||||
|
/** Data source key in useMentionData return */
|
||||||
|
dataKey: string
|
||||||
|
/** Loading state key in useMentionData return */
|
||||||
|
loadingKey: string
|
||||||
|
/** Ensure loaded function key in useMentionData return (optional - some folders auto-load) */
|
||||||
|
ensureLoadedKey?: string
|
||||||
|
/** Extract label from an item */
|
||||||
|
getLabel: (item: TItem) => string
|
||||||
|
/** Extract unique ID from an item */
|
||||||
|
getId: (item: TItem) => string
|
||||||
|
/** Empty state message */
|
||||||
|
emptyMessage: string
|
||||||
|
/** No match message (when filtering) */
|
||||||
|
noMatchMessage: string
|
||||||
|
/** Filter function for matching query */
|
||||||
|
filterFn: (item: TItem, query: string) => boolean
|
||||||
|
/** Build the ChatContext object from an item */
|
||||||
|
buildContext: (item: TItem, workflowId?: string | null) => ChatContext
|
||||||
|
/** Whether to use insertAtCursor fallback when replaceActiveMentionWith fails */
|
||||||
|
useInsertFallback?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration for all folder types in the mention menu
|
||||||
|
*/
|
||||||
|
export const FOLDER_CONFIGS: Record<MentionFolderId, FolderConfig> = {
|
||||||
|
chats: {
|
||||||
|
title: 'Chats',
|
||||||
|
dataKey: 'pastChats',
|
||||||
|
loadingKey: 'isLoadingPastChats',
|
||||||
|
ensureLoadedKey: 'ensurePastChatsLoaded',
|
||||||
|
getLabel: (item) => item.title || 'New Chat',
|
||||||
|
getId: (item) => item.id,
|
||||||
|
emptyMessage: 'No past chats',
|
||||||
|
noMatchMessage: 'No matching chats',
|
||||||
|
filterFn: (item, q) => (item.title || 'New Chat').toLowerCase().includes(q),
|
||||||
|
buildContext: (item) => ({
|
||||||
|
kind: 'past_chat',
|
||||||
|
chatId: item.id,
|
||||||
|
label: item.title || 'New Chat',
|
||||||
|
}),
|
||||||
|
useInsertFallback: false,
|
||||||
|
},
|
||||||
|
workflows: {
|
||||||
|
title: 'All workflows',
|
||||||
|
dataKey: 'workflows',
|
||||||
|
loadingKey: 'isLoadingWorkflows',
|
||||||
|
// No ensureLoadedKey - workflows auto-load from registry store
|
||||||
|
getLabel: (item) => item.name || 'Untitled Workflow',
|
||||||
|
getId: (item) => item.id,
|
||||||
|
emptyMessage: 'No workflows',
|
||||||
|
noMatchMessage: 'No matching workflows',
|
||||||
|
filterFn: (item, q) => (item.name || 'Untitled Workflow').toLowerCase().includes(q),
|
||||||
|
buildContext: (item) => ({
|
||||||
|
kind: 'workflow',
|
||||||
|
workflowId: item.id,
|
||||||
|
label: item.name || 'Untitled Workflow',
|
||||||
|
}),
|
||||||
|
useInsertFallback: true,
|
||||||
|
},
|
||||||
|
knowledge: {
|
||||||
|
title: 'Knowledge Bases',
|
||||||
|
dataKey: 'knowledgeBases',
|
||||||
|
loadingKey: 'isLoadingKnowledge',
|
||||||
|
ensureLoadedKey: 'ensureKnowledgeLoaded',
|
||||||
|
getLabel: (item) => item.name || 'Untitled',
|
||||||
|
getId: (item) => item.id,
|
||||||
|
emptyMessage: 'No knowledge bases',
|
||||||
|
noMatchMessage: 'No matching knowledge bases',
|
||||||
|
filterFn: (item, q) => (item.name || 'Untitled').toLowerCase().includes(q),
|
||||||
|
buildContext: (item) => ({
|
||||||
|
kind: 'knowledge',
|
||||||
|
knowledgeId: item.id,
|
||||||
|
label: item.name || 'Untitled',
|
||||||
|
}),
|
||||||
|
useInsertFallback: false,
|
||||||
|
},
|
||||||
|
blocks: {
|
||||||
|
title: 'Blocks',
|
||||||
|
dataKey: 'blocksList',
|
||||||
|
loadingKey: 'isLoadingBlocks',
|
||||||
|
ensureLoadedKey: 'ensureBlocksLoaded',
|
||||||
|
getLabel: (item) => item.name || item.id,
|
||||||
|
getId: (item) => item.id,
|
||||||
|
emptyMessage: 'No blocks found',
|
||||||
|
noMatchMessage: 'No matching blocks',
|
||||||
|
filterFn: (item, q) => (item.name || item.id).toLowerCase().includes(q),
|
||||||
|
buildContext: (item) => ({
|
||||||
|
kind: 'blocks',
|
||||||
|
blockIds: [item.id],
|
||||||
|
label: item.name || item.id,
|
||||||
|
}),
|
||||||
|
useInsertFallback: false,
|
||||||
|
},
|
||||||
|
'workflow-blocks': {
|
||||||
|
title: 'Workflow Blocks',
|
||||||
|
dataKey: 'workflowBlocks',
|
||||||
|
loadingKey: 'isLoadingWorkflowBlocks',
|
||||||
|
// No ensureLoadedKey - workflow blocks auto-sync from store
|
||||||
|
getLabel: (item) => item.name || item.id,
|
||||||
|
getId: (item) => item.id,
|
||||||
|
emptyMessage: 'No blocks in this workflow',
|
||||||
|
noMatchMessage: 'No matching blocks',
|
||||||
|
filterFn: (item, q) => (item.name || item.id).toLowerCase().includes(q),
|
||||||
|
buildContext: (item, workflowId) => ({
|
||||||
|
kind: 'workflow_block',
|
||||||
|
workflowId: workflowId || '',
|
||||||
|
blockId: item.id,
|
||||||
|
label: item.name || item.id,
|
||||||
|
}),
|
||||||
|
useInsertFallback: true,
|
||||||
|
},
|
||||||
|
templates: {
|
||||||
|
title: 'Templates',
|
||||||
|
dataKey: 'templatesList',
|
||||||
|
loadingKey: 'isLoadingTemplates',
|
||||||
|
ensureLoadedKey: 'ensureTemplatesLoaded',
|
||||||
|
getLabel: (item) => item.name || 'Untitled Template',
|
||||||
|
getId: (item) => item.id,
|
||||||
|
emptyMessage: 'No templates found',
|
||||||
|
noMatchMessage: 'No matching templates',
|
||||||
|
filterFn: (item, q) => (item.name || 'Untitled Template').toLowerCase().includes(q),
|
||||||
|
buildContext: (item) => ({
|
||||||
|
kind: 'templates',
|
||||||
|
templateId: item.id,
|
||||||
|
label: item.name || 'Untitled Template',
|
||||||
|
}),
|
||||||
|
useInsertFallback: false,
|
||||||
|
},
|
||||||
|
logs: {
|
||||||
|
title: 'Logs',
|
||||||
|
dataKey: 'logsList',
|
||||||
|
loadingKey: 'isLoadingLogs',
|
||||||
|
ensureLoadedKey: 'ensureLogsLoaded',
|
||||||
|
getLabel: (item) => item.workflowName,
|
||||||
|
getId: (item) => item.id,
|
||||||
|
emptyMessage: 'No executions found',
|
||||||
|
noMatchMessage: 'No matching executions',
|
||||||
|
filterFn: (item, q) =>
|
||||||
|
[item.workflowName, item.trigger || ''].join(' ').toLowerCase().includes(q),
|
||||||
|
buildContext: (item) => ({
|
||||||
|
kind: 'logs',
|
||||||
|
executionId: item.executionId || item.id,
|
||||||
|
label: item.workflowName,
|
||||||
|
}),
|
||||||
|
useInsertFallback: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Order of folders in the mention menu
|
||||||
|
*/
|
||||||
|
export const FOLDER_ORDER: MentionFolderId[] = [
|
||||||
|
'chats',
|
||||||
|
'workflows',
|
||||||
|
'knowledge',
|
||||||
|
'blocks',
|
||||||
|
'workflow-blocks',
|
||||||
|
'templates',
|
||||||
|
'logs',
|
||||||
|
]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Docs item configuration (special case - not a folder)
|
||||||
|
*/
|
||||||
|
export const DOCS_CONFIG = {
|
||||||
|
getLabel: () => 'Docs',
|
||||||
|
buildContext: (): ChatContext => ({ kind: 'docs', label: 'Docs' }),
|
||||||
|
} as const
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Total number of items in root menu (folders + docs)
|
||||||
|
*/
|
||||||
|
export const ROOT_MENU_ITEM_COUNT = FOLDER_ORDER.length + 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Slash command configuration
|
||||||
|
*/
|
||||||
|
export interface SlashCommand {
|
||||||
|
id: string
|
||||||
|
label: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export const TOP_LEVEL_COMMANDS: readonly SlashCommand[] = [
|
||||||
|
{ id: 'fast', label: 'Fast' },
|
||||||
|
{ id: 'research', label: 'Research' },
|
||||||
|
{ id: 'superagent', label: 'Actions' },
|
||||||
] as const
|
] as const
|
||||||
|
|
||||||
|
export const WEB_COMMANDS: readonly SlashCommand[] = [
|
||||||
|
{ id: 'search', label: 'Search' },
|
||||||
|
{ id: 'read', label: 'Read' },
|
||||||
|
{ id: 'scrape', label: 'Scrape' },
|
||||||
|
{ id: 'crawl', label: 'Crawl' },
|
||||||
|
] as const
|
||||||
|
|
||||||
|
export const ALL_SLASH_COMMANDS: readonly SlashCommand[] = [...TOP_LEVEL_COMMANDS, ...WEB_COMMANDS]
|
||||||
|
|
||||||
|
export const ALL_COMMAND_IDS = ALL_SLASH_COMMANDS.map((cmd) => cmd.id)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get display label for a command ID
|
||||||
|
*/
|
||||||
|
export function getCommandDisplayLabel(commandId: string): string {
|
||||||
|
const command = ALL_SLASH_COMMANDS.find((cmd) => cmd.id === commandId)
|
||||||
|
return command?.label || commandId.charAt(0).toUpperCase() + commandId.slice(1)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Model configuration options
|
* Model configuration options
|
||||||
*/
|
*/
|
||||||
export const MODEL_OPTIONS = [
|
export const MODEL_OPTIONS = [
|
||||||
{ value: 'claude-4.5-opus', label: 'Claude 4.5 Opus' },
|
{ value: 'claude-4.5-opus', label: 'Claude 4.5 Opus' },
|
||||||
{ value: 'claude-4.5-sonnet', label: 'Claude 4.5 Sonnet' },
|
{ value: 'claude-4.5-sonnet', label: 'Claude 4.5 Sonnet' },
|
||||||
// { value: 'claude-4-sonnet', label: 'Claude 4 Sonnet' },
|
|
||||||
{ value: 'claude-4.5-haiku', label: 'Claude 4.5 Haiku' },
|
{ value: 'claude-4.5-haiku', label: 'Claude 4.5 Haiku' },
|
||||||
// { value: 'claude-4.1-opus', label: 'Claude 4.1 Opus' },
|
|
||||||
{ value: 'gpt-5.1-codex', label: 'GPT 5.1 Codex' },
|
{ value: 'gpt-5.1-codex', label: 'GPT 5.1 Codex' },
|
||||||
// { value: 'gpt-5-codex', label: 'GPT 5 Codex' },
|
|
||||||
{ value: 'gpt-5.1-medium', label: 'GPT 5.1 Medium' },
|
{ value: 'gpt-5.1-medium', label: 'GPT 5.1 Medium' },
|
||||||
// { value: 'gpt-5-fast', label: 'GPT 5 Fast' },
|
|
||||||
// { value: 'gpt-5', label: 'GPT 5' },
|
|
||||||
// { value: 'gpt-5.1-fast', label: 'GPT 5.1 Fast' },
|
|
||||||
// { value: 'gpt-5.1', label: 'GPT 5.1' },
|
|
||||||
// { value: 'gpt-5.1-high', label: 'GPT 5.1 High' },
|
|
||||||
// { value: 'gpt-5-high', label: 'GPT 5 High' },
|
|
||||||
// { value: 'gpt-4o', label: 'GPT 4o' },
|
|
||||||
// { value: 'gpt-4.1', label: 'GPT 4.1' },
|
|
||||||
// { value: 'o3', label: 'o3' },
|
|
||||||
{ value: 'gemini-3-pro', label: 'Gemini 3 Pro' },
|
{ value: 'gemini-3-pro', label: 'Gemini 3 Pro' },
|
||||||
] as const
|
] as const
|
||||||
|
|
||||||
@@ -49,3 +252,18 @@ export const NEAR_TOP_THRESHOLD = 300
|
|||||||
* Scroll tolerance for mention menu positioning (in pixels)
|
* Scroll tolerance for mention menu positioning (in pixels)
|
||||||
*/
|
*/
|
||||||
export const SCROLL_TOLERANCE = 8
|
export const SCROLL_TOLERANCE = 8
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shared CSS classes for menu state text (loading, empty states)
|
||||||
|
*/
|
||||||
|
export const MENU_STATE_TEXT_CLASSES = 'px-[8px] py-[8px] text-[12px] text-[var(--text-muted)]'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the next index for circular navigation (wraps around at bounds)
|
||||||
|
*/
|
||||||
|
export function getNextIndex(current: number, direction: 'up' | 'down', maxIndex: number): number {
|
||||||
|
if (direction === 'down') {
|
||||||
|
return current >= maxIndex ? 0 : current + 1
|
||||||
|
}
|
||||||
|
return current <= 0 ? maxIndex : current - 1
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
export { useCaretViewport } from './use-caret-viewport'
|
||||||
export { useContextManagement } from './use-context-management'
|
export { useContextManagement } from './use-context-management'
|
||||||
export { useFileAttachments } from './use-file-attachments'
|
export { useFileAttachments } from './use-file-attachments'
|
||||||
export { useMentionData } from './use-mention-data'
|
export { useMentionData } from './use-mention-data'
|
||||||
|
|||||||
@@ -0,0 +1,77 @@
|
|||||||
|
import { useMemo } from 'react'
|
||||||
|
|
||||||
|
interface CaretViewportPosition {
|
||||||
|
left: number
|
||||||
|
top: number
|
||||||
|
}
|
||||||
|
|
||||||
|
interface UseCaretViewportResult {
|
||||||
|
caretViewport: CaretViewportPosition | null
|
||||||
|
side: 'top' | 'bottom'
|
||||||
|
}
|
||||||
|
|
||||||
|
interface UseCaretViewportProps {
|
||||||
|
textareaRef: React.RefObject<HTMLTextAreaElement | null>
|
||||||
|
message: string
|
||||||
|
caretPos: number
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the viewport position of the caret in a textarea using the mirror div technique.
|
||||||
|
* This hook memoizes the calculation to prevent unnecessary DOM manipulation on every render.
|
||||||
|
*/
|
||||||
|
export function useCaretViewport({
|
||||||
|
textareaRef,
|
||||||
|
message,
|
||||||
|
caretPos,
|
||||||
|
}: UseCaretViewportProps): UseCaretViewportResult {
|
||||||
|
return useMemo(() => {
|
||||||
|
const textareaEl = textareaRef.current
|
||||||
|
if (!textareaEl) {
|
||||||
|
return { caretViewport: null, side: 'bottom' as const }
|
||||||
|
}
|
||||||
|
|
||||||
|
const textareaRect = textareaEl.getBoundingClientRect()
|
||||||
|
const style = window.getComputedStyle(textareaEl)
|
||||||
|
|
||||||
|
const mirrorDiv = document.createElement('div')
|
||||||
|
mirrorDiv.style.position = 'absolute'
|
||||||
|
mirrorDiv.style.visibility = 'hidden'
|
||||||
|
mirrorDiv.style.whiteSpace = 'pre-wrap'
|
||||||
|
mirrorDiv.style.overflowWrap = 'break-word'
|
||||||
|
mirrorDiv.style.font = style.font
|
||||||
|
mirrorDiv.style.padding = style.padding
|
||||||
|
mirrorDiv.style.border = style.border
|
||||||
|
mirrorDiv.style.width = style.width
|
||||||
|
mirrorDiv.style.lineHeight = style.lineHeight
|
||||||
|
mirrorDiv.style.boxSizing = style.boxSizing
|
||||||
|
mirrorDiv.style.letterSpacing = style.letterSpacing
|
||||||
|
mirrorDiv.style.textTransform = style.textTransform
|
||||||
|
mirrorDiv.style.textIndent = style.textIndent
|
||||||
|
mirrorDiv.style.textAlign = style.textAlign
|
||||||
|
mirrorDiv.textContent = message.substring(0, caretPos)
|
||||||
|
|
||||||
|
const caretMarker = document.createElement('span')
|
||||||
|
caretMarker.style.display = 'inline-block'
|
||||||
|
caretMarker.style.width = '0px'
|
||||||
|
caretMarker.style.padding = '0'
|
||||||
|
caretMarker.style.border = '0'
|
||||||
|
mirrorDiv.appendChild(caretMarker)
|
||||||
|
|
||||||
|
document.body.appendChild(mirrorDiv)
|
||||||
|
const markerRect = caretMarker.getBoundingClientRect()
|
||||||
|
const mirrorRect = mirrorDiv.getBoundingClientRect()
|
||||||
|
document.body.removeChild(mirrorDiv)
|
||||||
|
|
||||||
|
const caretViewport = {
|
||||||
|
left: textareaRect.left + (markerRect.left - mirrorRect.left) - textareaEl.scrollLeft,
|
||||||
|
top: textareaRect.top + (markerRect.top - mirrorRect.top) - textareaEl.scrollTop,
|
||||||
|
}
|
||||||
|
|
||||||
|
const margin = 8
|
||||||
|
const spaceBelow = window.innerHeight - caretViewport.top - margin
|
||||||
|
const side: 'top' | 'bottom' = spaceBelow >= caretViewport.top - margin ? 'bottom' : 'top'
|
||||||
|
|
||||||
|
return { caretViewport, side }
|
||||||
|
}, [textareaRef, message, caretPos])
|
||||||
|
}
|
||||||
@@ -1,4 +1,8 @@
|
|||||||
import { useCallback, useEffect, useRef, useState } from 'react'
|
import { useCallback, useEffect, useRef, useState } from 'react'
|
||||||
|
import {
|
||||||
|
filterOutContext,
|
||||||
|
isContextAlreadySelected,
|
||||||
|
} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/utils'
|
||||||
import type { ChatContext } from '@/stores/panel'
|
import type { ChatContext } from '@/stores/panel'
|
||||||
|
|
||||||
interface UseContextManagementProps {
|
interface UseContextManagementProps {
|
||||||
@@ -35,53 +39,7 @@ export function useContextManagement({ message, initialContexts }: UseContextMan
|
|||||||
*/
|
*/
|
||||||
const addContext = useCallback((context: ChatContext) => {
|
const addContext = useCallback((context: ChatContext) => {
|
||||||
setSelectedContexts((prev) => {
|
setSelectedContexts((prev) => {
|
||||||
// CRITICAL: Check label collision FIRST
|
if (isContextAlreadySelected(context, prev)) return prev
|
||||||
// The token system uses @label format, so we cannot have duplicate labels
|
|
||||||
// regardless of kind or ID differences
|
|
||||||
const exists = prev.some((c) => {
|
|
||||||
// Primary check: label collision
|
|
||||||
// This prevents duplicate @Label tokens which would break the overlay
|
|
||||||
if (c.label && context.label && c.label === context.label) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Secondary check: exact duplicate by ID fields based on kind
|
|
||||||
// This prevents the same entity from being added twice even with different labels
|
|
||||||
if (c.kind === context.kind) {
|
|
||||||
if (c.kind === 'past_chat' && 'chatId' in context && 'chatId' in c) {
|
|
||||||
return c.chatId === (context as any).chatId
|
|
||||||
}
|
|
||||||
if (c.kind === 'workflow' && 'workflowId' in context && 'workflowId' in c) {
|
|
||||||
return c.workflowId === (context as any).workflowId
|
|
||||||
}
|
|
||||||
if (c.kind === 'blocks' && 'blockId' in context && 'blockId' in c) {
|
|
||||||
return c.blockId === (context as any).blockId
|
|
||||||
}
|
|
||||||
if (c.kind === 'workflow_block' && 'blockId' in context && 'blockId' in c) {
|
|
||||||
return (
|
|
||||||
c.workflowId === (context as any).workflowId && c.blockId === (context as any).blockId
|
|
||||||
)
|
|
||||||
}
|
|
||||||
if (c.kind === 'knowledge' && 'knowledgeId' in context && 'knowledgeId' in c) {
|
|
||||||
return c.knowledgeId === (context as any).knowledgeId
|
|
||||||
}
|
|
||||||
if (c.kind === 'templates' && 'templateId' in context && 'templateId' in c) {
|
|
||||||
return c.templateId === (context as any).templateId
|
|
||||||
}
|
|
||||||
if (c.kind === 'logs' && 'executionId' in context && 'executionId' in c) {
|
|
||||||
return c.executionId === (context as any).executionId
|
|
||||||
}
|
|
||||||
if (c.kind === 'docs') {
|
|
||||||
return true // Only one docs context allowed
|
|
||||||
}
|
|
||||||
if (c.kind === 'slash_command' && 'command' in context && 'command' in c) {
|
|
||||||
return c.command === (context as any).command
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
if (exists) return prev
|
|
||||||
return [...prev, context]
|
return [...prev, context]
|
||||||
})
|
})
|
||||||
}, [])
|
}, [])
|
||||||
@@ -92,38 +50,7 @@ export function useContextManagement({ message, initialContexts }: UseContextMan
|
|||||||
* @param contextToRemove - Context to remove
|
* @param contextToRemove - Context to remove
|
||||||
*/
|
*/
|
||||||
const removeContext = useCallback((contextToRemove: ChatContext) => {
|
const removeContext = useCallback((contextToRemove: ChatContext) => {
|
||||||
setSelectedContexts((prev) =>
|
setSelectedContexts((prev) => filterOutContext(prev, contextToRemove))
|
||||||
prev.filter((c) => {
|
|
||||||
// Match by kind and specific ID fields
|
|
||||||
if (c.kind !== contextToRemove.kind) return true
|
|
||||||
|
|
||||||
switch (c.kind) {
|
|
||||||
case 'past_chat':
|
|
||||||
return (c as any).chatId !== (contextToRemove as any).chatId
|
|
||||||
case 'workflow':
|
|
||||||
return (c as any).workflowId !== (contextToRemove as any).workflowId
|
|
||||||
case 'blocks':
|
|
||||||
return (c as any).blockId !== (contextToRemove as any).blockId
|
|
||||||
case 'workflow_block':
|
|
||||||
return (
|
|
||||||
(c as any).workflowId !== (contextToRemove as any).workflowId ||
|
|
||||||
(c as any).blockId !== (contextToRemove as any).blockId
|
|
||||||
)
|
|
||||||
case 'knowledge':
|
|
||||||
return (c as any).knowledgeId !== (contextToRemove as any).knowledgeId
|
|
||||||
case 'templates':
|
|
||||||
return (c as any).templateId !== (contextToRemove as any).templateId
|
|
||||||
case 'logs':
|
|
||||||
return (c as any).executionId !== (contextToRemove as any).executionId
|
|
||||||
case 'docs':
|
|
||||||
return false // Remove docs (only one docs context)
|
|
||||||
case 'slash_command':
|
|
||||||
return (c as any).command !== (contextToRemove as any).command
|
|
||||||
default:
|
|
||||||
return c.label !== contextToRemove.label
|
|
||||||
}
|
|
||||||
})
|
|
||||||
)
|
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -83,6 +83,36 @@ interface UseMentionDataProps {
|
|||||||
workspaceId: string
|
workspaceId: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return type for useMentionData hook
|
||||||
|
*/
|
||||||
|
export interface MentionDataReturn {
|
||||||
|
// Data arrays
|
||||||
|
pastChats: PastChat[]
|
||||||
|
workflows: WorkflowItem[]
|
||||||
|
knowledgeBases: KnowledgeItem[]
|
||||||
|
blocksList: BlockItem[]
|
||||||
|
workflowBlocks: WorkflowBlockItem[]
|
||||||
|
templatesList: TemplateItem[]
|
||||||
|
logsList: LogItem[]
|
||||||
|
|
||||||
|
// Loading states
|
||||||
|
isLoadingPastChats: boolean
|
||||||
|
isLoadingWorkflows: boolean
|
||||||
|
isLoadingKnowledge: boolean
|
||||||
|
isLoadingBlocks: boolean
|
||||||
|
isLoadingWorkflowBlocks: boolean
|
||||||
|
isLoadingTemplates: boolean
|
||||||
|
isLoadingLogs: boolean
|
||||||
|
|
||||||
|
// Ensure loaded functions
|
||||||
|
ensurePastChatsLoaded: () => Promise<void>
|
||||||
|
ensureKnowledgeLoaded: () => Promise<void>
|
||||||
|
ensureBlocksLoaded: () => Promise<void>
|
||||||
|
ensureTemplatesLoaded: () => Promise<void>
|
||||||
|
ensureLogsLoaded: () => Promise<void>
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom hook to fetch and manage data for mention suggestions
|
* Custom hook to fetch and manage data for mention suggestions
|
||||||
* Loads data from APIs for chats, workflows, knowledge bases, blocks, templates, and logs
|
* Loads data from APIs for chats, workflows, knowledge bases, blocks, templates, and logs
|
||||||
@@ -90,7 +120,7 @@ interface UseMentionDataProps {
|
|||||||
* @param props - Configuration including workflow and workspace IDs
|
* @param props - Configuration including workflow and workspace IDs
|
||||||
* @returns Mention data state and loading operations
|
* @returns Mention data state and loading operations
|
||||||
*/
|
*/
|
||||||
export function useMentionData(props: UseMentionDataProps) {
|
export function useMentionData(props: UseMentionDataProps): MentionDataReturn {
|
||||||
const { workflowId, workspaceId } = props
|
const { workflowId, workspaceId } = props
|
||||||
|
|
||||||
const { config, isBlockAllowed } = usePermissionConfig()
|
const { config, isBlockAllowed } = usePermissionConfig()
|
||||||
@@ -104,7 +134,6 @@ export function useMentionData(props: UseMentionDataProps) {
|
|||||||
const [blocksList, setBlocksList] = useState<BlockItem[]>([])
|
const [blocksList, setBlocksList] = useState<BlockItem[]>([])
|
||||||
const [isLoadingBlocks, setIsLoadingBlocks] = useState(false)
|
const [isLoadingBlocks, setIsLoadingBlocks] = useState(false)
|
||||||
|
|
||||||
// Reset blocks list when permission config changes
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setBlocksList([])
|
setBlocksList([])
|
||||||
}, [config.allowedIntegrations])
|
}, [config.allowedIntegrations])
|
||||||
@@ -118,12 +147,10 @@ export function useMentionData(props: UseMentionDataProps) {
|
|||||||
const [workflowBlocks, setWorkflowBlocks] = useState<WorkflowBlockItem[]>([])
|
const [workflowBlocks, setWorkflowBlocks] = useState<WorkflowBlockItem[]>([])
|
||||||
const [isLoadingWorkflowBlocks, setIsLoadingWorkflowBlocks] = useState(false)
|
const [isLoadingWorkflowBlocks, setIsLoadingWorkflowBlocks] = useState(false)
|
||||||
|
|
||||||
// Only subscribe to block keys to avoid re-rendering on position updates
|
|
||||||
const blockKeys = useWorkflowStore(
|
const blockKeys = useWorkflowStore(
|
||||||
useShallow(useCallback((state) => Object.keys(state.blocks), []))
|
useShallow(useCallback((state) => Object.keys(state.blocks), []))
|
||||||
)
|
)
|
||||||
|
|
||||||
// Use workflow registry as source of truth for workflows
|
|
||||||
const registryWorkflows = useWorkflowRegistry((state) => state.workflows)
|
const registryWorkflows = useWorkflowRegistry((state) => state.workflows)
|
||||||
const hydrationPhase = useWorkflowRegistry((state) => state.hydration.phase)
|
const hydrationPhase = useWorkflowRegistry((state) => state.hydration.phase)
|
||||||
const isLoadingWorkflows =
|
const isLoadingWorkflows =
|
||||||
@@ -131,7 +158,6 @@ export function useMentionData(props: UseMentionDataProps) {
|
|||||||
hydrationPhase === 'metadata-loading' ||
|
hydrationPhase === 'metadata-loading' ||
|
||||||
hydrationPhase === 'state-loading'
|
hydrationPhase === 'state-loading'
|
||||||
|
|
||||||
// Convert registry workflows to mention format, filtered by workspace and sorted
|
|
||||||
const workflows: WorkflowItem[] = Object.values(registryWorkflows)
|
const workflows: WorkflowItem[] = Object.values(registryWorkflows)
|
||||||
.filter((w) => w.workspaceId === workspaceId)
|
.filter((w) => w.workspaceId === workspaceId)
|
||||||
.sort((a, b) => {
|
.sort((a, b) => {
|
||||||
@@ -219,14 +245,6 @@ export function useMentionData(props: UseMentionDataProps) {
|
|||||||
}
|
}
|
||||||
}, [isLoadingPastChats, pastChats.length, workflowId])
|
}, [isLoadingPastChats, pastChats.length, workflowId])
|
||||||
|
|
||||||
/**
|
|
||||||
* Ensures workflows are loaded (now using registry store)
|
|
||||||
*/
|
|
||||||
const ensureWorkflowsLoaded = useCallback(() => {
|
|
||||||
// Workflows are now automatically loaded from the registry store
|
|
||||||
// No manual fetching needed
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensures knowledge bases are loaded
|
* Ensures knowledge bases are loaded
|
||||||
*/
|
*/
|
||||||
@@ -348,18 +366,6 @@ export function useMentionData(props: UseMentionDataProps) {
|
|||||||
}
|
}
|
||||||
}, [isLoadingLogs, logsList.length, workspaceId])
|
}, [isLoadingLogs, logsList.length, workspaceId])
|
||||||
|
|
||||||
/**
|
|
||||||
* Ensures workflow blocks are loaded (synced from store)
|
|
||||||
*/
|
|
||||||
const ensureWorkflowBlocksLoaded = useCallback(async () => {
|
|
||||||
if (!workflowId) return
|
|
||||||
logger.debug('ensureWorkflowBlocksLoaded called', {
|
|
||||||
workflowId,
|
|
||||||
storeBlocksCount: blockKeys.length,
|
|
||||||
workflowBlocksCount: workflowBlocks.length,
|
|
||||||
})
|
|
||||||
}, [workflowId, blockKeys.length, workflowBlocks.length])
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
// State
|
// State
|
||||||
pastChats,
|
pastChats,
|
||||||
@@ -379,11 +385,9 @@ export function useMentionData(props: UseMentionDataProps) {
|
|||||||
|
|
||||||
// Operations
|
// Operations
|
||||||
ensurePastChatsLoaded,
|
ensurePastChatsLoaded,
|
||||||
ensureWorkflowsLoaded,
|
|
||||||
ensureKnowledgeLoaded,
|
ensureKnowledgeLoaded,
|
||||||
ensureBlocksLoaded,
|
ensureBlocksLoaded,
|
||||||
ensureTemplatesLoaded,
|
ensureTemplatesLoaded,
|
||||||
ensureLogsLoaded,
|
ensureLogsLoaded,
|
||||||
ensureWorkflowBlocksLoaded,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,12 @@
|
|||||||
import { useCallback } from 'react'
|
import { useCallback, useMemo } from 'react'
|
||||||
|
import type { MentionFolderNav } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/components'
|
||||||
|
import {
|
||||||
|
DOCS_CONFIG,
|
||||||
|
FOLDER_CONFIGS,
|
||||||
|
type FolderConfig,
|
||||||
|
} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/constants'
|
||||||
import type { useMentionMenu } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks/use-mention-menu'
|
import type { useMentionMenu } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks/use-mention-menu'
|
||||||
|
import { isContextAlreadySelected } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/utils'
|
||||||
import type { ChatContext } from '@/stores/panel'
|
import type { ChatContext } from '@/stores/panel'
|
||||||
|
|
||||||
interface UseMentionInsertHandlersProps {
|
interface UseMentionInsertHandlersProps {
|
||||||
@@ -11,12 +18,12 @@ interface UseMentionInsertHandlersProps {
|
|||||||
selectedContexts: ChatContext[]
|
selectedContexts: ChatContext[]
|
||||||
/** Callback to update selected contexts */
|
/** Callback to update selected contexts */
|
||||||
onContextAdd: (context: ChatContext) => void
|
onContextAdd: (context: ChatContext) => void
|
||||||
|
/** Folder navigation state exposed from MentionMenu via callback */
|
||||||
|
mentionFolderNav?: MentionFolderNav | null
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom hook to provide insert handlers for different mention types.
|
* Custom hook to provide insert handlers for different mention types.
|
||||||
* Consolidates the logic for inserting mentions and updating selected contexts.
|
|
||||||
* Prevents duplicate mentions from being inserted.
|
|
||||||
*
|
*
|
||||||
* @param props - Configuration object
|
* @param props - Configuration object
|
||||||
* @returns Insert handler functions for each mention type
|
* @returns Insert handler functions for each mention type
|
||||||
@@ -26,6 +33,7 @@ export function useMentionInsertHandlers({
|
|||||||
workflowId,
|
workflowId,
|
||||||
selectedContexts,
|
selectedContexts,
|
||||||
onContextAdd,
|
onContextAdd,
|
||||||
|
mentionFolderNav,
|
||||||
}: UseMentionInsertHandlersProps) {
|
}: UseMentionInsertHandlersProps) {
|
||||||
const {
|
const {
|
||||||
replaceActiveMentionWith,
|
replaceActiveMentionWith,
|
||||||
@@ -36,342 +44,94 @@ export function useMentionInsertHandlers({
|
|||||||
} = mentionMenu
|
} = mentionMenu
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if a context already exists in selected contexts
|
* Closes all menus and resets state
|
||||||
* CRITICAL: Prioritizes label checking to prevent token system breakage
|
|
||||||
*
|
|
||||||
* @param context - Context to check
|
|
||||||
* @returns True if context already exists or label is already used
|
|
||||||
*/
|
*/
|
||||||
const isContextAlreadySelected = useCallback(
|
const closeMenus = useCallback(() => {
|
||||||
(context: ChatContext): boolean => {
|
setShowMentionMenu(false)
|
||||||
return selectedContexts.some((c) => {
|
if (mentionFolderNav?.isInFolder) {
|
||||||
// CRITICAL: Check label collision FIRST
|
mentionFolderNav.closeFolder()
|
||||||
// The token system uses @label format, so we cannot have duplicate labels
|
}
|
||||||
// regardless of kind or ID differences
|
setOpenSubmenuFor(null)
|
||||||
if (c.label && context.label && c.label === context.label) {
|
}, [setShowMentionMenu, setOpenSubmenuFor, mentionFolderNav])
|
||||||
return true
|
|
||||||
|
const createInsertHandler = useCallback(
|
||||||
|
<TItem>(config: FolderConfig<TItem>) => {
|
||||||
|
return (item: TItem) => {
|
||||||
|
const label = config.getLabel(item)
|
||||||
|
const context = config.buildContext(item, workflowId)
|
||||||
|
|
||||||
|
if (isContextAlreadySelected(context, selectedContexts)) {
|
||||||
|
resetActiveMentionQuery()
|
||||||
|
closeMenus()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Secondary check: exact duplicate by ID fields
|
if (config.useInsertFallback) {
|
||||||
if (c.kind === context.kind) {
|
if (!replaceActiveMentionWith(label)) {
|
||||||
if (c.kind === 'past_chat' && 'chatId' in context && 'chatId' in c) {
|
insertAtCursor(` @${label} `)
|
||||||
return c.chatId === (context as any).chatId
|
|
||||||
}
|
|
||||||
if (c.kind === 'workflow' && 'workflowId' in context && 'workflowId' in c) {
|
|
||||||
return c.workflowId === (context as any).workflowId
|
|
||||||
}
|
|
||||||
if (c.kind === 'blocks' && 'blockId' in context && 'blockId' in c) {
|
|
||||||
return c.blockId === (context as any).blockId
|
|
||||||
}
|
|
||||||
if (c.kind === 'workflow_block' && 'blockId' in context && 'blockId' in c) {
|
|
||||||
return (
|
|
||||||
c.workflowId === (context as any).workflowId && c.blockId === (context as any).blockId
|
|
||||||
)
|
|
||||||
}
|
|
||||||
if (c.kind === 'knowledge' && 'knowledgeId' in context && 'knowledgeId' in c) {
|
|
||||||
return c.knowledgeId === (context as any).knowledgeId
|
|
||||||
}
|
|
||||||
if (c.kind === 'templates' && 'templateId' in context && 'templateId' in c) {
|
|
||||||
return c.templateId === (context as any).templateId
|
|
||||||
}
|
|
||||||
if (c.kind === 'logs' && 'executionId' in context && 'executionId' in c) {
|
|
||||||
return c.executionId === (context as any).executionId
|
|
||||||
}
|
|
||||||
if (c.kind === 'docs') {
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
replaceActiveMentionWith(label)
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
onContextAdd(context)
|
||||||
})
|
closeMenus()
|
||||||
},
|
|
||||||
[selectedContexts]
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts a past chat mention
|
|
||||||
*
|
|
||||||
* @param chat - Chat object to mention
|
|
||||||
*/
|
|
||||||
const insertPastChatMention = useCallback(
|
|
||||||
(chat: { id: string; title: string | null }) => {
|
|
||||||
const label = chat.title || 'New Chat'
|
|
||||||
const context = { kind: 'past_chat', chatId: chat.id, label } as ChatContext
|
|
||||||
|
|
||||||
// Prevent duplicate insertion
|
|
||||||
if (isContextAlreadySelected(context)) {
|
|
||||||
// Clear the partial mention text (e.g., "@Unti") before closing
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
replaceActiveMentionWith(label)
|
|
||||||
onContextAdd(context)
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
},
|
},
|
||||||
[
|
[
|
||||||
replaceActiveMentionWith,
|
|
||||||
onContextAdd,
|
|
||||||
setShowMentionMenu,
|
|
||||||
setOpenSubmenuFor,
|
|
||||||
isContextAlreadySelected,
|
|
||||||
resetActiveMentionQuery,
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts a workflow mention
|
|
||||||
*
|
|
||||||
* @param wf - Workflow object to mention
|
|
||||||
*/
|
|
||||||
const insertWorkflowMention = useCallback(
|
|
||||||
(wf: { id: string; name: string }) => {
|
|
||||||
const label = wf.name || 'Untitled Workflow'
|
|
||||||
const context = { kind: 'workflow', workflowId: wf.id, label } as ChatContext
|
|
||||||
|
|
||||||
// Prevent duplicate insertion
|
|
||||||
if (isContextAlreadySelected(context)) {
|
|
||||||
// Clear the partial mention text before closing
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!replaceActiveMentionWith(label)) insertAtCursor(` @${label} `)
|
|
||||||
onContextAdd(context)
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
},
|
|
||||||
[
|
|
||||||
replaceActiveMentionWith,
|
|
||||||
insertAtCursor,
|
|
||||||
onContextAdd,
|
|
||||||
setShowMentionMenu,
|
|
||||||
setOpenSubmenuFor,
|
|
||||||
isContextAlreadySelected,
|
|
||||||
resetActiveMentionQuery,
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts a knowledge base mention
|
|
||||||
*
|
|
||||||
* @param kb - Knowledge base object to mention
|
|
||||||
*/
|
|
||||||
const insertKnowledgeMention = useCallback(
|
|
||||||
(kb: { id: string; name: string }) => {
|
|
||||||
const label = kb.name || 'Untitled'
|
|
||||||
const context = { kind: 'knowledge', knowledgeId: kb.id, label } as any
|
|
||||||
|
|
||||||
// Prevent duplicate insertion
|
|
||||||
if (isContextAlreadySelected(context)) {
|
|
||||||
// Clear the partial mention text before closing
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
replaceActiveMentionWith(label)
|
|
||||||
onContextAdd(context)
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
},
|
|
||||||
[
|
|
||||||
replaceActiveMentionWith,
|
|
||||||
onContextAdd,
|
|
||||||
setShowMentionMenu,
|
|
||||||
setOpenSubmenuFor,
|
|
||||||
isContextAlreadySelected,
|
|
||||||
resetActiveMentionQuery,
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts a block mention
|
|
||||||
*
|
|
||||||
* @param blk - Block object to mention
|
|
||||||
*/
|
|
||||||
const insertBlockMention = useCallback(
|
|
||||||
(blk: { id: string; name: string }) => {
|
|
||||||
const label = blk.name || blk.id
|
|
||||||
const context = { kind: 'blocks', blockId: blk.id, label } as any
|
|
||||||
|
|
||||||
// Prevent duplicate insertion
|
|
||||||
if (isContextAlreadySelected(context)) {
|
|
||||||
// Clear the partial mention text before closing
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
replaceActiveMentionWith(label)
|
|
||||||
onContextAdd(context)
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
},
|
|
||||||
[
|
|
||||||
replaceActiveMentionWith,
|
|
||||||
onContextAdd,
|
|
||||||
setShowMentionMenu,
|
|
||||||
setOpenSubmenuFor,
|
|
||||||
isContextAlreadySelected,
|
|
||||||
resetActiveMentionQuery,
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts a workflow block mention
|
|
||||||
*
|
|
||||||
* @param blk - Workflow block object to mention
|
|
||||||
*/
|
|
||||||
const insertWorkflowBlockMention = useCallback(
|
|
||||||
(blk: { id: string; name: string }) => {
|
|
||||||
const label = blk.name
|
|
||||||
const context = {
|
|
||||||
kind: 'workflow_block',
|
|
||||||
workflowId: workflowId as string,
|
|
||||||
blockId: blk.id,
|
|
||||||
label,
|
|
||||||
} as any
|
|
||||||
|
|
||||||
// Prevent duplicate insertion
|
|
||||||
if (isContextAlreadySelected(context)) {
|
|
||||||
// Clear the partial mention text before closing
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!replaceActiveMentionWith(label)) insertAtCursor(` @${label} `)
|
|
||||||
onContextAdd(context)
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
},
|
|
||||||
[
|
|
||||||
replaceActiveMentionWith,
|
|
||||||
insertAtCursor,
|
|
||||||
workflowId,
|
workflowId,
|
||||||
onContextAdd,
|
selectedContexts,
|
||||||
setShowMentionMenu,
|
|
||||||
setOpenSubmenuFor,
|
|
||||||
isContextAlreadySelected,
|
|
||||||
resetActiveMentionQuery,
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts a template mention
|
|
||||||
*
|
|
||||||
* @param tpl - Template object to mention
|
|
||||||
*/
|
|
||||||
const insertTemplateMention = useCallback(
|
|
||||||
(tpl: { id: string; name: string }) => {
|
|
||||||
const label = tpl.name || 'Untitled Template'
|
|
||||||
const context = { kind: 'templates', templateId: tpl.id, label } as any
|
|
||||||
|
|
||||||
// Prevent duplicate insertion
|
|
||||||
if (isContextAlreadySelected(context)) {
|
|
||||||
// Clear the partial mention text before closing
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
replaceActiveMentionWith(label)
|
|
||||||
onContextAdd(context)
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
},
|
|
||||||
[
|
|
||||||
replaceActiveMentionWith,
|
replaceActiveMentionWith,
|
||||||
|
insertAtCursor,
|
||||||
onContextAdd,
|
onContextAdd,
|
||||||
setShowMentionMenu,
|
|
||||||
setOpenSubmenuFor,
|
|
||||||
isContextAlreadySelected,
|
|
||||||
resetActiveMentionQuery,
|
resetActiveMentionQuery,
|
||||||
|
closeMenus,
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inserts a log mention
|
* Special handler for Docs (no item parameter, uses DOCS_CONFIG)
|
||||||
*
|
|
||||||
* @param log - Log object to mention
|
|
||||||
*/
|
|
||||||
const insertLogMention = useCallback(
|
|
||||||
(log: { id: string; executionId?: string; workflowName: string }) => {
|
|
||||||
const label = log.workflowName
|
|
||||||
const context = { kind: 'logs' as const, executionId: log.executionId, label }
|
|
||||||
|
|
||||||
// Prevent duplicate insertion
|
|
||||||
if (isContextAlreadySelected(context)) {
|
|
||||||
// Clear the partial mention text before closing
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
replaceActiveMentionWith(label)
|
|
||||||
onContextAdd(context)
|
|
||||||
setShowMentionMenu(false)
|
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
},
|
|
||||||
[
|
|
||||||
replaceActiveMentionWith,
|
|
||||||
onContextAdd,
|
|
||||||
setShowMentionMenu,
|
|
||||||
setOpenSubmenuFor,
|
|
||||||
isContextAlreadySelected,
|
|
||||||
resetActiveMentionQuery,
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts a docs mention
|
|
||||||
*/
|
*/
|
||||||
const insertDocsMention = useCallback(() => {
|
const insertDocsMention = useCallback(() => {
|
||||||
const label = 'Docs'
|
const label = DOCS_CONFIG.getLabel()
|
||||||
const context = { kind: 'docs', label } as any
|
const context = DOCS_CONFIG.buildContext()
|
||||||
|
|
||||||
// Prevent duplicate insertion
|
// Prevent duplicate insertion
|
||||||
if (isContextAlreadySelected(context)) {
|
if (isContextAlreadySelected(context, selectedContexts)) {
|
||||||
// Clear the partial mention text before closing
|
|
||||||
resetActiveMentionQuery()
|
resetActiveMentionQuery()
|
||||||
setShowMentionMenu(false)
|
closeMenus()
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!replaceActiveMentionWith(label)) insertAtCursor(` @${label} `)
|
// Docs uses fallback insertion
|
||||||
|
if (!replaceActiveMentionWith(label)) {
|
||||||
|
insertAtCursor(` @${label} `)
|
||||||
|
}
|
||||||
|
|
||||||
onContextAdd(context)
|
onContextAdd(context)
|
||||||
setShowMentionMenu(false)
|
closeMenus()
|
||||||
setOpenSubmenuFor(null)
|
|
||||||
}, [
|
}, [
|
||||||
|
selectedContexts,
|
||||||
replaceActiveMentionWith,
|
replaceActiveMentionWith,
|
||||||
insertAtCursor,
|
insertAtCursor,
|
||||||
onContextAdd,
|
onContextAdd,
|
||||||
setShowMentionMenu,
|
|
||||||
setOpenSubmenuFor,
|
|
||||||
isContextAlreadySelected,
|
|
||||||
resetActiveMentionQuery,
|
resetActiveMentionQuery,
|
||||||
|
closeMenus,
|
||||||
])
|
])
|
||||||
|
|
||||||
return {
|
const handlers = useMemo(
|
||||||
insertPastChatMention,
|
() => ({
|
||||||
insertWorkflowMention,
|
insertPastChatMention: createInsertHandler(FOLDER_CONFIGS.chats),
|
||||||
insertKnowledgeMention,
|
insertWorkflowMention: createInsertHandler(FOLDER_CONFIGS.workflows),
|
||||||
insertBlockMention,
|
insertKnowledgeMention: createInsertHandler(FOLDER_CONFIGS.knowledge),
|
||||||
insertWorkflowBlockMention,
|
insertBlockMention: createInsertHandler(FOLDER_CONFIGS.blocks),
|
||||||
insertTemplateMention,
|
insertWorkflowBlockMention: createInsertHandler(FOLDER_CONFIGS['workflow-blocks']),
|
||||||
insertLogMention,
|
insertTemplateMention: createInsertHandler(FOLDER_CONFIGS.templates),
|
||||||
insertDocsMention,
|
insertLogMention: createInsertHandler(FOLDER_CONFIGS.logs),
|
||||||
}
|
insertDocsMention,
|
||||||
|
}),
|
||||||
|
[createInsertHandler, insertDocsMention]
|
||||||
|
)
|
||||||
|
|
||||||
|
return handlers
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,56 +1,19 @@
|
|||||||
import { type KeyboardEvent, useCallback } from 'react'
|
import { type KeyboardEvent, useCallback, useMemo } from 'react'
|
||||||
import type { useMentionData } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks/use-mention-data'
|
import type { MentionFolderNav } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/components'
|
||||||
import type { useMentionMenu } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks/use-mention-menu'
|
import {
|
||||||
import { MENTION_OPTIONS } from '../constants'
|
FOLDER_CONFIGS,
|
||||||
|
FOLDER_ORDER,
|
||||||
/**
|
type MentionFolderId,
|
||||||
* Chat item for mention insertion
|
ROOT_MENU_ITEM_COUNT,
|
||||||
*/
|
} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/constants'
|
||||||
interface ChatItem {
|
import type {
|
||||||
id: string
|
useMentionData,
|
||||||
title: string | null
|
useMentionMenu,
|
||||||
}
|
} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks'
|
||||||
|
import {
|
||||||
/**
|
getFolderData as getFolderDataUtil,
|
||||||
* Workflow item for mention insertion
|
getFolderEnsureLoaded as getFolderEnsureLoadedUtil,
|
||||||
*/
|
} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/utils'
|
||||||
interface WorkflowItem {
|
|
||||||
id: string
|
|
||||||
name: string
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Knowledge base item for mention insertion
|
|
||||||
*/
|
|
||||||
interface KnowledgeItem {
|
|
||||||
id: string
|
|
||||||
name: string
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Block item for mention insertion
|
|
||||||
*/
|
|
||||||
interface BlockItem {
|
|
||||||
id: string
|
|
||||||
name: string
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Template item for mention insertion
|
|
||||||
*/
|
|
||||||
interface TemplateItem {
|
|
||||||
id: string
|
|
||||||
name: string
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Log item for mention insertion
|
|
||||||
*/
|
|
||||||
interface LogItem {
|
|
||||||
id: string
|
|
||||||
executionId?: string
|
|
||||||
workflowName: string
|
|
||||||
}
|
|
||||||
|
|
||||||
interface UseMentionKeyboardProps {
|
interface UseMentionKeyboardProps {
|
||||||
/** Mention menu hook instance */
|
/** Mention menu hook instance */
|
||||||
@@ -59,37 +22,34 @@ interface UseMentionKeyboardProps {
|
|||||||
mentionData: ReturnType<typeof useMentionData>
|
mentionData: ReturnType<typeof useMentionData>
|
||||||
/** Callback to insert specific mention types */
|
/** Callback to insert specific mention types */
|
||||||
insertHandlers: {
|
insertHandlers: {
|
||||||
insertPastChatMention: (chat: ChatItem) => void
|
insertPastChatMention: (chat: any) => void
|
||||||
insertWorkflowMention: (wf: WorkflowItem) => void
|
insertWorkflowMention: (wf: any) => void
|
||||||
insertKnowledgeMention: (kb: KnowledgeItem) => void
|
insertKnowledgeMention: (kb: any) => void
|
||||||
insertBlockMention: (blk: BlockItem) => void
|
insertBlockMention: (blk: any) => void
|
||||||
insertWorkflowBlockMention: (blk: BlockItem) => void
|
insertWorkflowBlockMention: (blk: any) => void
|
||||||
insertTemplateMention: (tpl: TemplateItem) => void
|
insertTemplateMention: (tpl: any) => void
|
||||||
insertLogMention: (log: LogItem) => void
|
insertLogMention: (log: any) => void
|
||||||
insertDocsMention: () => void
|
insertDocsMention: () => void
|
||||||
}
|
}
|
||||||
|
/** Folder navigation state exposed from MentionMenu via callback */
|
||||||
|
mentionFolderNav: MentionFolderNav | null
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom hook to handle keyboard navigation in the mention menu.
|
* Custom hook to handle keyboard navigation in the mention menu.
|
||||||
* Manages Arrow Up/Down/Left/Right and Enter key navigation through menus and submenus.
|
|
||||||
*
|
|
||||||
* @param props - Configuration object
|
|
||||||
* @returns Keyboard handler for mention menu
|
|
||||||
*/
|
*/
|
||||||
export function useMentionKeyboard({
|
export function useMentionKeyboard({
|
||||||
mentionMenu,
|
mentionMenu,
|
||||||
mentionData,
|
mentionData,
|
||||||
insertHandlers,
|
insertHandlers,
|
||||||
|
mentionFolderNav,
|
||||||
}: UseMentionKeyboardProps) {
|
}: UseMentionKeyboardProps) {
|
||||||
const {
|
const {
|
||||||
showMentionMenu,
|
showMentionMenu,
|
||||||
openSubmenuFor,
|
|
||||||
mentionActiveIndex,
|
mentionActiveIndex,
|
||||||
submenuActiveIndex,
|
submenuActiveIndex,
|
||||||
setMentionActiveIndex,
|
setMentionActiveIndex,
|
||||||
setSubmenuActiveIndex,
|
setSubmenuActiveIndex,
|
||||||
setOpenSubmenuFor,
|
|
||||||
setSubmenuQueryStart,
|
setSubmenuQueryStart,
|
||||||
getCaretPos,
|
getCaretPos,
|
||||||
getActiveMentionQueryAtPosition,
|
getActiveMentionQueryAtPosition,
|
||||||
@@ -98,65 +58,101 @@ export function useMentionKeyboard({
|
|||||||
scrollActiveItemIntoView,
|
scrollActiveItemIntoView,
|
||||||
} = mentionMenu
|
} = mentionMenu
|
||||||
|
|
||||||
const {
|
const currentFolder = mentionFolderNav?.currentFolder ?? null
|
||||||
pastChats,
|
const isInFolder = mentionFolderNav?.isInFolder ?? false
|
||||||
workflows,
|
|
||||||
knowledgeBases,
|
|
||||||
blocksList,
|
|
||||||
workflowBlocks,
|
|
||||||
templatesList,
|
|
||||||
logsList,
|
|
||||||
ensurePastChatsLoaded,
|
|
||||||
ensureWorkflowsLoaded,
|
|
||||||
ensureKnowledgeLoaded,
|
|
||||||
ensureBlocksLoaded,
|
|
||||||
ensureWorkflowBlocksLoaded,
|
|
||||||
ensureTemplatesLoaded,
|
|
||||||
ensureLogsLoaded,
|
|
||||||
} = mentionData
|
|
||||||
|
|
||||||
const {
|
/**
|
||||||
insertPastChatMention,
|
* Map of folder IDs to insert handlers
|
||||||
insertWorkflowMention,
|
*/
|
||||||
insertKnowledgeMention,
|
const insertHandlerMap = useMemo(
|
||||||
insertBlockMention,
|
(): Record<MentionFolderId, (item: any) => void> => ({
|
||||||
insertWorkflowBlockMention,
|
chats: insertHandlers.insertPastChatMention,
|
||||||
insertTemplateMention,
|
workflows: insertHandlers.insertWorkflowMention,
|
||||||
insertLogMention,
|
knowledge: insertHandlers.insertKnowledgeMention,
|
||||||
insertDocsMention,
|
blocks: insertHandlers.insertBlockMention,
|
||||||
} = insertHandlers
|
'workflow-blocks': insertHandlers.insertWorkflowBlockMention,
|
||||||
|
templates: insertHandlers.insertTemplateMention,
|
||||||
|
logs: insertHandlers.insertLogMention,
|
||||||
|
}),
|
||||||
|
[insertHandlers]
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get data array for a folder from mentionData
|
||||||
|
*/
|
||||||
|
const getFolderData = useCallback(
|
||||||
|
(folderId: MentionFolderId) => getFolderDataUtil(mentionData, folderId),
|
||||||
|
[mentionData]
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter items for a folder based on query using config's filterFn
|
||||||
|
*/
|
||||||
|
const filterFolderItems = useCallback(
|
||||||
|
(folderId: MentionFolderId, query: string): any[] => {
|
||||||
|
const config = FOLDER_CONFIGS[folderId]
|
||||||
|
const items = getFolderData(folderId)
|
||||||
|
if (!query) return items
|
||||||
|
const q = query.toLowerCase()
|
||||||
|
return items.filter((item) => config.filterFn(item, q))
|
||||||
|
},
|
||||||
|
[getFolderData]
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure data is loaded for a folder
|
||||||
|
*/
|
||||||
|
const ensureFolderLoaded = useCallback(
|
||||||
|
(folderId: MentionFolderId): void => {
|
||||||
|
const ensureFn = getFolderEnsureLoadedUtil(mentionData, folderId)
|
||||||
|
if (ensureFn) void ensureFn()
|
||||||
|
},
|
||||||
|
[mentionData]
|
||||||
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build aggregated list matching the portal's ordering
|
* Build aggregated list matching the portal's ordering
|
||||||
*/
|
*/
|
||||||
const buildAggregatedList = useCallback(
|
const buildAggregatedList = useCallback(
|
||||||
(query: string) => {
|
(query: string): Array<{ type: MentionFolderId | 'docs'; value: any }> => {
|
||||||
const q = query.toLowerCase()
|
const q = query.toLowerCase()
|
||||||
return [
|
const result: Array<{ type: MentionFolderId | 'docs'; value: any }> = []
|
||||||
...pastChats
|
|
||||||
.filter((c) => (c.title || 'New Chat').toLowerCase().includes(q))
|
for (const folderId of FOLDER_ORDER) {
|
||||||
.map((c) => ({ type: 'Chats' as const, value: c })),
|
const filtered = filterFolderItems(folderId, q)
|
||||||
...workflows
|
filtered.forEach((item) => {
|
||||||
.filter((w) => (w.name || 'Untitled Workflow').toLowerCase().includes(q))
|
result.push({ type: folderId, value: item })
|
||||||
.map((w) => ({ type: 'Workflows' as const, value: w })),
|
})
|
||||||
...knowledgeBases
|
}
|
||||||
.filter((k) => (k.name || 'Untitled').toLowerCase().includes(q))
|
|
||||||
.map((k) => ({ type: 'Knowledge' as const, value: k })),
|
if ('docs'.includes(q)) {
|
||||||
...blocksList
|
result.push({ type: 'docs', value: null })
|
||||||
.filter((b) => (b.name || b.id).toLowerCase().includes(q))
|
}
|
||||||
.map((b) => ({ type: 'Blocks' as const, value: b })),
|
|
||||||
...workflowBlocks
|
return result
|
||||||
.filter((b) => (b.name || b.id).toLowerCase().includes(q))
|
|
||||||
.map((b) => ({ type: 'Workflow Blocks' as const, value: b })),
|
|
||||||
...templatesList
|
|
||||||
.filter((t) => (t.name || 'Untitled Template').toLowerCase().includes(q))
|
|
||||||
.map((t) => ({ type: 'Templates' as const, value: t })),
|
|
||||||
...logsList
|
|
||||||
.filter((l) => (l.workflowName || 'Untitled Workflow').toLowerCase().includes(q))
|
|
||||||
.map((l) => ({ type: 'Logs' as const, value: l })),
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
[pastChats, workflows, knowledgeBases, blocksList, workflowBlocks, templatesList, logsList]
|
[filterFolderItems]
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic navigation helper for navigating through items
|
||||||
|
*/
|
||||||
|
const navigateItems = useCallback(
|
||||||
|
(
|
||||||
|
direction: 'up' | 'down',
|
||||||
|
itemCount: number,
|
||||||
|
setIndex: (fn: (prev: number) => number) => void
|
||||||
|
) => {
|
||||||
|
setIndex((prev) => {
|
||||||
|
const last = Math.max(0, itemCount - 1)
|
||||||
|
if (itemCount === 0) return 0
|
||||||
|
const next =
|
||||||
|
direction === 'down' ? (prev >= last ? 0 : prev + 1) : prev <= 0 ? last : prev - 1
|
||||||
|
requestAnimationFrame(() => scrollActiveItemIntoView(next))
|
||||||
|
return next
|
||||||
|
})
|
||||||
|
},
|
||||||
|
[scrollActiveItemIntoView]
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -169,143 +165,36 @@ export function useMentionKeyboard({
|
|||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
const caretPos = getCaretPos()
|
const caretPos = getCaretPos()
|
||||||
const active = getActiveMentionQueryAtPosition(caretPos)
|
const active = getActiveMentionQueryAtPosition(caretPos)
|
||||||
const mainQ = (!openSubmenuFor ? active?.query || '' : '').toLowerCase()
|
const mainQ = (!isInFolder ? active?.query || '' : '').toLowerCase()
|
||||||
|
const direction = e.key === 'ArrowDown' ? 'down' : 'up'
|
||||||
|
|
||||||
// When there's a query, we show aggregated filtered view (no folders)
|
|
||||||
const showAggregatedView = mainQ.length > 0
|
const showAggregatedView = mainQ.length > 0
|
||||||
const aggregatedList = showAggregatedView ? buildAggregatedList(mainQ) : []
|
if (showAggregatedView && !isInFolder) {
|
||||||
|
const aggregatedList = buildAggregatedList(mainQ)
|
||||||
// When showing aggregated filtered view, navigate through the aggregated list
|
navigateItems(direction, aggregatedList.length, setSubmenuActiveIndex)
|
||||||
if (showAggregatedView && !openSubmenuFor) {
|
|
||||||
setSubmenuActiveIndex((prev) => {
|
|
||||||
const last = Math.max(0, aggregatedList.length - 1)
|
|
||||||
if (aggregatedList.length === 0) return 0
|
|
||||||
const next =
|
|
||||||
e.key === 'ArrowDown' ? (prev >= last ? 0 : prev + 1) : prev <= 0 ? last : prev - 1
|
|
||||||
requestAnimationFrame(() => scrollActiveItemIntoView(next))
|
|
||||||
return next
|
|
||||||
})
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle submenu navigation
|
if (currentFolder && FOLDER_CONFIGS[currentFolder as MentionFolderId]) {
|
||||||
if (openSubmenuFor === 'Chats') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
const q = getSubmenuQuery().toLowerCase()
|
||||||
const filtered = pastChats.filter((c) => (c.title || 'New Chat').toLowerCase().includes(q))
|
const filtered = filterFolderItems(currentFolder as MentionFolderId, q)
|
||||||
setSubmenuActiveIndex((prev) => {
|
navigateItems(direction, filtered.length, setSubmenuActiveIndex)
|
||||||
const last = Math.max(0, filtered.length - 1)
|
return true
|
||||||
if (filtered.length === 0) return 0
|
|
||||||
const next =
|
|
||||||
e.key === 'ArrowDown' ? (prev >= last ? 0 : prev + 1) : prev <= 0 ? last : prev - 1
|
|
||||||
requestAnimationFrame(() => scrollActiveItemIntoView(next))
|
|
||||||
return next
|
|
||||||
})
|
|
||||||
} else if (openSubmenuFor === 'Workflows') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
|
||||||
const filtered = workflows.filter((w) =>
|
|
||||||
(w.name || 'Untitled Workflow').toLowerCase().includes(q)
|
|
||||||
)
|
|
||||||
setSubmenuActiveIndex((prev) => {
|
|
||||||
const last = Math.max(0, filtered.length - 1)
|
|
||||||
if (filtered.length === 0) return 0
|
|
||||||
const next =
|
|
||||||
e.key === 'ArrowDown' ? (prev >= last ? 0 : prev + 1) : prev <= 0 ? last : prev - 1
|
|
||||||
requestAnimationFrame(() => scrollActiveItemIntoView(next))
|
|
||||||
return next
|
|
||||||
})
|
|
||||||
} else if (openSubmenuFor === 'Knowledge') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
|
||||||
const filtered = knowledgeBases.filter((k) =>
|
|
||||||
(k.name || 'Untitled').toLowerCase().includes(q)
|
|
||||||
)
|
|
||||||
setSubmenuActiveIndex((prev) => {
|
|
||||||
const last = Math.max(0, filtered.length - 1)
|
|
||||||
if (filtered.length === 0) return 0
|
|
||||||
const next =
|
|
||||||
e.key === 'ArrowDown' ? (prev >= last ? 0 : prev + 1) : prev <= 0 ? last : prev - 1
|
|
||||||
requestAnimationFrame(() => scrollActiveItemIntoView(next))
|
|
||||||
return next
|
|
||||||
})
|
|
||||||
} else if (openSubmenuFor === 'Blocks') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
|
||||||
const filtered = blocksList.filter((b) => (b.name || b.id).toLowerCase().includes(q))
|
|
||||||
setSubmenuActiveIndex((prev) => {
|
|
||||||
const last = Math.max(0, filtered.length - 1)
|
|
||||||
if (filtered.length === 0) return 0
|
|
||||||
const next =
|
|
||||||
e.key === 'ArrowDown' ? (prev >= last ? 0 : prev + 1) : prev <= 0 ? last : prev - 1
|
|
||||||
requestAnimationFrame(() => scrollActiveItemIntoView(next))
|
|
||||||
return next
|
|
||||||
})
|
|
||||||
} else if (openSubmenuFor === 'Workflow Blocks') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
|
||||||
const filtered = workflowBlocks.filter((b) => (b.name || b.id).toLowerCase().includes(q))
|
|
||||||
setSubmenuActiveIndex((prev) => {
|
|
||||||
const last = Math.max(0, filtered.length - 1)
|
|
||||||
if (filtered.length === 0) return 0
|
|
||||||
const next =
|
|
||||||
e.key === 'ArrowDown' ? (prev >= last ? 0 : prev + 1) : prev <= 0 ? last : prev - 1
|
|
||||||
requestAnimationFrame(() => scrollActiveItemIntoView(next))
|
|
||||||
return next
|
|
||||||
})
|
|
||||||
} else if (openSubmenuFor === 'Templates') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
|
||||||
const filtered = templatesList.filter((t) =>
|
|
||||||
(t.name || 'Untitled Template').toLowerCase().includes(q)
|
|
||||||
)
|
|
||||||
setSubmenuActiveIndex((prev) => {
|
|
||||||
const last = Math.max(0, filtered.length - 1)
|
|
||||||
if (filtered.length === 0) return 0
|
|
||||||
const next =
|
|
||||||
e.key === 'ArrowDown' ? (prev >= last ? 0 : prev + 1) : prev <= 0 ? last : prev - 1
|
|
||||||
requestAnimationFrame(() => scrollActiveItemIntoView(next))
|
|
||||||
return next
|
|
||||||
})
|
|
||||||
} else if (openSubmenuFor === 'Logs') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
|
||||||
const filtered = logsList.filter((l) =>
|
|
||||||
[l.workflowName, l.trigger || ''].join(' ').toLowerCase().includes(q)
|
|
||||||
)
|
|
||||||
setSubmenuActiveIndex((prev) => {
|
|
||||||
const last = Math.max(0, filtered.length - 1)
|
|
||||||
if (filtered.length === 0) return 0
|
|
||||||
const next =
|
|
||||||
e.key === 'ArrowDown' ? (prev >= last ? 0 : prev + 1) : prev <= 0 ? last : prev - 1
|
|
||||||
requestAnimationFrame(() => scrollActiveItemIntoView(next))
|
|
||||||
return next
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
// Navigate through folder options when no query
|
|
||||||
const filteredMain = MENTION_OPTIONS.filter((o) => o.toLowerCase().includes(mainQ))
|
|
||||||
setMentionActiveIndex((prev) => {
|
|
||||||
const last = Math.max(0, filteredMain.length - 1)
|
|
||||||
if (filteredMain.length === 0) return 0
|
|
||||||
const next =
|
|
||||||
e.key === 'ArrowDown' ? (prev >= last ? 0 : prev + 1) : prev <= 0 ? last : prev - 1
|
|
||||||
requestAnimationFrame(() => scrollActiveItemIntoView(next))
|
|
||||||
return next
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
navigateItems(direction, ROOT_MENU_ITEM_COUNT, setMentionActiveIndex)
|
||||||
return true
|
return true
|
||||||
},
|
},
|
||||||
[
|
[
|
||||||
showMentionMenu,
|
showMentionMenu,
|
||||||
openSubmenuFor,
|
isInFolder,
|
||||||
mentionActiveIndex,
|
currentFolder,
|
||||||
submenuActiveIndex,
|
|
||||||
buildAggregatedList,
|
buildAggregatedList,
|
||||||
pastChats,
|
filterFolderItems,
|
||||||
workflows,
|
navigateItems,
|
||||||
knowledgeBases,
|
|
||||||
blocksList,
|
|
||||||
workflowBlocks,
|
|
||||||
templatesList,
|
|
||||||
logsList,
|
|
||||||
getCaretPos,
|
getCaretPos,
|
||||||
getActiveMentionQueryAtPosition,
|
getActiveMentionQueryAtPosition,
|
||||||
getSubmenuQuery,
|
getSubmenuQuery,
|
||||||
scrollActiveItemIntoView,
|
|
||||||
setMentionActiveIndex,
|
setMentionActiveIndex,
|
||||||
setSubmenuActiveIndex,
|
setSubmenuActiveIndex,
|
||||||
]
|
]
|
||||||
@@ -316,65 +205,30 @@ export function useMentionKeyboard({
|
|||||||
*/
|
*/
|
||||||
const handleArrowRight = useCallback(
|
const handleArrowRight = useCallback(
|
||||||
(e: KeyboardEvent<HTMLTextAreaElement>) => {
|
(e: KeyboardEvent<HTMLTextAreaElement>) => {
|
||||||
if (!showMentionMenu || e.key !== 'ArrowRight') return false
|
if (!showMentionMenu || e.key !== 'ArrowRight' || !mentionFolderNav) return false
|
||||||
|
|
||||||
const caretPos = getCaretPos()
|
const caretPos = getCaretPos()
|
||||||
const active = getActiveMentionQueryAtPosition(caretPos)
|
const active = getActiveMentionQueryAtPosition(caretPos)
|
||||||
const mainQ = (active?.query || '').toLowerCase()
|
const mainQ = (active?.query || '').toLowerCase()
|
||||||
const showAggregatedView = mainQ.length > 0
|
|
||||||
|
|
||||||
// Don't handle arrow right in aggregated view (user is filtering, not navigating folders)
|
if (mainQ.length > 0) return false
|
||||||
if (showAggregatedView) return false
|
|
||||||
|
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
const filteredMain = MENTION_OPTIONS.filter((o) => o.toLowerCase().includes(mainQ))
|
|
||||||
const selected = filteredMain[mentionActiveIndex]
|
|
||||||
|
|
||||||
if (selected === 'Chats') {
|
const isDocsSelected = mentionActiveIndex === FOLDER_ORDER.length
|
||||||
|
if (isDocsSelected) {
|
||||||
resetActiveMentionQuery()
|
resetActiveMentionQuery()
|
||||||
setOpenSubmenuFor('Chats')
|
insertHandlers.insertDocsMention()
|
||||||
setSubmenuActiveIndex(0)
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedFolderId = FOLDER_ORDER[mentionActiveIndex]
|
||||||
|
if (selectedFolderId) {
|
||||||
|
const config = FOLDER_CONFIGS[selectedFolderId]
|
||||||
|
resetActiveMentionQuery()
|
||||||
|
mentionFolderNav.openFolder(selectedFolderId, config.title)
|
||||||
setSubmenuQueryStart(getCaretPos())
|
setSubmenuQueryStart(getCaretPos())
|
||||||
void ensurePastChatsLoaded()
|
ensureFolderLoaded(selectedFolderId)
|
||||||
} else if (selected === 'Workflows') {
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setOpenSubmenuFor('Workflows')
|
|
||||||
setSubmenuActiveIndex(0)
|
|
||||||
setSubmenuQueryStart(getCaretPos())
|
|
||||||
void ensureWorkflowsLoaded()
|
|
||||||
} else if (selected === 'Knowledge') {
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setOpenSubmenuFor('Knowledge')
|
|
||||||
setSubmenuActiveIndex(0)
|
|
||||||
setSubmenuQueryStart(getCaretPos())
|
|
||||||
void ensureKnowledgeLoaded()
|
|
||||||
} else if (selected === 'Blocks') {
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setOpenSubmenuFor('Blocks')
|
|
||||||
setSubmenuActiveIndex(0)
|
|
||||||
setSubmenuQueryStart(getCaretPos())
|
|
||||||
void ensureBlocksLoaded()
|
|
||||||
} else if (selected === 'Workflow Blocks') {
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setOpenSubmenuFor('Workflow Blocks')
|
|
||||||
setSubmenuActiveIndex(0)
|
|
||||||
setSubmenuQueryStart(getCaretPos())
|
|
||||||
void ensureWorkflowBlocksLoaded()
|
|
||||||
} else if (selected === 'Docs') {
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
insertDocsMention()
|
|
||||||
} else if (selected === 'Templates') {
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setOpenSubmenuFor('Templates')
|
|
||||||
setSubmenuActiveIndex(0)
|
|
||||||
setSubmenuQueryStart(getCaretPos())
|
|
||||||
void ensureTemplatesLoaded()
|
|
||||||
} else if (selected === 'Logs') {
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setOpenSubmenuFor('Logs')
|
|
||||||
setSubmenuActiveIndex(0)
|
|
||||||
setSubmenuQueryStart(getCaretPos())
|
|
||||||
void ensureLogsLoaded()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
@@ -382,21 +236,13 @@ export function useMentionKeyboard({
|
|||||||
[
|
[
|
||||||
showMentionMenu,
|
showMentionMenu,
|
||||||
mentionActiveIndex,
|
mentionActiveIndex,
|
||||||
openSubmenuFor,
|
mentionFolderNav,
|
||||||
getCaretPos,
|
getCaretPos,
|
||||||
getActiveMentionQueryAtPosition,
|
getActiveMentionQueryAtPosition,
|
||||||
resetActiveMentionQuery,
|
resetActiveMentionQuery,
|
||||||
setOpenSubmenuFor,
|
|
||||||
setSubmenuActiveIndex,
|
|
||||||
setSubmenuQueryStart,
|
setSubmenuQueryStart,
|
||||||
ensurePastChatsLoaded,
|
ensureFolderLoaded,
|
||||||
ensureWorkflowsLoaded,
|
insertHandlers,
|
||||||
ensureKnowledgeLoaded,
|
|
||||||
ensureBlocksLoaded,
|
|
||||||
ensureWorkflowBlocksLoaded,
|
|
||||||
ensureTemplatesLoaded,
|
|
||||||
ensureLogsLoaded,
|
|
||||||
insertDocsMention,
|
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -407,16 +253,16 @@ export function useMentionKeyboard({
|
|||||||
(e: KeyboardEvent<HTMLTextAreaElement>) => {
|
(e: KeyboardEvent<HTMLTextAreaElement>) => {
|
||||||
if (!showMentionMenu || e.key !== 'ArrowLeft') return false
|
if (!showMentionMenu || e.key !== 'ArrowLeft') return false
|
||||||
|
|
||||||
if (openSubmenuFor) {
|
if (isInFolder && mentionFolderNav) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
setOpenSubmenuFor(null)
|
mentionFolderNav.closeFolder()
|
||||||
setSubmenuQueryStart(null)
|
setSubmenuQueryStart(null)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
},
|
},
|
||||||
[showMentionMenu, openSubmenuFor, setOpenSubmenuFor, setSubmenuQueryStart]
|
[showMentionMenu, isInFolder, mentionFolderNav, setSubmenuQueryStart]
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -429,179 +275,74 @@ export function useMentionKeyboard({
|
|||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
const caretPos = getCaretPos()
|
const caretPos = getCaretPos()
|
||||||
const active = getActiveMentionQueryAtPosition(caretPos)
|
const active = getActiveMentionQueryAtPosition(caretPos)
|
||||||
const mainQ = (active?.query || '').toLowerCase()
|
const mainQ = (!isInFolder ? active?.query || '' : '').toLowerCase()
|
||||||
const showAggregatedView = mainQ.length > 0
|
const showAggregatedView = mainQ.length > 0
|
||||||
const filteredMain = MENTION_OPTIONS.filter((o) => o.toLowerCase().includes(mainQ))
|
|
||||||
const selected = filteredMain[mentionActiveIndex]
|
|
||||||
|
|
||||||
// Handle selection in aggregated filtered view
|
if (showAggregatedView && !isInFolder) {
|
||||||
if (showAggregatedView && !openSubmenuFor) {
|
|
||||||
const aggregated = buildAggregatedList(mainQ)
|
const aggregated = buildAggregatedList(mainQ)
|
||||||
const idx = Math.max(0, Math.min(submenuActiveIndex, aggregated.length - 1))
|
const idx = Math.max(0, Math.min(submenuActiveIndex, aggregated.length - 1))
|
||||||
const chosen = aggregated[idx]
|
const chosen = aggregated[idx]
|
||||||
if (chosen) {
|
if (chosen) {
|
||||||
if (chosen.type === 'Chats') insertPastChatMention(chosen.value as ChatItem)
|
if (chosen.type === 'docs') {
|
||||||
else if (chosen.type === 'Workflows') insertWorkflowMention(chosen.value as WorkflowItem)
|
insertHandlers.insertDocsMention()
|
||||||
else if (chosen.type === 'Knowledge')
|
} else {
|
||||||
insertKnowledgeMention(chosen.value as KnowledgeItem)
|
const handler = insertHandlerMap[chosen.type]
|
||||||
else if (chosen.type === 'Workflow Blocks')
|
handler(chosen.value)
|
||||||
insertWorkflowBlockMention(chosen.value as BlockItem)
|
}
|
||||||
else if (chosen.type === 'Blocks') insertBlockMention(chosen.value as BlockItem)
|
|
||||||
else if (chosen.type === 'Templates') insertTemplateMention(chosen.value as TemplateItem)
|
|
||||||
else if (chosen.type === 'Logs') insertLogMention(chosen.value as LogItem)
|
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle folder navigation when no query
|
if (isInFolder && currentFolder && FOLDER_CONFIGS[currentFolder as MentionFolderId]) {
|
||||||
if (!openSubmenuFor && selected === 'Chats') {
|
const folderId = currentFolder as MentionFolderId
|
||||||
resetActiveMentionQuery()
|
|
||||||
setOpenSubmenuFor('Chats')
|
|
||||||
setSubmenuActiveIndex(0)
|
|
||||||
setSubmenuQueryStart(getCaretPos())
|
|
||||||
void ensurePastChatsLoaded()
|
|
||||||
} else if (openSubmenuFor === 'Chats') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
const q = getSubmenuQuery().toLowerCase()
|
||||||
const filtered = pastChats.filter((c) => (c.title || 'New Chat').toLowerCase().includes(q))
|
const filtered = filterFolderItems(folderId, q)
|
||||||
if (filtered.length > 0) {
|
if (filtered.length > 0) {
|
||||||
const chosen = filtered[Math.max(0, Math.min(submenuActiveIndex, filtered.length - 1))]
|
const chosen = filtered[Math.max(0, Math.min(submenuActiveIndex, filtered.length - 1))]
|
||||||
insertPastChatMention(chosen)
|
const handler = insertHandlerMap[folderId]
|
||||||
|
handler(chosen)
|
||||||
setSubmenuQueryStart(null)
|
setSubmenuQueryStart(null)
|
||||||
}
|
}
|
||||||
} else if (!openSubmenuFor && selected === 'Workflows') {
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
const isDocsSelected = mentionActiveIndex === FOLDER_ORDER.length
|
||||||
|
if (isDocsSelected) {
|
||||||
resetActiveMentionQuery()
|
resetActiveMentionQuery()
|
||||||
setOpenSubmenuFor('Workflows')
|
insertHandlers.insertDocsMention()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedFolderId = FOLDER_ORDER[mentionActiveIndex]
|
||||||
|
if (selectedFolderId && mentionFolderNav) {
|
||||||
|
const config = FOLDER_CONFIGS[selectedFolderId]
|
||||||
|
resetActiveMentionQuery()
|
||||||
|
mentionFolderNav.openFolder(selectedFolderId, config.title)
|
||||||
setSubmenuActiveIndex(0)
|
setSubmenuActiveIndex(0)
|
||||||
setSubmenuQueryStart(getCaretPos())
|
setSubmenuQueryStart(getCaretPos())
|
||||||
void ensureWorkflowsLoaded()
|
ensureFolderLoaded(selectedFolderId)
|
||||||
} else if (openSubmenuFor === 'Workflows') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
|
||||||
const filtered = workflows.filter((w) =>
|
|
||||||
(w.name || 'Untitled Workflow').toLowerCase().includes(q)
|
|
||||||
)
|
|
||||||
if (filtered.length > 0) {
|
|
||||||
const chosen = filtered[Math.max(0, Math.min(submenuActiveIndex, filtered.length - 1))]
|
|
||||||
insertWorkflowMention(chosen)
|
|
||||||
setSubmenuQueryStart(null)
|
|
||||||
}
|
|
||||||
} else if (!openSubmenuFor && selected === 'Knowledge') {
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setOpenSubmenuFor('Knowledge')
|
|
||||||
setSubmenuActiveIndex(0)
|
|
||||||
setSubmenuQueryStart(getCaretPos())
|
|
||||||
void ensureKnowledgeLoaded()
|
|
||||||
} else if (openSubmenuFor === 'Knowledge') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
|
||||||
const filtered = knowledgeBases.filter((k) =>
|
|
||||||
(k.name || 'Untitled').toLowerCase().includes(q)
|
|
||||||
)
|
|
||||||
if (filtered.length > 0) {
|
|
||||||
const chosen = filtered[Math.max(0, Math.min(submenuActiveIndex, filtered.length - 1))]
|
|
||||||
insertKnowledgeMention(chosen)
|
|
||||||
setSubmenuQueryStart(null)
|
|
||||||
}
|
|
||||||
} else if (!openSubmenuFor && selected === 'Blocks') {
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setOpenSubmenuFor('Blocks')
|
|
||||||
setSubmenuActiveIndex(0)
|
|
||||||
setSubmenuQueryStart(getCaretPos())
|
|
||||||
void ensureBlocksLoaded()
|
|
||||||
} else if (openSubmenuFor === 'Blocks') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
|
||||||
const filtered = blocksList.filter((b) => (b.name || b.id).toLowerCase().includes(q))
|
|
||||||
if (filtered.length > 0) {
|
|
||||||
const chosen = filtered[Math.max(0, Math.min(submenuActiveIndex, filtered.length - 1))]
|
|
||||||
insertBlockMention(chosen)
|
|
||||||
setSubmenuQueryStart(null)
|
|
||||||
}
|
|
||||||
} else if (!openSubmenuFor && selected === 'Workflow Blocks') {
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setOpenSubmenuFor('Workflow Blocks')
|
|
||||||
setSubmenuActiveIndex(0)
|
|
||||||
setSubmenuQueryStart(getCaretPos())
|
|
||||||
void ensureWorkflowBlocksLoaded()
|
|
||||||
} else if (openSubmenuFor === 'Workflow Blocks') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
|
||||||
const filtered = workflowBlocks.filter((b) => (b.name || b.id).toLowerCase().includes(q))
|
|
||||||
if (filtered.length > 0) {
|
|
||||||
const chosen = filtered[Math.max(0, Math.min(submenuActiveIndex, filtered.length - 1))]
|
|
||||||
insertWorkflowBlockMention(chosen)
|
|
||||||
setSubmenuQueryStart(null)
|
|
||||||
}
|
|
||||||
} else if (!openSubmenuFor && selected === 'Docs') {
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
insertDocsMention()
|
|
||||||
} else if (!openSubmenuFor && selected === 'Templates') {
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setOpenSubmenuFor('Templates')
|
|
||||||
setSubmenuActiveIndex(0)
|
|
||||||
setSubmenuQueryStart(getCaretPos())
|
|
||||||
void ensureTemplatesLoaded()
|
|
||||||
} else if (!openSubmenuFor && selected === 'Logs') {
|
|
||||||
resetActiveMentionQuery()
|
|
||||||
setOpenSubmenuFor('Logs')
|
|
||||||
setSubmenuActiveIndex(0)
|
|
||||||
setSubmenuQueryStart(getCaretPos())
|
|
||||||
void ensureLogsLoaded()
|
|
||||||
} else if (openSubmenuFor === 'Templates') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
|
||||||
const filtered = templatesList.filter((t) =>
|
|
||||||
(t.name || 'Untitled Template').toLowerCase().includes(q)
|
|
||||||
)
|
|
||||||
if (filtered.length > 0) {
|
|
||||||
const chosen = filtered[Math.max(0, Math.min(submenuActiveIndex, filtered.length - 1))]
|
|
||||||
insertTemplateMention(chosen)
|
|
||||||
setSubmenuQueryStart(null)
|
|
||||||
}
|
|
||||||
} else if (openSubmenuFor === 'Logs') {
|
|
||||||
const q = getSubmenuQuery().toLowerCase()
|
|
||||||
const filtered = logsList.filter((l) =>
|
|
||||||
[l.workflowName, l.trigger || ''].join(' ').toLowerCase().includes(q)
|
|
||||||
)
|
|
||||||
if (filtered.length > 0) {
|
|
||||||
const chosen = filtered[Math.max(0, Math.min(submenuActiveIndex, filtered.length - 1))]
|
|
||||||
insertLogMention(chosen)
|
|
||||||
setSubmenuQueryStart(null)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
},
|
},
|
||||||
[
|
[
|
||||||
showMentionMenu,
|
showMentionMenu,
|
||||||
openSubmenuFor,
|
isInFolder,
|
||||||
|
currentFolder,
|
||||||
mentionActiveIndex,
|
mentionActiveIndex,
|
||||||
submenuActiveIndex,
|
submenuActiveIndex,
|
||||||
|
mentionFolderNav,
|
||||||
buildAggregatedList,
|
buildAggregatedList,
|
||||||
pastChats,
|
filterFolderItems,
|
||||||
workflows,
|
insertHandlerMap,
|
||||||
knowledgeBases,
|
|
||||||
blocksList,
|
|
||||||
workflowBlocks,
|
|
||||||
templatesList,
|
|
||||||
logsList,
|
|
||||||
getCaretPos,
|
getCaretPos,
|
||||||
getActiveMentionQueryAtPosition,
|
getActiveMentionQueryAtPosition,
|
||||||
getSubmenuQuery,
|
getSubmenuQuery,
|
||||||
resetActiveMentionQuery,
|
resetActiveMentionQuery,
|
||||||
setOpenSubmenuFor,
|
|
||||||
setSubmenuActiveIndex,
|
setSubmenuActiveIndex,
|
||||||
setSubmenuQueryStart,
|
setSubmenuQueryStart,
|
||||||
ensurePastChatsLoaded,
|
ensureFolderLoaded,
|
||||||
ensureWorkflowsLoaded,
|
insertHandlers,
|
||||||
ensureKnowledgeLoaded,
|
|
||||||
ensureBlocksLoaded,
|
|
||||||
ensureWorkflowBlocksLoaded,
|
|
||||||
ensureTemplatesLoaded,
|
|
||||||
ensureLogsLoaded,
|
|
||||||
insertPastChatMention,
|
|
||||||
insertWorkflowMention,
|
|
||||||
insertKnowledgeMention,
|
|
||||||
insertBlockMention,
|
|
||||||
insertWorkflowBlockMention,
|
|
||||||
insertTemplateMention,
|
|
||||||
insertLogMention,
|
|
||||||
insertDocsMention,
|
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
import { useCallback, useEffect, useRef, useState } from 'react'
|
import { useCallback, useEffect, useRef, useState } from 'react'
|
||||||
import { createLogger } from '@sim/logger'
|
import { SCROLL_TOLERANCE } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/constants'
|
||||||
import type { ChatContext } from '@/stores/panel'
|
import type { ChatContext } from '@/stores/panel'
|
||||||
import { SCROLL_TOLERANCE } from '../constants'
|
|
||||||
|
|
||||||
const logger = createLogger('useMentionMenu')
|
|
||||||
|
|
||||||
interface UseMentionMenuProps {
|
interface UseMentionMenuProps {
|
||||||
/** Current message text */
|
/** Current message text */
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ export function useTextareaAutoResize({
|
|||||||
|
|
||||||
const styles = window.getComputedStyle(textarea)
|
const styles = window.getComputedStyle(textarea)
|
||||||
|
|
||||||
// Copy all text rendering properties exactly (but NOT color - overlay needs visible text)
|
|
||||||
overlay.style.font = styles.font
|
overlay.style.font = styles.font
|
||||||
overlay.style.fontSize = styles.fontSize
|
overlay.style.fontSize = styles.fontSize
|
||||||
overlay.style.fontFamily = styles.fontFamily
|
overlay.style.fontFamily = styles.fontFamily
|
||||||
@@ -66,7 +65,6 @@ export function useTextareaAutoResize({
|
|||||||
overlay.style.textTransform = styles.textTransform
|
overlay.style.textTransform = styles.textTransform
|
||||||
overlay.style.textIndent = styles.textIndent
|
overlay.style.textIndent = styles.textIndent
|
||||||
|
|
||||||
// Copy box model properties exactly to ensure identical text flow
|
|
||||||
overlay.style.padding = styles.padding
|
overlay.style.padding = styles.padding
|
||||||
overlay.style.paddingTop = styles.paddingTop
|
overlay.style.paddingTop = styles.paddingTop
|
||||||
overlay.style.paddingRight = styles.paddingRight
|
overlay.style.paddingRight = styles.paddingRight
|
||||||
@@ -80,7 +78,6 @@ export function useTextareaAutoResize({
|
|||||||
overlay.style.border = styles.border
|
overlay.style.border = styles.border
|
||||||
overlay.style.borderWidth = styles.borderWidth
|
overlay.style.borderWidth = styles.borderWidth
|
||||||
|
|
||||||
// Copy text wrapping and breaking properties
|
|
||||||
overlay.style.whiteSpace = styles.whiteSpace
|
overlay.style.whiteSpace = styles.whiteSpace
|
||||||
overlay.style.wordBreak = styles.wordBreak
|
overlay.style.wordBreak = styles.wordBreak
|
||||||
overlay.style.wordWrap = styles.wordWrap
|
overlay.style.wordWrap = styles.wordWrap
|
||||||
@@ -91,20 +88,17 @@ export function useTextareaAutoResize({
|
|||||||
overlay.style.direction = styles.direction
|
overlay.style.direction = styles.direction
|
||||||
overlay.style.hyphens = (styles as any).hyphens ?? ''
|
overlay.style.hyphens = (styles as any).hyphens ?? ''
|
||||||
|
|
||||||
// Critical: Match dimensions exactly
|
|
||||||
const textareaWidth = textarea.clientWidth
|
const textareaWidth = textarea.clientWidth
|
||||||
const textareaHeight = textarea.clientHeight
|
const textareaHeight = textarea.clientHeight
|
||||||
|
|
||||||
overlay.style.width = `${textareaWidth}px`
|
overlay.style.width = `${textareaWidth}px`
|
||||||
overlay.style.height = `${textareaHeight}px`
|
overlay.style.height = `${textareaHeight}px`
|
||||||
|
|
||||||
// Match max-height behavior
|
|
||||||
const computedMaxHeight = styles.maxHeight
|
const computedMaxHeight = styles.maxHeight
|
||||||
if (computedMaxHeight && computedMaxHeight !== 'none') {
|
if (computedMaxHeight && computedMaxHeight !== 'none') {
|
||||||
overlay.style.maxHeight = computedMaxHeight
|
overlay.style.maxHeight = computedMaxHeight
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure scroll positions are perfectly synced
|
|
||||||
overlay.scrollTop = textarea.scrollTop
|
overlay.scrollTop = textarea.scrollTop
|
||||||
overlay.scrollLeft = textarea.scrollLeft
|
overlay.scrollLeft = textarea.scrollLeft
|
||||||
})
|
})
|
||||||
@@ -119,25 +113,20 @@ export function useTextareaAutoResize({
|
|||||||
const overlay = overlayRef.current
|
const overlay = overlayRef.current
|
||||||
if (!textarea || !overlay) return
|
if (!textarea || !overlay) return
|
||||||
|
|
||||||
// Store current cursor position to determine if user is typing at the end
|
|
||||||
const cursorPos = textarea.selectionStart ?? 0
|
const cursorPos = textarea.selectionStart ?? 0
|
||||||
const isAtEnd = cursorPos === message.length
|
const isAtEnd = cursorPos === message.length
|
||||||
const wasScrolledToBottom =
|
const wasScrolledToBottom =
|
||||||
textarea.scrollHeight - textarea.scrollTop - textarea.clientHeight < 5
|
textarea.scrollHeight - textarea.scrollTop - textarea.clientHeight < 5
|
||||||
|
|
||||||
// Reset height to auto to get proper scrollHeight
|
|
||||||
textarea.style.height = 'auto'
|
textarea.style.height = 'auto'
|
||||||
overlay.style.height = 'auto'
|
overlay.style.height = 'auto'
|
||||||
|
|
||||||
// Force a reflow to ensure accurate scrollHeight
|
|
||||||
void textarea.offsetHeight
|
void textarea.offsetHeight
|
||||||
void overlay.offsetHeight
|
void overlay.offsetHeight
|
||||||
|
|
||||||
// Get the scroll height (this includes all content, including trailing newlines)
|
|
||||||
const scrollHeight = textarea.scrollHeight
|
const scrollHeight = textarea.scrollHeight
|
||||||
const nextHeight = Math.min(scrollHeight, MAX_TEXTAREA_HEIGHT)
|
const nextHeight = Math.min(scrollHeight, MAX_TEXTAREA_HEIGHT)
|
||||||
|
|
||||||
// Apply height to BOTH elements simultaneously
|
|
||||||
const heightString = `${nextHeight}px`
|
const heightString = `${nextHeight}px`
|
||||||
const overflowString = scrollHeight > MAX_TEXTAREA_HEIGHT ? 'auto' : 'hidden'
|
const overflowString = scrollHeight > MAX_TEXTAREA_HEIGHT ? 'auto' : 'hidden'
|
||||||
|
|
||||||
@@ -146,22 +135,18 @@ export function useTextareaAutoResize({
|
|||||||
overlay.style.height = heightString
|
overlay.style.height = heightString
|
||||||
overlay.style.overflowY = overflowString
|
overlay.style.overflowY = overflowString
|
||||||
|
|
||||||
// Force another reflow after height change
|
|
||||||
void textarea.offsetHeight
|
void textarea.offsetHeight
|
||||||
void overlay.offsetHeight
|
void overlay.offsetHeight
|
||||||
|
|
||||||
// Maintain scroll behavior: if user was at bottom or typing at end, keep them at bottom
|
|
||||||
if ((isAtEnd || wasScrolledToBottom) && scrollHeight > nextHeight) {
|
if ((isAtEnd || wasScrolledToBottom) && scrollHeight > nextHeight) {
|
||||||
const scrollValue = scrollHeight
|
const scrollValue = scrollHeight
|
||||||
textarea.scrollTop = scrollValue
|
textarea.scrollTop = scrollValue
|
||||||
overlay.scrollTop = scrollValue
|
overlay.scrollTop = scrollValue
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, sync scroll positions
|
|
||||||
overlay.scrollTop = textarea.scrollTop
|
overlay.scrollTop = textarea.scrollTop
|
||||||
overlay.scrollLeft = textarea.scrollLeft
|
overlay.scrollLeft = textarea.scrollLeft
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sync all other styles after height change
|
|
||||||
syncOverlayStyles.current()
|
syncOverlayStyles.current()
|
||||||
}, [message, selectedContexts, textareaRef])
|
}, [message, selectedContexts, textareaRef])
|
||||||
|
|
||||||
@@ -192,19 +177,15 @@ export function useTextareaAutoResize({
|
|||||||
const overlay = overlayRef.current
|
const overlay = overlayRef.current
|
||||||
if (!textarea || !overlay || !containerRef || typeof window === 'undefined') return
|
if (!textarea || !overlay || !containerRef || typeof window === 'undefined') return
|
||||||
|
|
||||||
// Initial sync
|
|
||||||
syncOverlayStyles.current()
|
syncOverlayStyles.current()
|
||||||
|
|
||||||
// Observe the CONTAINER - when pills wrap, container height changes
|
|
||||||
if (typeof ResizeObserver !== 'undefined' && !containerResizeObserverRef.current) {
|
if (typeof ResizeObserver !== 'undefined' && !containerResizeObserverRef.current) {
|
||||||
containerResizeObserverRef.current = new ResizeObserver(() => {
|
containerResizeObserverRef.current = new ResizeObserver(() => {
|
||||||
// Container size changed (pills wrapped) - sync immediately
|
|
||||||
syncOverlayStyles.current()
|
syncOverlayStyles.current()
|
||||||
})
|
})
|
||||||
containerResizeObserverRef.current.observe(containerRef)
|
containerResizeObserverRef.current.observe(containerRef)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ALSO observe the textarea for its own size changes
|
|
||||||
if (typeof ResizeObserver !== 'undefined' && !textareaResizeObserverRef.current) {
|
if (typeof ResizeObserver !== 'undefined' && !textareaResizeObserverRef.current) {
|
||||||
textareaResizeObserverRef.current = new ResizeObserver(() => {
|
textareaResizeObserverRef.current = new ResizeObserver(() => {
|
||||||
syncOverlayStyles.current()
|
syncOverlayStyles.current()
|
||||||
@@ -212,7 +193,6 @@ export function useTextareaAutoResize({
|
|||||||
textareaResizeObserverRef.current.observe(textarea)
|
textareaResizeObserverRef.current.observe(textarea)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup MutationObserver to detect style changes
|
|
||||||
const mutationObserver = new MutationObserver(() => {
|
const mutationObserver = new MutationObserver(() => {
|
||||||
syncOverlayStyles.current()
|
syncOverlayStyles.current()
|
||||||
})
|
})
|
||||||
@@ -221,11 +201,9 @@ export function useTextareaAutoResize({
|
|||||||
attributeFilter: ['style', 'class'],
|
attributeFilter: ['style', 'class'],
|
||||||
})
|
})
|
||||||
|
|
||||||
// Listen to window resize events (for browser window resizing)
|
|
||||||
const handleResize = () => syncOverlayStyles.current()
|
const handleResize = () => syncOverlayStyles.current()
|
||||||
window.addEventListener('resize', handleResize)
|
window.addEventListener('resize', handleResize)
|
||||||
|
|
||||||
// Cleanup
|
|
||||||
return () => {
|
return () => {
|
||||||
mutationObserver.disconnect()
|
mutationObserver.disconnect()
|
||||||
window.removeEventListener('resize', handleResize)
|
window.removeEventListener('resize', handleResize)
|
||||||
|
|||||||
@@ -18,12 +18,21 @@ import { cn } from '@/lib/core/utils/cn'
|
|||||||
import {
|
import {
|
||||||
AttachedFilesDisplay,
|
AttachedFilesDisplay,
|
||||||
ContextPills,
|
ContextPills,
|
||||||
|
type MentionFolderNav,
|
||||||
MentionMenu,
|
MentionMenu,
|
||||||
ModelSelector,
|
ModelSelector,
|
||||||
ModeSelector,
|
ModeSelector,
|
||||||
|
type SlashFolderNav,
|
||||||
SlashMenu,
|
SlashMenu,
|
||||||
} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/components'
|
} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/components'
|
||||||
import { NEAR_TOP_THRESHOLD } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/constants'
|
import {
|
||||||
|
ALL_COMMAND_IDS,
|
||||||
|
getCommandDisplayLabel,
|
||||||
|
getNextIndex,
|
||||||
|
NEAR_TOP_THRESHOLD,
|
||||||
|
TOP_LEVEL_COMMANDS,
|
||||||
|
WEB_COMMANDS,
|
||||||
|
} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/constants'
|
||||||
import {
|
import {
|
||||||
useContextManagement,
|
useContextManagement,
|
||||||
useFileAttachments,
|
useFileAttachments,
|
||||||
@@ -110,7 +119,6 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
},
|
},
|
||||||
ref
|
ref
|
||||||
) => {
|
) => {
|
||||||
// Refs and external hooks
|
|
||||||
const { data: session } = useSession()
|
const { data: session } = useSession()
|
||||||
const params = useParams()
|
const params = useParams()
|
||||||
const workspaceId = params.workspaceId as string
|
const workspaceId = params.workspaceId as string
|
||||||
@@ -122,19 +130,18 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
selectedModelOverride !== undefined ? selectedModelOverride : copilotStore.selectedModel
|
selectedModelOverride !== undefined ? selectedModelOverride : copilotStore.selectedModel
|
||||||
const setSelectedModel = onModelChangeOverride || copilotStore.setSelectedModel
|
const setSelectedModel = onModelChangeOverride || copilotStore.setSelectedModel
|
||||||
|
|
||||||
// Internal state
|
|
||||||
const [internalMessage, setInternalMessage] = useState('')
|
const [internalMessage, setInternalMessage] = useState('')
|
||||||
const [isNearTop, setIsNearTop] = useState(false)
|
const [isNearTop, setIsNearTop] = useState(false)
|
||||||
const [containerRef, setContainerRef] = useState<HTMLDivElement | null>(null)
|
const [containerRef, setContainerRef] = useState<HTMLDivElement | null>(null)
|
||||||
const [inputContainerRef, setInputContainerRef] = useState<HTMLDivElement | null>(null)
|
const [inputContainerRef, setInputContainerRef] = useState<HTMLDivElement | null>(null)
|
||||||
const [showSlashMenu, setShowSlashMenu] = useState(false)
|
const [showSlashMenu, setShowSlashMenu] = useState(false)
|
||||||
|
const [slashFolderNav, setSlashFolderNav] = useState<SlashFolderNav | null>(null)
|
||||||
|
const [mentionFolderNav, setMentionFolderNav] = useState<MentionFolderNav | null>(null)
|
||||||
|
|
||||||
// Controlled vs uncontrolled message state
|
|
||||||
const message = controlledValue !== undefined ? controlledValue : internalMessage
|
const message = controlledValue !== undefined ? controlledValue : internalMessage
|
||||||
const setMessage =
|
const setMessage =
|
||||||
controlledValue !== undefined ? onControlledChange || (() => {}) : setInternalMessage
|
controlledValue !== undefined ? onControlledChange || (() => {}) : setInternalMessage
|
||||||
|
|
||||||
// Effective placeholder
|
|
||||||
const effectivePlaceholder =
|
const effectivePlaceholder =
|
||||||
placeholder ||
|
placeholder ||
|
||||||
(mode === 'ask'
|
(mode === 'ask'
|
||||||
@@ -143,11 +150,8 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
? 'Plan your workflow'
|
? 'Plan your workflow'
|
||||||
: 'Plan, search, build anything')
|
: 'Plan, search, build anything')
|
||||||
|
|
||||||
// Custom hooks - order matters for ref sharing
|
|
||||||
// Context management (manages selectedContexts state)
|
|
||||||
const contextManagement = useContextManagement({ message, initialContexts })
|
const contextManagement = useContextManagement({ message, initialContexts })
|
||||||
|
|
||||||
// Mention menu
|
|
||||||
const mentionMenu = useMentionMenu({
|
const mentionMenu = useMentionMenu({
|
||||||
message,
|
message,
|
||||||
selectedContexts: contextManagement.selectedContexts,
|
selectedContexts: contextManagement.selectedContexts,
|
||||||
@@ -155,7 +159,6 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
onMessageChange: setMessage,
|
onMessageChange: setMessage,
|
||||||
})
|
})
|
||||||
|
|
||||||
// Mention token utilities
|
|
||||||
const mentionTokensWithContext = useMentionTokens({
|
const mentionTokensWithContext = useMentionTokens({
|
||||||
message,
|
message,
|
||||||
selectedContexts: contextManagement.selectedContexts,
|
selectedContexts: contextManagement.selectedContexts,
|
||||||
@@ -183,22 +186,21 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
isLoading,
|
isLoading,
|
||||||
})
|
})
|
||||||
|
|
||||||
// Insert mention handlers
|
|
||||||
const insertHandlers = useMentionInsertHandlers({
|
const insertHandlers = useMentionInsertHandlers({
|
||||||
mentionMenu,
|
mentionMenu,
|
||||||
workflowId: workflowId || null,
|
workflowId: workflowId || null,
|
||||||
selectedContexts: contextManagement.selectedContexts,
|
selectedContexts: contextManagement.selectedContexts,
|
||||||
onContextAdd: contextManagement.addContext,
|
onContextAdd: contextManagement.addContext,
|
||||||
|
mentionFolderNav,
|
||||||
})
|
})
|
||||||
|
|
||||||
// Keyboard navigation hook
|
|
||||||
const mentionKeyboard = useMentionKeyboard({
|
const mentionKeyboard = useMentionKeyboard({
|
||||||
mentionMenu,
|
mentionMenu,
|
||||||
mentionData,
|
mentionData,
|
||||||
insertHandlers,
|
insertHandlers,
|
||||||
|
mentionFolderNav,
|
||||||
})
|
})
|
||||||
|
|
||||||
// Expose focus method to parent
|
|
||||||
useImperativeHandle(
|
useImperativeHandle(
|
||||||
ref,
|
ref,
|
||||||
() => ({
|
() => ({
|
||||||
@@ -215,17 +217,6 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
[mentionMenu.textareaRef]
|
[mentionMenu.textareaRef]
|
||||||
)
|
)
|
||||||
|
|
||||||
// Note: textarea auto-resize is handled by the useTextareaAutoResize hook
|
|
||||||
|
|
||||||
// Load workflows on mount if we have a workflowId
|
|
||||||
useEffect(() => {
|
|
||||||
if (workflowId) {
|
|
||||||
void mentionData.ensureWorkflowsLoaded()
|
|
||||||
}
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [workflowId])
|
|
||||||
|
|
||||||
// Detect if input is near top of screen
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const checkPosition = () => {
|
const checkPosition = () => {
|
||||||
if (containerRef) {
|
if (containerRef) {
|
||||||
@@ -253,7 +244,6 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
}
|
}
|
||||||
}, [containerRef])
|
}, [containerRef])
|
||||||
|
|
||||||
// Also check position when mention menu opens
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (mentionMenu.showMentionMenu && containerRef) {
|
if (mentionMenu.showMentionMenu && containerRef) {
|
||||||
const rect = containerRef.getBoundingClientRect()
|
const rect = containerRef.getBoundingClientRect()
|
||||||
@@ -261,9 +251,8 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
}
|
}
|
||||||
}, [mentionMenu.showMentionMenu, containerRef])
|
}, [mentionMenu.showMentionMenu, containerRef])
|
||||||
|
|
||||||
// Preload mention data when query is active
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!mentionMenu.showMentionMenu || mentionMenu.openSubmenuFor) {
|
if (!mentionMenu.showMentionMenu || mentionFolderNav?.isInFolder) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -273,38 +262,31 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
.toLowerCase()
|
.toLowerCase()
|
||||||
|
|
||||||
if (q && q.length > 0) {
|
if (q && q.length > 0) {
|
||||||
// Prefetch all lists when there's any query for instant filtering
|
|
||||||
void mentionData.ensurePastChatsLoaded()
|
void mentionData.ensurePastChatsLoaded()
|
||||||
void mentionData.ensureWorkflowsLoaded()
|
// workflows and workflow-blocks auto-load from stores
|
||||||
void mentionData.ensureWorkflowBlocksLoaded()
|
|
||||||
void mentionData.ensureKnowledgeLoaded()
|
void mentionData.ensureKnowledgeLoaded()
|
||||||
void mentionData.ensureBlocksLoaded()
|
void mentionData.ensureBlocksLoaded()
|
||||||
void mentionData.ensureTemplatesLoaded()
|
void mentionData.ensureTemplatesLoaded()
|
||||||
void mentionData.ensureLogsLoaded()
|
void mentionData.ensureLogsLoaded()
|
||||||
|
|
||||||
// Reset to first item when query changes
|
|
||||||
mentionMenu.setSubmenuActiveIndex(0)
|
mentionMenu.setSubmenuActiveIndex(0)
|
||||||
requestAnimationFrame(() => mentionMenu.scrollActiveItemIntoView(0))
|
requestAnimationFrame(() => mentionMenu.scrollActiveItemIntoView(0))
|
||||||
}
|
}
|
||||||
// Only depend on values that trigger data loading, not the entire objects
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [mentionMenu.showMentionMenu, mentionMenu.openSubmenuFor, message])
|
}, [mentionMenu.showMentionMenu, mentionFolderNav?.isInFolder, message])
|
||||||
|
|
||||||
// When switching into a submenu, select the first item and scroll to it
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (mentionMenu.openSubmenuFor) {
|
if (mentionFolderNav?.isInFolder) {
|
||||||
mentionMenu.setSubmenuActiveIndex(0)
|
mentionMenu.setSubmenuActiveIndex(0)
|
||||||
requestAnimationFrame(() => mentionMenu.scrollActiveItemIntoView(0))
|
requestAnimationFrame(() => mentionMenu.scrollActiveItemIntoView(0))
|
||||||
}
|
}
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [mentionMenu.openSubmenuFor])
|
}, [mentionFolderNav?.isInFolder])
|
||||||
|
|
||||||
// Handlers
|
|
||||||
const handleSubmit = useCallback(
|
const handleSubmit = useCallback(
|
||||||
async (overrideMessage?: string, options: { preserveInput?: boolean } = {}) => {
|
async (overrideMessage?: string, options: { preserveInput?: boolean } = {}) => {
|
||||||
const targetMessage = overrideMessage ?? message
|
const targetMessage = overrideMessage ?? message
|
||||||
const trimmedMessage = targetMessage.trim()
|
const trimmedMessage = targetMessage.trim()
|
||||||
// Allow submission even when isLoading - store will queue the message
|
|
||||||
if (!trimmedMessage || disabled) return
|
if (!trimmedMessage || disabled) return
|
||||||
|
|
||||||
const failedUploads = fileAttachments.attachedFiles.filter((f) => !f.uploading && !f.key)
|
const failedUploads = fileAttachments.attachedFiles.filter((f) => !f.uploading && !f.key)
|
||||||
@@ -377,17 +359,12 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
|
|
||||||
const handleSlashCommandSelect = useCallback(
|
const handleSlashCommandSelect = useCallback(
|
||||||
(command: string) => {
|
(command: string) => {
|
||||||
// Capitalize the command for display
|
const displayLabel = getCommandDisplayLabel(command)
|
||||||
const capitalizedCommand = command.charAt(0).toUpperCase() + command.slice(1)
|
mentionMenu.replaceActiveSlashWith(displayLabel)
|
||||||
|
|
||||||
// Replace the active slash query with the capitalized command
|
|
||||||
mentionMenu.replaceActiveSlashWith(capitalizedCommand)
|
|
||||||
|
|
||||||
// Add as a context so it gets highlighted
|
|
||||||
contextManagement.addContext({
|
contextManagement.addContext({
|
||||||
kind: 'slash_command',
|
kind: 'slash_command',
|
||||||
command,
|
command,
|
||||||
label: capitalizedCommand,
|
label: displayLabel,
|
||||||
})
|
})
|
||||||
|
|
||||||
setShowSlashMenu(false)
|
setShowSlashMenu(false)
|
||||||
@@ -398,12 +375,13 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
|
|
||||||
const handleKeyDown = useCallback(
|
const handleKeyDown = useCallback(
|
||||||
(e: KeyboardEvent<HTMLTextAreaElement>) => {
|
(e: KeyboardEvent<HTMLTextAreaElement>) => {
|
||||||
// Escape key handling
|
|
||||||
if (e.key === 'Escape' && (mentionMenu.showMentionMenu || showSlashMenu)) {
|
if (e.key === 'Escape' && (mentionMenu.showMentionMenu || showSlashMenu)) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
if (mentionMenu.openSubmenuFor) {
|
if (mentionFolderNav?.isInFolder) {
|
||||||
mentionMenu.setOpenSubmenuFor(null)
|
mentionFolderNav.closeFolder()
|
||||||
mentionMenu.setSubmenuQueryStart(null)
|
mentionMenu.setSubmenuQueryStart(null)
|
||||||
|
} else if (slashFolderNav?.isInFolder) {
|
||||||
|
slashFolderNav.closeFolder()
|
||||||
} else {
|
} else {
|
||||||
mentionMenu.closeMentionMenu()
|
mentionMenu.closeMentionMenu()
|
||||||
setShowSlashMenu(false)
|
setShowSlashMenu(false)
|
||||||
@@ -411,65 +389,34 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Arrow navigation in slash menu
|
|
||||||
if (showSlashMenu) {
|
if (showSlashMenu) {
|
||||||
const TOP_LEVEL_COMMANDS = ['fast', 'plan', 'debug', 'research', 'deploy', 'superagent']
|
|
||||||
const WEB_COMMANDS = ['search', 'read', 'scrape', 'crawl']
|
|
||||||
const ALL_COMMANDS = [...TOP_LEVEL_COMMANDS, ...WEB_COMMANDS]
|
|
||||||
|
|
||||||
const caretPos = mentionMenu.getCaretPos()
|
const caretPos = mentionMenu.getCaretPos()
|
||||||
const activeSlash = mentionMenu.getActiveSlashQueryAtPosition(caretPos, message)
|
const activeSlash = mentionMenu.getActiveSlashQueryAtPosition(caretPos, message)
|
||||||
const query = activeSlash?.query.trim().toLowerCase() || ''
|
const query = activeSlash?.query.trim().toLowerCase() || ''
|
||||||
const showAggregatedView = query.length > 0
|
const showAggregatedView = query.length > 0
|
||||||
|
const direction = e.key === 'ArrowDown' ? 'down' : 'up'
|
||||||
|
const isInFolder = slashFolderNav?.isInFolder ?? false
|
||||||
|
|
||||||
if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
|
if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
|
|
||||||
if (mentionMenu.openSubmenuFor === 'Web') {
|
if (isInFolder) {
|
||||||
// Navigate in Web submenu
|
|
||||||
const last = WEB_COMMANDS.length - 1
|
|
||||||
mentionMenu.setSubmenuActiveIndex((prev) => {
|
mentionMenu.setSubmenuActiveIndex((prev) => {
|
||||||
const next =
|
const next = getNextIndex(prev, direction, WEB_COMMANDS.length - 1)
|
||||||
e.key === 'ArrowDown'
|
|
||||||
? prev >= last
|
|
||||||
? 0
|
|
||||||
: prev + 1
|
|
||||||
: prev <= 0
|
|
||||||
? last
|
|
||||||
: prev - 1
|
|
||||||
requestAnimationFrame(() => mentionMenu.scrollActiveItemIntoView(next))
|
requestAnimationFrame(() => mentionMenu.scrollActiveItemIntoView(next))
|
||||||
return next
|
return next
|
||||||
})
|
})
|
||||||
} else if (showAggregatedView) {
|
} else if (showAggregatedView) {
|
||||||
// Navigate in filtered view
|
const filtered = ALL_COMMAND_IDS.filter((cmd) => cmd.includes(query))
|
||||||
const filtered = ALL_COMMANDS.filter((cmd) => cmd.includes(query))
|
|
||||||
const last = Math.max(0, filtered.length - 1)
|
|
||||||
mentionMenu.setSubmenuActiveIndex((prev) => {
|
mentionMenu.setSubmenuActiveIndex((prev) => {
|
||||||
if (filtered.length === 0) return 0
|
if (filtered.length === 0) return 0
|
||||||
const next =
|
const next = getNextIndex(prev, direction, filtered.length - 1)
|
||||||
e.key === 'ArrowDown'
|
|
||||||
? prev >= last
|
|
||||||
? 0
|
|
||||||
: prev + 1
|
|
||||||
: prev <= 0
|
|
||||||
? last
|
|
||||||
: prev - 1
|
|
||||||
requestAnimationFrame(() => mentionMenu.scrollActiveItemIntoView(next))
|
requestAnimationFrame(() => mentionMenu.scrollActiveItemIntoView(next))
|
||||||
return next
|
return next
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
// Navigate in folder view (top-level + Web folder)
|
|
||||||
const totalItems = TOP_LEVEL_COMMANDS.length + 1 // +1 for Web folder
|
|
||||||
const last = totalItems - 1
|
|
||||||
mentionMenu.setMentionActiveIndex((prev) => {
|
mentionMenu.setMentionActiveIndex((prev) => {
|
||||||
const next =
|
const next = getNextIndex(prev, direction, TOP_LEVEL_COMMANDS.length)
|
||||||
e.key === 'ArrowDown'
|
|
||||||
? prev >= last
|
|
||||||
? 0
|
|
||||||
: prev + 1
|
|
||||||
: prev <= 0
|
|
||||||
? last
|
|
||||||
: prev - 1
|
|
||||||
requestAnimationFrame(() => mentionMenu.scrollActiveItemIntoView(next))
|
requestAnimationFrame(() => mentionMenu.scrollActiveItemIntoView(next))
|
||||||
return next
|
return next
|
||||||
})
|
})
|
||||||
@@ -477,69 +424,54 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Arrow right to enter Web submenu
|
|
||||||
if (e.key === 'ArrowRight') {
|
if (e.key === 'ArrowRight') {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
if (!showAggregatedView && !mentionMenu.openSubmenuFor) {
|
if (!showAggregatedView && !isInFolder) {
|
||||||
// Check if Web folder is selected (it's after all top-level commands)
|
|
||||||
if (mentionMenu.mentionActiveIndex === TOP_LEVEL_COMMANDS.length) {
|
if (mentionMenu.mentionActiveIndex === TOP_LEVEL_COMMANDS.length) {
|
||||||
mentionMenu.setOpenSubmenuFor('Web')
|
slashFolderNav?.openWebFolder()
|
||||||
mentionMenu.setSubmenuActiveIndex(0)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Arrow left to exit submenu
|
|
||||||
if (e.key === 'ArrowLeft') {
|
if (e.key === 'ArrowLeft') {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
if (mentionMenu.openSubmenuFor) {
|
if (isInFolder) {
|
||||||
mentionMenu.setOpenSubmenuFor(null)
|
slashFolderNav?.closeFolder()
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Arrow navigation in mention menu
|
|
||||||
if (mentionKeyboard.handleArrowNavigation(e)) return
|
if (mentionKeyboard.handleArrowNavigation(e)) return
|
||||||
if (mentionKeyboard.handleArrowRight(e)) return
|
if (mentionKeyboard.handleArrowRight(e)) return
|
||||||
if (mentionKeyboard.handleArrowLeft(e)) return
|
if (mentionKeyboard.handleArrowLeft(e)) return
|
||||||
|
|
||||||
// Enter key handling
|
|
||||||
if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {
|
if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
if (showSlashMenu) {
|
if (showSlashMenu) {
|
||||||
const TOP_LEVEL_COMMANDS = ['fast', 'plan', 'debug', 'research', 'deploy', 'superagent']
|
|
||||||
const WEB_COMMANDS = ['search', 'read', 'scrape', 'crawl']
|
|
||||||
const ALL_COMMANDS = [...TOP_LEVEL_COMMANDS, ...WEB_COMMANDS]
|
|
||||||
|
|
||||||
const caretPos = mentionMenu.getCaretPos()
|
const caretPos = mentionMenu.getCaretPos()
|
||||||
const activeSlash = mentionMenu.getActiveSlashQueryAtPosition(caretPos, message)
|
const activeSlash = mentionMenu.getActiveSlashQueryAtPosition(caretPos, message)
|
||||||
const query = activeSlash?.query.trim().toLowerCase() || ''
|
const query = activeSlash?.query.trim().toLowerCase() || ''
|
||||||
const showAggregatedView = query.length > 0
|
const showAggregatedView = query.length > 0
|
||||||
|
const isInFolder = slashFolderNav?.isInFolder ?? false
|
||||||
|
|
||||||
if (mentionMenu.openSubmenuFor === 'Web') {
|
if (isInFolder) {
|
||||||
// Select from Web submenu
|
|
||||||
const selectedCommand =
|
const selectedCommand =
|
||||||
WEB_COMMANDS[mentionMenu.submenuActiveIndex] || WEB_COMMANDS[0]
|
WEB_COMMANDS[mentionMenu.submenuActiveIndex]?.id || WEB_COMMANDS[0].id
|
||||||
handleSlashCommandSelect(selectedCommand)
|
handleSlashCommandSelect(selectedCommand)
|
||||||
} else if (showAggregatedView) {
|
} else if (showAggregatedView) {
|
||||||
// Select from filtered view
|
const filtered = ALL_COMMAND_IDS.filter((cmd) => cmd.includes(query))
|
||||||
const filtered = ALL_COMMANDS.filter((cmd) => cmd.includes(query))
|
|
||||||
if (filtered.length > 0) {
|
if (filtered.length > 0) {
|
||||||
const selectedCommand = filtered[mentionMenu.submenuActiveIndex] || filtered[0]
|
const selectedCommand = filtered[mentionMenu.submenuActiveIndex] || filtered[0]
|
||||||
handleSlashCommandSelect(selectedCommand)
|
handleSlashCommandSelect(selectedCommand)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Folder navigation view
|
|
||||||
const selectedIndex = mentionMenu.mentionActiveIndex
|
const selectedIndex = mentionMenu.mentionActiveIndex
|
||||||
if (selectedIndex < TOP_LEVEL_COMMANDS.length) {
|
if (selectedIndex < TOP_LEVEL_COMMANDS.length) {
|
||||||
// Top-level command selected
|
handleSlashCommandSelect(TOP_LEVEL_COMMANDS[selectedIndex].id)
|
||||||
handleSlashCommandSelect(TOP_LEVEL_COMMANDS[selectedIndex])
|
|
||||||
} else if (selectedIndex === TOP_LEVEL_COMMANDS.length) {
|
} else if (selectedIndex === TOP_LEVEL_COMMANDS.length) {
|
||||||
// Web folder selected - open it
|
slashFolderNav?.openWebFolder()
|
||||||
mentionMenu.setOpenSubmenuFor('Web')
|
|
||||||
mentionMenu.setSubmenuActiveIndex(0)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@@ -552,7 +484,6 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle mention token behavior (backspace, delete, arrow keys) when menu is closed
|
|
||||||
if (!mentionMenu.showMentionMenu) {
|
if (!mentionMenu.showMentionMenu) {
|
||||||
const textarea = mentionMenu.textareaRef.current
|
const textarea = mentionMenu.textareaRef.current
|
||||||
const selStart = textarea?.selectionStart ?? 0
|
const selStart = textarea?.selectionStart ?? 0
|
||||||
@@ -561,11 +492,8 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
|
|
||||||
if (e.key === 'Backspace' || e.key === 'Delete') {
|
if (e.key === 'Backspace' || e.key === 'Delete') {
|
||||||
if (selectionLength > 0) {
|
if (selectionLength > 0) {
|
||||||
// Multi-character selection: Clean up contexts for any overlapping mentions
|
|
||||||
// but let the default behavior handle the actual text deletion
|
|
||||||
mentionTokensWithContext.removeContextsInSelection(selStart, selEnd)
|
mentionTokensWithContext.removeContextsInSelection(selStart, selEnd)
|
||||||
} else {
|
} else {
|
||||||
// Single character delete - check if cursor is inside/at a mention token
|
|
||||||
const ranges = mentionTokensWithContext.computeMentionRanges()
|
const ranges = mentionTokensWithContext.computeMentionRanges()
|
||||||
const target =
|
const target =
|
||||||
e.key === 'Backspace'
|
e.key === 'Backspace'
|
||||||
@@ -604,7 +532,6 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prevent typing inside token
|
|
||||||
if (e.key.length === 1 || e.key === 'Space') {
|
if (e.key.length === 1 || e.key === 'Space') {
|
||||||
const blocked =
|
const blocked =
|
||||||
selectionLength === 0 && !!mentionTokensWithContext.findRangeContaining(selStart)
|
selectionLength === 0 && !!mentionTokensWithContext.findRangeContaining(selStart)
|
||||||
@@ -629,6 +556,8 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
message,
|
message,
|
||||||
mentionTokensWithContext,
|
mentionTokensWithContext,
|
||||||
showSlashMenu,
|
showSlashMenu,
|
||||||
|
slashFolderNav,
|
||||||
|
mentionFolderNav,
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -637,21 +566,17 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
const newValue = e.target.value
|
const newValue = e.target.value
|
||||||
setMessage(newValue)
|
setMessage(newValue)
|
||||||
|
|
||||||
// Skip mention menu logic if mentions are disabled
|
|
||||||
if (disableMentions) return
|
if (disableMentions) return
|
||||||
|
|
||||||
const caret = e.target.selectionStart ?? newValue.length
|
const caret = e.target.selectionStart ?? newValue.length
|
||||||
|
|
||||||
// Check for @ mention trigger
|
|
||||||
const activeMention = mentionMenu.getActiveMentionQueryAtPosition(caret, newValue)
|
const activeMention = mentionMenu.getActiveMentionQueryAtPosition(caret, newValue)
|
||||||
// Check for / slash command trigger
|
|
||||||
const activeSlash = mentionMenu.getActiveSlashQueryAtPosition(caret, newValue)
|
const activeSlash = mentionMenu.getActiveSlashQueryAtPosition(caret, newValue)
|
||||||
|
|
||||||
if (activeMention) {
|
if (activeMention) {
|
||||||
setShowSlashMenu(false)
|
setShowSlashMenu(false)
|
||||||
mentionMenu.setShowMentionMenu(true)
|
mentionMenu.setShowMentionMenu(true)
|
||||||
mentionMenu.setInAggregated(false)
|
mentionMenu.setInAggregated(false)
|
||||||
if (mentionMenu.openSubmenuFor) {
|
if (mentionFolderNav?.isInFolder) {
|
||||||
mentionMenu.setSubmenuActiveIndex(0)
|
mentionMenu.setSubmenuActiveIndex(0)
|
||||||
} else {
|
} else {
|
||||||
mentionMenu.setMentionActiveIndex(0)
|
mentionMenu.setMentionActiveIndex(0)
|
||||||
@@ -670,7 +595,7 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
setShowSlashMenu(false)
|
setShowSlashMenu(false)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[setMessage, mentionMenu, disableMentions]
|
[setMessage, mentionMenu, disableMentions, mentionFolderNav]
|
||||||
)
|
)
|
||||||
|
|
||||||
const handleSelectAdjust = useCallback(() => {
|
const handleSelectAdjust = useCallback(() => {
|
||||||
@@ -686,84 +611,66 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
}
|
}
|
||||||
}, [mentionMenu.textareaRef, mentionTokensWithContext])
|
}, [mentionMenu.textareaRef, mentionTokensWithContext])
|
||||||
|
|
||||||
const handleOpenMentionMenuWithAt = useCallback(() => {
|
const insertTriggerAndOpenMenu = useCallback(
|
||||||
if (disabled || isLoading) return
|
(trigger: '@' | '/') => {
|
||||||
const textarea = mentionMenu.textareaRef.current
|
if (disabled || isLoading) return
|
||||||
if (!textarea) return
|
const textarea = mentionMenu.textareaRef.current
|
||||||
textarea.focus()
|
if (!textarea) return
|
||||||
const pos = textarea.selectionStart ?? message.length
|
|
||||||
const needsSpaceBefore = pos > 0 && !/\s/.test(message.charAt(pos - 1))
|
|
||||||
|
|
||||||
const insertText = needsSpaceBefore ? ' @' : '@'
|
|
||||||
const start = textarea.selectionStart ?? message.length
|
|
||||||
const end = textarea.selectionEnd ?? message.length
|
|
||||||
const before = message.slice(0, start)
|
|
||||||
const after = message.slice(end)
|
|
||||||
const next = `${before}${insertText}${after}`
|
|
||||||
setMessage(next)
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
const newPos = before.length + insertText.length
|
|
||||||
textarea.setSelectionRange(newPos, newPos)
|
|
||||||
textarea.focus()
|
textarea.focus()
|
||||||
}, 0)
|
const start = textarea.selectionStart ?? message.length
|
||||||
|
const end = textarea.selectionEnd ?? message.length
|
||||||
|
const needsSpaceBefore = start > 0 && !/\s/.test(message.charAt(start - 1))
|
||||||
|
|
||||||
mentionMenu.setShowMentionMenu(true)
|
const insertText = needsSpaceBefore ? ` ${trigger}` : trigger
|
||||||
mentionMenu.setOpenSubmenuFor(null)
|
const before = message.slice(0, start)
|
||||||
mentionMenu.setMentionActiveIndex(0)
|
const after = message.slice(end)
|
||||||
mentionMenu.setSubmenuActiveIndex(0)
|
setMessage(`${before}${insertText}${after}`)
|
||||||
}, [disabled, isLoading, mentionMenu, message, setMessage])
|
|
||||||
|
|
||||||
const handleOpenSlashMenu = useCallback(() => {
|
setTimeout(() => {
|
||||||
if (disabled || isLoading) return
|
const newPos = before.length + insertText.length
|
||||||
const textarea = mentionMenu.textareaRef.current
|
textarea.setSelectionRange(newPos, newPos)
|
||||||
if (!textarea) return
|
textarea.focus()
|
||||||
textarea.focus()
|
}, 0)
|
||||||
const pos = textarea.selectionStart ?? message.length
|
|
||||||
const needsSpaceBefore = pos > 0 && !/\s/.test(message.charAt(pos - 1))
|
|
||||||
|
|
||||||
const insertText = needsSpaceBefore ? ' /' : '/'
|
if (trigger === '@') {
|
||||||
const start = textarea.selectionStart ?? message.length
|
mentionMenu.setShowMentionMenu(true)
|
||||||
const end = textarea.selectionEnd ?? message.length
|
mentionMenu.setOpenSubmenuFor(null)
|
||||||
const before = message.slice(0, start)
|
mentionMenu.setMentionActiveIndex(0)
|
||||||
const after = message.slice(end)
|
} else {
|
||||||
const next = `${before}${insertText}${after}`
|
setShowSlashMenu(true)
|
||||||
setMessage(next)
|
}
|
||||||
|
mentionMenu.setSubmenuActiveIndex(0)
|
||||||
|
},
|
||||||
|
[disabled, isLoading, mentionMenu, message, setMessage]
|
||||||
|
)
|
||||||
|
|
||||||
setTimeout(() => {
|
const handleOpenMentionMenuWithAt = useCallback(
|
||||||
const newPos = before.length + insertText.length
|
() => insertTriggerAndOpenMenu('@'),
|
||||||
textarea.setSelectionRange(newPos, newPos)
|
[insertTriggerAndOpenMenu]
|
||||||
textarea.focus()
|
)
|
||||||
}, 0)
|
|
||||||
|
|
||||||
setShowSlashMenu(true)
|
const handleOpenSlashMenu = useCallback(
|
||||||
mentionMenu.setSubmenuActiveIndex(0)
|
() => insertTriggerAndOpenMenu('/'),
|
||||||
}, [disabled, isLoading, mentionMenu, message, setMessage])
|
[insertTriggerAndOpenMenu]
|
||||||
|
)
|
||||||
|
|
||||||
const canSubmit = message.trim().length > 0 && !disabled && !isLoading
|
const canSubmit = message.trim().length > 0 && !disabled && !isLoading
|
||||||
const showAbortButton = isLoading && onAbort
|
const showAbortButton = isLoading && onAbort
|
||||||
|
|
||||||
// Render overlay content with highlighted mentions
|
|
||||||
const renderOverlayContent = useCallback(() => {
|
const renderOverlayContent = useCallback(() => {
|
||||||
const contexts = contextManagement.selectedContexts
|
const contexts = contextManagement.selectedContexts
|
||||||
|
|
||||||
// Handle empty message
|
|
||||||
if (!message) {
|
if (!message) {
|
||||||
return <span>{'\u00A0'}</span>
|
return <span>{'\u00A0'}</span>
|
||||||
}
|
}
|
||||||
|
|
||||||
// If no contexts, render the message directly with proper newline handling
|
|
||||||
if (contexts.length === 0) {
|
if (contexts.length === 0) {
|
||||||
// Add a zero-width space at the end if message ends with newline
|
|
||||||
// This ensures the newline is rendered and height is calculated correctly
|
|
||||||
const displayText = message.endsWith('\n') ? `${message}\u200B` : message
|
const displayText = message.endsWith('\n') ? `${message}\u200B` : message
|
||||||
return <span>{displayText}</span>
|
return <span>{displayText}</span>
|
||||||
}
|
}
|
||||||
|
|
||||||
const elements: React.ReactNode[] = []
|
const elements: React.ReactNode[] = []
|
||||||
const labels = contexts.map((c) => c.label).filter(Boolean)
|
|
||||||
|
|
||||||
// Build ranges for all mentions to highlight them including spaces
|
|
||||||
const ranges = mentionTokensWithContext.computeMentionRanges()
|
const ranges = mentionTokensWithContext.computeMentionRanges()
|
||||||
|
|
||||||
if (ranges.length === 0) {
|
if (ranges.length === 0) {
|
||||||
@@ -775,14 +682,11 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
for (let i = 0; i < ranges.length; i++) {
|
for (let i = 0; i < ranges.length; i++) {
|
||||||
const range = ranges[i]
|
const range = ranges[i]
|
||||||
|
|
||||||
// Add text before mention
|
|
||||||
if (range.start > lastIndex) {
|
if (range.start > lastIndex) {
|
||||||
const before = message.slice(lastIndex, range.start)
|
const before = message.slice(lastIndex, range.start)
|
||||||
elements.push(<span key={`text-${i}-${lastIndex}-${range.start}`}>{before}</span>)
|
elements.push(<span key={`text-${i}-${lastIndex}-${range.start}`}>{before}</span>)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add highlighted mention (including spaces)
|
|
||||||
// Use index + start + end to ensure unique keys even with duplicate contexts
|
|
||||||
const mentionText = message.slice(range.start, range.end)
|
const mentionText = message.slice(range.start, range.end)
|
||||||
elements.push(
|
elements.push(
|
||||||
<span
|
<span
|
||||||
@@ -797,12 +701,10 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
|
|
||||||
const tail = message.slice(lastIndex)
|
const tail = message.slice(lastIndex)
|
||||||
if (tail) {
|
if (tail) {
|
||||||
// Add a zero-width space at the end if tail ends with newline
|
|
||||||
const displayTail = tail.endsWith('\n') ? `${tail}\u200B` : tail
|
const displayTail = tail.endsWith('\n') ? `${tail}\u200B` : tail
|
||||||
elements.push(<span key={`tail-${lastIndex}`}>{displayTail}</span>)
|
elements.push(<span key={`tail-${lastIndex}`}>{displayTail}</span>)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure there's always something to render for height calculation
|
|
||||||
return elements.length > 0 ? elements : <span>{'\u00A0'}</span>
|
return elements.length > 0 ? elements : <span>{'\u00A0'}</span>
|
||||||
}, [message, contextManagement.selectedContexts, mentionTokensWithContext])
|
}, [message, contextManagement.selectedContexts, mentionTokensWithContext])
|
||||||
|
|
||||||
@@ -926,6 +828,7 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
mentionData={mentionData}
|
mentionData={mentionData}
|
||||||
message={message}
|
message={message}
|
||||||
insertHandlers={insertHandlers}
|
insertHandlers={insertHandlers}
|
||||||
|
onFolderNavChange={setMentionFolderNav}
|
||||||
/>,
|
/>,
|
||||||
document.body
|
document.body
|
||||||
)}
|
)}
|
||||||
@@ -938,6 +841,7 @@ const UserInput = forwardRef<UserInputRef, UserInputProps>(
|
|||||||
mentionMenu={mentionMenu}
|
mentionMenu={mentionMenu}
|
||||||
message={message}
|
message={message}
|
||||||
onSelectCommand={handleSlashCommandSelect}
|
onSelectCommand={handleSlashCommandSelect}
|
||||||
|
onFolderNavChange={setSlashFolderNav}
|
||||||
/>,
|
/>,
|
||||||
document.body
|
document.body
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -0,0 +1,149 @@
|
|||||||
|
import {
|
||||||
|
FOLDER_CONFIGS,
|
||||||
|
type MentionFolderId,
|
||||||
|
} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/constants'
|
||||||
|
import type { MentionDataReturn } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks/use-mention-data'
|
||||||
|
import type { ChatContext } from '@/stores/panel'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the data array for a folder ID from mentionData.
|
||||||
|
* Uses FOLDER_CONFIGS as the source of truth for key mapping.
|
||||||
|
* Returns any[] since item types vary by folder and are used with dynamic config.filterFn
|
||||||
|
*/
|
||||||
|
export function getFolderData(mentionData: MentionDataReturn, folderId: MentionFolderId): any[] {
|
||||||
|
const config = FOLDER_CONFIGS[folderId]
|
||||||
|
return (mentionData[config.dataKey as keyof MentionDataReturn] as any[]) || []
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the loading state for a folder ID from mentionData.
|
||||||
|
* Uses FOLDER_CONFIGS as the source of truth for key mapping.
|
||||||
|
*/
|
||||||
|
export function getFolderLoading(
|
||||||
|
mentionData: MentionDataReturn,
|
||||||
|
folderId: MentionFolderId
|
||||||
|
): boolean {
|
||||||
|
const config = FOLDER_CONFIGS[folderId]
|
||||||
|
return mentionData[config.loadingKey as keyof MentionDataReturn] as boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the ensure loaded function for a folder ID from mentionData.
|
||||||
|
* Uses FOLDER_CONFIGS as the source of truth for key mapping.
|
||||||
|
*/
|
||||||
|
export function getFolderEnsureLoaded(
|
||||||
|
mentionData: MentionDataReturn,
|
||||||
|
folderId: MentionFolderId
|
||||||
|
): (() => Promise<void>) | undefined {
|
||||||
|
const config = FOLDER_CONFIGS[folderId]
|
||||||
|
if (!config.ensureLoadedKey) return undefined
|
||||||
|
return mentionData[config.ensureLoadedKey as keyof MentionDataReturn] as
|
||||||
|
| (() => Promise<void>)
|
||||||
|
| undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract specific ChatContext types for type-safe narrowing
|
||||||
|
*/
|
||||||
|
type PastChatContext = Extract<ChatContext, { kind: 'past_chat' }>
|
||||||
|
type WorkflowContext = Extract<ChatContext, { kind: 'workflow' }>
|
||||||
|
type CurrentWorkflowContext = Extract<ChatContext, { kind: 'current_workflow' }>
|
||||||
|
type BlocksContext = Extract<ChatContext, { kind: 'blocks' }>
|
||||||
|
type WorkflowBlockContext = Extract<ChatContext, { kind: 'workflow_block' }>
|
||||||
|
type KnowledgeContext = Extract<ChatContext, { kind: 'knowledge' }>
|
||||||
|
type TemplatesContext = Extract<ChatContext, { kind: 'templates' }>
|
||||||
|
type LogsContext = Extract<ChatContext, { kind: 'logs' }>
|
||||||
|
type SlashCommandContext = Extract<ChatContext, { kind: 'slash_command' }>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if two contexts of the same kind are equal by their ID fields.
|
||||||
|
* Assumes c.kind === context.kind (must be checked before calling).
|
||||||
|
*/
|
||||||
|
export function areContextsEqual(c: ChatContext, context: ChatContext): boolean {
|
||||||
|
switch (c.kind) {
|
||||||
|
case 'past_chat': {
|
||||||
|
const ctx = context as PastChatContext
|
||||||
|
return c.chatId === ctx.chatId
|
||||||
|
}
|
||||||
|
case 'workflow': {
|
||||||
|
const ctx = context as WorkflowContext
|
||||||
|
return c.workflowId === ctx.workflowId
|
||||||
|
}
|
||||||
|
case 'current_workflow': {
|
||||||
|
const ctx = context as CurrentWorkflowContext
|
||||||
|
return c.workflowId === ctx.workflowId
|
||||||
|
}
|
||||||
|
case 'blocks': {
|
||||||
|
const ctx = context as BlocksContext
|
||||||
|
const existingIds = c.blockIds || []
|
||||||
|
const newIds = ctx.blockIds || []
|
||||||
|
return existingIds.some((id) => newIds.includes(id))
|
||||||
|
}
|
||||||
|
case 'workflow_block': {
|
||||||
|
const ctx = context as WorkflowBlockContext
|
||||||
|
return c.workflowId === ctx.workflowId && c.blockId === ctx.blockId
|
||||||
|
}
|
||||||
|
case 'knowledge': {
|
||||||
|
const ctx = context as KnowledgeContext
|
||||||
|
return c.knowledgeId === ctx.knowledgeId
|
||||||
|
}
|
||||||
|
case 'templates': {
|
||||||
|
const ctx = context as TemplatesContext
|
||||||
|
return c.templateId === ctx.templateId
|
||||||
|
}
|
||||||
|
case 'logs': {
|
||||||
|
const ctx = context as LogsContext
|
||||||
|
return c.executionId === ctx.executionId
|
||||||
|
}
|
||||||
|
case 'docs':
|
||||||
|
return true // Only one docs context allowed
|
||||||
|
case 'slash_command': {
|
||||||
|
const ctx = context as SlashCommandContext
|
||||||
|
return c.command === ctx.command
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a context from a list, returning a new filtered list.
|
||||||
|
*/
|
||||||
|
export function filterOutContext(
|
||||||
|
contexts: ChatContext[],
|
||||||
|
contextToRemove: ChatContext
|
||||||
|
): ChatContext[] {
|
||||||
|
return contexts.filter((c) => {
|
||||||
|
if (c.kind !== contextToRemove.kind) return true
|
||||||
|
return !areContextsEqual(c, contextToRemove)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a context already exists in selected contexts.
|
||||||
|
*
|
||||||
|
* The token system uses @label format, so we cannot have duplicate labels
|
||||||
|
* regardless of kind or ID differences.
|
||||||
|
*
|
||||||
|
* @param context - Context to check
|
||||||
|
* @param selectedContexts - Currently selected contexts
|
||||||
|
* @returns True if context already exists or label is already used
|
||||||
|
*/
|
||||||
|
export function isContextAlreadySelected(
|
||||||
|
context: ChatContext,
|
||||||
|
selectedContexts: ChatContext[]
|
||||||
|
): boolean {
|
||||||
|
return selectedContexts.some((c) => {
|
||||||
|
// CRITICAL: Check label collision FIRST
|
||||||
|
// The token system uses @label format, so we cannot have duplicate labels
|
||||||
|
// regardless of kind or ID differences
|
||||||
|
if (c.label && context.label && c.label === context.label) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Secondary check: exact duplicate by ID fields
|
||||||
|
if (c.kind !== context.kind) return false
|
||||||
|
|
||||||
|
return areContextsEqual(c, context)
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -20,7 +20,13 @@ import {
|
|||||||
extractFieldsFromSchema,
|
extractFieldsFromSchema,
|
||||||
parseResponseFormatSafely,
|
parseResponseFormatSafely,
|
||||||
} from '@/lib/core/utils/response-format'
|
} from '@/lib/core/utils/response-format'
|
||||||
import { getBlockOutputPaths, getBlockOutputType } from '@/lib/workflows/blocks/block-outputs'
|
import {
|
||||||
|
getBlockOutputPaths,
|
||||||
|
getBlockOutputType,
|
||||||
|
getOutputPathsFromSchema,
|
||||||
|
getToolOutputPaths,
|
||||||
|
getToolOutputType,
|
||||||
|
} from '@/lib/workflows/blocks/block-outputs'
|
||||||
import { TRIGGER_TYPES } from '@/lib/workflows/triggers/triggers'
|
import { TRIGGER_TYPES } from '@/lib/workflows/triggers/triggers'
|
||||||
import { KeyboardNavigationHandler } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/components/keyboard-navigation-handler'
|
import { KeyboardNavigationHandler } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/components/keyboard-navigation-handler'
|
||||||
import type {
|
import type {
|
||||||
@@ -38,7 +44,6 @@ import { useSubBlockStore } from '@/stores/workflows/subblock/store'
|
|||||||
import { normalizeName } from '@/stores/workflows/utils'
|
import { normalizeName } from '@/stores/workflows/utils'
|
||||||
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
|
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
|
||||||
import type { BlockState } from '@/stores/workflows/workflow/types'
|
import type { BlockState } from '@/stores/workflows/workflow/types'
|
||||||
import { getTool } from '@/tools/utils'
|
|
||||||
|
|
||||||
const logger = createLogger('TagDropdown')
|
const logger = createLogger('TagDropdown')
|
||||||
|
|
||||||
@@ -68,6 +73,12 @@ interface TagDropdownProps {
|
|||||||
inputRef?: React.RefObject<HTMLTextAreaElement | HTMLInputElement>
|
inputRef?: React.RefObject<HTMLTextAreaElement | HTMLInputElement>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface TagComputationResult {
|
||||||
|
tags: string[]
|
||||||
|
variableInfoMap: Record<string, { type: string; id: string }>
|
||||||
|
blockTagGroups: BlockTagGroup[]
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the tag trigger (`<`) should show the tag dropdown.
|
* Checks if the tag trigger (`<`) should show the tag dropdown.
|
||||||
*
|
*
|
||||||
@@ -218,161 +229,6 @@ const getOutputTypeForPath = (
|
|||||||
return 'any'
|
return 'any'
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Recursively generates all output paths from an outputs schema.
|
|
||||||
*
|
|
||||||
* @remarks
|
|
||||||
* Traverses nested objects and arrays to build dot-separated paths
|
|
||||||
* for all leaf values in the schema.
|
|
||||||
*
|
|
||||||
* @param outputs - The outputs schema object
|
|
||||||
* @param prefix - Current path prefix for recursion
|
|
||||||
* @returns Array of dot-separated paths to all output fields
|
|
||||||
*/
|
|
||||||
const generateOutputPaths = (outputs: Record<string, any>, prefix = ''): string[] => {
|
|
||||||
const paths: string[] = []
|
|
||||||
|
|
||||||
for (const [key, value] of Object.entries(outputs)) {
|
|
||||||
const currentPath = prefix ? `${prefix}.${key}` : key
|
|
||||||
|
|
||||||
if (typeof value === 'string') {
|
|
||||||
paths.push(currentPath)
|
|
||||||
} else if (typeof value === 'object' && value !== null) {
|
|
||||||
if ('type' in value && typeof value.type === 'string') {
|
|
||||||
const hasNestedProperties =
|
|
||||||
((value.type === 'object' || value.type === 'json') && value.properties) ||
|
|
||||||
(value.type === 'array' && value.items?.properties) ||
|
|
||||||
(value.type === 'array' &&
|
|
||||||
value.items &&
|
|
||||||
typeof value.items === 'object' &&
|
|
||||||
!('type' in value.items))
|
|
||||||
|
|
||||||
if (!hasNestedProperties) {
|
|
||||||
paths.push(currentPath)
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((value.type === 'object' || value.type === 'json') && value.properties) {
|
|
||||||
paths.push(...generateOutputPaths(value.properties, currentPath))
|
|
||||||
} else if (value.type === 'array' && value.items?.properties) {
|
|
||||||
paths.push(...generateOutputPaths(value.items.properties, currentPath))
|
|
||||||
} else if (
|
|
||||||
value.type === 'array' &&
|
|
||||||
value.items &&
|
|
||||||
typeof value.items === 'object' &&
|
|
||||||
!('type' in value.items)
|
|
||||||
) {
|
|
||||||
paths.push(...generateOutputPaths(value.items, currentPath))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const subPaths = generateOutputPaths(value, currentPath)
|
|
||||||
paths.push(...subPaths)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
paths.push(currentPath)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return paths
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Recursively generates all output paths with their types from an outputs schema.
|
|
||||||
*
|
|
||||||
* @remarks
|
|
||||||
* Similar to generateOutputPaths but also captures the type information
|
|
||||||
* for each path, useful for displaying type hints in the UI.
|
|
||||||
*
|
|
||||||
* @param outputs - The outputs schema object
|
|
||||||
* @param prefix - Current path prefix for recursion
|
|
||||||
* @returns Array of objects containing path and type for each output field
|
|
||||||
*/
|
|
||||||
const generateOutputPathsWithTypes = (
|
|
||||||
outputs: Record<string, any>,
|
|
||||||
prefix = ''
|
|
||||||
): Array<{ path: string; type: string }> => {
|
|
||||||
const paths: Array<{ path: string; type: string }> = []
|
|
||||||
|
|
||||||
for (const [key, value] of Object.entries(outputs)) {
|
|
||||||
const currentPath = prefix ? `${prefix}.${key}` : key
|
|
||||||
|
|
||||||
if (typeof value === 'string') {
|
|
||||||
paths.push({ path: currentPath, type: value })
|
|
||||||
} else if (typeof value === 'object' && value !== null) {
|
|
||||||
if ('type' in value && typeof value.type === 'string') {
|
|
||||||
if (value.type === 'array' && value.items?.properties) {
|
|
||||||
paths.push({ path: currentPath, type: 'array' })
|
|
||||||
const subPaths = generateOutputPathsWithTypes(value.items.properties, currentPath)
|
|
||||||
paths.push(...subPaths)
|
|
||||||
} else if ((value.type === 'object' || value.type === 'json') && value.properties) {
|
|
||||||
paths.push({ path: currentPath, type: value.type })
|
|
||||||
const subPaths = generateOutputPathsWithTypes(value.properties, currentPath)
|
|
||||||
paths.push(...subPaths)
|
|
||||||
} else {
|
|
||||||
paths.push({ path: currentPath, type: value.type })
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const subPaths = generateOutputPathsWithTypes(value, currentPath)
|
|
||||||
paths.push(...subPaths)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
paths.push({ path: currentPath, type: 'any' })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return paths
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates output paths for a tool-based block.
|
|
||||||
*
|
|
||||||
* @param blockConfig - The block configuration containing tools config
|
|
||||||
* @param operation - The selected operation for the tool
|
|
||||||
* @returns Array of output paths for the tool, or empty array on error
|
|
||||||
*/
|
|
||||||
const generateToolOutputPaths = (blockConfig: BlockConfig, operation: string): string[] => {
|
|
||||||
if (!blockConfig?.tools?.config?.tool) return []
|
|
||||||
|
|
||||||
try {
|
|
||||||
const toolId = blockConfig.tools.config.tool({ operation })
|
|
||||||
if (!toolId) return []
|
|
||||||
|
|
||||||
const toolConfig = getTool(toolId)
|
|
||||||
if (!toolConfig?.outputs) return []
|
|
||||||
|
|
||||||
return generateOutputPaths(toolConfig.outputs)
|
|
||||||
} catch (error) {
|
|
||||||
logger.warn('Failed to get tool outputs for operation', { operation, error })
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the output type for a specific path in a tool's outputs.
|
|
||||||
*
|
|
||||||
* @param blockConfig - The block configuration containing tools config
|
|
||||||
* @param operation - The selected operation for the tool
|
|
||||||
* @param path - The dot-separated path to the output field
|
|
||||||
* @returns The type of the output field, or 'any' if not found
|
|
||||||
*/
|
|
||||||
const getToolOutputType = (blockConfig: BlockConfig, operation: string, path: string): string => {
|
|
||||||
if (!blockConfig?.tools?.config?.tool) return 'any'
|
|
||||||
|
|
||||||
try {
|
|
||||||
const toolId = blockConfig.tools.config.tool({ operation })
|
|
||||||
if (!toolId) return 'any'
|
|
||||||
|
|
||||||
const toolConfig = getTool(toolId)
|
|
||||||
if (!toolConfig?.outputs) return 'any'
|
|
||||||
|
|
||||||
const pathsWithTypes = generateOutputPathsWithTypes(toolConfig.outputs)
|
|
||||||
const matchingPath = pathsWithTypes.find((p) => p.path === path)
|
|
||||||
return matchingPath?.type || 'any'
|
|
||||||
} catch (error) {
|
|
||||||
logger.warn('Failed to get tool output type for path', { path, error })
|
|
||||||
return 'any'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculates the viewport position of the caret in a textarea/input.
|
* Calculates the viewport position of the caret in a textarea/input.
|
||||||
*
|
*
|
||||||
@@ -601,14 +457,16 @@ export const TagDropdown: React.FC<TagDropdownProps> = ({
|
|||||||
[inputValue, cursorPosition]
|
[inputValue, cursorPosition]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const emptyVariableInfoMap: Record<string, { type: string; id: string }> = {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Computes tags, variable info, and block tag groups
|
* Computes tags, variable info, and block tag groups
|
||||||
*/
|
*/
|
||||||
const { tags, variableInfoMap, blockTagGroups } = useMemo(() => {
|
const { tags, variableInfoMap, blockTagGroups } = useMemo<TagComputationResult>(() => {
|
||||||
if (activeSourceBlockId) {
|
if (activeSourceBlockId) {
|
||||||
const sourceBlock = blocks[activeSourceBlockId]
|
const sourceBlock = blocks[activeSourceBlockId]
|
||||||
if (!sourceBlock) {
|
if (!sourceBlock) {
|
||||||
return { tags: [], variableInfoMap: {}, blockTagGroups: [] }
|
return { tags: [], variableInfoMap: emptyVariableInfoMap, blockTagGroups: [] }
|
||||||
}
|
}
|
||||||
|
|
||||||
const blockConfig = getBlock(sourceBlock.type)
|
const blockConfig = getBlock(sourceBlock.type)
|
||||||
@@ -619,7 +477,7 @@ export const TagDropdown: React.FC<TagDropdownProps> = ({
|
|||||||
const blockName = sourceBlock.name || sourceBlock.type
|
const blockName = sourceBlock.name || sourceBlock.type
|
||||||
const normalizedBlockName = normalizeName(blockName)
|
const normalizedBlockName = normalizeName(blockName)
|
||||||
|
|
||||||
const outputPaths = generateOutputPaths(mockConfig.outputs)
|
const outputPaths = getOutputPathsFromSchema(mockConfig.outputs)
|
||||||
const blockTags = outputPaths.map((path) => `${normalizedBlockName}.${path}`)
|
const blockTags = outputPaths.map((path) => `${normalizedBlockName}.${path}`)
|
||||||
|
|
||||||
const blockTagGroups: BlockTagGroup[] = [
|
const blockTagGroups: BlockTagGroup[] = [
|
||||||
@@ -632,9 +490,9 @@ export const TagDropdown: React.FC<TagDropdownProps> = ({
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
return { tags: blockTags, variableInfoMap: {}, blockTagGroups }
|
return { tags: blockTags, variableInfoMap: emptyVariableInfoMap, blockTagGroups }
|
||||||
}
|
}
|
||||||
return { tags: [], variableInfoMap: {}, blockTagGroups: [] }
|
return { tags: [], variableInfoMap: emptyVariableInfoMap, blockTagGroups: [] }
|
||||||
}
|
}
|
||||||
|
|
||||||
const blockName = sourceBlock.name || sourceBlock.type
|
const blockName = sourceBlock.name || sourceBlock.type
|
||||||
@@ -777,7 +635,7 @@ export const TagDropdown: React.FC<TagDropdownProps> = ({
|
|||||||
const operationValue =
|
const operationValue =
|
||||||
mergedSubBlocks?.operation?.value ?? getSubBlockValue(activeSourceBlockId, 'operation')
|
mergedSubBlocks?.operation?.value ?? getSubBlockValue(activeSourceBlockId, 'operation')
|
||||||
const toolOutputPaths = operationValue
|
const toolOutputPaths = operationValue
|
||||||
? generateToolOutputPaths(blockConfig, operationValue)
|
? getToolOutputPaths(blockConfig, operationValue)
|
||||||
: []
|
: []
|
||||||
|
|
||||||
if (toolOutputPaths.length > 0) {
|
if (toolOutputPaths.length > 0) {
|
||||||
@@ -810,12 +668,12 @@ export const TagDropdown: React.FC<TagDropdownProps> = ({
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
return { tags: blockTags, variableInfoMap: {}, blockTagGroups }
|
return { tags: blockTags, variableInfoMap: emptyVariableInfoMap, blockTagGroups }
|
||||||
}
|
}
|
||||||
|
|
||||||
const hasInvalidBlocks = Object.values(blocks).some((block) => !block || !block.type)
|
const hasInvalidBlocks = Object.values(blocks).some((block) => !block || !block.type)
|
||||||
if (hasInvalidBlocks) {
|
if (hasInvalidBlocks) {
|
||||||
return { tags: [], variableInfoMap: {}, blockTagGroups: [] }
|
return { tags: [], variableInfoMap: emptyVariableInfoMap, blockTagGroups: [] }
|
||||||
}
|
}
|
||||||
|
|
||||||
const starterBlock = Object.values(blocks).find((block) => block.type === 'starter')
|
const starterBlock = Object.values(blocks).find((block) => block.type === 'starter')
|
||||||
@@ -981,7 +839,7 @@ export const TagDropdown: React.FC<TagDropdownProps> = ({
|
|||||||
const blockName = accessibleBlock.name || accessibleBlock.type
|
const blockName = accessibleBlock.name || accessibleBlock.type
|
||||||
const normalizedBlockName = normalizeName(blockName)
|
const normalizedBlockName = normalizeName(blockName)
|
||||||
|
|
||||||
const outputPaths = generateOutputPaths(mockConfig.outputs)
|
const outputPaths = getOutputPathsFromSchema(mockConfig.outputs)
|
||||||
let blockTags = outputPaths.map((path) => `${normalizedBlockName}.${path}`)
|
let blockTags = outputPaths.map((path) => `${normalizedBlockName}.${path}`)
|
||||||
blockTags = ensureRootTag(blockTags, normalizedBlockName)
|
blockTags = ensureRootTag(blockTags, normalizedBlockName)
|
||||||
|
|
||||||
@@ -1109,7 +967,7 @@ export const TagDropdown: React.FC<TagDropdownProps> = ({
|
|||||||
const operationValue =
|
const operationValue =
|
||||||
mergedSubBlocks?.operation?.value ?? getSubBlockValue(accessibleBlockId, 'operation')
|
mergedSubBlocks?.operation?.value ?? getSubBlockValue(accessibleBlockId, 'operation')
|
||||||
const toolOutputPaths = operationValue
|
const toolOutputPaths = operationValue
|
||||||
? generateToolOutputPaths(blockConfig, operationValue)
|
? getToolOutputPaths(blockConfig, operationValue)
|
||||||
: []
|
: []
|
||||||
|
|
||||||
if (toolOutputPaths.length > 0) {
|
if (toolOutputPaths.length > 0) {
|
||||||
@@ -1183,7 +1041,7 @@ export const TagDropdown: React.FC<TagDropdownProps> = ({
|
|||||||
|
|
||||||
const filteredTags = useMemo(() => {
|
const filteredTags = useMemo(() => {
|
||||||
if (!searchTerm) return tags
|
if (!searchTerm) return tags
|
||||||
return tags.filter((tag) => tag.toLowerCase().includes(searchTerm))
|
return tags.filter((tag: string) => tag.toLowerCase().includes(searchTerm))
|
||||||
}, [tags, searchTerm])
|
}, [tags, searchTerm])
|
||||||
|
|
||||||
const { variableTags, filteredBlockTagGroups } = useMemo(() => {
|
const { variableTags, filteredBlockTagGroups } = useMemo(() => {
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import {
|
|||||||
Tooltip,
|
Tooltip,
|
||||||
} from '@/components/emcn'
|
} from '@/components/emcn'
|
||||||
import { getEnv, isTruthy } from '@/lib/core/config/env'
|
import { getEnv, isTruthy } from '@/lib/core/config/env'
|
||||||
|
import { formatTimeWithSeconds } from '@/lib/core/utils/formatting'
|
||||||
import { useRegisterGlobalCommands } from '@/app/workspace/[workspaceId]/providers/global-commands-provider'
|
import { useRegisterGlobalCommands } from '@/app/workspace/[workspaceId]/providers/global-commands-provider'
|
||||||
import { createCommands } from '@/app/workspace/[workspaceId]/utils/commands-utils'
|
import { createCommands } from '@/app/workspace/[workspaceId]/utils/commands-utils'
|
||||||
import {
|
import {
|
||||||
@@ -82,18 +83,6 @@ const COLUMN_WIDTHS = {
|
|||||||
OUTPUT_PANEL: 'w-[400px]',
|
OUTPUT_PANEL: 'w-[400px]',
|
||||||
} as const
|
} as const
|
||||||
|
|
||||||
/**
|
|
||||||
* Color palette for run IDs - matching code syntax highlighting colors
|
|
||||||
*/
|
|
||||||
const RUN_ID_COLORS = [
|
|
||||||
{ text: '#4ADE80' }, // Green
|
|
||||||
{ text: '#F472B6' }, // Pink
|
|
||||||
{ text: '#60C5FF' }, // Blue
|
|
||||||
{ text: '#FF8533' }, // Orange
|
|
||||||
{ text: '#C084FC' }, // Purple
|
|
||||||
{ text: '#FCD34D' }, // Yellow
|
|
||||||
] as const
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shared styling constants
|
* Shared styling constants
|
||||||
*/
|
*/
|
||||||
@@ -183,22 +172,6 @@ const ToggleButton = ({
|
|||||||
</Button>
|
</Button>
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
|
||||||
* Formats timestamp to H:MM:SS AM/PM TZ format
|
|
||||||
*/
|
|
||||||
const formatTimestamp = (timestamp: string): string => {
|
|
||||||
const date = new Date(timestamp)
|
|
||||||
const fullString = date.toLocaleTimeString('en-US', {
|
|
||||||
hour: 'numeric',
|
|
||||||
minute: '2-digit',
|
|
||||||
second: '2-digit',
|
|
||||||
hour12: true,
|
|
||||||
timeZoneName: 'short',
|
|
||||||
})
|
|
||||||
// Format: "5:54:55 PM PST" - return as is
|
|
||||||
return fullString
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Truncates execution ID for display as run ID
|
* Truncates execution ID for display as run ID
|
||||||
*/
|
*/
|
||||||
@@ -208,16 +181,25 @@ const formatRunId = (executionId?: string): string => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets color for a run ID based on its index in the execution ID order map
|
* Run ID colors
|
||||||
*/
|
*/
|
||||||
const getRunIdColor = (
|
const RUN_ID_COLORS = [
|
||||||
executionId: string | undefined,
|
'#4ADE80', // Green
|
||||||
executionIdOrderMap: Map<string, number>
|
'#F472B6', // Pink
|
||||||
) => {
|
'#60C5FF', // Blue
|
||||||
|
'#FF8533', // Orange
|
||||||
|
'#C084FC', // Purple
|
||||||
|
'#EAB308', // Yellow
|
||||||
|
'#2DD4BF', // Teal
|
||||||
|
'#FB7185', // Rose
|
||||||
|
] as const
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets color for a run ID from the precomputed color map.
|
||||||
|
*/
|
||||||
|
const getRunIdColor = (executionId: string | undefined, colorMap: Map<string, string>) => {
|
||||||
if (!executionId) return null
|
if (!executionId) return null
|
||||||
const colorIndex = executionIdOrderMap.get(executionId)
|
return colorMap.get(executionId) ?? null
|
||||||
if (colorIndex === undefined) return null
|
|
||||||
return RUN_ID_COLORS[colorIndex % RUN_ID_COLORS.length]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -320,12 +302,14 @@ export function Terminal() {
|
|||||||
} = useTerminalStore()
|
} = useTerminalStore()
|
||||||
const isExpanded = useTerminalStore((state) => state.terminalHeight > NEAR_MIN_THRESHOLD)
|
const isExpanded = useTerminalStore((state) => state.terminalHeight > NEAR_MIN_THRESHOLD)
|
||||||
const { activeWorkflowId } = useWorkflowRegistry()
|
const { activeWorkflowId } = useWorkflowRegistry()
|
||||||
|
const hasConsoleHydrated = useTerminalConsoleStore((state) => state._hasHydrated)
|
||||||
const workflowEntriesSelector = useCallback(
|
const workflowEntriesSelector = useCallback(
|
||||||
(state: { entries: ConsoleEntry[] }) =>
|
(state: { entries: ConsoleEntry[] }) =>
|
||||||
state.entries.filter((entry) => entry.workflowId === activeWorkflowId),
|
state.entries.filter((entry) => entry.workflowId === activeWorkflowId),
|
||||||
[activeWorkflowId]
|
[activeWorkflowId]
|
||||||
)
|
)
|
||||||
const entries = useTerminalConsoleStore(useShallow(workflowEntriesSelector))
|
const entriesFromStore = useTerminalConsoleStore(useShallow(workflowEntriesSelector))
|
||||||
|
const entries = hasConsoleHydrated ? entriesFromStore : []
|
||||||
const clearWorkflowConsole = useTerminalConsoleStore((state) => state.clearWorkflowConsole)
|
const clearWorkflowConsole = useTerminalConsoleStore((state) => state.clearWorkflowConsole)
|
||||||
const exportConsoleCSV = useTerminalConsoleStore((state) => state.exportConsoleCSV)
|
const exportConsoleCSV = useTerminalConsoleStore((state) => state.exportConsoleCSV)
|
||||||
const [selectedEntry, setSelectedEntry] = useState<ConsoleEntry | null>(null)
|
const [selectedEntry, setSelectedEntry] = useState<ConsoleEntry | null>(null)
|
||||||
@@ -462,25 +446,52 @@ export function Terminal() {
|
|||||||
}, [allWorkflowEntries])
|
}, [allWorkflowEntries])
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create stable execution ID to color index mapping based on order of first appearance.
|
* Track color offset - increments when old executions are trimmed
|
||||||
* Once an execution ID is assigned a color index, it keeps that index.
|
* so remaining executions keep their colors.
|
||||||
* Uses all workflow entries to maintain consistent colors regardless of active filters.
|
|
||||||
*/
|
*/
|
||||||
const executionIdOrderMap = useMemo(() => {
|
const colorStateRef = useRef<{ executionIds: string[]; offset: number }>({
|
||||||
const orderMap = new Map<string, number>()
|
executionIds: [],
|
||||||
let colorIndex = 0
|
offset: 0,
|
||||||
|
})
|
||||||
|
|
||||||
// Process entries in reverse order (oldest first) since entries array is newest-first
|
/**
|
||||||
// Use allWorkflowEntries to ensure colors remain consistent when filters change
|
* Compute colors for each execution ID using sequential assignment.
|
||||||
|
* Colors cycle through RUN_ID_COLORS based on position + offset.
|
||||||
|
* When old executions are trimmed, offset increments to preserve colors.
|
||||||
|
*/
|
||||||
|
const executionColorMap = useMemo(() => {
|
||||||
|
const currentIds: string[] = []
|
||||||
|
const seen = new Set<string>()
|
||||||
for (let i = allWorkflowEntries.length - 1; i >= 0; i--) {
|
for (let i = allWorkflowEntries.length - 1; i >= 0; i--) {
|
||||||
const entry = allWorkflowEntries[i]
|
const execId = allWorkflowEntries[i].executionId
|
||||||
if (entry.executionId && !orderMap.has(entry.executionId)) {
|
if (execId && !seen.has(execId)) {
|
||||||
orderMap.set(entry.executionId, colorIndex)
|
currentIds.push(execId)
|
||||||
colorIndex++
|
seen.add(execId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return orderMap
|
const { executionIds: prevIds, offset: prevOffset } = colorStateRef.current
|
||||||
|
let newOffset = prevOffset
|
||||||
|
|
||||||
|
if (prevIds.length > 0 && currentIds.length > 0) {
|
||||||
|
const currentOldest = currentIds[0]
|
||||||
|
if (prevIds[0] !== currentOldest) {
|
||||||
|
const trimmedCount = prevIds.indexOf(currentOldest)
|
||||||
|
if (trimmedCount > 0) {
|
||||||
|
newOffset = (prevOffset + trimmedCount) % RUN_ID_COLORS.length
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const colorMap = new Map<string, string>()
|
||||||
|
for (let i = 0; i < currentIds.length; i++) {
|
||||||
|
const colorIndex = (newOffset + i) % RUN_ID_COLORS.length
|
||||||
|
colorMap.set(currentIds[i], RUN_ID_COLORS[colorIndex])
|
||||||
|
}
|
||||||
|
|
||||||
|
colorStateRef.current = { executionIds: currentIds, offset: newOffset }
|
||||||
|
|
||||||
|
return colorMap
|
||||||
}, [allWorkflowEntries])
|
}, [allWorkflowEntries])
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1126,7 +1137,7 @@ export function Terminal() {
|
|||||||
<PopoverScrollArea style={{ maxHeight: '140px' }}>
|
<PopoverScrollArea style={{ maxHeight: '140px' }}>
|
||||||
{uniqueRunIds.map((runId, index) => {
|
{uniqueRunIds.map((runId, index) => {
|
||||||
const isSelected = filters.runIds.has(runId)
|
const isSelected = filters.runIds.has(runId)
|
||||||
const runIdColor = getRunIdColor(runId, executionIdOrderMap)
|
const runIdColor = getRunIdColor(runId, executionColorMap)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PopoverItem
|
<PopoverItem
|
||||||
@@ -1137,7 +1148,7 @@ export function Terminal() {
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
className='flex-1 font-mono text-[12px]'
|
className='flex-1 font-mono text-[12px]'
|
||||||
style={{ color: runIdColor?.text || '#D2D2D2' }}
|
style={{ color: runIdColor || '#D2D2D2' }}
|
||||||
>
|
>
|
||||||
{formatRunId(runId)}
|
{formatRunId(runId)}
|
||||||
</span>
|
</span>
|
||||||
@@ -1333,7 +1344,7 @@ export function Terminal() {
|
|||||||
const statusInfo = getStatusInfo(entry.success, entry.error)
|
const statusInfo = getStatusInfo(entry.success, entry.error)
|
||||||
const isSelected = selectedEntry?.id === entry.id
|
const isSelected = selectedEntry?.id === entry.id
|
||||||
const BlockIcon = getBlockIcon(entry.blockType)
|
const BlockIcon = getBlockIcon(entry.blockType)
|
||||||
const runIdColor = getRunIdColor(entry.executionId, executionIdOrderMap)
|
const runIdColor = getRunIdColor(entry.executionId, executionColorMap)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
@@ -1383,7 +1394,7 @@ export function Terminal() {
|
|||||||
COLUMN_BASE_CLASS,
|
COLUMN_BASE_CLASS,
|
||||||
'truncate font-medium font-mono text-[12px]'
|
'truncate font-medium font-mono text-[12px]'
|
||||||
)}
|
)}
|
||||||
style={{ color: runIdColor?.text || '#D2D2D2' }}
|
style={{ color: runIdColor || '#D2D2D2' }}
|
||||||
>
|
>
|
||||||
{formatRunId(entry.executionId)}
|
{formatRunId(entry.executionId)}
|
||||||
</span>
|
</span>
|
||||||
@@ -1409,7 +1420,7 @@ export function Terminal() {
|
|||||||
ROW_TEXT_CLASS
|
ROW_TEXT_CLASS
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
{formatTimestamp(entry.timestamp)}
|
{formatTimeWithSeconds(new Date(entry.timestamp))}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -356,6 +356,9 @@ const WorkflowContent = React.memo(() => {
|
|||||||
/** Stores source node/handle info when a connection drag starts for drop-on-block detection. */
|
/** Stores source node/handle info when a connection drag starts for drop-on-block detection. */
|
||||||
const connectionSourceRef = useRef<{ nodeId: string; handleId: string } | null>(null)
|
const connectionSourceRef = useRef<{ nodeId: string; handleId: string } | null>(null)
|
||||||
|
|
||||||
|
/** Tracks whether onConnect successfully handled the connection (ReactFlow pattern). */
|
||||||
|
const connectionCompletedRef = useRef(false)
|
||||||
|
|
||||||
/** Stores start positions for multi-node drag undo/redo recording. */
|
/** Stores start positions for multi-node drag undo/redo recording. */
|
||||||
const multiNodeDragStartRef = useRef<Map<string, { x: number; y: number; parentId?: string }>>(
|
const multiNodeDragStartRef = useRef<Map<string, { x: number; y: number; parentId?: string }>>(
|
||||||
new Map()
|
new Map()
|
||||||
@@ -2214,7 +2217,8 @@ const WorkflowContent = React.memo(() => {
|
|||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Captures the source handle when a connection drag starts
|
* Captures the source handle when a connection drag starts.
|
||||||
|
* Resets connectionCompletedRef to track if onConnect handles this connection.
|
||||||
*/
|
*/
|
||||||
const onConnectStart = useCallback((_event: any, params: any) => {
|
const onConnectStart = useCallback((_event: any, params: any) => {
|
||||||
const handleId: string | undefined = params?.handleId
|
const handleId: string | undefined = params?.handleId
|
||||||
@@ -2223,6 +2227,7 @@ const WorkflowContent = React.memo(() => {
|
|||||||
nodeId: params?.nodeId,
|
nodeId: params?.nodeId,
|
||||||
handleId: params?.handleId,
|
handleId: params?.handleId,
|
||||||
}
|
}
|
||||||
|
connectionCompletedRef.current = false
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
/** Handles new edge connections with container boundary validation. */
|
/** Handles new edge connections with container boundary validation. */
|
||||||
@@ -2283,6 +2288,7 @@ const WorkflowContent = React.memo(() => {
|
|||||||
isInsideContainer: true,
|
isInsideContainer: true,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
connectionCompletedRef.current = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2311,6 +2317,7 @@ const WorkflowContent = React.memo(() => {
|
|||||||
}
|
}
|
||||||
: undefined,
|
: undefined,
|
||||||
})
|
})
|
||||||
|
connectionCompletedRef.current = true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[addEdge, getNodes, blocks]
|
[addEdge, getNodes, blocks]
|
||||||
@@ -2319,8 +2326,9 @@ const WorkflowContent = React.memo(() => {
|
|||||||
/**
|
/**
|
||||||
* Handles connection drag end. Detects if the edge was dropped over a block
|
* Handles connection drag end. Detects if the edge was dropped over a block
|
||||||
* and automatically creates a connection to that block's target handle.
|
* and automatically creates a connection to that block's target handle.
|
||||||
* Only creates a connection if ReactFlow didn't already handle it (e.g., when
|
*
|
||||||
* dropping on the block body instead of a handle).
|
* Uses connectionCompletedRef to check if onConnect already handled this connection
|
||||||
|
* (ReactFlow pattern for distinguishing handle-to-handle vs handle-to-body drops).
|
||||||
*/
|
*/
|
||||||
const onConnectEnd = useCallback(
|
const onConnectEnd = useCallback(
|
||||||
(event: MouseEvent | TouchEvent) => {
|
(event: MouseEvent | TouchEvent) => {
|
||||||
@@ -2332,6 +2340,12 @@ const WorkflowContent = React.memo(() => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If onConnect already handled this connection, skip (handle-to-handle case)
|
||||||
|
if (connectionCompletedRef.current) {
|
||||||
|
connectionSourceRef.current = null
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Get cursor position in flow coordinates
|
// Get cursor position in flow coordinates
|
||||||
const clientPos = 'changedTouches' in event ? event.changedTouches[0] : event
|
const clientPos = 'changedTouches' in event ? event.changedTouches[0] : event
|
||||||
const flowPosition = screenToFlowPosition({
|
const flowPosition = screenToFlowPosition({
|
||||||
@@ -2342,25 +2356,14 @@ const WorkflowContent = React.memo(() => {
|
|||||||
// Find node under cursor
|
// Find node under cursor
|
||||||
const targetNode = findNodeAtPosition(flowPosition)
|
const targetNode = findNodeAtPosition(flowPosition)
|
||||||
|
|
||||||
// Create connection if valid target found AND edge doesn't already exist
|
// Create connection if valid target found (handle-to-body case)
|
||||||
// ReactFlow's onConnect fires first when dropping on a handle, so we check
|
|
||||||
// if that connection already exists to avoid creating duplicates.
|
|
||||||
// IMPORTANT: We must read directly from the store (not React state) because
|
|
||||||
// the store update from ReactFlow's onConnect may not have triggered a
|
|
||||||
// React re-render yet when this callback runs (typically 1-2ms later).
|
|
||||||
if (targetNode && targetNode.id !== source.nodeId) {
|
if (targetNode && targetNode.id !== source.nodeId) {
|
||||||
const currentEdges = useWorkflowStore.getState().edges
|
onConnect({
|
||||||
const edgeAlreadyExists = currentEdges.some(
|
source: source.nodeId,
|
||||||
(e) => e.source === source.nodeId && e.target === targetNode.id
|
sourceHandle: source.handleId,
|
||||||
)
|
target: targetNode.id,
|
||||||
if (!edgeAlreadyExists) {
|
targetHandle: 'target',
|
||||||
onConnect({
|
})
|
||||||
source: source.nodeId,
|
|
||||||
sourceHandle: source.handleId,
|
|
||||||
target: targetNode.id,
|
|
||||||
targetHandle: 'target',
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
connectionSourceRef.current = null
|
connectionSourceRef.current = null
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ async function executeWebhookJobInternal(
|
|||||||
const workflowVariables = (wfRows[0]?.variables as Record<string, any>) || {}
|
const workflowVariables = (wfRows[0]?.variables as Record<string, any>) || {}
|
||||||
|
|
||||||
// Merge subblock states (matching workflow-execution pattern)
|
// Merge subblock states (matching workflow-execution pattern)
|
||||||
const mergedStates = mergeSubblockState(blocks, {})
|
const mergedStates = mergeSubblockState(blocks)
|
||||||
|
|
||||||
// Create serialized workflow
|
// Create serialized workflow
|
||||||
const serializer = new Serializer()
|
const serializer = new Serializer()
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user