Skip to content

fix: Fix upstream update - #10

Merged
matyascimbulka merged 234 commits into
masterfrom
fix/upstream-sync-fix
Sep 8, 2025
Merged

fix: Fix upstream update#10
matyascimbulka merged 234 commits into
masterfrom
fix/upstream-sync-fix

Conversation

@matyascimbulka

Copy link
Copy Markdown
Collaborator

Fixes the upstream update. I have used Squash and merge for the previous upstream update which broke it. This PR should fix the issue if merged normally.

No new changes introduced here.

seynadio and others added 30 commits July 23, 2025 10:31
…17605)

* Add internal notes support to Gorgias OAuth integration

- Add channel prop to create-ticket-message action with internal-note support
- Add conditional logic to skip sender/receiver validation for internal notes
- Create internal-note-created webhook source for monitoring internal note events
- Add JSDoc documentation to all methods
- Update package.json version

* Fix processHistoricalEvent error in internal-note-created source

Add empty deploy() hook to prevent base class from attempting to process
historical events, matching the pattern used in ticket-message-created source.
This resolves the "processHistoricalEvent is not implemented" error.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix linting errors in Gorgias OAuth components

- Fix multiline-ternary formatting in create-ticket-message.mjs
- Remove unused constants import from internal-note-created.mjs
- Add missing newline at end of internal-note-created.mjs

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* updates

* pnpm-lock.yaml

---------

Co-authored-by: Job Nijenhuis <job@neople.io>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Michelle Bergeron <michelle.bergeron@gmail.com>
* [Components] Pingback PipedreamHQ#17674
Actions
 - Create Subscriber
 - Get Subscriber
 - Update Subscriber
 - Add Subscriber To Segmentation Lists
 - Remove Subscriber From Segmentation List

* pnpm update

* pnpm update

* Refactor Pingback actions to simplify data handling and improve code consistency. Updated Add, Create, Remove, and Update Subscriber actions to use a unified data structure. Introduced parseCustomFields utility for better custom fields management.
* new components

* pnpm-lock.yaml
… items (PipedreamHQ#17611)

* Enhance Shopify order queries with complete order data including line items

- Updated GET_ORDER query to include comprehensive order information:
  - Complete line items with product and variant details
  - Shipping and billing addresses
  - Fulfillment tracking information
  - Payment transactions and refunds
  - Tax lines and discount allocations
  - All financial breakdowns (subtotal, shipping, tax, discounts)

- Updated LIST_ORDERS query to include:
  - Line items with product information
  - Order status and fulfillment details
  - Customer and shipping information
  - Essential financial data

This provides complete order data including all items, customer info, shipping details, and fulfillment tracking when retrieving orders.

* versions

* pnpm-lock.yaml

* Fix Shopify GraphQL query field errors

- Replace deprecated acceptsMarketing with emailMarketingConsent in Customer object
- Update ProductVariant weight fields to use inventoryItem.measurement.weight structure
- Replace requestedFulfillmentServiceId with requestedFulfillmentService object
- Update fulfillment service object to include correct fields (id, serviceName, handle)

These changes align with the current Shopify GraphQL API schema and fix the "Field doesn't exist" errors.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Remove emailMarketingConsent field causing GraphQL errors

Fix selectionMismatch error by removing emailMarketingConsent from customer queries in GET_ORDER and LIST_ORDERS.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* update queries

* update queries

---------

Co-authored-by: Michelle Bergeron <michelle.bergeron@gmail.com>
Co-authored-by: Job Nijenhuis <job@neople.io>
Co-authored-by: Claude <noreply@anthropic.com>
* onelogin init

* some adjusts

* pnpm update

* [Components] onelogin PipedreamHQ#15147
Sources
 - New User Created
 - New Login Attempt
 - New Directory Sync

Actions
 - Create User
 - Update User
 - Revoke User Session

* pnpm update

* Add new event source and refactor API paths in OneLogin component

- Introduced a new event source for emitting events in OneLogin.
- Added event type selection with dynamic options based on available event types.
- Refactored API paths in the OneLogin app to remove redundant '/api' prefix.
- Implemented a utility function to convert snake_case to Title Case for better display of event types.
* new components

* pnpm-lock.yaml

* versions

* updates
…Q#17762)

* add includeChanges prop

* pnpm-lock.yaml

* remove console.log

* revert updated-page.mjs

* updated-page-by-timestamp source
* package version bump

* Adding new actions and adjusting minor things

* Description improvements

* Adding sources

* Version bumps

* Checking for undefined values on formData

* Adjusting pagination for 'list message templates'

* pnpm

* Updating sources to timestamp-based

* Adjusting timestamp setting

* Adding syncDir prop

* Re-adding sortBy and sortOrder

* Re-adding missing filterFn calls

* Adjusting form data checking

* Fixing bug on sources

* Adjusting inboxIds array format

* Timestamp fix for event emission
* [Components] Rewiser PipedreamHQ#17699
Actions
 - Create Transaction

Sources
 - New Transaction

* pnpm update

* Update components/rewiser/actions/create-transaction/create-transaction.mjs

Co-authored-by: Guilherme Falcão <48412907+GTFalcao@users.noreply.github.com>

* Add new source for Rewiser: New Transaction Created

- Implemented a new source that emits events when a new transaction is created in Rewiser.
- Added methods to manage the last processed transaction date and emit new transactions.
- Included a sample event for testing purposes.

* Update components/rewiser/actions/create-transaction/create-transaction.mjs

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: Guilherme Falcão <48412907+GTFalcao@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* update pagination

* pnpm-lock.yaml
* new components

* pnpm-lock.yaml

* versions

* fix props
* wip

* updates

* pnpm-lock.yaml

* version

* pnpm-lock.yaml

* pnpm-lock.yaml

* pnpm-lock.yaml

* switch base_url to production
* new components

* pnpm-lock.yaml

* versions

* pnpm-lock.yaml

* pnpm-lock.yaml

* pnpm-lock.yaml

* pnpm-lock.yaml

* updates

* update type field
…pedreamHQ#17613)

* Implement comprehensive Trustpilot integration with polling sources

## Overview
Complete Trustpilot integration using polling approach (webhooks not supported by Trustpilot API).

## Features Implemented

### Authentication & Core App
- Enhanced trustpilot.app.ts with OAuth and API key authentication
- Added comprehensive API methods for reviews, products, and conversations
- Support for both public and private endpoints
- Proper error handling, validation, and retry logic with rate limiting

### Actions (6 total)
- **fetch-service-reviews** - Get service reviews with filtering and pagination
- **fetch-service-review-by-id** - Get specific service review
- **fetch-product-reviews** - Get product reviews with filtering and pagination
- **fetch-product-review-by-id** - Get specific product review
- **reply-to-service-review** - Reply to service reviews
- **reply-to-product-review** - Reply to product reviews

### Polling Sources (8 total)
- **new-service-reviews** - New service reviews (public + private endpoints)
- **updated-service-reviews** - Updated/revised service reviews
- **new-product-reviews** - New product reviews
- **updated-product-reviews** - Updated/revised product reviews
- **new-service-review-replies** - New replies to service reviews
- **new-product-review-replies** - New replies to product reviews
- **new-conversations** - New conversations started
- **updated-conversations** - Updated conversations (new messages)

### Technical Implementation
- 15-minute polling intervals following Google Drive pattern
- Smart deduplication by reviewId + timestamp
- Business unit filtering (optional)
- 24-hour lookback on first run
- Comprehensive constants and utilities
- Proper pagination and error handling

## API Endpoints Used
- `/business-units/{businessUnitId}/reviews` (public)
- `/private/business-units/{businessUnitId}/reviews` (private service)
- `/private/product-reviews/business-units/{businessUnitId}/reviews` (products)
- `/private/conversations` (conversations)
- All reply endpoints for posting responses

Addresses all requirements from https://developers.trustpilot.com/introduction/

* Apply patches: Update pnpm-lock.yaml and fix security vulnerabilities in Trustpilot integration

* Address PR feedback: Update dependencies, improve code quality, and follow best practices

- Update @pipedream/platform to ^3.1.0
- Add authentication validation in _getAuthHeaders
- Extract common review fetching logic to reduce duplication (DRY)
- Remove unnecessary try/catch from _makeRequest
- Use ConfigurationError for user input errors
- Remove publishedAt from all components
- Update polling descriptions to be more generic
- Improve code maintainability and error handling

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix CI/CD failures: bump component version, update lockfile, fix TypeScript errors

- Increment trustpilot component version from 0.0.1 to 0.1.0
- Update pnpm lockfile to sync @pipedream/platform dependency (^3.0.0 -> ^3.1.0)
- Fix TypeScript compilation errors by adding proper type annotations
- Fix crypto import to use ES module syntax

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* typescript issues

* Update components/trustpilot/app/trustpilot.app.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update components/trustpilot/app/trustpilot.app.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update trustpilot.app.ts

* Rename app

* add back app

* ts --> js

* fixes

* delete .gitignore, update package.json

* pnpm-lock.yaml

---------

Co-authored-by: Job Nijenhuis <job@neople.io>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Job <9075380+Afstkla@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Michelle Bergeron <michelle.bergeron@gmail.com>
* new components

* pnpm-lock.yaml

* pnpm-lock.yaml

* versions
* new component: alttextlab

* new component: alttextlab

* eslint updates

* version

* pnpm-lock.yaml

* app slug

* pnpm-lock.yaml

* pnpm-lock.yaml

---------

Co-authored-by: Michelle Bergeron <michelle.bergeron@gmail.com>
* update import

* pnpm-lock.yaml
lcaresia and others added 25 commits August 29, 2025 13:14
* Added actions

* updates

* pnpm-lock.yaml

---------

Co-authored-by: Michelle Bergeron <michelle.bergeron@gmail.com>
* update scrape-single-url

* pnpm-lock.yaml

---------

Co-authored-by: Lucas Caresia <lucascarezia@gmail.com>
* Add file attachment support to Zendesk update-ticket action

- Add attachments prop definition to zendesk.app.mjs for multiple file uploads
- Add uploadFile() and uploadFiles() helper methods with MIME type detection
- Modify update-ticket action to support file attachments via Zendesk uploads API
- Update version to 0.2.0 and package version to 0.7.2
- Enhanced success message to show attachment count

* Address CodeRabbit feedback

- Add guard for missing upload token and fail fast with clear error message
- Remove duplicate summary emission from uploadFiles method
- Use actual upload token count instead of input array length for summary

* Implement comprehensive URL support and improve file handling

- Add full HTTP/HTTPS URL support with axios for remote file fetching
- Extract filename from Content-Disposition header or URL path for URLs
- Use response Content-Type when available for better MIME detection
- Replace blocking readFileSync with async fs.promises.readFile
- Add proper input validation and JSDoc documentation
- Implement concurrent uploads with Promise.allSettled for better performance
- Add comprehensive error aggregation showing all failed uploads
- Filter and trim attachment input for robustness

* up versions

* lock change for some reason

* updates

* pnpm-lock.yaml

* update @pipedream/platform dependency

* pnpm-lock.yaml

---------

Co-authored-by: Job <9075380+Afstkla@users.noreply.github.com>
Co-authored-by: Job Nijenhuis <job@neople.io>
Co-authored-by: Michelle Bergeron <michelle.bergeron@gmail.com>
* updates

* package.json

* pnpm-lock.yaml

* updates
* new components

* pnpm-lock.yaml

* fix typo

* remove subscription actions
* migrate components

* pnpm-lock.yaml

* update package.json

* pnpm-lock.yaml
* Fix PipedreamHQ#18220 (airtable_oauth): normalize fallback events and retry getting record

- Always wrap fallback emissions as { originalPayload } for consistent shape
- Guard against missing/empty changedTablesById in field & record emitters
- Add shared withRetry() (exponential backoff,) in common/utils
- Use withRetry for getRecord in record emitter; on failure, emit empty fields

* Bump package versions
* wip

* new components

* pnpm-lock.yaml

* pnpm-lock.yaml

* update description
* Added Databricks SQL Warehouses API actions

- Added create SQL warehouse action
- Added list SQL warehouses action
- Added get SQL warehouse action
- Added edit SQL warehouse action
- Added delete SQL warehouse action
- Added start/stop SQL warehouse actions
- Added get/set SQL warehouse config actions
- Added get/set SQL warehouse permissions actions

Implements 11 SQL Warehouses endpoints as discussed in the enhancement issue.

* Update Databricks SQL Warehouse docs URLs

* fix(databricks): bump component versions and apply lint fixes

* fix(databricks): addressed requested changes

* addressed coderabbit review feedback

* resolved the linting issues

* addressed all test failures

* addressed coderabbit review feedback

* resolved the linting issues

* addressed coderabbit review feedback

* addressed coderabbit review feedback

* resolved the linting issues

* updates

* Add default value for maxNumClusters

* create and edit sql warehouses fixes

* create and edit sql warehouse fixes

* updates

---------

Co-authored-by: Michelle Bergeron <michelle.bergeron@gmail.com>
Co-authored-by: Leo Vu <vunguyenhung@outlook.com>
* Configure Vite to abort if there are compile-time errors
* Use explicit types from the Connect SDK (i.e. `@pipedream/sdk`) to
  make the v2 migration easier
* Fix pre-existing compile-time errors
* Bump version
* Use the SDK version published in the NPM registry instead of the one
  that lives in this repo (it'll be easier to switch)
* Fix compilation errors in the example app
* Delete the outdated examples
* Fix linter issues

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update PlentyONE component: Bump version to 0.1.0, add new actions for order management, and enhance prop definitions. Introduced methods for creating, retrieving, and managing orders, including adding notes and fetching order items and documents. Added constants for order types and payment statuses. Improved utility functions for better data handling.

* pnpm update

* Fix package.json formatting by adding a newline at the end of the file.

* Add statusId prop definition to create-order action and implement getOrderStatuses method in PlentyONE component. Enhanced order creation by parsing order items and related properties for improved data handling.
@matyascimbulka matyascimbulka self-assigned this Sep 8, 2025
@matyascimbulka
matyascimbulka merged commit 25691bf into master Sep 8, 2025
3 checks passed
@matyascimbulka
matyascimbulka deleted the fix/upstream-sync-fix branch September 8, 2025 13:30
drobnikj pushed a commit that referenced this pull request Sep 3, 2026
…HQ#21493)

* feat(slack_v2): eval-driven fixes for the MCP tool surface

Iterated against the MCP eval suite (pd-connect-eval-monster/evals/slack_v2).
Suite went 23/35 -> 33/35 on Sonnet 5 (pass^2); every change below is tied to a
specific red-to-green flip or a measured payload reduction.

- list-channels: evals #2/#10/#11/#16/#19/PipedreamHQ#35 all failed the same way — the
  action returned every field of every channel with numPages defaulting to 1, so
  a 62-channel workspace produced ~55k chars, blew the 25k-token MCP ceiling, and
  the model was handed a file path instead of data (#2 burned all 20 turns
  re-calling it). Added an additive `fields` projection, a `cursor` prop, and
  `has_more`/`next_cursor` so truncation is visible instead of silent. Payload
  55k -> 5.9k chars; all six evals pass.  [minor]

- slack_v2.app.mjs: `assistantSearch` called `sdk().apiCall()` directly — the one
  path in the app that bypassed `_withRetries` — while the client is built with
  `rejectRateLimitedCalls: true`, so every 429 rejected instantly. 8 of 12 search
  calls errored in one run (#24/#26/#27). Routed through `_withRetries`. Also adds
  `resolveUserId` (id / email / display name) for the invite fix below.

- delete-message: eval #20 ("post a note then take it back") failed every run with
  cant_delete_message — post-message sends no `as_user` so it posts as the USER,
  while this action defaulted `as_user: false`, which routes to the BOT token. A
  message just posted could never be deleted. Now retries with the other identity
  on cant_delete_message; the default is unchanged, so existing workflows are
  unaffected. Description also gained confirmation guidance for the destructive
  path (PipedreamHQ#33).  [minor]

- invite-user-to-channel: eval #10 failed with user_not_found — the agent passed
  the email from the prompt. Now resolves user id / email / display name, and the
  channel by name.  [minor]

- get-channel-details, list-members-in-channel, set-channel-topic: every
  AI-optimized action in this app resolves channel NAMES server-side and these did
  not, so agents that read "#seinfeld-general" from a prompt got channel_not_found
  (#19, #22) or a bare internal_error (#10). All three now use resolveChannelId.
  [minor]

- get-channel-history, get-thread-replies: outputs measured at 17k chars average
  (worst 49k) and 25k average respectively — every call burned that much of the
  agent's context. Added the same additive `fields` projection.  [minor]

- get-user-details, get-current-user: two tools answer "who am I" and the agent
  chose the legacy one in 10/10 trials (#1). Descriptions now differentiate them.
  NOTE: this did NOT change routing — the agent still picks get-current-user. The
  actual fix is removing one of the two from the /v3 component allowlist; these
  edits only make the intended split legible.  [patch]

App package.json bumped 0.6.1 -> 0.7.0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(slack_v2): satisfy CI — lint formatting, dependent version bumps, UI-centric copy

- Lint Code Base: 9 errors, all in the files this branch touches and all
  formatting. Broke the `.split().map().filter()` chains across lines
  (newline-per-chained-call), split the `has_more` spread ternary and its object
  literal (multiline-ternary, object-curly-newline), and expanded the
  `users.list` destructure in resolveUserId (object-curly-newline).

- Ensure component commits modify component versions: this branch edits
  slack_v2.app.mjs, so every component importing it needs a version bump.
  Patch-bumped the 48 actions/sources that were not already versioned in the
  previous commit.

- Removed UI-centric wording from two descriptions, which read oddly for an
  agent calling the tool over MCP and contradicted the resolution behaviour
  added in the previous commit:
  - get-channel-details: "by selecting it or providing an ID" -> "specified by
    ID or by name" (it had claimed both "selecting it" and "Accepts a channel
    ID or NAME" in the same sentence).
  - set-channel-topic: "a selected channel" -> "a channel, specified by ID or
    by name".

Verified locally with ESLint 9 against the repo's own rule options for the three
failing rules: 0 violations across components/slack_v2.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(slack_v2): restore comma-separated users on invite, fix delete identity fallback

invite-user-to-channel: conversations.invite documents `users` as comma-separated and
the prop is a plain string, so "U01ABCDEF,U02GHIJKL" was a working input. The new
resolveUserId() matches neither the ID regex (no comma) nor the email regex, then
falls through to an exhaustive paged users.list scan that cannot match, and throws.
Adds resolveUserIds() (plural), which splits on commas — or accepts an array —
resolves each token independently, and rejoins. An all-IDs input still makes zero
extra API calls, so the common path is unchanged in cost as well as result.

delete-message: makeRequest() routes to the bot token only on `as_user === false`, so
`!this.as_user` made the retry a no-op whenever as_user arrived nullish — undefined
and true both route to the user token, so it retried as the identity that had just
been refused. Changed to `this.as_user === false`. Attempt 1 still passes the
configured value verbatim.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(slack_v2): reattach resolveChannelId's JSDoc to its function

resolveUserId/resolveUserIds were inserted between resolveChannelId's doc comment
and resolveChannelId itself, leaving two stacked doc blocks above resolveUserId and
no doc on resolveChannelId. Comment move only; no code change.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(slack_v2): move the fields projection into common/utils.mjs

Addresses review feedback on PipedreamHQ#21493: `pickFields` was copy-pasted identically into
get-channel-history, get-thread-replies and list-channels.

Moved to components/slack_v2/common/utils.mjs, alongside the CSV-or-array `fields`
normalizer that was duplicated in the same three places — both halves of one feature,
so splitting them across files would just invite the next divergence.

`projectFields(records, fields)` composes the two and keeps the additive contract:
with no `fields`, it returns the ORIGINAL array, so a caller that omits the prop gets
exactly what these actions have always returned.

Behavior-identical to the three removed copies, verified against them across
undefined / empty array / empty string / array / CSV / CSV-with-spaces / unknown
field / all-unknown inputs, including array identity on the no-fields path.

No version bumps: all three components are already ahead of master on this branch,
so the PR diff still shows a version change for each.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(slack_v2): address review feedback on delete-message, resolveUserId, invite-user-to-channel

- delete-message: only retry with the other identity when a bot token exists,
  since otherwise both attempts hit the same token and just repeat the error.
- resolveUserId: scan all users.list pages and require an exact, unambiguous
  name match; throw ConfigurationError instead of silently picking the first.
- invite-user-to-channel: treat already_in_channel as success only for a
  single user; bulk invites are now sent per-user with individual results so
  failures aren't hidden behind a successful summary.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(slack_v2): guard invite-user-to-channel against empty resolved user list

resolveUserIds() returns "" when every comma-separated token is blank, and
"".split(",") yields [""] rather than [], which slipped through the
single-user path and sent an empty users value to Slack. Filter empty tokens
and throw ConfigurationError when none remain.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(slack_v2): resolve channel name in delete-message, treat self-invite as no-op

- delete-message now calls resolveChannelId() before deleting, like
  every other AI-optimized action in this app. Previously it passed
  `conversation` straight through, so a channel NAME (rather than ID)
  failed with channel_not_found.
- invite-user-to-channel: Slack refuses to let an identity invite
  itself (cant_invite_self) before it would ever reach an
  already_in_channel check. Treat that the same way — a no-op, not an
  error — since to the caller it means the same thing: the user has no
  further action needed on that channel.

Found via eval-driven regression testing on PR PipedreamHQ#21493.

* chore(slack_v2): revert version bumps on delete-message, invite-user-to-channel

Keep at 0.2.0/0.1.0 rather than bumping per fix.

---------

Co-authored-by: Dylan Sather <Dylan Sather>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Michelle Bergeron <michelle.bergeron@workday.com>
Co-authored-by: michelle0927 <michelle0927@users.noreply.github.com>
drobnikj pushed a commit that referenced this pull request Sep 3, 2026
…1826)

* feat(dappier): AI-optimized Dappier action set for MCP (real-time search, recommendations, analytics)

Initial AI-optimized Dappier components for the MCP tool surface, covering
issue PipedreamHQ#21660 (real-time web search, AI content recommendations, data-model
querying) plus the four Analytics API endpoints. Iterated against the MCP
eval suite (evals/dappier) — 9/10 green on Sonnet 5 (trials: 1); the one
failure is an upstream HTTP 500 on POST /app/v2/search, not a component
defect. agent-audit: 100/100.

- search-real-time-data (new, 0.0.1): real-time web/data search via a Dappier
  AI model (am_ id); returns a synthesized answer. Eval #9 passes.
- get-ai-recommendations (new, 0.0.1): AI-ranked content recommendations for a
  data model (dm_ id); optional additive `fields` projection trims large
  article payloads. Eval #10 blocked by an upstream 500 (server-side).
- get-ask-ai-analytics (new, 0.0.1): aggregate Ask AI widget analytics. Evals #1/#4/#5 pass.
- get-ask-ai-logs (new, 0.0.1): raw Ask AI conversation logs with page/limit
  pagination + paging guidance. Evals #2/#6 pass.
- get-sponsored-conversations-analytics (new, 0.0.1): sponsored-conversation
  (ad campaign) analytics. Eval #7 passes.
- get-session-intelligence (new, 0.0.1): session intent/topic breakdowns. Evals #3/#8 pass.
- dappier.app.mjs: shared analytics prop definitions + GET request methods.
- common/utils.mjs: validateDateRange (365-day cap) + pluckFields projection helper.
- common/constants.mjs: analytics interaction types, range + page-size bounds.

App package.json bumped 0.0.1 -> 0.1.0 (minor -- new actions).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(dappier): add trailing newline to package.json (eol-last)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(dappier): address review — numArticlesRef max, own-prop projection, date default wording

- get-ai-recommendations: numArticlesRef description said max 1000 but schema is max 100; corrected the doc.
- common/utils.mjs: pluckFields now uses Object.hasOwn so a requested field name that collides with an inherited prop (e.g. toString) is not copied; own result fields still are.
- dappier.app.mjs: reworded startDate default from the brittle/off-by-one '7 days before today' to 'the last 7 days (UTC), i.e. today and the six prior days', matching observed API behavior.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(dappier): resolve one-sided analytics date windows before sending

Verified against the live API: omitting either start_date or end_date makes
Dappier reset BOTH bounds to its default trailing-7-day window, silently
discarding the bound the caller supplied — so a one-sided range returned the
wrong period. resolveDateRange() now fills the missing bound (missing end ->
today UTC; missing start -> 6 days before the end) and always sends both, so a
supplied bound is honored; both-omitted still defers to the API default. All
four analytics actions use it; start/end prop docs updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(dappier): match analytics date-range cap to the API (inclusive days)

Probed the live API: it accepts a 364-day start/end difference (365 inclusive
days) and returns 400 at a 365-day difference (366 inclusive days).
validateDateRange used '> 365 days difference', so a 365-day-difference window
slipped past the fail-fast and hit a raw API 400. Now counts inclusive days
(difference + 1) and caps at 365, matching the API exactly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(dappier): note session_intelligence wrapper in get-session-intelligence description

The API nests all six breakdowns under a single top-level `session_intelligence`
object (verified live). The description listed them as if they were root keys,
so an agent would look for them at the root and miss the `session_intelligence.`
prefix. Description-only; no behavior change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(dappier): use camelCase widgetId in session-intelligence example

The example told the agent to pass `widget_id`, but the input prop is
`widgetId` (run() maps it to the `widget_id` query param). Match the example
to the prop the agent actually sets. Description-only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(dappier): use camelCase prop names in remaining action examples

Same fix as get-session-intelligence, applied to the sibling descriptions:
the agent-facing 'Example:' hints used API param names (start_date, end_date,
campaign_id, data_model_id) instead of the camelCase input props (startDate,
endDate, campaignId, dataModelId). API-mapping mentions stay snake_case.
Description-only; no behavior change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(dappier): camelCase input-guidance for model-id props

The 'Provide a ...' input guidance used API param names — get-ai-recommendations
said 'Provide a data_model_id' (prop is dataModelId) and search-real-time-data
said 'Provide an ai_model_id' (prop is aiModelId). Use the camelCase input keys;
snake_case is retained only where describing the API request mapping
(query param / path template). Description-only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Adding missing dependencies field

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: GTFalcao <gtfalcao96@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.